LyoNCiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCiAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiAqDQogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KICoNCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KICogdW5kZXIgdGhlIExpY2Vuc2UuDQogKi8NCg0KcGFja2FnZSBqYXZheC5mYWNlcy5jb252ZXJ0Ow0KDQppbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0LmJhc2UuQWJzdHJhY3RKc2ZUZXN0Q2FzZTsNCg0KaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUlucHV0Ow0KaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQoNCnB1YmxpYyBjbGFzcyBOdW1iZXJDb252ZXJ0ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RKc2ZUZXN0Q2FzZQ0Kew0KICAgIHByaXZhdGUgTnVtYmVyQ29udmVydGVyIG1vY2s7DQoNCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQ0KICAgIHsNCiAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIucnVuKE51bWJlckNvbnZlcnRlclRlc3QuY2xhc3MpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBOdW1iZXJDb252ZXJ0ZXJUZXN0KFN0cmluZyBuYW1lKQ0KICAgIHsNCiAgICAgICAgc3VwZXIobmFtZSk7DQogICAgfQ0KDQogICAgcHVibGljIHZvaWQgc2V0VXAoKQ0KICAgIHsNCiAgICAgICAgc3VwZXIuc2V0VXAoKTsNCg0KICAgICAgICBtb2NrID0gbmV3IE51bWJlckNvbnZlcnRlcigpOw0KICAgIH0NCg0KICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkNCiAgICB7DQogICAgICAgIHN1cGVyLnRlYXJEb3duKCk7DQoNCiAgICAgICAgbW9jayA9IG51bGw7DQogICAgfQ0KICAgIC8qDQogICAgICogdGVtcG9yYXJpbHkgY29tbWVudCBvdXQgdGVzdHMgdGhhdCBmYWlsLCB1bnRpbCBNYXR0aGlhcyBXZXNzZW5kb3JmIGhhcyB0aW1lIHRvIGludmVzdGlnYXRlDQogICAgICovDQogICAgcHVibGljIHZvaWQgdGVzdEZyYW5jZUxvY2FsZVdpdGhOb25CcmVha2luZ1NwYWNlKCkNCiAgICB7DQogICAgICAgIG1vY2suc2V0TG9jYWxlKExvY2FsZS5GUkFOQ0UpOw0KICAgICAgICBGYWNlc0NvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0Vmlld1Jvb3QoKS5zZXRMb2NhbGUoTG9jYWxlLkdFUk1BTlkpOw0KICAgICAgICBVSUlucHV0IGlucHV0ID0gbmV3IFVJSW5wdXQoKTsNCiAgICAgICAgbW9jay5zZXRUeXBlKCJjdXJyZW5jeSIpOw0KICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWUgPSBtb2NrLmdldEFzU3RyaW5nKGZhY2VzQ29udGV4dCwgaW5wdXQsIG5ldyBEb3VibGUoMTIzNDUuNjhkKSk7DQogICAgICAgIE51bWJlciBudW1iZXIgPSAoTnVtYmVyKSBtb2NrLmdldEFzT2JqZWN0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgaW5wdXQsICIxMlx1MDBhMDM0NSw2OCBcdTIwQUMiKTsNCiAgICAgICAgYXNzZXJ0Tm90TnVsbChudW1iZXIpOw0KICAgIH0NCiAgICBwdWJsaWMgdm9pZCB0ZXN0RnJhbmNlTG9jYWxlV2l0aG91dE5vbkJyZWFraW5nU3BhY2UoKQ0KICAgIHsNCiAgICAgICAgbW9jay5zZXRMb2NhbGUoTG9jYWxlLkZSQU5DRSk7DQogICAgICAgIEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRWaWV3Um9vdCgpLnNldExvY2FsZShMb2NhbGUuR0VSTUFOWSk7DQogICAgICAgIFVJSW5wdXQgaW5wdXQgPSBuZXcgVUlJbnB1dCgpOw0KICAgICAgICBtb2NrLnNldFR5cGUoImN1cnJlbmN5Iik7DQogICAgICAgIE51bWJlciBudW1iZXIgPSAoTnVtYmVyKSBtb2NrLmdldEFzT2JqZWN0KEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKSwgaW5wdXQsICIxMiAzNDUsNjggXHUyMEFDIik7DQogICAgICAgIGFzc2VydE5vdE51bGwobnVtYmVyKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogRVVSMTIsMzQ1LjY4IA0KICAgICAqLw0KICAgIHB1YmxpYyB2b2lkIHRlc3RVU0xvY2FsZVVzaW5nRVVSQ3VycmVuY3lDb2RlKCkNCiAgICB7DQogICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLnNldExvY2FsZShMb2NhbGUuVVMpOw0KICAgICAgICBtb2NrLnNldExvY2FsZShMb2NhbGUuVVMpOw0KICAgICAgICBVSUlucHV0IGlucHV0ID0gbmV3IFVJSW5wdXQoKTsNCiAgICAgICAgbW9jay5zZXRUeXBlKCJjdXJyZW5jeSIpOw0KICAgICAgICBtb2NrLnNldEN1cnJlbmN5Q29kZSgiRVVSIik7DQogICAgICAgIE51bWJlciB0ZXN0VmFsdWUgPSBuZXcgRG91YmxlKDEyMzQ1LjY4ZCk7DQogICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9IG1vY2suZ2V0QXNTdHJpbmcoZmFjZXNDb250ZXh0LCBpbnB1dCwgdGVzdFZhbHVlKTsNCiAgICAgICAgTnVtYmVyIG51bWJlciA9IChOdW1iZXIpIG1vY2suZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dCwgc3RyaW5nVmFsdWUpOw0KICAgICAgICBhc3NlcnROb3ROdWxsKG51bWJlcik7DQogICAgICAgIGFzc2VydEVxdWFscyh0ZXN0VmFsdWUsIG51bWJlcik7DQogICAgfQ0KDQogICAgLyoqDQogICAgICoggDEyLDM0NS42OA0KICAgICAqLw0KICAgIHB1YmxpYyB2b2lkIHRlc3RVS0xvY2FsZVVzaW5nRVVSQ3VycmVuY3lDb2RlKCkNCiAgICB7DQogICAgICAgIGZhY2VzQ29udGV4dC5nZXRWaWV3Um9vdCgpLnNldExvY2FsZShMb2NhbGUuVVMpOw0KICAgICAgICBtb2NrLnNldExvY2FsZShMb2NhbGUuVUspOw0KICAgICAgICBVSUlucHV0IGlucHV0ID0gbmV3IFVJSW5wdXQoKTsNCiAgICAgICAgbW9jay5zZXRUeXBlKCJjdXJyZW5jeSIpOw0KICAgICAgICBtb2NrLnNldEN1cnJlbmN5Q29kZSgiRVVSIik7DQogICAgICAgIE51bWJlciB0ZXN0VmFsdWUgPSBuZXcgRG91YmxlKDEyMzQ1LjY4ZCk7DQogICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9IG1vY2suZ2V0QXNTdHJpbmcoZmFjZXNDb250ZXh0LCBpbnB1dCwgdGVzdFZhbHVlKTsNCiAgICAgICAgTnVtYmVyIG51bWJlciA9IChOdW1iZXIpIG1vY2suZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dCwgc3RyaW5nVmFsdWUpOw0KICAgICAgICBhc3NlcnROb3ROdWxsKG51bWJlcik7DQogICAgICAgIGFzc2VydEVxdWFscyh0ZXN0VmFsdWUsIG51bWJlcik7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIDEyLjM0NSw2OCCADQogICAgICovDQogICAgcHVibGljIHZvaWQgdGVzdEdlcm1hbnlMb2NhbGVVc2luZ0VVUkN1cnJlbmN5Q29kZSgpDQogICAgew0KICAgICAgICBmYWNlc0NvbnRleHQuZ2V0Vmlld1Jvb3QoKS5zZXRMb2NhbGUoTG9jYWxlLlVTKTsNCiAgICAgICAgbW9jay5zZXRMb2NhbGUoTG9jYWxlLkdFUk1BTlkpOw0KICAgICAgICBVSUlucHV0IGlucHV0ID0gbmV3IFVJSW5wdXQoKTsNCiAgICAgICAgbW9jay5zZXRUeXBlKCJjdXJyZW5jeSIpOw0KICAgICAgICBtb2NrLnNldEN1cnJlbmN5Q29kZSgiRVVSIik7DQogICAgICAgIE51bWJlciB0ZXN0VmFsdWUgPSBuZXcgRG91YmxlKDEyMzQ1LjY4ZCk7DQogICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9IG1vY2suZ2V0QXNTdHJpbmcoZmFjZXNDb250ZXh0LCBpbnB1dCwgdGVzdFZhbHVlKTsNCiAgICAgICAgTnVtYmVyIG51bWJlciA9IChOdW1iZXIpIG1vY2suZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBpbnB1dCwgc3RyaW5nVmFsdWUpOw0KICAgICAgICBhc3NlcnROb3ROdWxsKG51bWJlcik7DQogICAgICAgIGFzc2VydEVxdWFscyh0ZXN0VmFsdWUsIG51bWJlcik7DQogICAgfQ0KICAgIA0KICAgIHB1YmxpYyB2b2lkIHRlc3RDdXJyZW5jeVBhdHRlcm4oKQ0KICAgIHsNCiAgICAgICAgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuc2V0TG9jYWxlKExvY2FsZS5VUyk7DQogICAgICAgIG1vY2suc2V0TG9jYWxlKExvY2FsZS5VUyk7DQogICAgICAgIFVJSW5wdXQgaW5wdXQgPSBuZXcgVUlJbnB1dCgpOw0KICAgICAgICBtb2NrLnNldFBhdHRlcm4oIlx1MDBBNCAjIyMsIyMjLiMjIyIpOw0KICAgICAgICBOdW1iZXIgdGVzdFZhbHVlID0gbmV3IERvdWJsZSgxMjM0NS42OGQpOw0KICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWUgPSBtb2NrLmdldEFzU3RyaW5nKGZhY2VzQ29udGV4dCwgaW5wdXQsIHRlc3RWYWx1ZSk7DQogICAgICAgIE51bWJlciBudW1iZXIgPSAoTnVtYmVyKSBtb2NrLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgaW5wdXQsIHN0cmluZ1ZhbHVlKTsNCiAgICAgICAgYXNzZXJ0Tm90TnVsbChudW1iZXIpOw0KICAgICAgICBhc3NlcnRFcXVhbHModGVzdFZhbHVlLCBudW1iZXIpOyAgICAgICAgDQogICAgfQ0KDQogICAgcHVibGljIHZvaWQgdGVzdEN1cnJlbmN5UGF0dGVybjIoKQ0KICAgIHsNCiAgICAgICAgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuc2V0TG9jYWxlKExvY2FsZS5VUyk7DQogICAgICAgIG1vY2suc2V0TG9jYWxlKExvY2FsZS5HRVJNQU5ZKTsNCiAgICAgICAgVUlJbnB1dCBpbnB1dCA9IG5ldyBVSUlucHV0KCk7DQogICAgICAgIG1vY2suc2V0UGF0dGVybigiXHUwMEE0ICMjIywjIyMuIyMjIik7DQogICAgICAgIG1vY2suc2V0Q3VycmVuY3lDb2RlKCJVU0QiKTsgLy9TaW5jZSBjdXJyZW5jeSBpcyCALCBidXQgd2UgYXJlIHVzaW5nIFVTRCBjdXJyZW5jeSBjb2RlLCB0aGUgb3V0cHV0IGlzIFVTRCAxMi4zNDUsNjgNCiAgICAgICAgTnVtYmVyIHRlc3RWYWx1ZSA9IG5ldyBEb3VibGUoMTIzNDUuNjhkKTsNCiAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlID0gbW9jay5nZXRBc1N0cmluZyhmYWNlc0NvbnRleHQsIGlucHV0LCB0ZXN0VmFsdWUpOw0KICAgICAgICBOdW1iZXIgbnVtYmVyID0gKE51bWJlcikgbW9jay5nZXRBc09iamVjdChmYWNlc0NvbnRleHQsIGlucHV0LCBzdHJpbmdWYWx1ZSk7DQogICAgICAgIGFzc2VydE5vdE51bGwobnVtYmVyKTsNCiAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RWYWx1ZSwgbnVtYmVyKTsgICAgICAgIA0KICAgIH0NCg0KfQ0K