I3ByYWdtYSBvbmNlDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IErkZ2VyIE5pY29sYXMgPG5pY29sYXMuamFnZXJAc2F2b2lyZmFpcmVsaW51eC5jb20+ICAgICAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOjpDb2xsZWN0aW9uczsNCg0KbmFtZXNwYWNlIFJpbmdDbGllbnRVV1ANCnsNCg0KZGVsZWdhdGUgdm9pZCBOZXdDb250YWN0U2VsZWN0ZWQoQ29udGFjdF4gY29udGFjdCk7DQpkZWxlZ2F0ZSB2b2lkIE5vQ29udGFjdFNlbGVjdGVkKCk7DQoNCm5hbWVzcGFjZSBWaWV3TW9kZWwgew0KcHVibGljIHJlZiBjbGFzcyBDb250YWN0c1ZpZXdNb2RlbCBzZWFsZWQNCnsNCmludGVybmFsOg0KICAgIC8qIHNpbmdsZXRvbiAqLw0KICAgIHN0YXRpYyBwcm9wZXJ0eSBDb250YWN0c1ZpZXdNb2RlbF4gaW5zdGFuY2UNCiAgICB7DQogICAgICAgIENvbnRhY3RzVmlld01vZGVsXiBnZXQoKQ0KICAgICAgICB7DQogICAgICAgICAgICBzdGF0aWMgQ29udGFjdHNWaWV3TW9kZWxeIGluc3RhbmNlXyA9IHJlZiBuZXcgQ29udGFjdHNWaWV3TW9kZWwoKTsNCiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZV87DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKiBmdW5jdGlvbnMgKi8NCiAgICBDb250YWN0XiBmaW5kQ29udGFjdEJ5TmFtZShTdHJpbmdeIG5hbWUpOw0KDQogICAgQ29udGFjdF4gYWRkTmV3Q29udGFjdChTdHJpbmdeIG5hbWUsIFN0cmluZ14gcmluZ0lkKTsNCg0KICAgIC8qIHByb3BlcnRpZXMgKi8NCiAgICBwcm9wZXJ0eSBDb250YWN0XiBzZWxlY3RlZENvbnRhY3QNCiAgICB7DQogICAgICAgIENvbnRhY3ReIGdldCgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiBjdXJyZW50SXRlbV87DQogICAgICAgIH0NCiAgICAgICAgdm9pZCBzZXQoQ29udGFjdF4gdmFsdWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIG9sZEl0ZW1fID0gY3VycmVudEl0ZW1fOw0KICAgICAgICAgICAgY3VycmVudEl0ZW1fID0gdmFsdWU7DQogICAgICAgICAgICBpZiAodmFsdWUpDQogICAgICAgICAgICAgICAgbmV3Q29udGFjdFNlbGVjdGVkKGN1cnJlbnRJdGVtXyk7DQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgbm9Db250YWN0U2VsZWN0ZWQoKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHByb3BlcnR5IFZlY3RvcjxDb250YWN0Xj5eIGNvbnRhY3RzTGlzdA0KICAgIHsNCiAgICAgICAgVmVjdG9yPENvbnRhY3RePl4gZ2V0KCkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIGNvbnRhY3RzTGlzdF87DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKiBldmVudHMgKi8NCiAgICBldmVudCBOZXdDb250YWN0U2VsZWN0ZWReIG5ld0NvbnRhY3RTZWxlY3RlZDsNCiAgICBldmVudCBOb0NvbnRhY3RTZWxlY3RlZF4gbm9Db250YWN0U2VsZWN0ZWQ7DQoNCnByaXZhdGU6DQogICAgQ29udGFjdHNWaWV3TW9kZWwoKTsgLy8gc2luZ2xldG9uDQogICAgVmVjdG9yPENvbnRhY3RePl4gY29udGFjdHNMaXN0XzsNCiAgICBDb250YWN0XiBjdXJyZW50SXRlbV87DQogICAgQ29udGFjdF4gb2xkSXRlbV87DQoNCn07DQp9DQp9DQo=