ZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9hcGktcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvcmVzb3VyY2VzL3Byb2Nlc3MvUHJvY2Vzc1Jlc291cmNlLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvYXBpLXJlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3Jlc291cmNlcy9wcm9jZXNzL1Byb2Nlc3NSZXNvdXJjZS5qYXZhCmluZGV4IDg4MDVlNzQuLmI1MDgxY2YgMTAwNjQ0Ci0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9hcGktcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvcmVzb3VyY2VzL3Byb2Nlc3MvUHJvY2Vzc1Jlc291cmNlLmphdmEKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL2FwaS1yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9yZXNvdXJjZXMvcHJvY2Vzcy9Qcm9jZXNzUmVzb3VyY2UuamF2YQpAQCAtMzMsNyArMzMsOSBAQAogcHVibGljIGNsYXNzIFByb2Nlc3NSZXNvdXJjZSB7CiAKICAgICBwcml2YXRlIGxvbmcgaWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKICAgICBwcml2YXRlIGxvbmcgZXhwZXJpbWVudElkOworICAgIHByaXZhdGUgbG9uZyB3b3JrZmxvd0lkOwogICAgIHByaXZhdGUgbG9uZyBjcmVhdGlvblRpbWU7CiAgICAgcHJpdmF0ZSBsb25nIGxhc3RVcGRhdGVUaW1lOwogICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzU3RhdHVzUmVzb3VyY2U+IHByb2Nlc3NTdGF0dXNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwpAQCAtNDEsNiArNDMsNyBAQAogICAgIHByaXZhdGUgTGlzdDxMb25nPiBwcm9jZXNzRXJyb3JJZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICBwcml2YXRlIFN0cmluZyB0YXNrRGFnOwogICAgIHByaXZhdGUgU3RyaW5nIGV4cGVyaW1lbnREYXRhRGlyOworICAgIHByaXZhdGUgU3RyaW5nIHByb2Nlc3NUeXBlOwogCiAgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7CiAgICAgICAgIHJldHVybiBpZDsKQEAgLTEyMiw0ICsxMjUsMzEgQEAKICAgICAgICAgdGhpcy5leHBlcmltZW50RGF0YURpciA9IGV4cGVyaW1lbnREYXRhRGlyOwogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3NUeXBlKCkgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1R5cGU7CisgICAgfQorCisgICAgcHVibGljIFByb2Nlc3NSZXNvdXJjZSBzZXRQcm9jZXNzVHlwZShTdHJpbmcgcHJvY2Vzc1R5cGUpIHsKKyAgICAgICAgdGhpcy5wcm9jZXNzVHlwZSA9IHByb2Nlc3NUeXBlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBQcm9jZXNzUmVzb3VyY2Ugc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRXb3JrZmxvd0lkKCkgeworICAgICAgICByZXR1cm4gd29ya2Zsb3dJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvY2Vzc1Jlc291cmNlIHNldFdvcmtmbG93SWQobG9uZyB3b3JrZmxvd0lkKSB7CisgICAgICAgIHRoaXMud29ya2Zsb3dJZCA9IHdvcmtmbG93SWQ7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9hcGktcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvcmVzb3VyY2VzL3Rhc2svVGFza0lucHV0UmVzb3VyY2UuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9hcGktcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvcmVzb3VyY2VzL3Rhc2svVGFza0lucHV0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjJmNDE2Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL2FwaS1yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9yZXNvdXJjZXMvdGFzay9UYXNrSW5wdXRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrOworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK3B1YmxpYyBjbGFzcyBUYXNrSW5wdXRSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIGxvbmcgaWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKyAgICBwcml2YXRlIFN0cmluZyB0eXBlOworICAgIHByaXZhdGUgU3RyaW5nIGltcG9ydEZyb207CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrSW5wdXRSZXNvdXJjZSBzZXRJZChsb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza0lucHV0UmVzb3VyY2Ugc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFRhc2tJbnB1dFJlc291cmNlIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIFRhc2tJbnB1dFJlc291cmNlIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJbXBvcnRGcm9tKCkgeworICAgICAgICByZXR1cm4gaW1wb3J0RnJvbTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza0lucHV0UmVzb3VyY2Ugc2V0SW1wb3J0RnJvbShTdHJpbmcgaW1wb3J0RnJvbSkgeworICAgICAgICB0aGlzLmltcG9ydEZyb20gPSBpbXBvcnRGcm9tOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvYXBpLXJlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3Jlc291cmNlcy90YXNrL1Rhc2tPdXRQb3J0UmVzb3VyY2UuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9hcGktcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvcmVzb3VyY2VzL3Rhc2svVGFza091dFBvcnRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNGVmMWIKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvYXBpLXJlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3Jlc291cmNlcy90YXNrL1Rhc2tPdXRQb3J0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQwIEBACitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzazsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitwdWJsaWMgY2xhc3MgVGFza091dFBvcnRSZXNvdXJjZSB7CisgICAgcHJpdmF0ZSBsb25nIGlkOworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBpbnQgcmVmZXJlbmNlSWQgPSAwOworCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza091dFBvcnRSZXNvdXJjZSBzZXRJZChsb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza091dFBvcnRSZXNvdXJjZSBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVmZXJlbmNlSWQoKSB7CisgICAgICAgIHJldHVybiByZWZlcmVuY2VJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza091dFBvcnRSZXNvdXJjZSBzZXRSZWZlcmVuY2VJZChpbnQgcmVmZXJlbmNlSWQpIHsKKyAgICAgICAgdGhpcy5yZWZlcmVuY2VJZCA9IHJlZmVyZW5jZUlkOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvYXBpLXJlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3Jlc291cmNlcy90YXNrL1Rhc2tPdXRwdXRSZXNvdXJjZS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL2FwaS1yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9yZXNvdXJjZXMvdGFzay9UYXNrT3V0cHV0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTY3N2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL2FwaS1yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9yZXNvdXJjZXMvdGFzay9UYXNrT3V0cHV0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzazsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitwdWJsaWMgY2xhc3MgVGFza091dHB1dFJlc291cmNlIHsKKworICAgIHByaXZhdGUgbG9uZyBpZDsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgZXhwb3J0VG87CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrT3V0cHV0UmVzb3VyY2Ugc2V0SWQobG9uZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFRhc2tPdXRwdXRSZXNvdXJjZSBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza091dHB1dFJlc291cmNlIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIFRhc2tPdXRwdXRSZXNvdXJjZSBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhwb3J0VG8oKSB7CisgICAgICAgIHJldHVybiBleHBvcnRUbzsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza091dHB1dFJlc291cmNlIHNldEV4cG9ydFRvKFN0cmluZyBleHBvcnRUbykgeworICAgICAgICB0aGlzLmV4cG9ydFRvID0gZXhwb3J0VG87CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9hcGktcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvcmVzb3VyY2VzL3Rhc2svVGFza1Jlc291cmNlLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvYXBpLXJlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3Jlc291cmNlcy90YXNrL1Rhc2tSZXNvdXJjZS5qYXZhCmluZGV4IDEwOTQ4ZjcuLmJkYzM0ZDcgMTAwNjQ0Ci0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9hcGktcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvcmVzb3VyY2VzL3Rhc2svVGFza1Jlc291cmNlLmphdmEKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL2FwaS1yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9yZXNvdXJjZXMvdGFzay9UYXNrUmVzb3VyY2UuamF2YQpAQCAtMzEsNyArMzEsOCBAQAogcHVibGljIGNsYXNzIFRhc2tSZXNvdXJjZSB7CiAKICAgICBwcml2YXRlIGxvbmcgaWQ7Ci0gICAgcHJpdmF0ZSBpbnQgdGFza1R5cGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGxvbmcgdGFza1R5cGVJZDsKICAgICBwcml2YXRlIFN0cmluZyB0YXNrVHlwZVN0cjsKICAgICBwcml2YXRlIGxvbmcgcGFyZW50UHJvY2Vzc0lkOwogICAgIHByaXZhdGUgbG9uZyBjcmVhdGlvblRpbWU7CkBAIC0zOSw5ICs0MCwxMyBAQAogICAgIHByaXZhdGUgTGlzdDxUYXNrU3RhdHVzUmVzb3VyY2U+IHRhc2tTdGF0dXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICBwcml2YXRlIFN0cmluZyB0YXNrRGV0YWlsOwogICAgIHByaXZhdGUgTGlzdDxMb25nPiB0YXNrRXJyb3JJZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICBwcml2YXRlIExpc3Q8VGFza1BhcmFtUmVzb3VyY2U+IHRhc2tQYXJhbXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIExpc3Q8VGFza0lucHV0UmVzb3VyY2U+IGlucHV0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgTGlzdDxUYXNrT3V0cHV0UmVzb3VyY2U+IG91dHB1dHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIExpc3Q8VGFza091dFBvcnRSZXNvdXJjZT4gb3V0UG9ydHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICBwcml2YXRlIExpc3Q8TG9uZz4gam9iSWRzOwogICAgIHByaXZhdGUgaW50IG9yZGVyOworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydGluZ1Rhc2s7CisgICAgcHJpdmF0ZSBib29sZWFuIHN0b3BwaW5nVGFzazsKIAogICAgIHB1YmxpYyBsb25nIGdldElkKCkgewogICAgICAgICByZXR1cm4gaWQ7CkBAIC01MiwxMiArNTcsMTIgQEAKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCi0gICAgcHVibGljIGludCBnZXRUYXNrVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHRhc2tUeXBlOworICAgIHB1YmxpYyBsb25nIGdldFRhc2tUeXBlSWQoKSB7CisgICAgICAgIHJldHVybiB0YXNrVHlwZUlkOwogICAgIH0KIAotICAgIHB1YmxpYyBUYXNrUmVzb3VyY2Ugc2V0VGFza1R5cGUoaW50IHRhc2tUeXBlKSB7Ci0gICAgICAgIHRoaXMudGFza1R5cGUgPSB0YXNrVHlwZTsKKyAgICBwdWJsaWMgVGFza1Jlc291cmNlIHNldFRhc2tUeXBlSWQobG9uZyB0YXNrVHlwZUlkKSB7CisgICAgICAgIHRoaXMudGFza1R5cGVJZCA9IHRhc2tUeXBlSWQ7CiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIApAQCAtMTI0LDEyICsxMjksMjEgQEAKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCi0gICAgcHVibGljIExpc3Q8VGFza1BhcmFtUmVzb3VyY2U+IGdldFRhc2tQYXJhbXMoKSB7Ci0gICAgICAgIHJldHVybiB0YXNrUGFyYW1zOworICAgIHB1YmxpYyBMaXN0PFRhc2tJbnB1dFJlc291cmNlPiBnZXRJbnB1dHMoKSB7CisgICAgICAgIHJldHVybiBpbnB1dHM7CiAgICAgfQogCi0gICAgcHVibGljIFRhc2tSZXNvdXJjZSBzZXRUYXNrUGFyYW1zKExpc3Q8VGFza1BhcmFtUmVzb3VyY2U+IHRhc2tQYXJhbXMpIHsKLSAgICAgICAgdGhpcy50YXNrUGFyYW1zID0gdGFza1BhcmFtczsKKyAgICBwdWJsaWMgVGFza1Jlc291cmNlIHNldElucHV0cyhMaXN0PFRhc2tJbnB1dFJlc291cmNlPiBpbnB1dHMpIHsKKyAgICAgICAgdGhpcy5pbnB1dHMgPSBpbnB1dHM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFRhc2tPdXRwdXRSZXNvdXJjZT4gZ2V0T3V0cHV0cygpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dHM7CisgICAgfQorCisgICAgcHVibGljIFRhc2tSZXNvdXJjZSBzZXRPdXRwdXRzKExpc3Q8VGFza091dHB1dFJlc291cmNlPiBvdXRwdXRzKSB7CisgICAgICAgIHRoaXMub3V0cHV0cyA9IG91dHB1dHM7CiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIApAQCAtMTUxLDYgKzE2NSw0MCBAQAogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxUYXNrT3V0UG9ydFJlc291cmNlPiBnZXRPdXRQb3J0cygpIHsKKyAgICAgICAgcmV0dXJuIG91dFBvcnRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE91dFBvcnRzKExpc3Q8VGFza091dFBvcnRSZXNvdXJjZT4gb3V0UG9ydHMpIHsKKyAgICAgICAgdGhpcy5vdXRQb3J0cyA9IG91dFBvcnRzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRpbmdUYXNrKCkgeworICAgICAgICByZXR1cm4gc3RhcnRpbmdUYXNrOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrUmVzb3VyY2Ugc2V0U3RhcnRpbmdUYXNrKGJvb2xlYW4gc3RhcnRpbmdUYXNrKSB7CisgICAgICAgIHRoaXMuc3RhcnRpbmdUYXNrID0gc3RhcnRpbmdUYXNrOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0b3BwaW5nVGFzaygpIHsKKyAgICAgICAgcmV0dXJuIHN0b3BwaW5nVGFzazsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza1Jlc291cmNlIHNldFN0b3BwaW5nVGFzayhib29sZWFuIHN0b3BwaW5nVGFzaykgeworICAgICAgICB0aGlzLnN0b3BwaW5nVGFzayA9IHN0b3BwaW5nVGFzazsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUYXNrVHlwZXMgewogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlZfU0VUVVAgPSAwOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkdSRVNTX0RBVEFfU1RBR0lORyA9IDE7CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvYXBpLXJlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3Jlc291cmNlcy90YXNrL3R5cGUvVGFza0lucHV0VHlwZVJlc291cmNlLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvYXBpLXJlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3Jlc291cmNlcy90YXNrL3R5cGUvVGFza0lucHV0VHlwZVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhYjFiZgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9hcGktcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvcmVzb3VyY2VzL3Rhc2svdHlwZS9UYXNrSW5wdXRUeXBlUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUxIEBACitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay50eXBlOworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK3B1YmxpYyBjbGFzcyBUYXNrSW5wdXRUeXBlUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBsb25nIGlkOworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKyAgICBwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWU7CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrSW5wdXRUeXBlUmVzb3VyY2Ugc2V0SWQobG9uZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFRhc2tJbnB1dFR5cGVSZXNvdXJjZSBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIFRhc2tJbnB1dFR5cGVSZXNvdXJjZSBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrSW5wdXRUeXBlUmVzb3VyY2Ugc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9hcGktcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvcmVzb3VyY2VzL3Rhc2svdHlwZS9UYXNrT3V0UG9ydFR5cGVSZXNvdXJjZS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL2FwaS1yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9yZXNvdXJjZXMvdGFzay90eXBlL1Rhc2tPdXRQb3J0VHlwZVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyNzRjYQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9hcGktcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvcmVzb3VyY2VzL3Rhc2svdHlwZS9UYXNrT3V0UG9ydFR5cGVSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLnR5cGU7CisKKy8qKgorICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCisgKgorICogQGF1dGhvciBkaW11dGh1CisgKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKKyAqLworcHVibGljIGNsYXNzIFRhc2tPdXRQb3J0VHlwZVJlc291cmNlIHsKKworICAgIHByaXZhdGUgbG9uZyBpZDsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgaW50IG9yZGVyID0gMDsKKworICAgIHB1YmxpYyBsb25nIGdldElkKCkgeworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgcHVibGljIFRhc2tPdXRQb3J0VHlwZVJlc291cmNlIHNldElkKGxvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrT3V0UG9ydFR5cGVSZXNvdXJjZSBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7CisgICAgICAgIHJldHVybiBvcmRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza091dFBvcnRUeXBlUmVzb3VyY2Ugc2V0T3JkZXIoaW50IG9yZGVyKSB7CisgICAgICAgIHRoaXMub3JkZXIgPSBvcmRlcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL2FwaS1yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9yZXNvdXJjZXMvdGFzay90eXBlL1Rhc2tPdXRwdXRUeXBlUmVzb3VyY2UuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9hcGktcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvcmVzb3VyY2VzL3Rhc2svdHlwZS9UYXNrT3V0cHV0VHlwZVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmZDYxOAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9hcGktcmVzb3VyY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvcmVzb3VyY2VzL3Rhc2svdHlwZS9UYXNrT3V0cHV0VHlwZVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLnRhc2sudHlwZTsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitwdWJsaWMgY2xhc3MgVGFza091dHB1dFR5cGVSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIGxvbmcgaWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyB0eXBlOworCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza091dHB1dFR5cGVSZXNvdXJjZSBzZXRJZChsb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza091dHB1dFR5cGVSZXNvdXJjZSBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIFRhc2tPdXRwdXRUeXBlUmVzb3VyY2Ugc2V0VHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvYXBpLXJlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3Jlc291cmNlcy90YXNrL3R5cGUvVGFza1R5cGVSZXNvdXJjZS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL2FwaS1yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9yZXNvdXJjZXMvdGFzay90eXBlL1Rhc2tUeXBlUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODE4YjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL2FwaS1yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9yZXNvdXJjZXMvdGFzay90eXBlL1Rhc2tUeXBlUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDg0IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay50eXBlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitwdWJsaWMgY2xhc3MgVGFza1R5cGVSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIGxvbmcgaWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyB0b3BpY05hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgaWNvbjsKKyAgICBwcml2YXRlIExpc3Q8VGFza0lucHV0VHlwZVJlc291cmNlPiBpbnB1dFR5cGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBMaXN0PFRhc2tPdXRwdXRUeXBlUmVzb3VyY2U+IG91dHB1dFR5cGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBMaXN0PFRhc2tPdXRQb3J0VHlwZVJlc291cmNlPiBvdXRQb3J0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza1R5cGVSZXNvdXJjZSBzZXRJZChsb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza1R5cGVSZXNvdXJjZSBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9waWNOYW1lKCkgeworICAgICAgICByZXR1cm4gdG9waWNOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrVHlwZVJlc291cmNlIHNldFRvcGljTmFtZShTdHJpbmcgdG9waWNOYW1lKSB7CisgICAgICAgIHRoaXMudG9waWNOYW1lID0gdG9waWNOYW1lOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxUYXNrSW5wdXRUeXBlUmVzb3VyY2U+IGdldElucHV0VHlwZXMoKSB7CisgICAgICAgIHJldHVybiBpbnB1dFR5cGVzOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrVHlwZVJlc291cmNlIHNldElucHV0VHlwZXMoTGlzdDxUYXNrSW5wdXRUeXBlUmVzb3VyY2U+IGlucHV0VHlwZXMpIHsKKyAgICAgICAgdGhpcy5pbnB1dFR5cGVzID0gaW5wdXRUeXBlczsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8VGFza091dHB1dFR5cGVSZXNvdXJjZT4gZ2V0T3V0cHV0VHlwZXMoKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRUeXBlczsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza1R5cGVSZXNvdXJjZSBzZXRPdXRwdXRUeXBlcyhMaXN0PFRhc2tPdXRwdXRUeXBlUmVzb3VyY2U+IG91dHB1dFR5cGVzKSB7CisgICAgICAgIHRoaXMub3V0cHV0VHlwZXMgPSBvdXRwdXRUeXBlczsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8VGFza091dFBvcnRUeXBlUmVzb3VyY2U+IGdldE91dFBvcnRzKCkgeworICAgICAgICByZXR1cm4gb3V0UG9ydHM7CisgICAgfQorCisgICAgcHVibGljIFRhc2tUeXBlUmVzb3VyY2Ugc2V0T3V0UG9ydHMoTGlzdDxUYXNrT3V0UG9ydFR5cGVSZXNvdXJjZT4gb3V0UG9ydHMpIHsKKyAgICAgICAgdGhpcy5vdXRQb3J0cyA9IG91dFBvcnRzOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEljb24oKSB7CisgICAgICAgIHJldHVybiBpY29uOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrVHlwZVJlc291cmNlIHNldEljb24oU3RyaW5nIGljb24pIHsKKyAgICAgICAgdGhpcy5pY29uID0gaWNvbjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL2FwaS1yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9yZXNvdXJjZXMvd29ya2Zsb3cvV29ya2Zsb3dSZXNvdXJjZS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL2FwaS1yZXNvdXJjZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9yZXNvdXJjZXMvd29ya2Zsb3cvV29ya2Zsb3dSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MzFlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvYXBpLXJlc291cmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3Jlc291cmNlcy93b3JrZmxvdy9Xb3JrZmxvd1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw1NCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLndvcmtmbG93OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitwdWJsaWMgY2xhc3MgV29ya2Zsb3dSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIGxvbmcgaWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyB3b3JrZmxvd0dyYXBoWE1MOworICAgIHByaXZhdGUgTGlzdDxMb25nPiBwcm9jZXNzSWRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyBXb3JrZmxvd1Jlc291cmNlIHNldElkKGxvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBXb3JrZmxvd1Jlc291cmNlIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRXb3JrZmxvd0dyYXBoWE1MKCkgeworICAgICAgICByZXR1cm4gd29ya2Zsb3dHcmFwaFhNTDsKKyAgICB9CisKKyAgICBwdWJsaWMgV29ya2Zsb3dSZXNvdXJjZSBzZXRXb3JrZmxvd0dyYXBoWE1MKFN0cmluZyB3b3JrZmxvd0dyYXBoWE1MKSB7CisgICAgICAgIHRoaXMud29ya2Zsb3dHcmFwaFhNTCA9IHdvcmtmbG93R3JhcGhYTUw7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PExvbmc+IGdldFByb2Nlc3NJZHMoKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzSWRzOworICAgIH0KKworICAgIHB1YmxpYyBXb3JrZmxvd1Jlc291cmNlIHNldFByb2Nlc3NJZHMoTGlzdDxMb25nPiBwcm9jZXNzSWRzKSB7CisgICAgICAgIHRoaXMucHJvY2Vzc0lkcyA9IHByb2Nlc3NJZHM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL2NvbnRyb2xsZXIvVGFza0NvbnRyb2xsZXIuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL2NvbnRyb2xsZXIvVGFza0NvbnRyb2xsZXIuamF2YQppbmRleCBlZjhjNzk3Li4yZmIyMzM0IDEwMDY0NAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9jb250cm9sbGVyL1Rhc2tDb250cm9sbGVyLmphdmEKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvY29udHJvbGxlci9UYXNrQ29udHJvbGxlci5qYXZhCkBAIC0yMiw3ICsyMiw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLlRhc2tSZXNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLnRhc2suVGFza1N0YXR1c1Jlc291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIuU2VydmVyUnVudGltZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnNlcnZpY2UuVGFza1NlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5zZXJ2aWNlLnRhc2suVGFza1NlcnZpY2U7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5odHRwLk1lZGlhVHlwZTsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5iaW5kLmFubm90YXRpb24uKjsKIApkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvY29udHJvbGxlci9UYXNrVHlwZUNvbnRyb2xsZXIuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL2NvbnRyb2xsZXIvVGFza1R5cGVDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyNGI3MgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL2NvbnRyb2xsZXIvVGFza1R5cGVDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLmNvbnRyb2xsZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLnRhc2sudHlwZS5UYXNrVHlwZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIuc2VydmljZS50YXNrLnR5cGUuVGFza1R5cGVTZXJ2aWNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuaHR0cC5NZWRpYVR5cGU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLio7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK0BSZXN0Q29udHJvbGxlcgorQFJlcXVlc3RNYXBwaW5nKHBhdGg9Ii90YXNrVHlwZSIpCitwdWJsaWMgY2xhc3MgVGFza1R5cGVDb250cm9sbGVyIHsKKworICAgIEBSZXNvdXJjZQorICAgIHByaXZhdGUgVGFza1R5cGVTZXJ2aWNlIHRhc2tUeXBlU2VydmljZTsKKworICAgIEBHZXRNYXBwaW5nKHBhdGggPSAiIiwgcHJvZHVjZXMgPSBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9WQUxVRSkKKyAgICBwdWJsaWMgTGlzdDxUYXNrVHlwZVJlc291cmNlPiBnZXRBbGwoKSB7CisgICAgICAgIHJldHVybiB0YXNrVHlwZVNlcnZpY2UuZ2V0QWxsKCk7CisgICAgfQorCisgICAgQFBvc3RNYXBwaW5nKCBwYXRoID0gIiIsIGNvbnN1bWVzID0gTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVkFMVUUpCisgICAgcHVibGljIGxvbmcgY3JlYXRlVGFzayhAUmVxdWVzdEJvZHkgVGFza1R5cGVSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICByZXR1cm4gdGFza1R5cGVTZXJ2aWNlLmNyZWF0ZShyZXNvdXJjZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvY29udHJvbGxlci9Xb3JrZmxvd0NvbnRyb2xsZXIuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL2NvbnRyb2xsZXIvV29ya2Zsb3dDb250cm9sbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM2ZjgzOQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL2NvbnRyb2xsZXIvV29ya2Zsb3dDb250cm9sbGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLmNvbnRyb2xsZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLmV4cGVyaW1lbnQuRXhwZXJpbWVudFJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMud29ya2Zsb3cuV29ya2Zsb3dSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnNlcnZpY2UuV29ya2Zsb3dTZXJ2aWNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuaHR0cC5NZWRpYVR5cGU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuYmluZC5hbm5vdGF0aW9uLio7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK0BSZXN0Q29udHJvbGxlcgorQFJlcXVlc3RNYXBwaW5nKHBhdGg9Ii93b3JrZmxvdyIpCitwdWJsaWMgY2xhc3MgV29ya2Zsb3dDb250cm9sbGVyIHsKKworICAgIEBSZXNvdXJjZQorICAgIHByaXZhdGUgV29ya2Zsb3dTZXJ2aWNlIHdvcmtmbG93U2VydmljZTsKKworICAgIEBQb3N0TWFwcGluZyhwYXRoID0gImNyZWF0ZS97bmFtZX0iKQorICAgIHB1YmxpYyBsb25nIGNyZWF0ZVdvcmtmbG93KEBQYXRoVmFyaWFibGUoIm5hbWUiKSBTdHJpbmcgbmFtZSwgQFJlcXVlc3RCb2R5IFN0cmluZyB3b3JrZmxvd0dyYXBoKSB7CisgICAgICAgIHJldHVybiB0aGlzLndvcmtmbG93U2VydmljZS5jcmVhdGVXb3JrZmxvdyhuZXcgV29ya2Zsb3dSZXNvdXJjZSgpLnNldE5hbWUobmFtZSkuc2V0V29ya2Zsb3dHcmFwaFhNTCh3b3JrZmxvd0dyYXBoKSk7CisgICAgfQorCisgICAgQEdldE1hcHBpbmcocGF0aCA9ICIiLCBwcm9kdWNlcyA9IE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1ZBTFVFKQorICAgIHB1YmxpYyBMaXN0PFdvcmtmbG93UmVzb3VyY2U+IGdldEFsbFdvcmtmbG93cygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMud29ya2Zsb3dTZXJ2aWNlLmdldEFsbCgpOworICAgIH0KKworICAgIEBHZXRNYXBwaW5nKHBhdGggPSAie2lkfS9sYXVuY2giLCBwcm9kdWNlcyA9IE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1ZBTFVFKQorICAgIHB1YmxpYyBsb25nIGxhdW5jaEV4cGVyaW1lbnQoQFBhdGhWYXJpYWJsZSgiaWQiKSBsb25nIGlkKSB7CisgICAgICAgIHJldHVybiB0aGlzLndvcmtmbG93U2VydmljZS5sYXVuY2hXb3JrZmxvdyhpZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvbW9kZWwvcHJvY2Vzcy9Qcm9jZXNzTW9kZWwuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL21vZGVsL3Byb2Nlc3MvUHJvY2Vzc01vZGVsLmphdmEKaW5kZXggZDNmODk4NC4uNWE0MDU0ZiAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvbW9kZWwvcHJvY2Vzcy9Qcm9jZXNzTW9kZWwuamF2YQorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC9wcm9jZXNzL1Byb2Nlc3NNb2RlbC5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC5jb21tb25zLkVycm9yTW9kZWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC5leHBlcmltZW50LkV4cGVyaW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLlRhc2tNb2RlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLndvcmtmbG93LldvcmtmbG93OwogCiBpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtNDUsNiArNDYsMTEgQEAKICAgICBATWFueVRvT25lCiAgICAgcHJpdmF0ZSBFeHBlcmltZW50IGV4cGVyaW1lbnQ7CiAKKyAgICBATWFueVRvT25lCisgICAgcHJpdmF0ZSBXb3JrZmxvdyB3b3JrZmxvdzsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKICAgICBwcml2YXRlIGxvbmcgY3JlYXRpb25UaW1lOwogICAgIHByaXZhdGUgbG9uZyBsYXN0VXBkYXRlVGltZTsKIApAQCAtNjEsNzUgKzY3LDExNyBAQAogCiAgICAgcHJpdmF0ZSBTdHJpbmcgZXhwZXJpbWVudERhdGFEaXI7CiAKKyAgICBwcml2YXRlIFByb2Nlc3NUeXBlIHByb2Nlc3NUeXBlID0gUHJvY2Vzc1R5cGUuRVhQRVJJTUVOVDsKKwogICAgIHB1YmxpYyBsb25nIGdldElkKCkgewogICAgICAgICByZXR1cm4gaWQ7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0SWQobG9uZyBpZCkgeworICAgIHB1YmxpYyBQcm9jZXNzTW9kZWwgc2V0SWQobG9uZyBpZCkgewogICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAogICAgIHB1YmxpYyBFeHBlcmltZW50IGdldEV4cGVyaW1lbnQoKSB7CiAgICAgICAgIHJldHVybiBleHBlcmltZW50OwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldEV4cGVyaW1lbnQoRXhwZXJpbWVudCBleHBlcmltZW50KSB7CisgICAgcHVibGljIFByb2Nlc3NNb2RlbCBzZXRFeHBlcmltZW50KEV4cGVyaW1lbnQgZXhwZXJpbWVudCkgewogICAgICAgICB0aGlzLmV4cGVyaW1lbnQgPSBleHBlcmltZW50OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBQcm9jZXNzTW9kZWwgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKICAgICBwdWJsaWMgbG9uZyBnZXRDcmVhdGlvblRpbWUoKSB7CiAgICAgICAgIHJldHVybiBjcmVhdGlvblRpbWU7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0Q3JlYXRpb25UaW1lKGxvbmcgY3JlYXRpb25UaW1lKSB7CisgICAgcHVibGljIFByb2Nlc3NNb2RlbCBzZXRDcmVhdGlvblRpbWUobG9uZyBjcmVhdGlvblRpbWUpIHsKICAgICAgICAgdGhpcy5jcmVhdGlvblRpbWUgPSBjcmVhdGlvblRpbWU7CisgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAogICAgIHB1YmxpYyBsb25nIGdldExhc3RVcGRhdGVUaW1lKCkgewogICAgICAgICByZXR1cm4gbGFzdFVwZGF0ZVRpbWU7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0TGFzdFVwZGF0ZVRpbWUobG9uZyBsYXN0VXBkYXRlVGltZSkgeworICAgIHB1YmxpYyBQcm9jZXNzTW9kZWwgc2V0TGFzdFVwZGF0ZVRpbWUobG9uZyBsYXN0VXBkYXRlVGltZSkgewogICAgICAgICB0aGlzLmxhc3RVcGRhdGVUaW1lID0gbGFzdFVwZGF0ZVRpbWU7CisgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAogICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NTdGF0dXM+IGdldFByb2Nlc3NTdGF0dXNlcygpIHsKICAgICAgICAgcmV0dXJuIHByb2Nlc3NTdGF0dXNlczsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzU3RhdHVzZXMoTGlzdDxQcm9jZXNzU3RhdHVzPiBwcm9jZXNzU3RhdHVzZXMpIHsKKyAgICBwdWJsaWMgUHJvY2Vzc01vZGVsIHNldFByb2Nlc3NTdGF0dXNlcyhMaXN0PFByb2Nlc3NTdGF0dXM+IHByb2Nlc3NTdGF0dXNlcykgewogICAgICAgICB0aGlzLnByb2Nlc3NTdGF0dXNlcyA9IHByb2Nlc3NTdGF0dXNlczsKKyAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCiAgICAgcHVibGljIExpc3Q8VGFza01vZGVsPiBnZXRUYXNrcygpIHsKICAgICAgICAgcmV0dXJuIHRhc2tzOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldFRhc2tzKExpc3Q8VGFza01vZGVsPiB0YXNrcykgeworICAgIHB1YmxpYyBQcm9jZXNzTW9kZWwgc2V0VGFza3MoTGlzdDxUYXNrTW9kZWw+IHRhc2tzKSB7CiAgICAgICAgIHRoaXMudGFza3MgPSB0YXNrczsKKyAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXRUYXNrRGFnKCkgewogICAgICAgICByZXR1cm4gdGFza0RhZzsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRUYXNrRGFnKFN0cmluZyB0YXNrRGFnKSB7CisgICAgcHVibGljIFByb2Nlc3NNb2RlbCBzZXRUYXNrRGFnKFN0cmluZyB0YXNrRGFnKSB7CiAgICAgICAgIHRoaXMudGFza0RhZyA9IHRhc2tEYWc7CisgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAogICAgIHB1YmxpYyBMaXN0PEVycm9yTW9kZWw+IGdldFByb2Nlc3NFcnJvcnMoKSB7CiAgICAgICAgIHJldHVybiBwcm9jZXNzRXJyb3JzOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NFcnJvcnMoTGlzdDxFcnJvck1vZGVsPiBwcm9jZXNzRXJyb3JzKSB7CisgICAgcHVibGljIFByb2Nlc3NNb2RlbCBzZXRQcm9jZXNzRXJyb3JzKExpc3Q8RXJyb3JNb2RlbD4gcHJvY2Vzc0Vycm9ycykgewogICAgICAgICB0aGlzLnByb2Nlc3NFcnJvcnMgPSBwcm9jZXNzRXJyb3JzOworICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldEV4cGVyaW1lbnREYXRhRGlyKCkgewogICAgICAgICByZXR1cm4gZXhwZXJpbWVudERhdGFEaXI7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0RXhwZXJpbWVudERhdGFEaXIoU3RyaW5nIGV4cGVyaW1lbnREYXRhRGlyKSB7CisgICAgcHVibGljIFByb2Nlc3NNb2RlbCBzZXRFeHBlcmltZW50RGF0YURpcihTdHJpbmcgZXhwZXJpbWVudERhdGFEaXIpIHsKICAgICAgICAgdGhpcy5leHBlcmltZW50RGF0YURpciA9IGV4cGVyaW1lbnREYXRhRGlyOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvY2Vzc1R5cGUgZ2V0UHJvY2Vzc1R5cGUoKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvY2Vzc01vZGVsIHNldFByb2Nlc3NUeXBlKFByb2Nlc3NUeXBlIHByb2Nlc3NUeXBlKSB7CisgICAgICAgIHRoaXMucHJvY2Vzc1R5cGUgPSBwcm9jZXNzVHlwZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFdvcmtmbG93IGdldFdvcmtmbG93KCkgeworICAgICAgICByZXR1cm4gd29ya2Zsb3c7CisgICAgfQorCisgICAgcHVibGljIFByb2Nlc3NNb2RlbCBzZXRXb3JrZmxvdyhXb3JrZmxvdyB3b3JrZmxvdykgeworICAgICAgICB0aGlzLndvcmtmbG93ID0gd29ya2Zsb3c7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBlbnVtIFByb2Nlc3NUeXBlIHsKKyAgICAgICAgV09SS0ZMT1csIEVYUEVSSU1FTlQ7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvbW9kZWwvdGFzay9UYXNrREFHLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC90YXNrL1Rhc2tEQUcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGZmZWYzCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvbW9kZWwvdGFzay9UYXNrREFHLmphdmEKQEAgLTAsMCArMSw1MiBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLnRhc2s7CisKK2ltcG9ydCBjb20uc3VuLmphdmFmeC50ay5Ub29sa2l0OworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitARW50aXR5CitwdWJsaWMgY2xhc3MgVGFza0RBRyB7CisKKyAgICBASWQKKyAgICBAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3kgPSBHZW5lcmF0aW9uVHlwZS5BVVRPKQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIEBNYW55VG9PbmUKKyAgICBwcml2YXRlIFRhc2tPdXRQb3J0IHNvdXJjZU91dFBvcnQ7CisKKyAgICBATWFueVRvT25lCisgICAgcHJpdmF0ZSBUYXNrTW9kZWwgdGFyZ2V0VGFzazsKKworICAgIHB1YmxpYyBsb25nIGdldElkKCkgeworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgcHVibGljIFRhc2tEQUcgc2V0SWQobG9uZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrT3V0UG9ydCBnZXRTb3VyY2VPdXRQb3J0KCkgeworICAgICAgICByZXR1cm4gc291cmNlT3V0UG9ydDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza0RBRyBzZXRTb3VyY2VPdXRQb3J0KFRhc2tPdXRQb3J0IHNvdXJjZU91dFBvcnQpIHsKKyAgICAgICAgdGhpcy5zb3VyY2VPdXRQb3J0ID0gc291cmNlT3V0UG9ydDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFRhc2tNb2RlbCBnZXRUYXJnZXRUYXNrKCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0VGFzazsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza0RBRyBzZXRUYXJnZXRUYXNrKFRhc2tNb2RlbCB0YXJnZXRUYXNrKSB7CisgICAgICAgIHRoaXMudGFyZ2V0VGFzayA9IHRhcmdldFRhc2s7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL21vZGVsL3Rhc2svVGFza0lucHV0LmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC90YXNrL1Rhc2tJbnB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMmQ3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC90YXNrL1Rhc2tJbnB1dC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitARW50aXR5CitwdWJsaWMgY2xhc3MgVGFza0lucHV0IHsKKworICAgIEBJZAorICAgIEBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneSA9IEdlbmVyYXRpb25UeXBlLkFVVE8pCisgICAgcHJpdmF0ZSBsb25nIGlkOworCisgICAgQENvbHVtbihuYW1lID0gIlRBU0tfSU5QVVRfTkFNRSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIEBDb2x1bW4obmFtZSA9ICJUQVNLX0lOUFVUX1ZBTFVFIikKKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgIEBDb2x1bW4obmFtZSA9ICJUQVNLX0lOUFVUX1RZUEUiKQorICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7CisKKyAgICBAQ29sdW1uKG5hbWUgPSAiSU1QT1JUX0ZPUk0iKQorICAgIHByaXZhdGUgU3RyaW5nIGltcG9ydEZyb207CisKKyAgICBATWFueVRvT25lCisgICAgcHJpdmF0ZSBUYXNrTW9kZWwgdGFza01vZGVsOworCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza0lucHV0IHNldElkKGxvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrSW5wdXQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFRhc2tJbnB1dCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrSW5wdXQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza01vZGVsIGdldFRhc2tNb2RlbCgpIHsKKyAgICAgICAgcmV0dXJuIHRhc2tNb2RlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza0lucHV0IHNldFRhc2tNb2RlbChUYXNrTW9kZWwgdGFza01vZGVsKSB7CisgICAgICAgIHRoaXMudGFza01vZGVsID0gdGFza01vZGVsOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEltcG9ydEZyb20oKSB7CisgICAgICAgIHJldHVybiBpbXBvcnRGcm9tOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrSW5wdXQgc2V0SW1wb3J0RnJvbShTdHJpbmcgaW1wb3J0RnJvbSkgeworICAgICAgICB0aGlzLmltcG9ydEZyb20gPSBpbXBvcnRGcm9tOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC90YXNrL1Rhc2tNb2RlbC5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvbW9kZWwvdGFzay9UYXNrTW9kZWwuamF2YQppbmRleCA2Y2U5OTVkLi4yNDdiYWUxIDEwMDY0NAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC90YXNrL1Rhc2tNb2RlbC5qYXZhCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL21vZGVsL3Rhc2svVGFza01vZGVsLmphdmEKQEAgLTIyLDEyICsyMiwxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwuY29tbW9ucy5FcnJvck1vZGVsOwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwuam9iLkpvYk1vZGVsOwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwucHJvY2Vzcy5Qcm9jZXNzTW9kZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLnR5cGUuVGFza01vZGVsVHlwZTsKIAogaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKICAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQpAQCAtNDMsNyArNDIsMTAgQEAKICAgICBAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3kgPSBHZW5lcmF0aW9uVHlwZS5BVVRPKQogICAgIHByaXZhdGUgbG9uZyBpZDsKIAotICAgIHByaXZhdGUgVGFza1R5cGVzIHRhc2tUeXBlOworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBATWFueVRvT25lCisgICAgcHJpdmF0ZSBUYXNrTW9kZWxUeXBlIHRhc2tUeXBlOwogCiAgICAgQE1hbnlUb09uZQogICAgIHByaXZhdGUgUHJvY2Vzc01vZGVsIHBhcmVudFByb2Nlc3M7CkBAIC01Miw2ICs1NCwxMCBAQAogICAgIHByaXZhdGUgbG9uZyBsYXN0VXBkYXRlVGltZTsKICAgICBwcml2YXRlIGludCBvcmRlckluZGV4OwogCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0aW5nVGFzazsKKworICAgIHByaXZhdGUgYm9vbGVhbiBzdG9wcGluZ1Rhc2s7CisKICAgICBAT25lVG9NYW55KG1hcHBlZEJ5ID0gInRhc2tNb2RlbCIsIGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpCiAgICAgcHJpdmF0ZSBMaXN0PFRhc2tTdGF0dXM+IHRhc2tTdGF0dXNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCkBAIC02NCw3ICs3MCwxMyBAQAogICAgIHByaXZhdGUgTGlzdDxKb2JNb2RlbD4gam9icyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgQE9uZVRvTWFueShtYXBwZWRCeSA9ICJ0YXNrTW9kZWwiLCBjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKQotICAgIHByaXZhdGUgTGlzdDxUYXNrUGFyYW0+IHRhc2tQYXJhbXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIExpc3Q8VGFza0lucHV0PiB0YXNrSW5wdXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBAT25lVG9NYW55KG1hcHBlZEJ5ID0gInRhc2tNb2RlbCIsIGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpCisgICAgcHJpdmF0ZSBMaXN0PFRhc2tPdXRwdXQ+IHRhc2tPdXRwdXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBAT25lVG9NYW55KG1hcHBlZEJ5ID0gInRhc2tNb2RlbCIsIGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpCisgICAgcHJpdmF0ZSBMaXN0PFRhc2tPdXRQb3J0PiB0YXNrT3V0UG9ydHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIHB1YmxpYyBsb25nIGdldElkKCkgewogICAgICAgICByZXR1cm4gaWQ7CkBAIC03NCwxNCArODYsNiBAQAogICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgfQogCi0gICAgcHVibGljIFRhc2tUeXBlcyBnZXRUYXNrVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHRhc2tUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRhc2tUeXBlKFRhc2tUeXBlcyB0YXNrVHlwZSkgewotICAgICAgICB0aGlzLnRhc2tUeXBlID0gdGFza1R5cGU7Ci0gICAgfQotCiAgICAgcHVibGljIFByb2Nlc3NNb2RlbCBnZXRQYXJlbnRQcm9jZXNzKCkgewogICAgICAgICByZXR1cm4gcGFyZW50UHJvY2VzczsKICAgICB9CkBAIC0xMzgsMTIgKzE0Miw0OCBAQAogICAgICAgICB0aGlzLmpvYnMgPSBqb2JzOwogICAgIH0KIAotICAgIHB1YmxpYyBMaXN0PFRhc2tQYXJhbT4gZ2V0VGFza1BhcmFtcygpIHsKLSAgICAgICAgcmV0dXJuIHRhc2tQYXJhbXM7CisgICAgcHVibGljIExpc3Q8VGFza0lucHV0PiBnZXRUYXNrSW5wdXRzKCkgeworICAgICAgICByZXR1cm4gdGFza0lucHV0czsKICAgICB9CiAKLSAgICBwdWJsaWMgVGFza01vZGVsIHNldFRhc2tQYXJhbXMoTGlzdDxUYXNrUGFyYW0+IHRhc2tQYXJhbXMpIHsKLSAgICAgICAgdGhpcy50YXNrUGFyYW1zID0gdGFza1BhcmFtczsKKyAgICBwdWJsaWMgVGFza01vZGVsIHNldFRhc2tJbnB1dHMoTGlzdDxUYXNrSW5wdXQ+IHRhc2tJbnB1dHMpIHsKKyAgICAgICAgdGhpcy50YXNrSW5wdXRzID0gdGFza0lucHV0czsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8VGFza091dHB1dD4gZ2V0VGFza091dHB1dHMoKSB7CisgICAgICAgIHJldHVybiB0YXNrT3V0cHV0czsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza01vZGVsIHNldFRhc2tPdXRwdXRzKExpc3Q8VGFza091dHB1dD4gdGFza091dHB1dHMpIHsKKyAgICAgICAgdGhpcy50YXNrT3V0cHV0cyA9IHRhc2tPdXRwdXRzOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza01vZGVsVHlwZSBnZXRUYXNrVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHRhc2tUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrTW9kZWwgc2V0VGFza1R5cGUoVGFza01vZGVsVHlwZSB0YXNrVHlwZSkgeworICAgICAgICB0aGlzLnRhc2tUeXBlID0gdGFza1R5cGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU3RhcnRpbmdUYXNrKCkgeworICAgICAgICByZXR1cm4gc3RhcnRpbmdUYXNrOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrTW9kZWwgc2V0U3RhcnRpbmdUYXNrKGJvb2xlYW4gc3RhcnRpbmdUYXNrKSB7CisgICAgICAgIHRoaXMuc3RhcnRpbmdUYXNrID0gc3RhcnRpbmdUYXNrOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N0b3BwaW5nVGFzaygpIHsKKyAgICAgICAgcmV0dXJuIHN0b3BwaW5nVGFzazsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza01vZGVsIHNldFN0b3BwaW5nVGFzayhib29sZWFuIHN0b3BwaW5nVGFzaykgeworICAgICAgICB0aGlzLnN0b3BwaW5nVGFzayA9IHN0b3BwaW5nVGFzazsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCkBAIC0xNTYsMzUgKzE5NiwxOSBAQAogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKLSAgICBwdWJsaWMgZW51bSBUYXNrVHlwZXMgewotICAgICAgICBFTlZfU0VUVVAoMCksCi0gICAgICAgIElOR1JFU1NfREFUQV9TVEFHSU5HKDEpLAotICAgICAgICBFR1JFU1NfREFUQV9TVEFHSU5HKDIpLAotICAgICAgICBKT0JfU1VCTUlTU0lPTigzKSwKLSAgICAgICAgRU5WX0NMRUFOVVAoNCksCi0gICAgICAgIE1PTklUT1JJTkcoNSksCi0gICAgICAgIE9VVFBVVF9GRVRDSElORyg2KTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBNYXA8SW50ZWdlciwgVGFza1R5cGVzPiBtYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0KLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIGZvciAoVGFza1R5cGVzIHRhc2tUeXBlIDogVGFza1R5cGVzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgbWFwLnB1dCh0YXNrVHlwZS52YWx1ZSwgdGFza1R5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVGFza1R5cGVzIHZhbHVlT2YoaW50IHRhc2tUeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbWFwLmdldCh0YXNrVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFRhc2tUeXBlcyhpbnQgdmFsdWUpIHsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxUYXNrT3V0UG9ydD4gZ2V0VGFza091dFBvcnRzKCkgeworICAgICAgICByZXR1cm4gdGFza091dFBvcnRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRhc2tPdXRQb3J0cyhMaXN0PFRhc2tPdXRQb3J0PiB0YXNrT3V0UG9ydHMpIHsKKyAgICAgICAgdGhpcy50YXNrT3V0UG9ydHMgPSB0YXNrT3V0UG9ydHM7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvbW9kZWwvdGFzay9UYXNrT3V0UG9ydC5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvbW9kZWwvdGFzay9UYXNrT3V0UG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODY2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC90YXNrL1Rhc2tPdXRQb3J0LmphdmEKQEAgLTAsMCArMSw1NyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLnRhc2s7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBUYXNrT3V0UG9ydCB7CisKKyAgICBASWQKKyAgICBAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3kgPSBHZW5lcmF0aW9uVHlwZS5BVVRPKQorICAgIHByaXZhdGUgbG9uZyBpZDsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBwcml2YXRlIGludCByZWZlcmVuY2VJZDsKKworICAgIEBNYW55VG9PbmUKKyAgICBwcml2YXRlIFRhc2tNb2RlbCB0YXNrTW9kZWw7CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElkKGxvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmVmZXJlbmNlSWQoKSB7CisgICAgICAgIHJldHVybiByZWZlcmVuY2VJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza091dFBvcnQgc2V0UmVmZXJlbmNlSWQoaW50IHJlZmVyZW5jZUlkKSB7CisgICAgICAgIHRoaXMucmVmZXJlbmNlSWQgPSByZWZlcmVuY2VJZDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFRhc2tNb2RlbCBnZXRUYXNrTW9kZWwoKSB7CisgICAgICAgIHJldHVybiB0YXNrTW9kZWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGFza01vZGVsKFRhc2tNb2RlbCB0YXNrTW9kZWwpIHsKKyAgICAgICAgdGhpcy50YXNrTW9kZWwgPSB0YXNrTW9kZWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvbW9kZWwvdGFzay9UYXNrT3V0cHV0LmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC90YXNrL1Rhc2tPdXRwdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjY1NjgzCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvbW9kZWwvdGFzay9UYXNrT3V0cHV0LmphdmEKQEAgLTAsMCArMSw4NiBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLnRhc2s7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBUYXNrT3V0cHV0IHsKKworICAgIEBJZAorICAgIEBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneSA9IEdlbmVyYXRpb25UeXBlLkFVVE8pCisgICAgcHJpdmF0ZSBsb25nIGlkOworCisgICAgQENvbHVtbihuYW1lID0gIlRBU0tfT1VUUFVUX05BTUUiKQorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBAQ29sdW1uKG5hbWUgPSAiVEFTS19PVVRQVVRfVkFMVUUiKQorICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgQENvbHVtbihuYW1lID0gIlRBU0tfT1VUUFVUX1RZUEUiKQorICAgIHByaXZhdGUgU3RyaW5nIHR5cGU7CisKKyAgICBAQ29sdW1uKG5hbWUgPSAiRVhQT1JUX1RPIikKKyAgICBwcml2YXRlIFN0cmluZyBleHBvcnRUbzsKKworICAgIEBNYW55VG9PbmUKKyAgICBwcml2YXRlIFRhc2tNb2RlbCB0YXNrTW9kZWw7CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrT3V0cHV0IHNldElkKGxvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrT3V0cHV0IHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrT3V0cHV0IHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIFRhc2tPdXRwdXQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4cG9ydFRvKCkgeworICAgICAgICByZXR1cm4gZXhwb3J0VG87CisgICAgfQorCisgICAgcHVibGljIFRhc2tPdXRwdXQgc2V0RXhwb3J0VG8oU3RyaW5nIGV4cG9ydFRvKSB7CisgICAgICAgIHRoaXMuZXhwb3J0VG8gPSBleHBvcnRUbzsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFRhc2tNb2RlbCBnZXRUYXNrTW9kZWwoKSB7CisgICAgICAgIHJldHVybiB0YXNrTW9kZWw7CisgICAgfQorCisgICAgcHVibGljIFRhc2tPdXRwdXQgc2V0VGFza01vZGVsKFRhc2tNb2RlbCB0YXNrTW9kZWwpIHsKKyAgICAgICAgdGhpcy50YXNrTW9kZWwgPSB0YXNrTW9kZWw7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL21vZGVsL3Rhc2svVGFza1BhcmFtLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC90YXNrL1Rhc2tQYXJhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmVhYWNlLi4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL21vZGVsL3Rhc2svVGFza1BhcmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwudGFzazsKLQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7Ci0KLS8qKgotICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCi0gKgotICogQGF1dGhvciBkaW11dGh1Ci0gKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKLSAqLwotQEVudGl0eQotQFRhYmxlKG5hbWUgPSAiVEFTS19QQVJBTSIpCi1wdWJsaWMgY2xhc3MgVGFza1BhcmFtIHsKLQotICAgIEBJZAotICAgIEBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneSA9IEdlbmVyYXRpb25UeXBlLkFVVE8pCi0gICAgcHJpdmF0ZSBsb25nIGlkOwotCi0gICAgQENvbHVtbihuYW1lID0gIlBBUkFNX0tFWSIpCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5OwotCi0gICAgQENvbHVtbihuYW1lID0gIlBBUkFNX1ZBTFVFIikKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotICAgIEBNYW55VG9PbmUKLSAgICBwcml2YXRlIFRhc2tNb2RlbCB0YXNrTW9kZWw7Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIGlkOwotICAgIH0KLQotICAgIHB1YmxpYyBUYXNrUGFyYW0gc2V0SWQobG9uZyBpZCkgewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIHB1YmxpYyBUYXNrUGFyYW0gc2V0S2V5KFN0cmluZyBrZXkpIHsKLSAgICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGFza1BhcmFtIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBUYXNrTW9kZWwgZ2V0VGFza01vZGVsKCkgewotICAgICAgICByZXR1cm4gdGFza01vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyBUYXNrUGFyYW0gc2V0VGFza01vZGVsKFRhc2tNb2RlbCB0YXNrTW9kZWwpIHsKLSAgICAgICAgdGhpcy50YXNrTW9kZWwgPSB0YXNrTW9kZWw7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL21vZGVsL3Rhc2svdHlwZS9UYXNrSW5wdXRUeXBlLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC90YXNrL3R5cGUvVGFza0lucHV0VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDhkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC90YXNrL3R5cGUvVGFza0lucHV0VHlwZS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLnR5cGU7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBUYXNrSW5wdXRUeXBlIHsKKworICAgIEBJZAorICAgIEBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneSA9IEdlbmVyYXRpb25UeXBlLkFVVE8pCisgICAgcHJpdmF0ZSBsb25nIGlkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyB0eXBlOworICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZTsKKworICAgIEBNYW55VG9PbmUKKyAgICBwcml2YXRlIFRhc2tNb2RlbFR5cGUgdGFza01vZGVsVHlwZTsKKworICAgIHB1YmxpYyBsb25nIGdldElkKCkgeworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgcHVibGljIFRhc2tJbnB1dFR5cGUgc2V0SWQobG9uZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFRhc2tJbnB1dFR5cGUgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrSW5wdXRUeXBlIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFRhc2tJbnB1dFR5cGUgc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrTW9kZWxUeXBlIGdldFRhc2tNb2RlbFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0YXNrTW9kZWxUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrSW5wdXRUeXBlIHNldFRhc2tNb2RlbFR5cGUoVGFza01vZGVsVHlwZSB0YXNrTW9kZWxUeXBlKSB7CisgICAgICAgIHRoaXMudGFza01vZGVsVHlwZSA9IHRhc2tNb2RlbFR5cGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL21vZGVsL3Rhc2svdHlwZS9UYXNrTW9kZWxUeXBlLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC90YXNrL3R5cGUvVGFza01vZGVsVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZTM1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC90YXNrL3R5cGUvVGFza01vZGVsVHlwZS5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLnR5cGU7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCisgKgorICogQGF1dGhvciBkaW11dGh1CisgKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKKyAqLworQEVudGl0eQorcHVibGljIGNsYXNzIFRhc2tNb2RlbFR5cGUgeworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5ID0gR2VuZXJhdGlvblR5cGUuQVVUTykKKyAgICBwcml2YXRlIGxvbmcgaWQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgU3RyaW5nIHRvcGljTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBpY29uOworCisgICAgQE9uZVRvTWFueShtYXBwZWRCeSA9ICJ0YXNrTW9kZWxUeXBlIiwgY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkKKyAgICBwcml2YXRlIExpc3Q8VGFza0lucHV0VHlwZT4gaW5wdXRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgQE9uZVRvTWFueShtYXBwZWRCeSA9ICJ0YXNrTW9kZWxUeXBlIiwgY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkKKyAgICBwcml2YXRlIExpc3Q8VGFza091dHB1dFR5cGU+IG91dHB1dFR5cGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBAT25lVG9NYW55KG1hcHBlZEJ5ID0gInRhc2tNb2RlbFR5cGUiLCBjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKQorICAgIHByaXZhdGUgTGlzdDxUYXNrT3V0UG9ydFR5cGU+IG91dFBvcnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrTW9kZWxUeXBlIHNldElkKGxvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrTW9kZWxUeXBlIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUb3BpY05hbWUoKSB7CisgICAgICAgIHJldHVybiB0b3BpY05hbWU7CisgICAgfQorCisgICAgcHVibGljIFRhc2tNb2RlbFR5cGUgc2V0VG9waWNOYW1lKFN0cmluZyB0b3BpY05hbWUpIHsKKyAgICAgICAgdGhpcy50b3BpY05hbWUgPSB0b3BpY05hbWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFRhc2tJbnB1dFR5cGU+IGdldElucHV0VHlwZXMoKSB7CisgICAgICAgIHJldHVybiBpbnB1dFR5cGVzOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrTW9kZWxUeXBlIHNldElucHV0VHlwZXMoTGlzdDxUYXNrSW5wdXRUeXBlPiBpbnB1dFR5cGVzKSB7CisgICAgICAgIHRoaXMuaW5wdXRUeXBlcyA9IGlucHV0VHlwZXM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFRhc2tPdXRwdXRUeXBlPiBnZXRPdXRwdXRUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dFR5cGVzOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrTW9kZWxUeXBlIHNldE91dHB1dFR5cGVzKExpc3Q8VGFza091dHB1dFR5cGU+IG91dHB1dFR5cGVzKSB7CisgICAgICAgIHRoaXMub3V0cHV0VHlwZXMgPSBvdXRwdXRUeXBlczsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8VGFza091dFBvcnRUeXBlPiBnZXRPdXRQb3J0cygpIHsKKyAgICAgICAgcmV0dXJuIG91dFBvcnRzOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrTW9kZWxUeXBlIHNldE91dFBvcnRzKExpc3Q8VGFza091dFBvcnRUeXBlPiBvdXRQb3J0cykgeworICAgICAgICB0aGlzLm91dFBvcnRzID0gb3V0UG9ydHM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWNvbigpIHsKKyAgICAgICAgcmV0dXJuIGljb247CisgICAgfQorCisgICAgcHVibGljIFRhc2tNb2RlbFR5cGUgc2V0SWNvbihTdHJpbmcgaWNvbikgeworICAgICAgICB0aGlzLmljb24gPSBpY29uOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC90YXNrL3R5cGUvVGFza091dFBvcnRUeXBlLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC90YXNrL3R5cGUvVGFza091dFBvcnRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQwYTgzNgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL21vZGVsL3Rhc2svdHlwZS9UYXNrT3V0UG9ydFR5cGUuamF2YQpAQCAtMCwwICsxLDYxIEBACitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwudGFzay50eXBlOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitARW50aXR5CitwdWJsaWMgY2xhc3MgVGFza091dFBvcnRUeXBlIHsKKworICAgIEBJZAorICAgIEBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneSA9IEdlbmVyYXRpb25UeXBlLkFVVE8pCisgICAgcHJpdmF0ZSBsb25nIGlkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIEBDb2x1bW4obmFtZSA9ICJQT1JUX09SREVSIikKKyAgICBwcml2YXRlIGludCBvcmRlciA9IDA7CisKKyAgICBATWFueVRvT25lCisgICAgcHJpdmF0ZSBUYXNrTW9kZWxUeXBlIHRhc2tNb2RlbFR5cGU7CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrT3V0UG9ydFR5cGUgc2V0SWQobG9uZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFRhc2tPdXRQb3J0VHlwZSBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7CisgICAgICAgIHJldHVybiBvcmRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza091dFBvcnRUeXBlIHNldE9yZGVyKGludCBvcmRlcikgeworICAgICAgICB0aGlzLm9yZGVyID0gb3JkZXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrTW9kZWxUeXBlIGdldFRhc2tNb2RlbFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0YXNrTW9kZWxUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrT3V0UG9ydFR5cGUgc2V0VGFza01vZGVsVHlwZShUYXNrTW9kZWxUeXBlIHRhc2tNb2RlbFR5cGUpIHsKKyAgICAgICAgdGhpcy50YXNrTW9kZWxUeXBlID0gdGFza01vZGVsVHlwZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvbW9kZWwvdGFzay90eXBlL1Rhc2tPdXRwdXRUeXBlLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9tb2RlbC90YXNrL3R5cGUvVGFza091dHB1dFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzE1OWEwCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvbW9kZWwvdGFzay90eXBlL1Rhc2tPdXRwdXRUeXBlLmphdmEKQEAgLTAsMCArMSw1OSBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLnRhc2sudHlwZTsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CisKKy8qKgorICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCisgKgorICogQGF1dGhvciBkaW11dGh1CisgKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKKyAqLworQEVudGl0eQorcHVibGljIGNsYXNzIFRhc2tPdXRwdXRUeXBlIHsKKworICAgIEBJZAorICAgIEBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneSA9IEdlbmVyYXRpb25UeXBlLkFVVE8pCisgICAgcHJpdmF0ZSBsb25nIGlkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyB0eXBlOworCisgICAgQE1hbnlUb09uZQorICAgIHByaXZhdGUgVGFza01vZGVsVHlwZSB0YXNrTW9kZWxUeXBlOworCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza091dHB1dFR5cGUgc2V0SWQobG9uZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFRhc2tPdXRwdXRUeXBlIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza091dHB1dFR5cGUgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza01vZGVsVHlwZSBnZXRUYXNrTW9kZWxUeXBlKCkgeworICAgICAgICByZXR1cm4gdGFza01vZGVsVHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza091dHB1dFR5cGUgc2V0VGFza01vZGVsVHlwZShUYXNrTW9kZWxUeXBlIHRhc2tNb2RlbFR5cGUpIHsKKyAgICAgICAgdGhpcy50YXNrTW9kZWxUeXBlID0gdGFza01vZGVsVHlwZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvbW9kZWwvd29ya2Zsb3cvV29ya2Zsb3cuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL21vZGVsL3dvcmtmbG93L1dvcmtmbG93LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkNmJmNQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL21vZGVsL3dvcmtmbG93L1dvcmtmbG93LmphdmEKQEAgLTAsMCArMSw2OSBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLndvcmtmbG93OworCitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC5wcm9jZXNzLlByb2Nlc3NNb2RlbDsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitARW50aXR5CitwdWJsaWMgY2xhc3MgV29ya2Zsb3cgeworCisgICAgQElkCisgICAgQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5ID0gR2VuZXJhdGlvblR5cGUuQVVUTykKKyAgICBwcml2YXRlIGxvbmcgaWQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgQExvYgorICAgIEBDb2x1bW4obGVuZ3RoID0gMTAwMDAwMCwgbmFtZSA9ICJDT05URU5UIikKKyAgICBAQmFzaWMoZmV0Y2ggPSBGZXRjaFR5cGUuTEFaWSkKKyAgICBwcml2YXRlIGJ5dGVbXSB3b3JrRmxvd0dyYXBoOworCisKKyAgICBAT25lVG9NYW55KG1hcHBlZEJ5ID0gImV4cGVyaW1lbnQiLCBjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKQorICAgIHByaXZhdGUgTGlzdDxQcm9jZXNzTW9kZWw+IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgcHVibGljIGxvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgV29ya2Zsb3cgc2V0SWQobG9uZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFdvcmtmbG93IHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldFdvcmtGbG93R3JhcGgoKSB7CisgICAgICAgIHJldHVybiB3b3JrRmxvd0dyYXBoOworICAgIH0KKworICAgIHB1YmxpYyBXb3JrZmxvdyBzZXRXb3JrRmxvd0dyYXBoKGJ5dGVbXSB3b3JrRmxvd0dyYXBoKSB7CisgICAgICAgIHRoaXMud29ya0Zsb3dHcmFwaCA9IHdvcmtGbG93R3JhcGg7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFByb2Nlc3NNb2RlbD4gZ2V0UHJvY2Vzc2VzKCkgeworICAgICAgICByZXR1cm4gcHJvY2Vzc2VzOworICAgIH0KKworICAgIHB1YmxpYyBXb3JrZmxvdyBzZXRQcm9jZXNzZXMoTGlzdDxQcm9jZXNzTW9kZWw+IHByb2Nlc3NlcykgeworICAgICAgICB0aGlzLnByb2Nlc3NlcyA9IHByb2Nlc3NlczsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9UYXNrUGFyYW1SZXBvc2l0b3J5LmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L1Rhc2tQYXJhbVJlcG9zaXRvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ2NmM0MS4uMDAwMDAwMAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L1Rhc2tQYXJhbVJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLlRhc2tQYXJhbTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVwb3NpdG9yeS5DcnVkUmVwb3NpdG9yeTsKLQotLyoqCi0gKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKLSAqCi0gKiBAYXV0aG9yIGRpbXV0aHUKLSAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tQYXJhbVJlcG9zaXRvcnkgZXh0ZW5kcyBDcnVkUmVwb3NpdG9yeTxUYXNrUGFyYW0sIExvbmc+IHsKLX0KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvQXBwbGljYXRpb25EZXBsb3ltZW50UmVwb3NpdG9yeS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbkRlcGxveW1lbnRSZXBvc2l0b3J5LmphdmEKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9BcHBsaWNhdGlvbkRlcGxveW1lbnRSZXBvc2l0b3J5LmphdmEKcmVuYW1lIHRvIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvYXBwbGljYXRpb24vQXBwbGljYXRpb25EZXBsb3ltZW50UmVwb3NpdG9yeS5qYXZhCmluZGV4IDg2OTliZWEuLjE1N2UzYTIgMTAwNjQ0Ci0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvQXBwbGljYXRpb25EZXBsb3ltZW50UmVwb3NpdG9yeS5qYXZhCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvYXBwbGljYXRpb24vQXBwbGljYXRpb25EZXBsb3ltZW50UmVwb3NpdG9yeS5qYXZhCkBAIC0xNyw3ICsxNyw3IEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnk7CitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5hcHBsaWNhdGlvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50OwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuZGF0YS5yZXBvc2l0b3J5LkNydWRSZXBvc2l0b3J5OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9BcHBsaWNhdGlvbklmYWNlUmVwb3NpdG9yeS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbklmYWNlUmVwb3NpdG9yeS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvQXBwbGljYXRpb25JZmFjZVJlcG9zaXRvcnkuamF2YQpyZW5hbWUgdG8gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbklmYWNlUmVwb3NpdG9yeS5qYXZhCmluZGV4IDU3YTM1ZmIuLjE5MTI1MjggMTAwNjQ0Ci0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvQXBwbGljYXRpb25JZmFjZVJlcG9zaXRvcnkuamF2YQorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uSWZhY2VSZXBvc2l0b3J5LmphdmEKQEAgLTE3LDcgKzE3LDcgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeTsKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LmFwcGxpY2F0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkludGVyZmFjZTsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVwb3NpdG9yeS5DcnVkUmVwb3NpdG9yeTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvQXBwbGljYXRpb25JbnB1dFJlcG9zaXRvcnkuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvYXBwbGljYXRpb24vQXBwbGljYXRpb25JbnB1dFJlcG9zaXRvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L0FwcGxpY2F0aW9uSW5wdXRSZXBvc2l0b3J5LmphdmEKcmVuYW1lIHRvIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvYXBwbGljYXRpb24vQXBwbGljYXRpb25JbnB1dFJlcG9zaXRvcnkuamF2YQppbmRleCA2MjRmZGZlLi4wYTU1ZjFjIDEwMDY0NAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L0FwcGxpY2F0aW9uSW5wdXRSZXBvc2l0b3J5LmphdmEKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbklucHV0UmVwb3NpdG9yeS5qYXZhCkBAIC0xNyw3ICsxNyw3IEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnk7CitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5hcHBsaWNhdGlvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwuYXBwbGljYXRpb24uQXBwbGljYXRpb25JbnB1dDsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVwb3NpdG9yeS5DcnVkUmVwb3NpdG9yeTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvQXBwbGljYXRpb25Nb2R1bGVSZXBvc2l0b3J5LmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uTW9kdWxlUmVwb3NpdG9yeS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvQXBwbGljYXRpb25Nb2R1bGVSZXBvc2l0b3J5LmphdmEKcmVuYW1lIHRvIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvYXBwbGljYXRpb24vQXBwbGljYXRpb25Nb2R1bGVSZXBvc2l0b3J5LmphdmEKaW5kZXggZmQxYTJhZS4uNGZjODE4OCAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9BcHBsaWNhdGlvbk1vZHVsZVJlcG9zaXRvcnkuamF2YQorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uTW9kdWxlUmVwb3NpdG9yeS5qYXZhCkBAIC0xNyw3ICsxNyw3IEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnk7CitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5hcHBsaWNhdGlvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwuYXBwbGljYXRpb24uQXBwbGljYXRpb25Nb2R1bGU7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5kYXRhLnJlcG9zaXRvcnkuQ3J1ZFJlcG9zaXRvcnk7CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L0FwcGxpY2F0aW9uT3V0cHV0UmVwb3NpdG9yeS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbk91dHB1dFJlcG9zaXRvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L0FwcGxpY2F0aW9uT3V0cHV0UmVwb3NpdG9yeS5qYXZhCnJlbmFtZSB0byBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uT3V0cHV0UmVwb3NpdG9yeS5qYXZhCmluZGV4IDg1MjE3OWYuLmNlYTlkYjEgMTAwNjQ0Ci0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvQXBwbGljYXRpb25PdXRwdXRSZXBvc2l0b3J5LmphdmEKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbk91dHB1dFJlcG9zaXRvcnkuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5OworcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuYXBwbGljYXRpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uT3V0cHV0OwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuZGF0YS5yZXBvc2l0b3J5LkNydWRSZXBvc2l0b3J5OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9Db21wdXRlUmVwb3NpdG9yeS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9jb21wdXRlL0NvbXB1dGVSZXBvc2l0b3J5LmphdmEKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9Db21wdXRlUmVwb3NpdG9yeS5qYXZhCnJlbmFtZSB0byBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L2NvbXB1dGUvQ29tcHV0ZVJlcG9zaXRvcnkuamF2YQppbmRleCBmYjczZGZiLi5jMWY2NGM3IDEwMDY0NAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L0NvbXB1dGVSZXBvc2l0b3J5LmphdmEKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9jb21wdXRlL0NvbXB1dGVSZXBvc2l0b3J5LmphdmEKQEAgLTE3LDcgKzE3LDcgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeTsKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LmNvbXB1dGU7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLmNvbXB1dGUuQ29tcHV0ZVJlc291cmNlTW9kZWw7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5kYXRhLnJlcG9zaXRvcnkuQ3J1ZFJlcG9zaXRvcnk7CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L0RhdGFTdG9yZVJlcG9zaXRvcnkuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvZGF0YS9EYXRhU3RvcmVSZXBvc2l0b3J5LmphdmEKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9EYXRhU3RvcmVSZXBvc2l0b3J5LmphdmEKcmVuYW1lIHRvIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvZGF0YS9EYXRhU3RvcmVSZXBvc2l0b3J5LmphdmEKaW5kZXggZWM1ODRjMy4uODVlODU5NiAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9EYXRhU3RvcmVSZXBvc2l0b3J5LmphdmEKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9kYXRhL0RhdGFTdG9yZVJlcG9zaXRvcnkuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5OworcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuZGF0YTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwuZGF0YS5EYXRhU3RvcmVNb2RlbDsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVwb3NpdG9yeS5DcnVkUmVwb3NpdG9yeTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvRXhwZXJpbWVudElucHV0RGF0YVJlcG9zaXRvcnkuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvZXhwZXJpbWVudC9FeHBlcmltZW50SW5wdXREYXRhUmVwb3NpdG9yeS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvRXhwZXJpbWVudElucHV0RGF0YVJlcG9zaXRvcnkuamF2YQpyZW5hbWUgdG8gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9leHBlcmltZW50L0V4cGVyaW1lbnRJbnB1dERhdGFSZXBvc2l0b3J5LmphdmEKaW5kZXggOTA4N2RhNy4uMWQ4NGU3NSAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9FeHBlcmltZW50SW5wdXREYXRhUmVwb3NpdG9yeS5qYXZhCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvZXhwZXJpbWVudC9FeHBlcmltZW50SW5wdXREYXRhUmVwb3NpdG9yeS5qYXZhCkBAIC0xNyw3ICsxNyw3IEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnk7CitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5leHBlcmltZW50OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC5leHBlcmltZW50LkV4cGVyaW1lbnRJbnB1dERhdGE7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5kYXRhLnJlcG9zaXRvcnkuQ3J1ZFJlcG9zaXRvcnk7CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L0V4cGVyaW1lbnRPdXRwdXREYXRhUmVwb3NpdG9yeS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9leHBlcmltZW50L0V4cGVyaW1lbnRPdXRwdXREYXRhUmVwb3NpdG9yeS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvRXhwZXJpbWVudE91dHB1dERhdGFSZXBvc2l0b3J5LmphdmEKcmVuYW1lIHRvIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvZXhwZXJpbWVudC9FeHBlcmltZW50T3V0cHV0RGF0YVJlcG9zaXRvcnkuamF2YQppbmRleCBiM2I5MzkyLi44NTY0Y2RiIDEwMDY0NAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L0V4cGVyaW1lbnRPdXRwdXREYXRhUmVwb3NpdG9yeS5qYXZhCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvZXhwZXJpbWVudC9FeHBlcmltZW50T3V0cHV0RGF0YVJlcG9zaXRvcnkuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5OworcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuZXhwZXJpbWVudDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwuZXhwZXJpbWVudC5FeHBlcmltZW50T3V0cHV0RGF0YTsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVwb3NpdG9yeS5DcnVkUmVwb3NpdG9yeTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvRXhwZXJpbWVudFJlcG9zaXRvcnkuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvZXhwZXJpbWVudC9FeHBlcmltZW50UmVwb3NpdG9yeS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvRXhwZXJpbWVudFJlcG9zaXRvcnkuamF2YQpyZW5hbWUgdG8gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9leHBlcmltZW50L0V4cGVyaW1lbnRSZXBvc2l0b3J5LmphdmEKaW5kZXggY2E5ODU2Ny4uMjYwNzhlNSAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9FeHBlcmltZW50UmVwb3NpdG9yeS5qYXZhCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvZXhwZXJpbWVudC9FeHBlcmltZW50UmVwb3NpdG9yeS5qYXZhCkBAIC0xNyw3ICsxNyw3IEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnk7CitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5leHBlcmltZW50OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC5leHBlcmltZW50LkV4cGVyaW1lbnQ7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5kYXRhLnJlcG9zaXRvcnkuQ3J1ZFJlcG9zaXRvcnk7CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L0V4cGVyaW1lbnRTdGF0dXNSZXBvc2l0b3J5LmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L2V4cGVyaW1lbnQvRXhwZXJpbWVudFN0YXR1c1JlcG9zaXRvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L0V4cGVyaW1lbnRTdGF0dXNSZXBvc2l0b3J5LmphdmEKcmVuYW1lIHRvIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvZXhwZXJpbWVudC9FeHBlcmltZW50U3RhdHVzUmVwb3NpdG9yeS5qYXZhCmluZGV4IDBiNzk1YzEuLjYzY2QzZjAgMTAwNjQ0Ci0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvRXhwZXJpbWVudFN0YXR1c1JlcG9zaXRvcnkuamF2YQorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L2V4cGVyaW1lbnQvRXhwZXJpbWVudFN0YXR1c1JlcG9zaXRvcnkuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5OworcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuZXhwZXJpbWVudDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwuZXhwZXJpbWVudC5FeHBlcmltZW50U3RhdHVzOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuZGF0YS5yZXBvc2l0b3J5LkNydWRSZXBvc2l0b3J5OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9Qcm9jZXNzUmVwb3NpdG9yeS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9wcm9jZXNzL1Byb2Nlc3NSZXBvc2l0b3J5LmphdmEKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9Qcm9jZXNzUmVwb3NpdG9yeS5qYXZhCnJlbmFtZSB0byBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L3Byb2Nlc3MvUHJvY2Vzc1JlcG9zaXRvcnkuamF2YQppbmRleCBkMGRjMzExLi42MmMwYWFhIDEwMDY0NAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L1Byb2Nlc3NSZXBvc2l0b3J5LmphdmEKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9wcm9jZXNzL1Byb2Nlc3NSZXBvc2l0b3J5LmphdmEKQEAgLTE3LDcgKzE3LDcgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeTsKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LnByb2Nlc3M7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLnByb2Nlc3MuUHJvY2Vzc01vZGVsOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuZGF0YS5yZXBvc2l0b3J5LkNydWRSZXBvc2l0b3J5OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9Qcm9jZXNzU3RhdHVzUmVwb3NpdG9yeS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9wcm9jZXNzL1Byb2Nlc3NTdGF0dXNSZXBvc2l0b3J5LmphdmEKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9Qcm9jZXNzU3RhdHVzUmVwb3NpdG9yeS5qYXZhCnJlbmFtZSB0byBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L3Byb2Nlc3MvUHJvY2Vzc1N0YXR1c1JlcG9zaXRvcnkuamF2YQppbmRleCBiYjExYTlhLi4wYzAxYjhhIDEwMDY0NAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L1Byb2Nlc3NTdGF0dXNSZXBvc2l0b3J5LmphdmEKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS9wcm9jZXNzL1Byb2Nlc3NTdGF0dXNSZXBvc2l0b3J5LmphdmEKQEAgLTE3LDcgKzE3LDcgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeTsKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LnByb2Nlc3M7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLnByb2Nlc3MuUHJvY2Vzc1N0YXR1czsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVwb3NpdG9yeS5DcnVkUmVwb3NpdG9yeTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvdGFzay9UYXNrREFHUmVwb3NpdG9yeS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS90YXNrL1Rhc2tEQUdSZXBvc2l0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjYjdmYQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvdGFzay9UYXNrREFHUmVwb3NpdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTMgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LnRhc2s7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLnRhc2suVGFza0RBRzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVwb3NpdG9yeS5DcnVkUmVwb3NpdG9yeTsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRhc2tEQUdSZXBvc2l0b3J5IGV4dGVuZHMgQ3J1ZFJlcG9zaXRvcnk8VGFza0RBRywgTG9uZz4geworfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS90YXNrL1Rhc2tJbnB1dFJlcG9zaXRvcnkuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvdGFzay9UYXNrSW5wdXRSZXBvc2l0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3NjI0NQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvdGFzay9UYXNrSW5wdXRSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkudGFzazsKKworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwudGFzay5UYXNrSW5wdXQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5kYXRhLnJlcG9zaXRvcnkuQ3J1ZFJlcG9zaXRvcnk7CisKKy8qKgorICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCisgKgorICogQGF1dGhvciBkaW11dGh1CisgKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKKyAqLworcHVibGljIGludGVyZmFjZSBUYXNrSW5wdXRSZXBvc2l0b3J5IGV4dGVuZHMgQ3J1ZFJlcG9zaXRvcnk8VGFza0lucHV0LCBMb25nPiB7Cit9CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L3Rhc2svVGFza091dFBvcnRSZXBvc2l0b3J5LmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L3Rhc2svVGFza091dFBvcnRSZXBvc2l0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmZmQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvdGFzay9UYXNrT3V0UG9ydFJlcG9zaXRvcnkuamF2YQpAQCAtMCwwICsxLDE3IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS50YXNrOworCitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLlRhc2tPdXRQb3J0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuZGF0YS5yZXBvc2l0b3J5LkNydWRSZXBvc2l0b3J5OworCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGFza091dFBvcnRSZXBvc2l0b3J5IGV4dGVuZHMgQ3J1ZFJlcG9zaXRvcnk8VGFza091dFBvcnQsIExvbmc+IHsKKyAgICBPcHRpb25hbDxUYXNrT3V0UG9ydD4gZmluZEJ5TmFtZShTdHJpbmcgbmFtZSk7CisgICAgT3B0aW9uYWw8VGFza091dFBvcnQ+IGZpbmRCeVJlZmVyZW5jZUlkQW5kVGFza01vZGVsX0lkKGludCByZWZlcmVuY2VJZCwgbG9uZyB0YXNrSWQpOworfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS90YXNrL1Rhc2tPdXRwdXRSZXBvc2l0b3J5LmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L3Rhc2svVGFza091dHB1dFJlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmE4N2FmCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS90YXNrL1Rhc2tPdXRwdXRSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkudGFzazsKKworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwudGFzay5UYXNrT3V0cHV0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuZGF0YS5yZXBvc2l0b3J5LkNydWRSZXBvc2l0b3J5OworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGFza091dHB1dFJlcG9zaXRvcnkgZXh0ZW5kcyBDcnVkUmVwb3NpdG9yeTxUYXNrT3V0cHV0LCBMb25nPiB7Cit9CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L1Rhc2tSZXBvc2l0b3J5LmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L3Rhc2svVGFza1JlcG9zaXRvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L1Rhc2tSZXBvc2l0b3J5LmphdmEKcmVuYW1lIHRvIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvdGFzay9UYXNrUmVwb3NpdG9yeS5qYXZhCmluZGV4IDI3MDFjMzMuLmYyMGU5MzYgMTAwNjQ0Ci0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvVGFza1JlcG9zaXRvcnkuamF2YQorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L3Rhc2svVGFza1JlcG9zaXRvcnkuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5OworcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkudGFzazsKIAogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwudGFzay5UYXNrTW9kZWw7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5kYXRhLnJlcG9zaXRvcnkuQ3J1ZFJlcG9zaXRvcnk7CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L1Rhc2tTdGF0dXNSZXBvc2l0b3J5LmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L3Rhc2svVGFza1N0YXR1c1JlcG9zaXRvcnkuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L1Rhc2tTdGF0dXNSZXBvc2l0b3J5LmphdmEKcmVuYW1lIHRvIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvdGFzay9UYXNrU3RhdHVzUmVwb3NpdG9yeS5qYXZhCmluZGV4IGI3OWFkMmIuLjA1MDk2YTkgMTAwNjQ0Ci0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvVGFza1N0YXR1c1JlcG9zaXRvcnkuamF2YQorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L3Rhc2svVGFza1N0YXR1c1JlcG9zaXRvcnkuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5OworcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkudGFzazsKIAogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwudGFzay5UYXNrU3RhdHVzOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuZGF0YS5yZXBvc2l0b3J5LkNydWRSZXBvc2l0b3J5OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS90YXNrL3R5cGUvVGFza0lucHV0VHlwZVJlcG9zaXRvcnkuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvdGFzay90eXBlL1Rhc2tJbnB1dFR5cGVSZXBvc2l0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2NmY2NgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvdGFzay90eXBlL1Rhc2tJbnB1dFR5cGVSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkudGFzay50eXBlOworCitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLnR5cGUuVGFza0lucHV0VHlwZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVwb3NpdG9yeS5DcnVkUmVwb3NpdG9yeTsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRhc2tJbnB1dFR5cGVSZXBvc2l0b3J5IGV4dGVuZHMgQ3J1ZFJlcG9zaXRvcnk8VGFza0lucHV0VHlwZSwgTG9uZz4geworfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS90YXNrL3R5cGUvVGFza091dFBvcnRUeXBlUmVwb3NpdG9yeS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS90YXNrL3R5cGUvVGFza091dFBvcnRUeXBlUmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZDE3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L3Rhc2svdHlwZS9UYXNrT3V0UG9ydFR5cGVSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkudGFzay50eXBlOworCitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLnR5cGUuVGFza091dFBvcnRUeXBlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuZGF0YS5yZXBvc2l0b3J5LkNydWRSZXBvc2l0b3J5OworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGFza091dFBvcnRUeXBlUmVwb3NpdG9yeSBleHRlbmRzIENydWRSZXBvc2l0b3J5PFRhc2tPdXRQb3J0VHlwZSwgTG9uZz4geworfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS90YXNrL3R5cGUvVGFza091dHB1dFR5cGVSZXBvc2l0b3J5LmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L3Rhc2svdHlwZS9UYXNrT3V0cHV0VHlwZVJlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjhkNmRhCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS90YXNrL3R5cGUvVGFza091dHB1dFR5cGVSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkudGFzay50eXBlOworCitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLnR5cGUuVGFza091dHB1dFR5cGU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5kYXRhLnJlcG9zaXRvcnkuQ3J1ZFJlcG9zaXRvcnk7CisKKy8qKgorICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCisgKgorICogQGF1dGhvciBkaW11dGh1CisgKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKKyAqLworcHVibGljIGludGVyZmFjZSBUYXNrT3V0cHV0VHlwZVJlcG9zaXRvcnkgZXh0ZW5kcyBDcnVkUmVwb3NpdG9yeTxUYXNrT3V0cHV0VHlwZSwgTG9uZz4geworfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS90YXNrL3R5cGUvVGFza1R5cGVSZXBvc2l0b3J5LmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L3Rhc2svdHlwZS9UYXNrVHlwZVJlcG9zaXRvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhlMzc0Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvcmVwb3NpdG9yeS90YXNrL3R5cGUvVGFza1R5cGVSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxNyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkudGFzay50eXBlOworCitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLnR5cGUuVGFza01vZGVsVHlwZTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVwb3NpdG9yeS5DcnVkUmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRhc2tUeXBlUmVwb3NpdG9yeSBleHRlbmRzIENydWRSZXBvc2l0b3J5PFRhc2tNb2RlbFR5cGUsIExvbmc+IHsKKyAgICBPcHRpb25hbDxUYXNrTW9kZWxUeXBlPiBmaW5kQnlJZChsb25nIGlkKTsKKyAgICBPcHRpb25hbDxUYXNrTW9kZWxUeXBlPiBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKTsKK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3JlcG9zaXRvcnkvd29ya2Zsb3cvV29ya2Zsb3dSZXBvc2l0b3J5LmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L3dvcmtmbG93L1dvcmtmbG93UmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OWY0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9yZXBvc2l0b3J5L3dvcmtmbG93L1dvcmtmbG93UmVwb3NpdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTYgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LndvcmtmbG93OworCitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC53b3JrZmxvdy5Xb3JrZmxvdzsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmRhdGEucmVwb3NpdG9yeS5DcnVkUmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitwdWJsaWMgaW50ZXJmYWNlIFdvcmtmbG93UmVwb3NpdG9yeSBleHRlbmRzIENydWRSZXBvc2l0b3J5PFdvcmtmbG93LCBMb25nPiB7CisgICAgcHVibGljIE9wdGlvbmFsPFdvcmtmbG93PiBmaW5kQnlJZChsb25nIGlkKTsKK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvQXBwbGljYXRpb25EZXBsb3ltZW50U2VydmljZS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvc2VydmljZS9BcHBsaWNhdGlvbkRlcGxveW1lbnRTZXJ2aWNlLmphdmEKaW5kZXggOTQxZWU2ZS4uOTMyMTZiYyAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvc2VydmljZS9BcHBsaWNhdGlvbkRlcGxveW1lbnRTZXJ2aWNlLmphdmEKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvc2VydmljZS9BcHBsaWNhdGlvbkRlcGxveW1lbnRTZXJ2aWNlLmphdmEKQEAgLTIxLDkgKzIxLDkgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIuU2VydmVyUnVudGltZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRGVwbG95bWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuQXBwbGljYXRpb25EZXBsb3ltZW50UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuQXBwbGljYXRpb25Nb2R1bGVSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5Db21wdXRlUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuYXBwbGljYXRpb24uQXBwbGljYXRpb25Nb2R1bGVSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5jb21wdXRlLkNvbXB1dGVSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50UmVzb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5zZXJ2aWNlLnV0aWwuVG9SZXNvdXJjZVV0aWw7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvc2VydmljZS9BcHBsaWNhdGlvbklmYWNlU2VydmljZS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvc2VydmljZS9BcHBsaWNhdGlvbklmYWNlU2VydmljZS5qYXZhCmluZGV4IGU5NWI2NTEuLjc0NzJjMzYgMTAwNjQ0Ci0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvQXBwbGljYXRpb25JZmFjZVNlcnZpY2UuamF2YQorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9zZXJ2aWNlL0FwcGxpY2F0aW9uSWZhY2VTZXJ2aWNlLmphdmEKQEAgLTIzLDEwICsyMywxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwuYXBwbGljYXRpb24uQXBwbGljYXRpb25JbnB1dDsKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uSW50ZXJmYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwuYXBwbGljYXRpb24uQXBwbGljYXRpb25PdXRwdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LkFwcGxpY2F0aW9uSWZhY2VSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5BcHBsaWNhdGlvbklucHV0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuQXBwbGljYXRpb25Nb2R1bGVSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5BcHBsaWNhdGlvbk91dHB1dFJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uSWZhY2VSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbklucHV0UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuYXBwbGljYXRpb24uQXBwbGljYXRpb25Nb2R1bGVSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbk91dHB1dFJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbklmYWNlUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5zZXJ2aWNlLnV0aWwuVG9SZXNvdXJjZVV0aWw7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvc2VydmljZS9BcHBsaWNhdGlvbk1vZHVsZVNlcnZpY2UuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvQXBwbGljYXRpb25Nb2R1bGVTZXJ2aWNlLmphdmEKaW5kZXggZTY1OGM0Mi4uNGZkNjU0MyAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvc2VydmljZS9BcHBsaWNhdGlvbk1vZHVsZVNlcnZpY2UuamF2YQorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9zZXJ2aWNlL0FwcGxpY2F0aW9uTW9kdWxlU2VydmljZS5qYXZhCkBAIC0yMCw3ICsyMCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIuc2VydmljZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwuYXBwbGljYXRpb24uQXBwbGljYXRpb25Nb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LkFwcGxpY2F0aW9uTW9kdWxlUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuYXBwbGljYXRpb24uQXBwbGljYXRpb25Nb2R1bGVSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb25Nb2R1bGVSZXNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnNlcnZpY2UudXRpbC5Ub1Jlc291cmNlVXRpbDsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9zZXJ2aWNlL0NvbXB1dGVSZXNvdXJjZVNlcnZpY2UuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvQ29tcHV0ZVJlc291cmNlU2VydmljZS5qYXZhCmluZGV4IGJjZWRhMGIuLmEzZDc1MjUgMTAwNjQ0Ci0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvQ29tcHV0ZVJlc291cmNlU2VydmljZS5qYXZhCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvQ29tcHV0ZVJlc291cmNlU2VydmljZS5qYXZhCkBAIC0yMCw3ICsyMCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIuc2VydmljZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwuY29tcHV0ZS5Db21wdXRlUmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuQ29tcHV0ZVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LmNvbXB1dGUuQ29tcHV0ZVJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy5jb21wdXRlLkNvbXB1dGVSZXNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnNlcnZpY2UudXRpbC5Ub1Jlc291cmNlVXRpbDsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9zZXJ2aWNlL0V4cGVyaW1lbnRTZXJ2aWNlLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9zZXJ2aWNlL0V4cGVyaW1lbnRTZXJ2aWNlLmphdmEKaW5kZXggMWRlZDU0MS4uNWY2N2VmZCAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvc2VydmljZS9FeHBlcmltZW50U2VydmljZS5qYXZhCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvRXhwZXJpbWVudFNlcnZpY2UuamF2YQpAQCAtMjQsOCArMjQsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLmV4cGVyaW1lbnQuRXhwZXJpbWVudElucHV0RGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLmV4cGVyaW1lbnQuRXhwZXJpbWVudE91dHB1dERhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC5leHBlcmltZW50LkV4cGVyaW1lbnRTdGF0dXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5Lio7CiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy5leHBlcmltZW50LkV4cGVyaW1lbnRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuYXBwbGljYXRpb24uQXBwbGljYXRpb25EZXBsb3ltZW50UmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuYXBwbGljYXRpb24uQXBwbGljYXRpb25JZmFjZVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LmV4cGVyaW1lbnQuRXhwZXJpbWVudElucHV0RGF0YVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LmV4cGVyaW1lbnQuRXhwZXJpbWVudE91dHB1dERhdGFSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5leHBlcmltZW50LkV4cGVyaW1lbnRSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5leHBlcmltZW50LkV4cGVyaW1lbnRTdGF0dXNSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIuc2VydmljZS5tZXNzYWdpbmcuTWVzc2FnaW5nU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnNlcnZpY2UudXRpbC5Ub1Jlc291cmNlVXRpbDsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9zZXJ2aWNlL1Byb2Nlc3NTZXJ2aWNlLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9zZXJ2aWNlL1Byb2Nlc3NTZXJ2aWNlLmphdmEKaW5kZXggNTMyYTFkNS4uZDJiOTNhYSAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvc2VydmljZS9Qcm9jZXNzU2VydmljZS5qYXZhCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvUHJvY2Vzc1NlcnZpY2UuamF2YQpAQCAtMjQsOSArMjQsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLnByb2Nlc3MuUHJvY2Vzc01vZGVsOwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwucHJvY2Vzcy5Qcm9jZXNzU3RhdHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwudGFzay5UYXNrTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LlByb2Nlc3NSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5wcm9jZXNzLlByb2Nlc3NSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMucHJvY2Vzcy5Qcm9jZXNzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LlByb2Nlc3NTdGF0dXNSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5wcm9jZXNzLlByb2Nlc3NTdGF0dXNSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIuc2VydmljZS50YXNrLlRhc2tTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIuc2VydmljZS51dGlsLlRvUmVzb3VyY2VVdGlsOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOwogCkBAIC00Nyw2ICs0OCw4IEBACiAgICAgcHJpdmF0ZSBFeHBlcmltZW50U2VydmljZSBleHBlcmltZW50U2VydmljZTsKICAgICBwcml2YXRlIFRhc2tTZXJ2aWNlIHRhc2tTZXJ2aWNlOwogCisgICAgcHJpdmF0ZSBXb3JrZmxvd1NlcnZpY2Ugd29ya2Zsb3dTZXJ2aWNlOworCiAgICAgcHVibGljIFByb2Nlc3NTZXJ2aWNlKFByb2Nlc3NSZXBvc2l0b3J5IHByb2Nlc3NSZXBvc2l0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzU3RhdHVzUmVwb3NpdG9yeSBwcm9jZXNzU3RhdHVzUmVwb3NpdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZXJpbWVudFNlcnZpY2UgZXhwZXJpbWVudFNlcnZpY2UsCkBAIC02NCw5ICs2NywyMSBAQAogICAgICAgICBwcm9jZXNzTW9kZWwuc2V0SWQocmVzb3VyY2UuZ2V0SWQoKSk7CiAgICAgICAgIHByb2Nlc3NNb2RlbC5zZXRDcmVhdGlvblRpbWUocmVzb3VyY2UuZ2V0Q3JlYXRpb25UaW1lKCkpOwogICAgICAgICBwcm9jZXNzTW9kZWwuc2V0TGFzdFVwZGF0ZVRpbWUocmVzb3VyY2UuZ2V0TGFzdFVwZGF0ZVRpbWUoKSk7Ci0gICAgICAgIHByb2Nlc3NNb2RlbC5zZXRFeHBlcmltZW50KGV4cGVyaW1lbnRTZXJ2aWNlLmZpbmRFbnRpdHlCeUlkKHJlc291cmNlLmdldEV4cGVyaW1lbnRJZCgpKQotICAgICAgICAgICAgICAgIC5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmVyUnVudGltZUV4Y2VwdGlvbigiQ2FuIG5vdCBmaW5kIGV4cGVyaW1lbnQgd2l0aCBpZCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmdldEV4cGVyaW1lbnRJZCgpKSkpOworICAgICAgICBwcm9jZXNzTW9kZWwuc2V0TmFtZShyZXNvdXJjZS5nZXROYW1lKCkpOworICAgICAgICBwcm9jZXNzTW9kZWwuc2V0UHJvY2Vzc1R5cGUoUHJvY2Vzc01vZGVsLlByb2Nlc3NUeXBlLnZhbHVlT2YocmVzb3VyY2UuZ2V0UHJvY2Vzc1R5cGUoKSkpOworCisgICAgICAgIGlmIChyZXNvdXJjZS5nZXRFeHBlcmltZW50SWQoKSAhPSAwKSB7CisgICAgICAgICAgICBwcm9jZXNzTW9kZWwuc2V0RXhwZXJpbWVudChleHBlcmltZW50U2VydmljZS5maW5kRW50aXR5QnlJZChyZXNvdXJjZS5nZXRFeHBlcmltZW50SWQoKSkKKyAgICAgICAgICAgICAgICAgICAgLm9yRWxzZVRocm93KCgpIC0+IG5ldyBTZXJ2ZXJSdW50aW1lRXhjZXB0aW9uKCJDYW4gbm90IGZpbmQgZXhwZXJpbWVudCB3aXRoIGlkICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmdldEV4cGVyaW1lbnRJZCgpKSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc291cmNlLmdldFdvcmtmbG93SWQoKSAhPSAwKSB7CisgICAgICAgICAgICBwcm9jZXNzTW9kZWwuc2V0V29ya2Zsb3cod29ya2Zsb3dTZXJ2aWNlLmZpbmRFbnRpdHlCeUlkKHJlc291cmNlLmdldFdvcmtmbG93SWQoKSkKKyAgICAgICAgICAgICAgICAgICAgLm9yRWxzZVRocm93KCgpIC0+IG5ldyBTZXJ2ZXJSdW50aW1lRXhjZXB0aW9uKCJDYW4gbm90IGZpbmQgd29ya2Zsb3cgd2l0aCBpZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5nZXRXb3JrZmxvd0lkKCkpKSk7CisgICAgICAgIH0KKwogICAgICAgICBwcm9jZXNzTW9kZWwuc2V0RXhwZXJpbWVudERhdGFEaXIocmVzb3VyY2UuZ2V0RXhwZXJpbWVudERhdGFEaXIoKSk7CiAKICAgICAgICAgUHJvY2Vzc01vZGVsIHNhdmVkID0gcHJvY2Vzc1JlcG9zaXRvcnkuc2F2ZShwcm9jZXNzTW9kZWwpOwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvc2VydmljZS9UYXNrU2VydmljZS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvc2VydmljZS9UYXNrU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWEzYjkxLi4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvVGFza1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIuc2VydmljZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay5UYXNrUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLlRhc2tTdGF0dXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLlNlcnZlclJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLlRhc2tNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLnRhc2suVGFza1BhcmFtOwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwudGFzay5UYXNrU3RhdHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5Qcm9jZXNzUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuVGFza1BhcmFtUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuVGFza1JlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LlRhc2tTdGF0dXNSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIuc2VydmljZS51dGlsLlRvUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwotCi0vKioKLSAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQotICoKLSAqIEBhdXRob3IgZGltdXRodQotICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCi0gKi8KLUBTZXJ2aWNlCi1wdWJsaWMgY2xhc3MgVGFza1NlcnZpY2UgewotCi0gICAgcHJpdmF0ZSBQcm9jZXNzUmVwb3NpdG9yeSBwcm9jZXNzUmVwb3NpdG9yeTsKLSAgICBwcml2YXRlIFRhc2tSZXBvc2l0b3J5IHRhc2tSZXBvc2l0b3J5OwotICAgIHByaXZhdGUgVGFza1BhcmFtUmVwb3NpdG9yeSB0YXNrUGFyYW1SZXBvc2l0b3J5OwotICAgIHByaXZhdGUgVGFza1N0YXR1c1JlcG9zaXRvcnkgdGFza1N0YXR1c1JlcG9zaXRvcnk7Ci0KLSAgICBwdWJsaWMgVGFza1NlcnZpY2UoUHJvY2Vzc1JlcG9zaXRvcnkgcHJvY2Vzc1JlcG9zaXRvcnksCi0gICAgICAgICAgICAgICAgICAgICAgIFRhc2tSZXBvc2l0b3J5IHRhc2tSZXBvc2l0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICBUYXNrUGFyYW1SZXBvc2l0b3J5IHRhc2tQYXJhbVJlcG9zaXRvcnksCi0gICAgICAgICAgICAgICAgICAgICAgIFRhc2tTdGF0dXNSZXBvc2l0b3J5IHRhc2tTdGF0dXNSZXBvc2l0b3J5KSB7Ci0KLSAgICAgICAgdGhpcy5wcm9jZXNzUmVwb3NpdG9yeSA9IHByb2Nlc3NSZXBvc2l0b3J5OwotICAgICAgICB0aGlzLnRhc2tSZXBvc2l0b3J5ID0gdGFza1JlcG9zaXRvcnk7Ci0gICAgICAgIHRoaXMudGFza1BhcmFtUmVwb3NpdG9yeSA9IHRhc2tQYXJhbVJlcG9zaXRvcnk7Ci0gICAgICAgIHRoaXMudGFza1N0YXR1c1JlcG9zaXRvcnkgPSB0YXNrU3RhdHVzUmVwb3NpdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBjcmVhdGUoVGFza1Jlc291cmNlIHJlc291cmNlKSB7Ci0gICAgICAgIFRhc2tNb2RlbCB0YXNrTW9kZWwgPSBuZXcgVGFza01vZGVsKCk7Ci0gICAgICAgIHRhc2tNb2RlbC5zZXRDcmVhdGlvblRpbWUocmVzb3VyY2UuZ2V0Q3JlYXRpb25UaW1lKCkpOwotICAgICAgICB0YXNrTW9kZWwuc2V0TGFzdFVwZGF0ZVRpbWUocmVzb3VyY2UuZ2V0TGFzdFVwZGF0ZVRpbWUoKSk7Ci0gICAgICAgIHRhc2tNb2RlbC5zZXRPcmRlckluZGV4KHJlc291cmNlLmdldE9yZGVyKCkpOwotICAgICAgICB0YXNrTW9kZWwuc2V0VGFza0RldGFpbChyZXNvdXJjZS5nZXRUYXNrRGV0YWlsKCkpOwotICAgICAgICB0YXNrTW9kZWwuc2V0UGFyZW50UHJvY2Vzcyhwcm9jZXNzUmVwb3NpdG9yeS5maW5kQnlJZChyZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSkKLSAgICAgICAgICAgICAgICAub3JFbHNlVGhyb3coKCkgLT4gbmV3IFNlcnZlclJ1bnRpbWVFeGNlcHRpb24oIkNhbiBub3QgZmluZCBwcm9jZXNzIHdpdGggaWQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSkpKTsKLSAgICAgICAgdGFza01vZGVsLnNldFRhc2tUeXBlKFRhc2tNb2RlbC5UYXNrVHlwZXMudmFsdWVPZihyZXNvdXJjZS5nZXRUYXNrVHlwZSgpKSk7Ci0KLSAgICAgICAgVGFza01vZGVsIHNhdmVkVGFzayA9IHRhc2tSZXBvc2l0b3J5LnNhdmUodGFza01vZGVsKTsKLQotICAgICAgICBPcHRpb25hbC5vZk51bGxhYmxlKHJlc291cmNlLmdldFRhc2tQYXJhbXMoKSkuaWZQcmVzZW50KHBhcmFtcyAtPiBwYXJhbXMuZm9yRWFjaChwYXJhbSAtPiB7Ci0gICAgICAgICAgICBUYXNrUGFyYW0gdGFza1BhcmFtID0gbmV3IFRhc2tQYXJhbSgpOwotICAgICAgICAgICAgdGFza1BhcmFtLnNldEtleShwYXJhbS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICB0YXNrUGFyYW0uc2V0VmFsdWUocGFyYW0uZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB0YXNrUGFyYW0uc2V0VGFza01vZGVsKHNhdmVkVGFzayk7Ci0gICAgICAgICAgICB0YXNrUGFyYW1SZXBvc2l0b3J5LnNhdmUodGFza1BhcmFtKTsKLQotICAgICAgICB9KSk7Ci0gICAgICAgIHJldHVybiBzYXZlZFRhc2suZ2V0SWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBhZGRUYXNrU3RhdHVzKGxvbmcgdGFza0lkLCBUYXNrU3RhdHVzUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQotICAgICAgICBUYXNrTW9kZWwgdGFza01vZGVsID0gdGFza1JlcG9zaXRvcnkuZmluZEJ5SWQodGFza0lkKQotICAgICAgICAgICAgICAgIC5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmVyUnVudGltZUV4Y2VwdGlvbigiVGFzayB3aXRoIGlkICIgKyB0YXNrSWQgKyAiIGNhbiBub3QgYmUgZm91bmQiKSk7Ci0KLSAgICAgICAgVGFza1N0YXR1cyBzdGF0dXMgPSBuZXcgVGFza1N0YXR1cygpOwotICAgICAgICBzdGF0dXMuc2V0UmVhc29uKHJlc291cmNlLmdldFJlYXNvbigpKTsKLSAgICAgICAgc3RhdHVzLnNldFN0YXRlKFRhc2tTdGF0dXMuVGFza1N0YXRlLnZhbHVlT2YocmVzb3VyY2UuZ2V0U3RhdGUoKSkpOwotICAgICAgICBzdGF0dXMuc2V0VGltZU9mU3RhdGVDaGFuZ2UocmVzb3VyY2UuZ2V0VGltZU9mU3RhdGVDaGFuZ2UoKSk7Ci0gICAgICAgIHN0YXR1cy5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKLSAgICAgICAgVGFza1N0YXR1cyBzYXZlZFN0YXR1cyA9IHRhc2tTdGF0dXNSZXBvc2l0b3J5LnNhdmUoc3RhdHVzKTsKLQotICAgICAgICByZXR1cm4gc2F2ZWRTdGF0dXMuZ2V0SWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3B0aW9uYWw8VGFza1N0YXR1c1Jlc291cmNlPiBmaW5kVGFza1N0YXR1c0J5SWQobG9uZyBpZCkgewotICAgICAgICByZXR1cm4gVG9SZXNvdXJjZVV0aWwudG9SZXNvdXJjZSh0YXNrU3RhdHVzUmVwb3NpdG9yeS5maW5kQnlJZChpZCkuZ2V0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBPcHRpb25hbDxUYXNrUmVzb3VyY2U+IGZpbmRCeUlkKGxvbmcgaWQpIHsKLSAgICAgICAgcmV0dXJuIFRvUmVzb3VyY2VVdGlsLnRvUmVzb3VyY2UodGFza1JlcG9zaXRvcnkuZmluZEJ5SWQoaWQpLmdldCgpKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvV29ya2Zsb3dTZXJ2aWNlLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9zZXJ2aWNlL1dvcmtmbG93U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOTBjOTAKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9zZXJ2aWNlL1dvcmtmbG93U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIuc2VydmljZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMucHJvY2Vzcy5Qcm9jZXNzUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy53b3JrZmxvdy5Xb3JrZmxvd1Jlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIuU2VydmVyUnVudGltZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLnByb2Nlc3MuUHJvY2Vzc01vZGVsOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwudGFzay5UYXNrREFHOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwudGFzay5UYXNrTW9kZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLlRhc2tPdXRQb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwud29ya2Zsb3cuV29ya2Zsb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LnRhc2suVGFza0RBR1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LnRhc2suVGFza091dFBvcnRSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS50YXNrLlRhc2tSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS53b3JrZmxvdy5Xb3JrZmxvd1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5zZXJ2aWNlLnRhc2suVGFza1NlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5zZXJ2aWNlLnV0aWwuR3JhcGhQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5zZXJ2aWNlLnV0aWwuVG9SZXNvdXJjZVV0aWw7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIFdvcmtmbG93U2VydmljZSB7CisKKyAgICBwcml2YXRlIFByb2Nlc3NTZXJ2aWNlIHByb2Nlc3NTZXJ2aWNlOworICAgIHByaXZhdGUgVGFza1NlcnZpY2UgdGFza1NlcnZpY2U7CisKKyAgICBwcml2YXRlIFdvcmtmbG93UmVwb3NpdG9yeSB3b3JrZmxvd1JlcG9zaXRvcnk7CisgICAgcHJpdmF0ZSBUYXNrT3V0UG9ydFJlcG9zaXRvcnkgdGFza091dFBvcnRSZXBvc2l0b3J5OworICAgIHByaXZhdGUgVGFza1JlcG9zaXRvcnkgdGFza1JlcG9zaXRvcnk7CisgICAgcHJpdmF0ZSBUYXNrREFHUmVwb3NpdG9yeSB0YXNrREFHUmVwb3NpdG9yeTsKKworICAgIHB1YmxpYyBXb3JrZmxvd1NlcnZpY2UoUHJvY2Vzc1NlcnZpY2UgcHJvY2Vzc1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXNrU2VydmljZSB0YXNrU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtmbG93UmVwb3NpdG9yeSB3b3JrZmxvd1JlcG9zaXRvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXNrT3V0UG9ydFJlcG9zaXRvcnkgdGFza091dFBvcnRSZXBvc2l0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFza1JlcG9zaXRvcnkgdGFza1JlcG9zaXRvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXNrREFHUmVwb3NpdG9yeSB0YXNrREFHUmVwb3NpdG9yeSkgeworCisgICAgICAgIHRoaXMucHJvY2Vzc1NlcnZpY2UgPSBwcm9jZXNzU2VydmljZTsKKyAgICAgICAgdGhpcy50YXNrU2VydmljZSA9IHRhc2tTZXJ2aWNlOworICAgICAgICB0aGlzLndvcmtmbG93UmVwb3NpdG9yeSA9IHdvcmtmbG93UmVwb3NpdG9yeTsKKyAgICAgICAgdGhpcy50YXNrT3V0UG9ydFJlcG9zaXRvcnkgPSB0YXNrT3V0UG9ydFJlcG9zaXRvcnk7CisgICAgICAgIHRoaXMudGFza1JlcG9zaXRvcnkgPSB0YXNrUmVwb3NpdG9yeTsKKyAgICAgICAgdGhpcy50YXNrREFHUmVwb3NpdG9yeSA9IHRhc2tEQUdSZXBvc2l0b3J5OworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGNyZWF0ZVdvcmtmbG93KFdvcmtmbG93UmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgV29ya2Zsb3cgd29ya2Zsb3cgPSBuZXcgV29ya2Zsb3coKTsKKyAgICAgICAgd29ya2Zsb3cuc2V0TmFtZShyZXNvdXJjZS5nZXROYW1lKCkpOworICAgICAgICB3b3JrZmxvdy5zZXRXb3JrRmxvd0dyYXBoKHJlc291cmNlLmdldFdvcmtmbG93R3JhcGhYTUwoKS5nZXRCeXRlcygpKTsKKworICAgICAgICBXb3JrZmxvdyBzYXZlZCA9IHdvcmtmbG93UmVwb3NpdG9yeS5zYXZlKHdvcmtmbG93KTsKKyAgICAgICAgcmV0dXJuIHNhdmVkLmdldElkKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgbGF1bmNoV29ya2Zsb3cobG9uZyBpZCkgeworICAgICAgICBXb3JrZmxvdyB3b3JrZmxvdyA9IHRoaXMud29ya2Zsb3dSZXBvc2l0b3J5LmZpbmRCeUlkKGlkKQorICAgICAgICAgICAgICAgIC5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmVyUnVudGltZUV4Y2VwdGlvbigiV29ya2Zsb3cgd2l0aCBpZCAiICsgaWQgKyAiY2FuIG5vdCBiZSBmb3VuZCIpKTsKKworCisgICAgICAgIGxvbmcgcHJvY2Vzc0lkID0gcHJvY2Vzc1NlcnZpY2UuY3JlYXRlKG5ldyBQcm9jZXNzUmVzb3VyY2UoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lKCJXb3JrZmxvdyBQcm9jZXNzIDogIiArIHdvcmtmbG93LmdldE5hbWUoKSArICItIiArIFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgLnNldENyZWF0aW9uVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkuc2V0UHJvY2Vzc1R5cGUoIldPUktGTE9XIikpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBHcmFwaFBhcnNlci5QYXJzZVJlc3VsdCBwYXJzZVJlc3VsdCA9IEdyYXBoUGFyc2VyLnBhcnNlKG5ldyBTdHJpbmcod29ya2Zsb3cuZ2V0V29ya0Zsb3dHcmFwaCgpKSk7CisgICAgICAgICAgICBwYXJzZVJlc3VsdC5nZXRUYXNrcygpLmZvckVhY2goKG1vY2tJZCwgdGFzaykgLT4geworICAgICAgICAgICAgICAgIHRhc2suZ2V0VGFza1Jlc291cmNlKCkuc2V0UGFyZW50UHJvY2Vzc0lkKHByb2Nlc3NJZCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKEdyYXBoUGFyc2VyLk91dFBvcnQgb3V0UG9ydCA6IHRhc2suZ2V0T3V0UG9ydHMoKS52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAob3V0UG9ydC5nZXROZXh0UG9ydCgpICE9IG51bGwgJiYgb3V0UG9ydC5nZXROZXh0UG9ydCgpLmdldFBhcmVudE9wZXJhdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgiU3RvcCIuZXF1YWxzKG91dFBvcnQuZ2V0TmV4dFBvcnQoKS5nZXRQYXJlbnRPcGVyYXRpb24oKS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5nZXRUYXNrUmVzb3VyY2UoKS5zZXRTdG9wcGluZ1Rhc2sodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKEdyYXBoUGFyc2VyLkluUG9ydCBpblBvcnQgOiB0YXNrLmdldEluUG9ydHMoKS52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEdyYXBoUGFyc2VyLk91dFBvcnQgb3V0UG9ydCA6IGluUG9ydC5nZXRQcmV2aW91c1BvcnRzKCkudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRQb3J0LmdldFBhcmVudE9wZXJhdGlvbigpICE9IG51bGwgJiYgIlN0YXJ0Ii5lcXVhbHMob3V0UG9ydC5nZXRQYXJlbnRPcGVyYXRpb24oKS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5nZXRUYXNrUmVzb3VyY2UoKS5zZXRTdGFydGluZ1Rhc2sodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsb25nIHRhc2tJZCA9IHRhc2tTZXJ2aWNlLmNyZWF0ZSh0YXNrLmdldFRhc2tSZXNvdXJjZSgpKTsKKyAgICAgICAgICAgICAgICB0YXNrLmdldFRhc2tSZXNvdXJjZSgpLnNldElkKHRhc2tJZCk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcGFyc2VSZXN1bHQuZ2V0RWRnZUNhY2hlKCkuZm9yRWFjaCgoKG91dFBvcnQsIGluUG9ydCkgLT4geworICAgICAgICAgICAgICAgIGlmIChvdXRQb3J0LmdldFBhcmVudE9wZXJhdGlvbigpICE9IG51bGwgJiYgb3V0UG9ydC5nZXROZXh0UG9ydCgpLmdldFBhcmVudE9wZXJhdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8VGFza091dFBvcnQ+IHNvdXJjZU91dFBvcnQgPSB0YXNrT3V0UG9ydFJlcG9zaXRvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZEJ5UmVmZXJlbmNlSWRBbmRUYXNrTW9kZWxfSWQob3V0UG9ydC5nZXRJZCgpLCBvdXRQb3J0LmdldFBhcmVudFRhc2soKS5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8VGFza01vZGVsPiB0YXJnZXRUYXNrID0gdGFza1JlcG9zaXRvcnkuZmluZEJ5SWQoaW5Qb3J0LmdldFBhcmVudFRhc2soKS5nZXRJZCgpKTsKKworICAgICAgICAgICAgICAgICAgICB0YXNrREFHUmVwb3NpdG9yeS5zYXZlKG5ldyBUYXNrREFHKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U291cmNlT3V0UG9ydChzb3VyY2VPdXRQb3J0LmdldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUYXJnZXRUYXNrKHRhcmdldFRhc2suZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIHdvcmtmbG93IiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8V29ya2Zsb3dSZXNvdXJjZT4gZ2V0QWxsKCkgeworICAgICAgICBMaXN0PFdvcmtmbG93UmVzb3VyY2U+IHdvcmtmbG93UmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIEl0ZXJhYmxlPFdvcmtmbG93PiB3b3JrRmxvd3MgPSB0aGlzLndvcmtmbG93UmVwb3NpdG9yeS5maW5kQWxsKCk7CisgICAgICAgIE9wdGlvbmFsLm9mTnVsbGFibGUod29ya0Zsb3dzKQorICAgICAgICAgICAgICAgIC5pZlByZXNlbnQod2ZzIC0+IHdmcy5mb3JFYWNoKHdmIC0+IHdvcmtmbG93UmVzb3VyY2VzLmFkZChUb1Jlc291cmNlVXRpbC50b1Jlc291cmNlKHdmKS5nZXQoKSkpKTsKKyAgICAgICAgcmV0dXJuIHdvcmtmbG93UmVzb3VyY2VzOworICAgIH0KKworICAgIHB1YmxpYyBPcHRpb25hbDxXb3JrZmxvdz4gZmluZEVudGl0eUJ5SWQobG9uZyBpZCkgeworICAgICAgICByZXR1cm4gdGhpcy53b3JrZmxvd1JlcG9zaXRvcnkuZmluZEJ5SWQoaWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvZGF0YS9EYXRhU3RvcmVTZXJ2aWNlLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9zZXJ2aWNlL2RhdGEvRGF0YVN0b3JlU2VydmljZS5qYXZhCmluZGV4IDI3ZmNlYjEuLjI3MmFiMzMgMTAwNjQ0Ci0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvZGF0YS9EYXRhU3RvcmVTZXJ2aWNlLmphdmEKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvc2VydmljZS9kYXRhL0RhdGFTdG9yZVNlcnZpY2UuamF2YQpAQCAtMjEsOSArMjEsOSBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy5kYXRhLkRhdGFFbnRyeVJlc291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwuZGF0YS5EYXRhU3RvcmVNb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuRGF0YVN0b3JlUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuRXhwZXJpbWVudE91dHB1dERhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5UYXNrUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkuZGF0YS5EYXRhU3RvcmVSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS5leHBlcmltZW50LkV4cGVyaW1lbnRPdXRwdXREYXRhUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkudGFzay5UYXNrUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9zZXJ2aWNlL3Rhc2svVGFza1NlcnZpY2UuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvdGFzay9UYXNrU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYjM4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9zZXJ2aWNlL3Rhc2svVGFza1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoqCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnNlcnZpY2UudGFzazsKKworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay5UYXNrUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLlRhc2tTdGF0dXNSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLlNlcnZlclJ1bnRpbWVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLio7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LnByb2Nlc3MuUHJvY2Vzc1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5yZXBvc2l0b3J5LnRhc2suKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkudGFzay50eXBlLlRhc2tUeXBlUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnNlcnZpY2UudXRpbC5Ub1Jlc291cmNlVXRpbDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIFRhc2tTZXJ2aWNlIHsKKworICAgIHByaXZhdGUgUHJvY2Vzc1JlcG9zaXRvcnkgcHJvY2Vzc1JlcG9zaXRvcnk7CisgICAgcHJpdmF0ZSBUYXNrUmVwb3NpdG9yeSB0YXNrUmVwb3NpdG9yeTsKKyAgICBwcml2YXRlIFRhc2tJbnB1dFJlcG9zaXRvcnkgdGFza0lucHV0UmVwb3NpdG9yeTsKKyAgICBwcml2YXRlIFRhc2tPdXRwdXRSZXBvc2l0b3J5IHRhc2tPdXRwdXRSZXBvc2l0b3J5OworICAgIHByaXZhdGUgVGFza1N0YXR1c1JlcG9zaXRvcnkgdGFza1N0YXR1c1JlcG9zaXRvcnk7CisgICAgcHJpdmF0ZSBUYXNrVHlwZVJlcG9zaXRvcnkgdGFza1R5cGVSZXBvc2l0b3J5OworICAgIHByaXZhdGUgVGFza091dFBvcnRSZXBvc2l0b3J5IHRhc2tPdXRQb3J0UmVwb3NpdG9yeTsKKyAgICBwcml2YXRlIFRhc2tEQUdSZXBvc2l0b3J5IHRhc2tEQUdSZXBvc2l0b3J5OworCisKKyAgICBwdWJsaWMgVGFza1NlcnZpY2UoUHJvY2Vzc1JlcG9zaXRvcnkgcHJvY2Vzc1JlcG9zaXRvcnksCisgICAgICAgICAgICAgICAgICAgICAgIFRhc2tSZXBvc2l0b3J5IHRhc2tSZXBvc2l0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICBUYXNrSW5wdXRSZXBvc2l0b3J5IHRhc2tJbnB1dFJlcG9zaXRvcnksCisgICAgICAgICAgICAgICAgICAgICAgIFRhc2tPdXRwdXRSZXBvc2l0b3J5IHRhc2tPdXRwdXRSZXBvc2l0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICBUYXNrU3RhdHVzUmVwb3NpdG9yeSB0YXNrU3RhdHVzUmVwb3NpdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgVGFza1R5cGVSZXBvc2l0b3J5IHRhc2tUeXBlUmVwb3NpdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgVGFza091dFBvcnRSZXBvc2l0b3J5IHRhc2tPdXRQb3J0UmVwb3NpdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgVGFza0RBR1JlcG9zaXRvcnkgdGFza0RBR1JlcG9zaXRvcnkpIHsKKworICAgICAgICB0aGlzLnByb2Nlc3NSZXBvc2l0b3J5ID0gcHJvY2Vzc1JlcG9zaXRvcnk7CisgICAgICAgIHRoaXMudGFza1JlcG9zaXRvcnkgPSB0YXNrUmVwb3NpdG9yeTsKKyAgICAgICAgdGhpcy50YXNrSW5wdXRSZXBvc2l0b3J5ID0gdGFza0lucHV0UmVwb3NpdG9yeTsKKyAgICAgICAgdGhpcy50YXNrT3V0cHV0UmVwb3NpdG9yeSA9IHRhc2tPdXRwdXRSZXBvc2l0b3J5OworICAgICAgICB0aGlzLnRhc2tTdGF0dXNSZXBvc2l0b3J5ID0gdGFza1N0YXR1c1JlcG9zaXRvcnk7CisgICAgICAgIHRoaXMudGFza1R5cGVSZXBvc2l0b3J5ID0gdGFza1R5cGVSZXBvc2l0b3J5OworICAgICAgICB0aGlzLnRhc2tPdXRQb3J0UmVwb3NpdG9yeSA9IHRhc2tPdXRQb3J0UmVwb3NpdG9yeTsKKyAgICAgICAgdGhpcy50YXNrREFHUmVwb3NpdG9yeSA9IHRhc2tEQUdSZXBvc2l0b3J5OworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGNyZWF0ZShUYXNrUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgVGFza01vZGVsIHRhc2tNb2RlbCA9IG5ldyBUYXNrTW9kZWwoKTsKKyAgICAgICAgdGFza01vZGVsLnNldE5hbWUocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKyAgICAgICAgdGFza01vZGVsLnNldENyZWF0aW9uVGltZShyZXNvdXJjZS5nZXRDcmVhdGlvblRpbWUoKSk7CisgICAgICAgIHRhc2tNb2RlbC5zZXRMYXN0VXBkYXRlVGltZShyZXNvdXJjZS5nZXRMYXN0VXBkYXRlVGltZSgpKTsKKyAgICAgICAgdGFza01vZGVsLnNldE9yZGVySW5kZXgocmVzb3VyY2UuZ2V0T3JkZXIoKSk7CisgICAgICAgIHRhc2tNb2RlbC5zZXRTdGFydGluZ1Rhc2socmVzb3VyY2UuaXNTdGFydGluZ1Rhc2soKSk7CisgICAgICAgIHRhc2tNb2RlbC5zZXRTdG9wcGluZ1Rhc2socmVzb3VyY2UuaXNTdG9wcGluZ1Rhc2soKSk7CisgICAgICAgIHRhc2tNb2RlbC5zZXRUYXNrRGV0YWlsKHJlc291cmNlLmdldFRhc2tEZXRhaWwoKSk7CisgICAgICAgIHRhc2tNb2RlbC5zZXRQYXJlbnRQcm9jZXNzKHByb2Nlc3NSZXBvc2l0b3J5LmZpbmRCeUlkKHJlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpKQorICAgICAgICAgICAgICAgIC5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmVyUnVudGltZUV4Y2VwdGlvbigiQ2FuIG5vdCBmaW5kIHByb2Nlc3Mgd2l0aCBpZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpKSkpOworICAgICAgICB0YXNrTW9kZWwuc2V0VGFza1R5cGUodGFza1R5cGVSZXBvc2l0b3J5LmZpbmRCeUlkKHJlc291cmNlLmdldFRhc2tUeXBlSWQoKSkKKyAgICAgICAgICAgICAgICAub3JFbHNlVGhyb3coKCkgLT4gbmV3IFNlcnZlclJ1bnRpbWVFeGNlcHRpb24oIkNhbiBub3QgZmluZCB0YXNrIHR5cGUgd2l0aCBpZCAiICsKKyAgICAgICAgICAgICAgICByZXNvdXJjZS5nZXRUYXNrVHlwZUlkKCkpKSk7CisKKyAgICAgICAgVGFza01vZGVsIHNhdmVkVGFzayA9IHRhc2tSZXBvc2l0b3J5LnNhdmUodGFza01vZGVsKTsKKworICAgICAgICBPcHRpb25hbC5vZk51bGxhYmxlKHJlc291cmNlLmdldElucHV0cygpKS5pZlByZXNlbnQoaW5wdXRzIC0+IGlucHV0cy5mb3JFYWNoKGlucHV0IC0+IHsKKyAgICAgICAgICAgIFRhc2tJbnB1dCB0YXNrSW5wdXQgPSBuZXcgVGFza0lucHV0KCk7CisgICAgICAgICAgICB0YXNrSW5wdXQuc2V0TmFtZShpbnB1dC5nZXROYW1lKCkpOworICAgICAgICAgICAgdGFza0lucHV0LnNldFZhbHVlKGlucHV0LmdldFZhbHVlKCkpOworICAgICAgICAgICAgdGFza0lucHV0LnNldFR5cGUoaW5wdXQuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgIHRhc2tJbnB1dC5zZXRJbXBvcnRGcm9tKGlucHV0LmdldEltcG9ydEZyb20oKSk7CisgICAgICAgICAgICB0YXNrSW5wdXQuc2V0VGFza01vZGVsKHNhdmVkVGFzayk7CisgICAgICAgICAgICB0YXNrSW5wdXRSZXBvc2l0b3J5LnNhdmUodGFza0lucHV0KTsKKyAgICAgICAgfSkpOworCisgICAgICAgIE9wdGlvbmFsLm9mTnVsbGFibGUocmVzb3VyY2UuZ2V0T3V0cHV0cygpKS5pZlByZXNlbnQob3V0cHV0cyAtPiBvdXRwdXRzLmZvckVhY2gob3V0cHV0IC0+IHsKKyAgICAgICAgICAgIFRhc2tPdXRwdXQgdGFza091dHB1dCA9IG5ldyBUYXNrT3V0cHV0KCk7CisgICAgICAgICAgICB0YXNrT3V0cHV0LnNldE5hbWUob3V0cHV0LmdldE5hbWUoKSk7CisgICAgICAgICAgICB0YXNrT3V0cHV0LnNldFZhbHVlKG91dHB1dC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHRhc2tPdXRwdXQuc2V0VHlwZShvdXRwdXQuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgIHRhc2tPdXRwdXQuc2V0RXhwb3J0VG8ob3V0cHV0LmdldEV4cG9ydFRvKCkpOworICAgICAgICAgICAgdGFza091dHB1dC5zZXRUYXNrTW9kZWwoc2F2ZWRUYXNrKTsKKyAgICAgICAgICAgIHRhc2tPdXRwdXRSZXBvc2l0b3J5LnNhdmUodGFza091dHB1dCk7CisgICAgICAgIH0pKTsKKworICAgICAgICBPcHRpb25hbC5vZk51bGxhYmxlKHJlc291cmNlLmdldE91dFBvcnRzKCkpLmlmUHJlc2VudChvdXRQb3J0cyAtPiBvdXRQb3J0cy5mb3JFYWNoKG91dFBvcnQgLT4geworICAgICAgICAgICAgVGFza091dFBvcnQgdGFza091dFBvcnQgPSBuZXcgVGFza091dFBvcnQoKTsKKyAgICAgICAgICAgIHRhc2tPdXRQb3J0LnNldE5hbWUob3V0UG9ydC5nZXROYW1lKCkpOworICAgICAgICAgICAgdGFza091dFBvcnQuc2V0UmVmZXJlbmNlSWQob3V0UG9ydC5nZXRSZWZlcmVuY2VJZCgpKTsKKyAgICAgICAgICAgIHRhc2tPdXRQb3J0LnNldFRhc2tNb2RlbCh0YXNrTW9kZWwpOworICAgICAgICAgICAgdGFza091dFBvcnRSZXBvc2l0b3J5LnNhdmUodGFza091dFBvcnQpOworICAgICAgICB9KSk7CisgICAgICAgIHJldHVybiBzYXZlZFRhc2suZ2V0SWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBhZGRUYXNrU3RhdHVzKGxvbmcgdGFza0lkLCBUYXNrU3RhdHVzUmVzb3VyY2UgcmVzb3VyY2UpIHsKKworICAgICAgICBUYXNrTW9kZWwgdGFza01vZGVsID0gdGFza1JlcG9zaXRvcnkuZmluZEJ5SWQodGFza0lkKQorICAgICAgICAgICAgICAgIC5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmVyUnVudGltZUV4Y2VwdGlvbigiVGFzayB3aXRoIGlkICIgKyB0YXNrSWQgKyAiIGNhbiBub3QgYmUgZm91bmQiKSk7CisKKyAgICAgICAgVGFza1N0YXR1cyBzdGF0dXMgPSBuZXcgVGFza1N0YXR1cygpOworICAgICAgICBzdGF0dXMuc2V0UmVhc29uKHJlc291cmNlLmdldFJlYXNvbigpKTsKKyAgICAgICAgc3RhdHVzLnNldFN0YXRlKFRhc2tTdGF0dXMuVGFza1N0YXRlLnZhbHVlT2YocmVzb3VyY2UuZ2V0U3RhdGUoKSkpOworICAgICAgICBzdGF0dXMuc2V0VGltZU9mU3RhdGVDaGFuZ2UocmVzb3VyY2UuZ2V0VGltZU9mU3RhdGVDaGFuZ2UoKSk7CisgICAgICAgIHN0YXR1cy5zZXRUYXNrTW9kZWwodGFza01vZGVsKTsKKyAgICAgICAgVGFza1N0YXR1cyBzYXZlZFN0YXR1cyA9IHRhc2tTdGF0dXNSZXBvc2l0b3J5LnNhdmUoc3RhdHVzKTsKKworICAgICAgICByZXR1cm4gc2F2ZWRTdGF0dXMuZ2V0SWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3B0aW9uYWw8VGFza1N0YXR1c1Jlc291cmNlPiBmaW5kVGFza1N0YXR1c0J5SWQobG9uZyBpZCkgeworICAgICAgICByZXR1cm4gVG9SZXNvdXJjZVV0aWwudG9SZXNvdXJjZSh0YXNrU3RhdHVzUmVwb3NpdG9yeS5maW5kQnlJZChpZCkuZ2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBPcHRpb25hbDxUYXNrUmVzb3VyY2U+IGZpbmRCeUlkKGxvbmcgaWQpIHsKKyAgICAgICAgcmV0dXJuIFRvUmVzb3VyY2VVdGlsLnRvUmVzb3VyY2UodGFza1JlcG9zaXRvcnkuZmluZEJ5SWQoaWQpLmdldCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvdGFzay90eXBlL1Rhc2tUeXBlU2VydmljZS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvc2VydmljZS90YXNrL3R5cGUvVGFza1R5cGVTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhZTBmMQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvdGFzay90eXBlL1Rhc2tUeXBlU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5zZXJ2aWNlLnRhc2sudHlwZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay50eXBlLlRhc2tUeXBlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLnR5cGUuVGFza0lucHV0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLnRhc2sudHlwZS5UYXNrTW9kZWxUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwudGFzay50eXBlLlRhc2tPdXRQb3J0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLnRhc2sudHlwZS5UYXNrT3V0cHV0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkudGFzay50eXBlLlRhc2tJbnB1dFR5cGVSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIucmVwb3NpdG9yeS50YXNrLnR5cGUuVGFza091dFBvcnRUeXBlUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkudGFzay50eXBlLlRhc2tPdXRwdXRUeXBlUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnJlcG9zaXRvcnkudGFzay50eXBlLlRhc2tUeXBlUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLnNlcnZpY2UudXRpbC5Ub1Jlc291cmNlVXRpbDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK0BTZXJ2aWNlCitwdWJsaWMgY2xhc3MgVGFza1R5cGVTZXJ2aWNlIHsKKworICAgIHByaXZhdGUgVGFza1R5cGVSZXBvc2l0b3J5IHRhc2tUeXBlUmVwb3NpdG9yeTsKKyAgICBwcml2YXRlIFRhc2tJbnB1dFR5cGVSZXBvc2l0b3J5IHRhc2tJbnB1dFR5cGVSZXBvc2l0b3J5OworICAgIHByaXZhdGUgVGFza091dHB1dFR5cGVSZXBvc2l0b3J5IHRhc2tPdXRwdXRUeXBlUmVwb3NpdG9yeTsKKyAgICBwcml2YXRlIFRhc2tPdXRQb3J0VHlwZVJlcG9zaXRvcnkgdGFza091dFBvcnRUeXBlUmVwb3NpdG9yeTsKKworICAgIHB1YmxpYyBUYXNrVHlwZVNlcnZpY2UoVGFza1R5cGVSZXBvc2l0b3J5IHRhc2tUeXBlUmVwb3NpdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhc2tJbnB1dFR5cGVSZXBvc2l0b3J5IHRhc2tJbnB1dFR5cGVSZXBvc2l0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFza091dHB1dFR5cGVSZXBvc2l0b3J5IHRhc2tPdXRwdXRUeXBlUmVwb3NpdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhc2tPdXRQb3J0VHlwZVJlcG9zaXRvcnkgdGFza091dFBvcnRUeXBlUmVwb3NpdG9yeSkgeworCisgICAgICAgIHRoaXMudGFza1R5cGVSZXBvc2l0b3J5ID0gdGFza1R5cGVSZXBvc2l0b3J5OworICAgICAgICB0aGlzLnRhc2tJbnB1dFR5cGVSZXBvc2l0b3J5ID0gdGFza0lucHV0VHlwZVJlcG9zaXRvcnk7CisgICAgICAgIHRoaXMudGFza091dHB1dFR5cGVSZXBvc2l0b3J5ID0gdGFza091dHB1dFR5cGVSZXBvc2l0b3J5OworICAgICAgICB0aGlzLnRhc2tPdXRQb3J0VHlwZVJlcG9zaXRvcnkgPSB0YXNrT3V0UG9ydFR5cGVSZXBvc2l0b3J5OworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGNyZWF0ZShUYXNrVHlwZVJlc291cmNlIHJlc291cmNlKSB7CisKKyAgICAgICAgT3B0aW9uYWw8VGFza01vZGVsVHlwZT4gdGFza1R5cGUgPSB0YXNrVHlwZVJlcG9zaXRvcnkuZmluZEJ5TmFtZShyZXNvdXJjZS5nZXROYW1lKCkpOworCisgICAgICAgIGlmICh0YXNrVHlwZS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRhc2tUeXBlLmdldCgpLmdldElkKCk7CisgICAgICAgIH0KKworICAgICAgICBUYXNrTW9kZWxUeXBlIHRhc2tNb2RlbFR5cGUgPSBuZXcgVGFza01vZGVsVHlwZSgpOworICAgICAgICB0YXNrTW9kZWxUeXBlLnNldE5hbWUocmVzb3VyY2UuZ2V0TmFtZSgpKTsKKyAgICAgICAgdGFza01vZGVsVHlwZS5zZXRUb3BpY05hbWUocmVzb3VyY2UuZ2V0VG9waWNOYW1lKCkpOworICAgICAgICB0YXNrTW9kZWxUeXBlLnNldEljb24ocmVzb3VyY2UuZ2V0SWNvbigpKTsKKyAgICAgICAgVGFza01vZGVsVHlwZSBzYXZlZFRhc2tUeXBlID0gdGFza1R5cGVSZXBvc2l0b3J5LnNhdmUodGFza01vZGVsVHlwZSk7CisKKyAgICAgICAgT3B0aW9uYWwub2ZOdWxsYWJsZShyZXNvdXJjZS5nZXRJbnB1dFR5cGVzKCkpLmlmUHJlc2VudChpbnB1dHMgLT4gaW5wdXRzLmZvckVhY2goaW5wdXQgLT4geworICAgICAgICAgICAgVGFza0lucHV0VHlwZSBpbnB1dFR5cGUgPSBuZXcgVGFza0lucHV0VHlwZSgpOworICAgICAgICAgICAgaW5wdXRUeXBlLnNldE5hbWUoaW5wdXQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGlucHV0VHlwZS5zZXRUeXBlKGlucHV0LmdldFR5cGUoKSk7CisgICAgICAgICAgICBpbnB1dFR5cGUuc2V0RGVmYXVsdFZhbHVlKGlucHV0LmdldERlZmF1bHRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGlucHV0VHlwZS5zZXRUYXNrTW9kZWxUeXBlKHNhdmVkVGFza1R5cGUpOworICAgICAgICAgICAgdGFza0lucHV0VHlwZVJlcG9zaXRvcnkuc2F2ZShpbnB1dFR5cGUpOworICAgICAgICB9KSk7CisKKyAgICAgICAgT3B0aW9uYWwub2ZOdWxsYWJsZShyZXNvdXJjZS5nZXRPdXRwdXRUeXBlcygpKS5pZlByZXNlbnQob3V0cHV0cyAtPiBvdXRwdXRzLmZvckVhY2gob3V0cHV0IC0+IHsKKyAgICAgICAgICAgIFRhc2tPdXRwdXRUeXBlIG91dHB1dFR5cGUgPSBuZXcgVGFza091dHB1dFR5cGUoKTsKKyAgICAgICAgICAgIG91dHB1dFR5cGUuc2V0TmFtZShvdXRwdXQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIG91dHB1dFR5cGUuc2V0VHlwZShvdXRwdXQuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgIG91dHB1dFR5cGUuc2V0VGFza01vZGVsVHlwZShzYXZlZFRhc2tUeXBlKTsKKyAgICAgICAgICAgIHRhc2tPdXRwdXRUeXBlUmVwb3NpdG9yeS5zYXZlKG91dHB1dFR5cGUpOworICAgICAgICB9KSk7CisKKyAgICAgICAgT3B0aW9uYWwub2ZOdWxsYWJsZShyZXNvdXJjZS5nZXRPdXRQb3J0cygpKS5pZlByZXNlbnQob3V0UG9ydHMgLT4gb3V0UG9ydHMuZm9yRWFjaChvdXRQb3J0IC0+IHsKKyAgICAgICAgICAgIFRhc2tPdXRQb3J0VHlwZSBvdXRQb3J0VHlwZSA9IG5ldyBUYXNrT3V0UG9ydFR5cGUoKTsKKyAgICAgICAgICAgIG91dFBvcnRUeXBlLnNldE5hbWUob3V0UG9ydC5nZXROYW1lKCkpOworICAgICAgICAgICAgb3V0UG9ydFR5cGUuc2V0T3JkZXIob3V0UG9ydC5nZXRPcmRlcigpKTsKKyAgICAgICAgICAgIG91dFBvcnRUeXBlLnNldFRhc2tNb2RlbFR5cGUoc2F2ZWRUYXNrVHlwZSk7CisgICAgICAgICAgICB0YXNrT3V0UG9ydFR5cGVSZXBvc2l0b3J5LnNhdmUob3V0UG9ydFR5cGUpOworICAgICAgICB9KSk7CisKKyAgICAgICAgcmV0dXJuIHNhdmVkVGFza1R5cGUuZ2V0SWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxUYXNrVHlwZVJlc291cmNlPiBnZXRBbGwoKSB7CisgICAgICAgIExpc3Q8VGFza1R5cGVSZXNvdXJjZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgT3B0aW9uYWwub2ZOdWxsYWJsZSh0YXNrVHlwZVJlcG9zaXRvcnkuZmluZEFsbCgpKQorICAgICAgICAgICAgICAgIC5pZlByZXNlbnQodGFza01vZGVsVHlwZXMgLT4gdGFza01vZGVsVHlwZXMuZm9yRWFjaCh0YXNrTW9kZWxUeXBlIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZXMuYWRkKFRvUmVzb3VyY2VVdGlsLnRvUmVzb3VyY2UodGFza01vZGVsVHlwZSkuZ2V0KCkpOworICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgcmV0dXJuIHR5cGVzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvdXRpbC9HcmFwaFBhcnNlci5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvYXBpLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2FwaS9zZXJ2ZXIvc2VydmljZS91dGlsL0dyYXBoUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmMTYzMAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvdXRpbC9HcmFwaFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsNDQwIEBACitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIuc2VydmljZS51dGlsOworCitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLlRhc2tJbnB1dFJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay5UYXNrT3V0UG9ydFJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay5UYXNrT3V0cHV0UmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLlRhc2tSZXNvdXJjZTsKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuY3JpdGVyaWEuQ3JpdGVyaWFCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK3B1YmxpYyBjbGFzcyBHcmFwaFBhcnNlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIFBhcnNlUmVzdWx0IHBhcnNlKFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRCdWlsZGVyID0gZGJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICBEb2N1bWVudCBkb2MgPSBkQnVpbGRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihjb250ZW50KSkpOworICAgICAgICBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkubm9ybWFsaXplKCk7CisKKyAgICAgICAgTm9kZUxpc3Qgbkxpc3QgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInJvb3QiKTsKKyAgICAgICAgTm9kZSByb290Tm9kZSA9IG5MaXN0Lml0ZW0oMCk7CisKKyAgICAgICAgTm9kZUxpc3QgZWxlbWVudE5vZGVMaXN0ID0gcm9vdE5vZGUuZ2V0Q2hpbGROb2RlcygpOworCisgICAgICAgIFBhcnNlUmVzdWx0IHJlc3VsdCA9IG5ldyBQYXJzZVJlc3VsdCgpOworCisgICAgICAgIGZvciAoaW50IHRlbXAgPSAwOyB0ZW1wIDwgZWxlbWVudE5vZGVMaXN0LmdldExlbmd0aCgpOyB0ZW1wKyspIHsKKworICAgICAgICAgICAgTm9kZSBuTm9kZSA9IGVsZW1lbnROb2RlTGlzdC5pdGVtKHRlbXApOworCisgICAgICAgICAgICBpZiAobk5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgeworICAgICAgICAgICAgICAgIEVsZW1lbnQgZUVsZW1lbnQgPSAoRWxlbWVudCkgbk5vZGU7CisKKyAgICAgICAgICAgICAgICBpZiAoIlByb2Nlc3NpbmdFbGVtZW50Ii5lcXVhbHMoZUVsZW1lbnQuZ2V0VGFnTmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBUYXNrUmVzb3VyY2UgdGFza1Jlc291cmNlID0gbmV3IFRhc2tSZXNvdXJjZSgpOworICAgICAgICAgICAgICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVFbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlkID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIGF0dHIgPSBhdHRyaWJ1dGVzLml0ZW0oaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgibmFtZSIuZXF1YWxzKGF0dHIuZ2V0Tm9kZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrUmVzb3VyY2Uuc2V0TmFtZShhdHRyLmdldE5vZGVWYWx1ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiVHlwZSIuZXF1YWxzKGF0dHIuZ2V0Tm9kZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrUmVzb3VyY2Uuc2V0VGFza1R5cGVJZChMb25nLnBhcnNlTG9uZyhhdHRyLmdldE5vZGVWYWx1ZSgpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0ci5nZXROb2RlTmFtZSgpLnN0YXJ0c1dpdGgoImluLSIpIHx8IGF0dHIuZ2V0Tm9kZU5hbWUoKS5zdGFydHNXaXRoKCJvdXQtIikpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiaWQiLmVxdWFscyhhdHRyLmdldE5vZGVOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBJbnRlZ2VyLnBhcnNlSW50KGF0dHIuZ2V0Tm9kZVZhbHVlKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHIuZ2V0Tm9kZU5hbWUoKS5zdGFydHNXaXRoKCJvdXRwdXQtIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXNrT3V0cHV0UmVzb3VyY2Ugb3V0cHV0UmVzb3VyY2UgPSBuZXcgVGFza091dHB1dFJlc291cmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UmVzb3VyY2Uuc2V0TmFtZShhdHRyLmdldE5vZGVOYW1lKCkuc3Vic3RyaW5nKDcpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRSZXNvdXJjZS5zZXRWYWx1ZShhdHRyLmdldE5vZGVWYWx1ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXNrSW5wdXRSZXNvdXJjZSBpbnB1dFJlc291cmNlID0gbmV3IFRhc2tJbnB1dFJlc291cmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRSZXNvdXJjZS5zZXROYW1lKGF0dHIuZ2V0Tm9kZU5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRSZXNvdXJjZS5zZXRWYWx1ZShhdHRyLmdldE5vZGVWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrUmVzb3VyY2UuZ2V0SW5wdXRzKCkuYWRkKGlucHV0UmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgVGFzayB0YXNrID0gbmV3IFRhc2soKTsKKyAgICAgICAgICAgICAgICAgICAgdGFzay5pZCA9IGlkOworICAgICAgICAgICAgICAgICAgICB0YXNrLnRhc2tSZXNvdXJjZSA9IHRhc2tSZXNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnRhc2tzLnB1dChpZCwgdGFzayk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJPcGVyYXRpb24iLmVxdWFscyhlRWxlbWVudC5nZXRUYWdOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZUVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSBhdHRyID0gYXR0cmlidXRlcy5pdGVtKGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIm5hbWUiLmVxdWFscyhhdHRyLmdldE5vZGVOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGF0dHIuZ2V0Tm9kZVZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJpZCIuZXF1YWxzKGF0dHIuZ2V0Tm9kZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IEludGVnZXIucGFyc2VJbnQoYXR0ci5nZXROb2RlVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5pZCA9IGlkOworICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24ubmFtZSA9IG5hbWU7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5vcGVyYXRpb25zLnB1dChpZCwgb3BlcmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJJblBvcnQiLmVxdWFscyhlRWxlbWVudC5nZXRUYWdOYW1lKCkpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGlkID0gSW50ZWdlci5wYXJzZUludChlRWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIikpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVFbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOworCisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgbXhDZWxsID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICBOb2RlTGlzdCBjaGlsZE5vZGVzID0gZUVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgdGVtcEluUG9ydCA9IGNoaWxkTm9kZXMuaXRlbShpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wSW5Qb3J0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHRtcEluRWxlbWVudCA9IChFbGVtZW50KSB0ZW1wSW5Qb3J0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgibXhDZWxsIi5lcXVhbHModG1wSW5FbGVtZW50LmdldFRhZ05hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXhDZWxsID0gdG1wSW5FbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQgcGFyZW50SWQgPSBJbnRlZ2VyLnBhcnNlSW50KG14Q2VsbC5nZXRBdHRyaWJ1dGUoInBhcmVudCIpKTsKKworICAgICAgICAgICAgICAgICAgICBJblBvcnQgaW5Qb3J0ID0gbmV3IEluUG9ydCgpOworICAgICAgICAgICAgICAgICAgICBpblBvcnQuaWQgPSBpZDsKKyAgICAgICAgICAgICAgICAgICAgaW5Qb3J0Lm5hbWUgPSBuYW1lOworICAgICAgICAgICAgICAgICAgICByZXN1bHQucG9ydENhY2hlLnB1dChpZCwgaW5Qb3J0KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnRhc2tzLmNvbnRhaW5zS2V5KHBhcmVudElkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5Qb3J0LnBhcmVudFRhc2sgPSByZXN1bHQudGFza3MuZ2V0KHBhcmVudElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50YXNrcy5nZXQocGFyZW50SWQpLmluUG9ydHMucHV0KGlkLCBpblBvcnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5vcGVyYXRpb25zLmNvbnRhaW5zS2V5KHBhcmVudElkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5Qb3J0LnBhcmVudE9wZXJhdGlvbiA9IHJlc3VsdC5vcGVyYXRpb25zLmdldChwYXJlbnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQub3BlcmF0aW9ucy5nZXQocGFyZW50SWQpLmluUG9ydHMucHV0KGlkLCBpblBvcnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHRvIGZpbmQgcGFyZW50IGlkICIgKyBwYXJlbnRJZCArICIgZm9yIGluIHBvcnQgIiArIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiT3V0UG9ydCIuZXF1YWxzKGVFbGVtZW50LmdldFRhZ05hbWUoKSkpIHsKKworICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSBJbnRlZ2VyLnBhcnNlSW50KGVFbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJuYW1lIik7CisKKyAgICAgICAgICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgbXhDZWxsID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICBOb2RlTGlzdCBjaGlsZE5vZGVzID0gZUVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgdGVtcE91dFBvcnQgPSBjaGlsZE5vZGVzLml0ZW0oaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcE91dFBvcnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgdG1wT3V0RWxlbWVudCA9IChFbGVtZW50KSB0ZW1wT3V0UG9ydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIm14Q2VsbCIuZXF1YWxzKHRtcE91dEVsZW1lbnQuZ2V0VGFnTmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteENlbGwgPSB0bXBPdXRFbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQgcGFyZW50SWQgPSBJbnRlZ2VyLnBhcnNlSW50KG14Q2VsbC5nZXRBdHRyaWJ1dGUoInBhcmVudCIpKTsKKworICAgICAgICAgICAgICAgICAgICBPdXRQb3J0IG91dFBvcnQgPSBuZXcgT3V0UG9ydCgpOworICAgICAgICAgICAgICAgICAgICBvdXRQb3J0LmlkID0gaWQ7CisgICAgICAgICAgICAgICAgICAgIG91dFBvcnQubmFtZSA9IG5hbWU7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wb3J0Q2FjaGUucHV0KGlkLCBvdXRQb3J0KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnRhc2tzLmNvbnRhaW5zS2V5KHBhcmVudElkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0UG9ydC5wYXJlbnRUYXNrID0gcmVzdWx0LnRhc2tzLmdldChwYXJlbnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQudGFza3MuZ2V0KHBhcmVudElkKS5vdXRQb3J0cy5wdXQoaWQsIG91dFBvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnRhc2tzLmdldChwYXJlbnRJZCkuZ2V0VGFza1Jlc291cmNlKCkuZ2V0T3V0UG9ydHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBUYXNrT3V0UG9ydFJlc291cmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZShvdXRQb3J0Lm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFJlZmVyZW5jZUlkKG91dFBvcnQuaWQpKTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5vcGVyYXRpb25zLmNvbnRhaW5zS2V5KHBhcmVudElkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0UG9ydC5wYXJlbnRPcGVyYXRpb24gPSByZXN1bHQub3BlcmF0aW9ucy5nZXQocGFyZW50SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm9wZXJhdGlvbnMuZ2V0KHBhcmVudElkKS5vdXRQb3J0cy5wdXQoaWQsIG91dFBvcnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmFpbGVkIHRvIGZpbmQgcGFyZW50IGlkICIgKyBwYXJlbnRJZCArICIgZm9yIG91dCBwb3J0ICIgKyBpZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm14Q2VsbCIuZXF1YWxzKGVFbGVtZW50LmdldFRhZ05hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgiZWRnZSIpICYmIGVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgic291cmNlIikgJiYgZUVsZW1lbnQuaGFzQXR0cmlidXRlKCJ0YXJnZXQiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZUlkID0gSW50ZWdlci5wYXJzZUludChlRWxlbWVudC5nZXRBdHRyaWJ1dGUoInNvdXJjZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXJnZXRJZCA9IEludGVnZXIucGFyc2VJbnQoZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucG9ydENhY2hlLmNvbnRhaW5zS2V5KHRhcmdldElkKSAmJiByZXN1bHQucG9ydENhY2hlLmNvbnRhaW5zS2V5KHNvdXJjZUlkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluUG9ydCBpblBvcnQgPSAoSW5Qb3J0KSByZXN1bHQucG9ydENhY2hlLmdldCh0YXJnZXRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0UG9ydCBvdXRQb3J0ID0gKE91dFBvcnQpIHJlc3VsdC5wb3J0Q2FjaGUuZ2V0KHNvdXJjZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQb3J0Lm5leHRQb3J0ID0gaW5Qb3J0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUG9ydC5wcmV2aW91c1BvcnRzLnB1dChvdXRQb3J0LmlkLCBvdXRQb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZWRnZUNhY2hlLnB1dChvdXRQb3J0LCBpblBvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIGNvbm5lY3Rpb24gd2l0aCBzb3VyY2UgaWQgIiArIHNvdXJjZUlkICsgIiB0YXJnZXQgaWQgIiArIHRhcmdldElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJzZVJlc3VsdCB7CisKKworICAgICAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBUYXNrPiB0YXNrcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgT3BlcmF0aW9uPiBvcGVyYXRpb25zID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBPYmplY3Q+IHBvcnRDYWNoZSA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBNYXA8T3V0UG9ydCwgSW5Qb3J0PiBlZGdlQ2FjaGUgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgcHVibGljIE1hcDxJbnRlZ2VyLCBUYXNrPiBnZXRUYXNrcygpIHsKKyAgICAgICAgICAgIHJldHVybiB0YXNrczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQYXJzZVJlc3VsdCBzZXRUYXNrcyhNYXA8SW50ZWdlciwgVGFzaz4gdGFza3MpIHsKKyAgICAgICAgICAgIHRoaXMudGFza3MgPSB0YXNrczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1hcDxJbnRlZ2VyLCBPcGVyYXRpb24+IGdldE9wZXJhdGlvbnMoKSB7CisgICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQYXJzZVJlc3VsdCBzZXRPcGVyYXRpb25zKE1hcDxJbnRlZ2VyLCBPcGVyYXRpb24+IG9wZXJhdGlvbnMpIHsKKyAgICAgICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgT2JqZWN0PiBnZXRQb3J0Q2FjaGUoKSB7CisgICAgICAgICAgICByZXR1cm4gcG9ydENhY2hlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFBhcnNlUmVzdWx0IHNldFBvcnRDYWNoZShNYXA8SW50ZWdlciwgT2JqZWN0PiBwb3J0Q2FjaGUpIHsKKyAgICAgICAgICAgIHRoaXMucG9ydENhY2hlID0gcG9ydENhY2hlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWFwPE91dFBvcnQsIEluUG9ydD4gZ2V0RWRnZUNhY2hlKCkgeworICAgICAgICAgICAgcmV0dXJuIGVkZ2VDYWNoZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQYXJzZVJlc3VsdCBzZXRFZGdlQ2FjaGUoTWFwPE91dFBvcnQsIEluUG9ydD4gZWRnZUNhY2hlKSB7CisgICAgICAgICAgICB0aGlzLmVkZ2VDYWNoZSA9IGVkZ2VDYWNoZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRhc2sgeworICAgICAgICBwcml2YXRlIGludCBpZDsKKyAgICAgICAgcHJpdmF0ZSBUYXNrUmVzb3VyY2UgdGFza1Jlc291cmNlOworICAgICAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBJblBvcnQ+IGluUG9ydHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHByaXZhdGUgTWFwPEludGVnZXIsIE91dFBvcnQ+IG91dFBvcnRzID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGFzayBzZXRJZChpbnQgaWQpIHsKKyAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRhc2tSZXNvdXJjZSBnZXRUYXNrUmVzb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gdGFza1Jlc291cmNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRhc2sgc2V0VGFza1Jlc291cmNlKFRhc2tSZXNvdXJjZSB0YXNrUmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHRoaXMudGFza1Jlc291cmNlID0gdGFza1Jlc291cmNlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWFwPEludGVnZXIsIEluUG9ydD4gZ2V0SW5Qb3J0cygpIHsKKyAgICAgICAgICAgIHJldHVybiBpblBvcnRzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRhc2sgc2V0SW5Qb3J0cyhNYXA8SW50ZWdlciwgSW5Qb3J0PiBpblBvcnRzKSB7CisgICAgICAgICAgICB0aGlzLmluUG9ydHMgPSBpblBvcnRzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWFwPEludGVnZXIsIE91dFBvcnQ+IGdldE91dFBvcnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIG91dFBvcnRzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRhc2sgc2V0T3V0UG9ydHMoTWFwPEludGVnZXIsIE91dFBvcnQ+IG91dFBvcnRzKSB7CisgICAgICAgICAgICB0aGlzLm91dFBvcnRzID0gb3V0UG9ydHM7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3V0UG9ydCB7CisgICAgICAgIHByaXZhdGUgSW5Qb3J0IG5leHRQb3J0OworICAgICAgICBwcml2YXRlIFRhc2sgcGFyZW50VGFzazsKKyAgICAgICAgcHJpdmF0ZSBPcGVyYXRpb24gcGFyZW50T3BlcmF0aW9uOworICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIGludCBpZDsKKworICAgICAgICBwdWJsaWMgSW5Qb3J0IGdldE5leHRQb3J0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHRQb3J0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE91dFBvcnQgc2V0TmV4dFBvcnQoSW5Qb3J0IG5leHRQb3J0KSB7CisgICAgICAgICAgICB0aGlzLm5leHRQb3J0ID0gbmV4dFBvcnQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUYXNrIGdldFBhcmVudFRhc2soKSB7CisgICAgICAgICAgICByZXR1cm4gcGFyZW50VGFzazsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPdXRQb3J0IHNldFBhcmVudFRhc2soVGFzayBwYXJlbnRUYXNrKSB7CisgICAgICAgICAgICB0aGlzLnBhcmVudFRhc2sgPSBwYXJlbnRUYXNrOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT3BlcmF0aW9uIGdldFBhcmVudE9wZXJhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnRPcGVyYXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT3V0UG9ydCBzZXRQYXJlbnRPcGVyYXRpb24oT3BlcmF0aW9uIHBhcmVudE9wZXJhdGlvbikgeworICAgICAgICAgICAgdGhpcy5wYXJlbnRPcGVyYXRpb24gPSBwYXJlbnRPcGVyYXRpb247CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE91dFBvcnQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPdXRQb3J0IHNldElkKGludCBpZCkgeworICAgICAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluUG9ydCB7CisgICAgICAgIHByaXZhdGUgTWFwPEludGVnZXIsIE91dFBvcnQ+IHByZXZpb3VzUG9ydHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHByaXZhdGUgVGFzayBwYXJlbnRUYXNrOworICAgICAgICBwcml2YXRlIE9wZXJhdGlvbiBwYXJlbnRPcGVyYXRpb247CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgICAgIHByaXZhdGUgaW50IGlkOworCisgICAgICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgT3V0UG9ydD4gZ2V0UHJldmlvdXNQb3J0cygpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1BvcnRzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEluUG9ydCBzZXRQcmV2aW91c1BvcnRzKE1hcDxJbnRlZ2VyLCBPdXRQb3J0PiBwcmV2aW91c1BvcnRzKSB7CisgICAgICAgICAgICB0aGlzLnByZXZpb3VzUG9ydHMgPSBwcmV2aW91c1BvcnRzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGFzayBnZXRQYXJlbnRUYXNrKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhcmVudFRhc2s7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW5Qb3J0IHNldFBhcmVudFRhc2soVGFzayBwYXJlbnRUYXNrKSB7CisgICAgICAgICAgICB0aGlzLnBhcmVudFRhc2sgPSBwYXJlbnRUYXNrOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT3BlcmF0aW9uIGdldFBhcmVudE9wZXJhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnRPcGVyYXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW5Qb3J0IHNldFBhcmVudE9wZXJhdGlvbihPcGVyYXRpb24gcGFyZW50T3BlcmF0aW9uKSB7CisgICAgICAgICAgICB0aGlzLnBhcmVudE9wZXJhdGlvbiA9IHBhcmVudE9wZXJhdGlvbjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW5Qb3J0IHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW5Qb3J0IHNldElkKGludCBpZCkgeworICAgICAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9wZXJhdGlvbiB7CisgICAgICAgIHByaXZhdGUgaW50IGlkOworICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBJblBvcnQ+IGluUG9ydHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHByaXZhdGUgTWFwPEludGVnZXIsIE91dFBvcnQ+IG91dFBvcnRzID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT3BlcmF0aW9uIHNldElkKGludCBpZCkgeworICAgICAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPcGVyYXRpb24gc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1hcDxJbnRlZ2VyLCBJblBvcnQ+IGdldEluUG9ydHMoKSB7CisgICAgICAgICAgICByZXR1cm4gaW5Qb3J0czsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPcGVyYXRpb24gc2V0SW5Qb3J0cyhNYXA8SW50ZWdlciwgSW5Qb3J0PiBpblBvcnRzKSB7CisgICAgICAgICAgICB0aGlzLmluUG9ydHMgPSBpblBvcnRzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWFwPEludGVnZXIsIE91dFBvcnQ+IGdldE91dFBvcnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIG91dFBvcnRzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9wZXJhdGlvbiBzZXRPdXRQb3J0cyhNYXA8SW50ZWdlciwgT3V0UG9ydD4gb3V0UG9ydHMpIHsKKyAgICAgICAgICAgIHRoaXMub3V0UG9ydHMgPSBvdXRQb3J0czsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy9hcGktc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvYXBpL3NlcnZlci9zZXJ2aWNlL3V0aWwvVG9SZXNvdXJjZVV0aWwuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvdXRpbC9Ub1Jlc291cmNlVXRpbC5qYXZhCmluZGV4IDAzMTg5NzguLjc2MzFiMDEgMTAwNjQ0Ci0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvdXRpbC9Ub1Jlc291cmNlVXRpbC5qYXZhCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL2FwaS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9hcGkvc2VydmVyL3NlcnZpY2UvdXRpbC9Ub1Jlc291cmNlVXRpbC5qYXZhCkBAIC0yMSw5ICsyMSwxMiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy5leHBlcmltZW50LkV4cGVyaW1lbnRTdGF0dXNSZXNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLnByb2Nlc3MuUHJvY2Vzc1N0YXR1c1Jlc291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay5UYXNrUGFyYW1SZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLnRhc2suVGFza1Jlc291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay5UYXNrU3RhdHVzUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLio7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLnR5cGUuVGFza0lucHV0VHlwZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay50eXBlLlRhc2tPdXRQb3J0VHlwZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay50eXBlLlRhc2tPdXRwdXRUeXBlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLnR5cGUuVGFza1R5cGVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLndvcmtmbG93LldvcmtmbG93UmVzb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkludGVyZmFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uTW9kdWxlOwpAQCAtMzQsNiArMzcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwuZXhwZXJpbWVudC5FeHBlcmltZW50U3RhdHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwucHJvY2Vzcy5Qcm9jZXNzTW9kZWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC5wcm9jZXNzLlByb2Nlc3NTdGF0dXM7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLlRhc2tJbnB1dDsKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLnRhc2suVGFza01vZGVsOwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMuYXBwbGljYXRpb24uKjsKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLmNvbXB1dGUuQ29tcHV0ZVJlc291cmNlOwpAQCAtNDEsOCArNDUsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLmV4cGVyaW1lbnQuRXhwZXJpbWVudE91dHB1dFJlc291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMuZXhwZXJpbWVudC5FeHBlcmltZW50UmVzb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy5wcm9jZXNzLlByb2Nlc3NSZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLnRhc2suVGFza1BhcmFtOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwudGFzay5UYXNrT3V0cHV0OwogaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwudGFzay5UYXNrU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5zZXJ2ZXIubW9kZWwudGFzay50eXBlLlRhc2tJbnB1dFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLnR5cGUuVGFza01vZGVsVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkuc2VydmVyLm1vZGVsLnRhc2sudHlwZS5UYXNrT3V0UG9ydFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC50YXNrLnR5cGUuVGFza091dHB1dFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnNlcnZlci5tb2RlbC53b3JrZmxvdy5Xb3JrZmxvdzsKIAogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIApAQCAtMjE3LDE3ICsyMjYsMjUgQEAKICAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFRhc2tSZXNvdXJjZT4gdG9SZXNvdXJjZShUYXNrTW9kZWwgdGFza01vZGVsKSB7CiAgICAgICAgIGlmICh0YXNrTW9kZWwgIT0gbnVsbCkgewogICAgICAgICAgICAgVGFza1Jlc291cmNlIHJlc291cmNlID0gbmV3IFRhc2tSZXNvdXJjZSgpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0TmFtZSh0YXNrTW9kZWwuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgIHJlc291cmNlLnNldElkKHRhc2tNb2RlbC5nZXRJZCgpKTsKICAgICAgICAgICAgIHJlc291cmNlLnNldExhc3RVcGRhdGVUaW1lKHRhc2tNb2RlbC5nZXRMYXN0VXBkYXRlVGltZSgpKTsKICAgICAgICAgICAgIHJlc291cmNlLnNldENyZWF0aW9uVGltZSh0YXNrTW9kZWwuZ2V0Q3JlYXRpb25UaW1lKCkpOwogICAgICAgICAgICAgcmVzb3VyY2Uuc2V0UGFyZW50UHJvY2Vzc0lkKHRhc2tNb2RlbC5nZXRQYXJlbnRQcm9jZXNzKCkuZ2V0SWQoKSk7Ci0gICAgICAgICAgICByZXNvdXJjZS5zZXRUYXNrVHlwZSh0YXNrTW9kZWwuZ2V0VGFza1R5cGUoKS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIHJlc291cmNlLnNldFRhc2tUeXBlU3RyKHRhc2tNb2RlbC5nZXRUYXNrVHlwZSgpLm5hbWUoKSk7CisgICAgICAgICAgICByZXNvdXJjZS5zZXRUYXNrVHlwZUlkKHRhc2tNb2RlbC5nZXRUYXNrVHlwZSgpLmdldElkKCkpOwogICAgICAgICAgICAgcmVzb3VyY2Uuc2V0VGFza0RldGFpbCh0YXNrTW9kZWwuZ2V0VGFza0RldGFpbCgpKTsKLSAgICAgICAgICAgIE9wdGlvbmFsLm9mTnVsbGFibGUodGFza01vZGVsLmdldFRhc2tQYXJhbXMoKSkKLSAgICAgICAgICAgICAgICAgICAgLmlmUHJlc2VudChwYXJhbXMgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZm9yRWFjaChwYXJhbSAtPiByZXNvdXJjZS5nZXRUYXNrUGFyYW1zKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQodG9SZXNvdXJjZShwYXJhbSkuZ2V0KCkpKSk7CisgICAgICAgICAgICByZXNvdXJjZS5zZXRTdGFydGluZ1Rhc2sodGFza01vZGVsLmlzU3RhcnRpbmdUYXNrKCkpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0U3RvcHBpbmdUYXNrKHRhc2tNb2RlbC5pc1N0b3BwaW5nVGFzaygpKTsKKyAgICAgICAgICAgIE9wdGlvbmFsLm9mTnVsbGFibGUodGFza01vZGVsLmdldFRhc2tJbnB1dHMoKSkKKyAgICAgICAgICAgICAgICAgICAgLmlmUHJlc2VudChpbnB1dHMgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dHMuZm9yRWFjaChpbnB1dCAtPiByZXNvdXJjZS5nZXRJbnB1dHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCh0b1Jlc291cmNlKGlucHV0KS5nZXQoKSkpKTsKKworICAgICAgICAgICAgT3B0aW9uYWwub2ZOdWxsYWJsZSh0YXNrTW9kZWwuZ2V0VGFza091dHB1dHMoKSkKKyAgICAgICAgICAgICAgICAgICAgLmlmUHJlc2VudChvdXRwdXRzIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5mb3JFYWNoKG91dHB1dCAtPiByZXNvdXJjZS5nZXRPdXRwdXRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQodG9SZXNvdXJjZShvdXRwdXQpLmdldCgpKSkpOworCiAKICAgICAgICAgICAgIE9wdGlvbmFsLm9mTnVsbGFibGUodGFza01vZGVsLmdldFRhc2tTdGF0dXNlcygpKQogICAgICAgICAgICAgICAgICAgICAuaWZQcmVzZW50KHRhc2tTdGF0dXNlcyAtPgpAQCAtMjU2LDEyICsyNzMsMjggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8VGFza1BhcmFtUmVzb3VyY2U+IHRvUmVzb3VyY2UoVGFza1BhcmFtIHRhc2tQYXJhbSkgewotICAgICAgICBpZiAodGFza1BhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIFRhc2tQYXJhbVJlc291cmNlIHJlc291cmNlID0gbmV3IFRhc2tQYXJhbVJlc291cmNlKCk7Ci0gICAgICAgICAgICByZXNvdXJjZS5zZXRJZCh0YXNrUGFyYW0uZ2V0SWQoKSk7Ci0gICAgICAgICAgICByZXNvdXJjZS5zZXRLZXkodGFza1BhcmFtLmdldEtleSgpKTsKLSAgICAgICAgICAgIHJlc291cmNlLnNldFZhbHVlKHRhc2tQYXJhbS5nZXRWYWx1ZSgpKTsKKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFRhc2tJbnB1dFJlc291cmNlPiB0b1Jlc291cmNlKFRhc2tJbnB1dCB0YXNrSW5wdXQpIHsKKyAgICAgICAgaWYgKHRhc2tJbnB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICBUYXNrSW5wdXRSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBUYXNrSW5wdXRSZXNvdXJjZSgpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0SWQodGFza0lucHV0LmdldElkKCkpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0TmFtZSh0YXNrSW5wdXQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldFZhbHVlKHRhc2tJbnB1dC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldFR5cGUodGFza0lucHV0LmdldFR5cGUoKSk7CisgICAgICAgICAgICByZXNvdXJjZS5zZXRJbXBvcnRGcm9tKHRhc2tJbnB1dC5nZXRJbXBvcnRGcm9tKCkpOworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHJlc291cmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxUYXNrT3V0cHV0UmVzb3VyY2U+IHRvUmVzb3VyY2UoVGFza091dHB1dCB0YXNrT3V0cHV0KSB7CisgICAgICAgIGlmICh0YXNrT3V0cHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFRhc2tPdXRwdXRSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBUYXNrT3V0cHV0UmVzb3VyY2UoKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldElkKHRhc2tPdXRwdXQuZ2V0SWQoKSk7CisgICAgICAgICAgICByZXNvdXJjZS5zZXROYW1lKHRhc2tPdXRwdXQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldFZhbHVlKHRhc2tPdXRwdXQuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICByZXNvdXJjZS5zZXRUeXBlKHRhc2tPdXRwdXQuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldEV4cG9ydFRvKHRhc2tPdXRwdXQuZ2V0RXhwb3J0VG8oKSk7CiAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YocmVzb3VyY2UpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CkBAIC0zMDIsNCArMzM1LDg3IEBACiAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8VGFza1R5cGVSZXNvdXJjZT4gdG9SZXNvdXJjZShUYXNrTW9kZWxUeXBlIHRhc2tNb2RlbFR5cGUpIHsKKworICAgICAgICBpZiAodGFza01vZGVsVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBUYXNrVHlwZVJlc291cmNlIHJlc291cmNlID0gbmV3IFRhc2tUeXBlUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldE5hbWUodGFza01vZGVsVHlwZS5nZXROYW1lKCkpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0SWQodGFza01vZGVsVHlwZS5nZXRJZCgpKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldFRvcGljTmFtZSh0YXNrTW9kZWxUeXBlLmdldFRvcGljTmFtZSgpKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldEljb24odGFza01vZGVsVHlwZS5nZXRJY29uKCkpOworCisgICAgICAgICAgICBPcHRpb25hbC5vZk51bGxhYmxlKHRhc2tNb2RlbFR5cGUuZ2V0SW5wdXRUeXBlcygpKQorICAgICAgICAgICAgICAgICAgICAuaWZQcmVzZW50KHRhc2tJbnB1dFR5cGVzIC0+IHRhc2tJbnB1dFR5cGVzLmZvckVhY2godGFza0lucHV0VHlwZSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5nZXRJbnB1dFR5cGVzKCkuYWRkKHRvUmVzb3VyY2UodGFza0lucHV0VHlwZSkuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgICAgIE9wdGlvbmFsLm9mTnVsbGFibGUodGFza01vZGVsVHlwZS5nZXRPdXRwdXRUeXBlcygpKQorICAgICAgICAgICAgICAgICAgICAuaWZQcmVzZW50KHRhc2tPdXRwdXRUeXBlcyAtPiB0YXNrT3V0cHV0VHlwZXMuZm9yRWFjaCh0YXNrT3V0cHV0VHlwZSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5nZXRPdXRwdXRUeXBlcygpLmFkZCh0b1Jlc291cmNlKHRhc2tPdXRwdXRUeXBlKS5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgT3B0aW9uYWwub2ZOdWxsYWJsZSh0YXNrTW9kZWxUeXBlLmdldE91dFBvcnRzKCkpCisgICAgICAgICAgICAgICAgICAgIC5pZlByZXNlbnQodGFza091dFBvcnRzIC0+IHRhc2tPdXRQb3J0cy5mb3JFYWNoKHRhc2tPdXRQb3J0IC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmdldE91dFBvcnRzKCkuYWRkKHRvUmVzb3VyY2UodGFza091dFBvcnQpLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHJlc291cmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxUYXNrSW5wdXRUeXBlUmVzb3VyY2U+IHRvUmVzb3VyY2UoVGFza0lucHV0VHlwZSB0YXNrSW5wdXRUeXBlKSB7CisgICAgICAgIGlmICh0YXNrSW5wdXRUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFRhc2tJbnB1dFR5cGVSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBUYXNrSW5wdXRUeXBlUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldElkKHRhc2tJbnB1dFR5cGUuZ2V0SWQoKSk7CisgICAgICAgICAgICByZXNvdXJjZS5zZXROYW1lKHRhc2tJbnB1dFR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldFR5cGUodGFza0lucHV0VHlwZS5nZXRUeXBlKCkpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0RGVmYXVsdFZhbHVlKHRhc2tJbnB1dFR5cGUuZ2V0RGVmYXVsdFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHJlc291cmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxUYXNrT3V0cHV0VHlwZVJlc291cmNlPiB0b1Jlc291cmNlKFRhc2tPdXRwdXRUeXBlIHRhc2tPdXRwdXRUeXBlKSB7CisgICAgICAgIGlmICh0YXNrT3V0cHV0VHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBUYXNrT3V0cHV0VHlwZVJlc291cmNlIHJlc291cmNlID0gbmV3IFRhc2tPdXRwdXRUeXBlUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldElkKHRhc2tPdXRwdXRUeXBlLmdldElkKCkpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0TmFtZSh0YXNrT3V0cHV0VHlwZS5nZXROYW1lKCkpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0VHlwZSh0YXNrT3V0cHV0VHlwZS5nZXRUeXBlKCkpOworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHJlc291cmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxUYXNrT3V0UG9ydFR5cGVSZXNvdXJjZT4gdG9SZXNvdXJjZShUYXNrT3V0UG9ydFR5cGUgdGFza091dFBvcnQpIHsKKyAgICAgICAgaWYgKHRhc2tPdXRQb3J0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFRhc2tPdXRQb3J0VHlwZVJlc291cmNlIHJlc291cmNlID0gbmV3IFRhc2tPdXRQb3J0VHlwZVJlc291cmNlKCk7CisgICAgICAgICAgICByZXNvdXJjZS5zZXRJZCh0YXNrT3V0UG9ydC5nZXRJZCgpKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldE5hbWUodGFza091dFBvcnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldE9yZGVyKHRhc2tPdXRQb3J0LmdldE9yZGVyKCkpOworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHJlc291cmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxXb3JrZmxvd1Jlc291cmNlPiB0b1Jlc291cmNlKFdvcmtmbG93IHdvcmtmbG93KSB7CisgICAgICAgIGlmICh3b3JrZmxvdyAhPSBudWxsKSB7CisgICAgICAgICAgICBXb3JrZmxvd1Jlc291cmNlIHJlc291cmNlID0gbmV3IFdvcmtmbG93UmVzb3VyY2UoKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldElkKHdvcmtmbG93LmdldElkKCkpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0TmFtZSh3b3JrZmxvdy5nZXROYW1lKCkpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0V29ya2Zsb3dHcmFwaFhNTChuZXcgU3RyaW5nKHdvcmtmbG93LmdldFdvcmtGbG93R3JhcGgoKSkpOworICAgICAgICAgICAgT3B0aW9uYWwub2ZOdWxsYWJsZSh3b3JrZmxvdy5nZXRQcm9jZXNzZXMoKSkuaWZQcmVzZW50KHByb2Nlc3NNb2RlbHMgLT4geworICAgICAgICAgICAgICAgIHByb2Nlc3NNb2RlbHMuZm9yRWFjaChwcm9jZXNzTW9kZWwgLT4geworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5nZXRQcm9jZXNzSWRzKCkuYWRkKHByb2Nlc3NNb2RlbC5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHJlc291cmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFzay1zY2hlZHVsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9nZmFjL2NvcmUvUHJvY2Vzc0xpZmVDeWNsZU1hbmFnZXIuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2stc2NoZWR1bGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvZ2ZhYy9jb3JlL1Byb2Nlc3NMaWZlQ3ljbGVNYW5hZ2VyLmphdmEKaW5kZXggMDFlNTNhMi4uNzUxYjJlYyAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFzay1zY2hlZHVsZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9nZmFjL2NvcmUvUHJvY2Vzc0xpZmVDeWNsZU1hbmFnZXIuamF2YQorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrLXNjaGVkdWxlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL2dmYWMvY29yZS9Qcm9jZXNzTGlmZUN5Y2xlTWFuYWdlci5qYXZhCkBAIC04NCwzMyArODQsNiBAQAogCiAgICAgcHVibGljIHZvaWQgc3VibWl0VGFza1RvUXVldWUoVGFza1Jlc291cmNlIHRhc2tSZXNvdXJjZSkgewogCi0gICAgICAgIHN3aXRjaCAodGFza1Jlc291cmNlLmdldFRhc2tUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgVGFza1Jlc291cmNlLlRhc2tUeXBlcy5FR1JFU1NfREFUQV9TVEFHSU5HIDoKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN1Ym1pdHRpbmcgdGFzayAiICsgdGFza1Jlc291cmNlLmdldElkKCkgKyAiIHRvIGVncmVzcyBkYXRhIHN0YWdpbmcgcXVldWUiKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQcm9jZXNzU3RhdHVzKFByb2Nlc3NTdGF0dXNSZXNvdXJjZS5TdGF0ZS5PVVRQVVRfREFUQV9TVEFHSU5HKTsKLSAgICAgICAgICAgICAgICB0aGlzLmthZmthU2VuZGVyLnNlbmQoImFpcmF2YXRhLXRhc2stZWdyZXNzLXN0YWdpbmciLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSArICIiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVGFza1Jlc291cmNlLlRhc2tUeXBlcy5JTkdSRVNTX0RBVEFfU1RBR0lORyA6Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdWJtaXR0aW5nIHRhc2sgIiArIHRhc2tSZXNvdXJjZS5nZXRJZCgpICsgIiB0byBpbmdyZXNzIGRhdGEgc3RhZ2luZyBxdWV1ZSIpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVByb2Nlc3NTdGF0dXMoUHJvY2Vzc1N0YXR1c1Jlc291cmNlLlN0YXRlLklOUFVUX0RBVEFfU1RBR0lORyk7Ci0gICAgICAgICAgICAgICAgdGhpcy5rYWZrYVNlbmRlci5zZW5kKCJhaXJhdmF0YS10YXNrLWluZ3Jlc3Mtc3RhZ2luZyIsIHRhc2tSZXNvdXJjZS5nZXRJZCgpICsgIiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUYXNrUmVzb3VyY2UuVGFza1R5cGVzLkVOVl9TRVRVUCA6Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdWJtaXR0aW5nIHRhc2sgIiArIHRhc2tSZXNvdXJjZS5nZXRJZCgpICsgIiB0byBlbnYgc2V0dXAgcXVldWUiKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQcm9jZXNzU3RhdHVzKFByb2Nlc3NTdGF0dXNSZXNvdXJjZS5TdGF0ZS5QUkVfUFJPQ0VTU0lORyk7Ci0gICAgICAgICAgICAgICAgdGhpcy5rYWZrYVNlbmRlci5zZW5kKCJhaXJhdmF0YS10YXNrLWVudi1zZXR1cCIsIHRhc2tSZXNvdXJjZS5nZXRJZCgpICsgIiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUYXNrUmVzb3VyY2UuVGFza1R5cGVzLkVOVl9DTEVBTlVQIDoKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN1Ym1pdHRpbmcgdGFzayAiICsgdGFza1Jlc291cmNlLmdldElkKCkgKyAiIHRvIGVudiBjbGVhbnVwIHF1ZXVlIik7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUHJvY2Vzc1N0YXR1cyhQcm9jZXNzU3RhdHVzUmVzb3VyY2UuU3RhdGUuUE9TVF9QUk9DRVNTSU5HKTsKLSAgICAgICAgICAgICAgICB0aGlzLmthZmthU2VuZGVyLnNlbmQoImFpcmF2YXRhLXRhc2stZW52LWNsZWFudXAiLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSArICIiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVGFza1Jlc291cmNlLlRhc2tUeXBlcy5KT0JfU1VCTUlTU0lPTiA6Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdWJtaXR0aW5nIHRhc2sgIiArIHRhc2tSZXNvdXJjZS5nZXRJZCgpICsgIiB0byBqb2Igc3VibWlzc2lvbiBxdWV1ZSIpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVByb2Nlc3NTdGF0dXMoUHJvY2Vzc1N0YXR1c1Jlc291cmNlLlN0YXRlLkVYRUNVVElORyk7Ci0gICAgICAgICAgICAgICAgdGhpcy5rYWZrYVNlbmRlci5zZW5kKCJhaXJhdmF0YS10YXNrLWpvYi1zdWJtaXNzaW9uIiwgdGFza1Jlc291cmNlLmdldElkKCkgKyAiIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlUHJvY2Vzc1N0YXR1cyhpbnQgc3RhdGUpIHsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2pvYi1zdWJtaXNzaW9uLXRhc2svcG9tLnhtbCBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2NvbW1hbmQtZXhlY3V0aW5nLXRhc2svcG9tLnhtbApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9qb2Itc3VibWlzc2lvbi10YXNrL3BvbS54bWwKcmVuYW1lIHRvIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2NvbW1hbmQtZXhlY3V0aW5nLXRhc2svcG9tLnhtbAppbmRleCBjMDQ2Yjg3Li5lZmY3M2Y1IDEwMDY0NAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9qb2Itc3VibWlzc2lvbi10YXNrL3BvbS54bWwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvY29tbWFuZC1leGVjdXRpbmctdGFzay9wb20ueG1sCkBAIC0zMSw3ICszMSw3IEBACiAgICAgPC9wYXJlbnQ+CiAgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgogCi0gICAgPGFydGlmYWN0SWQ+am9iLXN1Ym1pc3Npb24tdGFzazwvYXJ0aWZhY3RJZD4KKyAgICA8YXJ0aWZhY3RJZD5jb21tYW5kLWV4ZWN1dGluZy10YXNrPC9hcnRpZmFjdElkPgogCiAgICAgPGRlcGVuZGVuY2llcz4KICAgICAgICAgPGRlcGVuZGVuY3k+CkBAIC00NCw2ICs0NCwxMSBAQAogICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXBpLXJlc291cmNlPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgogICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5haXJhdmF0YTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnRhc2stYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CiAKICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3Q8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9qb2Itc3VibWlzc2lvbi10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9qb2IvQXBwbGljYXRpb24uamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2NvbW1hbmQtZXhlY3V0aW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2pvYi9BcHBsaWNhdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODAlCnJlbmFtZSBmcm9tIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2pvYi1zdWJtaXNzaW9uLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2pvYi9BcHBsaWNhdGlvbi5qYXZhCnJlbmFtZSB0byBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9jb21tYW5kLWV4ZWN1dGluZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9qb2IvQXBwbGljYXRpb24uamF2YQppbmRleCA5OTU1NTAyLi5kMTFhN2M1IDEwMDY0NAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9qb2Itc3VibWlzc2lvbi10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9qb2IvQXBwbGljYXRpb24uamF2YQorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9jb21tYW5kLWV4ZWN1dGluZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9qb2IvQXBwbGljYXRpb24uamF2YQpAQCAtMTksMTIgKzE5LDE2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5qb2I7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmFwaS5tZXNzYWdpbmcuUmVjZWl2ZXJDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5hcGkubWVzc2FnaW5nLlNlbmRlckNvbmZpZzsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3QuU3ByaW5nQXBwbGljYXRpb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5ib290LmF1dG9jb25maWd1cmUuRW5hYmxlQXV0b0NvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5ib290LmF1dG9jb25maWd1cmUuU3ByaW5nQm9vdEFwcGxpY2F0aW9uOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdC53ZWIuY2xpZW50LlJlc3RUZW1wbGF0ZUJ1aWxkZXI7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db21wb25lbnRTY2FuOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uSW1wb3J0OwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNsaWVudC5SZXN0VGVtcGxhdGU7CiAKIC8qKgpAQCAtMzUsNyArMzksOSBAQAogICovCiBAU3ByaW5nQm9vdEFwcGxpY2F0aW9uCiBAQ29uZmlndXJhdGlvbgotQENvbXBvbmVudFNjYW4KK0BDb21wb25lbnRTY2FuKGJhc2VQYWNrYWdlcyA9ICJvcmcuYXBhY2hlLmFpcmF2YXRhLioiKQorQEVuYWJsZUF1dG9Db25maWd1cmF0aW9uCitASW1wb3J0KHtSZWNlaXZlckNvbmZpZy5jbGFzcywgU2VuZGVyQ29uZmlnLmNsYXNzfSkKIHB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbiB7CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9jb21tYW5kLWV4ZWN1dGluZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9qb2IvQ29tbWFuZFRhc2tJbmZvLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9jb21tYW5kLWV4ZWN1dGluZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9qb2IvQ29tbWFuZFRhc2tJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JmZmNlMwotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2NvbW1hbmQtZXhlY3V0aW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2pvYi9Db21tYW5kVGFza0luZm8uamF2YQpAQCAtMCwwICsxLDU5IEBACitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suam9iOworCitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLnR5cGUuVGFza0lucHV0VHlwZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay50eXBlLlRhc2tPdXRQb3J0VHlwZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay50eXBlLlRhc2tUeXBlUmVzb3VyY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK3B1YmxpYyBjbGFzcyBDb21tYW5kVGFza0luZm8geworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORCA9ICJjb21tYW5kIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVFMgPSAiYXJndW1lbnRzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVERfT1VUX1BBVEggPSAic3RkX291dF9wYXRoIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVERfRVJSX1BBVEggPSAic3RkX2Vycl9wYXRoIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QVVRFX1JFU09VUkNFID0gImNvbXB1dGVfcmVzb3VyY2UiOworCisgICAgcHVibGljIHN0YXRpYyBUYXNrVHlwZVJlc291cmNlIGdldFRhc2tUeXBlKCkgeworICAgICAgICBUYXNrVHlwZVJlc291cmNlIHRhc2tUeXBlUmVzb3VyY2UgPSBuZXcgVGFza1R5cGVSZXNvdXJjZSgpOworICAgICAgICB0YXNrVHlwZVJlc291cmNlLnNldE5hbWUoIkNvbW1hbmQgRXhlY3V0ZSIpOworICAgICAgICB0YXNrVHlwZVJlc291cmNlLnNldFRvcGljTmFtZSgiYWlyYXZhdGEtY29tbWFuZCIpOworICAgICAgICB0YXNrVHlwZVJlc291cmNlLnNldEljb24oImFzc2V0cy9pY29ucy9zc2gucG5nIik7CisgICAgICAgIHRhc2tUeXBlUmVzb3VyY2UuZ2V0SW5wdXRUeXBlcygpLmFkZEFsbCgKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRhc2tJbnB1dFR5cGVSZXNvdXJjZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKENPTU1BTkQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUeXBlKCJTdHJpbmciKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RGVmYXVsdFZhbHVlKCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXNrSW5wdXRUeXBlUmVzb3VyY2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZShBUkdVTUVOVFMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUeXBlKCJTdHJpbmciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXNrSW5wdXRUeXBlUmVzb3VyY2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZShDT01QVVRFX1JFU09VUkNFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VHlwZSgiTG9uZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRhc2tJbnB1dFR5cGVSZXNvdXJjZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKFNURF9PVVRfUEFUSCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFR5cGUoIlN0cmluZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRhc2tJbnB1dFR5cGVSZXNvdXJjZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKFNURF9FUlJfUEFUSCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFR5cGUoIlN0cmluZyIpKSk7CisKKyAgICAgICAgdGFza1R5cGVSZXNvdXJjZS5nZXRPdXRQb3J0cygpLmFkZEFsbCgKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRhc2tPdXRQb3J0VHlwZVJlc291cmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE5hbWUoIk91dCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPcmRlcigwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXNrT3V0UG9ydFR5cGVSZXNvdXJjZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKCJFcnJvciIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPcmRlcigxKSkKKyAgICAgICAgKTsKKworICAgICAgICByZXR1cm4gdGFza1R5cGVSZXNvdXJjZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9jb21tYW5kLWV4ZWN1dGluZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9qb2IvY29uZmlnL1Jlc3RDb25maWcuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2NvbW1hbmQtZXhlY3V0aW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2pvYi9jb25maWcvUmVzdENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYmY3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9jb21tYW5kLWV4ZWN1dGluZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9qb2IvY29uZmlnL1Jlc3RDb25maWcuamF2YQpAQCAtMCwwICsxLDEwIEBACitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suam9iLmNvbmZpZzsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitwdWJsaWMgY2xhc3MgUmVzdENvbmZpZyB7Cit9CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9jb21tYW5kLWV4ZWN1dGluZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9qb2Ivc2VydmljZS9UYXNrRXhlY3V0aW9uU2VydmljZS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvY29tbWFuZC1leGVjdXRpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svam9iL3NlcnZpY2UvVGFza0V4ZWN1dGlvblNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2MxNDdlCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvY29tbWFuZC1leGVjdXRpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svam9iL3NlcnZpY2UvVGFza0V4ZWN1dGlvblNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoqCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmpvYi5zZXJ2aWNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy5jb21wdXRlLkNvbXB1dGVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLnRhc2suVGFza1Jlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay5UYXNrU3RhdHVzUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLnR5cGUuVGFza1R5cGVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5jb21wdXRlLmFwaS5FeGVjdXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5hcGkuQWJzdHJhY3RUYXNrRXhlY3V0aW9uU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmFwaS5UYXNrQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmFwaS5tZXNzYWdpbmcuS2Fma2FTZW5kZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5qb2IuQ29tbWFuZFRhc2tJbmZvOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNsaWVudC5SZXN0VGVtcGxhdGU7CisKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIFRhc2tFeGVjdXRpb25TZXJ2aWNlIGV4dGVuZHMgQWJzdHJhY3RUYXNrRXhlY3V0aW9uU2VydmljZSB7CisKKyAgICBwdWJsaWMgVGFza0V4ZWN1dGlvblNlcnZpY2UoUmVzdFRlbXBsYXRlIHJlc3RUZW1wbGF0ZSwgS2Fma2FTZW5kZXIga2Fma2FTZW5kZXIpIHsKKyAgICAgICAgc3VwZXIocmVzdFRlbXBsYXRlLCBudWxsLCAxMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRhc2tUeXBlUmVzb3VyY2UgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIENvbW1hbmRUYXNrSW5mby5nZXRUYXNrVHlwZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVQYXJhbWV0ZXJzKFRhc2tSZXNvdXJjZSB0YXNrUmVzb3VyY2UsIFRhc2tDb250ZXh0IHRhc2tDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICB0YXNrQ29udGV4dC5nZXRMb2NhbENvbnRleHQoKS5wdXQoQ29tbWFuZFRhc2tJbmZvLkNPTU1BTkQsIGZpbmRJbnB1dCh0YXNrUmVzb3VyY2UsIENvbW1hbmRUYXNrSW5mby5DT01NQU5ELCBmYWxzZSkpOworICAgICAgICB0YXNrQ29udGV4dC5nZXRMb2NhbENvbnRleHQoKS5wdXQoQ29tbWFuZFRhc2tJbmZvLkFSR1VNRU5UUywgZmluZElucHV0KHRhc2tSZXNvdXJjZSwgQ29tbWFuZFRhc2tJbmZvLkFSR1VNRU5UUywgdHJ1ZSkpOworICAgICAgICB0YXNrQ29udGV4dC5nZXRMb2NhbENvbnRleHQoKS5wdXQoQ29tbWFuZFRhc2tJbmZvLlNURF9PVVRfUEFUSCwgZmluZElucHV0KHRhc2tSZXNvdXJjZSwgQ29tbWFuZFRhc2tJbmZvLlNURF9PVVRfUEFUSCwgZmFsc2UpKTsKKyAgICAgICAgdGFza0NvbnRleHQuZ2V0TG9jYWxDb250ZXh0KCkucHV0KENvbW1hbmRUYXNrSW5mby5TVERfRVJSX1BBVEgsIGZpbmRJbnB1dCh0YXNrUmVzb3VyY2UsIENvbW1hbmRUYXNrSW5mby5TVERfRVJSX1BBVEgsIGZhbHNlKSk7CisKKyAgICAgICAgU3RyaW5nIGNvbXB1dGVJZCA9IGZpbmRJbnB1dCh0YXNrUmVzb3VyY2UsIENvbW1hbmRUYXNrSW5mby5DT01QVVRFX1JFU09VUkNFLCBmYWxzZSk7CisgICAgICAgIHRhc2tDb250ZXh0LmdldExvY2FsQ29udGV4dCgpLnB1dChDb21tYW5kVGFza0luZm8uQ09NUFVURV9SRVNPVVJDRSwgdGhpcy5nZXRSZXN0VGVtcGxhdGUoKS5nZXRGb3JPYmplY3QoImh0dHA6Ly8iICsgdGhpcy5nZXRBcGlTZXJ2ZXJVcmwoKQorICAgICAgICAgICAgICAgICsgIi9jb21wdXRlLyIgKyBMb25nLnBhcnNlTG9uZyhjb21wdXRlSWQpLCBDb21wdXRlUmVzb3VyY2UuY2xhc3MpKTsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVUYXNrKFRhc2tSZXNvdXJjZSB0YXNrUmVzb3VyY2UsIFRhc2tDb250ZXh0IHRhc2tDb250ZXh0KSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBjb21tYW5kID0gKFN0cmluZykgdGFza0NvbnRleHQuZ2V0TG9jYWxDb250ZXh0KCkuZ2V0KENvbW1hbmRUYXNrSW5mby5DT01NQU5EKTsKKyAgICAgICAgICAgIFN0cmluZyBhcmd1bWVudHMgPSAoU3RyaW5nKSB0YXNrQ29udGV4dC5nZXRMb2NhbENvbnRleHQoKS5nZXQoQ29tbWFuZFRhc2tJbmZvLkFSR1VNRU5UUyk7CisgICAgICAgICAgICBDb21wdXRlUmVzb3VyY2UgY29tcHV0ZVJlc291cmNlID0gKENvbXB1dGVSZXNvdXJjZSkgdGFza0NvbnRleHQuZ2V0TG9jYWxDb250ZXh0KCkuZ2V0KENvbW1hbmRUYXNrSW5mby5DT01QVVRFX1JFU09VUkNFKTsKKyAgICAgICAgICAgIFN0cmluZyBzdGRPdXRQYXRoID0gKFN0cmluZykgdGFza0NvbnRleHQuZ2V0TG9jYWxDb250ZXh0KCkuZ2V0KENvbW1hbmRUYXNrSW5mby5TVERfT1VUX1BBVEgpOworICAgICAgICAgICAgU3RyaW5nIHN0ZEVyclBhdGggPSAoU3RyaW5nKSB0YXNrQ29udGV4dC5nZXRMb2NhbENvbnRleHQoKS5nZXQoQ29tbWFuZFRhc2tJbmZvLlNURF9FUlJfUEFUSCk7CisgICAgICAgICAgICBTdHJpbmcgc3RkT3V0U3VmZml4ID0gIiA+ICIgKyBzdGRPdXRQYXRoICsgIiAyPiAiICsgc3RkRXJyUGF0aDsKKworICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkVYRUNVVElORyk7CisKKyAgICAgICAgICAgIFN0cmluZyBmaW5hbENvbW1hbmQgPSBjb21tYW5kICsgKGFyZ3VtZW50cyAhPSBudWxsID8gYXJndW1lbnRzIDogIiIpICsgc3RkT3V0U3VmZml4OworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4ZWN1dGluZyBjb21tYW5kICIgKyBmaW5hbENvbW1hbmQpOworCisgICAgICAgICAgICBFeGVjdXRpb25SZXN1bHQgZXhlY3V0aW9uUmVzdWx0ID0gZmV0Y2hDb21wdXRlUmVzb3VyY2VPcGVyYXRpb24oY29tcHV0ZVJlc291cmNlKS5leGVjdXRlQ29tbWFuZChmaW5hbENvbW1hbmQpOworCisgICAgICAgICAgICBpZiAoZXhlY3V0aW9uUmVzdWx0LmdldEV4aXRTdGF0dXMoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkNPTVBMRVRFRCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV4ZWN1dGlvblJlc3VsdC5nZXRFeGl0U3RhdHVzKCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBwdWJsaXNoVGFza1N0YXR1cyh0YXNrUmVzb3VyY2UuZ2V0UGFyZW50UHJvY2Vzc0lkKCksIHRhc2tSZXNvdXJjZS5nZXRJZCgpLCBUYXNrU3RhdHVzUmVzb3VyY2UuU3RhdGUuRkFJTEVELCAiUHJvY2VzcyBkaWRuJ3QgZXhpdCBzdWNjZXNzZnVsbHkiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkZBSUxFRCwgIlByb2Nlc3MgZXhpdGVkIHdpdGggZXJyb3Igc3RhdHVzICIgKyBleGVjdXRpb25SZXN1bHQuZ2V0RXhpdFN0YXR1cygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkZBSUxFRCwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3Mvam9iLXN1Ym1pc3Npb24tdGFzay9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ucHJvcGVydGllcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2NvbW1hbmQtZXhlY3V0aW5nLXRhc2svc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnByb3BlcnRpZXMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2pvYi1zdWJtaXNzaW9uLXRhc2svc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnByb3BlcnRpZXMKcmVuYW1lIHRvIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2NvbW1hbmQtZXhlY3V0aW5nLXRhc2svc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2VncmVzcy1zdGFnaW5nLXRhc2svc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnltbCBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2NvbW1hbmQtZXhlY3V0aW5nLXRhc2svc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnltbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZWdyZXNzLXN0YWdpbmctdGFzay9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ueW1sCnJlbmFtZSB0byBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9jb21tYW5kLWV4ZWN1dGluZy10YXNrL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi55bWwKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2VncmVzcy1zdGFnaW5nLXRhc2svcG9tLnhtbCBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2RhdGEtY29sbGVjdGluZy10YXNrL3BvbS54bWwKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZWdyZXNzLXN0YWdpbmctdGFzay9wb20ueG1sCnJlbmFtZSB0byBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9kYXRhLWNvbGxlY3RpbmctdGFzay9wb20ueG1sCmluZGV4IDA1ODUyZmUuLmZlNTBmZTggMTAwNjQ0Ci0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2VncmVzcy1zdGFnaW5nLXRhc2svcG9tLnhtbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9kYXRhLWNvbGxlY3RpbmctdGFzay9wb20ueG1sCkBAIC0zMSw3ICszMSw3IEBACiAgICAgPC9wYXJlbnQ+CiAgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgogCi0gICAgPGFydGlmYWN0SWQ+ZWdyZXNzLXN0YWdpbmctdGFzazwvYXJ0aWZhY3RJZD4KKyAgICA8YXJ0aWZhY3RJZD5kYXRhLWNvbGxlY3RpbmctdGFzazwvYXJ0aWZhY3RJZD4KIAogICAgIDxkZXBlbmRlbmNpZXM+CiAgICAgICAgIDxkZXBlbmRlbmN5PgpAQCAtNDQsNiArNDQsMTEgQEAKICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFwaS1yZXNvdXJjZTwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYWlyYXZhdGE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50YXNrLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yay5ib290PC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZWdyZXNzLXN0YWdpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGVyL2FpcmF2YXRhL2s4cy90YXNrL2VncmVzcy9BcHBsaWNhdGlvbi5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZGF0YS1jb2xsZWN0aW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlci9haXJhdmF0YS9rOHMvdGFzay9lZ3Jlc3MvQXBwbGljYXRpb24uamF2YQpzaW1pbGFyaXR5IGluZGV4IDgzJQpyZW5hbWUgZnJvbSBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZXIvYWlyYXZhdGEvazhzL3Rhc2svZWdyZXNzL0FwcGxpY2F0aW9uLmphdmEKcmVuYW1lIHRvIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2RhdGEtY29sbGVjdGluZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZXIvYWlyYXZhdGEvazhzL3Rhc2svZWdyZXNzL0FwcGxpY2F0aW9uLmphdmEKaW5kZXggZTJkYmFlNC4uMTY0MmQxOCAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZWdyZXNzLXN0YWdpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGVyL2FpcmF2YXRhL2s4cy90YXNrL2VncmVzcy9BcHBsaWNhdGlvbi5qYXZhCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2RhdGEtY29sbGVjdGluZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZXIvYWlyYXZhdGEvazhzL3Rhc2svZWdyZXNzL0FwcGxpY2F0aW9uLmphdmEKQEAgLTE5LDEyICsxOSwxNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGVyLmFpcmF2YXRhLms4cy50YXNrLmVncmVzczsKIAoraW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suYXBpLm1lc3NhZ2luZy5SZWNlaXZlckNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmFwaS5tZXNzYWdpbmcuU2VuZGVyQ29uZmlnOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdC5TcHJpbmdBcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3QuYXV0b2NvbmZpZ3VyZS5FbmFibGVBdXRvQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3QuYXV0b2NvbmZpZ3VyZS5TcHJpbmdCb290QXBwbGljYXRpb247CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5ib290LndlYi5jbGllbnQuUmVzdFRlbXBsYXRlQnVpbGRlcjsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5CZWFuOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkNvbXBvbmVudFNjYW47CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5JbXBvcnQ7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY2xpZW50LlJlc3RUZW1wbGF0ZTsKIAogLyoqCkBAIC0zNiw2ICs0MCw4IEBACiBAU3ByaW5nQm9vdEFwcGxpY2F0aW9uCiBAQ29uZmlndXJhdGlvbgogQENvbXBvbmVudFNjYW4KK0BFbmFibGVBdXRvQ29uZmlndXJhdGlvbgorQEltcG9ydCh7UmVjZWl2ZXJDb25maWcuY2xhc3MsIFNlbmRlckNvbmZpZy5jbGFzc30pCiBwdWJsaWMgY2xhc3MgQXBwbGljYXRpb24gewogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZGF0YS1jb2xsZWN0aW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlci9haXJhdmF0YS9rOHMvdGFzay9lZ3Jlc3MvRGF0YUNvbGxlY3RpbmdUYXNrSW5mby5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZGF0YS1jb2xsZWN0aW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlci9haXJhdmF0YS9rOHMvdGFzay9lZ3Jlc3MvRGF0YUNvbGxlY3RpbmdUYXNrSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYTM1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9kYXRhLWNvbGxlY3RpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGVyL2FpcmF2YXRhL2s4cy90YXNrL2VncmVzcy9EYXRhQ29sbGVjdGluZ1Rhc2tJbmZvLmphdmEKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSBvcmcuYXBhY2hlci5haXJhdmF0YS5rOHMudGFzay5lZ3Jlc3M7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLnRhc2sudHlwZS5UYXNrSW5wdXRUeXBlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLnR5cGUuVGFza091dFBvcnRUeXBlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLnR5cGUuVGFza1R5cGVSZXNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCisgKgorICogQGF1dGhvciBkaW11dGh1CisgKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKKyAqLworcHVibGljIGNsYXNzIERhdGFDb2xsZWN0aW5nVGFza0luZm8geworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9URV9TT1VSQ0VfUEFUSCA9ICJyZW1vdGVfc291cmNlX3BhdGgiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBVVEVfUkVTT1VSQ0UgPSAiY29tcHV0ZV9yZXNvdXJjZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJRklFUiA9ICJpZGVudGlmaWVyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgVGFza1R5cGVSZXNvdXJjZSBnZXRUYXNrVHlwZSgpIHsKKyAgICAgICAgVGFza1R5cGVSZXNvdXJjZSB0YXNrVHlwZVJlc291cmNlID0gbmV3IFRhc2tUeXBlUmVzb3VyY2UoKTsKKyAgICAgICAgdGFza1R5cGVSZXNvdXJjZS5zZXROYW1lKCJEYXRhIENvbGxlY3QiKTsKKyAgICAgICAgdGFza1R5cGVSZXNvdXJjZS5zZXRUb3BpY05hbWUoImFpcmF2YXRhLWRhdGEtY29sbGVjdCIpOworICAgICAgICB0YXNrVHlwZVJlc291cmNlLnNldEljb24oImFzc2V0cy9pY29ucy9jb3B5LnBuZyIpOworICAgICAgICB0YXNrVHlwZVJlc291cmNlLmdldElucHV0VHlwZXMoKS5hZGRBbGwoCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXNrSW5wdXRUeXBlUmVzb3VyY2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZShSRU1PVEVfU09VUkNFX1BBVEgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUeXBlKCJTdHJpbmciKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RGVmYXVsdFZhbHVlKCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXNrSW5wdXRUeXBlUmVzb3VyY2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZShJREVOVElGSUVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VHlwZSgiU3RyaW5nIiksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGFza0lucHV0VHlwZVJlc291cmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE5hbWUoQ09NUFVURV9SRVNPVVJDRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFR5cGUoIkxvbmciKSkpOworCisgICAgICAgIHRhc2tUeXBlUmVzb3VyY2UuZ2V0T3V0UG9ydHMoKS5hZGRBbGwoCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXNrT3V0UG9ydFR5cGVSZXNvdXJjZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXROYW1lKCJPdXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0T3JkZXIoMCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGFza091dFBvcnRUeXBlUmVzb3VyY2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZSgiRXJyb3IiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0T3JkZXIoMSkpCisgICAgICAgICk7CisKKyAgICAgICAgcmV0dXJuIHRhc2tUeXBlUmVzb3VyY2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZGF0YS1jb2xsZWN0aW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlci9haXJhdmF0YS9rOHMvdGFzay9lZ3Jlc3Mvc2VydmljZS9UYXNrRXhlY3V0aW9uU2VydmljZS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZGF0YS1jb2xsZWN0aW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlci9haXJhdmF0YS9rOHMvdGFzay9lZ3Jlc3Mvc2VydmljZS9UYXNrRXhlY3V0aW9uU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODM3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9kYXRhLWNvbGxlY3RpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGVyL2FpcmF2YXRhL2s4cy90YXNrL2VncmVzcy9zZXJ2aWNlL1Rhc2tFeGVjdXRpb25TZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qKgorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZXIuYWlyYXZhdGEuazhzLnRhc2suZWdyZXNzLnNlcnZpY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLmNvbXB1dGUuQ29tcHV0ZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay5UYXNrUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLlRhc2tTdGF0dXNSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLnRhc2sudHlwZS5UYXNrVHlwZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suYXBpLkFic3RyYWN0VGFza0V4ZWN1dGlvblNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5hcGkuVGFza0NvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5hcGkubWVzc2FnaW5nLkthZmthU2VuZGVyOworaW1wb3J0IG9yZy5hcGFjaGVyLmFpcmF2YXRhLms4cy50YXNrLmVncmVzcy5EYXRhQ29sbGVjdGluZ1Rhc2tJbmZvOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29yZS5pby5GaWxlU3lzdGVtUmVzb3VyY2U7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5odHRwLio7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay51dGlsLkxpbmtlZE11bHRpVmFsdWVNYXA7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY2xpZW50LlJlc3RUZW1wbGF0ZTsKKworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK0BTZXJ2aWNlCitwdWJsaWMgY2xhc3MgVGFza0V4ZWN1dGlvblNlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdFRhc2tFeGVjdXRpb25TZXJ2aWNlIHsKKworICAgIHB1YmxpYyBUYXNrRXhlY3V0aW9uU2VydmljZShSZXN0VGVtcGxhdGUgcmVzdFRlbXBsYXRlLCBLYWZrYVNlbmRlciBrYWZrYVNlbmRlcikgeworICAgICAgICBzdXBlcihyZXN0VGVtcGxhdGUsIGthZmthU2VuZGVyLCAxMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRhc2tUeXBlUmVzb3VyY2UgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIERhdGFDb2xsZWN0aW5nVGFza0luZm8uZ2V0VGFza1R5cGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFyYW1ldGVycyhUYXNrUmVzb3VyY2UgdGFza1Jlc291cmNlLCBUYXNrQ29udGV4dCB0YXNrQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgdGFza0NvbnRleHQuZ2V0TG9jYWxDb250ZXh0KCkucHV0KERhdGFDb2xsZWN0aW5nVGFza0luZm8uUkVNT1RFX1NPVVJDRV9QQVRILCBmaW5kSW5wdXQodGFza1Jlc291cmNlLCBEYXRhQ29sbGVjdGluZ1Rhc2tJbmZvLlJFTU9URV9TT1VSQ0VfUEFUSCwgZmFsc2UpKTsKKyAgICAgICAgdGFza0NvbnRleHQuZ2V0TG9jYWxDb250ZXh0KCkucHV0KERhdGFDb2xsZWN0aW5nVGFza0luZm8uSURFTlRJRklFUiwgZmluZElucHV0KHRhc2tSZXNvdXJjZSwgRGF0YUNvbGxlY3RpbmdUYXNrSW5mby5JREVOVElGSUVSLCBmYWxzZSkpOworCisgICAgICAgIFN0cmluZyBjb21wdXRlSWQgPSBmaW5kSW5wdXQodGFza1Jlc291cmNlLCBEYXRhQ29sbGVjdGluZ1Rhc2tJbmZvLkNPTVBVVEVfUkVTT1VSQ0UsIGZhbHNlKTsKKyAgICAgICAgdGFza0NvbnRleHQuZ2V0TG9jYWxDb250ZXh0KCkucHV0KERhdGFDb2xsZWN0aW5nVGFza0luZm8uQ09NUFVURV9SRVNPVVJDRSwgdGhpcy5nZXRSZXN0VGVtcGxhdGUoKS5nZXRGb3JPYmplY3QoImh0dHA6Ly8iICsgdGhpcy5nZXRBcGlTZXJ2ZXJVcmwoKQorICAgICAgICAgICAgICAgICsgIi9jb21wdXRlLyIgKyBMb25nLnBhcnNlTG9uZyhjb21wdXRlSWQpLCBDb21wdXRlUmVzb3VyY2UuY2xhc3MpKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVUYXNrKFRhc2tSZXNvdXJjZSB0YXNrUmVzb3VyY2UsIFRhc2tDb250ZXh0IHRhc2tDb250ZXh0KSB7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgQ29tcHV0ZVJlc291cmNlIGNvbXB1dGVSZXNvdXJjZSA9IChDb21wdXRlUmVzb3VyY2UpIHRhc2tDb250ZXh0LmdldExvY2FsQ29udGV4dCgpLmdldChEYXRhQ29sbGVjdGluZ1Rhc2tJbmZvLkNPTVBVVEVfUkVTT1VSQ0UpOworICAgICAgICAgICAgU3RyaW5nIGlkZW50aWZpZXIgPSAoU3RyaW5nKSB0YXNrQ29udGV4dC5nZXRMb2NhbENvbnRleHQoKS5nZXQoRGF0YUNvbGxlY3RpbmdUYXNrSW5mby5JREVOVElGSUVSKTsKKyAgICAgICAgICAgIFN0cmluZyByZW1vdGVTb3VyY2VQYXRoID0gKFN0cmluZykgdGFza0NvbnRleHQuZ2V0TG9jYWxDb250ZXh0KCkuZ2V0KERhdGFDb2xsZWN0aW5nVGFza0luZm8uUkVNT1RFX1NPVVJDRV9QQVRIKTsKKworICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkVYRUNVVElORyk7CisKKyAgICAgICAgICAgIFN0cmluZyB0ZW1wb3JhcnlGaWxlID0gIi90bXAvIiArIFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvd25sb2FkaW5nICIgKyByZW1vdGVTb3VyY2VQYXRoICsgIiB0byAiICsgdGVtcG9yYXJ5RmlsZSArICIgZnJvbSBjb21wdXRlIHJlc291cmNlICIKKyAgICAgICAgICAgICAgICAgICAgKyBjb21wdXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgZmV0Y2hDb21wdXRlUmVzb3VyY2VPcGVyYXRpb24oY29tcHV0ZVJlc291cmNlKS50cmFuc2ZlckRhdGFPdXQocmVtb3RlU291cmNlUGF0aCwgdGVtcG9yYXJ5RmlsZSwgIlNDUCIpOworCisgICAgICAgICAgICBMaW5rZWRNdWx0aVZhbHVlTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgTGlua2VkTXVsdGlWYWx1ZU1hcDw+KCk7CisgICAgICAgICAgICBtYXAuYWRkKCJmaWxlIiwgbmV3IEZpbGVTeXN0ZW1SZXNvdXJjZSh0ZW1wb3JhcnlGaWxlKSk7CisgICAgICAgICAgICBIdHRwSGVhZGVycyBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7CisgICAgICAgICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKE1lZGlhVHlwZS5NVUxUSVBBUlRfRk9STV9EQVRBKTsKKworICAgICAgICAgICAgSHR0cEVudGl0eTxMaW5rZWRNdWx0aVZhbHVlTWFwPFN0cmluZywgT2JqZWN0Pj4gcmVxdWVzdEVudGl0eSA9IG5ldyBIdHRwRW50aXR5PD4obWFwLCBoZWFkZXJzKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVcGxvYWRpbmcgZGF0YSBmaWxlIHdpdGggdGFzayBpZCAiICsgdGFza1Jlc291cmNlLmdldElkKCkgKyAiIGFuZCBpZGVudGlmaWVyICIKKyAgICAgICAgICAgICAgICAgICAgKyBpZGVudGlmaWVyICsgIiB0byBkYXRhIHN0b3JlIik7CisKKyAgICAgICAgICAgIGdldFJlc3RUZW1wbGF0ZSgpLmV4Y2hhbmdlKCJodHRwOi8vIiArIGdldEFwaVNlcnZlclVybCgpICsgIi9kYXRhLyIgKyB0YXNrUmVzb3VyY2UuZ2V0SWQoKSsgIi8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpZGVudGlmaWVyICsgIi91cGxvYWQiLCBIdHRwTWV0aG9kLlBPU1QsIHJlcXVlc3RFbnRpdHksIExvbmcuY2xhc3MpOworCisgICAgICAgICAgICBwdWJsaXNoVGFza1N0YXR1cyh0YXNrUmVzb3VyY2UuZ2V0UGFyZW50UHJvY2Vzc0lkKCksIHRhc2tSZXNvdXJjZS5nZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICBUYXNrU3RhdHVzUmVzb3VyY2UuU3RhdGUuQ09NUExFVEVEKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHRhc2tSZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSwgdGFza1Jlc291cmNlLmdldElkKCksIFRhc2tTdGF0dXNSZXNvdXJjZS5TdGF0ZS5GQUlMRUQsIGUuZ2V0TWVzc2FnZSgpKTsKKworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi5wcm9wZXJ0aWVzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZGF0YS1jb2xsZWN0aW5nLXRhc2svc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnByb3BlcnRpZXMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2VncmVzcy1zdGFnaW5nLXRhc2svc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnByb3BlcnRpZXMKcmVuYW1lIHRvIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2RhdGEtY29sbGVjdGluZy10YXNrL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi55bWwgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9kYXRhLWNvbGxlY3RpbmctdGFzay9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ueW1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZWdyZXNzLXN0YWdpbmctdGFzay9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ueW1sCmNvcHkgdG8gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZGF0YS1jb2xsZWN0aW5nLXRhc2svc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnltbApkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvaW5ncmVzcy1zdGFnaW5nLXRhc2svcG9tLnhtbCBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2RhdGEtcHVzaGluZy10YXNrL3BvbS54bWwKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvaW5ncmVzcy1zdGFnaW5nLXRhc2svcG9tLnhtbApyZW5hbWUgdG8gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZGF0YS1wdXNoaW5nLXRhc2svcG9tLnhtbAppbmRleCBjMWFlNzYwLi41MzM5MTRmIDEwMDY0NAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9pbmdyZXNzLXN0YWdpbmctdGFzay9wb20ueG1sCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2RhdGEtcHVzaGluZy10YXNrL3BvbS54bWwKQEAgLTMxLDcgKzMxLDcgQEAKICAgICA8L3BhcmVudD4KICAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CiAKLSAgICA8YXJ0aWZhY3RJZD5pbmdyZXNzLXN0YWdpbmctdGFzazwvYXJ0aWZhY3RJZD4KKyAgICA8YXJ0aWZhY3RJZD5kYXRhLXB1c2hpbmctdGFzazwvYXJ0aWZhY3RJZD4KIAogICAgIDxkZXBlbmRlbmNpZXM+CiAgICAgICAgIDxkZXBlbmRlbmN5PgpAQCAtNDQsNiArNDQsMTEgQEAKICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFwaS1yZXNvdXJjZTwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYWlyYXZhdGE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50YXNrLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yay5ib290PC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvaW5ncmVzcy1zdGFnaW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2luZ3Jlc3MvQXBwbGljYXRpb24uamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2RhdGEtcHVzaGluZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9pbmdyZXNzL0FwcGxpY2F0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2luZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9pbmdyZXNzL0FwcGxpY2F0aW9uLmphdmEKcmVuYW1lIHRvIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2RhdGEtcHVzaGluZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9pbmdyZXNzL0FwcGxpY2F0aW9uLmphdmEKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2RhdGEtcHVzaGluZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9pbmdyZXNzL3NlcnZpY2UvVGFza0V4ZWN1dGlvblNlcnZpY2UuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2RhdGEtcHVzaGluZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9pbmdyZXNzL3NlcnZpY2UvVGFza0V4ZWN1dGlvblNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNmYWRhCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZGF0YS1wdXNoaW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2luZ3Jlc3Mvc2VydmljZS9UYXNrRXhlY3V0aW9uU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qKgorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5pbmdyZXNzLnNlcnZpY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLmNvbXB1dGUuQ29tcHV0ZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay5UYXNrUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLlRhc2tTdGF0dXNSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLnRhc2sudHlwZS5UYXNrVHlwZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suYXBpLkFic3RyYWN0VGFza0V4ZWN1dGlvblNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5hcGkuVGFza0NvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5hcGkubWVzc2FnaW5nLkthZmthU2VuZGVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNsaWVudC5SZXN0VGVtcGxhdGU7CisKKy8qKgorICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCisgKgorICogQGF1dGhvciBkaW11dGh1CisgKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKKyAqLworQFNlcnZpY2UKK3B1YmxpYyBjbGFzcyBUYXNrRXhlY3V0aW9uU2VydmljZSBleHRlbmRzIEFic3RyYWN0VGFza0V4ZWN1dGlvblNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ09NUFVURV9SRVNPVVJDRSA9ICAiY29tcHV0ZV9yZXNvdXJjZSI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUkVNT1RFX1RBUkdFVF9QQVRIID0gInJlbW90ZV90YXJnZXRfcGF0aCI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgREFUQV9MT0NBVElPTl9JRCA9ICJkYXRhX2xvY2F0aW9uX2lkIjsKKworICAgIHB1YmxpYyBUYXNrRXhlY3V0aW9uU2VydmljZShSZXN0VGVtcGxhdGUgcmVzdFRlbXBsYXRlLCBLYWZrYVNlbmRlciBrYWZrYVNlbmRlcikgeworICAgICAgICBzdXBlcihyZXN0VGVtcGxhdGUsIGthZmthU2VuZGVyLCAxMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRhc2tUeXBlUmVzb3VyY2UgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhcmFtZXRlcnMoVGFza1Jlc291cmNlIHRhc2tSZXNvdXJjZSwgVGFza0NvbnRleHQgdGFza0NvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHRhc2tDb250ZXh0LmdldExvY2FsQ29udGV4dCgpLnB1dChEQVRBX0xPQ0FUSU9OX0lELCBmaW5kSW5wdXQodGFza1Jlc291cmNlLCBEQVRBX0xPQ0FUSU9OX0lELCBmYWxzZSkpOworICAgICAgICB0YXNrQ29udGV4dC5nZXRMb2NhbENvbnRleHQoKS5wdXQoUkVNT1RFX1RBUkdFVF9QQVRILCBmaW5kSW5wdXQodGFza1Jlc291cmNlLCBSRU1PVEVfVEFSR0VUX1BBVEgsIGZhbHNlKSk7CisKKyAgICAgICAgU3RyaW5nIGNvbXB1dGVJZCA9IGZpbmRJbnB1dCh0YXNrUmVzb3VyY2UsIENPTVBVVEVfUkVTT1VSQ0UsIGZhbHNlKTsKKyAgICAgICAgdGFza0NvbnRleHQuZ2V0TG9jYWxDb250ZXh0KCkucHV0KENPTVBVVEVfUkVTT1VSQ0UsIHRoaXMuZ2V0UmVzdFRlbXBsYXRlKCkuZ2V0Rm9yT2JqZWN0KCJodHRwOi8vIiArIHRoaXMuZ2V0QXBpU2VydmVyVXJsKCkKKyAgICAgICAgICAgICAgICArICIvY29tcHV0ZS8iICsgTG9uZy5wYXJzZUxvbmcoY29tcHV0ZUlkKSwgQ29tcHV0ZVJlc291cmNlLmNsYXNzKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZVRhc2soVGFza1Jlc291cmNlIHRhc2tSZXNvdXJjZSwgVGFza0NvbnRleHQgdGFza0NvbnRleHQpIHsKKworICAgICAgICBTdHJpbmcgcmVtb3RlVGFyZ2V0UGF0aCA9IChTdHJpbmcpIHRhc2tDb250ZXh0LmdldExvY2FsQ29udGV4dCgpLmdldChSRU1PVEVfVEFSR0VUX1BBVEgpOworICAgICAgICBTdHJpbmcgZGF0YUxvY2F0aW9uSWQgPSAoU3RyaW5nKSB0YXNrQ29udGV4dC5nZXRMb2NhbENvbnRleHQoKS5nZXQoREFUQV9MT0NBVElPTl9JRCk7CisgICAgICAgIENvbXB1dGVSZXNvdXJjZSBjb21wdXRlUmVzb3VyY2UgPSAoQ29tcHV0ZVJlc291cmNlKSB0YXNrQ29udGV4dC5nZXRMb2NhbENvbnRleHQoKS5nZXQoQ09NUFVURV9SRVNPVVJDRSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHRhc2tSZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSwgdGFza1Jlc291cmNlLmdldElkKCksIFRhc2tTdGF0dXNSZXNvdXJjZS5TdGF0ZS5FWEVDVVRJTkcpOworICAgICAgICAgICAgZmV0Y2hDb21wdXRlUmVzb3VyY2VPcGVyYXRpb24oY29tcHV0ZVJlc291cmNlKS50cmFuc2ZlckRhdGFJbihkYXRhTG9jYXRpb25JZCwgcmVtb3RlVGFyZ2V0UGF0aCwgIlNDUCIpOworICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkNPTVBMRVRFRCk7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHRhc2tSZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSwgdGFza1Jlc291cmNlLmdldElkKCksIFRhc2tTdGF0dXNSZXNvdXJjZS5TdGF0ZS5GQUlMRUQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvaW5ncmVzcy1zdGFnaW5nLXRhc2svc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnByb3BlcnRpZXMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9kYXRhLXB1c2hpbmctdGFzay9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ucHJvcGVydGllcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvaW5ncmVzcy1zdGFnaW5nLXRhc2svc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnByb3BlcnRpZXMKcmVuYW1lIHRvIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2RhdGEtcHVzaGluZy10YXNrL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi55bWwgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9kYXRhLXB1c2hpbmctdGFzay9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ueW1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZWdyZXNzLXN0YWdpbmctdGFzay9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ueW1sCmNvcHkgdG8gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZGF0YS1wdXNoaW5nLXRhc2svc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnltbApkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZWdyZXNzLXN0YWdpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGVyL2FpcmF2YXRhL2s4cy90YXNrL2VncmVzcy9tZXNzYWdpbmcvS2Fma2FSZWNlaXZlci5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZWdyZXNzLXN0YWdpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGVyL2FpcmF2YXRhL2s4cy90YXNrL2VncmVzcy9tZXNzYWdpbmcvS2Fma2FSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGUwYWFmLi4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2VncmVzcy1zdGFnaW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlci9haXJhdmF0YS9rOHMvdGFzay9lZ3Jlc3MvbWVzc2FnaW5nL0thZmthUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZXIuYWlyYXZhdGEuazhzLnRhc2suZWdyZXNzLm1lc3NhZ2luZzsKLQotaW1wb3J0IG9yZy5hcGFjaGVyLmFpcmF2YXRhLms4cy50YXNrLmVncmVzcy5zZXJ2aWNlLlRhc2tFeGVjdXRpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EuYW5ub3RhdGlvbi5LYWZrYUxpc3RlbmVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2Euc3VwcG9ydC5BY2tub3dsZWRnbWVudDsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7Ci0KLS8qKgotICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCi0gKgotICogQGF1dGhvciBkaW11dGh1Ci0gKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKLSAqLwotcHVibGljIGNsYXNzIEthZmthUmVjZWl2ZXIgewotCi0gICAgQFJlc291cmNlCi0gICAgcHJpdmF0ZSBUYXNrRXhlY3V0aW9uU2VydmljZSB0YXNrRXhlY3V0aW9uU2VydmljZTsKLQotICAgIEBLYWZrYUxpc3RlbmVyKHRvcGljcyA9ICIke3Rhc2sucmVhZC50b3BpYy5uYW1lfSIpCi0gICAgcHVibGljIHZvaWQgcmVjZWl2ZVRhc2tzKFN0cmluZyBwYXlsb2FkLCBBY2tub3dsZWRnbWVudCBhY2spIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWNlaXZlZCB0YXNrPSIgKyBwYXlsb2FkKTsKLSAgICAgICAgdGFza0V4ZWN1dGlvblNlcnZpY2UuZXhlY3V0ZVRhc2tBc3luYyhMb25nLnBhcnNlTG9uZyhwYXlsb2FkKSk7Ci0gICAgICAgIGFjay5hY2tub3dsZWRnZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2VncmVzcy1zdGFnaW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlci9haXJhdmF0YS9rOHMvdGFzay9lZ3Jlc3MvbWVzc2FnaW5nL0thZmthU2VuZGVyLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZXIvYWlyYXZhdGEvazhzL3Rhc2svZWdyZXNzL21lc3NhZ2luZy9LYWZrYVNlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTNkYWE0Li4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2VncmVzcy1zdGFnaW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlci9haXJhdmF0YS9rOHMvdGFzay9lZ3Jlc3MvbWVzc2FnaW5nL0thZmthU2VuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGVyLmFpcmF2YXRhLms4cy50YXNrLmVncmVzcy5tZXNzYWdpbmc7Ci0KLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb3JlLkthZmthVGVtcGxhdGU7Ci0KLS8qKgotICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCi0gKgotICogQGF1dGhvciBkaW11dGh1Ci0gKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKLSAqLwotcHVibGljIGNsYXNzIEthZmthU2VuZGVyIHsKLQotICAgIEBBdXRvd2lyZWQKLSAgICBwcml2YXRlIEthZmthVGVtcGxhdGU8U3RyaW5nLCBTdHJpbmc+IGthZmthVGVtcGxhdGU7Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kKFN0cmluZyB0b3BpYywgU3RyaW5nIHBheWxvYWQpIHsKLSAgICAgICAga2Fma2FUZW1wbGF0ZS5zZW5kKHRvcGljLCBwYXlsb2FkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kKFN0cmluZyB0b3BpYywgU3RyaW5nIGtleSwgU3RyaW5nIHBheWxvYWQpIHsKLSAgICAgICAga2Fma2FUZW1wbGF0ZS5zZW5kKHRvcGljLCBrZXksIHBheWxvYWQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2VncmVzcy1zdGFnaW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlci9haXJhdmF0YS9rOHMvdGFzay9lZ3Jlc3MvbWVzc2FnaW5nL1JlY2VpdmVyQ29uZmlnLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZXIvYWlyYXZhdGEvazhzL3Rhc2svZWdyZXNzL21lc3NhZ2luZy9SZWNlaXZlckNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDhiYTkwLi4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2VncmVzcy1zdGFnaW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlci9haXJhdmF0YS9rOHMvdGFzay9lZ3Jlc3MvbWVzc2FnaW5nL1JlY2VpdmVyQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGVyLmFpcmF2YXRhLms4cy50YXNrLmVncmVzcy5tZXNzYWdpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmthZmthLmNsaWVudHMuY29uc3VtZXIuQ29uc3VtZXJDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VyaWFsaXphdGlvbi5TdHJpbmdEZXNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uVmFsdWU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EuYW5ub3RhdGlvbi5FbmFibGVLYWZrYTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthLmNvbmZpZy5Db25jdXJyZW50S2Fma2FMaXN0ZW5lckNvbnRhaW5lckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb25maWcuS2Fma2FMaXN0ZW5lckNvbnRhaW5lckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb3JlLkNvbnN1bWVyRmFjdG9yeTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthLmNvcmUuRGVmYXVsdEthZmthQ29uc3VtZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EubGlzdGVuZXIuQWJzdHJhY3RNZXNzYWdlTGlzdGVuZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5saXN0ZW5lci5Db25jdXJyZW50TWVzc2FnZUxpc3RlbmVyQ29udGFpbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKLSAqCi0gKiBAYXV0aG9yIGRpbXV0aHUKLSAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAotICovCi1AQ29uZmlndXJhdGlvbgotQEVuYWJsZUthZmthCi1wdWJsaWMgY2xhc3MgUmVjZWl2ZXJDb25maWcgewotCi0gICAgQFZhbHVlKCIke2thZmthLmJvb3RzdHJhcC1zZXJ2ZXJzfSIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgYm9vdHN0cmFwU2VydmVyczsKLQotICAgIEBWYWx1ZSgiJHt0YXNrLmdyb3VwLm5hbWV9IikKLSAgICBwcml2YXRlIFN0cmluZyB0YXNrR3JvdXBOYW1lOwotCi0gICAgQEJlYW4KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb25zdW1lckNvbmZpZ3MoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIC8vIGxpc3Qgb2YgaG9zdDpwb3J0IHBhaXJzIHVzZWQgZm9yIGVzdGFibGlzaGluZyB0aGUgaW5pdGlhbCBjb25uZWN0aW9ucyB0byB0aGUgS2FrZmEgY2x1c3RlcgotICAgICAgICBwcm9wcy5wdXQoQ29uc3VtZXJDb25maWcuQk9PVFNUUkFQX1NFUlZFUlNfQ09ORklHLCBib290c3RyYXBTZXJ2ZXJzKTsKLSAgICAgICAgcHJvcHMucHV0KENvbnN1bWVyQ29uZmlnLktFWV9ERVNFUklBTElaRVJfQ0xBU1NfQ09ORklHLCBTdHJpbmdEZXNlcmlhbGl6ZXIuY2xhc3MpOwotICAgICAgICBwcm9wcy5wdXQoQ29uc3VtZXJDb25maWcuVkFMVUVfREVTRVJJQUxJWkVSX0NMQVNTX0NPTkZJRywgU3RyaW5nRGVzZXJpYWxpemVyLmNsYXNzKTsKLSAgICAgICAgLy8gYWxsb3dzIGEgcG9vbCBvZiBwcm9jZXNzZXMgdG8gZGl2aWRlIHRoZSB3b3JrIG9mIGNvbnN1bWluZyBhbmQgcHJvY2Vzc2luZyByZWNvcmRzCi0gICAgICAgIHByb3BzLnB1dChDb25zdW1lckNvbmZpZy5HUk9VUF9JRF9DT05GSUcsIHRhc2tHcm91cE5hbWUpOwotICAgICAgICBwcm9wcy5wdXQoQ29uc3VtZXJDb25maWcuRU5BQkxFX0FVVE9fQ09NTUlUX0NPTkZJRywgZmFsc2UpOwotICAgICAgICByZXR1cm4gcHJvcHM7Ci0gICAgfQotCi0gICAgQEJlYW4KLSAgICBwdWJsaWMgQ29uc3VtZXJGYWN0b3J5PFN0cmluZywgU3RyaW5nPiBjb25zdW1lckZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEthZmthQ29uc3VtZXJGYWN0b3J5PFN0cmluZywgU3RyaW5nPihjb25zdW1lckNvbmZpZ3MoKSk7Ci0gICAgfQotCi0gICAgQEJlYW4KLSAgICBwdWJsaWMgS2Fma2FMaXN0ZW5lckNvbnRhaW5lckZhY3Rvcnk8Q29uY3VycmVudE1lc3NhZ2VMaXN0ZW5lckNvbnRhaW5lcjxTdHJpbmcsIFN0cmluZz4+IGthZmthTGlzdGVuZXJDb250YWluZXJGYWN0b3J5KCkgewotICAgICAgICBDb25jdXJyZW50S2Fma2FMaXN0ZW5lckNvbnRhaW5lckZhY3Rvcnk8U3RyaW5nLCBTdHJpbmc+IGZhY3RvcnkgPQotICAgICAgICAgICAgICAgIG5ldyBDb25jdXJyZW50S2Fma2FMaXN0ZW5lckNvbnRhaW5lckZhY3Rvcnk8PigpOwotICAgICAgICBmYWN0b3J5LnNldENvbnN1bWVyRmFjdG9yeShjb25zdW1lckZhY3RvcnkoKSk7Ci0gICAgICAgIGZhY3RvcnkuZ2V0Q29udGFpbmVyUHJvcGVydGllcygpLnNldEFja01vZGUoQWJzdHJhY3RNZXNzYWdlTGlzdGVuZXJDb250YWluZXIuQWNrTW9kZS5NQU5VQUxfSU1NRURJQVRFKTsKLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgQEJlYW4KLSAgICBwdWJsaWMgS2Fma2FSZWNlaXZlciByZWNlaXZlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBLYWZrYVJlY2VpdmVyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZWdyZXNzLXN0YWdpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGVyL2FpcmF2YXRhL2s4cy90YXNrL2VncmVzcy9tZXNzYWdpbmcvU2VuZGVyQ29uZmlnLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZXIvYWlyYXZhdGEvazhzL3Rhc2svZWdyZXNzL21lc3NhZ2luZy9TZW5kZXJDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI2NzRhMy4uMDAwMDAwMAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZXIvYWlyYXZhdGEvazhzL3Rhc2svZWdyZXNzL21lc3NhZ2luZy9TZW5kZXJDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZXIuYWlyYXZhdGEuazhzLnRhc2suZWdyZXNzLm1lc3NhZ2luZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUua2Fma2EuY2xpZW50cy5wcm9kdWNlci5Qcm9kdWNlckNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLmthZmthLmNvbW1vbi5zZXJpYWxpemF0aW9uLlN0cmluZ1NlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uVmFsdWU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EuY29yZS5EZWZhdWx0S2Fma2FQcm9kdWNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb3JlLkthZmthVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb3JlLlByb2R1Y2VyRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCi0gKgotICogQGF1dGhvciBkaW11dGh1Ci0gKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKLSAqLwotQENvbmZpZ3VyYXRpb24KLXB1YmxpYyBjbGFzcyBTZW5kZXJDb25maWcgewotICAgIEBWYWx1ZSgiJHtrYWZrYS5ib290c3RyYXAtc2VydmVyc30iKQotICAgIHByaXZhdGUgU3RyaW5nIGJvb3RzdHJhcFNlcnZlcnM7Ci0KLSAgICBAQmVhbgotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y2VyQ29uZmlncygpIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgLy8gbGlzdCBvZiBob3N0OnBvcnQgcGFpcnMgdXNlZCBmb3IgZXN0YWJsaXNoaW5nIHRoZSBpbml0aWFsIGNvbm5lY3Rpb25zIHRvIHRoZSBLYWtmYSBjbHVzdGVyCi0gICAgICAgIHByb3BzLnB1dChQcm9kdWNlckNvbmZpZy5CT09UU1RSQVBfU0VSVkVSU19DT05GSUcsIGJvb3RzdHJhcFNlcnZlcnMpOwotICAgICAgICBwcm9wcy5wdXQoUHJvZHVjZXJDb25maWcuS0VZX1NFUklBTElaRVJfQ0xBU1NfQ09ORklHLCBTdHJpbmdTZXJpYWxpemVyLmNsYXNzKTsKLSAgICAgICAgcHJvcHMucHV0KFByb2R1Y2VyQ29uZmlnLlZBTFVFX1NFUklBTElaRVJfQ0xBU1NfQ09ORklHLCBTdHJpbmdTZXJpYWxpemVyLmNsYXNzKTsKLSAgICAgICAgcmV0dXJuIHByb3BzOwotICAgIH0KLQotICAgIEBCZWFuCi0gICAgcHVibGljIFByb2R1Y2VyRmFjdG9yeTxTdHJpbmcsIFN0cmluZz4gcHJvZHVjZXJGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRLYWZrYVByb2R1Y2VyRmFjdG9yeTxTdHJpbmcsIFN0cmluZz4ocHJvZHVjZXJDb25maWdzKCkpOwotICAgIH0KLQotICAgIEBCZWFuCi0gICAgcHVibGljIEthZmthVGVtcGxhdGU8U3RyaW5nLCBTdHJpbmc+IGthZmthVGVtcGxhdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgS2Fma2FUZW1wbGF0ZTw+KHByb2R1Y2VyRmFjdG9yeSgpKTsKLSAgICB9Ci0KLSAgICBAQmVhbgotICAgIHB1YmxpYyBLYWZrYVNlbmRlciBrYWZrYVNlbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBLYWZrYVNlbmRlcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2VncmVzcy1zdGFnaW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlci9haXJhdmF0YS9rOHMvdGFzay9lZ3Jlc3Mvc2VydmljZS9UYXNrRXhlY3V0aW9uU2VydmljZS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZWdyZXNzLXN0YWdpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGVyL2FpcmF2YXRhL2s4cy90YXNrL2VncmVzcy9zZXJ2aWNlL1Rhc2tFeGVjdXRpb25TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZmNhM2IuLjAwMDAwMDAKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZWdyZXNzLXN0YWdpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGVyL2FpcmF2YXRhL2s4cy90YXNrL2VncmVzcy9zZXJ2aWNlL1Rhc2tFeGVjdXRpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlci5haXJhdmF0YS5rOHMudGFzay5lZ3Jlc3Muc2VydmljZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMuY29tcHV0ZS5Db21wdXRlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLlRhc2tQYXJhbVJlc291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay5UYXNrUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLlRhc2tTdGF0dXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5jb21wdXRlLmFwaS5Db21wdXRlT3BlcmF0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5jb21wdXRlLmltcGwuTW9ja0NvbXB1dGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuY29tcHV0ZS5pbXBsLlNTSENvbXB1dGVPcGVyYXRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGVyLmFpcmF2YXRhLms4cy50YXNrLmVncmVzcy5tZXNzYWdpbmcuS2Fma2FTZW5kZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uVmFsdWU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb3JlLmlvLkZpbGVTeXN0ZW1SZXNvdXJjZTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmh0dHAuKjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwuTGlua2VkTXVsdGlWYWx1ZU1hcDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jbGllbnQuUmVzdFRlbXBsYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwotaW1wb3J0IGphdmEudXRpbC5VVUlEOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7Ci0KLS8qKgotICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCi0gKgotICogQGF1dGhvciBkaW11dGh1Ci0gKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKLSAqLwotQFNlcnZpY2UKLXB1YmxpYyBjbGFzcyBUYXNrRXhlY3V0aW9uU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDEwKTsKLQotICAgIHByaXZhdGUgZmluYWwgUmVzdFRlbXBsYXRlIHJlc3RUZW1wbGF0ZTsKLSAgICBwcml2YXRlIGZpbmFsIEthZmthU2VuZGVyIGthZmthU2VuZGVyOwotCi0gICAgQFZhbHVlKCIke2FwaS5zZXJ2ZXIudXJsfSIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgYXBpU2VydmVyVXJsOwotCi0gICAgQFZhbHVlKCIke3Rhc2suZXZlbnQudG9waWMubmFtZX0iKQotICAgIHByaXZhdGUgU3RyaW5nIHRhc2tFdmVudFB1Ymxpc2hUb3BpYzsKLQotICAgIHB1YmxpYyBUYXNrRXhlY3V0aW9uU2VydmljZShSZXN0VGVtcGxhdGUgcmVzdFRlbXBsYXRlLCBLYWZrYVNlbmRlciBrYWZrYVNlbmRlcikgewotICAgICAgICB0aGlzLnJlc3RUZW1wbGF0ZSA9IHJlc3RUZW1wbGF0ZTsKLSAgICAgICAgdGhpcy5rYWZrYVNlbmRlciA9IGthZmthU2VuZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVUYXNrQXN5bmMobG9uZyB0YXNrSWQpIHsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4ZWN1dGluZyB0YXNrICIgKyB0YXNrSWQgKyAiIGFzIGVncmVzcyBzdGFnaW5nIHRhc2siKTsKLSAgICAgICAgVGFza1Jlc291cmNlIHRhc2tSZXNvdXJjZSA9IHRoaXMucmVzdFRlbXBsYXRlLmdldEZvck9iamVjdCgiaHR0cDovLyIgKyBhcGlTZXJ2ZXJVcmwgKyAiL3Rhc2svIiArIHRhc2tJZCwgVGFza1Jlc291cmNlLmNsYXNzKTsKLQotICAgICAgICBwdWJsaXNoVGFza1N0YXR1cyh0YXNrUmVzb3VyY2UuZ2V0UGFyZW50UHJvY2Vzc0lkKCksIHRhc2tSZXNvdXJjZS5nZXRJZCgpLCBUYXNrU3RhdHVzUmVzb3VyY2UuU3RhdGUuU0NIRURVTEVEKTsKLQotICAgICAgICB0aGlzLmV4ZWN1dG9yU2VydmljZS5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGV4ZWN1dGVUYXNrKHRhc2tSZXNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVUYXNrKFRhc2tSZXNvdXJjZSB0YXNrUmVzb3VyY2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvbmFsPFRhc2tQYXJhbVJlc291cmNlPiBzb3VyY2VQYXJhbSA9IHRhc2tSZXNvdXJjZS5nZXRUYXNrUGFyYW1zKCkKLSAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCi0gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodGFza1BhcmFtUmVzb3VyY2UgLT4gInNvdXJjZSIuZXF1YWxzKHRhc2tQYXJhbVJlc291cmNlLmdldEtleSgpKSkKLSAgICAgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpOwotCi0gICAgICAgICAgICBPcHRpb25hbDxUYXNrUGFyYW1SZXNvdXJjZT4gdGFyZ2V0UGFyYW0gPSB0YXNrUmVzb3VyY2UuZ2V0VGFza1BhcmFtcygpCi0gICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHRhc2tQYXJhbVJlc291cmNlIC0+ICJ0YXJnZXQiLmVxdWFscyh0YXNrUGFyYW1SZXNvdXJjZS5nZXRLZXkoKSkpCi0gICAgICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKTsKLQotICAgICAgICAgICAgT3B0aW9uYWw8VGFza1BhcmFtUmVzb3VyY2U+IGNvbXB1dGVJZCA9IHRhc2tSZXNvdXJjZS5nZXRUYXNrUGFyYW1zKCkKLSAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCi0gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodGFza1BhcmFtUmVzb3VyY2UgLT4gImNvbXB1dGUtaWQiLmVxdWFscyh0YXNrUGFyYW1SZXNvdXJjZS5nZXRLZXkoKSkpCi0gICAgICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKTsKLQotICAgICAgICAgICAgT3B0aW9uYWw8VGFza1BhcmFtUmVzb3VyY2U+IGV4cGVyaW1lbnREYXRhRGlyID0gdGFza1Jlc291cmNlLmdldFRhc2tQYXJhbXMoKQotICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih0YXNrUGFyYW1SZXNvdXJjZSAtPiAiZXhwLWRhdGEtZGlyIi5lcXVhbHModGFza1BhcmFtUmVzb3VyY2UuZ2V0S2V5KCkpKQotICAgICAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBwcm9jZXNzRGF0YURpcmVjdG9yeSA9IGV4cGVyaW1lbnREYXRhRGlyCi0gICAgICAgICAgICAgICAgICAgIC5vckVsc2VUaHJvdygoKSAtPiBuZXcgRXhjZXB0aW9uKCJleHAtZGF0YS1kaXIgcGFyYW0gY2FuIG5vdCBiZSBmb3VuZCBpbiB0aGUgcGFyYW1zIG9mIHRhc2sgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1Jlc291cmNlLmdldElkKCkpKS5nZXRWYWx1ZSgpICsgIi8iICsgdGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpOwotCi0KLSAgICAgICAgICAgIGlmIChzb3VyY2VQYXJhbS5pc1ByZXNlbnQoKSkgewotICAgICAgICAgICAgICAgIHNvdXJjZVBhcmFtLmdldCgpLnNldFZhbHVlKHNvdXJjZVBhcmFtLmdldCgpLmdldFZhbHVlKCkucmVwbGFjZSgie3Byb2Nlc3MtZGF0YS1kaXJ9IiwgcHJvY2Vzc0RhdGFEaXJlY3RvcnkpKTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0UGFyYW0uaXNQcmVzZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkVYRUNVVElORyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQ29tcHV0ZVJlc291cmNlIGNvbXB1dGVSZXNvdXJjZSA9IHRoaXMucmVzdFRlbXBsYXRlLmdldEZvck9iamVjdCgiaHR0cDovLyIgKyB0aGlzLmFwaVNlcnZlclVybAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi9jb21wdXRlLyIgKyBMb25nLnBhcnNlTG9uZyhjb21wdXRlSWQuZ2V0KCkuZ2V0VmFsdWUoKSksIENvbXB1dGVSZXNvdXJjZS5jbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQ29tcHV0ZU9wZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCJTU0giLmVxdWFscyhjb21wdXRlUmVzb3VyY2UuZ2V0Q29tbXVuaWNhdGlvblR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMgPSBuZXcgU1NIQ29tcHV0ZU9wZXJhdGlvbnMoY29tcHV0ZVJlc291cmNlLmdldEhvc3QoKSwgY29tcHV0ZVJlc291cmNlLmdldFVzZXJOYW1lKCksIGNvbXB1dGVSZXNvdXJjZS5nZXRQYXNzd29yZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiTW9jayIuZXF1YWxzKGNvbXB1dGVSZXNvdXJjZS5nZXRDb21tdW5pY2F0aW9uVHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9IG5ldyBNb2NrQ29tcHV0ZU9wZXJhdGlvbihjb21wdXRlUmVzb3VyY2UuZ2V0SG9zdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk5vIGNvbXBhdGlibGUgY29tbXVuaWNhdGlvbiBtZXRob2QgeyIgKyBjb21wdXRlUmVzb3VyY2UuZ2V0Q29tbXVuaWNhdGlvblR5cGUoKSArICJ9IG5vdCBmb3VuZCBmb3IgY29tcHV0ZSByZXNvdXJjZSAiICsgY29tcHV0ZVJlc291cmNlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGVtcG9yYXJ5RmlsZSA9ICIvdG1wLyIgKyBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb3dubG9hZGluZyAiICsgc291cmNlUGFyYW0uZ2V0KCkuZ2V0VmFsdWUoKSArICIgdG8gIiArIHRlbXBvcmFyeUZpbGUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZyb20gY29tcHV0ZSByZXNvdXJjZSAiICsgY29tcHV0ZVJlc291cmNlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLnRyYW5zZmVyRGF0YU91dChzb3VyY2VQYXJhbS5nZXQoKS5nZXRWYWx1ZSgpLCB0ZW1wb3JhcnlGaWxlLCAiU0NQIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlc3RUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG5ldyBSZXN0VGVtcGxhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpbmtlZE11bHRpVmFsdWVNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBMaW5rZWRNdWx0aVZhbHVlTWFwPD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5hZGQoImZpbGUiLCBuZXcgRmlsZVN5c3RlbVJlc291cmNlKHRlbXBvcmFyeUZpbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBIZWFkZXJzIGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBIdHRwRW50aXR5PExpbmtlZE11bHRpVmFsdWVNYXA8U3RyaW5nLCBPYmplY3Q+PiByZXF1ZXN0RW50aXR5ID0gbmV3IEh0dHBFbnRpdHk8TGlua2VkTXVsdGlWYWx1ZU1hcDxTdHJpbmcsIE9iamVjdD4+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAsIGhlYWRlcnMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVwbG9hZGluZyBkYXRhIGZpbGUgd2l0aCB0YXNrIGlkICIgKyB0YXNrUmVzb3VyY2UuZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYW5kIGV4cGVyaW1lbnQgb3V0cHV0IGlkICIgKyB0YXJnZXRQYXJhbS5nZXQoKS5nZXRWYWx1ZSgpICsgIiB0byBkYXRhIHN0b3JlIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlRW50aXR5PExvbmc+IHJlc3VsdCA9IHRlbXBsYXRlLmV4Y2hhbmdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovLyIgKyBhcGlTZXJ2ZXJVcmwgKyAiL2RhdGEvIiArIHRhc2tSZXNvdXJjZS5nZXRJZCgpKyAiLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRhcmdldFBhcmFtLmdldCgpLmdldFZhbHVlKCkgKyIvdXBsb2FkIiwgSHR0cE1ldGhvZC5QT1NULCByZXF1ZXN0RW50aXR5LCBMb25nLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkNPTVBMRVRFRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHRhc2tSZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSwgdGFza1Jlc291cmNlLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhc2tTdGF0dXNSZXNvdXJjZS5TdGF0ZS5GQUlMRUQsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGFyZ2V0IGNhbiBub3QgYmUgbnVsbCBmb3IgdGFzayAiICsgdGFza1Jlc291cmNlLmdldElkKCkpOwotICAgICAgICAgICAgICAgICAgICBwdWJsaXNoVGFza1N0YXR1cyh0YXNrUmVzb3VyY2UuZ2V0UGFyZW50UHJvY2Vzc0lkKCksIHRhc2tSZXNvdXJjZS5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhc2tTdGF0dXNSZXNvdXJjZS5TdGF0ZS5GQUlMRUQsICJUYXJnZXQgY2FuIG5vdCBiZSBudWxsIGZvciB0YXNrICIgKyB0YXNrUmVzb3VyY2UuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNvdXJjZSBjYW4gbm90IGJlIG51bGwgZm9yIHRhc2sgIiArIHRhc2tSZXNvdXJjZS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBwdWJsaXNoVGFza1N0YXR1cyh0YXNrUmVzb3VyY2UuZ2V0UGFyZW50UHJvY2Vzc0lkKCksIHRhc2tSZXNvdXJjZS5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkZBSUxFRCwgIlNvdXJjZSBjYW4gbm90IGJlIG51bGwgZm9yIHRhc2sgIiArIHRhc2tSZXNvdXJjZS5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBwdWJsaXNoVGFza1N0YXR1cyh0YXNrUmVzb3VyY2UuZ2V0UGFyZW50UHJvY2Vzc0lkKCksIHRhc2tSZXNvdXJjZS5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICBUYXNrU3RhdHVzUmVzb3VyY2UuU3RhdGUuRkFJTEVELCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdWJsaXNoVGFza1N0YXR1cyhsb25nIHByb2Nlc3NJZCwgbG9uZyB0YXNrSWQsIGludCBzdGF0dXMpIHsKLSAgICAgICAgcHVibGlzaFRhc2tTdGF0dXMocHJvY2Vzc0lkLCB0YXNrSWQsIHN0YXR1cywgIiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1Ymxpc2hUYXNrU3RhdHVzKGxvbmcgcHJvY2Vzc0lkLCBsb25nIHRhc2tJZCwgaW50IHN0YXR1cywgU3RyaW5nIHJlYXNvbikgewotICAgICAgICB0aGlzLmthZmthU2VuZGVyLnNlbmQodGhpcy50YXNrRXZlbnRQdWJsaXNoVG9waWMsIHByb2Nlc3NJZCArICItIiArIHRhc2tJZCwKLSAgICAgICAgICAgICAgICBwcm9jZXNzSWQgKyAiLCIgKyB0YXNrSWQgKyAiLCIgKyBzdGF0dXMgKyAiLCIgKyByZWFzb24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2Vudi1jbGVhbnVwLXRhc2svcG9tLnhtbCBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2Vudi1jbGVhbnVwLXRhc2svcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiY2EyYy4uMDAwMDAwMAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtY2xlYW51cC10YXNrL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLQotCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLQotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmFpcmF2YXRhLWt1YmVybmV0ZXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYWlyYXZhdGE8L2dyb3VwSWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi8uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPC9wYXJlbnQ+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gICAgPGFydGlmYWN0SWQ+ZW52LWNsZWFudXAtdGFzazwvYXJ0aWZhY3RJZD4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5haXJhdmF0YTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbXB1dGUtcmVzb3VyY2UtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5haXJhdmF0YTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmFwaS1yZXNvdXJjZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yay5ib290PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJvb3Qtc3RhcnRlci13ZWI8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3Q8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYm9vdC1zdGFydGVyLWZyZWVtYXJrZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWthZmthPC9hcnRpZmFjdElkPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuNS4xPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7amF2YS52ZXJzaW9ufTwvc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PiR7amF2YS52ZXJzaW9ufTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxwcm9maWxlcz4KLQotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5qYXI8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD50cnVlPC9hY3RpdmVCeURlZmF1bHQ+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3QtcGFja2FnaW5nPmphcjwvYXJ0aWZhY3QtcGFja2FnaW5nPgotICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yay5ib290PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJvb3QtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS40LjMuUkVMRUFTRTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJlcGFja2FnZTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gQ3JlYXRlIGEgZG9ja2VyIGltYWdlIHRoYXQgcnVucyB0aGUgZXhlY3V0YWJsZSBqYXItLT4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zcG90aWZ5PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZG9ja2VyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltYWdlTmFtZT4ke2RvY2tlci5pbWFnZS5wcmVmaXh9L2Vudi1jbGVhbnVwLXRhc2s8L2ltYWdlTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFzZUltYWdlPmphdmE6b3Blbmpkay04LWpkay1hbHBpbmU8L2Jhc2VJbWFnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnlQb2ludD5bImphdmEiLCItamFyIiwiLyR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9LmphciJdPC9lbnRyeVBvaW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi88L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfS5qYXI8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5idWlsZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotCi0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPndhcjwvaWQ+Ci0gICAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3QtcGFja2FnaW5nPndhcjwvYXJ0aWZhY3QtcGFja2FnaW5nPgotICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yay5ib290PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYm9vdC1zdGFydGVyLXRvbWNhdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1ib290LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuNC4zLlJFTEVBU0U8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRoaXMgd2lsbCBnZXQgcmlkIG9mIHZlcnNpb24gaW5mbyBmcm9tIHdhciBmaWxlIG5hbWUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5lbnYtY2xlYW51cDwvZmluYWxOYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgPC9wcm9maWxlcz4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtY2xlYW51cC10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9jbGVhbnVwL0FwcGxpY2F0aW9uLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtY2xlYW51cC10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9jbGVhbnVwL0FwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNWNmMWYuLjAwMDAwMDAKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LWNsZWFudXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svY2xlYW51cC9BcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3QuU3ByaW5nQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5ib290LmF1dG9jb25maWd1cmUuU3ByaW5nQm9vdEFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdC53ZWIuY2xpZW50LlJlc3RUZW1wbGF0ZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db21wb25lbnRTY2FuOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY2xpZW50LlJlc3RUZW1wbGF0ZTsKLQotLyoqCi0gKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKLSAqCi0gKiBAYXV0aG9yIGRpbXV0aHUKLSAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAotICovCi1AU3ByaW5nQm9vdEFwcGxpY2F0aW9uCi1AQ29uZmlndXJhdGlvbgotQENvbXBvbmVudFNjYW4KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbiB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFNwcmluZ0FwcGxpY2F0aW9uLnJ1bihBcHBsaWNhdGlvbi5jbGFzcywgYXJncyk7Ci0gICAgfQotCi0gICAgQEJlYW4KLSAgICBwdWJsaWMgUmVzdFRlbXBsYXRlIHJlc3RUZW1wbGF0ZShSZXN0VGVtcGxhdGVCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LWNsZWFudXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svY2xlYW51cC9tZXNzYWdpbmcvS2Fma2FSZWNlaXZlci5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LWNsZWFudXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svY2xlYW51cC9tZXNzYWdpbmcvS2Fma2FSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWFhYTUxLi4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2Vudi1jbGVhbnVwLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2NsZWFudXAvbWVzc2FnaW5nL0thZmthUmVjZWl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5jbGVhbnVwLm1lc3NhZ2luZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suY2xlYW51cC5zZXJ2aWNlLlRhc2tFeGVjdXRpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EuYW5ub3RhdGlvbi5LYWZrYUxpc3RlbmVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2Euc3VwcG9ydC5BY2tub3dsZWRnbWVudDsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7Ci0KLS8qKgotICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCi0gKgotICogQGF1dGhvciBkaW11dGh1Ci0gKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKLSAqLwotcHVibGljIGNsYXNzIEthZmthUmVjZWl2ZXIgewotCi0gICAgQFJlc291cmNlCi0gICAgcHJpdmF0ZSBUYXNrRXhlY3V0aW9uU2VydmljZSB0YXNrRXhlY3V0aW9uU2VydmljZTsKLQotICAgIEBLYWZrYUxpc3RlbmVyKHRvcGljcyA9ICIke3Rhc2sucmVhZC50b3BpYy5uYW1lfSIpCi0gICAgcHVibGljIHZvaWQgcmVjZWl2ZVRhc2tzKFN0cmluZyBwYXlsb2FkLCBBY2tub3dsZWRnbWVudCBhY2spIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWNlaXZlZCB0YXNrPSIgKyBwYXlsb2FkKTsKLSAgICAgICAgdGFza0V4ZWN1dGlvblNlcnZpY2UuZXhlY3V0ZVRhc2tBc3luYyhMb25nLnBhcnNlTG9uZyhwYXlsb2FkKSk7Ci0gICAgICAgIGFjay5hY2tub3dsZWRnZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2Vudi1jbGVhbnVwLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2NsZWFudXAvbWVzc2FnaW5nL1JlY2VpdmVyQ29uZmlnLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtY2xlYW51cC10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9jbGVhbnVwL21lc3NhZ2luZy9SZWNlaXZlckNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFiYTExLi4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2Vudi1jbGVhbnVwLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2NsZWFudXAvbWVzc2FnaW5nL1JlY2VpdmVyQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suY2xlYW51cC5tZXNzYWdpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmthZmthLmNsaWVudHMuY29uc3VtZXIuQ29uc3VtZXJDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VyaWFsaXphdGlvbi5TdHJpbmdEZXNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uVmFsdWU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EuYW5ub3RhdGlvbi5FbmFibGVLYWZrYTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthLmNvbmZpZy5Db25jdXJyZW50S2Fma2FMaXN0ZW5lckNvbnRhaW5lckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb25maWcuS2Fma2FMaXN0ZW5lckNvbnRhaW5lckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb3JlLkNvbnN1bWVyRmFjdG9yeTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthLmNvcmUuRGVmYXVsdEthZmthQ29uc3VtZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EubGlzdGVuZXIuQWJzdHJhY3RNZXNzYWdlTGlzdGVuZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5saXN0ZW5lci5Db25jdXJyZW50TWVzc2FnZUxpc3RlbmVyQ29udGFpbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKLSAqCi0gKiBAYXV0aG9yIGRpbXV0aHUKLSAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAotICovCi1AQ29uZmlndXJhdGlvbgotQEVuYWJsZUthZmthCi1wdWJsaWMgY2xhc3MgUmVjZWl2ZXJDb25maWcgewotCi0gICAgQFZhbHVlKCIke2thZmthLmJvb3RzdHJhcC1zZXJ2ZXJzfSIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgYm9vdHN0cmFwU2VydmVyczsKLQotICAgIEBWYWx1ZSgiJHt0YXNrLmdyb3VwLm5hbWV9IikKLSAgICBwcml2YXRlIFN0cmluZyB0YXNrR3JvdXBOYW1lOwotCi0gICAgQEJlYW4KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb25zdW1lckNvbmZpZ3MoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIC8vIGxpc3Qgb2YgaG9zdDpwb3J0IHBhaXJzIHVzZWQgZm9yIGVzdGFibGlzaGluZyB0aGUgaW5pdGlhbCBjb25uZWN0aW9ucyB0byB0aGUgS2FrZmEgY2x1c3RlcgotICAgICAgICBwcm9wcy5wdXQoQ29uc3VtZXJDb25maWcuQk9PVFNUUkFQX1NFUlZFUlNfQ09ORklHLCBib290c3RyYXBTZXJ2ZXJzKTsKLSAgICAgICAgcHJvcHMucHV0KENvbnN1bWVyQ29uZmlnLktFWV9ERVNFUklBTElaRVJfQ0xBU1NfQ09ORklHLCBTdHJpbmdEZXNlcmlhbGl6ZXIuY2xhc3MpOwotICAgICAgICBwcm9wcy5wdXQoQ29uc3VtZXJDb25maWcuVkFMVUVfREVTRVJJQUxJWkVSX0NMQVNTX0NPTkZJRywgU3RyaW5nRGVzZXJpYWxpemVyLmNsYXNzKTsKLSAgICAgICAgLy8gYWxsb3dzIGEgcG9vbCBvZiBwcm9jZXNzZXMgdG8gZGl2aWRlIHRoZSB3b3JrIG9mIGNvbnN1bWluZyBhbmQgcHJvY2Vzc2luZyByZWNvcmRzCi0gICAgICAgIHByb3BzLnB1dChDb25zdW1lckNvbmZpZy5HUk9VUF9JRF9DT05GSUcsIHRhc2tHcm91cE5hbWUpOwotICAgICAgICBwcm9wcy5wdXQoQ29uc3VtZXJDb25maWcuRU5BQkxFX0FVVE9fQ09NTUlUX0NPTkZJRywgZmFsc2UpOwotICAgICAgICByZXR1cm4gcHJvcHM7Ci0gICAgfQotCi0gICAgQEJlYW4KLSAgICBwdWJsaWMgQ29uc3VtZXJGYWN0b3J5PFN0cmluZywgU3RyaW5nPiBjb25zdW1lckZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEthZmthQ29uc3VtZXJGYWN0b3J5PFN0cmluZywgU3RyaW5nPihjb25zdW1lckNvbmZpZ3MoKSk7Ci0gICAgfQotCi0gICAgQEJlYW4KLSAgICBwdWJsaWMgS2Fma2FMaXN0ZW5lckNvbnRhaW5lckZhY3Rvcnk8Q29uY3VycmVudE1lc3NhZ2VMaXN0ZW5lckNvbnRhaW5lcjxTdHJpbmcsIFN0cmluZz4+IGthZmthTGlzdGVuZXJDb250YWluZXJGYWN0b3J5KCkgewotICAgICAgICBDb25jdXJyZW50S2Fma2FMaXN0ZW5lckNvbnRhaW5lckZhY3Rvcnk8U3RyaW5nLCBTdHJpbmc+IGZhY3RvcnkgPQotICAgICAgICAgICAgICAgIG5ldyBDb25jdXJyZW50S2Fma2FMaXN0ZW5lckNvbnRhaW5lckZhY3Rvcnk8PigpOwotICAgICAgICBmYWN0b3J5LnNldENvbnN1bWVyRmFjdG9yeShjb25zdW1lckZhY3RvcnkoKSk7Ci0gICAgICAgIGZhY3RvcnkuZ2V0Q29udGFpbmVyUHJvcGVydGllcygpLnNldEFja01vZGUoQWJzdHJhY3RNZXNzYWdlTGlzdGVuZXJDb250YWluZXIuQWNrTW9kZS5NQU5VQUxfSU1NRURJQVRFKTsKLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgQEJlYW4KLSAgICBwdWJsaWMgS2Fma2FSZWNlaXZlciByZWNlaXZlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBLYWZrYVJlY2VpdmVyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LWNsZWFudXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svY2xlYW51cC9tZXNzYWdpbmcvU2VuZGVyQ29uZmlnLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtY2xlYW51cC10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9jbGVhbnVwL21lc3NhZ2luZy9TZW5kZXJDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0Y2VjZi4uMDAwMDAwMAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtY2xlYW51cC10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9jbGVhbnVwL21lc3NhZ2luZy9TZW5kZXJDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5jbGVhbnVwLm1lc3NhZ2luZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUua2Fma2EuY2xpZW50cy5wcm9kdWNlci5Qcm9kdWNlckNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLmthZmthLmNvbW1vbi5zZXJpYWxpemF0aW9uLlN0cmluZ1NlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uVmFsdWU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EuY29yZS5EZWZhdWx0S2Fma2FQcm9kdWNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb3JlLkthZmthVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb3JlLlByb2R1Y2VyRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCi0gKgotICogQGF1dGhvciBkaW11dGh1Ci0gKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKLSAqLwotQENvbmZpZ3VyYXRpb24KLXB1YmxpYyBjbGFzcyBTZW5kZXJDb25maWcgewotICAgIEBWYWx1ZSgiJHtrYWZrYS5ib290c3RyYXAtc2VydmVyc30iKQotICAgIHByaXZhdGUgU3RyaW5nIGJvb3RzdHJhcFNlcnZlcnM7Ci0KLSAgICBAQmVhbgotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y2VyQ29uZmlncygpIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgLy8gbGlzdCBvZiBob3N0OnBvcnQgcGFpcnMgdXNlZCBmb3IgZXN0YWJsaXNoaW5nIHRoZSBpbml0aWFsIGNvbm5lY3Rpb25zIHRvIHRoZSBLYWtmYSBjbHVzdGVyCi0gICAgICAgIHByb3BzLnB1dChQcm9kdWNlckNvbmZpZy5CT09UU1RSQVBfU0VSVkVSU19DT05GSUcsIGJvb3RzdHJhcFNlcnZlcnMpOwotICAgICAgICBwcm9wcy5wdXQoUHJvZHVjZXJDb25maWcuS0VZX1NFUklBTElaRVJfQ0xBU1NfQ09ORklHLCBTdHJpbmdTZXJpYWxpemVyLmNsYXNzKTsKLSAgICAgICAgcHJvcHMucHV0KFByb2R1Y2VyQ29uZmlnLlZBTFVFX1NFUklBTElaRVJfQ0xBU1NfQ09ORklHLCBTdHJpbmdTZXJpYWxpemVyLmNsYXNzKTsKLSAgICAgICAgcmV0dXJuIHByb3BzOwotICAgIH0KLQotICAgIEBCZWFuCi0gICAgcHVibGljIFByb2R1Y2VyRmFjdG9yeTxTdHJpbmcsIFN0cmluZz4gcHJvZHVjZXJGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRLYWZrYVByb2R1Y2VyRmFjdG9yeTxTdHJpbmcsIFN0cmluZz4ocHJvZHVjZXJDb25maWdzKCkpOwotICAgIH0KLQotICAgIEBCZWFuCi0gICAgcHVibGljIEthZmthVGVtcGxhdGU8U3RyaW5nLCBTdHJpbmc+IGthZmthVGVtcGxhdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgS2Fma2FUZW1wbGF0ZTw+KHByb2R1Y2VyRmFjdG9yeSgpKTsKLSAgICB9Ci0KLSAgICBAQmVhbgotICAgIHB1YmxpYyBLYWZrYVNlbmRlciBrYWZrYVNlbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBLYWZrYVNlbmRlcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2Vudi1jbGVhbnVwLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2NsZWFudXAvc2VydmljZS9UYXNrRXhlY3V0aW9uU2VydmljZS5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LWNsZWFudXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svY2xlYW51cC9zZXJ2aWNlL1Rhc2tFeGVjdXRpb25TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOWNjNjYuLjAwMDAwMDAKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LWNsZWFudXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svY2xlYW51cC9zZXJ2aWNlL1Rhc2tFeGVjdXRpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmNsZWFudXAuc2VydmljZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMuY29tcHV0ZS5Db21wdXRlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLlRhc2tQYXJhbVJlc291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay5UYXNrUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLlRhc2tTdGF0dXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5jb21wdXRlLmFwaS5Db21wdXRlT3BlcmF0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5jb21wdXRlLmFwaS5FeGVjdXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuY29tcHV0ZS5pbXBsLk1vY2tDb21wdXRlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmNvbXB1dGUuaW1wbC5TU0hDb21wdXRlT3BlcmF0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmNsZWFudXAubWVzc2FnaW5nLkthZmthU2VuZGVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLlZhbHVlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNsaWVudC5SZXN0VGVtcGxhdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKLQotLyoqCi0gKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKLSAqCi0gKiBAYXV0aG9yIGRpbXV0aHUKLSAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAotICovCi1AU2VydmljZQotcHVibGljIGNsYXNzIFRhc2tFeGVjdXRpb25TZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMTApOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSZXN0VGVtcGxhdGUgcmVzdFRlbXBsYXRlOwotICAgIHByaXZhdGUgZmluYWwgS2Fma2FTZW5kZXIga2Fma2FTZW5kZXI7Ci0KLSAgICBAVmFsdWUoIiR7YXBpLnNlcnZlci51cmx9IikKLSAgICBwcml2YXRlIFN0cmluZyBhcGlTZXJ2ZXJVcmw7Ci0KLSAgICBAVmFsdWUoIiR7dGFzay5ldmVudC50b3BpYy5uYW1lfSIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFza0V2ZW50UHVibGlzaFRvcGljOwotCi0gICAgcHVibGljIFRhc2tFeGVjdXRpb25TZXJ2aWNlKFJlc3RUZW1wbGF0ZSByZXN0VGVtcGxhdGUsIEthZmthU2VuZGVyIGthZmthU2VuZGVyKSB7Ci0gICAgICAgIHRoaXMucmVzdFRlbXBsYXRlID0gcmVzdFRlbXBsYXRlOwotICAgICAgICB0aGlzLmthZmthU2VuZGVyID0ga2Fma2FTZW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZVRhc2tBc3luYyhsb25nIHRhc2tJZCkgewotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhlY3V0aW5nIHRhc2sgIiArIHRhc2tJZCArICIgYXMgZW52IGNsZWFudXAgdGFzayIpOwotICAgICAgICBUYXNrUmVzb3VyY2UgdGFza1Jlc291cmNlID0gdGhpcy5yZXN0VGVtcGxhdGUuZ2V0Rm9yT2JqZWN0KCJodHRwOi8vIiArIGFwaVNlcnZlclVybCArICIvdGFzay8iICsgdGFza0lkLCBUYXNrUmVzb3VyY2UuY2xhc3MpOwotCi0gICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHRhc2tSZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSwgdGFza1Jlc291cmNlLmdldElkKCksIFRhc2tTdGF0dXNSZXNvdXJjZS5TdGF0ZS5TQ0hFRFVMRUQpOwotCi0gICAgICAgIHRoaXMuZXhlY3V0b3JTZXJ2aWNlLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgZXhlY3V0ZVRhc2sodGFza1Jlc291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZVRhc2soVGFza1Jlc291cmNlIHRhc2tSZXNvdXJjZSkgewotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBPcHRpb25hbDxUYXNrUGFyYW1SZXNvdXJjZT4gY29tbWFuZFBhcmFtID0gdGFza1Jlc291cmNlLmdldFRhc2tQYXJhbXMoKQotICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih0YXNrUGFyYW1SZXNvdXJjZSAtPiAiY29tbWFuZCIuZXF1YWxzKHRhc2tQYXJhbVJlc291cmNlLmdldEtleSgpKSkKLSAgICAgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpOwotCi0gICAgICAgICAgICBPcHRpb25hbDxUYXNrUGFyYW1SZXNvdXJjZT4gY29tcHV0ZUlkID0gdGFza1Jlc291cmNlLmdldFRhc2tQYXJhbXMoKQotICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih0YXNrUGFyYW1SZXNvdXJjZSAtPiAiY29tcHV0ZS1pZCIuZXF1YWxzKHRhc2tQYXJhbVJlc291cmNlLmdldEtleSgpKSkKLSAgICAgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpOwotCi0gICAgICAgICAgICBPcHRpb25hbDxUYXNrUGFyYW1SZXNvdXJjZT4gZXhwZXJpbWVudERhdGFEaXIgPSB0YXNrUmVzb3VyY2UuZ2V0VGFza1BhcmFtcygpCi0gICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHRhc2tQYXJhbVJlc291cmNlIC0+ICJleHAtZGF0YS1kaXIiLmVxdWFscyh0YXNrUGFyYW1SZXNvdXJjZS5nZXRLZXkoKSkpCi0gICAgICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHByb2Nlc3NEYXRhRGlyZWN0b3J5ID0gZXhwZXJpbWVudERhdGFEaXIKLSAgICAgICAgICAgICAgICAgICAgLm9yRWxzZVRocm93KCgpIC0+IG5ldyBFeGNlcHRpb24oImV4cC1kYXRhLWRpciBwYXJhbSBjYW4gbm90IGJlIGZvdW5kIGluIHRoZSBwYXJhbXMgb2YgdGFzayAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrUmVzb3VyY2UuZ2V0SWQoKSkpLmdldFZhbHVlKCkgKyAiLyIgKyB0YXNrUmVzb3VyY2UuZ2V0UGFyZW50UHJvY2Vzc0lkKCk7Ci0KLSAgICAgICAgICAgIGNvbW1hbmRQYXJhbS5pZlByZXNlbnQodGFza1BhcmFtUmVzb3VyY2UgLT4gewotCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSB0YXNrUGFyYW1SZXNvdXJjZS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gY29tbWFuZC5yZXBsYWNlKCJ7cHJvY2Vzcy1kYXRhLWRpcn0iLCBwcm9jZXNzRGF0YURpcmVjdG9yeSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGVjdXRpbmcgY29tbWFuZCAiICsgY29tbWFuZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkVYRUNVVElORyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBmZXRjaCB0aGlzIGZyb20gdGhlIGNhdGFsb2cKLSAgICAgICAgICAgICAgICAgICAgQ29tcHV0ZVJlc291cmNlIGNvbXB1dGVSZXNvdXJjZSA9IHRoaXMucmVzdFRlbXBsYXRlLmdldEZvck9iamVjdCgiaHR0cDovLyIgKyB0aGlzLmFwaVNlcnZlclVybAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi9jb21wdXRlLyIgKyBMb25nLnBhcnNlTG9uZyhjb21wdXRlSWQuZ2V0KCkuZ2V0VmFsdWUoKSksIENvbXB1dGVSZXNvdXJjZS5jbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBmZXRjaCB0aGlzIGZyb20gdGhlIGNhdGFsb2cKLSAgICAgICAgICAgICAgICAgICAgQ29tcHV0ZU9wZXJhdGlvbnMgb3BlcmF0aW9uczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCJTU0giLmVxdWFscyhjb21wdXRlUmVzb3VyY2UuZ2V0Q29tbXVuaWNhdGlvblR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMgPSBuZXcgU1NIQ29tcHV0ZU9wZXJhdGlvbnMoY29tcHV0ZVJlc291cmNlLmdldEhvc3QoKSwgY29tcHV0ZVJlc291cmNlLmdldFVzZXJOYW1lKCksIGNvbXB1dGVSZXNvdXJjZS5nZXRQYXNzd29yZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiTW9jayIuZXF1YWxzKGNvbXB1dGVSZXNvdXJjZS5nZXRDb21tdW5pY2F0aW9uVHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9IG5ldyBNb2NrQ29tcHV0ZU9wZXJhdGlvbihjb21wdXRlUmVzb3VyY2UuZ2V0SG9zdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk5vIGNvbXBhdGlibGUgY29tbXVuaWNhdGlvbiBtZXRob2QgeyIgKyBjb21wdXRlUmVzb3VyY2UuZ2V0Q29tbXVuaWNhdGlvblR5cGUoKSArICJ9IG5vdCBmb3VuZCBmb3IgY29tcHV0ZSByZXNvdXJjZSAiICsgY29tcHV0ZVJlc291cmNlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBFeGVjdXRpb25SZXN1bHQgZXhlY3V0aW9uUmVzdWx0ID0gb3BlcmF0aW9ucy5leGVjdXRlQ29tbWFuZChjb21tYW5kKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dGlvblJlc3VsdC5nZXRFeGl0U3RhdHVzKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkNPTVBMRVRFRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhlY3V0aW9uUmVzdWx0LmdldEV4aXRTdGF0dXMoKSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkZBSUxFRCwgIlByb2Nlc3MgZGlkbid0IGV4aXQgc3VjY2Vzc2Z1bGx5Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoVGFza1N0YXR1cyh0YXNrUmVzb3VyY2UuZ2V0UGFyZW50UHJvY2Vzc0lkKCksIHRhc2tSZXNvdXJjZS5nZXRJZCgpLCBUYXNrU3RhdHVzUmVzb3VyY2UuU3RhdGUuRkFJTEVELCAiUHJvY2VzcyBleGl0ZWQgd2l0aCBlcnJvciBzdGF0dXMgIiArIGV4ZWN1dGlvblJlc3VsdC5nZXRFeGl0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgICAgICBwdWJsaXNoVGFza1N0YXR1cyh0YXNrUmVzb3VyY2UuZ2V0UGFyZW50UHJvY2Vzc0lkKCksIHRhc2tSZXNvdXJjZS5nZXRJZCgpLCBUYXNrU3RhdHVzUmVzb3VyY2UuU3RhdGUuRkFJTEVELCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkZBSUxFRCwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHVibGlzaFRhc2tTdGF0dXMobG9uZyBwcm9jZXNzSWQsIGxvbmcgdGFza0lkLCBpbnQgc3RhdHVzKSB7Ci0gICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHByb2Nlc3NJZCwgdGFza0lkLCBzdGF0dXMsICIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdWJsaXNoVGFza1N0YXR1cyhsb25nIHByb2Nlc3NJZCwgbG9uZyB0YXNrSWQsIGludCBzdGF0dXMsIFN0cmluZyByZWFzb24pIHsKLSAgICAgICAgdGhpcy5rYWZrYVNlbmRlci5zZW5kKHRoaXMudGFza0V2ZW50UHVibGlzaFRvcGljLCBwcm9jZXNzSWQgKyAiLSIgKyB0YXNrSWQsCi0gICAgICAgICAgICAgICAgcHJvY2Vzc0lkICsgIiwiICsgdGFza0lkICsgIiwiICsgc3RhdHVzICsgIiwiICsgcmVhc29uKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtY2xlYW51cC10YXNrL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi5wcm9wZXJ0aWVzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LWNsZWFudXAtdGFzay9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkNDlhNy4uMDAwMDAwMAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtY2xlYW51cC10YXNrL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zZXJ2ZXIucG9ydCA9IDg1OTEKLWFwaS5zZXJ2ZXIudXJsID0gYXBpLXNlcnZlci5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsOjgwODAKLXRhc2suZ3JvdXAubmFtZSA9IGVudi1jbGVhbnVwCi10YXNrLmV2ZW50LnRvcGljLm5hbWUgPSBhaXJhdmF0YS10YXNrLWV2ZW50Ci10YXNrLnJlYWQudG9waWMubmFtZSA9IGFpcmF2YXRhLXRhc2stZW52LWNsZWFudXAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtY2xlYW51cC10YXNrL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi55bWwgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtY2xlYW51cC10YXNrL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi55bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OWRkNjEuLjAwMDAwMDAKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LWNsZWFudXAtdGFzay9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ueW1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1rYWZrYToKLSAgYm9vdHN0cmFwLXNlcnZlcnM6IGthZmthLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWw6OTA5MgotICB0b3BpYzoKLSAgICBoZWxsb3dvcmxkOiBoZWxsb3dvcmxkLnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtc2V0dXAtdGFzay9wb20ueG1sIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LXNldHVwLXRhc2svcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxMWQ3Yi4uMDAwMDAwMAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtc2V0dXAtdGFzay9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0KLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLSAgICA8cGFyZW50PgotICAgICAgICA8YXJ0aWZhY3RJZD5haXJhdmF0YS1rdWJlcm5ldGVzPC9hcnRpZmFjdElkPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFpcmF2YXRhPC9ncm91cElkPgotICAgICAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vLi4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDwvcGFyZW50PgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICAgIDxhcnRpZmFjdElkPmVudi1zZXR1cC10YXNrPC9hcnRpZmFjdElkPgotCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFpcmF2YXRhPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tcHV0ZS1yZXNvdXJjZS1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFpcmF2YXRhPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXBpLXJlc291cmNlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3Q8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYm9vdC1zdGFydGVyLXdlYjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1ib290LXN0YXJ0ZXItZnJlZW1hcmtlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2E8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmcta2Fma2E8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+My41LjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+JHtqYXZhLnZlcnNpb259PC9zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+JHtqYXZhLnZlcnNpb259PC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotCi0gICAgPHByb2ZpbGVzPgotCi0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmphcjwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PnRydWU8L2FjdGl2ZUJ5RGVmYXVsdD4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdC1wYWNrYWdpbmc+amFyPC9hcnRpZmFjdC1wYWNrYWdpbmc+Ci0gICAgICAgICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICAgICAgICA8YnVpbGQ+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3Q8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYm9vdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjQuMy5SRUxFQVNFPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cmVwYWNrYWdlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBDcmVhdGUgYSBkb2NrZXIgaW1hZ2UgdGhhdCBydW5zIHRoZSBleGVjdXRhYmxlIGphci0tPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnNwb3RpZnk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kb2NrZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1hZ2VOYW1lPiR7ZG9ja2VyLmltYWdlLnByZWZpeH0vZW52LXNldHVwLXRhc2s8L2ltYWdlTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFzZUltYWdlPmphdmE6b3Blbmpkay04LWpkay1hbHBpbmU8L2Jhc2VJbWFnZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnlQb2ludD5bImphdmEiLCItamFyIiwiLyR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9LmphciJdPC9lbnRyeVBvaW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPi88L3RhcmdldFBhdGg+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9PC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfS5qYXI8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5idWlsZDwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotCi0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPndhcjwvaWQ+Ci0gICAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3QtcGFja2FnaW5nPndhcjwvYXJ0aWZhY3QtcGFja2FnaW5nPgotICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yay5ib290PC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYm9vdC1zdGFydGVyLXRvbWNhdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1ib290LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuNC4zLlJFTEVBU0U8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRoaXMgd2lsbCBnZXQgcmlkIG9mIHZlcnNpb24gaW5mbyBmcm9tIHdhciBmaWxlIG5hbWUgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT5lbnYtc2V0dXA8L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtc2V0dXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svZW52L3NldHVwL0FwcGxpY2F0aW9uLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtc2V0dXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svZW52L3NldHVwL0FwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzODgxZmMuLjAwMDAwMDAKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LXNldHVwLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2Vudi9zZXR1cC9BcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmVudi5zZXR1cDsKLQotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYm9vdC5TcHJpbmdBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3QuYXV0b2NvbmZpZ3VyZS5TcHJpbmdCb290QXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5ib290LndlYi5jbGllbnQuUmVzdFRlbXBsYXRlQnVpbGRlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5CZWFuOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkNvbXBvbmVudFNjYW47Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jbGllbnQuUmVzdFRlbXBsYXRlOwotCi0vKioKLSAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQotICoKLSAqIEBhdXRob3IgZGltdXRodQotICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCi0gKi8KLUBTcHJpbmdCb290QXBwbGljYXRpb24KLUBDb25maWd1cmF0aW9uCi1AQ29tcG9uZW50U2NhbgotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3ByaW5nQXBwbGljYXRpb24ucnVuKEFwcGxpY2F0aW9uLmNsYXNzLCBhcmdzKTsKLSAgICB9Ci0KLSAgICBAQmVhbgotICAgIHB1YmxpYyBSZXN0VGVtcGxhdGUgcmVzdFRlbXBsYXRlKFJlc3RUZW1wbGF0ZUJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtc2V0dXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svZW52L3NldHVwL21lc3NhZ2luZy9LYWZrYVJlY2VpdmVyLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtc2V0dXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svZW52L3NldHVwL21lc3NhZ2luZy9LYWZrYVJlY2VpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YzdiZjQuLjAwMDAwMDAKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LXNldHVwLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2Vudi9zZXR1cC9tZXNzYWdpbmcvS2Fma2FSZWNlaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmVudi5zZXR1cC5tZXNzYWdpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmVudi5zZXR1cC5zZXJ2aWNlLlRhc2tFeGVjdXRpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EuYW5ub3RhdGlvbi5LYWZrYUxpc3RlbmVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2Euc3VwcG9ydC5BY2tub3dsZWRnbWVudDsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7Ci0KLS8qKgotICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCi0gKgotICogQGF1dGhvciBkaW11dGh1Ci0gKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKLSAqLwotcHVibGljIGNsYXNzIEthZmthUmVjZWl2ZXIgewotCi0gICAgQFJlc291cmNlCi0gICAgcHJpdmF0ZSBUYXNrRXhlY3V0aW9uU2VydmljZSB0YXNrRXhlY3V0aW9uU2VydmljZTsKLQotICAgIEBLYWZrYUxpc3RlbmVyKHRvcGljcyA9ICIke3Rhc2sucmVhZC50b3BpYy5uYW1lfSIpCi0gICAgcHVibGljIHZvaWQgcmVjZWl2ZVRhc2tzKFN0cmluZyBwYXlsb2FkLCBBY2tub3dsZWRnbWVudCBhY2spIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWNlaXZlZCB0YXNrPSIgKyBwYXlsb2FkKTsKLSAgICAgICAgdGFza0V4ZWN1dGlvblNlcnZpY2UuZXhlY3V0ZVRhc2tBc3luYyhMb25nLnBhcnNlTG9uZyhwYXlsb2FkKSk7Ci0gICAgICAgIGFjay5hY2tub3dsZWRnZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2Vudi1zZXR1cC10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9lbnYvc2V0dXAvbWVzc2FnaW5nL0thZmthU2VuZGVyLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtc2V0dXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svZW52L3NldHVwL21lc3NhZ2luZy9LYWZrYVNlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2Y2NDk5Li4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2Vudi1zZXR1cC10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9lbnYvc2V0dXAvbWVzc2FnaW5nL0thZmthU2VuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suZW52LnNldHVwLm1lc3NhZ2luZzsKLQotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthLmNvcmUuS2Fma2FUZW1wbGF0ZTsKLQotLyoqCi0gKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKLSAqCi0gKiBAYXV0aG9yIGRpbXV0aHUKLSAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAotICovCi1wdWJsaWMgY2xhc3MgS2Fma2FTZW5kZXIgewotCi0gICAgQEF1dG93aXJlZAotICAgIHByaXZhdGUgS2Fma2FUZW1wbGF0ZTxTdHJpbmcsIFN0cmluZz4ga2Fma2FUZW1wbGF0ZTsKLQotICAgIHB1YmxpYyB2b2lkIHNlbmQoU3RyaW5nIHRvcGljLCBTdHJpbmcgcGF5bG9hZCkgewotICAgICAgICBrYWZrYVRlbXBsYXRlLnNlbmQodG9waWMsIHBheWxvYWQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmQoU3RyaW5nIHRvcGljLCBTdHJpbmcga2V5LCBTdHJpbmcgcGF5bG9hZCkgewotICAgICAgICBrYWZrYVRlbXBsYXRlLnNlbmQodG9waWMsIGtleSwgcGF5bG9hZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LXNldHVwLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2Vudi9zZXR1cC9tZXNzYWdpbmcvU2VuZGVyQ29uZmlnLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtc2V0dXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svZW52L3NldHVwL21lc3NhZ2luZy9TZW5kZXJDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U4Yjk3NS4uMDAwMDAwMAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtc2V0dXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svZW52L3NldHVwL21lc3NhZ2luZy9TZW5kZXJDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5lbnYuc2V0dXAubWVzc2FnaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5rYWZrYS5jbGllbnRzLnByb2R1Y2VyLlByb2R1Y2VyQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUua2Fma2EuY29tbW9uLnNlcmlhbGl6YXRpb24uU3RyaW5nU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5WYWx1ZTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5CZWFuOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb3JlLkRlZmF1bHRLYWZrYVByb2R1Y2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthLmNvcmUuS2Fma2FUZW1wbGF0ZTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthLmNvcmUuUHJvZHVjZXJGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKLSAqCi0gKiBAYXV0aG9yIGRpbXV0aHUKLSAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAotICovCi1AQ29uZmlndXJhdGlvbgotcHVibGljIGNsYXNzIFNlbmRlckNvbmZpZyB7Ci0gICAgQFZhbHVlKCIke2thZmthLmJvb3RzdHJhcC1zZXJ2ZXJzfSIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgYm9vdHN0cmFwU2VydmVyczsKLQotICAgIEBCZWFuCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvZHVjZXJDb25maWdzKCkgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICAvLyBsaXN0IG9mIGhvc3Q6cG9ydCBwYWlycyB1c2VkIGZvciBlc3RhYmxpc2hpbmcgdGhlIGluaXRpYWwgY29ubmVjdGlvbnMgdG8gdGhlIEtha2ZhIGNsdXN0ZXIKLSAgICAgICAgcHJvcHMucHV0KFByb2R1Y2VyQ29uZmlnLkJPT1RTVFJBUF9TRVJWRVJTX0NPTkZJRywgYm9vdHN0cmFwU2VydmVycyk7Ci0gICAgICAgIHByb3BzLnB1dChQcm9kdWNlckNvbmZpZy5LRVlfU0VSSUFMSVpFUl9DTEFTU19DT05GSUcsIFN0cmluZ1NlcmlhbGl6ZXIuY2xhc3MpOwotICAgICAgICBwcm9wcy5wdXQoUHJvZHVjZXJDb25maWcuVkFMVUVfU0VSSUFMSVpFUl9DTEFTU19DT05GSUcsIFN0cmluZ1NlcmlhbGl6ZXIuY2xhc3MpOwotICAgICAgICByZXR1cm4gcHJvcHM7Ci0gICAgfQotCi0gICAgQEJlYW4KLSAgICBwdWJsaWMgUHJvZHVjZXJGYWN0b3J5PFN0cmluZywgU3RyaW5nPiBwcm9kdWNlckZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEthZmthUHJvZHVjZXJGYWN0b3J5PFN0cmluZywgU3RyaW5nPihwcm9kdWNlckNvbmZpZ3MoKSk7Ci0gICAgfQotCi0gICAgQEJlYW4KLSAgICBwdWJsaWMgS2Fma2FUZW1wbGF0ZTxTdHJpbmcsIFN0cmluZz4ga2Fma2FUZW1wbGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBLYWZrYVRlbXBsYXRlPD4ocHJvZHVjZXJGYWN0b3J5KCkpOwotICAgIH0KLQotICAgIEBCZWFuCi0gICAgcHVibGljIEthZmthU2VuZGVyIGthZmthU2VuZGVyKCkgewotICAgICAgICByZXR1cm4gbmV3IEthZmthU2VuZGVyKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LXNldHVwLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2Vudi9zZXR1cC9zZXJ2aWNlL1Rhc2tFeGVjdXRpb25TZXJ2aWNlLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtc2V0dXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svZW52L3NldHVwL3NlcnZpY2UvVGFza0V4ZWN1dGlvblNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyYzJkYS4uMDAwMDAwMAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtc2V0dXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svZW52L3NldHVwL3NlcnZpY2UvVGFza0V4ZWN1dGlvblNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suZW52LnNldHVwLnNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLmNvbXB1dGUuQ29tcHV0ZVJlc291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay5UYXNrUGFyYW1SZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLnRhc2suVGFza1Jlc291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay5UYXNrU3RhdHVzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuY29tcHV0ZS5hcGkuQ29tcHV0ZU9wZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuY29tcHV0ZS5hcGkuRXhlY3V0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmNvbXB1dGUuaW1wbC5Nb2NrQ29tcHV0ZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5jb21wdXRlLmltcGwuU1NIQ29tcHV0ZU9wZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5lbnYuc2V0dXAubWVzc2FnaW5nLkthZmthU2VuZGVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLlZhbHVlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNsaWVudC5SZXN0VGVtcGxhdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKLQotLyoqCi0gKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKLSAqCi0gKiBAYXV0aG9yIGRpbXV0aHUKLSAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAotICovCi1AU2VydmljZQotcHVibGljIGNsYXNzIFRhc2tFeGVjdXRpb25TZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMTApOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSZXN0VGVtcGxhdGUgcmVzdFRlbXBsYXRlOwotICAgIHByaXZhdGUgZmluYWwgS2Fma2FTZW5kZXIga2Fma2FTZW5kZXI7Ci0KLSAgICBAVmFsdWUoIiR7YXBpLnNlcnZlci51cmx9IikKLSAgICBwcml2YXRlIFN0cmluZyBhcGlTZXJ2ZXJVcmw7Ci0KLSAgICBAVmFsdWUoIiR7dGFzay5ldmVudC50b3BpYy5uYW1lfSIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFza0V2ZW50UHVibGlzaFRvcGljOwotCi0gICAgcHVibGljIFRhc2tFeGVjdXRpb25TZXJ2aWNlKFJlc3RUZW1wbGF0ZSByZXN0VGVtcGxhdGUsIEthZmthU2VuZGVyIGthZmthU2VuZGVyKSB7Ci0gICAgICAgIHRoaXMucmVzdFRlbXBsYXRlID0gcmVzdFRlbXBsYXRlOwotICAgICAgICB0aGlzLmthZmthU2VuZGVyID0ga2Fma2FTZW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZVRhc2tBc3luYyhsb25nIHRhc2tJZCkgewotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhlY3V0aW5nIHRhc2sgIiArIHRhc2tJZCArICIgYXMgZW52IHNldHVwIHRhc2siKTsKLSAgICAgICAgVGFza1Jlc291cmNlIHRhc2tSZXNvdXJjZSA9IHRoaXMucmVzdFRlbXBsYXRlLmdldEZvck9iamVjdCgiaHR0cDovLyIgKyBhcGlTZXJ2ZXJVcmwgKyAiL3Rhc2svIiArIHRhc2tJZCwgVGFza1Jlc291cmNlLmNsYXNzKTsKLQotICAgICAgICBwdWJsaXNoVGFza1N0YXR1cyh0YXNrUmVzb3VyY2UuZ2V0UGFyZW50UHJvY2Vzc0lkKCksIHRhc2tSZXNvdXJjZS5nZXRJZCgpLCBUYXNrU3RhdHVzUmVzb3VyY2UuU3RhdGUuU0NIRURVTEVEKTsKLQotICAgICAgICB0aGlzLmV4ZWN1dG9yU2VydmljZS5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGV4ZWN1dGVUYXNrKHRhc2tSZXNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVUYXNrKFRhc2tSZXNvdXJjZSB0YXNrUmVzb3VyY2UpIHsKLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICBPcHRpb25hbDxUYXNrUGFyYW1SZXNvdXJjZT4gY29tbWFuZFBhcmFtID0gdGFza1Jlc291cmNlLmdldFRhc2tQYXJhbXMoKQotICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih0YXNrUGFyYW1SZXNvdXJjZSAtPiAiY29tbWFuZCIuZXF1YWxzKHRhc2tQYXJhbVJlc291cmNlLmdldEtleSgpKSkKLSAgICAgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpOwotCi0gICAgICAgICAgICBPcHRpb25hbDxUYXNrUGFyYW1SZXNvdXJjZT4gY29tcHV0ZUlkID0gdGFza1Jlc291cmNlLmdldFRhc2tQYXJhbXMoKQotICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih0YXNrUGFyYW1SZXNvdXJjZSAtPiAiY29tcHV0ZS1pZCIuZXF1YWxzKHRhc2tQYXJhbVJlc291cmNlLmdldEtleSgpKSkKLSAgICAgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpOwotCi0gICAgICAgICAgICBPcHRpb25hbDxUYXNrUGFyYW1SZXNvdXJjZT4gZXhwZXJpbWVudERhdGFEaXIgPSB0YXNrUmVzb3VyY2UuZ2V0VGFza1BhcmFtcygpCi0gICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHRhc2tQYXJhbVJlc291cmNlIC0+ICJleHAtZGF0YS1kaXIiLmVxdWFscyh0YXNrUGFyYW1SZXNvdXJjZS5nZXRLZXkoKSkpCi0gICAgICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHByb2Nlc3NEYXRhRGlyZWN0b3J5ID0gZXhwZXJpbWVudERhdGFEaXIKLSAgICAgICAgICAgICAgICAgICAgLm9yRWxzZVRocm93KCgpIC0+IG5ldyBFeGNlcHRpb24oImV4cC1kYXRhLWRpciBwYXJhbSBjYW4gbm90IGJlIGZvdW5kIGluIHRoZSBwYXJhbXMgb2YgdGFzayAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrUmVzb3VyY2UuZ2V0SWQoKSkpLmdldFZhbHVlKCkgKyAiLyIgKyB0YXNrUmVzb3VyY2UuZ2V0UGFyZW50UHJvY2Vzc0lkKCk7Ci0KLSAgICAgICAgICAgIGNvbW1hbmRQYXJhbS5pZlByZXNlbnQodGFza1BhcmFtUmVzb3VyY2UgLT4gewotICAgICAgICAgICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSB0YXNrUGFyYW1SZXNvdXJjZS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gY29tbWFuZC5yZXBsYWNlKCJ7cHJvY2Vzcy1kYXRhLWRpcn0iLCBwcm9jZXNzRGF0YURpcmVjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhlY3V0aW5nIGNvbW1hbmQgIiArIGNvbW1hbmQpOwotCi0gICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHRhc2tSZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSwgdGFza1Jlc291cmNlLmdldElkKCksIFRhc2tTdGF0dXNSZXNvdXJjZS5TdGF0ZS5FWEVDVVRJTkcpOwotCi0gICAgICAgICAgICAgICAgICAgIENvbXB1dGVSZXNvdXJjZSBjb21wdXRlUmVzb3VyY2UgPSB0aGlzLnJlc3RUZW1wbGF0ZS5nZXRGb3JPYmplY3QoImh0dHA6Ly8iICsgdGhpcy5hcGlTZXJ2ZXJVcmwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIvY29tcHV0ZS8iICsgTG9uZy5wYXJzZUxvbmcoY29tcHV0ZUlkLmdldCgpLmdldFZhbHVlKCkpLCBDb21wdXRlUmVzb3VyY2UuY2xhc3MpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gZmV0Y2ggdGhpcyBmcm9tIHRoZSBjYXRhbG9nCi0gICAgICAgICAgICAgICAgICAgIENvbXB1dGVPcGVyYXRpb25zIG9wZXJhdGlvbnM7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgiU1NIIi5lcXVhbHMoY29tcHV0ZVJlc291cmNlLmdldENvbW11bmljYXRpb25UeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zID0gbmV3IFNTSENvbXB1dGVPcGVyYXRpb25zKGNvbXB1dGVSZXNvdXJjZS5nZXRIb3N0KCksIGNvbXB1dGVSZXNvdXJjZS5nZXRVc2VyTmFtZSgpLCBjb21wdXRlUmVzb3VyY2UuZ2V0UGFzc3dvcmQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIk1vY2siLmVxdWFscyhjb21wdXRlUmVzb3VyY2UuZ2V0Q29tbXVuaWNhdGlvblR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMgPSBuZXcgTW9ja0NvbXB1dGVPcGVyYXRpb24oY29tcHV0ZVJlc291cmNlLmdldEhvc3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJObyBjb21wYXRpYmxlIGNvbW11bmljYXRpb24gbWV0aG9kIHsiICsgY29tcHV0ZVJlc291cmNlLmdldENvbW11bmljYXRpb25UeXBlKCkgKyAifSBub3QgZm91bmQgZm9yIGNvbXB1dGUgcmVzb3VyY2UgIiArIGNvbXB1dGVSZXNvdXJjZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uUmVzdWx0IGV4ZWN1dGlvblJlc3VsdCA9IG9wZXJhdGlvbnMuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb25SZXN1bHQuZ2V0RXhpdFN0YXR1cygpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHRhc2tSZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSwgdGFza1Jlc291cmNlLmdldElkKCksIFRhc2tTdGF0dXNSZXNvdXJjZS5TdGF0ZS5DT01QTEVURUQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4ZWN1dGlvblJlc3VsdC5nZXRFeGl0U3RhdHVzKCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHRhc2tSZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSwgdGFza1Jlc291cmNlLmdldElkKCksIFRhc2tTdGF0dXNSZXNvdXJjZS5TdGF0ZS5GQUlMRUQsICJQcm9jZXNzIGRpZG4ndCBleGl0IHN1Y2Nlc3NmdWxseSIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkZBSUxFRCwgIlByb2Nlc3MgZXhpdGVkIHdpdGggZXJyb3Igc3RhdHVzICIgKyBleGVjdXRpb25SZXN1bHQuZ2V0RXhpdFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkZBSUxFRCwgZS5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkZBSUxFRCwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHVibGlzaFRhc2tTdGF0dXMobG9uZyBwcm9jZXNzSWQsIGxvbmcgdGFza0lkLCBpbnQgc3RhdHVzKSB7Ci0gICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHByb2Nlc3NJZCwgdGFza0lkLCBzdGF0dXMsICIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwdWJsaXNoVGFza1N0YXR1cyhsb25nIHByb2Nlc3NJZCwgbG9uZyB0YXNrSWQsIGludCBzdGF0dXMsIFN0cmluZyByZWFzb24pIHsKLSAgICAgICAgdGhpcy5rYWZrYVNlbmRlci5zZW5kKHRoaXMudGFza0V2ZW50UHVibGlzaFRvcGljLCBwcm9jZXNzSWQgKyAiLSIgKyB0YXNrSWQsCi0gICAgICAgICAgICAgICAgcHJvY2Vzc0lkICsgIiwiICsgdGFza0lkICsgIiwiICsgc3RhdHVzICsgIiwiICsgcmVhc29uKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtc2V0dXAtdGFzay9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ucHJvcGVydGllcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2Vudi1zZXR1cC10YXNrL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWM4MGRlLi4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2Vudi1zZXR1cC10YXNrL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zZXJ2ZXIucG9ydCA9IDgzOTIKLWFwaS5zZXJ2ZXIudXJsID0gYXBpLXNlcnZlci5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsOjgwODAKLXRhc2suZ3JvdXAubmFtZSA9IGVudi1zZXR1cAotdGFzay5ldmVudC50b3BpYy5uYW1lID0gYWlyYXZhdGEtdGFzay1ldmVudAotdGFzay5yZWFkLnRvcGljLm5hbWUgPSBhaXJhdmF0YS10YXNrLWVudi1zZXR1cApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2Vudi1zZXR1cC10YXNrL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi55bWwgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtc2V0dXAtdGFzay9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ueW1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjlkZDYxLi4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2Vudi1zZXR1cC10YXNrL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi55bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWthZmthOgotICBib290c3RyYXAtc2VydmVyczoga2Fma2EuZGVmYXVsdC5zdmMuY2x1c3Rlci5sb2NhbDo5MDkyCi0gIHRvcGljOgotICAgIGhlbGxvd29ybGQ6IGhlbGxvd29ybGQudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2luZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9pbmdyZXNzL21lc3NhZ2luZy9LYWZrYVJlY2VpdmVyLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9pbmdyZXNzLXN0YWdpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svaW5ncmVzcy9tZXNzYWdpbmcvS2Fma2FSZWNlaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTJhZGQzLi4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2luZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9pbmdyZXNzL21lc3NhZ2luZy9LYWZrYVJlY2VpdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suaW5ncmVzcy5tZXNzYWdpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmluZ3Jlc3Muc2VydmljZS5UYXNrRXhlY3V0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthLmFubm90YXRpb24uS2Fma2FMaXN0ZW5lcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthLnN1cHBvcnQuQWNrbm93bGVkZ21lbnQ7Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOwotCi0vKioKLSAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQotICoKLSAqIEBhdXRob3IgZGltdXRodQotICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCi0gKi8KLXB1YmxpYyBjbGFzcyBLYWZrYVJlY2VpdmVyIHsKLQotICAgIEBSZXNvdXJjZQotICAgIHByaXZhdGUgVGFza0V4ZWN1dGlvblNlcnZpY2UgdGFza0V4ZWN1dGlvblNlcnZpY2U7Ci0KLSAgICBAS2Fma2FMaXN0ZW5lcih0b3BpY3MgPSAiJHt0YXNrLnJlYWQudG9waWMubmFtZX0iKQotICAgIHB1YmxpYyB2b2lkIHJlY2VpdmVUYXNrcyhTdHJpbmcgcGF5bG9hZCwgQWNrbm93bGVkZ21lbnQgYWNrKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVjZWl2ZWQgdGFzaz0iICsgcGF5bG9hZCk7Ci0gICAgICAgIHRhc2tFeGVjdXRpb25TZXJ2aWNlLmV4ZWN1dGVUYXNrQXN5bmMoTG9uZy5wYXJzZUxvbmcocGF5bG9hZCkpOwotICAgICAgICBhY2suYWNrbm93bGVkZ2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9pbmdyZXNzLXN0YWdpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svaW5ncmVzcy9tZXNzYWdpbmcvS2Fma2FTZW5kZXIuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2luZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9pbmdyZXNzL21lc3NhZ2luZy9LYWZrYVNlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjBiN2MxLi4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2luZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9pbmdyZXNzL21lc3NhZ2luZy9LYWZrYVNlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmluZ3Jlc3MubWVzc2FnaW5nOwotCi1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EuY29yZS5LYWZrYVRlbXBsYXRlOwotCi0vKioKLSAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQotICoKLSAqIEBhdXRob3IgZGltdXRodQotICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCi0gKi8KLXB1YmxpYyBjbGFzcyBLYWZrYVNlbmRlciB7Ci0KLSAgICBAQXV0b3dpcmVkCi0gICAgcHJpdmF0ZSBLYWZrYVRlbXBsYXRlPFN0cmluZywgU3RyaW5nPiBrYWZrYVRlbXBsYXRlOwotCi0gICAgcHVibGljIHZvaWQgc2VuZChTdHJpbmcgdG9waWMsIFN0cmluZyBwYXlsb2FkKSB7Ci0gICAgICAgIGthZmthVGVtcGxhdGUuc2VuZCh0b3BpYywgcGF5bG9hZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZChTdHJpbmcgdG9waWMsIFN0cmluZyBrZXksIFN0cmluZyBwYXlsb2FkKSB7Ci0gICAgICAgIGthZmthVGVtcGxhdGUuc2VuZCh0b3BpYywga2V5LCBwYXlsb2FkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9pbmdyZXNzLXN0YWdpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svaW5ncmVzcy9tZXNzYWdpbmcvUmVjZWl2ZXJDb25maWcuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2luZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9pbmdyZXNzL21lc3NhZ2luZy9SZWNlaXZlckNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmJiM2Y5Li4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2luZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9pbmdyZXNzL21lc3NhZ2luZy9SZWNlaXZlckNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmluZ3Jlc3MubWVzc2FnaW5nOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5rYWZrYS5jbGllbnRzLmNvbnN1bWVyLkNvbnN1bWVyQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUua2Fma2EuY29tbW9uLnNlcmlhbGl6YXRpb24uU3RyaW5nRGVzZXJpYWxpemVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLlZhbHVlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkJlYW47Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthLmFubm90YXRpb24uRW5hYmxlS2Fma2E7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb25maWcuQ29uY3VycmVudEthZmthTGlzdGVuZXJDb250YWluZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EuY29uZmlnLkthZmthTGlzdGVuZXJDb250YWluZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EuY29yZS5Db25zdW1lckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb3JlLkRlZmF1bHRLYWZrYUNvbnN1bWVyRmFjdG9yeTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthLmxpc3RlbmVyLkFic3RyYWN0TWVzc2FnZUxpc3RlbmVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EubGlzdGVuZXIuQ29uY3VycmVudE1lc3NhZ2VMaXN0ZW5lckNvbnRhaW5lcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCi0gKgotICogQGF1dGhvciBkaW11dGh1Ci0gKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKLSAqLwotQENvbmZpZ3VyYXRpb24KLUBFbmFibGVLYWZrYQotcHVibGljIGNsYXNzIFJlY2VpdmVyQ29uZmlnIHsKLQotICAgIEBWYWx1ZSgiJHtrYWZrYS5ib290c3RyYXAtc2VydmVyc30iKQotICAgIHByaXZhdGUgU3RyaW5nIGJvb3RzdHJhcFNlcnZlcnM7Ci0KLSAgICBAVmFsdWUoIiR7dGFzay5ncm91cC5uYW1lfSIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFza0dyb3VwTmFtZTsKLQotICAgIEBCZWFuCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gY29uc3VtZXJDb25maWdzKCkgewotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICAvLyBsaXN0IG9mIGhvc3Q6cG9ydCBwYWlycyB1c2VkIGZvciBlc3RhYmxpc2hpbmcgdGhlIGluaXRpYWwgY29ubmVjdGlvbnMgdG8gdGhlIEtha2ZhIGNsdXN0ZXIKLSAgICAgICAgcHJvcHMucHV0KENvbnN1bWVyQ29uZmlnLkJPT1RTVFJBUF9TRVJWRVJTX0NPTkZJRywgYm9vdHN0cmFwU2VydmVycyk7Ci0gICAgICAgIHByb3BzLnB1dChDb25zdW1lckNvbmZpZy5LRVlfREVTRVJJQUxJWkVSX0NMQVNTX0NPTkZJRywgU3RyaW5nRGVzZXJpYWxpemVyLmNsYXNzKTsKLSAgICAgICAgcHJvcHMucHV0KENvbnN1bWVyQ29uZmlnLlZBTFVFX0RFU0VSSUFMSVpFUl9DTEFTU19DT05GSUcsIFN0cmluZ0Rlc2VyaWFsaXplci5jbGFzcyk7Ci0gICAgICAgIC8vIGFsbG93cyBhIHBvb2wgb2YgcHJvY2Vzc2VzIHRvIGRpdmlkZSB0aGUgd29yayBvZiBjb25zdW1pbmcgYW5kIHByb2Nlc3NpbmcgcmVjb3JkcwotICAgICAgICBwcm9wcy5wdXQoQ29uc3VtZXJDb25maWcuR1JPVVBfSURfQ09ORklHLCB0YXNrR3JvdXBOYW1lKTsKLSAgICAgICAgcHJvcHMucHV0KENvbnN1bWVyQ29uZmlnLkVOQUJMRV9BVVRPX0NPTU1JVF9DT05GSUcsIGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIHByb3BzOwotICAgIH0KLQotICAgIEBCZWFuCi0gICAgcHVibGljIENvbnN1bWVyRmFjdG9yeTxTdHJpbmcsIFN0cmluZz4gY29uc3VtZXJGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRLYWZrYUNvbnN1bWVyRmFjdG9yeTxTdHJpbmcsIFN0cmluZz4oY29uc3VtZXJDb25maWdzKCkpOwotICAgIH0KLQotICAgIEBCZWFuCi0gICAgcHVibGljIEthZmthTGlzdGVuZXJDb250YWluZXJGYWN0b3J5PENvbmN1cnJlbnRNZXNzYWdlTGlzdGVuZXJDb250YWluZXI8U3RyaW5nLCBTdHJpbmc+PiBrYWZrYUxpc3RlbmVyQ29udGFpbmVyRmFjdG9yeSgpIHsKLSAgICAgICAgQ29uY3VycmVudEthZmthTGlzdGVuZXJDb250YWluZXJGYWN0b3J5PFN0cmluZywgU3RyaW5nPiBmYWN0b3J5ID0KLSAgICAgICAgICAgICAgICBuZXcgQ29uY3VycmVudEthZmthTGlzdGVuZXJDb250YWluZXJGYWN0b3J5PD4oKTsKLSAgICAgICAgZmFjdG9yeS5zZXRDb25zdW1lckZhY3RvcnkoY29uc3VtZXJGYWN0b3J5KCkpOwotICAgICAgICBmYWN0b3J5LmdldENvbnRhaW5lclByb3BlcnRpZXMoKS5zZXRBY2tNb2RlKEFic3RyYWN0TWVzc2FnZUxpc3RlbmVyQ29udGFpbmVyLkFja01vZGUuTUFOVUFMX0lNTUVESUFURSk7Ci0gICAgICAgIHJldHVybiBmYWN0b3J5OwotICAgIH0KLQotICAgIEBCZWFuCi0gICAgcHVibGljIEthZmthUmVjZWl2ZXIgcmVjZWl2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgS2Fma2FSZWNlaXZlcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2luZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9pbmdyZXNzL3NlcnZpY2UvVGFza0V4ZWN1dGlvblNlcnZpY2UuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2luZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9pbmdyZXNzL3NlcnZpY2UvVGFza0V4ZWN1dGlvblNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZhZmE4MS4uMDAwMDAwMAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9pbmdyZXNzLXN0YWdpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svaW5ncmVzcy9zZXJ2aWNlL1Rhc2tFeGVjdXRpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmluZ3Jlc3Muc2VydmljZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay5UYXNrUGFyYW1SZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLnRhc2suVGFza1Jlc291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay5UYXNrU3RhdHVzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuY29tcHV0ZS5hcGkuQ29tcHV0ZU9wZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuY29tcHV0ZS5pbXBsLk1vY2tDb21wdXRlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suaW5ncmVzcy5tZXNzYWdpbmcuS2Fma2FTZW5kZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uVmFsdWU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb3JlLmlvLkNsYXNzUGF0aFJlc291cmNlOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29yZS5pby5GaWxlU3lzdGVtUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5odHRwLio7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay51dGlsLkxpbmtlZE11bHRpVmFsdWVNYXA7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY2xpZW50LlJlc3RUZW1wbGF0ZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKLQotLyoqCi0gKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKLSAqCi0gKiBAYXV0aG9yIGRpbXV0aHUKLSAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAotICovCi1AU2VydmljZQotcHVibGljIGNsYXNzIFRhc2tFeGVjdXRpb25TZXJ2aWNlIHsKLQotICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMTApOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSZXN0VGVtcGxhdGUgcmVzdFRlbXBsYXRlOwotICAgIHByaXZhdGUgZmluYWwgS2Fma2FTZW5kZXIga2Fma2FTZW5kZXI7Ci0KLSAgICBAVmFsdWUoIiR7YXBpLnNlcnZlci51cmx9IikKLSAgICBwcml2YXRlIFN0cmluZyBhcGlTZXJ2ZXJVcmw7Ci0KLSAgICBAVmFsdWUoIiR7dGFzay5ldmVudC50b3BpYy5uYW1lfSIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFza0V2ZW50UHVibGlzaFRvcGljOwotCi0gICAgcHVibGljIFRhc2tFeGVjdXRpb25TZXJ2aWNlKFJlc3RUZW1wbGF0ZSByZXN0VGVtcGxhdGUsIEthZmthU2VuZGVyIGthZmthU2VuZGVyKSB7Ci0gICAgICAgIHRoaXMucmVzdFRlbXBsYXRlID0gcmVzdFRlbXBsYXRlOwotICAgICAgICB0aGlzLmthZmthU2VuZGVyID0ga2Fma2FTZW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZVRhc2tBc3luYyhsb25nIHRhc2tJZCkgewotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhlY3V0aW5nIHRhc2sgIiArIHRhc2tJZCArICIgYXMgaW5ncmVzcyB0YXNrIik7Ci0gICAgICAgIFRhc2tSZXNvdXJjZSB0YXNrUmVzb3VyY2UgPSB0aGlzLnJlc3RUZW1wbGF0ZS5nZXRGb3JPYmplY3QoImh0dHA6Ly8iICsgYXBpU2VydmVyVXJsICsgIi90YXNrLyIgKyB0YXNrSWQsIFRhc2tSZXNvdXJjZS5jbGFzcyk7Ci0KLSAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLlNDSEVEVUxFRCk7Ci0KLSAgICAgICAgdGhpcy5leGVjdXRvclNlcnZpY2UuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBleGVjdXRlVGFzayh0YXNrUmVzb3VyY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlVGFzayhUYXNrUmVzb3VyY2UgdGFza1Jlc291cmNlKSB7Ci0KLSAgICAgICAgT3B0aW9uYWw8VGFza1BhcmFtUmVzb3VyY2U+IHNvdXJjZVBhcmFtID0gdGFza1Jlc291cmNlLmdldFRhc2tQYXJhbXMoKQotICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgIC5maWx0ZXIodGFza1BhcmFtUmVzb3VyY2UgLT4gInNvdXJjZSIuZXF1YWxzKHRhc2tQYXJhbVJlc291cmNlLmdldEtleSgpKSkKLSAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCk7Ci0KLSAgICAgICAgT3B0aW9uYWw8VGFza1BhcmFtUmVzb3VyY2U+IHRhcmdldFBhcmFtID0gdGFza1Jlc291cmNlLmdldFRhc2tQYXJhbXMoKQotICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgIC5maWx0ZXIodGFza1BhcmFtUmVzb3VyY2UgLT4gInRhcmdldCIuZXF1YWxzKHRhc2tQYXJhbVJlc291cmNlLmdldEtleSgpKSkKLSAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCk7Ci0KLSAgICAgICAgT3B0aW9uYWw8VGFza1BhcmFtUmVzb3VyY2U+IGNvbXB1dGVOYW1lID0gdGFza1Jlc291cmNlLmdldFRhc2tQYXJhbXMoKQotICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgIC5maWx0ZXIodGFza1BhcmFtUmVzb3VyY2UgLT4gImNvbXB1dGUtbmFtZSIuZXF1YWxzKHRhc2tQYXJhbVJlc291cmNlLmdldEtleSgpKSkKLSAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCk7Ci0KLSAgICAgICAgaWYgKHNvdXJjZVBhcmFtLmlzUHJlc2VudCgpKSB7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0UGFyYW0uaXNQcmVzZW50KCkpIHsKLSAgICAgICAgICAgICAgICBwdWJsaXNoVGFza1N0YXR1cyh0YXNrUmVzb3VyY2UuZ2V0UGFyZW50UHJvY2Vzc0lkKCksIHRhc2tSZXNvdXJjZS5nZXRJZCgpLCBUYXNrU3RhdHVzUmVzb3VyY2UuU3RhdGUuRVhFQ1VUSU5HKTsKLSAgICAgICAgICAgICAgICBDb21wdXRlT3BlcmF0aW9ucyBjb21wdXRlT3BlcmF0aW9ucyA9IG5ldyBNb2NrQ29tcHV0ZU9wZXJhdGlvbihjb21wdXRlTmFtZS5nZXQoKS5nZXRWYWx1ZSgpKTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXB1dGVPcGVyYXRpb25zLnRyYW5zZmVyRGF0YUluKHNvdXJjZVBhcmFtLmdldCgpLmdldFZhbHVlKCksIHRhcmdldFBhcmFtLmdldCgpLmdldFZhbHVlKCksICJTQ1AiKTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkNPTVBMRVRFRCk7Ci0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHRhc2tSZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSwgdGFza1Jlc291cmNlLmdldElkKCksIFRhc2tTdGF0dXNSZXNvdXJjZS5TdGF0ZS5GQUlMRUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTb3VyY2UgY2FuIG5vdCBiZSBudWxsIGZvciB0YXNrICIgKyB0YXNrUmVzb3VyY2UuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkZBSUxFRCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNvdXJjZSBjYW4gbm90IGJlIG51bGwgZm9yIHRhc2sgIiArIHRhc2tSZXNvdXJjZS5nZXRJZCgpKTsKLSAgICAgICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHRhc2tSZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSwgdGFza1Jlc291cmNlLmdldElkKCksIFRhc2tTdGF0dXNSZXNvdXJjZS5TdGF0ZS5GQUlMRUQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHVibGlzaFRhc2tTdGF0dXMobG9uZyBwcm9jZXNzSWQsIGxvbmcgdGFza0lkLCBpbnQgc3RhdHVzKSB7Ci0gICAgICAgIHRoaXMua2Fma2FTZW5kZXIuc2VuZCh0aGlzLnRhc2tFdmVudFB1Ymxpc2hUb3BpYywgcHJvY2Vzc0lkICsgIi0iICsgdGFza0lkLAotICAgICAgICAgICAgICAgIHByb2Nlc3NJZCArICIsIiArIHRhc2tJZCArICIsIiArIHN0YXR1cyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvaW5ncmVzcy1zdGFnaW5nLXRhc2svc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnltbCBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2luZ3Jlc3Mtc3RhZ2luZy10YXNrL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi55bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OWRkNjEuLjAwMDAwMDAKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvaW5ncmVzcy1zdGFnaW5nLXRhc2svc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnltbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAota2Fma2E6Ci0gIGJvb3RzdHJhcC1zZXJ2ZXJzOiBrYWZrYS5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsOjkwOTIKLSAgdG9waWM6Ci0gICAgaGVsbG93b3JsZDogaGVsbG93b3JsZC50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3Mvam9iLXN1Ym1pc3Npb24tdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svam9iL21lc3NhZ2luZy9LYWZrYVNlbmRlci5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3Mvam9iLXN1Ym1pc3Npb24tdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svam9iL21lc3NhZ2luZy9LYWZrYVNlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTVhZGExLi4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2pvYi1zdWJtaXNzaW9uLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2pvYi9tZXNzYWdpbmcvS2Fma2FTZW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKgotICoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5qb2IubWVzc2FnaW5nOwotCi1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EuY29yZS5LYWZrYVRlbXBsYXRlOwotCi0vKioKLSAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQotICoKLSAqIEBhdXRob3IgZGltdXRodQotICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCi0gKi8KLXB1YmxpYyBjbGFzcyBLYWZrYVNlbmRlciB7Ci0KLSAgICBAQXV0b3dpcmVkCi0gICAgcHJpdmF0ZSBLYWZrYVRlbXBsYXRlPFN0cmluZywgU3RyaW5nPiBrYWZrYVRlbXBsYXRlOwotCi0gICAgcHVibGljIHZvaWQgc2VuZChTdHJpbmcgdG9waWMsIFN0cmluZyBwYXlsb2FkKSB7Ci0gICAgICAgIGthZmthVGVtcGxhdGUuc2VuZCh0b3BpYywgcGF5bG9hZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZChTdHJpbmcgdG9waWMsIFN0cmluZyBrZXksIFN0cmluZyBwYXlsb2FkKSB7Ci0gICAgICAgIGthZmthVGVtcGxhdGUuc2VuZCh0b3BpYywga2V5LCBwYXlsb2FkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9qb2Itc3VibWlzc2lvbi10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9qb2IvbWVzc2FnaW5nL1JlY2VpdmVyQ29uZmlnLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9qb2Itc3VibWlzc2lvbi10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9qb2IvbWVzc2FnaW5nL1JlY2VpdmVyQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNjllY2YuLjAwMDAwMDAKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3Mvam9iLXN1Ym1pc3Npb24tdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svam9iL21lc3NhZ2luZy9SZWNlaXZlckNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmpvYi5tZXNzYWdpbmc7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmthZmthLmNsaWVudHMuY29uc3VtZXIuQ29uc3VtZXJDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VyaWFsaXphdGlvbi5TdHJpbmdEZXNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uVmFsdWU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EuYW5ub3RhdGlvbi5FbmFibGVLYWZrYTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthLmNvbmZpZy5Db25jdXJyZW50S2Fma2FMaXN0ZW5lckNvbnRhaW5lckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb25maWcuS2Fma2FMaXN0ZW5lckNvbnRhaW5lckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb3JlLkNvbnN1bWVyRmFjdG9yeTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthLmNvcmUuRGVmYXVsdEthZmthQ29uc3VtZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EubGlzdGVuZXIuQWJzdHJhY3RNZXNzYWdlTGlzdGVuZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5saXN0ZW5lci5Db25jdXJyZW50TWVzc2FnZUxpc3RlbmVyQ29udGFpbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKLSAqCi0gKiBAYXV0aG9yIGRpbXV0aHUKLSAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAotICovCi1AQ29uZmlndXJhdGlvbgotQEVuYWJsZUthZmthCi1wdWJsaWMgY2xhc3MgUmVjZWl2ZXJDb25maWcgewotCi0gICAgQFZhbHVlKCIke2thZmthLmJvb3RzdHJhcC1zZXJ2ZXJzfSIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgYm9vdHN0cmFwU2VydmVyczsKLQotICAgIEBWYWx1ZSgiJHt0YXNrLmdyb3VwLm5hbWV9IikKLSAgICBwcml2YXRlIFN0cmluZyB0YXNrR3JvdXBOYW1lOwotCi0gICAgQEJlYW4KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBjb25zdW1lckNvbmZpZ3MoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIC8vIGxpc3Qgb2YgaG9zdDpwb3J0IHBhaXJzIHVzZWQgZm9yIGVzdGFibGlzaGluZyB0aGUgaW5pdGlhbCBjb25uZWN0aW9ucyB0byB0aGUgS2FrZmEgY2x1c3RlcgotICAgICAgICBwcm9wcy5wdXQoQ29uc3VtZXJDb25maWcuQk9PVFNUUkFQX1NFUlZFUlNfQ09ORklHLCBib290c3RyYXBTZXJ2ZXJzKTsKLSAgICAgICAgcHJvcHMucHV0KENvbnN1bWVyQ29uZmlnLktFWV9ERVNFUklBTElaRVJfQ0xBU1NfQ09ORklHLCBTdHJpbmdEZXNlcmlhbGl6ZXIuY2xhc3MpOwotICAgICAgICBwcm9wcy5wdXQoQ29uc3VtZXJDb25maWcuVkFMVUVfREVTRVJJQUxJWkVSX0NMQVNTX0NPTkZJRywgU3RyaW5nRGVzZXJpYWxpemVyLmNsYXNzKTsKLSAgICAgICAgLy8gYWxsb3dzIGEgcG9vbCBvZiBwcm9jZXNzZXMgdG8gZGl2aWRlIHRoZSB3b3JrIG9mIGNvbnN1bWluZyBhbmQgcHJvY2Vzc2luZyByZWNvcmRzCi0gICAgICAgIHByb3BzLnB1dChDb25zdW1lckNvbmZpZy5HUk9VUF9JRF9DT05GSUcsIHRhc2tHcm91cE5hbWUpOwotICAgICAgICBwcm9wcy5wdXQoQ29uc3VtZXJDb25maWcuRU5BQkxFX0FVVE9fQ09NTUlUX0NPTkZJRywgZmFsc2UpOwotICAgICAgICByZXR1cm4gcHJvcHM7Ci0gICAgfQotCi0gICAgQEJlYW4KLSAgICBwdWJsaWMgQ29uc3VtZXJGYWN0b3J5PFN0cmluZywgU3RyaW5nPiBjb25zdW1lckZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEthZmthQ29uc3VtZXJGYWN0b3J5PFN0cmluZywgU3RyaW5nPihjb25zdW1lckNvbmZpZ3MoKSk7Ci0gICAgfQotCi0gICAgQEJlYW4KLSAgICBwdWJsaWMgS2Fma2FMaXN0ZW5lckNvbnRhaW5lckZhY3Rvcnk8Q29uY3VycmVudE1lc3NhZ2VMaXN0ZW5lckNvbnRhaW5lcjxTdHJpbmcsIFN0cmluZz4+IGthZmthTGlzdGVuZXJDb250YWluZXJGYWN0b3J5KCkgewotICAgICAgICBDb25jdXJyZW50S2Fma2FMaXN0ZW5lckNvbnRhaW5lckZhY3Rvcnk8U3RyaW5nLCBTdHJpbmc+IGZhY3RvcnkgPQotICAgICAgICAgICAgICAgIG5ldyBDb25jdXJyZW50S2Fma2FMaXN0ZW5lckNvbnRhaW5lckZhY3Rvcnk8PigpOwotICAgICAgICBmYWN0b3J5LnNldENvbnN1bWVyRmFjdG9yeShjb25zdW1lckZhY3RvcnkoKSk7Ci0gICAgICAgIGZhY3RvcnkuZ2V0Q29udGFpbmVyUHJvcGVydGllcygpLnNldEFja01vZGUoQWJzdHJhY3RNZXNzYWdlTGlzdGVuZXJDb250YWluZXIuQWNrTW9kZS5NQU5VQUxfSU1NRURJQVRFKTsKLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgQEJlYW4KLSAgICBwdWJsaWMgS2Fma2FSZWNlaXZlciByZWNlaXZlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBLYWZrYVJlY2VpdmVyKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2pvYi1zdWJtaXNzaW9uLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2pvYi9tZXNzYWdpbmcvU2VuZGVyQ29uZmlnLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9qb2Itc3VibWlzc2lvbi10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9qb2IvbWVzc2FnaW5nL1NlbmRlckNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGE0ODkwLi4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2pvYi1zdWJtaXNzaW9uLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2pvYi9tZXNzYWdpbmcvU2VuZGVyQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suam9iLm1lc3NhZ2luZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUua2Fma2EuY2xpZW50cy5wcm9kdWNlci5Qcm9kdWNlckNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLmthZmthLmNvbW1vbi5zZXJpYWxpemF0aW9uLlN0cmluZ1NlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uVmFsdWU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQmVhbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EuY29yZS5EZWZhdWx0S2Fma2FQcm9kdWNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb3JlLkthZmthVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb3JlLlByb2R1Y2VyRmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCi0gKgotICogQGF1dGhvciBkaW11dGh1Ci0gKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKLSAqLwotQENvbmZpZ3VyYXRpb24KLXB1YmxpYyBjbGFzcyBTZW5kZXJDb25maWcgewotICAgIEBWYWx1ZSgiJHtrYWZrYS5ib290c3RyYXAtc2VydmVyc30iKQotICAgIHByaXZhdGUgU3RyaW5nIGJvb3RzdHJhcFNlcnZlcnM7Ci0KLSAgICBAQmVhbgotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb2R1Y2VyQ29uZmlncygpIHsKLSAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgLy8gbGlzdCBvZiBob3N0OnBvcnQgcGFpcnMgdXNlZCBmb3IgZXN0YWJsaXNoaW5nIHRoZSBpbml0aWFsIGNvbm5lY3Rpb25zIHRvIHRoZSBLYWtmYSBjbHVzdGVyCi0gICAgICAgIHByb3BzLnB1dChQcm9kdWNlckNvbmZpZy5CT09UU1RSQVBfU0VSVkVSU19DT05GSUcsIGJvb3RzdHJhcFNlcnZlcnMpOwotICAgICAgICBwcm9wcy5wdXQoUHJvZHVjZXJDb25maWcuS0VZX1NFUklBTElaRVJfQ0xBU1NfQ09ORklHLCBTdHJpbmdTZXJpYWxpemVyLmNsYXNzKTsKLSAgICAgICAgcHJvcHMucHV0KFByb2R1Y2VyQ29uZmlnLlZBTFVFX1NFUklBTElaRVJfQ0xBU1NfQ09ORklHLCBTdHJpbmdTZXJpYWxpemVyLmNsYXNzKTsKLSAgICAgICAgcmV0dXJuIHByb3BzOwotICAgIH0KLQotICAgIEBCZWFuCi0gICAgcHVibGljIFByb2R1Y2VyRmFjdG9yeTxTdHJpbmcsIFN0cmluZz4gcHJvZHVjZXJGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRLYWZrYVByb2R1Y2VyRmFjdG9yeTxTdHJpbmcsIFN0cmluZz4ocHJvZHVjZXJDb25maWdzKCkpOwotICAgIH0KLQotICAgIEBCZWFuCi0gICAgcHVibGljIEthZmthVGVtcGxhdGU8U3RyaW5nLCBTdHJpbmc+IGthZmthVGVtcGxhdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgS2Fma2FUZW1wbGF0ZTw+KHByb2R1Y2VyRmFjdG9yeSgpKTsKLSAgICB9Ci0KLSAgICBAQmVhbgotICAgIHB1YmxpYyBLYWZrYVNlbmRlciBrYWZrYVNlbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBLYWZrYVNlbmRlcigpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2pvYi1zdWJtaXNzaW9uLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2pvYi9zZXJ2aWNlL1Rhc2tFeGVjdXRpb25TZXJ2aWNlLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9qb2Itc3VibWlzc2lvbi10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9qb2Ivc2VydmljZS9UYXNrRXhlY3V0aW9uU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmVkYmQ5Li4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2pvYi1zdWJtaXNzaW9uLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2pvYi9zZXJ2aWNlL1Rhc2tFeGVjdXRpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmpvYi5zZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy5jb21wdXRlLkNvbXB1dGVSZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLnRhc2suVGFza1BhcmFtUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLlRhc2tSZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLnRhc2suVGFza1N0YXR1c1Jlc291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmNvbXB1dGUuYXBpLkNvbXB1dGVPcGVyYXRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmNvbXB1dGUuYXBpLkV4ZWN1dGlvblJlc3VsdDsKLWltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5jb21wdXRlLmltcGwuTW9ja0NvbXB1dGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuY29tcHV0ZS5pbXBsLlNTSENvbXB1dGVPcGVyYXRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suam9iLm1lc3NhZ2luZy5LYWZrYVNlbmRlcjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5WYWx1ZTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jbGllbnQuUmVzdFRlbXBsYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7Ci0KLS8qKgotICogVE9ETzogQ2xhc3MgbGV2ZWwgY29tbWVudHMgcGxlYXNlCi0gKgotICogQGF1dGhvciBkaW11dGh1Ci0gKiBAc2luY2UgMS4wLjAtU05BUFNIT1QKLSAqLwotQFNlcnZpY2UKLXB1YmxpYyBjbGFzcyBUYXNrRXhlY3V0aW9uU2VydmljZSB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDEwKTsKLQotICAgIHByaXZhdGUgZmluYWwgUmVzdFRlbXBsYXRlIHJlc3RUZW1wbGF0ZTsKLSAgICBwcml2YXRlIGZpbmFsIEthZmthU2VuZGVyIGthZmthU2VuZGVyOwotCi0gICAgQFZhbHVlKCIke2FwaS5zZXJ2ZXIudXJsfSIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgYXBpU2VydmVyVXJsOwotCi0gICAgQFZhbHVlKCIke3Rhc2suZXZlbnQudG9waWMubmFtZX0iKQotICAgIHByaXZhdGUgU3RyaW5nIHRhc2tFdmVudFB1Ymxpc2hUb3BpYzsKLQotICAgIHB1YmxpYyBUYXNrRXhlY3V0aW9uU2VydmljZShSZXN0VGVtcGxhdGUgcmVzdFRlbXBsYXRlLCBLYWZrYVNlbmRlciBrYWZrYVNlbmRlcikgewotICAgICAgICB0aGlzLnJlc3RUZW1wbGF0ZSA9IHJlc3RUZW1wbGF0ZTsKLSAgICAgICAgdGhpcy5rYWZrYVNlbmRlciA9IGthZmthU2VuZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVUYXNrQXN5bmMobG9uZyB0YXNrSWQpIHsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4ZWN1dGluZyB0YXNrICIgKyB0YXNrSWQgKyAiIGFzIGpvYiBzdWJtaXNzaW9uIHRhc2siKTsKLSAgICAgICAgVGFza1Jlc291cmNlIHRhc2tSZXNvdXJjZSA9IHRoaXMucmVzdFRlbXBsYXRlLmdldEZvck9iamVjdCgiaHR0cDovLyIgKyBhcGlTZXJ2ZXJVcmwgKyAiL3Rhc2svIiArIHRhc2tJZCwgVGFza1Jlc291cmNlLmNsYXNzKTsKLQotICAgICAgICBwdWJsaXNoVGFza1N0YXR1cyh0YXNrUmVzb3VyY2UuZ2V0UGFyZW50UHJvY2Vzc0lkKCksIHRhc2tSZXNvdXJjZS5nZXRJZCgpLCBUYXNrU3RhdHVzUmVzb3VyY2UuU3RhdGUuU0NIRURVTEVEKTsKLQotICAgICAgICB0aGlzLmV4ZWN1dG9yU2VydmljZS5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIGV4ZWN1dGVUYXNrKHRhc2tSZXNvdXJjZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleGVjdXRlVGFzayhUYXNrUmVzb3VyY2UgdGFza1Jlc291cmNlKSB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9wdGlvbmFsPFRhc2tQYXJhbVJlc291cmNlPiBjb21tYW5kUGFyYW0gPSB0YXNrUmVzb3VyY2UuZ2V0VGFza1BhcmFtcygpCi0gICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHRhc2tQYXJhbVJlc291cmNlIC0+ICJjb21tYW5kIi5lcXVhbHModGFza1BhcmFtUmVzb3VyY2UuZ2V0S2V5KCkpKQotICAgICAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCk7Ci0gICAgICAgICAgICBPcHRpb25hbDxUYXNrUGFyYW1SZXNvdXJjZT4gYXJndW1lbnRzUGFyYW0gPSB0YXNrUmVzb3VyY2UuZ2V0VGFza1BhcmFtcygpCi0gICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHRhc2tQYXJhbVJlc291cmNlIC0+ICJhcmd1bWVudHMiLmVxdWFscyh0YXNrUGFyYW1SZXNvdXJjZS5nZXRLZXkoKSkpCi0gICAgICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKTsKLSAgICAgICAgICAgIE9wdGlvbmFsPFRhc2tQYXJhbVJlc291cmNlPiBjb21wdXRlSWQgPSB0YXNrUmVzb3VyY2UuZ2V0VGFza1BhcmFtcygpCi0gICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHRhc2tQYXJhbVJlc291cmNlIC0+ICJjb21wdXRlLWlkIi5lcXVhbHModGFza1BhcmFtUmVzb3VyY2UuZ2V0S2V5KCkpKQotICAgICAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCk7Ci0gICAgICAgICAgICBPcHRpb25hbDxUYXNrUGFyYW1SZXNvdXJjZT4gZXhwZXJpbWVudERhdGFEaXIgPSB0YXNrUmVzb3VyY2UuZ2V0VGFza1BhcmFtcygpCi0gICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHRhc2tQYXJhbVJlc291cmNlIC0+ICJleHAtZGF0YS1kaXIiLmVxdWFscyh0YXNrUGFyYW1SZXNvdXJjZS5nZXRLZXkoKSkpCi0gICAgICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKTsKLQotICAgICAgICAgICAgU3RyaW5nIHByb2Nlc3NEYXRhRGlyZWN0b3J5ID0gZXhwZXJpbWVudERhdGFEaXIKLSAgICAgICAgICAgICAgICAgICAgLm9yRWxzZVRocm93KCgpIC0+IG5ldyBFeGNlcHRpb24oImV4cC1kYXRhLWRpciBwYXJhbSBjYW4gbm90IGJlIGZvdW5kIHRoZSB0YXMgcGFyYW1zIG9mIHRhc2sgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza1Jlc291cmNlLmdldElkKCkpKS5nZXRWYWx1ZSgpICsgIi8iICsgdGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpOwotCi0KLSAgICAgICAgICAgIGNvbW1hbmRQYXJhbS5pZlByZXNlbnQodGFza1BhcmFtUmVzb3VyY2UgLT4gewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21tYW5kID0gdGFza1BhcmFtUmVzb3VyY2UuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQucmVwbGFjZSgie3Byb2Nlc3MtZGF0YS1kaXJ9IiwgcHJvY2Vzc0RhdGFEaXJlY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4ZWN1dGluZyBjb21tYW5kICIgKyBjb21tYW5kKTsKLQotICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNQYXJhbS5pZlByZXNlbnQodGFza0FyZ1BhcmFtUmVzb3VyY2UgLT4gewotICAgICAgICAgICAgICAgICAgICAgICAgdGFza0FyZ1BhcmFtUmVzb3VyY2Uuc2V0VmFsdWUodGFza0FyZ1BhcmFtUmVzb3VyY2UuZ2V0VmFsdWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgie3Byb2Nlc3MtZGF0YS1kaXJ9IiwgcHJvY2Vzc0RhdGFEaXJlY3RvcnkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2l0aCBhcmd1bWVudHMgIiArIHRhc2tBcmdQYXJhbVJlc291cmNlLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgICAgICAgICBwdWJsaXNoVGFza1N0YXR1cyh0YXNrUmVzb3VyY2UuZ2V0UGFyZW50UHJvY2Vzc0lkKCksIHRhc2tSZXNvdXJjZS5nZXRJZCgpLCBUYXNrU3RhdHVzUmVzb3VyY2UuU3RhdGUuRVhFQ1VUSU5HKTsKLQotICAgICAgICAgICAgICAgICAgICBDb21wdXRlUmVzb3VyY2UgY29tcHV0ZVJlc291cmNlID0gdGhpcy5yZXN0VGVtcGxhdGUuZ2V0Rm9yT2JqZWN0KCJodHRwOi8vIiArIHRoaXMuYXBpU2VydmVyVXJsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiL2NvbXB1dGUvIiArIExvbmcucGFyc2VMb25nKGNvbXB1dGVJZC5nZXQoKS5nZXRWYWx1ZSgpKSwgQ29tcHV0ZVJlc291cmNlLmNsYXNzKTsKLQotICAgICAgICAgICAgICAgICAgICBDb21wdXRlT3BlcmF0aW9ucyBvcGVyYXRpb25zOwotICAgICAgICAgICAgICAgICAgICBpZiAoIlNTSCIuZXF1YWxzKGNvbXB1dGVSZXNvdXJjZS5nZXRDb21tdW5pY2F0aW9uVHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9IG5ldyBTU0hDb21wdXRlT3BlcmF0aW9ucyhjb21wdXRlUmVzb3VyY2UuZ2V0SG9zdCgpLCBjb21wdXRlUmVzb3VyY2UuZ2V0VXNlck5hbWUoKSwgY29tcHV0ZVJlc291cmNlLmdldFBhc3N3b3JkKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJNb2NrIi5lcXVhbHMoY29tcHV0ZVJlc291cmNlLmdldENvbW11bmljYXRpb25UeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zID0gbmV3IE1vY2tDb21wdXRlT3BlcmF0aW9uKGNvbXB1dGVSZXNvdXJjZS5nZXRIb3N0KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gY29tcGF0aWJsZSBjb21tdW5pY2F0aW9uIG1ldGhvZCB7IiArIGNvbXB1dGVSZXNvdXJjZS5nZXRDb21tdW5pY2F0aW9uVHlwZSgpICsgIn0gbm90IGZvdW5kIGZvciBjb21wdXRlIHJlc291cmNlICIgKyBjb21wdXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIEV4ZWN1dGlvblJlc3VsdCBleGVjdXRpb25SZXN1bHQgPSBvcGVyYXRpb25zLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcmd1bWVudHNQYXJhbS5pc1ByZXNlbnQoKSA/IGFyZ3VtZW50c1BhcmFtLmdldCgpLmdldFZhbHVlKCkgOiAiIikpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb25SZXN1bHQuZ2V0RXhpdFN0YXR1cygpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHRhc2tSZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSwgdGFza1Jlc291cmNlLmdldElkKCksIFRhc2tTdGF0dXNSZXNvdXJjZS5TdGF0ZS5DT01QTEVURUQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4ZWN1dGlvblJlc3VsdC5nZXRFeGl0U3RhdHVzKCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHRhc2tSZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSwgdGFza1Jlc291cmNlLmdldElkKCksIFRhc2tTdGF0dXNSZXNvdXJjZS5TdGF0ZS5GQUlMRUQsICJQcm9jZXNzIGRpZG4ndCBleGl0IHN1Y2Nlc3NmdWxseSIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkZBSUxFRCwgIlByb2Nlc3MgZXhpdGVkIHdpdGggZXJyb3Igc3RhdHVzICIgKyBleGVjdXRpb25SZXN1bHQuZ2V0RXhpdFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFRhc2tTdGF0dXModGFza1Jlc291cmNlLmdldFBhcmVudFByb2Nlc3NJZCgpLCB0YXNrUmVzb3VyY2UuZ2V0SWQoKSwgVGFza1N0YXR1c1Jlc291cmNlLlN0YXRlLkZBSUxFRCwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHRhc2tSZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSwgdGFza1Jlc291cmNlLmdldElkKCksIFRhc2tTdGF0dXNSZXNvdXJjZS5TdGF0ZS5GQUlMRUQsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1Ymxpc2hUYXNrU3RhdHVzKGxvbmcgcHJvY2Vzc0lkLCBsb25nIHRhc2tJZCwgaW50IHN0YXR1cykgewotICAgICAgICBwdWJsaXNoVGFza1N0YXR1cyhwcm9jZXNzSWQsIHRhc2tJZCwgc3RhdHVzLCAiIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHVibGlzaFRhc2tTdGF0dXMobG9uZyBwcm9jZXNzSWQsIGxvbmcgdGFza0lkLCBpbnQgc3RhdHVzLCBTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIHRoaXMua2Fma2FTZW5kZXIuc2VuZCh0aGlzLnRhc2tFdmVudFB1Ymxpc2hUb3BpYywgcHJvY2Vzc0lkICsgIi0iICsgdGFza0lkLAotICAgICAgICAgICAgICAgIHByb2Nlc3NJZCArICIsIiArIHRhc2tJZCArICIsIiArIHN0YXR1cyArICIsIiArIHJlYXNvbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3Mvam9iLXN1Ym1pc3Npb24tdGFzay9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ueW1sIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3Mvam9iLXN1Ym1pc3Npb24tdGFzay9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ueW1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjlkZDYxLi4wMDAwMDAwCi0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2pvYi1zdWJtaXNzaW9uLXRhc2svc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnltbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAota2Fma2E6Ci0gIGJvb3RzdHJhcC1zZXJ2ZXJzOiBrYWZrYS5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsOjkwOTIKLSAgdG9waWM6Ci0gICAgaGVsbG93b3JsZDogaGVsbG93b3JsZC50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvd29ya2Zsb3ctZ2VuZXJhdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvb3JjaGVzdHJhdG9yL3NlcnZpY2UvRXhwZXJpbWVudExhdW5jaFNlcnZpY2UuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3dvcmtmbG93LWdlbmVyYXRvci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL29yY2hlc3RyYXRvci9zZXJ2aWNlL0V4cGVyaW1lbnRMYXVuY2hTZXJ2aWNlLmphdmEKaW5kZXggYjY3ZWRhOC4uZWU1ZTU5MSAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvd29ya2Zsb3ctZ2VuZXJhdG9yL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvb3JjaGVzdHJhdG9yL3NlcnZpY2UvRXhwZXJpbWVudExhdW5jaFNlcnZpY2UuamF2YQorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy93b3JrZmxvdy1nZW5lcmF0b3Ivc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy9vcmNoZXN0cmF0b3Ivc2VydmljZS9FeHBlcmltZW50TGF1bmNoU2VydmljZS5qYXZhCkBAIC0xMDIsNyArMTAyLDcgQEAKIAogICAgICAgICBMaXN0PFRhc2tSZXNvdXJjZT4gdGFza0RhZyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCi0gICAgICAgIEF0b21pY0ludGVnZXIgZGFnT3JkZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICAgICAgLypBdG9taWNJbnRlZ2VyIGRhZ09yZGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CiAKICAgICAgICAgVGFza1Jlc291cmNlIGRhdGFEaXJUYXNrUmVhc291cmNlID0gbmV3IFRhc2tSZXNvdXJjZSgpOwogICAgICAgICBkYXRhRGlyVGFza1JlYXNvdXJjZS5zZXRUYXNrVHlwZShUYXNrUmVzb3VyY2UuVGFza1R5cGVzLkVOVl9TRVRVUCk7CkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICAgICAgICAgICAgICBuZXcgVGFza1BhcmFtUmVzb3VyY2UoKS5zZXRLZXkoImNvbXB1dGUtaWQiKS5zZXRWYWx1ZShjb21wdXRlUmVzb3VyY2UuZ2V0SWQoKSArICIiKSwKICAgICAgICAgICAgICAgICBuZXcgVGFza1BhcmFtUmVzb3VyY2UoKS5zZXRLZXkoImNvbXB1dGUtbmFtZSIpLnNldFZhbHVlKGNvbXB1dGVSZXNvdXJjZS5nZXROYW1lKCkgKyAiIikpKTsKIAotICAgICAgICBkYXRhRGlyVGFza1JlYXNvdXJjZS5zZXRPcmRlcihkYWdPcmRlci5pbmNyZW1lbnRBbmRHZXQoKSk7CisgICAgICAgIGRhdGFEaXJUYXNrUmVhc291cmNlLnNldFJlZmVyZW5jZUlkKGRhZ09yZGVyLmluY3JlbWVudEFuZEdldCgpKTsKICAgICAgICAgdGFza0RhZy5hZGQoZGF0YURpclRhc2tSZWFzb3VyY2UpOwogCiAgICAgICAgIE9wdGlvbmFsLm9mTnVsbGFibGUoYXBwRGVwUmVzLmdldFByZUpvYkNvbW1hbmQoKSkuaWZQcmVzZW50KHByZUpvYiAtPiB7CkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbmV3IFRhc2tQYXJhbVJlc291cmNlKCkuc2V0S2V5KCJjb21tYW5kIikuc2V0VmFsdWUocHJlSm9iKSwKICAgICAgICAgICAgICAgICAgICAgbmV3IFRhc2tQYXJhbVJlc291cmNlKCkuc2V0S2V5KCJjb21wdXRlLWlkIikuc2V0VmFsdWUoY29tcHV0ZVJlc291cmNlLmdldElkKCkgKyAiIiksCiAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXNrUGFyYW1SZXNvdXJjZSgpLnNldEtleSgiY29tcHV0ZS1uYW1lIikuc2V0VmFsdWUoY29tcHV0ZVJlc291cmNlLmdldE5hbWUoKSArICIiKSkpOwotICAgICAgICAgICAgcmVzb3VyY2Uuc2V0T3JkZXIoZGFnT3JkZXIuaW5jcmVtZW50QW5kR2V0KCkpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0UmVmZXJlbmNlSWQoZGFnT3JkZXIuaW5jcmVtZW50QW5kR2V0KCkpOwogICAgICAgICAgICAgdGFza0RhZy5hZGQocmVzb3VyY2UpOwogICAgICAgICB9KTsKIApAQCAtMTUwLDcgKzE1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRhc2tQYXJhbVJlc291cmNlKCkuc2V0S2V5KCJ0YXJnZXQiKS5zZXRWYWx1ZShsb2NhbFBhdGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXNrUGFyYW1SZXNvdXJjZSgpLnNldEtleSgiY29tcHV0ZS1pZCIpLnNldFZhbHVlKGNvbXB1dGVSZXNvdXJjZS5nZXRJZCgpICsgIiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXNrUGFyYW1SZXNvdXJjZSgpLnNldEtleSgiY29tcHV0ZS1uYW1lIikuc2V0VmFsdWUoY29tcHV0ZVJlc291cmNlLmdldE5hbWUoKSArICIiKSkpOwotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5zZXRPcmRlcihkYWdPcmRlci5pbmNyZW1lbnRBbmRHZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLnNldFJlZmVyZW5jZUlkKGRhZ09yZGVyLmluY3JlbWVudEFuZEdldCgpKTsKIAogICAgICAgICAgICAgICAgICAgICBpbnB1dEFyZ3VtZW50LmFwcGVuZCgiICIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXhwSW5wLmdldEFyZ3VtZW50cygpICE9IG51bGwgJiYgIWV4cElucC5nZXRBcmd1bWVudHMoKS5pc0VtcHR5KCkpIHsKQEAgLTE4OSw3ICsxODksNyBAQAogICAgICAgICAgICAgICAgICAgICBuZXcgVGFza1BhcmFtUmVzb3VyY2UoKS5zZXRLZXkoImFyZ3VtZW50cyIpLnNldFZhbHVlKGlucHV0QXJndW1lbnQudG9TdHJpbmcoKSksCiAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXNrUGFyYW1SZXNvdXJjZSgpLnNldEtleSgiY29tcHV0ZS1pZCIpLnNldFZhbHVlKGNvbXB1dGVSZXNvdXJjZS5nZXRJZCgpICsgIiIpLAogICAgICAgICAgICAgICAgICAgICBuZXcgVGFza1BhcmFtUmVzb3VyY2UoKS5zZXRLZXkoImNvbXB1dGUtbmFtZSIpLnNldFZhbHVlKGNvbXB1dGVSZXNvdXJjZS5nZXROYW1lKCkgKyAiIikpKTsKLSAgICAgICAgICAgIHJlc291cmNlLnNldE9yZGVyKGRhZ09yZGVyLmluY3JlbWVudEFuZEdldCgpKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldFJlZmVyZW5jZUlkKGRhZ09yZGVyLmluY3JlbWVudEFuZEdldCgpKTsKICAgICAgICAgICAgIHRhc2tEYWcuYWRkKHJlc291cmNlKTsKICAgICAgICAgfSk7CiAKQEAgLTIwNSw3ICsyMDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRhc2tQYXJhbVJlc291cmNlKCkuc2V0S2V5KCJ0YXJnZXQiKS5zZXRWYWx1ZShleHBPdXQuZ2V0SWQoKSArICIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXNrUGFyYW1SZXNvdXJjZSgpLnNldEtleSgiY29tcHV0ZS1pZCIpLnNldFZhbHVlKGNvbXB1dGVSZXNvdXJjZS5nZXRJZCgpICsgIiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRhc2tQYXJhbVJlc291cmNlKCkuc2V0S2V5KCJjb21wdXRlLW5hbWUiKS5zZXRWYWx1ZShjb21wdXRlUmVzb3VyY2UuZ2V0TmFtZSgpICsgIiIpKSk7Ci0gICAgICAgICAgICAgICAgcmVzb3VyY2Uuc2V0T3JkZXIoZGFnT3JkZXIuaW5jcmVtZW50QW5kR2V0KCkpOworICAgICAgICAgICAgICAgIHJlc291cmNlLnNldFJlZmVyZW5jZUlkKGRhZ09yZGVyLmluY3JlbWVudEFuZEdldCgpKTsKICAgICAgICAgICAgICAgICB0YXNrRGFnLmFkZChyZXNvdXJjZSk7CiAgICAgICAgICAgICB9CiAKQEAgLTIyMCw3ICsyMjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRhc2tQYXJhbVJlc291cmNlKCkuc2V0S2V5KCJ0YXJnZXQiKS5zZXRWYWx1ZShleHBPdXQuZ2V0SWQoKSArICIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXNrUGFyYW1SZXNvdXJjZSgpLnNldEtleSgiY29tcHV0ZS1pZCIpLnNldFZhbHVlKGNvbXB1dGVSZXNvdXJjZS5nZXRJZCgpICsgIiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRhc2tQYXJhbVJlc291cmNlKCkuc2V0S2V5KCJjb21wdXRlLW5hbWUiKS5zZXRWYWx1ZShjb21wdXRlUmVzb3VyY2UuZ2V0TmFtZSgpICsgIiIpKSk7Ci0gICAgICAgICAgICAgICAgcmVzb3VyY2Uuc2V0T3JkZXIoZGFnT3JkZXIuaW5jcmVtZW50QW5kR2V0KCkpOworICAgICAgICAgICAgICAgIHJlc291cmNlLnNldFJlZmVyZW5jZUlkKGRhZ09yZGVyLmluY3JlbWVudEFuZEdldCgpKTsKICAgICAgICAgICAgICAgICB0YXNrRGFnLmFkZChyZXNvdXJjZSk7CiAgICAgICAgICAgICB9CiAKQEAgLTIzNSw3ICsyMzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRhc2tQYXJhbVJlc291cmNlKCkuc2V0S2V5KCJ0YXJnZXQiKS5zZXRWYWx1ZShleHBPdXQuZ2V0SWQoKSArICIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXNrUGFyYW1SZXNvdXJjZSgpLnNldEtleSgiY29tcHV0ZS1pZCIpLnNldFZhbHVlKGNvbXB1dGVSZXNvdXJjZS5nZXRJZCgpICsgIiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRhc2tQYXJhbVJlc291cmNlKCkuc2V0S2V5KCJjb21wdXRlLW5hbWUiKS5zZXRWYWx1ZShjb21wdXRlUmVzb3VyY2UuZ2V0TmFtZSgpICsgIiIpKSk7Ci0gICAgICAgICAgICAgICAgcmVzb3VyY2Uuc2V0T3JkZXIoZGFnT3JkZXIuaW5jcmVtZW50QW5kR2V0KCkpOworICAgICAgICAgICAgICAgIHJlc291cmNlLnNldFJlZmVyZW5jZUlkKGRhZ09yZGVyLmluY3JlbWVudEFuZEdldCgpKTsKICAgICAgICAgICAgICAgICB0YXNrRGFnLmFkZChyZXNvdXJjZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pKTsKQEAgLTI1MCw5ICsyNTAsOSBAQAogICAgICAgICAgICAgICAgICAgICBuZXcgVGFza1BhcmFtUmVzb3VyY2UoKS5zZXRLZXkoImNvbW1hbmQiKS5zZXRWYWx1ZShwb3N0Sm9iKSwKICAgICAgICAgICAgICAgICAgICAgbmV3IFRhc2tQYXJhbVJlc291cmNlKCkuc2V0S2V5KCJjb21wdXRlLWlkIikuc2V0VmFsdWUoY29tcHV0ZVJlc291cmNlLmdldElkKCkgKyAiIiksCiAgICAgICAgICAgICAgICAgICAgIG5ldyBUYXNrUGFyYW1SZXNvdXJjZSgpLnNldEtleSgiY29tcHV0ZS1uYW1lIikuc2V0VmFsdWUoY29tcHV0ZVJlc291cmNlLmdldE5hbWUoKSArICIiKSkpOwotICAgICAgICAgICAgcmVzb3VyY2Uuc2V0T3JkZXIoZGFnT3JkZXIuaW5jcmVtZW50QW5kR2V0KCkpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0UmVmZXJlbmNlSWQoZGFnT3JkZXIuaW5jcmVtZW50QW5kR2V0KCkpOwogICAgICAgICAgICAgdGFza0RhZy5hZGQocmVzb3VyY2UpOwotICAgICAgICB9KTsKKyAgICAgICAgfSk7Ki8KIAogICAgICAgICByZXR1cm4gdGFza0RhZzsKICAgICB9CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvdGFzay1hcGkvcG9tLnhtbCBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy90YXNrLWFwaS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNjIxZmMKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvdGFzay1hcGkvcG9tLnhtbApAQCAtMCwwICsxLDU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8cGFyZW50PgorICAgICAgICA8YXJ0aWZhY3RJZD5haXJhdmF0YS1rdWJlcm5ldGVzPC9hcnRpZmFjdElkPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFpcmF2YXRhPC9ncm91cElkPgorICAgICAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxhcnRpZmFjdElkPnRhc2stYXBpPC9hcnRpZmFjdElkPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFpcmF2YXRhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXBpLXJlc291cmNlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5haXJhdmF0YTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbXB1dGUtcmVzb3VyY2UtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yay5ib290PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJvb3Qtc3RhcnRlci13ZWI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrLmJvb3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYm9vdC1zdGFydGVyLWZyZWVtYXJrZXI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWthZmthPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuNS4xPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7amF2YS52ZXJzaW9ufTwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PiR7amF2YS52ZXJzaW9ufTwvdGFyZ2V0PgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy90YXNrLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svYXBpL0Fic3RyYWN0VGFza0V4ZWN1dGlvblNlcnZpY2UuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy90YXNrLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svYXBpL0Fic3RyYWN0VGFza0V4ZWN1dGlvblNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjk1OGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL3Rhc2stYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9hcGkvQWJzdHJhY3RUYXNrRXhlY3V0aW9uU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suYXBpOworCitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy5jb21wdXRlLkNvbXB1dGVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLnRhc2suVGFza0lucHV0UmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuYXBpLnJlc291cmNlcy50YXNrLlRhc2tSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy5hcGkucmVzb3VyY2VzLnRhc2suVGFza1N0YXR1c1Jlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmFwaS5yZXNvdXJjZXMudGFzay50eXBlLlRhc2tUeXBlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuY29tcHV0ZS5hcGkuQ29tcHV0ZU9wZXJhdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMuY29tcHV0ZS5pbXBsLk1vY2tDb21wdXRlT3BlcmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLmNvbXB1dGUuaW1wbC5TU0hDb21wdXRlT3BlcmF0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmFwaS5tZXNzYWdpbmcuS2Fma2FTZW5kZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uVmFsdWU7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY2xpZW50LlJlc3RUZW1wbGF0ZTsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUYXNrRXhlY3V0aW9uU2VydmljZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2U7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlc3RUZW1wbGF0ZSByZXN0VGVtcGxhdGU7CisgICAgcHJpdmF0ZSBmaW5hbCBLYWZrYVNlbmRlciBrYWZrYVNlbmRlcjsKKworICAgIEBWYWx1ZSgiJHthcGkuc2VydmVyLnVybH0iKQorICAgIHByaXZhdGUgU3RyaW5nIGFwaVNlcnZlclVybDsKKworICAgIEBWYWx1ZSgiJHt0YXNrLmV2ZW50LnRvcGljLm5hbWV9IikKKyAgICBwcml2YXRlIFN0cmluZyB0YXNrRXZlbnRQdWJsaXNoVG9waWM7CisKKyAgICBwdWJsaWMgQWJzdHJhY3RUYXNrRXhlY3V0aW9uU2VydmljZShSZXN0VGVtcGxhdGUgcmVzdFRlbXBsYXRlLCBLYWZrYVNlbmRlciBrYWZrYVNlbmRlciwgaW50IGNvbmN1cnJlbnRUYXNrcykgeworICAgICAgICB0aGlzLnJlc3RUZW1wbGF0ZSA9IHJlc3RUZW1wbGF0ZTsKKyAgICAgICAgdGhpcy5rYWZrYVNlbmRlciA9IGthZmthU2VuZGVyOworICAgICAgICBleGVjdXRvclNlcnZpY2UgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKGNvbmN1cnJlbnRUYXNrcyk7CisgICAgfQorCisgICAgQFBvc3RDb25zdHJ1Y3QKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgeworICAgICAgICBnZXRSZXN0VGVtcGxhdGUoKS5wb3N0Rm9yT2JqZWN0KCJodHRwOi8vIiArIGFwaVNlcnZlclVybCArICIvdGFza1R5cGUiLCBnZXRUeXBlKCksIExvbmcuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrVHlwZVJlc291cmNlIGdldFR5cGUoKTsKKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVUYXNrQXN5bmMoVGFza0NvbnRleHQgdGFza0NvbnRleHQpIHsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4ZWN1dGluZyB0YXNrICIgKyB0YXNrQ29udGV4dC5nZXRUYXNrSWQoKSk7CisgICAgICAgIFRhc2tSZXNvdXJjZSB0YXNrUmVzb3VyY2UgPSB0aGlzLnJlc3RUZW1wbGF0ZS5nZXRGb3JPYmplY3QoImh0dHA6Ly8iICsgYXBpU2VydmVyVXJsICsgIi90YXNrLyIgKyB0YXNrQ29udGV4dC5nZXRUYXNrSWQoKSwgVGFza1Jlc291cmNlLmNsYXNzKTsKKworICAgICAgICBwdWJsaXNoVGFza1N0YXR1cyh0YXNrUmVzb3VyY2UuZ2V0UGFyZW50UHJvY2Vzc0lkKCksIHRhc2tSZXNvdXJjZS5nZXRJZCgpLCBUYXNrU3RhdHVzUmVzb3VyY2UuU3RhdGUuU0NIRURVTEVEKTsKKworICAgICAgICB0aGlzLmV4ZWN1dG9yU2VydmljZS5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZVBhcmFtZXRlcnModGFza1Jlc291cmNlLCB0YXNrQ29udGV4dCk7CisgICAgICAgICAgICAgICAgZXhlY3V0ZVRhc2sodGFza1Jlc291cmNlLCB0YXNrQ29udGV4dCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlIHNpbGVudGx5IGFzIHRoaXMgaXMgYWxyZWFkeSBoYW5kbGVkCisgICAgICAgICAgICAgICAgLy8gVE9ETyBhZGQgYSBuZXcgZXhjZXB0aW9uIHR5cGUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIENvbXB1dGVPcGVyYXRpb25zIGZldGNoQ29tcHV0ZVJlc291cmNlT3BlcmF0aW9uKENvbXB1dGVSZXNvdXJjZSBjb21wdXRlUmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb21wdXRlT3BlcmF0aW9ucyBvcGVyYXRpb25zOworICAgICAgICBpZiAoIlNTSCIuZXF1YWxzKGNvbXB1dGVSZXNvdXJjZS5nZXRDb21tdW5pY2F0aW9uVHlwZSgpKSkgeworICAgICAgICAgICAgb3BlcmF0aW9ucyA9IG5ldyBTU0hDb21wdXRlT3BlcmF0aW9ucyhjb21wdXRlUmVzb3VyY2UuZ2V0SG9zdCgpLCBjb21wdXRlUmVzb3VyY2UuZ2V0VXNlck5hbWUoKSwgY29tcHV0ZVJlc291cmNlLmdldFBhc3N3b3JkKCkpOworICAgICAgICB9IGVsc2UgaWYgKCJNb2NrIi5lcXVhbHMoY29tcHV0ZVJlc291cmNlLmdldENvbW11bmljYXRpb25UeXBlKCkpKSB7CisgICAgICAgICAgICBvcGVyYXRpb25zID0gbmV3IE1vY2tDb21wdXRlT3BlcmF0aW9uKGNvbXB1dGVSZXNvdXJjZS5nZXRIb3N0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gY29tcGF0aWJsZSBjb21tdW5pY2F0aW9uIG1ldGhvZCB7IiArIGNvbXB1dGVSZXNvdXJjZS5nZXRDb21tdW5pY2F0aW9uVHlwZSgpICsgIn0gbm90IGZvdW5kIGZvciBjb21wdXRlIHJlc291cmNlICIgKyBjb21wdXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3BlcmF0aW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGZpbmRJbnB1dChUYXNrUmVzb3VyY2UgdGFza1Jlc291cmNlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBvcHRpb25hbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgT3B0aW9uYWw8VGFza0lucHV0UmVzb3VyY2U+IGlucHV0UmVzb3VyY2UgPSB0YXNrUmVzb3VyY2UuZ2V0SW5wdXRzKCkKKyAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKGlucHV0IC0+IG5hbWUuZXF1YWxzKGlucHV0LmdldFZhbHVlKCkpKQorICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKTsKKworICAgICAgICBpZiAoaW5wdXRSZXNvdXJjZS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0UmVzb3VyY2UuZ2V0KCkuZ2V0VmFsdWUoKTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFvcHRpb25hbCkgeworICAgICAgICAgICAgICAgIHB1Ymxpc2hUYXNrU3RhdHVzKHRhc2tSZXNvdXJjZS5nZXRQYXJlbnRQcm9jZXNzSWQoKSwgdGFza1Jlc291cmNlLmdldElkKCksIFRhc2tTdGF0dXNSZXNvdXJjZS5TdGF0ZS5GQUlMRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICsgIiBpcyBub3QgYXZhaWxhYmxlIGluIGlucHV0cyIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24obmFtZSArICIgaXMgbm90IGF2YWlsYWJsZSBpbiBpbnB1dHMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplUGFyYW1ldGVycyhUYXNrUmVzb3VyY2UgdGFza1Jlc291cmNlLCBUYXNrQ29udGV4dCB0YXNrQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbjsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlVGFzayhUYXNrUmVzb3VyY2UgdGFza1Jlc291cmNlLCBUYXNrQ29udGV4dCB0YXNrQ29udGV4dCk7CisKKyAgICBwdWJsaWMgdm9pZCBwdWJsaXNoVGFza1N0YXR1cyhsb25nIHByb2Nlc3NJZCwgbG9uZyB0YXNrSWQsIGludCBzdGF0dXMpIHsKKyAgICAgICAgcHVibGlzaFRhc2tTdGF0dXMocHJvY2Vzc0lkLCB0YXNrSWQsIHN0YXR1cywgIiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1Ymxpc2hUYXNrU3RhdHVzKGxvbmcgcHJvY2Vzc0lkLCBsb25nIHRhc2tJZCwgaW50IHN0YXR1cywgU3RyaW5nIHJlYXNvbikgeworICAgICAgICB0aGlzLmthZmthU2VuZGVyLnNlbmQodGhpcy50YXNrRXZlbnRQdWJsaXNoVG9waWMsIHByb2Nlc3NJZCArICItIiArIHRhc2tJZCwKKyAgICAgICAgICAgICAgICBwcm9jZXNzSWQgKyAiLCIgKyB0YXNrSWQgKyAiLCIgKyBzdGF0dXMgKyAiLCIgKyByZWFzb24pOworICAgIH0KKworICAgIHB1YmxpYyBSZXN0VGVtcGxhdGUgZ2V0UmVzdFRlbXBsYXRlKCkgeworICAgICAgICByZXR1cm4gcmVzdFRlbXBsYXRlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBpU2VydmVyVXJsKCkgeworICAgICAgICByZXR1cm4gYXBpU2VydmVyVXJsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy90YXNrLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svYXBpL1Rhc2tDb250ZXh0LmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvdGFzay1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2FwaS9UYXNrQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZGY4YWYKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvdGFzay1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2FwaS9UYXNrQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK3B1YmxpYyBjbGFzcyBUYXNrQ29udGV4dCB7CisKKyAgICBwcml2YXRlIGxvbmcgdGFza0lkOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBjb250ZXh0VmFyaWFibGVQYXJhbXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbnRleHREYXRhUGFyYW1zID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBsb2NhbENvbnRleHQgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICBwdWJsaWMgbG9uZyBnZXRUYXNrSWQoKSB7CisgICAgICAgIHJldHVybiB0YXNrSWQ7CisgICAgfQorCisgICAgcHVibGljIFRhc2tDb250ZXh0IHNldFRhc2tJZChsb25nIHRhc2tJZCkgeworICAgICAgICB0aGlzLnRhc2tJZCA9IHRhc2tJZDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0Q29udGV4dFZhcmlhYmxlUGFyYW1zKCkgeworICAgICAgICByZXR1cm4gY29udGV4dFZhcmlhYmxlUGFyYW1zOworICAgIH0KKworICAgIHB1YmxpYyBUYXNrQ29udGV4dCBzZXRDb250ZXh0VmFyaWFibGVQYXJhbXMoTWFwPFN0cmluZywgU3RyaW5nPiBjb250ZXh0VmFyaWFibGVQYXJhbXMpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0VmFyaWFibGVQYXJhbXMgPSBjb250ZXh0VmFyaWFibGVQYXJhbXM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldENvbnRleHREYXRhUGFyYW1zKCkgeworICAgICAgICByZXR1cm4gY29udGV4dERhdGFQYXJhbXM7CisgICAgfQorCisgICAgcHVibGljIFRhc2tDb250ZXh0IHNldENvbnRleHREYXRhUGFyYW1zKE1hcDxTdHJpbmcsIFN0cmluZz4gY29udGV4dERhdGFQYXJhbXMpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0RGF0YVBhcmFtcyA9IGNvbnRleHREYXRhUGFyYW1zOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRMb2NhbENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBsb2NhbENvbnRleHQ7CisgICAgfQorCisgICAgcHVibGljIFRhc2tDb250ZXh0IHNldExvY2FsQ29udGV4dChNYXA8U3RyaW5nLCBPYmplY3Q+IGxvY2FsQ29udGV4dCkgeworICAgICAgICB0aGlzLmxvY2FsQ29udGV4dCA9IGxvY2FsQ29udGV4dDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL3Rhc2stYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9hcGkvVGFza0NvbnRleHREZXNlcmlhbGl6ZXIuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy90YXNrLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svYXBpL1Rhc2tDb250ZXh0RGVzZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0Y2UyZQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy90YXNrLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svYXBpL1Rhc2tDb250ZXh0RGVzZXJpYWxpemVyLmphdmEKQEAgLTAsMCArMSwyOSBAQAorcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmFwaTsKKworaW1wb3J0IG9yZy5hcGFjaGUua2Fma2EuY29tbW9uLnNlcmlhbGl6YXRpb24uRGVzZXJpYWxpemVyOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBUT0RPOiBDbGFzcyBsZXZlbCBjb21tZW50cyBwbGVhc2UKKyAqCisgKiBAYXV0aG9yIGRpbXV0aHUKKyAqIEBzaW5jZSAxLjAuMC1TTkFQU0hPVAorICovCitwdWJsaWMgY2xhc3MgVGFza0NvbnRleHREZXNlcmlhbGl6ZXIgaW1wbGVtZW50cyBEZXNlcmlhbGl6ZXI8VGFza0NvbnRleHQ+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShNYXA8U3RyaW5nLCA/PiBjb25maWdzLCBib29sZWFuIGlzS2V5KSB7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGFza0NvbnRleHQgZGVzZXJpYWxpemUoU3RyaW5nIHRvcGljLCBieXRlW10gZGF0YSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy90YXNrLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svYXBpL1Rhc2tDb250ZXh0U2VyaWFsaXplci5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL3Rhc2stYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9hcGkvVGFza0NvbnRleHRTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0Yzc2MgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy90YXNrLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svYXBpL1Rhc2tDb250ZXh0U2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5hcGk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmthZmthLmNvbW1vbi5zZXJpYWxpemF0aW9uLlNlcmlhbGl6ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRPRE86IENsYXNzIGxldmVsIGNvbW1lbnRzIHBsZWFzZQorICoKKyAqIEBhdXRob3IgZGltdXRodQorICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCisgKi8KK3B1YmxpYyBjbGFzcyBUYXNrQ29udGV4dFNlcmlhbGl6ZXIgaW1wbGVtZW50cyBTZXJpYWxpemVyPFRhc2tDb250ZXh0PiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKE1hcDxTdHJpbmcsID8+IGNvbmZpZ3MsIGJvb2xlYW4gaXNLZXkpIHsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBieXRlW10gc2VyaWFsaXplKFN0cmluZyB0b3BpYywgVGFza0NvbnRleHQgZGF0YSkgeworICAgICAgICByZXR1cm4gbmV3IGJ5dGVbMF07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9qb2Itc3VibWlzc2lvbi10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9qb2IvbWVzc2FnaW5nL0thZmthUmVjZWl2ZXIuamF2YSBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy90YXNrLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svYXBpL21lc3NhZ2luZy9LYWZrYVJlY2VpdmVyLmphdmEKc2ltaWxhcml0eSBpbmRleCA3MyUKcmVuYW1lIGZyb20gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3Mvam9iLXN1Ym1pc3Npb24tdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svam9iL21lc3NhZ2luZy9LYWZrYVJlY2VpdmVyLmphdmEKcmVuYW1lIHRvIGFpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy90YXNrLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svYXBpL21lc3NhZ2luZy9LYWZrYVJlY2VpdmVyLmphdmEKaW5kZXggNTc0YzA3NS4uYzM1OTdkYyAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3Mvam9iLXN1Ym1pc3Npb24tdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svam9iL21lc3NhZ2luZy9LYWZrYVJlY2VpdmVyLmphdmEKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL3Rhc2stYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9hcGkvbWVzc2FnaW5nL0thZmthUmVjZWl2ZXIuamF2YQpAQCAtMTcsOSArMTcsMTAgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suam9iLm1lc3NhZ2luZzsKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5hcGkubWVzc2FnaW5nOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5qb2Iuc2VydmljZS5UYXNrRXhlY3V0aW9uU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmFwaS5BYnN0cmFjdFRhc2tFeGVjdXRpb25TZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suYXBpLlRhc2tDb250ZXh0OwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2EuYW5ub3RhdGlvbi5LYWZrYUxpc3RlbmVyOwogaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsua2Fma2Euc3VwcG9ydC5BY2tub3dsZWRnbWVudDsKIApAQCAtMzQsMTIgKzM1LDEyIEBACiBwdWJsaWMgY2xhc3MgS2Fma2FSZWNlaXZlciB7CiAKICAgICBAUmVzb3VyY2UKLSAgICBwcml2YXRlIFRhc2tFeGVjdXRpb25TZXJ2aWNlIHRhc2tFeGVjdXRpb25TZXJ2aWNlOworICAgIHByaXZhdGUgQWJzdHJhY3RUYXNrRXhlY3V0aW9uU2VydmljZSB0YXNrRXhlY3V0aW9uU2VydmljZTsKIAogICAgIEBLYWZrYUxpc3RlbmVyKHRvcGljcyA9ICIke3Rhc2sucmVhZC50b3BpYy5uYW1lfSIpCi0gICAgcHVibGljIHZvaWQgcmVjZWl2ZVRhc2tzKFN0cmluZyBwYXlsb2FkLCBBY2tub3dsZWRnbWVudCBhY2spIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWNlaXZlZCB0YXNrPSIgKyBwYXlsb2FkKTsKLSAgICAgICAgdGFza0V4ZWN1dGlvblNlcnZpY2UuZXhlY3V0ZVRhc2tBc3luYyhMb25nLnBhcnNlTG9uZyhwYXlsb2FkKSk7CisgICAgcHVibGljIHZvaWQgcmVjZWl2ZVRhc2tzKFRhc2tDb250ZXh0IHRhc2tDb250ZXh0LCBBY2tub3dsZWRnbWVudCBhY2spIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWNlaXZlZCB0YXNrPSIgKyB0YXNrQ29udGV4dC50b1N0cmluZygpKTsKKyAgICAgICAgdGFza0V4ZWN1dGlvblNlcnZpY2UuZXhlY3V0ZVRhc2tBc3luYyh0YXNrQ29udGV4dCk7CiAgICAgICAgIGFjay5hY2tub3dsZWRnZSgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2Vudi1jbGVhbnVwLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2NsZWFudXAvbWVzc2FnaW5nL0thZmthU2VuZGVyLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvdGFzay1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2FwaS9tZXNzYWdpbmcvS2Fma2FTZW5kZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtY2xlYW51cC10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9jbGVhbnVwL21lc3NhZ2luZy9LYWZrYVNlbmRlci5qYXZhCnJlbmFtZSB0byBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvdGFzay1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2FwaS9tZXNzYWdpbmcvS2Fma2FTZW5kZXIuamF2YQppbmRleCA4MjkzZDMxLi4zMDcyMTVmIDEwMDY0NAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtY2xlYW51cC10YXNrL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9jbGVhbnVwL21lc3NhZ2luZy9LYWZrYVNlbmRlci5qYXZhCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy90YXNrLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svYXBpL21lc3NhZ2luZy9LYWZrYVNlbmRlci5qYXZhCkBAIC0xNyw3ICsxNyw3IEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmNsZWFudXAubWVzc2FnaW5nOworcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmFwaS5tZXNzYWdpbmc7CiAKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb3JlLkthZmthVGVtcGxhdGU7CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtc2V0dXAtdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svZW52L3NldHVwL21lc3NhZ2luZy9SZWNlaXZlckNvbmZpZy5qYXZhIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL3Rhc2stYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9hcGkvbWVzc2FnaW5nL1JlY2VpdmVyQ29uZmlnLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LXNldHVwLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2Vudi9zZXR1cC9tZXNzYWdpbmcvUmVjZWl2ZXJDb25maWcuamF2YQpyZW5hbWUgdG8gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL3Rhc2stYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9haXJhdmF0YS9rOHMvdGFzay9hcGkvbWVzc2FnaW5nL1JlY2VpdmVyQ29uZmlnLmphdmEKaW5kZXggYzI2Mzk1ZS4uYjA3OGE3OSAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LXNldHVwLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2Vudi9zZXR1cC9tZXNzYWdpbmcvUmVjZWl2ZXJDb25maWcuamF2YQorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvdGFzay1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2FwaS9tZXNzYWdpbmcvUmVjZWl2ZXJDb25maWcuamF2YQpAQCAtMTcsMTIgKzE3LDEzIEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmFpcmF2YXRhLms4cy50YXNrLmVudi5zZXR1cC5tZXNzYWdpbmc7CitwYWNrYWdlIG9yZy5hcGFjaGUuYWlyYXZhdGEuazhzLnRhc2suYXBpLm1lc3NhZ2luZzsKIAogaW1wb3J0IG9yZy5hcGFjaGUua2Fma2EuY2xpZW50cy5jb25zdW1lci5Db25zdW1lckNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmthZmthLmNvbW1vbi5zZXJpYWxpemF0aW9uLlN0cmluZ0Rlc2VyaWFsaXplcjsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5WYWx1ZTsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5CZWFuOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkNvbXBvbmVudFNjYW47CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQ29uZmlndXJhdGlvbjsKIGltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmthZmthLmFubm90YXRpb24uRW5hYmxlS2Fma2E7CiBpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5rYWZrYS5jb25maWcuQ29uY3VycmVudEthZmthTGlzdGVuZXJDb250YWluZXJGYWN0b3J5OwpAQCAtNDIsNiArNDMsNyBAQAogICogQHNpbmNlIDEuMC4wLVNOQVBTSE9UCiAgKi8KIEBDb25maWd1cmF0aW9uCitAQ29tcG9uZW50U2NhbgogQEVuYWJsZUthZmthCiBwdWJsaWMgY2xhc3MgUmVjZWl2ZXJDb25maWcgewogCmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9pbmdyZXNzLXN0YWdpbmctdGFzay9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svaW5ncmVzcy9tZXNzYWdpbmcvU2VuZGVyQ29uZmlnLmphdmEgYi9haXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvdGFzay1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2FwaS9tZXNzYWdpbmcvU2VuZGVyQ29uZmlnLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvaW5ncmVzcy1zdGFnaW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2luZ3Jlc3MvbWVzc2FnaW5nL1NlbmRlckNvbmZpZy5qYXZhCnJlbmFtZSB0byBhaXJhdmF0YS1rdWJlcm5ldGVzL21vZHVsZXMvdGFzay1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2FwaS9tZXNzYWdpbmcvU2VuZGVyQ29uZmlnLmphdmEKaW5kZXggOGE5ZWZiYi4uY2Q4YjU0YiAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy9tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvaW5ncmVzcy1zdGFnaW5nLXRhc2svc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FpcmF2YXRhL2s4cy90YXNrL2luZ3Jlc3MvbWVzc2FnaW5nL1NlbmRlckNvbmZpZy5qYXZhCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvbW9kdWxlcy90YXNrLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWlyYXZhdGEvazhzL3Rhc2svYXBpL21lc3NhZ2luZy9TZW5kZXJDb25maWcuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5pbmdyZXNzLm1lc3NhZ2luZzsKK3BhY2thZ2Ugb3JnLmFwYWNoZS5haXJhdmF0YS5rOHMudGFzay5hcGkubWVzc2FnaW5nOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5rYWZrYS5jbGllbnRzLnByb2R1Y2VyLlByb2R1Y2VyQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUua2Fma2EuY29tbW9uLnNlcmlhbGl6YXRpb24uU3RyaW5nU2VyaWFsaXplcjsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvcG9tLnhtbCBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvcG9tLnhtbAppbmRleCBiMGVlOThmLi5jNzU4ZjcwIDEwMDY0NAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL3BvbS54bWwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy9wb20ueG1sCkBAIC0zNiwxMSArMzYsMTAgQEAKICAgICAgICAgPG1vZHVsZT5tb2R1bGVzL21pY3Jvc2VydmljZXMvd29ya2Zsb3ctZ2VuZXJhdG9yPC9tb2R1bGU+CiAgICAgICAgIDxtb2R1bGU+bW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2stc2NoZWR1bGVyPC9tb2R1bGU+CiAgICAgICAgIDxtb2R1bGU+bW9kdWxlcy9taWNyb3NlcnZpY2VzL2V2ZW50LXNpbms8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvaW5ncmVzcy1zdGFnaW5nLXRhc2s8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvZW52LXNldHVwLXRhc2s8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3Mvam9iLXN1Ym1pc3Npb24tdGFzazwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPm1vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9lbnYtY2xlYW51cC10YXNrPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+bW9kdWxlcy9taWNyb3NlcnZpY2VzL3Rhc2tzL2VncmVzcy1zdGFnaW5nLXRhc2s8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5tb2R1bGVzL21pY3Jvc2VydmljZXMvdGFza3MvY29tbWFuZC1leGVjdXRpbmctdGFzazwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm1vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9kYXRhLXB1c2hpbmctdGFzazwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm1vZHVsZXMvbWljcm9zZXJ2aWNlcy90YXNrcy9kYXRhLWNvbGxlY3RpbmctdGFzazwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm1vZHVsZXMvdGFzay1hcGk8L21vZHVsZT4KICAgICA8L21vZHVsZXM+CiAKICAgICA8ZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hcHAvYXBwLm1vZHVsZS50cyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2FwcC9hcHAubW9kdWxlLnRzCmluZGV4IDc2YzczMzguLjZlNGQ4NDIgMTAwNjQ0Ci0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2FwcC9hcHAubW9kdWxlLnRzCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2FwcC9hcHAubW9kdWxlLnRzCkBAIC0xNSw2ICsxNSw4IEBACiBpbXBvcnQge0V4cGVyaW1lbnREZXRhaWxDb21wb25lbnR9IGZyb20gIi4vY29tcG9uZW50cy9leHBlcmltZW50L2RldGFpbC9leHBlcmltZW50LmRldGFpbCI7CiBpbXBvcnQge1Byb2Nlc3NEZXRhaWxDb21wb25lbnR9IGZyb20gIi4vY29tcG9uZW50cy9wcm9jZXNzL2RldGFpbC9wcm9jZXNzLmRldGFpbC5jb21wb25lbnQiOwogaW1wb3J0IHtTZXR1cENvbXBvbmVudH0gZnJvbSAiLi9jb21wb25lbnRzL3NldHVwL3NldHVwLmNvbXBvbmVudCI7CitpbXBvcnQge1dvcmtmbG93Q3JlYXRlQ29tcG9uZW50fSBmcm9tICIuL2NvbXBvbmVudHMvd29ya2Zsb3cvY3JlYXRlL2NyZWF0ZS5jb21wb25lbnQiOworaW1wb3J0IHtXb3JrZmxvd0xpc3RDb21wb25lbnR9IGZyb20gIi4vY29tcG9uZW50cy93b3JrZmxvdy9saXN0L3dvcmtmbG93Lmxpc3QuY29tcG9uZW50IjsKIAogQE5nTW9kdWxlKHsKICAgZGVjbGFyYXRpb25zOiBbCkBAIC0yNyw3ICsyOSw5IEBACiAgICAgRXhwZXJpbWVudExpc3RDb21wb25lbnQsCiAgICAgRXhwZXJpbWVudERldGFpbENvbXBvbmVudCwKICAgICBQcm9jZXNzRGV0YWlsQ29tcG9uZW50LAotICAgIFNldHVwQ29tcG9uZW50CisgICAgU2V0dXBDb21wb25lbnQsCisgICAgV29ya2Zsb3dDcmVhdGVDb21wb25lbnQsCisgICAgV29ya2Zsb3dMaXN0Q29tcG9uZW50CiAgIF0sCiAgIGltcG9ydHM6IFsKICAgICBOZ2JNb2R1bGUuZm9yUm9vdCgpLApkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL2NvbXBvbmVudHMvZGFzaGJvYXJkL2Rhc2hib2FyZC5odG1sIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL2NvbXBvbmVudHMvZGFzaGJvYXJkL2Rhc2hib2FyZC5odG1sCmluZGV4IGJhNmFiOGQuLjgyN2NhNTEgMTAwNjQ0Ci0tLSBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2FwcC9jb21wb25lbnRzL2Rhc2hib2FyZC9kYXNoYm9hcmQuaHRtbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hcHAvY29tcG9uZW50cy9kYXNoYm9hcmQvZGFzaGJvYXJkLmh0bWwKQEAgLTM0LDYgKzM0LDkgQEAKICAgICAgIDxsaSBjbGFzcz0ibmF2LWl0ZW0iPgogICAgICAgICA8YSBjbGFzcz0ibmF2LWxpbmsiIFtyb3V0ZXJMaW5rXT0iWycvc2V0dXAnXSI+U2V0dXA8L2E+CiAgICAgICA8L2xpPgorICAgICAgPGxpIGNsYXNzPSJuYXYtaXRlbSI+CisgICAgICAgIDxhIGNsYXNzPSJuYXYtbGluayIgW3JvdXRlckxpbmtdPSJbJy93b3JrZmxvdyddIj5Xb3JrZmxvdzwvYT4KKyAgICAgIDwvbGk+CiAgICAgPC91bD4KICAgPC9kaXY+CiAKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2FwcC9jb21wb25lbnRzL2Rhc2hib2FyZC9kYXNoYm9hcmQucm91dGVzLnRzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL2NvbXBvbmVudHMvZGFzaGJvYXJkL2Rhc2hib2FyZC5yb3V0ZXMudHMKaW5kZXggOTBiNDk5MS4uYzIxMTUwMyAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL2NvbXBvbmVudHMvZGFzaGJvYXJkL2Rhc2hib2FyZC5yb3V0ZXMudHMKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL2NvbXBvbmVudHMvZGFzaGJvYXJkL2Rhc2hib2FyZC5yb3V0ZXMudHMKQEAgLTgsNiArOCw4IEBACiBpbXBvcnQge0V4cGVyaW1lbnREZXRhaWxDb21wb25lbnR9IGZyb20gIi4uL2V4cGVyaW1lbnQvZGV0YWlsL2V4cGVyaW1lbnQuZGV0YWlsIjsKIGltcG9ydCB7UHJvY2Vzc0RldGFpbENvbXBvbmVudH0gZnJvbSAiLi4vcHJvY2Vzcy9kZXRhaWwvcHJvY2Vzcy5kZXRhaWwuY29tcG9uZW50IjsKIGltcG9ydCB7U2V0dXBDb21wb25lbnR9IGZyb20gIi4uL3NldHVwL3NldHVwLmNvbXBvbmVudCI7CitpbXBvcnQge1dvcmtmbG93Q3JlYXRlQ29tcG9uZW50fSBmcm9tICIuLi93b3JrZmxvdy9jcmVhdGUvY3JlYXRlLmNvbXBvbmVudCI7CitpbXBvcnQge1dvcmtmbG93TGlzdENvbXBvbmVudH0gZnJvbSAiLi4vd29ya2Zsb3cvbGlzdC93b3JrZmxvdy5saXN0LmNvbXBvbmVudCI7CiAKIC8qKgogICogQ3JlYXRlZCBieSBkaW11dGh1IG9uIDEwLzI5LzE3LgpAQCAtNDYsNSArNDgsMTMgQEAKICAgewogICAgIHBhdGg6ICdtb2R1bGUnLAogICAgIGNvbXBvbmVudDogQXBwTW9kdWxlTGlzdENvbXBvbmVudCwKKyAgfSwKKyAgeworICAgIHBhdGg6ICd3b3JrZmxvdycsCisgICAgY29tcG9uZW50OiBXb3JrZmxvd0xpc3RDb21wb25lbnQsCisgIH0sCisgIHsKKyAgICBwYXRoOiAnd29ya2Zsb3cvY3JlYXRlJywKKyAgICBjb21wb25lbnQ6IFdvcmtmbG93Q3JlYXRlQ29tcG9uZW50LAogICB9CiBdOwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL2NvbXBvbmVudHMvd29ya2Zsb3cvY3JlYXRlL2NyZWF0ZS5jb21wb25lbnQudHMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hcHAvY29tcG9uZW50cy93b3JrZmxvdy9jcmVhdGUvY3JlYXRlLmNvbXBvbmVudC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjg2YzE5Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL2NvbXBvbmVudHMvd29ya2Zsb3cvY3JlYXRlL2NyZWF0ZS5jb21wb25lbnQudHMKQEAgLTAsMCArMSw0MzUgQEAKK2ltcG9ydCB7Q29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgQWZ0ZXJWaWV3SW5pdH0gZnJvbSAiQGFuZ3VsYXIvY29yZSI7CitpbXBvcnQge1Rhc2tTZXJ2aWNlfSBmcm9tICIuLi8uLi8uLi9zZXJ2aWNlcy90YXNrLnNlcnZpY2UiOworaW1wb3J0IHtUYXNrVHlwZX0gZnJvbSAiLi4vLi4vLi4vbW9kZWxzL3Rhc2svdHlwZS90YXNrLnR5cGUubW9kZWwiOworaW1wb3J0IHtPcGVyYXRpb25UeXBlfSBmcm9tICIuLi8uLi8uLi9tb2RlbHMvdGFzay90eXBlL29wZXJhdGlvbi9vcGVyYXRpb24udHlwZS5tb2RlbCI7CitpbXBvcnQge09wZXJhdGlvbkluUG9ydH0gZnJvbSAiLi4vLi4vLi4vbW9kZWxzL3Rhc2svdHlwZS9vcGVyYXRpb24vb3BlcmF0aW9uLmlucG9ydC50eXBlLm1vZGVsIjsKK2ltcG9ydCB7T3BlcmF0aW9uT3V0UG9ydH0gZnJvbSAiLi4vLi4vLi4vbW9kZWxzL3Rhc2svdHlwZS9vcGVyYXRpb24vb3BlcmF0aW9uLm91dHBvcnQudHlwZS5tb2RlbCI7CitpbXBvcnQge1dvcmtmbG93U2VydmljZX0gZnJvbSAiLi4vLi4vLi4vc2VydmljZXMvd29ya2Zsb3cuc2VydmljZSI7CitpbXBvcnQge1JvdXRlcn0gZnJvbSAiQGFuZ3VsYXIvcm91dGVyIjsKKworZGVjbGFyZSBsZXQgbXhDbGllbnQ6IGFueTsKK2RlY2xhcmUgbGV0IG14VXRpbHM6IGFueTsKK2RlY2xhcmUgbGV0IG14VG9vbGJhcjogYW55OworZGVjbGFyZSBsZXQgbXhEaXZSZXNpemVyOiBhbnk7CitkZWNsYXJlIGxldCBteEdyYXBoOiBhbnk7CitkZWNsYXJlIGxldCBteERyYWdTb3VyY2U6IGFueTsKK2RlY2xhcmUgbGV0IG14UnViYmVyYmFuZDogYW55OworZGVjbGFyZSBsZXQgbXhLZXlIYW5kbGVyOiBhbnk7CitkZWNsYXJlIGxldCBteENvZGVjOiBhbnk7CitkZWNsYXJlIGxldCBteENvbnN0YW50czogYW55OworZGVjbGFyZSBsZXQgbXhFZGdlU3R5bGU6IGFueTsKK2RlY2xhcmUgbGV0IG14RXZlbnQ6IGFueTsKK2RlY2xhcmUgbGV0IG14Rm9ybTogYW55OworZGVjbGFyZSBsZXQgbXhDZWxsQXR0cmlidXRlQ2hhbmdlOiBhbnk7CitkZWNsYXJlIGxldCBteFJlY3RhbmdsZTogYW55OworZGVjbGFyZSBsZXQgbXhQb2ludDogYW55OworCitAQ29tcG9uZW50KHsKKyAgdGVtcGxhdGVVcmw6ICcuL2NyZWF0ZS5odG1sJywKKyAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSwKKyAgcHJvdmlkZXJzOiBbVGFza1NlcnZpY2UsIFdvcmtmbG93U2VydmljZV0KK30pCitleHBvcnQgY2xhc3MgV29ya2Zsb3dDcmVhdGVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHsKKworICB0YXNrVHlwZXM6IEFycmF5PFRhc2tUeXBlPiA9IFtdOworICBvcGVyYXRpb25UeXBlczogQXJyYXk8T3BlcmF0aW9uVHlwZT4gPSBbXTsKKyAgZ3JhcGhJbnN0YW5jZTogYW55OworICB3b3JrRmxvd05hbWU6IHN0cmluZyA9ICJTYW1wbGUgV29ya2Zsb3ciOworCisgIGNvbnN0cnVjdG9yKHByaXZhdGUgdGFza1NlcnZpY2U6IFRhc2tTZXJ2aWNlLCBwcml2YXRlIHdvcmtmbG93U2VydmljZTogV29ya2Zsb3dTZXJ2aWNlLCBwcml2YXRlIHJvdXRlcjogUm91dGVyKSB7CisKKyAgICBsZXQgc3RhcnRUeXBlOiBPcGVyYXRpb25UeXBlID0gbmV3IE9wZXJhdGlvblR5cGUoKTsKKyAgICBzdGFydFR5cGUuaWQgPSAxOworICAgIHN0YXJ0VHlwZS5uYW1lID0gIlN0YXJ0IjsKKyAgICBzdGFydFR5cGUuaWNvbiA9ICJhc3NldHMvaWNvbnMvc3RhcnQucG5nIjsKKyAgICBzdGFydFR5cGUub3V0UG9ydHMucHVzaChuZXcgT3BlcmF0aW9uT3V0UG9ydCgxLCAiT3V0cHV0IikpOworCisgICAgbGV0IGVuZFR5cGU6IE9wZXJhdGlvblR5cGUgPSBuZXcgT3BlcmF0aW9uVHlwZSgpOworICAgIGVuZFR5cGUuaWQgPSAxOworICAgIGVuZFR5cGUubmFtZSA9ICJTdG9wIjsKKyAgICBlbmRUeXBlLmljb24gPSAiYXNzZXRzL2ljb25zL3N0b3AucG5nIjsKKyAgICBlbmRUeXBlLmluUG9ydHMucHVzaChuZXcgT3BlcmF0aW9uSW5Qb3J0KDEsICJJbnB1dCIpKTsKKworICAgIHRoaXMub3BlcmF0aW9uVHlwZXMucHVzaChzdGFydFR5cGUsIGVuZFR5cGUpOworICB9CisKKyAgbG9hZEdyYXBoRGF0YSgpIHsKKyAgICB0aGlzLnRhc2tTZXJ2aWNlLmdldEFsbFRhc2tUeXBlcygpLnN1YnNjcmliZShkYXRhID0+IHsKKyAgICAgIHRoaXMudGFza1R5cGVzID0gZGF0YTsKKyAgICAgIHRoaXMubG9hZEdyYXBoKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncmFwaENvbnRhaW5lcicpLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbENvbnRhaW5lcicpKTsKKyAgICB9LCBlcnIgPT4geworCisgICAgfSkKKyAgfQorCisgIG9uU2hvd1dvcmtmbG93WE1MQ2xpY2tlZCgpIHsKKyAgICBsZXQgZW5jb2RlciA9IG5ldyBteENvZGVjKCk7CisgICAgbGV0IG5vZGUgPSBlbmNvZGVyLmVuY29kZSh0aGlzLmdyYXBoSW5zdGFuY2UuZ2V0TW9kZWwoKSk7CisgICAgbXhVdGlscy5wb3B1cChteFV0aWxzLmdldFByZXR0eVhtbChub2RlKSwgdHJ1ZSk7CisgIH0KKworICBvbkNyZWF0ZVdvcmtmbG93Q2xpY2tlZCgpIHsKKyAgICBsZXQgZW5jb2RlciA9IG5ldyBteENvZGVjKCk7CisgICAgbGV0IG5vZGUgPSBlbmNvZGVyLmVuY29kZSh0aGlzLmdyYXBoSW5zdGFuY2UuZ2V0TW9kZWwoKSk7CisgICAgdGhpcy53b3JrZmxvd1NlcnZpY2UuY3JlYXRlV29ya2Zsb3codGhpcy53b3JrRmxvd05hbWUsIG14VXRpbHMuZ2V0UHJldHR5WG1sKG5vZGUpKS5zdWJzY3JpYmUoZGF0YSA9PiB7CisgICAgICBhbGVydCgiV29ya2Zsb3cgY3JlYXRlZCIpOworICAgICAgdGhpcy5yb3V0ZVRvTGlzdFBhZ2UoKTsKKyAgICB9LCBlcnIgPT4geworICAgICAgYWxlcnQoIkFuIGVycm9yIG9jY3VycmVkIik7CisgICAgfSk7CisgIH0KKworICByb3V0ZVRvTGlzdFBhZ2UoKSB7CisgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgiL3dvcmtmbG93Iik7CisgIH0KKworICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7CisgICAgdGhpcy5sb2FkR3JhcGhEYXRhKCk7CisgIH0KKworICBsb2FkR3JhcGgoY29udGFpbmVyLCB0YkNvbnRhaW5lcikgeworCisgICAgaWYgKCFteENsaWVudC5pc0Jyb3dzZXJTdXBwb3J0ZWQoKSkgeworICAgICAgLy8gRGlzcGxheXMgYW4gZXJyb3IgbWVzc2FnZSBpZiB0aGUgYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAgbXhVdGlscy5lcnJvcignQnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkIScsIDIwMCwgZmFsc2UpOworICAgIH0gZWxzZSB7CisgICAgICBsZXQgdG9vbGJhciA9IG5ldyBteFRvb2xiYXIodGJDb250YWluZXIpOworICAgICAgdG9vbGJhci5lbmFibGVkID0gZmFsc2U7CisKKyAgICAgIC8vIFdvcmthcm91bmQgZm9yIEludGVybmV0IEV4cGxvcmVyIGlnbm9yaW5nIGNlcnRhaW4gc3R5bGVzCisgICAgICBpZiAobXhDbGllbnQuSVNfUVVJUktTKSB7CisgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKKyAgICAgICAgbmV3IG14RGl2UmVzaXplcih0YkNvbnRhaW5lcik7CisgICAgICAgIG5ldyBteERpdlJlc2l6ZXIoY29udGFpbmVyKTsKKyAgICAgIH0KKworICAgICAgbGV0IGRvYyA9IG14VXRpbHMuY3JlYXRlWG1sRG9jdW1lbnQoKTsKKworICAgICAgbGV0IHJlbGF0aW9uID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ0VkZ2UnKTsKKworICAgICAgbGV0IGdyYXBoID0gbmV3IG14R3JhcGgoY29udGFpbmVyKTsKKyAgICAgIHRoaXMuZ3JhcGhJbnN0YW5jZSA9IGdyYXBoOworCisgICAgICBncmFwaC5kcm9wRW5hYmxlZCA9IHRydWU7CisKKyAgICAgIG14RHJhZ1NvdXJjZS5wcm90b3R5cGUuZ2V0RHJvcFRhcmdldCA9IGZ1bmN0aW9uIChncmFwaCwgeCwgeSkgeworICAgICAgICBsZXQgY2VsbCA9IGdyYXBoLmdldENlbGxBdCh4LCB5KTsKKworICAgICAgICBpZiAoIWdyYXBoLmlzVmFsaWREcm9wVGFyZ2V0KGNlbGwpKSB7CisgICAgICAgICAgY2VsbCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2VsbDsKKyAgICAgIH07CisKKyAgICAgIC8vIEVuYWJsZXMgbmV3IGNvbm5lY3Rpb25zIGluIHRoZSBncmFwaAorICAgICAgZ3JhcGguc2V0Q29ubmVjdGFibGUodHJ1ZSk7CisgICAgICBncmFwaC5zZXRNdWx0aWdyYXBoKGZhbHNlKTsKKworICAgICAgbGV0IGFkZFRhc2tUeXBlID0gZnVuY3Rpb24gKGljb24sIHcsIGgsIHRhc2tUeXBlOiBUYXNrVHlwZSkgeworICAgICAgICBhZGRUb29sYmFySXRlbShncmFwaCwgdG9vbGJhciwgY3JlYXRlVGFza0l0ZW0oZG9jLCB0YXNrVHlwZSksIGljb24sIGRvYyk7CisgICAgICB9OworCisgICAgICBsZXQgYWRkT3BlcmF0aW9uID0gZnVuY3Rpb24gKGljb24sIHcsIGgsIG9wZXJhdGlvblR5cGU6IE9wZXJhdGlvblR5cGUpIHsKKyAgICAgICAgYWRkVG9vbGJhckl0ZW0oZ3JhcGgsIHRvb2xiYXIsIGNyZWF0ZU9wZXJhdGlvbihkb2MsIG9wZXJhdGlvblR5cGUpLCBpY29uLCBkb2MpOworICAgICAgfTsKKworICAgICAgdGhpcy50YXNrVHlwZXMuZm9yRWFjaCgodGFza1R5cGUpID0+IHsKKyAgICAgICAgYWRkVGFza1R5cGUodGFza1R5cGUuaWNvbiwgNDAsIDQwLCB0YXNrVHlwZSk7CisgICAgICB9KTsKKworICAgICAgdGhpcy5vcGVyYXRpb25UeXBlcy5mb3JFYWNoKChvcGVyYXRpb25UeXBlKSA9PiB7CisgICAgICAgIGFkZE9wZXJhdGlvbihvcGVyYXRpb25UeXBlLmljb24sIDQwLCA0MCwgb3BlcmF0aW9uVHlwZSk7CisgICAgICB9KTsKKworICAgICAgdG9vbGJhci5hZGRMaW5lKCk7CisKKyAgICAgIGdyYXBoLnNldENlbGxzUmVzaXphYmxlKGZhbHNlKTsKKyAgICAgIGdyYXBoLnNldFJlc2l6ZUNvbnRhaW5lcih0cnVlKTsKKyAgICAgIGdyYXBoLm1pbmltdW1Db250YWluZXJTaXplID0gbmV3IG14UmVjdGFuZ2xlKDAsIDAsIDUwMCwgMzgwKTsKKyAgICAgIGdyYXBoLnNldEJvcmRlcig2MCk7CisKKyAgICAgIG5ldyBteEtleUhhbmRsZXIoZ3JhcGgpOworCisgICAgICAvLyBPdmVycmlkZXMgbWV0aG9kIHRvIGRpc2FsbG93IGVkZ2UgbGFiZWwgZWRpdGluZworICAgICAgZ3JhcGguaXNDZWxsRWRpdGFibGUgPSBmdW5jdGlvbiAoY2VsbCkgeworICAgICAgICByZXR1cm4gIXRoaXMuZ2V0TW9kZWwoKS5pc0VkZ2UoY2VsbCk7CisgICAgICB9OworCisgICAgICAvLyBPdmVycmlkZXMgbWV0aG9kIHRvIHByb3ZpZGUgYSBjZWxsIGxhYmVsIGluIHRoZSBkaXNwbGF5CisgICAgICBncmFwaC5jb252ZXJ0VmFsdWVUb1N0cmluZyA9IGZ1bmN0aW9uIChjZWxsKSB7CisgICAgICAgIGlmIChteFV0aWxzLmlzTm9kZShjZWxsLnZhbHVlKSkgeworICAgICAgICAgIGlmIChjZWxsLnZhbHVlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ3Byb2Nlc3NpbmdlbGVtZW50JykgeworICAgICAgICAgICAgcmV0dXJuIGNlbGwuZ2V0QXR0cmlidXRlKCduYW1lJywgJycpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoY2VsbC52YWx1ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdvcGVyYXRpb24nKSB7CisgICAgICAgICAgICByZXR1cm4gY2VsbC5nZXRBdHRyaWJ1dGUoJ25hbWUnLCAnJyk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgaWYgKGNlbGwudmFsdWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAnZWRnZScpIHsKKyAgICAgICAgICAgIHJldHVybiAnJzsKKyAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJyc7CisgICAgICB9OworCisgICAgICAvLyBPdmVycmlkZXMgbWV0aG9kIHRvIHN0b3JlIGEgY2VsbCBsYWJlbCBpbiB0aGUgbW9kZWwKKyAgICAgIGxldCBjZWxsTGFiZWxDaGFuZ2VkID0gZ3JhcGguY2VsbExhYmVsQ2hhbmdlZDsKKyAgICAgIGdyYXBoLmNlbGxMYWJlbENoYW5nZWQgPSBmdW5jdGlvbiAoY2VsbCwgbmV3VmFsdWUsIGF1dG9TaXplKSB7CisgICAgICAgIGlmIChteFV0aWxzLmlzTm9kZShjZWxsLnZhbHVlKSAmJgorICAgICAgICAgIGNlbGwudmFsdWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAncHJvY2Vzc2luZ2VsZW1lbnQnKSB7CisgICAgICAgICAgLy8gQ2xvbmVzIHRoZSB2YWx1ZSBmb3IgY29ycmVjdCB1bmRvL3JlZG8KKyAgICAgICAgICBsZXQgZWx0ID0gY2VsbC52YWx1ZS5jbG9uZU5vZGUodHJ1ZSk7CisKKyAgICAgICAgICBlbHQuc2V0QXR0cmlidXRlKCduYW1lJywgbmV3VmFsdWUpOworICAgICAgICAgIG5ld1ZhbHVlID0gZWx0OworICAgICAgICAgIGF1dG9TaXplID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNlbGxMYWJlbENoYW5nZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAgICAgIH07CisKKyAgICAgIC8vIE92ZXJyaWRlcyBtZXRob2QgdG8gY3JlYXRlIHRoZSBlZGl0aW5nIHZhbHVlCisgICAgICBsZXQgZ2V0RWRpdGluZ1ZhbHVlID0gZ3JhcGguZ2V0RWRpdGluZ1ZhbHVlOworICAgICAgZ3JhcGguZ2V0RWRpdGluZ1ZhbHVlID0gZnVuY3Rpb24gKGNlbGwpIHsKKyAgICAgICAgaWYgKG14VXRpbHMuaXNOb2RlKGNlbGwudmFsdWUpICYmCisgICAgICAgICAgY2VsbC52YWx1ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdwcm9jZXNzaW5nZWxlbWVudCcpIHsKKyAgICAgICAgICByZXR1cm4gY2VsbC5nZXRBdHRyaWJ1dGUoJ25hbWUnLCAnJyk7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIG5ldyBteFJ1YmJlcmJhbmQoZ3JhcGgpOworCisgICAgICAvLyBDaGFuZ2VzIHRoZSBzdHlsZSBmb3IgbWF0Y2ggdGhlIG1hcmt1cAorICAgICAgLy8gQ3JlYXRlcyB0aGUgZGVmYXVsdCBzdHlsZSBmb3IgdmVydGljZXMKKyAgICAgIGxldCBzdHlsZSA9IGdyYXBoLmdldFN0eWxlc2hlZXQoKS5nZXREZWZhdWx0VmVydGV4U3R5bGUoKTsKKyAgICAgIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1NUUk9LRUNPTE9SXSA9ICdncmF5JzsKKyAgICAgIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1JPVU5ERURdID0gdHJ1ZTsKKyAgICAgIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1NIQURPV10gPSB0cnVlOworICAgICAgc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRklMTENPTE9SXSA9ICcjREZERkRGJzsKKyAgICAgIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0dSQURJRU5UQ09MT1JdID0gJ3doaXRlJzsKKyAgICAgIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0ZPTlRDT0xPUl0gPSAnYmxhY2snOworICAgICAgc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRk9OVFNJWkVdID0gJzEyJzsKKyAgICAgIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1NQQUNJTkddID0gNDsKKworICAgICAgLy8gQ3JlYXRlcyB0aGUgZGVmYXVsdCBzdHlsZSBmb3IgZWRnZXMKKyAgICAgIHN0eWxlID0gZ3JhcGguZ2V0U3R5bGVzaGVldCgpLmdldERlZmF1bHRFZGdlU3R5bGUoKTsKKyAgICAgIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1NUUk9LRUNPTE9SXSA9ICcjMEMwQzBDJzsKKyAgICAgIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0xBQkVMX0JBQ0tHUk9VTkRDT0xPUl0gPSAnd2hpdGUnOworICAgICAgc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRURHRV0gPSBteEVkZ2VTdHlsZS5FbGJvd0Nvbm5lY3RvcjsKKyAgICAgIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1JPVU5ERURdID0gdHJ1ZTsKKyAgICAgIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0ZPTlRDT0xPUl0gPSAnYmxhY2snOworICAgICAgc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRk9OVFNJWkVdID0gJzEwJzsKKworICAgICAgbGV0IHBhcmVudCA9IGdyYXBoLmdldERlZmF1bHRQYXJlbnQoKTsKKyAgICAgIGdyYXBoLmdldE1vZGVsKCkuYmVnaW5VcGRhdGUoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIC8vdmFyIHYxID0gZ3JhcGguaW5zZXJ0VmVydGV4KHBhcmVudCwgbnVsbCwgcGUxLCA0MCwgNDAsIDgwLCAzMCk7CisgICAgICAgIC8vdmFyIHYyID0gZ3JhcGguaW5zZXJ0VmVydGV4KHBhcmVudCwgbnVsbCwgcGUyLCAyMDAsIDE1MCwgODAsIDMwKTsKKyAgICAgICAgLy92YXIgZTEgPSBncmFwaC5pbnNlcnRFZGdlKHBhcmVudCwgbnVsbCwgcmVsYXRpb24sIHYxLCB2Mik7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICAvLyBVcGRhdGVzIHRoZSBkaXNwbGF5CisgICAgICAgIGdyYXBoLmdldE1vZGVsKCkuZW5kVXBkYXRlKCk7CisgICAgICB9CisKKyAgICAgIC8vIEltcGxlbWVudHMgYSBwcm9wZXJ0aWVzIHBhbmVsIHRoYXQgdXNlcworICAgICAgLy8gbXhDZWxsQXR0cmlidXRlQ2hhbmdlIHRvIGNoYW5nZSBwcm9wZXJ0aWVzCisgICAgICBncmFwaC5nZXRTZWxlY3Rpb25Nb2RlbCgpLmFkZExpc3RlbmVyKG14RXZlbnQuQ0hBTkdFLCBmdW5jdGlvbiAoc2VuZGVyLCBldnQpIHsKKyAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZChncmFwaCk7CisgICAgICB9KTsKKworICAgICAgc2VsZWN0aW9uQ2hhbmdlZChncmFwaCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSBwcm9wZXJ0aWVzIHBhbmVsCisgICAgICovCisgICAgZnVuY3Rpb24gc2VsZWN0aW9uQ2hhbmdlZChncmFwaCkgeworICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9wZXJ0aWVzJyk7CisKKyAgICAgIC8vIEZvcmNlcyBmb2N1c291dCBpbiBJRQorICAgICAgZ3JhcGguY29udGFpbmVyLmZvY3VzKCk7CisKKyAgICAgIC8vIENsZWFycyB0aGUgRElWIHRoZSBub24tRE9NIHdheQorICAgICAgZGl2LmlubmVySFRNTCA9ICcnOworCisgICAgICAvLyBHZXRzIHRoZSBzZWxlY3Rpb24gY2VsbAorICAgICAgbGV0IGNlbGwgPSBncmFwaC5nZXRTZWxlY3Rpb25DZWxsKCk7CisKKyAgICAgIGlmIChjZWxsID09IG51bGwpIHsKKyAgICAgICAgbXhVdGlscy53cml0ZWxuKGRpdiwgJ05vdGhpbmcgc2VsZWN0ZWQuJyk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChjZWxsLnZhbHVlKSB7CisgICAgICAgIC8vIFdyaXRlcyB0aGUgdGl0bGUKKyAgICAgICAgbGV0IGNlbnRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NlbnRlcicpOworICAgICAgICBteFV0aWxzLndyaXRlbG4oY2VudGVyLCBjZWxsLnZhbHVlLm5vZGVOYW1lICsgJyAoJyArIGNlbGwuaWQgKyAnKScpOworICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoY2VudGVyKTsKKyAgICAgICAgbXhVdGlscy5icihkaXYpOworCisgICAgICAgIC8vIENyZWF0ZXMgdGhlIGZvcm0gZnJvbSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgdXNlciBvYmplY3QKKyAgICAgICAgbGV0IGZvcm0gPSBuZXcgbXhGb3JtKCk7CisKKyAgICAgICAgbGV0IGF0dHJzID0gY2VsbC52YWx1ZS5hdHRyaWJ1dGVzOworCisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBpZiAoIWF0dHJzW2ldLm5vZGVOYW1lLnN0YXJ0c1dpdGgoImluLSIpICYmICFhdHRyc1tpXS5ub2RlTmFtZS5zdGFydHNXaXRoKCJvdXQtIikpIHsKKyAgICAgICAgICAgIGNyZWF0ZVRleHRGaWVsZChncmFwaCwgZm9ybSwgY2VsbCwgYXR0cnNbaV0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRpdi5hcHBlbmRDaGlsZChmb3JtLmdldFRhYmxlKCkpOworICAgICAgICBteFV0aWxzLmJyKGRpdik7CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gY3JlYXRlVGFza0l0ZW0oZG9jLCB0YXNrVHlwZTogVGFza1R5cGUpIHsKKworICAgICAgdmFyIHBlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ1Byb2Nlc3NpbmdFbGVtZW50Jyk7CisgICAgICBwZS5zZXRBdHRyaWJ1dGUoJ25hbWUnLCB0YXNrVHlwZS5uYW1lKTsKKyAgICAgIHBlLnNldEF0dHJpYnV0ZSgnVHlwZScsIHRhc2tUeXBlLmlkKTsKKworICAgICAgdGFza1R5cGUuaW5wdXRUeXBlcy5mb3JFYWNoKChpbnB1dCwgaW5kZXgpID0+IHsKKyAgICAgICAgcGUuc2V0QXR0cmlidXRlKGlucHV0Lm5hbWUsIGlucHV0LmRlZmF1bHRWYWx1ZSk7CisgICAgICB9KTsKKworICAgICAgdGFza1R5cGUub3V0cHV0VHlwZXMuZm9yRWFjaCgob3V0cHV0LCBpbmRleCkgPT4geworICAgICAgICBwZS5zZXRBdHRyaWJ1dGUoJ291dHB1dC0nICsgb3V0cHV0Lm5hbWUsICcnKTsKKyAgICAgIH0pOworCisgICAgICB0YXNrVHlwZS5vdXRQb3J0cy5mb3JFYWNoKChvdXRQb3J0LCBpbmRleCkgPT4geworICAgICAgICBwZS5zZXRBdHRyaWJ1dGUoIm91dC0iICsgb3V0UG9ydC5pZCwgb3V0UG9ydC5uYW1lKTsKKyAgICAgIH0pOworCisgICAgICBwZS5zZXRBdHRyaWJ1dGUoImluLTEiICwgIklucHV0Iik7CisKKyAgICAgIHJldHVybiBwZTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBjcmVhdGVPcGVyYXRpb24oZG9jLCBvcGVyYXRpb246IE9wZXJhdGlvblR5cGUpIHsKKyAgICAgIHZhciBvcCA9IGRvYy5jcmVhdGVFbGVtZW50KCdPcGVyYXRpb24nKTsKKyAgICAgIG9wLnNldEF0dHJpYnV0ZSgibmFtZSIsIG9wZXJhdGlvbi5uYW1lKTsKKyAgICAgIG9wZXJhdGlvbi5vdXRQb3J0cy5mb3JFYWNoKChvdXRQb3J0LCBpbmRleCkgPT4geworICAgICAgICBvcC5zZXRBdHRyaWJ1dGUoIm91dC0iICsgb3V0UG9ydC5pZCwgb3V0UG9ydC5uYW1lKTsKKyAgICAgIH0pOworICAgICAgb3BlcmF0aW9uLmluUG9ydHMuZm9yRWFjaCgoaW5Qb3J0LCBpbmRleCkgPT4geworICAgICAgICBvcC5zZXRBdHRyaWJ1dGUoImluLSIgKyBpblBvcnQuaWQsIGluUG9ydC5uYW1lKTsKKyAgICAgIH0pOworICAgICAgcmV0dXJuIG9wOworICAgIH0KKworICAgIGZ1bmN0aW9uIGNyZWF0ZVRleHRGaWVsZChncmFwaCwgZm9ybSwgY2VsbCwgYXR0cmlidXRlKSB7CisgICAgICBsZXQgaW5wdXQgPSBmb3JtLmFkZFRleHQoYXR0cmlidXRlLm5vZGVOYW1lICsgJzonLCBhdHRyaWJ1dGUubm9kZVZhbHVlKTsKKworICAgICAgbGV0IGFwcGx5SGFuZGxlciA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgbGV0IG5ld1ZhbHVlID0gaW5wdXQudmFsdWUgfHwgJyc7CisgICAgICAgIGxldCBvbGRWYWx1ZSA9IGNlbGwuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZS5ub2RlTmFtZSwgJycpOworCisgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBvbGRWYWx1ZSkgeworICAgICAgICAgIGdyYXBoLmdldE1vZGVsKCkuYmVnaW5VcGRhdGUoKTsKKworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsZXQgZWRpdCA9IG5ldyBteENlbGxBdHRyaWJ1dGVDaGFuZ2UoCisgICAgICAgICAgICAgIGNlbGwsIGF0dHJpYnV0ZS5ub2RlTmFtZSwKKyAgICAgICAgICAgICAgbmV3VmFsdWUpOworICAgICAgICAgICAgZ3JhcGguZ2V0TW9kZWwoKS5leGVjdXRlKGVkaXQpOworICAgICAgICAgICAgZ3JhcGgudXBkYXRlQ2VsbFNpemUoY2VsbCk7CisgICAgICAgICAgfQorICAgICAgICAgIGZpbmFsbHkgeworICAgICAgICAgICAgZ3JhcGguZ2V0TW9kZWwoKS5lbmRVcGRhdGUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIG14RXZlbnQuYWRkTGlzdGVuZXIoaW5wdXQsICdrZXlwcmVzcycsIGZ1bmN0aW9uIChldnQpIHsKKyAgICAgICAgLy8gTmVlZHMgdG8gdGFrZSBzaGlmdCBpbnRvIGFjY291bnQgZm9yIHRleHRhcmVhcworICAgICAgICBpZiAoZXZ0LmtleUNvZGUgPT0gLyplbnRlciovMTMgJiYgIW14RXZlbnQuaXNTaGlmdERvd24oZXZ0KSkgeworICAgICAgICAgIGlucHV0LmJsdXIoKTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIGlmIChteENsaWVudC5JU19JRSkgeworICAgICAgICBteEV2ZW50LmFkZExpc3RlbmVyKGlucHV0LCAnZm9jdXNvdXQnLCBhcHBseUhhbmRsZXIpOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIC8vIE5vdGU6IEtub3duIHByb2JsZW0gaXMgdGhlIGJsdXJyaW5nIG9mIGZpZWxkcyBpbgorICAgICAgICAvLyBGaXJlZm94IGJ5IGNoYW5naW5nIHRoZSBzZWxlY3Rpb24sIGluIHdoaWNoIGNhc2UKKyAgICAgICAgLy8gbm8gZXZlbnQgaXMgZmlyZWQgaW4gRkYgYW5kIHRoZSBjaGFuZ2UgaXMgbG9zdC4KKyAgICAgICAgLy8gQXMgYSB3b3JrYXJvdW5kIHlvdSBzaG91bGQgdXNlIGEgbG9jYWwgdmFyaWFibGUKKyAgICAgICAgLy8gdGhhdCBzdG9yZXMgdGhlIGZvY3VzZWQgZmllbGQgYW5kIGludm9rZSBibHVyCisgICAgICAgIC8vIGV4cGxpY2l0ZWx5IHdoZXJlIHdlIGRvIHRoZSBncmFwaC5mb2N1cyBhYm92ZS4KKyAgICAgICAgbXhFdmVudC5hZGRMaXN0ZW5lcihpbnB1dCwgJ2JsdXInLCBhcHBseUhhbmRsZXIpOworICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIGFkZFRvb2xiYXJJdGVtKGdyYXBoLCB0b29sYmFyLCBwcm90b3R5cGUsIGltYWdlLCBkb2MpIHsKKyAgICAgIC8vIEZ1bmN0aW9uIHRoYXQgaXMgZXhlY3V0ZWQgd2hlbiB0aGUgaW1hZ2UgaXMgZHJvcHBlZCBvbgorICAgICAgLy8gdGhlIGdyYXBoLiBUaGUgY2VsbCBhcmd1bWVudCBwb2ludHMgdG8gdGhlIGNlbGwgdW5kZXIKKyAgICAgIC8vIHRoZSBtb3VzZXBvaW50ZXIgaWYgdGhlcmUgaXMgb25lLgorICAgICAgbGV0IGZ1bmN0ID0gZnVuY3Rpb24gKGdyYXBoLCBldnQsIGNlbGwsIHgsIHkpIHsKKworICAgICAgICBsZXQgcGFyZW50ID0gZ3JhcGguZ2V0RGVmYXVsdFBhcmVudCgpOworICAgICAgICBsZXQgbW9kZWwgPSBncmFwaC5nZXRNb2RlbCgpOworCisgICAgICAgIGxldCB2MSA9IG51bGw7CisKKyAgICAgICAgbW9kZWwuYmVnaW5VcGRhdGUoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgIHYxID0gZ3JhcGguaW5zZXJ0VmVydGV4KHBhcmVudCwgbnVsbCwgcHJvdG90eXBlLmNsb25lTm9kZSh0cnVlKSwgeCwgeSwgODAsIDYwKTsKKyAgICAgICAgICB2MS5zZXRDb25uZWN0YWJsZShmYWxzZSk7CisKKyAgICAgICAgICBsZXQgaW5wdXRzID0gW107CisgICAgICAgICAgbGV0IGlucHV0S2V5cyA9IFtdOworICAgICAgICAgIGxldCBvdXRwdXRzID0gW107CisgICAgICAgICAgbGV0IG91dHB1dEtleXMgPSBbXTsKKyAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3RvdHlwZS5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBsZXQgYXR0ciA9IHByb3RvdHlwZS5hdHRyaWJ1dGVzW2ldOworICAgICAgICAgICAgaWYgKGF0dHIubm9kZU5hbWUuc3RhcnRzV2l0aCgiaW4tIikpIHsKKyAgICAgICAgICAgICAgaW5wdXRzLnB1c2goYXR0ci5ub2RlVmFsdWUpOworICAgICAgICAgICAgICBpbnB1dEtleXMucHVzaChhdHRyLm5vZGVOYW1lKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGF0dHIubm9kZU5hbWUuc3RhcnRzV2l0aCgib3V0LSIpKSB7CisgICAgICAgICAgICAgIG91dHB1dHMucHVzaChhdHRyLm5vZGVWYWx1ZSk7CisgICAgICAgICAgICAgIG91dHB1dEtleXMucHVzaChhdHRyLm5vZGVOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBsZXQgaW5wdXREaXZpc2lvbiA9IDEgLyAoaW5wdXRzLmxlbmd0aCArIDEpOworICAgICAgICAgIGxldCBvdXRwdXREaXZpc2lvbiA9IDEgLyAob3V0cHV0cy5sZW5ndGggKyAxKTsKKworICAgICAgICAgIGlucHV0cy5mb3JFYWNoKGZ1bmN0aW9uIChpbnB1dCwgaW5kZXgpIHsKKyAgICAgICAgICAgIGxldCBwb3J0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ0luUG9ydCcpOworICAgICAgICAgICAgcG9ydC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBpbnB1dCk7CisgICAgICAgICAgICBwb3J0LnNldEF0dHJpYnV0ZSgicG9ydC1pZCIsIGlucHV0S2V5c1tpbmRleF0pOworCisgICAgICAgICAgICBsZXQgdjExID0gZ3JhcGguaW5zZXJ0VmVydGV4KHYxLCBudWxsLCBwb3J0LCAwLCAoaW5kZXggKiBpbnB1dERpdmlzaW9uICsgaW5wdXREaXZpc2lvbiksIDEwLCAxMCk7CisgICAgICAgICAgICB2MTEuZ2VvbWV0cnkub2Zmc2V0ID0gbmV3IG14UG9pbnQoLTUsIC01KTsKKyAgICAgICAgICAgIHYxMS5nZW9tZXRyeS5yZWxhdGl2ZSA9IHRydWU7CisgICAgICAgICAgfSk7CisKKyAgICAgICAgICBvdXRwdXRzLmZvckVhY2goZnVuY3Rpb24gKG91dHB1dCwgaW5kZXgpIHsKKyAgICAgICAgICAgIGxldCBwb3J0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ091dFBvcnQnKTsKKyAgICAgICAgICAgIHBvcnQuc2V0QXR0cmlidXRlKCduYW1lJywgb3V0cHV0KTsKKyAgICAgICAgICAgIHBvcnQuc2V0QXR0cmlidXRlKCJwb3J0LWlkIiwgb3V0cHV0S2V5c1tpbmRleF0pOworCisgICAgICAgICAgICBsZXQgdjExID0gZ3JhcGguaW5zZXJ0VmVydGV4KHYxLCBudWxsLCBwb3J0LCAxLCAoaW5kZXggKiBvdXRwdXREaXZpc2lvbiArIG91dHB1dERpdmlzaW9uKSwgMTAsIDEwKTsKKyAgICAgICAgICAgIHYxMS5nZW9tZXRyeS5vZmZzZXQgPSBuZXcgbXhQb2ludCgtNSwgLTUpOworICAgICAgICAgICAgdjExLmdlb21ldHJ5LnJlbGF0aXZlID0gdHJ1ZTsKKyAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgICAvLyBVcGRhdGVzIHRoZSBkaXNwbGF5CisgICAgICAgICAgZ3JhcGguZ2V0TW9kZWwoKS5lbmRVcGRhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGdyYXBoLnVwZGF0ZUNlbGxTaXplKHYxKTsKKyAgICAgICAgZ3JhcGguc2V0U2VsZWN0aW9uQ2VsbCh2MSk7CisgICAgICB9OworCisgICAgICAvLyBDcmVhdGVzIHRoZSBpbWFnZSB3aGljaCBpcyB1c2VkIGFzIHRoZSBkcmFnIGljb24gKHByZXZpZXcpCisgICAgICBsZXQgaW1nID0gdG9vbGJhci5hZGRNb2RlKG51bGwsIGltYWdlLCBmdW5jdCk7CisgICAgICBteFV0aWxzLm1ha2VEcmFnZ2FibGUoaW1nLCBncmFwaCwgZnVuY3QpOworICAgIH0KKyAgfTsKK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2FwcC9jb21wb25lbnRzL3dvcmtmbG93L2NyZWF0ZS9jcmVhdGUuaHRtbCBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2FwcC9jb21wb25lbnRzL3dvcmtmbG93L2NyZWF0ZS9jcmVhdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjcyM2QxCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL2NvbXBvbmVudHMvd29ya2Zsb3cvY3JlYXRlL2NyZWF0ZS5odG1sCkBAIC0wLDAgKzEsMjcgQEAKKzxsYWJlbCBmb3I9Indvcmtsb3ctbmFtZSI+V29ya2Zsb3cgTmFtZTwvbGFiZWw+Cis8aW5wdXQgWyhuZ01vZGVsKV09IndvcmtGbG93TmFtZSIgbmFtZT0id29ya2xvdy1uYW1lIiBpZD0id29ya2xvdy1uYW1lIi8+CisKKzx0YWJsZSBzdHlsZT0icG9zaXRpb246cmVsYXRpdmU7Ij4KKyAgPHRyPgorICAgIDx0ZD4KKyAgICAgIDxkaXYgaWQ9InRvb2xDb250YWluZXIiIHN0eWxlPSJib3JkZXI6IHNvbGlkIDFweCBibGFjazsgd2lkdGg6IDgwcHg7IGN1cnNvcjogZGVmYXVsdCI+CisKKyAgICAgIDwvZGl2PgorICAgIDwvdGQ+CisgICAgPHRkPgorICAgICAgPGRpdiBpZD0iZ3JhcGhDb250YWluZXIiCisgICAgICAgICAgIHN0eWxlPSJib3JkZXI6IHNvbGlkIDFweCBibGFjaztvdmVyZmxvdzpoaWRkZW47d2lkdGg6MzIxcHg7IGN1cnNvcjpkZWZhdWx0OyI+CisgICAgICA8L2Rpdj4KKyAgICA8L3RkPgorICAgIDx0ZCB2YWxpZ249InRvcCI+CisgICAgICA8ZGl2IGlkPSJwcm9wZXJ0aWVzIgorICAgICAgICAgICBzdHlsZT0iYm9yZGVyOiBzb2xpZCAxcHggYmxhY2s7IHBhZGRpbmc6IDEwcHg7Ij4KKyAgICAgIDwvZGl2PgorICAgIDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+PC90ZD4KKyAgICA8dGQ+PGJ1dHRvbiAoY2xpY2spPSJvblNob3dXb3JrZmxvd1hNTENsaWNrZWQoKSI+U2hvdyBYTUw8L2J1dHRvbj48L3RkPgorICAgIDx0ZD48YnV0dG9uIChjbGljayk9Im9uQ3JlYXRlV29ya2Zsb3dDbGlja2VkKCkiPkNyZWF0ZSBXb3JrZmxvdzwvYnV0dG9uPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL2NvbXBvbmVudHMvd29ya2Zsb3cvbGlzdC9saXN0Lmh0bWwgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hcHAvY29tcG9uZW50cy93b3JrZmxvdy9saXN0L2xpc3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzQ1NGRkCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL2NvbXBvbmVudHMvd29ya2Zsb3cvbGlzdC9saXN0Lmh0bWwKQEAgLTAsMCArMSwyMyBAQAorPGg0PldvcmtmbG93czwvaDQ+CisKKzxidXR0b24gY2xhc3M9ImJ0biBidG4tZGVmYXVsdC1vdXRsaW5lIiAoY2xpY2spPSJyb3V0ZVRvQ3JlYXRlUGFnZSgpIj5BZGQgV29ya2Zsb3c8L2J1dHRvbj4KKworPHRhYmxlIGNsYXNzPSJ0YWJsZSI+CisgIDx0aGVhZCBjbGFzcz0idGhlYWQtbGlnaHQiPgorCisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+SWQ8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5OYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+PC90aD4KKyAgPC90cj4KKyAgPC90aGVhZD4KKworICA8dGJvZHk+CisgIDx0ciAqbmdGb3I9ImxldCB3b3JrZmxvdyBvZiB0aGlzLndvcmtGbG93cyI+CisgICAgPHRoIHNjb3BlPSJyb3ciPnt7IHdvcmtmbG93LmlkIH19PC90aD4KKyAgICA8dGQ+e3sgd29ya2Zsb3cubmFtZSB9fTwvdGQ+CisgICAgPHRkPjxidXR0b24gKGNsaWNrKT0icm91dGVUb0RldGFpbFBhZ2Uod29ya2Zsb3cuaWQpIj5EZXRhaWw8L2J1dHRvbj48L3RkPgorICA8L3RyPgorICA8L3Rib2R5PgorCis8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL2NvbXBvbmVudHMvd29ya2Zsb3cvbGlzdC93b3JrZmxvdy5saXN0LmNvbXBvbmVudC50cyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2FwcC9jb21wb25lbnRzL3dvcmtmbG93L2xpc3Qvd29ya2Zsb3cubGlzdC5jb21wb25lbnQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4YjlhZAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2FwcC9jb21wb25lbnRzL3dvcmtmbG93L2xpc3Qvd29ya2Zsb3cubGlzdC5jb21wb25lbnQudHMKQEAgLTAsMCArMSw0OSBAQAoraW1wb3J0IHtDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICJAYW5ndWxhci9jb3JlIjsKK2ltcG9ydCB7TmdiTW9kYWwsIE1vZGFsRGlzbWlzc1JlYXNvbnMsIE5nYk1vZGFsUmVmfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7CitpbXBvcnQge0FwaVNlcnZpY2V9IGZyb20gIi4uLy4uLy4uL3NlcnZpY2VzL2FwaS5zZXJ2aWNlIjsKK2ltcG9ydCB7RXhwZXJpbWVudFNlcnZpY2V9IGZyb20gIi4uLy4uLy4uL3NlcnZpY2VzL2V4cGVyaW1lbnQuc2VydmljZSI7CitpbXBvcnQge0V4cGVyaW1lbnR9IGZyb20gIi4uLy4uLy4uL21vZGVscy9leHBlcmltZW50L2V4cGVyaW1lbnQubW9kZWwiOworaW1wb3J0IHtBcHBsaWNhdGlvbklmYWNlfSBmcm9tICIuLi8uLi8uLi9tb2RlbHMvYXBwbGljYXRpb24vYXBwbGljYXRpb24uaWZhY2UubW9kZWwiOworaW1wb3J0IHtBcHBsaWNhdGlvbklmYWNlU2VydmljZX0gZnJvbSAiLi4vLi4vLi4vc2VydmljZXMvYXBwbGljYXRpb24uaWZhY2Uuc2VydmljZSI7CitpbXBvcnQge0V4cGVyaW1lbnRJbnB1dH0gZnJvbSAiLi4vLi4vLi4vbW9kZWxzL2V4cGVyaW1lbnQvZXhwZXJpbWVudC5pbnB1dC5tb2RlbCI7CitpbXBvcnQge0V4cGVyaW1lbnRPdXRwdXR9IGZyb20gIi4uLy4uLy4uL21vZGVscy9leHBlcmltZW50L2V4cGVyaW1lbnQub3V0cHV0Lm1vZGVsIjsKK2ltcG9ydCB7QXBwbGljYXRpb25EZXBsb3ltZW50fSBmcm9tICIuLi8uLi8uLi9tb2RlbHMvYXBwbGljYXRpb24vYXBwbGljYXRpb24uZGVwbG95bWVudC5tb2RlbCI7CitpbXBvcnQge0FwcERlcGxveW1lbnRTZXJ2aWNlfSBmcm9tICIuLi8uLi8uLi9zZXJ2aWNlcy9kZXBsb3ltZW50LnNlcnZpY2UiOworaW1wb3J0IHtDb21wdXRlUmVzb3VyY2V9IGZyb20gIi4uLy4uLy4uL21vZGVscy9jb21wdXRlL2NvbXB1dGUucmVzb3VyY2UubW9kZWwiOworaW1wb3J0IHtDb21wdXRlU2VydmljZX0gZnJvbSAiLi4vLi4vLi4vc2VydmljZXMvY29tcHV0ZS5zZXJ2aWNlIjsKK2ltcG9ydCB7Um91dGVyfSBmcm9tICJAYW5ndWxhci9yb3V0ZXIiOworaW1wb3J0IHtXb3JrRmxvd30gZnJvbSAiLi4vLi4vLi4vbW9kZWxzL3dvcmtmbG93L3dvcmtmbG93Lm1vZGVsIjsKK2ltcG9ydCB7V29ya2Zsb3dTZXJ2aWNlfSBmcm9tICIuLi8uLi8uLi9zZXJ2aWNlcy93b3JrZmxvdy5zZXJ2aWNlIjsKKworLyoqCisgKiBDcmVhdGVkIGJ5IGRpbXV0aHUgb24gMTAvMjkvMTcuCisgKi8KKworQENvbXBvbmVudCh7CisgIHRlbXBsYXRlVXJsOiAnLi9saXN0Lmh0bWwnLAorICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLAorICBwcm92aWRlcnM6IFtXb3JrZmxvd1NlcnZpY2VdCit9KQorZXhwb3J0IGNsYXNzIFdvcmtmbG93TGlzdENvbXBvbmVudCB7CisKKyAgd29ya0Zsb3dzOiBBcnJheTxXb3JrRmxvdz4gPSBbXTsKKworICBjb25zdHJ1Y3Rvcihwcml2YXRlIHdvcmtmbG93U2VydmljZTogV29ya2Zsb3dTZXJ2aWNlLCBwcml2YXRlIHJvdXRlcjogUm91dGVyKSB7CisgICAgdGhpcy5nZXRBbGxXb3JrRmxvd3MoKTsKKyAgfQorCisgIHJvdXRlVG9EZXRhaWxQYWdlKGlkOiBudW1iZXIpIHsKKyAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCIvZXhwZXJpbWVudC9kZXRhaWwvIitpZCk7CisgIH0KKworICByb3V0ZVRvQ3JlYXRlUGFnZSgpIHsKKyAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCIvd29ya2Zsb3cvY3JlYXRlIikKKyAgfQorCisgIGdldEFsbFdvcmtGbG93cygpIHsKKyAgICB0aGlzLndvcmtmbG93U2VydmljZS5nZXRBbGxXb3JrZmxvd3MoKS5zdWJzY3JpYmUoCisgICAgICBkYXRhID0+IHt0aGlzLndvcmtGbG93cyA9IGRhdGF9LAorICAgICAgZXJyID0+IHtjb25zb2xlLmxvZyhlcnIpO30pOworICB9CisKK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2FwcC9tb2RlbHMvdGFzay90eXBlL29wZXJhdGlvbi9vcGVyYXRpb24uaW5wb3J0LnR5cGUubW9kZWwudHMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hcHAvbW9kZWxzL3Rhc2svdHlwZS9vcGVyYXRpb24vb3BlcmF0aW9uLmlucG9ydC50eXBlLm1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MmIwZjIKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hcHAvbW9kZWxzL3Rhc2svdHlwZS9vcGVyYXRpb24vb3BlcmF0aW9uLmlucG9ydC50eXBlLm1vZGVsLnRzCkBAIC0wLDAgKzEsOSBAQAorZXhwb3J0IGNsYXNzIE9wZXJhdGlvbkluUG9ydCB7CisgIGlkOiBudW1iZXI7CisgIG5hbWU6IHN0cmluZzsKKworICBjb25zdHJ1Y3RvcihpZDogbnVtYmVyLCBuYW1lOiBzdHJpbmcpIHsKKyAgICB0aGlzLmlkID0gaWQ7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL21vZGVscy90YXNrL3R5cGUvb3BlcmF0aW9uL29wZXJhdGlvbi5vdXRwb3J0LnR5cGUubW9kZWwudHMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hcHAvbW9kZWxzL3Rhc2svdHlwZS9vcGVyYXRpb24vb3BlcmF0aW9uLm91dHBvcnQudHlwZS5tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGE0YjM4Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL21vZGVscy90YXNrL3R5cGUvb3BlcmF0aW9uL29wZXJhdGlvbi5vdXRwb3J0LnR5cGUubW9kZWwudHMKQEAgLTAsMCArMSw5IEBACitleHBvcnQgY2xhc3MgT3BlcmF0aW9uT3V0UG9ydCB7CisgIGlkOiBudW1iZXI7CisgIG5hbWU6IHN0cmluZzsKKworICBjb25zdHJ1Y3RvcihpZDogbnVtYmVyLCBuYW1lOiBzdHJpbmcpIHsKKyAgICB0aGlzLmlkID0gaWQ7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL21vZGVscy90YXNrL3R5cGUvb3BlcmF0aW9uL29wZXJhdGlvbi50eXBlLm1vZGVsLnRzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL21vZGVscy90YXNrL3R5cGUvb3BlcmF0aW9uL29wZXJhdGlvbi50eXBlLm1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Yjc1NjAKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hcHAvbW9kZWxzL3Rhc2svdHlwZS9vcGVyYXRpb24vb3BlcmF0aW9uLnR5cGUubW9kZWwudHMKQEAgLTAsMCArMSwyOSBAQAoraW1wb3J0IHtPcGVyYXRpb25JblBvcnR9IGZyb20gIi4vb3BlcmF0aW9uLmlucG9ydC50eXBlLm1vZGVsIjsKK2ltcG9ydCB7T3BlcmF0aW9uT3V0UG9ydH0gZnJvbSAiLi9vcGVyYXRpb24ub3V0cG9ydC50eXBlLm1vZGVsIjsKKworZXhwb3J0IGNsYXNzIE9wZXJhdGlvblR5cGUgeworICBpZDogbnVtYmVyOworICBuYW1lOiBzdHJpbmc7CisgIGljb246IHN0cmluZyA9ICJhc3NldHMvaWNvbnMvc3NoLnBuZyI7CisgIGluUG9ydHM6IEFycmF5PE9wZXJhdGlvbkluUG9ydD4gPSBbXTsKKyAgb3V0UG9ydHM6IEFycmF5PE9wZXJhdGlvbk91dFBvcnQ+ID0gW107CisKKyAgY2xvbmUoKTogT3BlcmF0aW9uVHlwZSB7CisgICAgbGV0IGNsb25lZDogT3BlcmF0aW9uVHlwZSA9IG5ldyBPcGVyYXRpb25UeXBlKCk7CisgICAgY2xvbmVkLmlkID0gdGhpcy5pZDsKKyAgICBjbG9uZWQubmFtZSA9IHRoaXMubmFtZTsKKyAgICBjbG9uZWQuaWNvbiA9IHRoaXMuaWNvbjsKKworICAgIHRoaXMuaW5Qb3J0cy5mb3JFYWNoKChpblBvcnQpID0+IHsKKyAgICAgIGxldCBjbG9uZWRJblBvcnQ6IE9wZXJhdGlvbkluUG9ydCA9IG5ldyBPcGVyYXRpb25JblBvcnQoaW5Qb3J0LmlkLCBpblBvcnQubmFtZSk7CisgICAgICBjbG9uZWQuaW5Qb3J0cy5wdXNoKGNsb25lZEluUG9ydCk7CisgICAgfSk7CisKKyAgICB0aGlzLm91dFBvcnRzLmZvckVhY2goKG91dFBvcnQpID0+IHsKKyAgICAgIGxldCBjbG9uZWRPdXRQb3J0OiBPcGVyYXRpb25PdXRQb3J0ID0gbmV3IE9wZXJhdGlvbk91dFBvcnQob3V0UG9ydC5pZCwgb3V0UG9ydC5uYW1lKTsKKyAgICAgIGNsb25lZC5vdXRQb3J0cy5wdXNoKGNsb25lZE91dFBvcnQpOworICAgIH0pOworCisgICAgcmV0dXJuIGNsb25lZDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL21vZGVscy90YXNrL3R5cGUvdGFzay5pbnB1dC50eXBlLm1vZGVsLnRzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL21vZGVscy90YXNrL3R5cGUvdGFzay5pbnB1dC50eXBlLm1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzA4NDcKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hcHAvbW9kZWxzL3Rhc2svdHlwZS90YXNrLmlucHV0LnR5cGUubW9kZWwudHMKQEAgLTAsMCArMSwxNCBAQAorZXhwb3J0IGNsYXNzIFRhc2tJbnB1dFR5cGUgeworICBpZDogbnVtYmVyOworICBuYW1lOiBTdHJpbmc7CisgIHR5cGU6IFN0cmluZzsKKyAgZGVmYXVsdFZhbHVlOiBzdHJpbmc7CisKKworICBjb25zdHJ1Y3RvcihpZDogbnVtYmVyID0gMCwgbmFtZTogU3RyaW5nID0gbnVsbCwgdHlwZTogU3RyaW5nID0gbnVsbCwgZGVmYXVsdFZhbHVlOiBzdHJpbmcgPSBudWxsKSB7CisgICAgdGhpcy5pZCA9IGlkOworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL21vZGVscy90YXNrL3R5cGUvdGFzay5vdXRwb3J0Lm1vZGVsLnRzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL21vZGVscy90YXNrL3R5cGUvdGFzay5vdXRwb3J0Lm1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OGIwYmUKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hcHAvbW9kZWxzL3Rhc2svdHlwZS90YXNrLm91dHBvcnQubW9kZWwudHMKQEAgLTAsMCArMSwxMiBAQAorZXhwb3J0IGNsYXNzIFRhc2tPdXRQb3J0IHsKKyAgaWQ6IG51bWJlcjsKKyAgbmFtZTogc3RyaW5nOworICBvcmRlcjogbnVtYmVyOworCisKKyAgY29uc3RydWN0b3IoaWQ6IG51bWJlciA9MCAsIG5hbWU6IHN0cmluZyA9IG51bGwsIG9yZGVyOiBudW1iZXIgPSAwKSB7CisgICAgdGhpcy5pZCA9IGlkOworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy5vcmRlciA9IG9yZGVyOworICB9Cit9CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hcHAvbW9kZWxzL3Rhc2svdHlwZS90YXNrLm91dHB1dC50eXBlLm1vZGVsLnRzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL21vZGVscy90YXNrL3R5cGUvdGFzay5vdXRwdXQudHlwZS5tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTk1NjAzCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL21vZGVscy90YXNrL3R5cGUvdGFzay5vdXRwdXQudHlwZS5tb2RlbC50cwpAQCAtMCwwICsxLDEyIEBACitleHBvcnQgY2xhc3MgVGFza091dHB1dFR5cGUgeworICBpZDogbnVtYmVyOworICBuYW1lOiBzdHJpbmc7CisgIHR5cGU6IHN0cmluZzsKKworCisgIGNvbnN0cnVjdG9yKGlkOiBudW1iZXIgPSAwLCBuYW1lOiBzdHJpbmcgPSBudWxsLCB0eXBlOiBzdHJpbmcgPSBudWxsKSB7CisgICAgdGhpcy5pZCA9IGlkOworICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL21vZGVscy90YXNrL3R5cGUvdGFzay50eXBlLm1vZGVsLnRzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL21vZGVscy90YXNrL3R5cGUvdGFzay50eXBlLm1vZGVsLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NzIzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hcHAvbW9kZWxzL3Rhc2svdHlwZS90YXNrLnR5cGUubW9kZWwudHMKQEAgLTAsMCArMSwzOSBAQAoraW1wb3J0IHtUYXNrSW5wdXRUeXBlfSBmcm9tICIuL3Rhc2suaW5wdXQudHlwZS5tb2RlbCI7CitpbXBvcnQge1Rhc2tPdXRwdXRUeXBlfSBmcm9tICIuL3Rhc2sub3V0cHV0LnR5cGUubW9kZWwiOworaW1wb3J0IHtUYXNrT3V0UG9ydH0gZnJvbSAiLi90YXNrLm91dHBvcnQubW9kZWwiOworZXhwb3J0IGNsYXNzIFRhc2tUeXBlIHsKKworICBpZDogbnVtYmVyOworICBuYW1lOiBzdHJpbmc7CisgIHRvcGljTmFtZTogc3RyaW5nOworICBpY29uOiBzdHJpbmcgPSAiYXNzZXRzL2ljb25zL3NzaC5wbmciOworICBpbnB1dFR5cGVzOiBBcnJheTxUYXNrSW5wdXRUeXBlPiA9IFtdOworICBvdXRwdXRUeXBlczogQXJyYXk8VGFza091dHB1dFR5cGU+ID0gW107CisgIG91dFBvcnRzOiBBcnJheTxUYXNrT3V0UG9ydD4gPSBbXTsKKworICBjbG9uZSgpOiBUYXNrVHlwZSB7CisgICAgbGV0IGNsb25lZDogVGFza1R5cGUgPSBuZXcgVGFza1R5cGUoKTsKKyAgICBjbG9uZWQuaWQgPSB0aGlzLmlkOworICAgIGNsb25lZC5uYW1lID0gdGhpcy5uYW1lOworICAgIGNsb25lZC5pY29uID0gdGhpcy5pY29uOworICAgIGNsb25lZC50b3BpY05hbWUgPSB0aGlzLnRvcGljTmFtZTsKKworICAgIHRoaXMuaW5wdXRUeXBlcy5mb3JFYWNoKChpbnB1dCkgPT4geworICAgICAgbGV0IGNsb25lZElucHV0OiBUYXNrSW5wdXRUeXBlID0gbmV3IFRhc2tJbnB1dFR5cGUoaW5wdXQuaWQsIGlucHV0Lm5hbWUsIGlucHV0LnR5cGUsIGlucHV0LmRlZmF1bHRWYWx1ZSk7CisgICAgICBjbG9uZWQuaW5wdXRUeXBlcy5wdXNoKGNsb25lZElucHV0KTsKKyAgICB9KTsKKworICAgIHRoaXMub3V0cHV0VHlwZXMuZm9yRWFjaCgob3V0cHV0KSA9PiB7CisgICAgICBsZXQgY2xvbmVkT3V0cHV0OiBUYXNrT3V0cHV0VHlwZSA9IG5ldyBUYXNrT3V0cHV0VHlwZShvdXRwdXQuaWQsIG91dHB1dC5uYW1lLCBvdXRwdXQudHlwZSk7CisgICAgICBjbG9uZWQub3V0cHV0VHlwZXMucHVzaChjbG9uZWRPdXRwdXQpOworICAgIH0pOworCisgICAgdGhpcy5vdXRQb3J0cy5mb3JFYWNoKChvdXRQb3J0KSA9PiB7CisgICAgICBsZXQgY2xvbmVkT3V0UG9ydDogVGFza091dFBvcnQgPSBuZXcgVGFza091dFBvcnQob3V0UG9ydC5pZCwgb3V0UG9ydC5uYW1lLCBvdXRQb3J0Lm9yZGVyKTsKKyAgICAgIGNsb25lZC5vdXRQb3J0cy5wdXNoKGNsb25lZE91dFBvcnQpOworICAgIH0pOworCisgICAgcmV0dXJuIGNsb25lZDsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hcHAvbW9kZWxzL3dvcmtmbG93L3dvcmtmbG93Lm1vZGVsLnRzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL21vZGVscy93b3JrZmxvdy93b3JrZmxvdy5tb2RlbC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDM3YzI2Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL21vZGVscy93b3JrZmxvdy93b3JrZmxvdy5tb2RlbC50cwpAQCAtMCwwICsxLDggQEAKK2V4cG9ydCBjbGFzcyBXb3JrRmxvdyB7CisKKyAgaWQ6IG51bWJlcjsKKyAgbmFtZTogc3RyaW5nOworICB3b3JrZmxvd0dyYXBoWE1MOiBzdHJpbmc7CisgIHByb2Nlc3NJZHM6IEFycmF5PG51bWJlcj4gPSBbXTsKKworfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL3NlcnZpY2VzL3Rhc2suc2VydmljZS50cyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2FwcC9zZXJ2aWNlcy90YXNrLnNlcnZpY2UudHMKaW5kZXggZDdiMTdlZC4uZjk0NGFiMCAxMDA2NDQKLS0tIGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL3NlcnZpY2VzL3Rhc2suc2VydmljZS50cworKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hcHAvc2VydmljZXMvdGFzay5zZXJ2aWNlLnRzCkBAIC0yMiw0ICsyMiw4IEBACiAgIGFkZFRhc2sodGFzazogVGFzaykgewogICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucG9zdCgidGFzayIsIHRhc2spOwogICB9CisKKyAgZ2V0QWxsVGFza1R5cGVzKCkgeworICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UuZ2V0KCJ0YXNrVHlwZSIpLm1hcChyZXMgPT4gcmVzLmpzb24oKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2FwcC9zZXJ2aWNlcy93b3JrZmxvdy5zZXJ2aWNlLnRzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXBwL3NlcnZpY2VzL3dvcmtmbG93LnNlcnZpY2UudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1MmJkOQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2FwcC9zZXJ2aWNlcy93b3JrZmxvdy5zZXJ2aWNlLnRzCkBAIC0wLDAgKzEsMTcgQEAKK2ltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICJAYW5ndWxhci9jb3JlIjsKK2ltcG9ydCB7QXBpU2VydmljZX0gZnJvbSAiLi9hcGkuc2VydmljZSI7CisKK0BJbmplY3RhYmxlKCkKK2V4cG9ydCBjbGFzcyBXb3JrZmxvd1NlcnZpY2UgeworCisgIGNvbnN0cnVjdG9yKEBJbmplY3QoQXBpU2VydmljZSkgcHJpdmF0ZSBhcGlTZXJ2aWNlOkFwaVNlcnZpY2UpIHsKKyAgfQorCisgIGNyZWF0ZVdvcmtmbG93KG5hbWU6IHN0cmluZywgeG1sOiBhbnkpIHsKKyAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLnBvc3QoIndvcmtmbG93L2NyZWF0ZS8iICsgbmFtZSwgeG1sKQorICB9CisKKyAgZ2V0QWxsV29ya2Zsb3dzKCkgeworICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UuZ2V0KCJ3b3JrZmxvdyIpLm1hcChyZXMgPT4gcmVzLmpzb24oKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9jc3MvY29tbW9uLmNzcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9jc3MvY29tbW9uLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzMzZjZmCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2Nzcy9jb21tb24uY3NzCkBAIC0wLDAgKzEsMTYwIEBACitkaXYubXhSdWJiZXJiYW5kIHsKKwlwb3NpdGlvbjogYWJzb2x1dGU7CisJb3ZlcmZsb3c6IGhpZGRlbjsKKwlib3JkZXItc3R5bGU6IHNvbGlkOworCWJvcmRlci13aWR0aDogMXB4OworCWJvcmRlci1jb2xvcjogIzAwMDBGRjsKKwliYWNrZ3JvdW5kOiAjMDA3N0ZGOworfQorLm14Q2VsbEVkaXRvciB7CisJYmFja2dyb3VuZDogdXJsKCcuLi9pbWFnZXMvdHJhbnNwYXJlbnQuZ2lmJyk7CisJYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDsKKwlib3JkZXItc3R5bGU6IHNvbGlkOworCXBvc2l0aW9uOiBhYnNvbHV0ZTsKKwlvdmVyZmxvdzogdmlzaWJsZTsKKwl3b3JkLXdyYXA6IG5vcm1hbDsKKwlib3JkZXItd2lkdGg6IDA7CisJbWluLXdpZHRoOiAxcHg7CisJcmVzaXplOiBub25lOworCXBhZGRpbmc6IDBweDsKKwltYXJnaW46IDBweDsKK30KKy5teFBsYWluVGV4dEVkaXRvciAqIHsKKwlwYWRkaW5nOiAwcHg7CisJbWFyZ2luOiAwcHg7Cit9CitkaXYubXhXaW5kb3cgeworCS13ZWJraXQtYm94LXNoYWRvdzogM3B4IDNweCAxMnB4ICNDMEMwQzA7CisJLW1vei1ib3gtc2hhZG93OiAzcHggM3B4IDEycHggI0MwQzBDMDsKKwlib3gtc2hhZG93OiAzcHggM3B4IDEycHggI0MwQzBDMDsKKwliYWNrZ3JvdW5kOiB1cmwoJy4uL2ltYWdlcy93aW5kb3cuZ2lmJyk7CisJYm9yZGVyOjFweCBzb2xpZCAjYzNjM2MzOworCXBvc2l0aW9uOiBhYnNvbHV0ZTsKKwlvdmVyZmxvdzogaGlkZGVuOworCXotaW5kZXg6IDE7Cit9Cit0YWJsZS5teFdpbmRvdyB7CisJYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKwl0YWJsZS1sYXlvdXQ6IGZpeGVkOworICAJZm9udC1mYW1pbHk6IEFyaWFsOworCWZvbnQtc2l6ZTogOHB0OworfQordGQubXhXaW5kb3dUaXRsZSB7CisJYmFja2dyb3VuZDogdXJsKCcuLi9pbWFnZXMvd2luZG93LXRpdGxlLmdpZicpIHJlcGVhdC14OworCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOworCXdoaXRlLXNwYWNlOiBub3dyYXA7CisgCXRleHQtYWxpZ246IGNlbnRlcjsKKyAJZm9udC13ZWlnaHQ6IGJvbGQ7CisgCW92ZXJmbG93OiBoaWRkZW47CisJaGVpZ2h0OiAxM3B4OworCXBhZGRpbmc6IDJweDsKKyAJcGFkZGluZy10b3A6IDRweDsKKyAJcGFkZGluZy1ib3R0b206IDZweDsKKyAJY29sb3I6IGJsYWNrOworfQordGQubXhXaW5kb3dQYW5lIHsKKwl2ZXJ0aWNhbC1hbGlnbjogdG9wOworCXBhZGRpbmc6IDBweDsKK30KK2Rpdi5teFdpbmRvd1BhbmUgeworCW92ZXJmbG93OiBoaWRkZW47CisJcG9zaXRpb246IHJlbGF0aXZlOworfQordGQubXhXaW5kb3dQYW5lIHRkIHsKKyAgCWZvbnQtZmFtaWx5OiBBcmlhbDsKKwlmb250LXNpemU6IDhwdDsKK30KK3RkLm14V2luZG93UGFuZSBpbnB1dCwgdGQubXhXaW5kb3dQYW5lIHNlbGVjdCwgdGQubXhXaW5kb3dQYW5lIHRleHRhcmVhLCB0ZC5teFdpbmRvd1BhbmUgcmFkaW8geworICAJYm9yZGVyLWNvbG9yOiAjOEM4QzhDOworICAJYm9yZGVyLXN0eWxlOiBzb2xpZDsKKyAgCWJvcmRlci13aWR0aDogMXB4OworICAJZm9udC1mYW1pbHk6IEFyaWFsOworCWZvbnQtc2l6ZTogOHB0OworIAlwYWRkaW5nOiAxcHg7Cit9Cit0ZC5teFdpbmRvd1BhbmUgYnV0dG9uIHsKKwliYWNrZ3JvdW5kOiB1cmwoJy4uL2ltYWdlcy9idXR0b24uZ2lmJykgcmVwZWF0LXg7CisgIAlmb250LWZhbWlseTogQXJpYWw7CisgIAlmb250LXNpemU6IDhwdDsKKyAgCXBhZGRpbmc6IDJweDsKKwlmbG9hdDogbGVmdDsKK30KK2ltZy5teFRvb2xiYXJJdGVtIHsKKwltYXJnaW4tcmlnaHQ6IDZweDsKKwltYXJnaW4tYm90dG9tOiA2cHg7CisJYm9yZGVyLXdpZHRoOiAxcHg7Cit9CitzZWxlY3QubXhUb29sYmFyQ29tYm8geworCXZlcnRpY2FsLWFsaWduOiB0b3A7CisJYm9yZGVyLXN0eWxlOiBpbnNldDsKKwlib3JkZXItd2lkdGg6IDJweDsKK30KK2Rpdi5teFRvb2xiYXJDb21ib0NvbnRhaW5lciB7CisJcGFkZGluZzogMnB4OworfQoraW1nLm14VG9vbGJhck1vZGUgeworCW1hcmdpbjogMnB4OworCW1hcmdpbi1yaWdodDogNHB4OworCW1hcmdpbi1ib3R0b206IDRweDsKKwlib3JkZXItd2lkdGg6IDBweDsKK30KK2ltZy5teFRvb2xiYXJNb2RlU2VsZWN0ZWQgeworCW1hcmdpbjogMHB4OworCW1hcmdpbi1yaWdodDogMnB4OworCW1hcmdpbi1ib3R0b206IDJweDsKKwlib3JkZXItd2lkdGg6IDJweDsKKwlib3JkZXItc3R5bGU6IGluc2V0OworfQorZGl2Lm14VG9vbHRpcCB7CisJLXdlYmtpdC1ib3gtc2hhZG93OiAzcHggM3B4IDEycHggI0MwQzBDMDsKKwktbW96LWJveC1zaGFkb3c6IDNweCAzcHggMTJweCAjQzBDMEMwOworCWJveC1zaGFkb3c6IDNweCAzcHggMTJweCAjQzBDMEMwOworCWJhY2tncm91bmQ6ICNGRkZGQ0M7CisJYm9yZGVyLXN0eWxlOiBzb2xpZDsKKwlib3JkZXItd2lkdGg6IDFweDsKKwlib3JkZXItY29sb3I6IGJsYWNrOworCWZvbnQtZmFtaWx5OiBBcmlhbDsKKwlmb250LXNpemU6IDhwdDsKKwlwb3NpdGlvbjogYWJzb2x1dGU7CisJY3Vyc29yOiBkZWZhdWx0OworCXBhZGRpbmc6IDRweDsKKwljb2xvcjogYmxhY2s7Cit9CitkaXYubXhQb3B1cE1lbnUgeworCS13ZWJraXQtYm94LXNoYWRvdzogM3B4IDNweCAxMnB4ICNDMEMwQzA7CisJLW1vei1ib3gtc2hhZG93OiAzcHggM3B4IDEycHggI0MwQzBDMDsKKwlib3gtc2hhZG93OiAzcHggM3B4IDEycHggI0MwQzBDMDsKKwliYWNrZ3JvdW5kOiB1cmwoJy4uL2ltYWdlcy93aW5kb3cuZ2lmJyk7CisJcG9zaXRpb246IGFic29sdXRlOworCWJvcmRlci1zdHlsZTogc29saWQ7CisJYm9yZGVyLXdpZHRoOiAxcHg7CisJYm9yZGVyLWNvbG9yOiBibGFjazsKK30KK3RhYmxlLm14UG9wdXBNZW51IHsKKwlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworCW1hcmdpbi10b3A6IDFweDsKKwltYXJnaW4tYm90dG9tOiAxcHg7Cit9Cit0ci5teFBvcHVwTWVudUl0ZW0geworCWNvbG9yOiBibGFjazsKKwljdXJzb3I6IHBvaW50ZXI7Cit9Cit0ci5teFBvcHVwTWVudUl0ZW1Ib3ZlciB7CisJYmFja2dyb3VuZC1jb2xvcjogIzAwMDA2NjsKKwljb2xvcjogI0ZGRkZGRjsKKwljdXJzb3I6IHBvaW50ZXI7Cit9Cit0ZC5teFBvcHVwTWVudUl0ZW0geworCXBhZGRpbmc6IDJweCAzMHB4IDJweCAxMHB4OworCXdoaXRlLXNwYWNlOiBub3dyYXA7CisJZm9udC1mYW1pbHk6IEFyaWFsOworCWZvbnQtc2l6ZTogOHB0OworfQordGQubXhQb3B1cE1lbnVJY29uIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRDBEMEQwOworCXBhZGRpbmc6IDJweCA0cHggMnB4IDRweDsKK30KKy5teERpc2FibGVkIHsKKwlvcGFjaXR5OiAwLjIgIWltcG9ydGFudDsKKwljdXJzb3I6ZGVmYXVsdCAhaW1wb3J0YW50OworfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2Nzcy9leHBsb3Jlci5jc3MgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvY3NzL2V4cGxvcmVyLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGU3MDRmCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2Nzcy9leHBsb3Jlci5jc3MKQEAgLTAsMCArMSwxOCBAQAorZGl2Lm14VG9vbHRpcCB7CisJZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5Ecm9wU2hhZG93KE9mZlg9NCwgT2ZmWT00LCAKKyAgICAgICAgQ29sb3I9JyNBMkEyQTInLCBQb3NpdGl2ZT0ndHJ1ZScpOworfQorZGl2Lm14UG9wdXBNZW51IHsKKwlmaWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkRyb3BTaGFkb3coT2ZmWD00LCBPZmZZPTQsIAorICAgICAgICBDb2xvcj0nI0MwQzBDMCcsIFBvc2l0aXZlPSd0cnVlJyk7Cit9CitkaXYubXhXaW5kb3cgeworCV9maWx0ZXI6cHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkRyb3BTaGFkb3coT2ZmWD00LCBPZmZZPTQsIAorICAgICAgICBDb2xvcj0nI0MwQzBDMCcsIFBvc2l0aXZlPSd0cnVlJyk7Cit9Cit0ZC5teFdpbmRvd1RpdGxlIHsKKwlfaGVpZ2h0OiAyM3B4OworfQorLm14RGlzYWJsZWQgeworCWZpbHRlcjphbHBoYShvcGFjaXR5PTIwKSAhaW1wb3J0YW50OworfQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ljb25zL2NvcHkucG5nIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ljb25zL2NvcHkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI2ZWZiNTgKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaWNvbnMvY29weS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ljb25zL2h0dHAucG5nIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ljb25zL2h0dHAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhjYmQ4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaWNvbnMvaHR0cC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ljb25zL3BhcmFsbGVsLnBuZyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9pY29ucy9wYXJhbGxlbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGUxMGI3YwotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9pY29ucy9wYXJhbGxlbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ljb25zL3MzLnBuZyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9pY29ucy9zMy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDg0NWZmZgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9pY29ucy9zMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ljb25zL3NzaC5wbmcgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaWNvbnMvc3NoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZTlmOTFkCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ljb25zL3NzaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ljb25zL3N0YXJ0LnBuZyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9pY29ucy9zdGFydC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODcxZmUzNgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9pY29ucy9zdGFydC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ljb25zL3N0b3AucG5nIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ljb25zL3N0b3AucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZjYzlhY2UKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaWNvbnMvc3RvcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9idXR0b24uZ2lmIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9idXR0b24uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNTVjYWIKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaW1hZ2VzL2J1dHRvbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9jbG9zZS5naWYgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaW1hZ2VzL2Nsb3NlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDY5ZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9jbG9zZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9jb2xsYXBzZWQuZ2lmIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9jb2xsYXBzZWQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNzY0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaW1hZ2VzL2NvbGxhcHNlZC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9lcnJvci5naWYgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaW1hZ2VzL2Vycm9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGUxYWVlCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9lcnJvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9leHBhbmRlZC5naWYgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaW1hZ2VzL2V4cGFuZGVkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzY3YjBiCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9leHBhbmRlZC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9tYXhpbWl6ZS5naWYgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaW1hZ2VzL21heGltaXplLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjdjZjNlCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9tYXhpbWl6ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9taW5pbWl6ZS5naWYgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaW1hZ2VzL21pbmltaXplLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTk1ZTdjCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9taW5pbWl6ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9ub3JtYWxpemUuZ2lmIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9ub3JtYWxpemUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YThkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaW1hZ2VzL25vcm1hbGl6ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9wb2ludC5naWYgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaW1hZ2VzL3BvaW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDc0YzM5Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9wb2ludC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9yZXNpemUuZ2lmIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9yZXNpemUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTU4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaW1hZ2VzL3Jlc2l6ZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9zZXBhcmF0b3IuZ2lmIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9zZXBhcmF0b3IuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMWI4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaW1hZ2VzL3NlcGFyYXRvci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy9zdWJtZW51LmdpZiBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9pbWFnZXMvc3VibWVudS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlNzYxNwotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9pbWFnZXMvc3VibWVudS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy90cmFuc3BhcmVudC5naWYgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaW1hZ2VzL3RyYW5zcGFyZW50LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA0MGYyCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy90cmFuc3BhcmVudC5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy93YXJuaW5nLmdpZiBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9pbWFnZXMvd2FybmluZy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1MjM1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9pbWFnZXMvd2FybmluZy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy93YXJuaW5nLnBuZyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9pbWFnZXMvd2FybmluZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3ODc4OQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9pbWFnZXMvd2FybmluZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy93aW5kb3ctdGl0bGUuZ2lmIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy93aW5kb3ctdGl0bGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMWRlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaW1hZ2VzL3dpbmRvdy10aXRsZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy93aW5kb3cuZ2lmIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2ltYWdlcy93aW5kb3cuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MzFjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvaW1hZ2VzL3dpbmRvdy5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2NvbXBvbmVudHMuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvY29tcG9uZW50cy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2UxODZmCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2NvbXBvbmVudHMuanMKQEAgLTAsMCArMSw1MyBAQAorZnVuY3Rpb24gZmV0Y2hDb21wb25lbnQobmFtZSwgZG9jKSB7CisgICAgaWYgKG5hbWUgPT0gIlNTSCIpIHsKKyAgICAgICAgdmFyIHBlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ1Byb2Nlc3NpbmdFbGVtZW50Jyk7CisgICAgICAgIHBlLnNldEF0dHJpYnV0ZSgnbmFtZScsICdTU0ggUHJvY2Vzc2luZyBlbGVtZW50Jyk7CisgICAgICAgIHBlLnNldEF0dHJpYnV0ZSgnVHlwZScsICdQUk9DRVNTSU5HX0VMRU1FTlQnKTsKKyAgICAgICAgcGUuc2V0QXR0cmlidXRlKCdDb21wdXRlLWhvc3QnLCAnMTkyLjE2OC4xLjExMicpOworICAgICAgICBwZS5zZXRBdHRyaWJ1dGUoJ1VzZXInLCAncm9vdCcpOworICAgICAgICBwZS5zZXRBdHRyaWJ1dGUoJ1Bhc3N3b3JkJywgJ3Bhc3N3b3JkJyk7CisgICAgICAgIHBlLnNldEF0dHJpYnV0ZSgnQ29tbWFuZCcsICcnKTsKKyAgICAgICAgcGUuc2V0QXR0cmlidXRlKCdBcmd1bWVudHMnLCAnJyk7CisgICAgICAgIHBlLnNldEF0dHJpYnV0ZSgib3V0LTEiLCAiT3V0cHV0Iik7CisgICAgICAgIHBlLnNldEF0dHJpYnV0ZSgib3V0LTIiLCAiRXJyb3IiKTsKKyAgICAgICAgcGUuc2V0QXR0cmlidXRlKCJpbi0xIiwgIklucHV0Iik7CisgICAgICAgIHJldHVybiBwZTsKKyAgICB9IGVsc2UgaWYgKG5hbWUgPT0gIkNQIikgeworICAgICAgICB2YXIgcGUgPSBkb2MuY3JlYXRlRWxlbWVudCgnUHJvY2Vzc2luZ0VsZW1lbnQnKTsKKyAgICAgICAgcGUuc2V0QXR0cmlidXRlKCduYW1lJywgJ0NvcHkgUHJvY2Vzc2luZyBlbGVtZW50Jyk7CisgICAgICAgIHBlLnNldEF0dHJpYnV0ZSgndHlwZScsICdQUk9DRVNTSU5HX0VMRU1FTlQnKTsKKyAgICAgICAgcGUuc2V0QXR0cmlidXRlKCJvdXQtMSIsICJPdXRwdXQiKTsKKyAgICAgICAgcGUuc2V0QXR0cmlidXRlKCJvdXQtMiIsICJFcnJvciIpOworICAgICAgICBwZS5zZXRBdHRyaWJ1dGUoImluLTEiLCAiSW5wdXQiKTsKKyAgICAgICAgcmV0dXJuIHBlOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiUzMiKSB7CisgICAgICAgIHZhciBwZSA9IGRvYy5jcmVhdGVFbGVtZW50KCdQcm9jZXNzaW5nRWxlbWVudCcpOworICAgICAgICBwZS5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnUzMgUHJvY2Vzc2luZyBlbGVtZW50Jyk7CisgICAgICAgIHBlLnNldEF0dHJpYnV0ZSgndHlwZScsICdQUk9DRVNTSU5HX0VMRU1FTlQnKTsKKyAgICAgICAgcGUuc2V0QXR0cmlidXRlKCJvdXQtMSIsICJPdXRwdXQiKTsKKyAgICAgICAgcGUuc2V0QXR0cmlidXRlKCJvdXQtMiIsICJFcnJvciIpOworICAgICAgICBwZS5zZXRBdHRyaWJ1dGUoImluLTEiLCAiSW5wdXQiKTsKKyAgICAgICAgcmV0dXJuIHBlOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiU1RBUlQiKSB7CisgICAgICAgIHZhciBwZSA9IGRvYy5jcmVhdGVFbGVtZW50KCdQcm9jZXNzaW5nRWxlbWVudCcpOworICAgICAgICBwZS5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAnU3RhcnQgT3BlcmF0aW9uJyk7CisgICAgICAgIHBlLnNldEF0dHJpYnV0ZSgndHlwZScsICdPUEVSQVRJT04nKTsKKyAgICAgICAgcGUuc2V0QXR0cmlidXRlKCJvdXQtMSIsICJPdXRwdXQiKTsKKyAgICAgICAgcmV0dXJuIHBlOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSAiU1RPUCIpIHsKKyAgICAgICAgdmFyIHBlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ1Byb2Nlc3NpbmdFbGVtZW50Jyk7CisgICAgICAgIHBlLnNldEF0dHJpYnV0ZSgnbmFtZScsICdTdG9wIE9wZXJhdGlvbicpOworICAgICAgICBwZS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnT1BFUkFUSU9OJyk7CisgICAgICAgIHBlLnNldEF0dHJpYnV0ZSgiaW4tMSIsICJJbnB1dCIpOworICAgICAgICByZXR1cm4gcGU7CisgICAgfSBlbHNlIGlmIChuYW1lID0gIlBBUkFMTEVMIikgeworICAgICAgICB2YXIgcGUgPSBkb2MuY3JlYXRlRWxlbWVudCgnUHJvY2Vzc2luZ0VsZW1lbnQnKTsKKyAgICAgICAgcGUuc2V0QXR0cmlidXRlKCduYW1lJywgJ1BhcmFsbGVsIE9wZXJhdGlvbicpOworICAgICAgICBwZS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnT1BFUkFUSU9OJyk7CisgICAgICAgIHBlLnNldEF0dHJpYnV0ZSgib3V0LTEiLCAiT3V0cHV0MSIpOworICAgICAgICBwZS5zZXRBdHRyaWJ1dGUoIm91dC0yIiwgIk91dHB1dDIiKTsKKyAgICAgICAgcGUuc2V0QXR0cmlidXRlKCJpbi0xIiwgIklucHV0Iik7CisgICAgICAgIHJldHVybiBwZTsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvZWRpdG9yL214RGVmYXVsdEtleUhhbmRsZXIuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvZWRpdG9yL214RGVmYXVsdEtleUhhbmRsZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM3ZGVhNAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9lZGl0b3IvbXhEZWZhdWx0S2V5SGFuZGxlci5qcwpAQCAtMCwwICsxLDEyNiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhEZWZhdWx0S2V5SGFuZGxlcgorICoKKyAqIEJpbmRzIGtleWNvZGVzIHRvIGFjdGlvbm5hbWVzIGluIGFuIGVkaXRvci4gVGhpcyBhZ2dyZWdhdGVzIGFuIGludGVybmFsCisgKiA8aGFuZGxlcj4gYW5kIGV4dGVuZHMgdGhlIGltcGxlbWVudGF0aW9uIG9mIDxteEtleUhhbmRsZXIuZXNjYXBlPiB0byBub3QKKyAqIG9ubHkgY2FuY2VsIHRoZSBlZGl0aW5nLCBidXQgYWxzbyBoaWRlIHRoZSBwcm9wZXJ0aWVzIGRpYWxvZyBhbmQgZmlyZSBhbgorICogPG14RWRpdG9yLmVzY2FwZT4gZXZlbnQgdmlhIDxlZGl0b3I+LiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGNyZWF0ZWQKKyAqIGJ5IDxteEVkaXRvcj4gYW5kIHN0b3JlZCBpbiA8bXhFZGl0b3Iua2V5SGFuZGxlcj4uCisgKiAKKyAqIEV4YW1wbGU6CisgKiAKKyAqIEJpbmQgdGhlIGRlbGV0ZSBrZXkgdG8gdGhlIGRlbGV0ZSBhY3Rpb24gaW4gYW4gZXhpc3RpbmcgZWRpdG9yLgorICogCisgKiAoY29kZSkKKyAqIHZhciBrZXlIYW5kbGVyID0gbmV3IG14RGVmYXVsdEtleUhhbmRsZXIoZWRpdG9yKTsKKyAqIGtleUhhbmRsZXIuYmluZEFjdGlvbig0NiwgJ2RlbGV0ZScpOworICogKGVuZCkKKyAqCisgKiBDb2RlYzoKKyAqIAorICogVGhpcyBjbGFzcyB1c2VzIHRoZSA8bXhEZWZhdWx0S2V5SGFuZGxlckNvZGVjPiB0byByZWFkIGNvbmZpZ3VyYXRpb24KKyAqIGRhdGEgaW50byBhbiBleGlzdGluZyBpbnN0YW5jZS4gU2VlIDxteERlZmF1bHRLZXlIYW5kbGVyQ29kZWM+IGZvciBhCisgKiBkZXNjcmlwdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiBmb3JtYXQuCisgKiAKKyAqIEtleWNvZGVzOgorICogCisgKiBTZWUgPG14S2V5SGFuZGxlcj4uCisgKiAKKyAqIEFuIDxteEV2ZW50LkVTQ0FQRT4gZXZlbnQgaXMgZmlyZWQgdmlhIHRoZSBlZGl0b3IgaWYgdGhlIGVzY2FwZSBrZXkgaXMKKyAqIHByZXNzZWQuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteERlZmF1bHRLZXlIYW5kbGVyCisgKgorICogQ29uc3RydWN0cyBhIG5ldyBkZWZhdWx0IGtleSBoYW5kbGVyIGZvciB0aGUgPG14RWRpdG9yLmdyYXBoPiBpbiB0aGUKKyAqIGdpdmVuIDxteEVkaXRvcj4uIChUaGUgZWRpdG9yIG1heSBiZSBudWxsIGlmIGEgcHJvdG90eXBpY2FsIGluc3RhbmNlIGZvcgorICogYSA8bXhEZWZhdWx0S2V5SGFuZGxlckNvZGVjPiBpcyBjcmVhdGVkLikKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZWRpdG9yIC0gUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgPG14RWRpdG9yPi4KKyAqLworZnVuY3Rpb24gbXhEZWZhdWx0S2V5SGFuZGxlcihlZGl0b3IpCit7CisJaWYgKGVkaXRvciAhPSBudWxsKQorCXsKKwkJdGhpcy5lZGl0b3IgPSBlZGl0b3I7CisJCXRoaXMuaGFuZGxlciA9IG5ldyBteEtleUhhbmRsZXIoZWRpdG9yLmdyYXBoKTsKKwkJCisJCS8vIEV4dGVuZHMgdGhlIGVzY2FwZSBmdW5jdGlvbiBvZiB0aGUgaW50ZXJuYWwga2V5CisJCS8vIGhhbmRsZSB0byBoaWRlIHRoZSBwcm9wZXJ0aWVzIGRpYWxvZyBhbmQgZmlyZQorCQkvLyB0aGUgZXNjYXBlIGV2ZW50IHZpYSB0aGUgZWRpdG9yIGluc3RhbmNlCisJCXZhciBvbGQgPSB0aGlzLmhhbmRsZXIuZXNjYXBlOworCQkKKwkJdGhpcy5oYW5kbGVyLmVzY2FwZSA9IGZ1bmN0aW9uKGV2dCkKKwkJeworCQkJb2xkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQllZGl0b3IuaGlkZVByb3BlcnRpZXMoKTsKKwkJCWVkaXRvci5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5FU0NBUEUsICdldmVudCcsIGV2dCkpOworCQl9OworCX0KK307CisJCisvKioKKyAqIFZhcmlhYmxlOiBlZGl0b3IKKyAqCisgKiBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhFZGl0b3I+LgorICovCitteERlZmF1bHRLZXlIYW5kbGVyLnByb3RvdHlwZS5lZGl0b3IgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBoYW5kbGVyCisgKgorICogSG9sZHMgdGhlIDxteEtleUhhbmRsZXI+IGZvciBrZXkgZXZlbnQgaGFuZGxpbmcuCisgKi8KK214RGVmYXVsdEtleUhhbmRsZXIucHJvdG90eXBlLmhhbmRsZXIgPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiBiaW5kQWN0aW9uCisgKgorICogQmluZHMgdGhlIHNwZWNpZmllZCBrZXljb2RlIHRvIHRoZSBnaXZlbiBhY3Rpb24gaW4gPGVkaXRvcj4uIFRoZQorICogb3B0aW9uYWwgY29udHJvbCBmbGFnIHNwZWNpZmllcyBpZiB0aGUgY29udHJvbCBrZXkgbXVzdCBiZSBwcmVzc2VkCisgKiB0byB0cmlnZ2VyIHRoZSBhY3Rpb24uCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBjb2RlIC0gSW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUga2V5Y29kZS4KKyAqIGFjdGlvbiAtIE5hbWUgb2YgdGhlIGFjdGlvbiB0byBleGVjdXRlIGluIDxlZGl0b3I+LgorICogY29udHJvbCAtIE9wdGlvbmFsIGJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgY29udHJvbCBtdXN0IGJlIHByZXNzZWQuCisgKiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteERlZmF1bHRLZXlIYW5kbGVyLnByb3RvdHlwZS5iaW5kQWN0aW9uID0gZnVuY3Rpb24gKGNvZGUsIGFjdGlvbiwgY29udHJvbCkKK3sKKwl2YXIga2V5SGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbigpCisJeworCQl0aGlzLmVkaXRvci5leGVjdXRlKGFjdGlvbik7CisJfSk7CisKKwkvLyBCaW5kcyB0aGUgZnVuY3Rpb24gdG8gY29udHJvbC1kb3duIGtleWNvZGUKKwlpZiAoY29udHJvbCkKKwl7CisJCXRoaXMuaGFuZGxlci5iaW5kQ29udHJvbEtleShjb2RlLCBrZXlIYW5kbGVyKTsKKwl9CisKKwkvLyBCaW5kcyB0aGUgZnVuY3Rpb24gdG8gdGhlIG5vcm1hbCBrZXljb2RlCisJZWxzZQorCXsKKwkJdGhpcy5oYW5kbGVyLmJpbmRLZXkoY29kZSwga2V5SGFuZGxlcik7CQkJCQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqCisgKiBEZXN0cm95cyB0aGUgPGhhbmRsZXI+IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4gVGhpcyBkb2VzIG5vcm1hbGx5CisgKiBub3QgbmVlZCB0byBiZSBjYWxsZWQsIHRoZSA8aGFuZGxlcj4gaXMgZGVzdHJveWVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUKKyAqIHdpbmRvdyB1bmxvYWRzIChpbiBJRSkgYnkgPG14RWRpdG9yPi4KKyAqLworbXhEZWZhdWx0S2V5SGFuZGxlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpCit7CisJdGhpcy5oYW5kbGVyLmRlc3Ryb3koKTsKKwl0aGlzLmhhbmRsZXIgPSBudWxsOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9lZGl0b3IvbXhEZWZhdWx0UG9wdXBNZW51LmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2VkaXRvci9teERlZmF1bHRQb3B1cE1lbnUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYyZTZlNwotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9lZGl0b3IvbXhEZWZhdWx0UG9wdXBNZW51LmpzCkBAIC0wLDAgKzEsMzA2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteERlZmF1bHRQb3B1cE1lbnUKKyAqCisgKiBDcmVhdGVzIHBvcHVwbWVudXMgZm9yIG1vdXNlIGV2ZW50cy4gVGhpcyBvYmplY3QgaG9sZHMgYW4gWE1MIG5vZGUKKyAqIHdoaWNoIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIHBvcHVwIG1lbnUgdG8gYmUgY3JlYXRlZC4gSW4KKyAqIDxjcmVhdGVNZW51PiwgdGhlIGNvbmZpZ3VyYXRpb24gaXMgYXBwbGllZCB0byB0aGUgY29udGV4dCBhbmQKKyAqIHRoZSByZXN1bHRpbmcgbWVudSBpdGVtcyBhcmUgYWRkZWQgdG8gdGhlIG1lbnUgZHluYW1pY2FsbHkuIFNlZQorICogPGNyZWF0ZU1lbnU+IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uIGZvcm1hdC4KKyAqIAorICogVGhpcyBjbGFzcyBkb2VzIG5vdCBjcmVhdGUgdGhlIERPTSBub2RlcyByZXF1aXJlZCBmb3IgdGhlIHBvcHVwIG1lbnUsIGl0CisgKiBvbmx5IHBhcnNlcyBhbiBYTUwgZGVzY3JpcHRpb24gdG8gaW52b2tlIHRoZSByZXNwZWN0aXZlIG1ldGhvZHMgb24gYW4KKyAqIDxteFBvcHVwTWVudT4gZWFjaCB0aW1lIHRoZSBtZW51IGlzIGRpc3BsYXllZC4KKyAqCisgKiBDb2RlYzoKKyAqIAorICogVGhpcyBjbGFzcyB1c2VzIHRoZSA8bXhEZWZhdWx0UG9wdXBNZW51Q29kZWM+IHRvIHJlYWQgY29uZmlndXJhdGlvbgorICogZGF0YSBpbnRvIGFuIGV4aXN0aW5nIGluc3RhbmNlLCBob3dldmVyLCB0aGUgYWN0dWFsIHBhcnNpbmcgaXMgZG9uZQorICogYnkgdGhpcyBjbGFzcyBkdXJpbmcgcHJvZ3JhbSBleGVjdXRpb24sIHNvIHRoZSBmb3JtYXQgaXMgZGVzY3JpYmVkCisgKiBiZWxvdy4KKyAqIAorICogQ29uc3RydWN0b3I6IG14RGVmYXVsdFBvcHVwTWVudQorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgcG9wdXBtZW51LWZhY3RvcnkgYmFzZWQgb24gZ2l2ZW4gY29uZmlndXJhdGlvbi4KKyAqCisgKiBQYXJhbWF0ZXJzOgorICoKKyAqIGNvbmZpZyAtIFhNTCBub2RlIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YS4KKyAqLworZnVuY3Rpb24gbXhEZWZhdWx0UG9wdXBNZW51KGNvbmZpZykKK3sKKwl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKK307CisKKy8qKgorICogVmFyaWFibGU6IGltYWdlQmFzZVBhdGgKKyAqCisgKiBCYXNlIHBhdGggZm9yIGFsbCBpY29uIGF0dHJpYnV0ZXMgaW4gdGhlIGNvbmZpZy4gRGVmYXVsdCBpcyBudWxsLgorICovCitteERlZmF1bHRQb3B1cE1lbnUucHJvdG90eXBlLmltYWdlQmFzZVBhdGggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjb25maWcKKyAqCisgKiBYTUwgbm9kZSB1c2VkIGFzIHRoZSBkZXNjcmlwdGlvbiBvZiBuZXcgbWVudSBpdGVtcy4gVGhpcyBub2RlIGlzCisgKiB1c2VkIGluIDxjcmVhdGVNZW51PiB0byBkeW5hbWljYWxseSBjcmVhdGUgdGhlIG1lbnUgaXRlbXMgaWYgdGhlaXIKKyAqIHJlc3BlY3RpdmUgY29uZGl0aW9ucyBldmFsdWF0ZSB0byB0cnVlIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorICovCitteERlZmF1bHRQb3B1cE1lbnUucHJvdG90eXBlLmNvbmZpZyA9IG51bGw7CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZU1lbnUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIDxteEVkaXRvcj4gdG8gYWRkIGl0ZW1zIHRvIHRoZQorICogZ2l2ZW4gbWVudSBiYXNlZCBvbiA8Y29uZmlnPi4gVGhlIGNvbmZpZyBpcyBhIHNlcXVlbmNlIG9mCisgKiB0aGUgZm9sbG93aW5nIG5vZGVzIGFuZCBhdHRyaWJ1dGVzLgorICoKKyAqIENoaWxkIE5vZGVzOiAKKyAqCisgKiBhZGQgLSBBZGRzIGEgbmV3IG1lbnUgaXRlbS4gU2VlIGJlbG93IGZvciBhdHRyaWJ1dGVzLgorICogc2VwYXJhdG9yIC0gQWRkcyBhIHNlcGFyYXRvci4gTm8gYXR0cmlidXRlcy4KKyAqIGNvbmRpdGlvbiAtIEFkZHMgYSBjdXN0b20gY29uZGl0aW9uLiBOYW1lIGF0dHJpYnV0ZS4KKyAqIAorICogVGhlIGFkZC1ub2RlIG1heSBoYXZlIGEgY2hpbGQgbm9kZSB0aGF0IGRlZmluZXMgYSBmdW5jdGlvbiB0byBiZSBpbnZva2VkCisgKiBiZWZvcmUgdGhlIGFjdGlvbiBpcyBleGVjdXRlZCAob3IgaW5zdGVhZCBvZiBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQpLgorICoKKyAqIEF0dHJpYnV0ZXM6CisgKgorICogYXMgLSBSZXNvdXJjZSBrZXkgZm9yIHRoZSBsYWJlbCAobmVlZHMgZW50cnkgaW4gcHJvcGVydHkgZmlsZSkuCisgKiBhY3Rpb24gLSBOYW1lIG9mIHRoZSBhY3Rpb24gdG8gZXhlY3V0ZSBpbiBlbmNsb3NpbmcgZWRpdG9yLgorICogaWNvbiAtIE9wdGlvbmFsIGljb24gKHJlbGF0aXZlL2Fic29sdXRlIFVSTCkuCisgKiBpY29uQ2xzIC0gT3B0aW9uYWwgQ1NTIGNsYXNzIGZvciB0aGUgaWNvbi4KKyAqIGlmIC0gT3B0aW9uYWwgbmFtZSBvZiBjb25kaXRpb24gdGhhdCBtdXN0IGJlIHRydWUgKHNlZSBiZWxvdykuCisgKiBlbmFibGVkLWlmIC0gT3B0aW9uYWwgbmFtZSBvZiBjb25kaXRpb24gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIG1lbnUgaXRlbQorICogc2hvdWxkIGJlIGVuYWJsZWQuCisgKiBuYW1lIC0gTmFtZSBvZiBjdXN0b20gY29uZGl0aW9uLiBPbmx5IGZvciBjb25kaXRpb24gbm9kZXMuCisgKgorICogQ29uZGl0aW9uczoKKyAqCisgKiBub2NlbGwgLSBObyBjZWxsIHVuZGVyIHRoZSBtb3VzZS4KKyAqIG5jZWxscyAtIE1vcmUgdGhhbiBvbmUgY2VsbCBzZWxlY3RlZC4KKyAqIG5vdFJvb3QgLSBEcmlsbGluZyBwb3NpdGlvbiBpcyBvdGhlciB0aGFuIGhvbWUuCisgKiBjZWxsIC0gQ2VsbCB1bmRlciB0aGUgbW91c2UuCisgKiBub3RFbXB0eSAtIEV4YWN0bHkgb25lIGNlbGwgd2l0aCBjaGlsZHJlbiB1bmRlciBtb3VzZS4KKyAqIGV4cGFuZGFibGUgLSBFeGFjdGx5IG9uZSBleHBhbmRhYmxlIGNlbGwgdW5kZXIgbW91c2UuCisgKiBjb2xsYXBzYWJsZSAtIEV4YWN0bHkgb25lIGNvbGxhcHNhYmxlIGNlbGwgdW5kZXIgbW91c2UuCisgKiB2YWxpZFJvb3QgLSBFeGFjdGx5IG9uZSBjZWxsIHdoaWNoIGlzIGEgcG9zc2libGUgcm9vdCB1bmRlciBtb3VzZS4KKyAqIHN3aW1sYW5lIC0gRXhhY3RseSBvbmUgY2VsbCB3aGljaCBpcyBhIHN3aW1sYW5lIHVuZGVyIG1vdXNlLgorICoKKyAqIEV4YW1wbGU6CisgKgorICogVG8gYWRkIGEgbmV3IGl0ZW0gZm9yIGEgZ2l2ZW4gYWN0aW9uIHRvIHRoZSBwb3B1cG1lbnU6CisgKiAKKyAqIChjb2RlKQorICogPG14RGVmYXVsdFBvcHVwTWVudSBhcz0icG9wdXBIYW5kbGVyIj4KKyAqICAgPGFkZCBhcz0iZGVsZXRlIiBhY3Rpb249ImRlbGV0ZSIgaWNvbj0iaW1hZ2VzL2RlbGV0ZS5naWYiIGlmPSJjZWxsIi8+CisgKiA8L214RGVmYXVsdFBvcHVwTWVudT4KKyAqIChlbmQpCisgKiAKKyAqIFRvIGFkZCBhIG5ldyBpdGVtIGZvciBhIGN1c3RvbSBmdW5jdGlvbjoKKyAqIAorICogKGNvZGUpCisgKiA8bXhEZWZhdWx0UG9wdXBNZW51IGFzPSJwb3B1cEhhbmRsZXIiPgorICogICA8YWRkIGFzPSJhY3Rpb24xIj48IVtDREFUQVsKKyAqCQlmdW5jdGlvbiAoZWRpdG9yLCBjZWxsLCBldnQpCisgKgkJeworICoJCQllZGl0b3IuZXhlY3V0ZSgnYWN0aW9uMScsIGNlbGwsICdteUFyZycpOworICoJCX0KKyAqICAgXV0+PC9hZGQ+CisgKiA8L214RGVmYXVsdFBvcHVwTWVudT4KKyAqIChlbmQpCisgKiAKKyAqIFRoZSBhYm92ZSBleGFtcGxlIGludm9rZXMgYWN0aW9uMSB3aXRoIGFuIGFkZGl0aW9uYWwgdGhpcmQgYXJndW1lbnQgdmlhCisgKiB0aGUgZWRpdG9yIGluc3RhbmNlLiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiB0aGF0CisgKiBkZWZpbmVzIGFjdGlvbjEuIElmIHRoZSBhZGQtbm9kZSBoYXMgbm8gYWN0aW9uLWF0dHJpYnV0ZSwgdGhlbiBvbmx5IHRoZQorICogZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGUgdGV4dCBjb250ZW50IGlzIGV4ZWN1dGVkLCBvdGhlcndpc2UgZmlyc3QgdGhlCisgKiBmdW5jdGlvbiBhbmQgdGhlbiB0aGUgYWN0aW9uIGRlZmluZWQgaW4gdGhlIGFjdGlvbi1hdHRyaWJ1dGUgaXMKKyAqIGV4ZWN1dGVkLiBUaGUgZnVuY3Rpb24gaW4gdGhlIHRleHQgY29udGVudCBoYXMgMyBhcmd1bWVudHMsIG5hbWVseSB0aGUKKyAqIDxteEVkaXRvcj4gaW5zdGFuY2UsIHRoZSA8bXhDZWxsPiBpbnN0YW5jZSB1bmRlciB0aGUgbW91c2UsIGFuZCB0aGUKKyAqIG5hdGl2ZSBtb3VzZSBldmVudC4KKyAqCisgKiBDdXN0b20gQ29uZGl0aW9uczoKKyAqCisgKiBUbyBhZGQgYSBuZXcgY29uZGl0aW9uIGZvciBwb3B1cG1lbnUgaXRlbXM6CisgKiAgCisgKiAoY29kZSkKKyAqIDxjb25kaXRpb24gbmFtZT0iY29uZGl0aW9uMSI+PCFbQ0RBVEFbCisgKiAgIGZ1bmN0aW9uIChlZGl0b3IsIGNlbGwsIGV2dCkKKyAqICAgeworICogICAgIHJldHVybiBjZWxsICE9IG51bGw7CisgKiAgIH0KKyAqIF1dPjwvY29uZGl0aW9uPgorICogKGVuZCkKKyAqIAorICogVGhlIG5ldyBjb25kaXRpb24gY2FuIHRoZW4gYmUgdXNlZCBpbiBhbnkgaXRlbSBhcyBmb2xsb3dzOgorICogCisgKiAoY29kZSkKKyAqIDxhZGQgYXM9ImFjdGlvbjEiIGFjdGlvbj0iYWN0aW9uMSIgaWNvbj0iYWN0aW9uMS5naWYiIGlmPSJjb25kaXRpb24xIi8+CisgKiAoZW5kKQorICogCisgKiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGl0ZW1zIGFuZCBjb25kaXRpb25zIGFwcGVhciBpcyBub3Qgc2lnbmlmaWNhbnQgYXMKKyAqIGFsbCBjb25uZGl0aW9ucyBhcmUgZXZhbHVhdGVkIGJlZm9yZSBhbnkgaXRlbXMgYXJlIGNyZWF0ZWQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKgorICogZWRpdG9yIC0gRW5jbG9zaW5nIDxteEVkaXRvcj4gaW5zdGFuY2UuCisgKiBtZW51IC0gPG14UG9wdXBNZW51PiB0aGF0IGlzIHVzZWQgZm9yIGFkZGluZyBpdGVtcyBhbmQgc2VwYXJhdG9ycy4KKyAqIGNlbGwgLSBPcHRpb25hbCA8bXhDZWxsPiB3aGljaCBpcyB1bmRlciB0aGUgbW91c2Vwb2ludGVyLgorICogZXZ0IC0gT3B0aW9uYWwgbW91c2UgZXZlbnQgd2hpY2ggdHJpZ2dlcmVkIHRoZSBtZW51LiAKKyAqLworbXhEZWZhdWx0UG9wdXBNZW51LnByb3RvdHlwZS5jcmVhdGVNZW51ID0gZnVuY3Rpb24oZWRpdG9yLCBtZW51LCBjZWxsLCBldnQpCit7CisJaWYgKHRoaXMuY29uZmlnICE9IG51bGwpCisJeworCQl2YXIgY29uZGl0aW9ucyA9IHRoaXMuY3JlYXRlQ29uZGl0aW9ucyhlZGl0b3IsIGNlbGwsIGV2dCk7CisJCXZhciBpdGVtID0gdGhpcy5jb25maWcuZmlyc3RDaGlsZDsKKworCQl0aGlzLmFkZEl0ZW1zKGVkaXRvciwgbWVudSwgY2VsbCwgZXZ0LCBjb25kaXRpb25zLCBpdGVtLCBudWxsKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRJdGVtcworICogCisgKiBSZWN1cnNpdmVseSBhZGRzIHRoZSBnaXZlbiBpdGVtcyBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbiBpbnRvIHRoZSBnaXZlbiBtZW51LgorICogCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGVkaXRvciAtIEVuY2xvc2luZyA8bXhFZGl0b3I+IGluc3RhbmNlLgorICogbWVudSAtIDxteFBvcHVwTWVudT4gdGhhdCBpcyB1c2VkIGZvciBhZGRpbmcgaXRlbXMgYW5kIHNlcGFyYXRvcnMuCisgKiBjZWxsIC0gT3B0aW9uYWwgPG14Q2VsbD4gd2hpY2ggaXMgdW5kZXIgdGhlIG1vdXNlcG9pbnRlci4KKyAqIGV2dCAtIE9wdGlvbmFsIG1vdXNlIGV2ZW50IHdoaWNoIHRyaWdnZXJlZCB0aGUgbWVudS4KKyAqIGNvbmRpdGlvbnMgLSBBcnJheSBvZiBuYW1lcyBib29sZWFuIGNvbmRpdGlvbnMuCisgKiBpdGVtIC0gWE1MIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50IG1lbnUgaXRlbS4KKyAqIHBhcmVudCAtIERPTSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgcGFyZW50IG1lbnUgaXRlbS4KKyAqLworbXhEZWZhdWx0UG9wdXBNZW51LnByb3RvdHlwZS5hZGRJdGVtcyA9IGZ1bmN0aW9uKGVkaXRvciwgbWVudSwgY2VsbCwgZXZ0LCBjb25kaXRpb25zLCBpdGVtLCBwYXJlbnQpCit7CisJdmFyIGFkZFNlcGFyYXRvciA9IGZhbHNlOworCQorCXdoaWxlIChpdGVtICE9IG51bGwpCisJeworCQlpZiAoaXRlbS5ub2RlTmFtZSA9PSAnYWRkJykKKwkJeworCQkJdmFyIGNvbmRpdGlvbiA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdpZicpOworCQkJCisJCQlpZiAoY29uZGl0aW9uID09IG51bGwgfHwgY29uZGl0aW9uc1tjb25kaXRpb25dKQorCQkJeworCQkJCXZhciBhcyA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdhcycpOworCQkJCWFzID0gbXhSZXNvdXJjZXMuZ2V0KGFzKSB8fCBhczsKKwkJCQl2YXIgZnVuY3QgPSBteFV0aWxzLmV2YWwobXhVdGlscy5nZXRUZXh0Q29udGVudChpdGVtKSk7CisJCQkJdmFyIGFjdGlvbiA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdhY3Rpb24nKTsKKwkJCQl2YXIgaWNvbiA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdpY29uJyk7CisJCQkJdmFyIGljb25DbHMgPSBpdGVtLmdldEF0dHJpYnV0ZSgnaWNvbkNscycpOworCQkJCXZhciBlbmFibGVkQ29uZCA9IGl0ZW0uZ2V0QXR0cmlidXRlKCdlbmFibGVkLWlmJyk7CisJCQkJdmFyIGVuYWJsZWQgPSBlbmFibGVkQ29uZCA9PSBudWxsIHx8IGNvbmRpdGlvbnNbZW5hYmxlZENvbmRdOworCQkJCQorCQkJCWlmIChhZGRTZXBhcmF0b3IpCisJCQkJeworCQkJCQltZW51LmFkZFNlcGFyYXRvcihwYXJlbnQpOworCQkJCQlhZGRTZXBhcmF0b3IgPSBmYWxzZTsKKwkJCQl9CisJCQkJCisJCQkJaWYgKGljb24gIT0gbnVsbCAmJiB0aGlzLmltYWdlQmFzZVBhdGgpCisJCQkJeworCQkJCQlpY29uID0gdGhpcy5pbWFnZUJhc2VQYXRoICsgaWNvbjsKKwkJCQl9CisJCQkJCisJCQkJdmFyIHJvdyA9IHRoaXMuYWRkQWN0aW9uKG1lbnUsIGVkaXRvciwgYXMsIGljb24sIGZ1bmN0LCBhY3Rpb24sIGNlbGwsIHBhcmVudCwgaWNvbkNscywgZW5hYmxlZCk7CisJCQkJdGhpcy5hZGRJdGVtcyhlZGl0b3IsIG1lbnUsIGNlbGwsIGV2dCwgY29uZGl0aW9ucywgaXRlbS5maXJzdENoaWxkLCByb3cpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKGl0ZW0ubm9kZU5hbWUgPT0gJ3NlcGFyYXRvcicpCisJCXsKKwkJCWFkZFNlcGFyYXRvciA9IHRydWU7CisJCX0KKwkJCisJCWl0ZW0gPSBpdGVtLm5leHRTaWJsaW5nOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZEFjdGlvbgorICoKKyAqIEhlbHBlciBtZXRob2QgdG8gYmluZCBhbiBhY3Rpb24gdG8gYSBuZXcgbWVudSBpdGVtLgorICogCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIG1lbnUgLSA8bXhQb3B1cE1lbnU+IHRoYXQgaXMgdXNlZCBmb3IgYWRkaW5nIGl0ZW1zIGFuZCBzZXBhcmF0b3JzLgorICogZWRpdG9yIC0gRW5jbG9zaW5nIDxteEVkaXRvcj4gaW5zdGFuY2UuCisgKiBsYWIgLSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBsYWJlbCBvZiB0aGUgbWVudSBpdGVtLgorICogaWNvbiAtIE9wdGlvbmFsIFVSTCB0aGF0IHJlcHJlc2VudHMgdGhlIGljb24gb2YgdGhlIG1lbnUgaXRlbS4KKyAqIGFjdGlvbiAtIE9wdGlvbmFsIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBleGVjdXRlIGluIHRoZSBnaXZlbiBlZGl0b3IuCisgKiBmdW5jdCAtIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYmVmb3JlIHRoZSBvcHRpb25hbCBhY3Rpb24uIFRoZQorICogZnVuY3Rpb24gdGFrZXMgYW4gPG14RWRpdG9yPiwgdGhlIDxteENlbGw+IHVuZGVyIHRoZSBtb3VzZSBhbmQgdGhlCisgKiBtb3VzZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgY2FsbC4KKyAqIGNlbGwgLSBPcHRpb25hbCA8bXhDZWxsPiB0byB1c2UgYXMgYW4gYXJndW1lbnQgZm9yIHRoZSBhY3Rpb24uCisgKiBwYXJlbnQgLSBET00gbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBhcmVudCBtZW51IGl0ZW0uCisgKiBpY29uQ2xzIC0gT3B0aW9uYWwgQ1NTIGNsYXNzIGZvciB0aGUgbWVudSBpY29uLgorICogZW5hYmxlZCAtIE9wdGlvbmFsIGJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIG1lbnUgaXRlbSBpcyBlbmFibGVkLgorICogRGVmYXVsdCBpcyB0cnVlLgorICovCitteERlZmF1bHRQb3B1cE1lbnUucHJvdG90eXBlLmFkZEFjdGlvbiA9IGZ1bmN0aW9uKG1lbnUsIGVkaXRvciwgbGFiLCBpY29uLCBmdW5jdCwgYWN0aW9uLCBjZWxsLCBwYXJlbnQsIGljb25DbHMsIGVuYWJsZWQpCit7CisJdmFyIGNsaWNrSGFuZGxlciA9IGZ1bmN0aW9uKGV2dCkKKwl7CisJCWlmICh0eXBlb2YoZnVuY3QpID09ICdmdW5jdGlvbicpCisJCXsKKwkJCWZ1bmN0LmNhbGwoZWRpdG9yLCBlZGl0b3IsIGNlbGwsIGV2dCk7CisJCX0KKwkJCisJCWlmIChhY3Rpb24gIT0gbnVsbCkKKwkJeworCQkJZWRpdG9yLmV4ZWN1dGUoYWN0aW9uLCBjZWxsLCBldnQpOworCQl9CisJfTsKKwkKKwlyZXR1cm4gbWVudS5hZGRJdGVtKGxhYiwgaWNvbiwgY2xpY2tIYW5kbGVyLCBwYXJlbnQsIGljb25DbHMsIGVuYWJsZWQpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlQ29uZGl0aW9ucworICogCisgKiBFdmFsdWF0ZXMgdGhlIGRlZmF1bHQgY29uZGl0aW9ucyBmb3IgdGhlIGdpdmVuIGNvbnRleHQuCisgKi8KK214RGVmYXVsdFBvcHVwTWVudS5wcm90b3R5cGUuY3JlYXRlQ29uZGl0aW9ucyA9IGZ1bmN0aW9uKGVkaXRvciwgY2VsbCwgZXZ0KQoreworCS8vIENyZWF0ZXMgYXJyYXkgd2l0aCBjb25kaXRpb25zCisJdmFyIG1vZGVsID0gZWRpdG9yLmdyYXBoLmdldE1vZGVsKCk7CisJdmFyIGNoaWxkQ291bnQgPSBtb2RlbC5nZXRDaGlsZENvdW50KGNlbGwpOworCQorCS8vIEFkZHMgc29tZSBmcmVxdWVudGx5IHVzZWQgY29uZGl0aW9ucworCXZhciBjb25kaXRpb25zID0gW107CisJY29uZGl0aW9uc1snbm9jZWxsJ10gPSBjZWxsID09IG51bGw7CisJY29uZGl0aW9uc1snbmNlbGxzJ10gPSBlZGl0b3IuZ3JhcGguZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDE7CisJY29uZGl0aW9uc1snbm90Um9vdCddID0gbW9kZWwuZ2V0Um9vdCgpICE9CisJCW1vZGVsLmdldFBhcmVudChlZGl0b3IuZ3JhcGguZ2V0RGVmYXVsdFBhcmVudCgpKTsKKwljb25kaXRpb25zWydjZWxsJ10gPSBjZWxsICE9IG51bGw7CisJCisJdmFyIGlzQ2VsbCA9IGNlbGwgIT0gbnVsbCAmJiBlZGl0b3IuZ3JhcGguZ2V0U2VsZWN0aW9uQ291bnQoKSA9PSAxOworCWNvbmRpdGlvbnNbJ25vbkVtcHR5J10gPSBpc0NlbGwgJiYgY2hpbGRDb3VudCA+IDA7CisJY29uZGl0aW9uc1snZXhwYW5kYWJsZSddID0gaXNDZWxsICYmIGVkaXRvci5ncmFwaC5pc0NlbGxGb2xkYWJsZShjZWxsLCBmYWxzZSk7CisJY29uZGl0aW9uc1snY29sbGFwc2FibGUnXSA9IGlzQ2VsbCAmJiBlZGl0b3IuZ3JhcGguaXNDZWxsRm9sZGFibGUoY2VsbCwgdHJ1ZSk7CisJY29uZGl0aW9uc1sndmFsaWRSb290J10gPSBpc0NlbGwgJiYgZWRpdG9yLmdyYXBoLmlzVmFsaWRSb290KGNlbGwpOworCWNvbmRpdGlvbnNbJ2VtcHR5VmFsaWRSb290J10gPSBjb25kaXRpb25zWyd2YWxpZFJvb3QnXSAmJiBjaGlsZENvdW50ID09IDA7CisJY29uZGl0aW9uc1snc3dpbWxhbmUnXSA9IGlzQ2VsbCAmJiBlZGl0b3IuZ3JhcGguaXNTd2ltbGFuZShjZWxsKTsKKworCS8vIEV2YWx1YXRlcyBkeW5hbWljIGNvbmRpdGlvbnMgZnJvbSBjb25maWcgZmlsZQorCXZhciBjb25kTm9kZXMgPSB0aGlzLmNvbmZpZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY29uZGl0aW9uJyk7CisJCisJZm9yICh2YXIgaT0wOyBpPGNvbmROb2Rlcy5sZW5ndGg7IGkrKykKKwl7CisJCXZhciBmdW5jdCA9IG14VXRpbHMuZXZhbChteFV0aWxzLmdldFRleHRDb250ZW50KGNvbmROb2Rlc1tpXSkpOworCQl2YXIgbmFtZSA9IGNvbmROb2Rlc1tpXS5nZXRBdHRyaWJ1dGUoJ25hbWUnKTsKKwkJCisJCWlmIChuYW1lICE9IG51bGwgJiYgdHlwZW9mKGZ1bmN0KSA9PSAnZnVuY3Rpb24nKQorCQl7CisJCQljb25kaXRpb25zW25hbWVdID0gZnVuY3QoZWRpdG9yLCBjZWxsLCBldnQpOworCQl9CisJfQorCQorCXJldHVybiBjb25kaXRpb25zOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9lZGl0b3IvbXhEZWZhdWx0VG9vbGJhci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9lZGl0b3IvbXhEZWZhdWx0VG9vbGJhci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTdmMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2VkaXRvci9teERlZmF1bHRUb29sYmFyLmpzCkBAIC0wLDAgKzEsNTY0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteERlZmF1bHRUb29sYmFyCisgKgorICogVG9vbGJhciBmb3IgdGhlIGVkaXRvci4gVGhpcyBtb2RpZmllcyB0aGUgc3RhdGUgb2YgdGhlIGdyYXBoCisgKiBvciBpbnNlcnRzIG5ldyBjZWxscyB1cG9uIG1vdXNlIGNsaWNrcy4KKyAqIAorICogRXhhbXBsZToKKyAqIAorICogQ3JlYXRlIGEgdG9vbGJhciB3aXRoIGEgYnV0dG9uIHRvIGNvcHkgdGhlIHNlbGVjdGlvbiBpbnRvIHRoZSBjbGlwYm9hcmQsCisgKiBhbmQgYSBjb21ibyBib3ggd2l0aCBvbmUgYWN0aW9uIHRvIHBhc3RlIHRoZSBzZWxlY3Rpb24gZnJvbSB0aGUgY2xpcGJvYXJkCisgKiBpbnRvIHRoZSBncmFwaC4KKyAqIAorICogKGNvZGUpCisgKiB2YXIgdG9vbGJhciA9IG5ldyBteERlZmF1bHRUb29sYmFyKGNvbnRhaW5lciwgZWRpdG9yKTsKKyAqIHRvb2xiYXIuYWRkSXRlbSgnQ29weScsIG51bGwsICdjb3B5Jyk7CisgKiAKKyAqIHZhciBjb21ibyA9IHRvb2xiYXIuYWRkQWN0aW9uQ29tYm8oJ01vcmUgYWN0aW9ucy4uLicpOworICogdG9vbGJhci5hZGRBY3Rpb25PcHRpb24oY29tYm8sICdQYXN0ZScsICdwYXN0ZScpOworICogKGVuZCkgCisgKgorICogQ29kZWM6CisgKiAKKyAqIFRoaXMgY2xhc3MgdXNlcyB0aGUgPG14RGVmYXVsdFRvb2xiYXJDb2RlYz4gdG8gcmVhZCBjb25maWd1cmF0aW9uCisgKiBkYXRhIGludG8gYW4gZXhpc3RpbmcgaW5zdGFuY2UuIFNlZSA8bXhEZWZhdWx0VG9vbGJhckNvZGVjPiBmb3IgYQorICogZGVzY3JpcHRpb24gb2YgdGhlIGNvbmZpZ3VyYXRpb24gZm9ybWF0LgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhEZWZhdWx0VG9vbGJhcgorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgdG9vbGJhciBmb3IgdGhlIGdpdmVuIGNvbnRhaW5lciBhbmQgZWRpdG9yLiBUaGUKKyAqIGNvbnRhaW5lciBhbmQgZWRpdG9yIG1heSBiZSBudWxsIGlmIGEgcHJvdG90eXBpY2FsIGluc3RhbmNlIGZvciBhCisgKiA8bXhEZWZhdWx0S2V5SGFuZGxlckNvZGVjPiBpcyBjcmVhdGVkLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogY29udGFpbmVyIC0gRE9NIG5vZGUgdGhhdCBjb250YWlucyB0aGUgdG9vbGJhci4KKyAqIGVkaXRvciAtIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEVkaXRvcj4uIAorICovCitmdW5jdGlvbiBteERlZmF1bHRUb29sYmFyKGNvbnRhaW5lciwgZWRpdG9yKQoreworCXRoaXMuZWRpdG9yID0gZWRpdG9yOworCisJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmIGVkaXRvciAhPSBudWxsKQorCXsKKwkJdGhpcy5pbml0KGNvbnRhaW5lcik7CisJfQorfTsKKwkKKy8qKgorICogVmFyaWFibGU6IGVkaXRvcgorICoKKyAqIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEVkaXRvcj4uCisgKi8KK214RGVmYXVsdFRvb2xiYXIucHJvdG90eXBlLmVkaXRvciA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHRvb2xiYXIKKyAqCisgKiBIb2xkcyB0aGUgaW50ZXJuYWwgPG14VG9vbGJhcj4uCisgKi8KK214RGVmYXVsdFRvb2xiYXIucHJvdG90eXBlLnRvb2xiYXIgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiByZXNldEhhbmRsZXIKKyAqCisgKiBSZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uIHVzZWQgdG8gcmVzZXQgdGhlIDx0b29sYmFyPi4KKyAqLworbXhEZWZhdWx0VG9vbGJhci5wcm90b3R5cGUucmVzZXRIYW5kbGVyID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogc3BhY2luZworICoKKyAqIERlZmluZXMgdGhlIHNwYWNpbmcgYmV0d2VlbiBleGlzdGluZyBhbmQgbmV3IHZlcnRpY2VzIGluCisgKiBncmlkU2l6ZSB1bml0cyB3aGVuIGEgbmV3IHZlcnRleCBpcyBkcm9wcGVkIG9uIGFuIGV4aXN0aW5nCisgKiBjZWxsLiBEZWZhdWx0IGlzIDQgKDQwIHBpeGVscykuCisgKi8KK214RGVmYXVsdFRvb2xiYXIucHJvdG90eXBlLnNwYWNpbmcgPSA0OworCisvKioKKyAqIFZhcmlhYmxlOiBjb25uZWN0T25Ecm9wCisgKiAKKyAqIFNwZWNpZmllcyBpZiBlbGVtZW50cyBzaG91bGQgYmUgY29ubmVjdGVkIGlmIG5ldyBjZWxscyBhcmUgZHJvcHBlZCBvbnRvCisgKiBjb25uZWN0YWJsZSBlbGVtZW50cy4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhEZWZhdWx0VG9vbGJhci5wcm90b3R5cGUuY29ubmVjdE9uRHJvcCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBpbml0CisgKiAKKyAqIENvbnN0cnVjdHMgdGhlIDx0b29sYmFyPiBmb3IgdGhlIGdpdmVuIGNvbnRhaW5lciBhbmQgaW5zdGFsbHMgYSBsaXN0ZW5lcgorICogdGhhdCB1cGRhdGVzIHRoZSA8bXhFZGl0b3IuaW5zZXJ0RnVuY3Rpb24+IG9uIDxlZGl0b3I+IGlmIGFuIGl0ZW0gaXMKKyAqIHNlbGVjdGVkIGluIHRoZSB0b29sYmFyLiBUaGlzIGFzc3VtZXMgdGhhdCA8ZWRpdG9yPiBpcyBub3QgbnVsbC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGNvbnRhaW5lciAtIERPTSBub2RlIHRoYXQgY29udGFpbnMgdGhlIHRvb2xiYXIuCisgKi8KK214RGVmYXVsdFRvb2xiYXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihjb250YWluZXIpCit7CisJaWYgKGNvbnRhaW5lciAhPSBudWxsKQorCXsKKwkJdGhpcy50b29sYmFyID0gbmV3IG14VG9vbGJhcihjb250YWluZXIpOworCQkKKwkJLy8gSW5zdGFsbHMgdGhlIGluc2VydCBmdW5jdGlvbiBpbiB0aGUgZWRpdG9yIGlmIGFuIGl0ZW0gaXMKKwkJLy8gc2VsZWN0ZWQgaW4gdGhlIHRvb2xiYXIKKwkJdGhpcy50b29sYmFyLmFkZExpc3RlbmVyKG14RXZlbnQuU0VMRUNULCBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oc2VuZGVyLCBldnQpCisJCXsKKwkJCXZhciBmdW5jdCA9IGV2dC5nZXRQcm9wZXJ0eSgnZnVuY3Rpb24nKTsKKwkJCQorCQkJaWYgKGZ1bmN0ICE9IG51bGwpCisJCQl7CisJCQkJdGhpcy5lZGl0b3IuaW5zZXJ0RnVuY3Rpb24gPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCQkJCXsKKwkJCQkJZnVuY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJCQkJdGhpcy50b29sYmFyLnJlc2V0TW9kZSgpOworCQkJCX0pOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRoaXMuZWRpdG9yLmluc2VydEZ1bmN0aW9uID0gbnVsbDsKKwkJCX0KKwkJfSkpOworCQkKKwkJLy8gUmVzZXRzIHRoZSBzZWxlY3RlZCB0b29sIGFmdGVyIGEgZG91YmxlY2xpY2sgb3IgZXNjYXBlIGtleXN0cm9rZQorCQl0aGlzLnJlc2V0SGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbigpCisJCXsKKwkJCWlmICh0aGlzLnRvb2xiYXIgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLnRvb2xiYXIucmVzZXRNb2RlKHRydWUpOworCQkJfQorCQl9KTsKKworCQl0aGlzLmVkaXRvci5ncmFwaC5hZGRMaXN0ZW5lcihteEV2ZW50LkRPVUJMRV9DTElDSywgdGhpcy5yZXNldEhhbmRsZXIpOworCQl0aGlzLmVkaXRvci5hZGRMaXN0ZW5lcihteEV2ZW50LkVTQ0FQRSwgdGhpcy5yZXNldEhhbmRsZXIpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZEl0ZW0KKyAqCisgKiBBZGRzIGEgbmV3IGl0ZW0gdGhhdCBleGVjdXRlcyB0aGUgZ2l2ZW4gYWN0aW9uIGluIDxlZGl0b3I+LiBUaGUgdGl0bGUsCisgKiBpY29uIGFuZCBwcmVzc2VkSWNvbiBhcmUgdXNlZCB0byBkaXNwbGF5IHRoZSB0b29sYmFyIGl0ZW0uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKgorICogdGl0bGUgLSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSB0aXRsZSAodG9vbHRpcCkgZm9yIHRoZSBpdGVtLgorICogaWNvbiAtIFVSTCBvZiB0aGUgaWNvbiB0byBiZSB1c2VkIGZvciBkaXNwbGF5aW5nIHRoZSBpdGVtLgorICogYWN0aW9uIC0gTmFtZSBvZiB0aGUgYWN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgaXRlbSBpcyBjbGlja2VkLgorICogcHJlc3NlZCAtIE9wdGlvbmFsIFVSTCBvZiB0aGUgaWNvbiBmb3IgdGhlIHByZXNzZWQgc3RhdGUuCisgKi8KK214RGVmYXVsdFRvb2xiYXIucHJvdG90eXBlLmFkZEl0ZW0gPSBmdW5jdGlvbih0aXRsZSwgaWNvbiwgYWN0aW9uLCBwcmVzc2VkKQoreworCXZhciBjbGlja0hhbmRsZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCXsKKwkJaWYgKGFjdGlvbiAhPSBudWxsICYmIGFjdGlvbi5sZW5ndGggPiAwKQorCQl7CisJCQl0aGlzLmVkaXRvci5leGVjdXRlKGFjdGlvbik7CisJCX0KKwl9KTsKKwkKKwlyZXR1cm4gdGhpcy50b29sYmFyLmFkZEl0ZW0odGl0bGUsIGljb24sIGNsaWNrSGFuZGxlciwgcHJlc3NlZCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRTZXBhcmF0b3IKKyAqCisgKiBBZGRzIGEgdmVydGljYWwgc2VwYXJhdG9yIHVzaW5nIHRoZSBvcHRpb25hbCBpY29uLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBpY29uIC0gT3B0aW9uYWwgVVJMIG9mIHRoZSBpY29uIHRoYXQgcmVwcmVzZW50cyB0aGUgdmVydGljYWwgc2VwYXJhdG9yLgorICogRGVmYXVsdCBpcyA8bXhDbGllbnQuaW1hZ2VCYXNlUGF0aD4gKyAnL3NlcGFyYXRvci5naWYnLgorICovCitteERlZmF1bHRUb29sYmFyLnByb3RvdHlwZS5hZGRTZXBhcmF0b3IgPSBmdW5jdGlvbihpY29uKQoreworCWljb24gPSBpY29uIHx8IG14Q2xpZW50LmltYWdlQmFzZVBhdGggKyAnL3NlcGFyYXRvci5naWYnOworCXRoaXMudG9vbGJhci5hZGRTZXBhcmF0b3IoaWNvbik7Cit9OworCQorLyoqCisgKiBGdW5jdGlvbjogYWRkQ29tYm8KKyAqCisgKiBIZWxwZXIgbWV0aG9kIHRvIGludm9rZSA8bXhUb29sYmFyLmFkZENvbWJvPiBvbiA8dG9vbGJhcj4gYW5kIHJldHVybiB0aGUKKyAqIHJlc3VsdGluZyBET00gbm9kZS4KKyAqLworbXhEZWZhdWx0VG9vbGJhci5wcm90b3R5cGUuYWRkQ29tYm8gPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMudG9vbGJhci5hZGRDb21ibygpOworfTsKKwkJCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRBY3Rpb25Db21ibworICoKKyAqIEhlbHBlciBtZXRob2QgdG8gaW52b2tlIDxteFRvb2xiYXIuYWRkQWN0aW9uQ29tYm8+IG9uIDx0b29sYmFyPiB1c2luZworICogdGhlIGdpdmVuIHRpdGxlIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBET00gbm9kZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdGl0bGUgLSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSB0aXRsZSBvZiB0aGUgY29tYm8uCisgKi8KK214RGVmYXVsdFRvb2xiYXIucHJvdG90eXBlLmFkZEFjdGlvbkNvbWJvID0gZnVuY3Rpb24odGl0bGUpCit7CisJcmV0dXJuIHRoaXMudG9vbGJhci5hZGRBY3Rpb25Db21ibyh0aXRsZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRBY3Rpb25PcHRpb24KKyAqCisgKiBCaW5kcyB0aGUgZ2l2ZW4gYWN0aW9uIHRvIGEgb3B0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBsYWJlbCBpbiB0aGUKKyAqIGdpdmVuIGNvbWJvLiBDb21ibyBpcyBhbiBvYmplY3QgcmV0dXJuZWQgZnJvbSBhbiBlYXJsaWVyIGNhbGwgdG8KKyAqIDxhZGRDb21ibz4gb3IgPGFkZEFjdGlvbkNvbWJvPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY29tYm8gLSBET00gbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbWJvIGJveC4KKyAqIHRpdGxlIC0gU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgdGl0bGUgb2YgdGhlIGNvbWJvLgorICogYWN0aW9uIC0gTmFtZSBvZiB0aGUgYWN0aW9uIHRvIGV4ZWN1dGUgaW4gPGVkaXRvcj4uCisgKi8KK214RGVmYXVsdFRvb2xiYXIucHJvdG90eXBlLmFkZEFjdGlvbk9wdGlvbiA9IGZ1bmN0aW9uKGNvbWJvLCB0aXRsZSwgYWN0aW9uKQoreworCXZhciBjbGlja0hhbmRsZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCXsKKwkJdGhpcy5lZGl0b3IuZXhlY3V0ZShhY3Rpb24pOworCX0pOworCQorCXRoaXMuYWRkT3B0aW9uKGNvbWJvLCB0aXRsZSwgY2xpY2tIYW5kbGVyKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZE9wdGlvbgorICoKKyAqIEhlbHBlciBtZXRob2QgdG8gaW52b2tlIDxteFRvb2xiYXIuYWRkT3B0aW9uPiBvbiA8dG9vbGJhcj4gYW5kIHJldHVybgorICogdGhlIHJlc3VsdGluZyBET00gbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIG9wdGlvbi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY29tYm8gLSBET00gbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbWJvIGJveC4KKyAqIHRpdGxlIC0gU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgdGl0bGUgb2YgdGhlIGNvbWJvLgorICogdmFsdWUgLSBPYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uLgorICovCitteERlZmF1bHRUb29sYmFyLnByb3RvdHlwZS5hZGRPcHRpb24gPSBmdW5jdGlvbihjb21ibywgdGl0bGUsIHZhbHVlKQoreworCXJldHVybiB0aGlzLnRvb2xiYXIuYWRkT3B0aW9uKGNvbWJvLCB0aXRsZSwgdmFsdWUpOworfTsKKwkKKy8qKgorICogRnVuY3Rpb246IGFkZE1vZGUKKyAqCisgKiBDcmVhdGVzIGFuIGl0ZW0gZm9yIHNlbGVjdGluZyB0aGUgZ2l2ZW4gbW9kZSBpbiB0aGUgPGVkaXRvcj4ncyBncmFwaC4KKyAqIFN1cHBvcnRlZCBtb2RlbmFtZXMgYXJlIHNlbGVjdCwgY29ubmVjdCBhbmQgcGFuLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB0aXRsZSAtIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHRpdGxlIG9mIHRoZSBpdGVtLgorICogaWNvbiAtIFVSTCBvZiB0aGUgaWNvbiB0aGF0IHJlcHJlc2VudHMgdGhlIGl0ZW0uCisgKiBtb2RlIC0gU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgbW9kZSBuYW1lIHRvIGJlIHVzZWQgaW4KKyAqIDxteEVkaXRvci5zZXRNb2RlPi4KKyAqIHByZXNzZWQgLSBPcHRpb25hbCBVUkwgb2YgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIHRoZSBwcmVzc2VkIHN0YXRlLgorICogZnVuY3QgLSBPcHRpb25hbCBKYXZhU2NyaXB0IGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIDxteEVkaXRvcj4gYXMgdGhlCisgKiBmaXJzdCBhbmQgb25seSBhcmd1bWVudCB0aGF0IGlzIGV4ZWN1dGVkIGFmdGVyIHRoZSBtb2RlIGhhcyBiZWVuCisgKiBzZWxlY3RlZC4KKyAqLworbXhEZWZhdWx0VG9vbGJhci5wcm90b3R5cGUuYWRkTW9kZSA9IGZ1bmN0aW9uKHRpdGxlLCBpY29uLCBtb2RlLCBwcmVzc2VkLCBmdW5jdCkKK3sKKwl2YXIgY2xpY2tIYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKCkKKwl7CisJCXRoaXMuZWRpdG9yLnNldE1vZGUobW9kZSk7CisJCQorCQlpZiAoZnVuY3QgIT0gbnVsbCkKKwkJeworCQkJZnVuY3QodGhpcy5lZGl0b3IpOworCQl9CisJfSk7CisJCisJcmV0dXJuIHRoaXMudG9vbGJhci5hZGRTd2l0Y2hNb2RlKHRpdGxlLCBpY29uLCBjbGlja0hhbmRsZXIsIHByZXNzZWQpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYWRkUHJvdG90eXBlCisgKgorICogQ3JlYXRlcyBhbiBpdGVtIGZvciBpbnNlcnRpbmcgYSBjbG9uZSBvZiB0aGUgc3BlY2lmaWVkIHByb3RvdHlwZSBjZWxsIGludG8KKyAqIHRoZSA8ZWRpdG9yPidzIGdyYXBoLiBUaGUgcHR5cGUgbWF5IGVpdGhlciBiZSBhIGNlbGwgb3IgYSBmdW5jdGlvbiB0aGF0CisgKiByZXR1cm5zIGEgY2VsbC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdGl0bGUgLSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSB0aXRsZSBvZiB0aGUgaXRlbS4KKyAqIGljb24gLSBVUkwgb2YgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIHRoZSBpdGVtLgorICogcHR5cGUgLSBGdW5jdGlvbiBvciBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b3R5cGUgY2VsbC4gSWYgcHR5cGUKKyAqIGlzIGEgZnVuY3Rpb24gdGhlbiBpdCBpcyBpbnZva2VkIHdpdGggbm8gYXJndW1lbnRzIHRvIGNyZWF0ZSBuZXcKKyAqIGluc3RhbmNlcy4KKyAqIHByZXNzZWQgLSBPcHRpb25hbCBVUkwgb2YgdGhlIGljb24gdGhhdCByZXByZXNlbnRzIHRoZSBwcmVzc2VkIHN0YXRlLgorICogaW5zZXJ0IC0gT3B0aW9uYWwgSmF2YVNjcmlwdCBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgYW4gaW5zZXJ0IG9mIHRoZSBuZXcKKyAqIGNlbGwuIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIDxteEVkaXRvcj4sIG5ldyBjZWxsIHRvIGJlIGluc2VydGVkLCBtb3VzZQorICogZXZlbnQgYW5kIG9wdGlvbmFsIDxteENlbGw+IHVuZGVyIHRoZSBtb3VzZSBwb2ludGVyIGFzIGFyZ3VtZW50cy4KKyAqIHRvZ2dsZSAtIE9wdGlvbmFsIGJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIGl0ZW0gY2FuIGJlIHRvZ2dsZWQuCisgKiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214RGVmYXVsdFRvb2xiYXIucHJvdG90eXBlLmFkZFByb3RvdHlwZSA9IGZ1bmN0aW9uKHRpdGxlLCBpY29uLCBwdHlwZSwgcHJlc3NlZCwgaW5zZXJ0LCB0b2dnbGUpCit7CisJLy8gQ3JlYXRlcyBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBpcyBpbiBjaGFyZ2Ugb2YgY29uc3RydWN0aW5nCisJLy8gdGhlIG5ldyBjZWxsIGluc3RhbmNlIHRvIGJlIGluc2VydGVkIGludG8gdGhlIGdyYXBoCisJdmFyIGZhY3RvcnkgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCXsKKwkJaWYgKHR5cGVvZihwdHlwZSkgPT0gJ2Z1bmN0aW9uJykKKwkJeworCQkJcmV0dXJuIHB0eXBlKCk7CisJCX0KKwkJZWxzZSBpZiAocHR5cGUgIT0gbnVsbCkKKwkJeworCQkJcmV0dXJuIHRoaXMuZWRpdG9yLmdyYXBoLmNsb25lQ2VsbHMoW3B0eXBlXSlbMF07CisJCX0KKwkJCisJCXJldHVybiBudWxsOworCX0pOworCQorCS8vIERlZmluZXMgdGhlIGZ1bmN0aW9uIGZvciBhIGNsaWNrIGV2ZW50IG9uIHRoZSBncmFwaAorCS8vIGFmdGVyIHRoaXMgaXRlbSBoYXMgYmVlbiBzZWxlY3RlZCBpbiB0aGUgdG9vbGJhcgorCXZhciBjbGlja0hhbmRsZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0LCBjZWxsKQorCXsKKwkJaWYgKHR5cGVvZihpbnNlcnQpID09ICdmdW5jdGlvbicpCisJCXsKKwkJCWluc2VydCh0aGlzLmVkaXRvciwgZmFjdG9yeSgpLCBldnQsIGNlbGwpOworCQl9CisJCWVsc2UKKwkJeworCQkJdGhpcy5kcm9wKGZhY3RvcnkoKSwgZXZ0LCBjZWxsKTsKKwkJfQorCQkKKwkJdGhpcy50b29sYmFyLnJlc2V0TW9kZSgpOworCQlteEV2ZW50LmNvbnN1bWUoZXZ0KTsKKwl9KTsKKwkKKwl2YXIgaW1nID0gdGhpcy50b29sYmFyLmFkZE1vZGUodGl0bGUsIGljb24sIGNsaWNrSGFuZGxlciwgcHJlc3NlZCwgbnVsbCwgdG9nZ2xlKTsKKwkJCQkKKwkvLyBDcmVhdGVzIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBjbGljayBoYW5kbGVyIHdpdGhvdXQKKwkvLyB0aGUgZ3JhcGggYXJndW1lbnQKKwl2YXIgZHJvcEhhbmRsZXIgPSBmdW5jdGlvbihncmFwaCwgZXZ0LCBjZWxsKQorCXsKKwkJY2xpY2tIYW5kbGVyKGV2dCwgY2VsbCk7CisJfTsKKwkKKwl0aGlzLmluc3RhbGxEcm9wSGFuZGxlcihpbWcsIGRyb3BIYW5kbGVyKTsKKwkKKwlyZXR1cm4gaW1nOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZHJvcAorICogCisgKiBIYW5kbGVzIGEgZHJvcCBmcm9tIGEgdG9vbGJhciBpdGVtIHRvIHRoZSBncmFwaC4gVGhlIGdpdmVuIHZlcnRleAorICogcmVwcmVzZW50cyB0aGUgbmV3IGNlbGwgdG8gYmUgaW5zZXJ0ZWQuIFRoaXMgaW52b2tlcyA8aW5zZXJ0PiBvcgorICogPGNvbm5lY3Q+IGRlcGVuZGluZyBvbiB0aGUgZ2l2ZW4gdGFyZ2V0IGNlbGwuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZlcnRleCAtIDxteENlbGw+IHRvIGJlIGluc2VydGVkLgorICogZXZ0IC0gTW91c2UgZXZlbnQgdGhhdCByZXByZXNlbnRzIHRoZSBkcm9wLgorICogdGFyZ2V0IC0gT3B0aW9uYWwgPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBkcm9wIHRhcmdldC4KKyAqLworbXhEZWZhdWx0VG9vbGJhci5wcm90b3R5cGUuZHJvcCA9IGZ1bmN0aW9uKHZlcnRleCwgZXZ0LCB0YXJnZXQpCit7CisJdmFyIGdyYXBoID0gdGhpcy5lZGl0b3IuZ3JhcGg7CisJdmFyIG1vZGVsID0gZ3JhcGguZ2V0TW9kZWwoKTsKKwkKKwlpZiAodGFyZ2V0ID09IG51bGwgfHwKKwkJbW9kZWwuaXNFZGdlKHRhcmdldCkgfHwKKwkJIXRoaXMuY29ubmVjdE9uRHJvcCB8fAorCQkhZ3JhcGguaXNDZWxsQ29ubmVjdGFibGUodGFyZ2V0KSkKKwl7CisJCXdoaWxlICh0YXJnZXQgIT0gbnVsbCAmJgorCQkJIWdyYXBoLmlzVmFsaWREcm9wVGFyZ2V0KHRhcmdldCwgW3ZlcnRleF0sIGV2dCkpCisJCXsKKwkJCXRhcmdldCA9IG1vZGVsLmdldFBhcmVudCh0YXJnZXQpOworCQl9CisJCQorCQl0aGlzLmluc2VydCh2ZXJ0ZXgsIGV2dCwgdGFyZ2V0KTsKKwl9CisJZWxzZQorCXsKKwkJdGhpcy5jb25uZWN0KHZlcnRleCwgZXZ0LCB0YXJnZXQpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGluc2VydAorICoKKyAqIEhhbmRsZXMgYSBkcm9wIGJ5IGluc2VydGluZyB0aGUgZ2l2ZW4gdmVydGV4IGludG8gdGhlIGdpdmVuIHBhcmVudCBjZWxsCisgKiBvciB0aGUgZGVmYXVsdCBwYXJlbnQgaWYgbm8gcGFyZW50IGlzIHNwZWNpZmllZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmVydGV4IC0gPG14Q2VsbD4gdG8gYmUgaW5zZXJ0ZWQuCisgKiBldnQgLSBNb3VzZSBldmVudCB0aGF0IHJlcHJlc2VudHMgdGhlIGRyb3AuCisgKiBwYXJlbnQgLSBPcHRpb25hbCA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHBhcmVudC4KKyAqLworbXhEZWZhdWx0VG9vbGJhci5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24odmVydGV4LCBldnQsIHRhcmdldCkKK3sKKwl2YXIgZ3JhcGggPSB0aGlzLmVkaXRvci5ncmFwaDsKKwkKKwlpZiAoZ3JhcGguY2FuSW1wb3J0Q2VsbCh2ZXJ0ZXgpKQorCXsKKwkJdmFyIHggPSBteEV2ZW50LmdldENsaWVudFgoZXZ0KTsKKwkJdmFyIHkgPSBteEV2ZW50LmdldENsaWVudFkoZXZ0KTsKKwkJdmFyIHB0ID0gbXhVdGlscy5jb252ZXJ0UG9pbnQoZ3JhcGguY29udGFpbmVyLCB4LCB5KTsKKwkJCisJCS8vIFNwbGl0cyB0aGUgdGFyZ2V0IGVkZ2Ugb3IgaW5zZXJ0cyBpbnRvIHRhcmdldCBncm91cAorCQlpZiAoZ3JhcGguaXNTcGxpdEVuYWJsZWQoKSAmJgorCQkJZ3JhcGguaXNTcGxpdFRhcmdldCh0YXJnZXQsIFt2ZXJ0ZXhdLCBldnQpKQorCQl7CisJCQlyZXR1cm4gZ3JhcGguc3BsaXRFZGdlKHRhcmdldCwgW3ZlcnRleF0sIG51bGwsIHB0LngsIHB0LnkpOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuIHRoaXMuZWRpdG9yLmFkZFZlcnRleCh0YXJnZXQsIHZlcnRleCwgcHQueCwgcHQueSk7CisJCX0KKwl9CisJCisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjb25uZWN0CisgKiAKKyAqIEhhbmRsZXMgYSBkcm9wIGJ5IGNvbm5lY3RpbmcgdGhlIGdpdmVuIHZlcnRleCB0byB0aGUgZ2l2ZW4gc291cmNlIGNlbGwuCisgKiAKKyAqIHZlcnRleCAtIDxteENlbGw+IHRvIGJlIGluc2VydGVkLgorICogZXZ0IC0gTW91c2UgZXZlbnQgdGhhdCByZXByZXNlbnRzIHRoZSBkcm9wLgorICogc291cmNlIC0gT3B0aW9uYWwgPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBzb3VyY2UgdGVybWluYWwuCisgKi8KK214RGVmYXVsdFRvb2xiYXIucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbih2ZXJ0ZXgsIGV2dCwgc291cmNlKQoreworCXZhciBncmFwaCA9IHRoaXMuZWRpdG9yLmdyYXBoOworCXZhciBtb2RlbCA9IGdyYXBoLmdldE1vZGVsKCk7CisJCisJaWYgKHNvdXJjZSAhPSBudWxsICYmCisJCWdyYXBoLmlzQ2VsbENvbm5lY3RhYmxlKHZlcnRleCkgJiYKKwkJZ3JhcGguaXNFZGdlVmFsaWQobnVsbCwgc291cmNlLCB2ZXJ0ZXgpKQorCXsKKwkJdmFyIGVkZ2UgPSBudWxsOworCisJCW1vZGVsLmJlZ2luVXBkYXRlKCk7CisJCXRyeQorCQl7CisJCQl2YXIgZ2VvID0gbW9kZWwuZ2V0R2VvbWV0cnkoc291cmNlKTsKKwkJCXZhciBnID0gbW9kZWwuZ2V0R2VvbWV0cnkodmVydGV4KS5jbG9uZSgpOworCQkJCisJCQkvLyBNb3ZlcyB0aGUgdmVydGV4IGF3YXkgZnJvbSB0aGUgZHJvcCB0YXJnZXQgdGhhdCB3aWxsCisJCQkvLyBiZSB1c2VkIGFzIHRoZSBzb3VyY2UgZm9yIHRoZSBuZXcgY29ubmVjdGlvbgorCQkJZy54ID0gZ2VvLnggKyAoZ2VvLndpZHRoIC0gZy53aWR0aCkgLyAyOworCQkJZy55ID0gZ2VvLnkgKyAoZ2VvLmhlaWdodCAtIGcuaGVpZ2h0KSAvIDI7CisJCQkKKwkJCXZhciBzdGVwID0gdGhpcy5zcGFjaW5nICogZ3JhcGguZ3JpZFNpemU7CisJCQl2YXIgZGlzdCA9IG1vZGVsLmdldERpcmVjdGVkRWRnZUNvdW50KHNvdXJjZSwgdHJ1ZSkgKiAyMDsKKwkJCQorCQkJaWYgKHRoaXMuZWRpdG9yLmhvcml6b250YWxGbG93KQorCQkJeworCQkJCWcueCArPSAoZy53aWR0aCArIGdlby53aWR0aCkgLyAyICsgc3RlcCArIGRpc3Q7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZy55ICs9IChnLmhlaWdodCArIGdlby5oZWlnaHQpIC8gMiArIHN0ZXAgKyBkaXN0OworCQkJfQorCQkJCisJCQl2ZXJ0ZXguc2V0R2VvbWV0cnkoZyk7CisJCQkKKwkJCS8vIEZpcmVzIHR3byBhZGQtZXZlbnRzIHdpdGggdGhlIGNvZGUgYmVsb3cgLSBzaG91bGQgYmUgZml4ZWQKKwkJCS8vIHRvIG9ubHkgZmlyZSBvbmUgYWRkIGV2ZW50IGZvciBib3RoIGluc2VydHMKKwkJCXZhciBwYXJlbnQgPSBtb2RlbC5nZXRQYXJlbnQoc291cmNlKTsKKwkJCWdyYXBoLmFkZENlbGwodmVydGV4LCBwYXJlbnQpOworCQkJZ3JhcGguY29uc3RyYWluQ2hpbGQodmVydGV4KTsKKworCQkJLy8gQ3JlYXRlcyB0aGUgZWRnZSB1c2luZyB0aGUgZWRpdG9yIGluc3RhbmNlIGFuZCBjYWxscworCQkJLy8gdGhlIHNlY29uZCBmdW5jdGlvbiB0aGF0IGZpcmVzIGFuIGFkZCBldmVudAorCQkJZWRnZSA9IHRoaXMuZWRpdG9yLmNyZWF0ZUVkZ2Uoc291cmNlLCB2ZXJ0ZXgpOworCQkJCisJCQlpZiAobW9kZWwuZ2V0R2VvbWV0cnkoZWRnZSkgPT0gbnVsbCkKKwkJCXsKKwkJCQl2YXIgZWRnZUdlb21ldHJ5ID0gbmV3IG14R2VvbWV0cnkoKTsKKwkJCQllZGdlR2VvbWV0cnkucmVsYXRpdmUgPSB0cnVlOworCQkJCQorCQkJCW1vZGVsLnNldEdlb21ldHJ5KGVkZ2UsIGVkZ2VHZW9tZXRyeSk7CisJCQl9CisJCQkKKwkJCWdyYXBoLmFkZEVkZ2UoZWRnZSwgcGFyZW50LCBzb3VyY2UsIHZlcnRleCk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCQltb2RlbC5lbmRVcGRhdGUoKTsKKwkJfQorCQkKKwkJZ3JhcGguc2V0U2VsZWN0aW9uQ2VsbHMoW3ZlcnRleCwgZWRnZV0pOworCQlncmFwaC5zY3JvbGxDZWxsVG9WaXNpYmxlKHZlcnRleCk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogaW5zdGFsbERyb3BIYW5kbGVyCisgKiAKKyAqIE1ha2VzIHRoZSBnaXZlbiBpbWcgZHJhZ2dhYmxlIHVzaW5nIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgYQorICogZHJvcCBldmVudC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogaW1nIC0gRE9NIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBpbWFnZS4KKyAqIGRyb3BIYW5kbGVyIC0gRnVuY3Rpb24gdGhhdCBoYW5kbGVzIGEgZHJvcCBvZiB0aGUgaW1hZ2UuCisgKi8KK214RGVmYXVsdFRvb2xiYXIucHJvdG90eXBlLmluc3RhbGxEcm9wSGFuZGxlciA9IGZ1bmN0aW9uIChpbWcsIGRyb3BIYW5kbGVyKQoreworCXZhciBzcHJpdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKKwlzcHJpdGUuc2V0QXR0cmlidXRlKCdzcmMnLCBpbWcuZ2V0QXR0cmlidXRlKCdzcmMnKSk7CisKKwkvLyBIYW5kbGVzIGRlbGF5ZWQgbG9hZGluZyBvZiB0aGUgaW1hZ2VzCisJdmFyIGxvYWRlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJeworCQkvLyBQcmV2aWV3IHVzZXMgdGhlIGltYWdlIG5vZGUgd2l0aCBkb3VibGUgc2l6ZS4gTGF0ZXIgdGhpcyBjYW4gYmUKKwkJLy8gY2hhbmdlZCB0byB1c2UgYSBzZXBhcmF0ZSBwcmV2aWV3IGFuZCBndWlkZXMsIGJ1dCBmb3IgdGhpcyB0aGUKKwkJLy8gZHJvcEhhbmRsZXIgbXVzdCB1c2UgdGhlIGFkZGl0aW9uYWwgeC0gYW5kIHktYXJndW1lbnRzIGFuZCB0aGUKKwkJLy8gZHJhZ3NvdXJjZSB3aGljaCBtYWtlRHJhZ2dhYmxlIHJldHVybnMgbXVjaCBiZSBjb25maWd1cmVkIHRvCisJCS8vIHVzZSBndWlkZXMgdmlhIG14RHJhZ1NvdXJjZS5pc0d1aWRlc0VuYWJsZWQuCisJCXNwcml0ZS5zdHlsZS53aWR0aCA9ICgyICogaW1nLm9mZnNldFdpZHRoKSArICdweCc7CisJCXNwcml0ZS5zdHlsZS5oZWlnaHQgPSAoMiAqIGltZy5vZmZzZXRIZWlnaHQpICsgJ3B4JzsKKworCQlteFV0aWxzLm1ha2VEcmFnZ2FibGUoaW1nLCB0aGlzLmVkaXRvci5ncmFwaCwgZHJvcEhhbmRsZXIsCisJCQlzcHJpdGUpOworCQlteEV2ZW50LnJlbW92ZUxpc3RlbmVyKHNwcml0ZSwgJ2xvYWQnLCBsb2FkZXIpOworCX0pOworCisJaWYgKG14Q2xpZW50LklTX0lFKQorCXsKKwkJbG9hZGVyKCk7CisJfQorCWVsc2UKKwl7CisJCW14RXZlbnQuYWRkTGlzdGVuZXIoc3ByaXRlLCAnbG9hZCcsIGxvYWRlcik7CisJfQkKK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqIAorICogRGVzdHJveXMgdGhlIDx0b29sYmFyPiBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QgYW5kIHJlbW92ZXMgYWxsCisgKiBpbnN0YWxsZWQgbGlzdGVuZXJzLiBUaGlzIGRvZXMgbm9ybWFsbHkgbm90IG5lZWQgdG8gYmUgY2FsbGVkLCB0aGUKKyAqIDx0b29sYmFyPiBpcyBkZXN0cm95ZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSB3aW5kb3cgdW5sb2FkcyAoaW4gSUUpIGJ5CisgKiA8bXhFZGl0b3I+LgorICovCitteERlZmF1bHRUb29sYmFyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkKK3sKKwlpZiAodGhpcy5yZXNldEhhbmRsZXIgIT0gbnVsbCkKKwl7CisJCXRoaXMuZWRpdG9yLmdyYXBoLnJlbW92ZUxpc3RlbmVyKCdkYmxjbGljaycsIHRoaXMucmVzZXRIYW5kbGVyKTsKKwkJdGhpcy5lZGl0b3IucmVtb3ZlTGlzdGVuZXIoJ2VzY2FwZScsIHRoaXMucmVzZXRIYW5kbGVyKTsKKwkJdGhpcy5yZXNldEhhbmRsZXIgPSBudWxsOworCX0KKwkKKwlpZiAodGhpcy50b29sYmFyICE9IG51bGwpCisJeworCQl0aGlzLnRvb2xiYXIuZGVzdHJveSgpOworCQl0aGlzLnRvb2xiYXIgPSBudWxsOworCX0KK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvZWRpdG9yL214RWRpdG9yLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2VkaXRvci9teEVkaXRvci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWVjNjQxCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2VkaXRvci9teEVkaXRvci5qcwpAQCAtMCwwICsxLDMxMTQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14RWRpdG9yCisgKgorICogRXh0ZW5kcyA8bXhFdmVudFNvdXJjZT4gdG8gaW1wbGVtZW50IGEgYXBwbGljYXRpb24gd3JhcHBlciBmb3IgYSBncmFwaCB0aGF0CisgKiBhZGRzIDxhY3Rpb25zPiwgSS9PIHVzaW5nIDxteENvZGVjPiwgYXV0by1sYXlvdXQgdXNpbmcgPG14TGF5b3V0TWFuYWdlcj4sCisgKiBjb21tYW5kIGhpc3RvcnkgdXNpbmcgPHVuZG9NYW5hZ2VyPiwgYW5kIHN0YW5kYXJkIGRpYWxvZ3MgYW5kIHdpZGdldHMsIGVnLgorICogcHJvcGVydGllcywgaGVscCwgb3V0bGluZSwgdG9vbGJhciwgYW5kIHBvcHVwbWVudS4gSXQgYWxzbyBhZGRzIDx0ZW1wbGF0ZXM+CisgKiB0byBiZSB1c2VkIGFzIGNlbGxzIGluIHRvb2xiYXJzLCBhdXRvLXZhbGlkYXRpb24gdXNpbmcgdGhlIDx2YWxpZGF0aW9uPgorICogZmxhZywgYXR0cmlidXRlIGN5Y2xpbmcgdXNpbmcgPGN5Y2xlQXR0cmlidXRlVmFsdWVzPiwgaGlnaGVyLWxldmVsIGV2ZW50cworICogc3VjaCBhcyA8cm9vdD4sIGFuZCBiYWNrZW5kIGludGVncmF0aW9uIHVzaW5nIDx1cmxQb3N0PiBhbmQgPHVybEltYWdlPi4gCisgKiAKKyAqIEFjdGlvbnM6CisgKiAKKyAqIEFjdGlvbnMgYXJlIGZ1bmN0aW9ucyBzdG9yZWQgaW4gdGhlIDxhY3Rpb25zPiBhcnJheSB1bmRlciB0aGVpciBuYW1lcy4gVGhlCisgKiBmdW5jdGlvbnMgdGFrZSB0aGUgPG14RWRpdG9yPiBhcyB0aGUgZmlyc3QsIGFuZCBhbiBvcHRpb25hbCA8bXhDZWxsPiBhcyB0aGUKKyAqIHNlY29uZCBhcmd1bWVudCBhbmQgYXJlIGludm9rZWQgdXNpbmcgPGV4ZWN1dGU+LiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMKKyAqIHBhc3NlZCB0byBleGVjdXRlIGFyZSBwYXNzZWQgb24gdG8gdGhlIGFjdGlvbiBhcy1pcy4KKyAqIAorICogQSBsaXN0IG9mIGJ1aWx0LWluIGFjdGlvbnMgaXMgYXZhaWxhYmxlIGluIHRoZSA8YWRkQWN0aW9ucz4gZGVzY3JpcHRpb24uCisgKiAKKyAqIFJlYWQvd3JpdGUgRGlhZ3JhbXM6CisgKiAKKyAqIFRvIHJlYWQgYSBkaWFncmFtIGZyb20gYW4gWE1MIHN0cmluZywgZm9yIGV4YW1wbGUgZnJvbSBhIHRleHRmaWVsZCB3aXRoaW4gdGhlIAorICogcGFnZSwgdGhlIGZvbGxvd2luZyBjb2RlIGlzIHVzZWQ6CisgKiAKKyAqIChjb2RlKQorICogdmFyIGRvYyA9IG14VXRpbHMucGFyc2VYTUwoeG1sU3RyaW5nKTsKKyAqIHZhciBub2RlID0gZG9jLmRvY3VtZW50RWxlbWVudDsKKyAqIGVkaXRvci5yZWFkR3JhcGhNb2RlbChub2RlKTsKKyAqIChlbmQpCisgKiAKKyAqIEZvciByZWFkaW5nIGEgZGlhZ3JhbSBmcm9tIGEgcmVtb3RlIGxvY2F0aW9uLCB1c2UgdGhlIDxvcGVuPiBtZXRob2QuCisgKiAKKyAqIFRvIHNhdmUgZGlhZ3JhbXMgaW4gWE1MIG9uIGEgc2VydmVyLCB5b3UgY2FuIHNldCB0aGUgPHVybFBvc3Q+IHZhcmlhYmxlLiAKKyAqIFRoaXMgdmFyaWFibGUgd2lsbCBiZSB1c2VkIGluIDxnZXRVcmxQb3N0PiB0byBjb25zdHJ1Y3QgYSBVUkwgZm9yIHRoZSBwb3N0IAorICogcmVxdWVzdCB0aGF0IGlzIGlzc3VlZCBpbiB0aGUgPHNhdmU+IG1ldGhvZC4gVGhlIHBvc3QgcmVxdWVzdCBjb250YWlucyB0aGUgCisgKiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRpYWdyYW0gYXMgcmV0dXJuZWQgYnkgPHdyaXRlR3JhcGhNb2RlbD4gaW4gdGhlIAorICogeG1sIHBhcmFtZXRlci4KKyAqIAorICogT24gdGhlIHNlcnZlciBzaWRlLCB0aGUgcG9zdCByZXF1ZXN0IGlzIHByb2Nlc3NlZCB1c2luZyBzdGFuZGFyZAorICogdGVjaG5vbG9naWVzIHN1Y2ggYXMgSmF2YSBTZXJ2bGV0cywgQ0dJLCAuTkVUIG9yIEFTUC4KKyAqIAorICogSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBwcm9jZXNzaW5nIGEgcG9zdCByZXF1ZXN0IGluIHZhcmlvdXMgbGFuZ3VhZ2VzLgorICogCisgKiAtIEphdmE6IFVSTERlY29kZXIuZGVjb2RlKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ4bWwiKSwgIlVURi04IikucmVwbGFjZSgiXG4iLCAiJiN4YTsiKQorICogCisgKiBOb3RlIHRoYXQgdGhlIGxpbmVmZWVkcyBzaG91bGQgb25seSBiZSByZXBsYWNlZCBpZiB0aGUgWE1MIGlzCisgKiBwcm9jZXNzZWQgaW4gSmF2YSwgZm9yIGV4YW1wbGUgd2hlbiBjcmVhdGluZyBhbiBpbWFnZSwgYnV0IG5vdAorICogaWYgdGhlIFhNTCBpcyBwYXNzZWQgYmFjayB0byB0aGUgY2xpZW50LXNpZGUuCisgKiAKKyAqIC0gLk5FVDogSHR0cFV0aWxpdHkuVXJsRGVjb2RlKGNvbnRleHQuUmVxdWVzdC5QYXJhbXNbInhtbCJdKQorICogLSBQSFA6IHVybGRlY29kZSgkX1BPU1RbInhtbCJdKQorICogCisgKiBDcmVhdGluZyBpbWFnZXM6CisgKiAKKyAqIEEgYmFja2VuZCAoSmF2YSwgUEhQIG9yIEMjKSBpcyByZXF1aXJlZCBmb3IgY3JlYXRpbmcgaW1hZ2VzLiBUaGUKKyAqIGRpc3RyaWJ1dGlvbiBjb250YWlucyBhbiBleGFtcGxlIGZvciBlYWNoIGJhY2tlbmQgKEltYWdlSGFuZGxlci5qYXZhLAorICogSW1hZ2VIYW5kbGVyLmNzIGFuZCBncmFwaC5waHApLiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIGEgYmFja2VuZAorICogdG8gY3JlYXRlIGltYWdlcyBjYW4gYmUgZm91bmQgaW4gdGhlIHJlYWRtZS5odG1sIGZpbGVzLiBOb3RlIHRoYXQgdGhlCisgKiBwcmV2aWV3IGlzIGltcGxlbWVudGVkIHVzaW5nIFZNTC9TVkcgaW4gdGhlIGJyb3dzZXIgYW5kIGRvZXMgbm90IHJlcXVpcmUKKyAqIGEgYmFja2VuZC4gVGhlIGJhY2tlbmQgaXMgb25seSByZXF1aXJlZCB0byBjcmVhdGVzIGltYWdlcyAoYml0bWFwcykuCisgKiAKKyAqIFNwZWNpYWwgY2hhcmFjdGVyczoKKyAqIAorICogTm90ZSBUaGVyZSBhcmUgZml2ZSBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIGFsd2F5cyBhcHBlYXIgaW4gWE1MIGNvbnRlbnQgYXMKKyAqIGVzY2FwZXMsIHNvIHRoYXQgdGhleSBkbyBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgc3ludGF4IG9mIHRoZSBtYXJrdXAuIFRoZXNlCisgKiBhcmUgcGFydCBvZiB0aGUgbGFuZ3VhZ2UgZm9yIGFsbCBkb2N1bWVudHMgYmFzZWQgb24gWE1MIGFuZCBmb3IgSFRNTC4KKyAqIAorICogLSAmbHQ7ICg8KQorICogLSAmZ3Q7ICg+KQorICogLSAmYW1wOyAoJikKKyAqIC0gJnF1b3Q7ICgiKQorICogLSAmYXBvczsgKCcpCisgKiAKKyAqIEFsdGhvdWdoIGl0IGlzIHBhcnQgb2YgdGhlIFhNTCBsYW5ndWFnZSwgJmFwb3M7IGlzIG5vdCBkZWZpbmVkIGluIEhUTUwuCisgKiBGb3IgdGhpcyByZWFzb24gdGhlIFhIVE1MIHNwZWNpZmljYXRpb24gcmVjb21tZW5kcyBpbnN0ZWFkIHRoZSB1c2Ugb2YKKyAqICYjMzk7IGlmIHRleHQgbWF5IGJlIHBhc3NlZCB0byBhIEhUTUwgdXNlciBhZ2VudC4KKyAqIAorICogSWYgeW91IGFyZSBoYXZpbmcgcHJvYmxlbXMgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMgb24gdGhlIHNlcnZlci1zaWRlIHRoZW4KKyAqIHlvdSBtYXkgd2FudCB0byB0cnkgdGhlIDxlc2NhcGVQb3N0RGF0YT4gZmxhZy4KKyAqIAorICogRm9yIGNvbnZlcnRpbmcgZGVjaW1hbCBlc2NhcGUgc2VxdWVuY2VzIGluc2lkZSBzdHJpbmdzLCBhIHVzZXIgaGFzIHByb3ZpZGVkCisgKiB1cyB3aXRoIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisgKiAKKyAqIChjb2RlKQorICogZnVuY3Rpb24gaHRtbDJqcyh0ZXh0KQorICogeworICogICB2YXIgZW50aXR5U2VhcmNoID0gLyYjWzAtOV0rOy87CisgKiAgIHZhciBlbnRpdHk7CisgKiAgIAorICogICB3aGlsZSAoZW50aXR5ID0gZW50aXR5U2VhcmNoLmV4ZWModGV4dCkpCisgKiAgIHsKKyAqICAgICB2YXIgY2hhckNvZGUgPSBlbnRpdHlbMF0uc3Vic3RyaW5nKDIsIGVudGl0eVswXS5sZW5ndGggLTEpOworICogICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBlbnRpdHkuaW5kZXgpCisgKiAgICAgICAgICAgICsgU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSkKKyAqICAgICAgICAgICAgKyB0ZXh0LnN1YnN0cmluZyhlbnRpdHkuaW5kZXggKyBlbnRpdHlbMF0ubGVuZ3RoKTsKKyAqICAgfQorICogICAKKyAqICAgcmV0dXJuIHRleHQ7CisgKiB9CisgKiAoZW5kKQorICogCisgKiBPdGhlcndpc2UgdHJ5IHVzaW5nIGhleCBlc2NhcGUgc2VxdWVuY2VzIGFuZCB0aGUgYnVpbHQtaW4gdW5lc2NhcGUgZnVuY3Rpb24KKyAqIGZvciBjb252ZXJ0aW5nIHN1Y2ggc3RyaW5ncy4KKyAqIAorICogTG9jYWwgRmlsZXM6CisgKiAKKyAqIEZvciBzYXZpbmcgYW5kIG9wZW5pbmcgbG9jYWwgZmlsZXMsIG5vIHN0YW5kYXJkaXplZCBtZXRob2QgZXhpc3RzIHRoYXQKKyAqIHdvcmtzIGFjcm9zcyBhbGwgYnJvd3NlcnMuIFRoZSByZWNvbW1lbmRlZCB3YXkgb2YgZGVhbGluZyB3aXRoIGxvY2FsIGZpbGVzCisgKiBpcyB0byBjcmVhdGUgYSBiYWNrZW5kIHRoYXQgc3RyZWFtcyB0aGUgWE1MIGRhdGEgYmFjayB0byB0aGUgYnJvd3NlciAoZWNobykKKyAqIGFzIGFuIGF0dGFjaG1lbnQgc28gdGhhdCBhIFNhdmUtZGlhbG9nIGlzIGRpc3BsYXllZCBvbiB0aGUgY2xpZW50LXNpZGUgYW5kCisgKiB0aGUgZmlsZSBjYW4gYmUgc2F2ZWQgdG8gdGhlIGxvY2FsIGRpc2suCisgKiAKKyAqIEZvciBleGFtcGxlLCBpbiBQSFAgdGhlIGNvZGUgdGhhdCBkb2VzIHRoaXMgbG9va3MgYXMgZm9sbG93cy4KKyAqIAorICogKGNvZGUpCisgKiAkeG1sID0gc3RyaXBzbGFzaGVzKCRfUE9TVFsieG1sIl0pOworICogaGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1cImRpYWdyYW0ueG1sXCIiKTsKKyAqIGVjaG8oJHhtbCk7CisgKiAoZW5kKQorICogCisgKiBUbyBvcGVuIGEgbG9jYWwgZmlsZSwgdGhlIGZpbGUgc2hvdWxkIGJlIHVwbG9hZGVkIHZpYSBhIGZvcm0gaW4gdGhlIGJyb3dzZXIKKyAqIGFuZCB0aGVuIG9wZW5lZCBmcm9tIHRoZSBzZXJ2ZXIgaW4gdGhlIGVkaXRvci4KKyAqIAorICogQ2VsbCBQcm9wZXJ0aWVzOgorICogCisgKiBUaGUgcHJvcGVydGllcyBkaXNwbGF5ZWQgaW4gdGhlIHByb3BlcnRpZXMgZGlhbG9nIGFyZSB0aGUgYXR0cmlidXRlcyBhbmQgCisgKiB2YWx1ZXMgb2YgdGhlIGNlbGwncyB1c2VyIG9iamVjdCwgd2hpY2ggaXMgYW4gWE1MIG5vZGUuIFRoZSBYTUwgbm9kZSBpcyAKKyAqIGRlZmluZWQgaW4gdGhlIHRlbXBsYXRlcyBzZWN0aW9uIG9mIHRoZSBjb25maWcgZmlsZS4KKyAqIAorICogVGhlIHRlbXBsYXRlcyBhcmUgc3RvcmVkIGluIDxteEVkaXRvci50ZW1wbGF0ZXM+IGFuZCBjb250YWluIGNlbGxzIHdoaWNoCisgKiBhcmUgY2xvbmVkIGF0IGluc2VydGlvbiB0aW1lIHRvIGNyZWF0ZSBuZXcgdmVydGljZXMgYnkgdXNlIG9mIGRyYWcgYW5kCisgKiBkcm9wIGZyb20gdGhlIHRvb2xiYXIuIEVhY2ggZW50cnkgaW4gdGhlIHRvb2xiYXIgZm9yIGFkZGluZyBhIG5ldyB2ZXJ0ZXgKKyAqIG11c3QgcmVmZXIgdG8gYW4gZXhpc3RpbmcgdGVtcGxhdGUuCisgKiAKKyAqIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgdGhlIHRhc2sgbm9kZSBpcyBhIGJ1c2luZXNzIG9iamVjdCBhbmQgb25seSB0aGUgCisgKiBteENlbGwgbm9kZSBhbmQgaXRzIG14R2VvbWV0cnkgY2hpbGQgY29udGFpbiBncmFwaCBpbmZvcm1hdGlvbjoKKyAqIAorICogKGNvZGUpCisgKiA8VGFzayBsYWJlbD0iVGFzayIgZGVzY3JpcHRpb249IiI+CisgKiAgIDxteENlbGwgdmVydGV4PSJ0cnVlIj4KKyAqICAgICA8bXhHZW9tZXRyeSBhcz0iZ2VvbWV0cnkiIHdpZHRoPSI3MiIgaGVpZ2h0PSIzMiIvPgorICogICA8L214Q2VsbD4KKyAqIDwvVGFzaz4gCisgKiAoZW5kKQorICogCisgKiBUaGUgaWRlYSBpcyB0aGF0IHRoZSBYTUwgcmVwcmVzZW50YXRpb24gaXMgaW52ZXJzZSBmcm9tIHRoZSBpbi1tZW1vcnkgCisgKiByZXByZXNlbnRhdGlvbjogVGhlIG91dGVyIFhNTCBub2RlIGlzIHRoZSB1c2VyIG9iamVjdCBhbmQgdGhlIGlubmVyIG5vZGUgaXMgCisgKiB0aGUgY2VsbC4gVGhpcyBtZWFucyB0aGUgdXNlciBvYmplY3Qgb2YgdGhlIGNlbGwgaXMgdGhlIFRhc2sgbm9kZSB3aXRoIG5vIAorICogY2hpbGRyZW4gZm9yIHRoZSBhYm92ZSBleGFtcGxlOgorICogCisgKiAoY29kZSkKKyAqIDxUYXNrIGxhYmVsPSJUYXNrIiBkZXNjcmlwdGlvbj0iIi8+CisgKiAoZW5kKQorICogCisgKiBUaGUgVGFzayBub2RlIGNhbiBoYXZlIGFueSB0YWcgbmFtZSwgYXR0cmlidXRlcyBhbmQgY2hpbGQgbm9kZXMuIFRoZSAKKyAqIDxteENvZGVjPiB3aWxsIHVzZSB0aGUgWE1MIGhpZXJhcmNoeSBhcyB0aGUgdXNlciBvYmplY3QsIHdoaWxlIHJlbW92aW5nIHRoZSAKKyAqICJrbm93biBhbm5vdGF0aW9ucyIsIHN1Y2ggYXMgdGhlIG14Q2VsbCBub2RlLiBBdCBzYXZlLXRpbWUgdGhlIGNlbGwgZGF0YSAKKyAqIHdpbGwgYmUgIm1lcmdlZCIgYmFjayBpbnRvIHRoZSB1c2VyIG9iamVjdC4gVGhlIHVzZXIgb2JqZWN0IGlzIG9ubHkgbW9kaWZpZWQgCisgKiB2aWEgdGhlIHByb3BlcnRpZXMgZGlhbG9nIGR1cmluZyB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBjZWxsLgorICogCisgKiBJbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiA8Y3JlYXRlUHJvcGVydGllcz4sIHRoZSB1c2VyIG9iamVjdCdzCisgKiBhdHRyaWJ1dGVzIGFyZSBwdXQgaW50byBhIGZvcm0gZm9yIGVkaXRpbmcuIEF0dHJpYnV0ZXMgYXJlIGNoYW5nZWQgdXNpbmcKKyAqIHRoZSA8bXhDZWxsQXR0cmlidXRlQ2hhbmdlPiBhY3Rpb24gaW4gdGhlIG1vZGVsLiBUaGUgZGlhbG9nIGNhbiBiZSByZXBsYWNlZCAKKyAqIGJ5IG92ZXJyaWRpbmcgdGhlIDxjcmVhdGVQcm9wZXJ0aWVzPiBob29rIG9yIGJ5IHJlcGxhY2luZyB0aGUgc2hvd1Byb3BlcnRpZXMKKyAqIGFjdGlvbiBpbiA8YWN0aW9ucz4uIEFsdGVybmF0aXZlbHksIHRoZSBlbnRyeSBpbiB0aGUgY29uZmlnIGZpbGUncyBwb3B1cG1lbnUKKyAqIHNlY3Rpb24gY2FuIGJlIG1vZGlmaWVkIHRvIGludm9rZSBhIGRpZmZlcmVudCBhY3Rpb24uCisgKiAKKyAqIElmIHlvdSB3YW50IHRvIGRpc3BsZXkgdGhlIHByb3BlcnRpZXMgZGlhbG9nIG9uIGEgZG91YmxlY2xpY2ssIHlvdSBjYW4gc2V0CisgKiA8bXhFZGl0b3IuZGJsQ2xpY2tBY3Rpb24+IHRvIHNob3dQcm9wZXJ0aWVzIGFzIGZvbGxvd3M6CisgKiAKKyAqIChjb2RlKQorICogZWRpdG9yLmRibENsaWNrQWN0aW9uID0gJ3Nob3dQcm9wZXJ0aWVzJzsKKyAqIChlbmQpCisgKiAKKyAqIFBvcHVwbWVudSBhbmQgVG9vbGJhcjoKKyAqIAorICogVGhlIHRvb2xiYXIgYW5kIHBvcHVwbWVudSBhcmUgdHlwaWNhbGx5IGNvbmZpZ3VyZWQgdXNpbmcgdGhlIHJlc3BlY3RpdmUKKyAqIHNlY3Rpb25zIGluIHRoZSBjb25maWcgZmlsZSwgdGhhdCBpcywgdGhlIHBvcHVwbWVudSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisgKiAKKyAqIChjb2RlKQorICogPG14RWRpdG9yPgorICogICA8bXhEZWZhdWx0UG9wdXBNZW51IGFzPSJwb3B1cEhhbmRsZXIiPgorICogCQk8YWRkIGFzPSJjdXQiIGFjdGlvbj0iY3V0IiBpY29uPSJpbWFnZXMvY3V0LmdpZiIvPgorICogICAgICAuLi4KKyAqIChlbmQpCisgKiAKKyAqIE5ldyBlbnRyaWVzIGNhbiBiZSBhZGRlZCB0byB0aGUgdG9vbGJhciBieSBpbnNlcnRpbmcgYW4gYWRkLW5vZGUgaW50byB0aGUKKyAqIGFib3ZlIGNvbmZpZ3VyYXRpb24uIEV4aXN0aW5nIGVudHJpZXMgbWF5IGJlIHJlbW92ZWQgYW5kIGNoYW5nZWQgYnkKKyAqIG1vZGlmeWluZyBvciByZW1vdmluZyB0aGUgcmVzcGVjdGl2ZSBlbnRyaWVzIGluIHRoZSBjb25maWd1cmF0aW9uLgorICogVGhlIGNvbmZpZ3VyYXRpb24gaXMgcmVhZCBieSB0aGUgPG14RGVmYXVsdFBvcHVwTWVudUNvZGVjPiwgdGhlIGZvcm1hdCBvZiB0aGUKKyAqIGNvbmZpZ3VyYXRpb24gaXMgZXhwbGFpbmVkIGluIDxteERlZmF1bHRQb3B1cE1lbnUuZGVjb2RlPi4KKyAqIAorICogVGhlIHRvb2xiYXIgaXMgZGVmaW5lZCBpbiB0aGUgbXhEZWZhdWx0VG9vbGJhciBzZWN0aW9uLiBJdGVtcyBjYW4gYmUgYWRkZWQKKyAqIGFuZCByZW1vdmVkIGluIHRoaXMgc2VjdGlvbi4KKyAqIAorICogKGNvZGUpCisgKiA8bXhFZGl0b3I+CisgKiAgIDxteERlZmF1bHRUb29sYmFyPgorICogICAgIDxhZGQgYXM9InNhdmUiIGFjdGlvbj0ic2F2ZSIgaWNvbj0iaW1hZ2VzL3NhdmUuZ2lmIi8+CisgKiAgICAgPGFkZCBhcz0iU3dpbWxhbmUiIHRlbXBsYXRlPSJzd2ltbGFuZSIgaWNvbj0iaW1hZ2VzL3N3aW1sYW5lLmdpZiIvPgorICogICAgIC4uLgorICogKGVuZCkKKyAqIAorICogVGhlIGZvcm1hdCBvZiB0aGUgY29uZmlndXJhdGlvbiBpcyBkZXNjcmliZWQgaW4KKyAqIDxteERlZmF1bHRUb29sYmFyQ29kZWMuZGVjb2RlPi4KKyAqIAorICogSWRzOgorICogCisgKiBGb3IgdGhlIElEcywgdGhlcmUgaXMgYW4gaW1wbGljaXQgYmVoYXZpb3VyIGluIDxteENvZGVjPjogSXQgbW92ZXMgdGhlIElkCisgKiBmcm9tIHRoZSBjZWxsIHRvIHRoZSB1c2VyIG9iamVjdCBhdCBlbmNvZGluZyB0aW1lIGFuZCB2aWNlIHZlcnNhIGF0IGRlY29kaW5nCisgKiB0aW1lLiBGb3IgZXhhbXBsZSwgaWYgdGhlIFRhc2sgbm9kZSBmcm9tIGFib3ZlIGhhcyBhbiBpZCBhdHRyaWJ1dGUsIHRoZW4KKyAqIHRoZSA8bXhDZWxsLmlkPiBvZiB0aGUgY29ycmVzcG9uZGluZyBjZWxsIHdpbGwgaGF2ZSB0aGlzIHZhbHVlLiBJZiB0aGVyZQorICogaXMgbm8gSWQgY29sbGlzaW9uIGluIHRoZSBtb2RlbCwgdGhlbiB0aGUgY2VsbCBtYXkgYmUgcmV0cmlldmVkIHVzaW5nIHRoaXMKKyAqIElkIHdpdGggdGhlIDxteEdyYXBoTW9kZWwuZ2V0Q2VsbD4gZnVuY3Rpb24uIElmIHRoZXJlIGlzIGEgY29sbGlzaW9uLCBhIG5ldworICogSWQgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGUgY2VsbCB1c2luZyA8bXhHcmFwaE1vZGVsLmNyZWF0ZUlkPi4gQXQgZW5jb2RpbmcKKyAqIHRpbWUsIHRoaXMgbmV3IElkIHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgcHJldmlvdXNseSBzdG9yZWQgdW5kZXIgdGhlIGlkCisgKiBhdHRyaWJ1dGUgaW4gdGhlIFRhc2sgbm9kZS4KKyAqIAorICogU2VlIDxteEVkaXRvckNvZGVjPiwgPG14RGVmYXVsdFRvb2xiYXJDb2RlYz4gYW5kIDxteERlZmF1bHRQb3B1cE1lbnVDb2RlYz4KKyAqIGZvciBpbmZvcm1hdGlvbiBhYm91dCBjb25maWd1cmluZyB0aGUgZWRpdG9yIGFuZCB1c2VyIGludGVyZmFjZS4KKyAqIAorICogUHJvZ3JhbW1hdGljYWxseSBpbnNlcnRpbmcgY2VsbHM6CisgKiAKKyAqIEZvciBpbnNlcnRpbmcgYSBuZXcgY2VsbCwgc2F5LCBieSBjbGlja2luZyBhIGJ1dHRvbiBpbiB0aGUgZG9jdW1lbnQsCisgKiB0aGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQuIFRoaXMgcmVxdWlyZXMgYW4gcmVmZXJlbmNlIHRvIHRoZSBlZGl0b3IuCisgKiAKKyAqIChjb2RlKQorICogdmFyIHVzZXJPYmplY3QgPSBuZXcgT2JqZWN0KCk7CisgKiB2YXIgcGFyZW50ID0gZWRpdG9yLmdyYXBoLmdldERlZmF1bHRQYXJlbnQoKTsKKyAqIHZhciBtb2RlbCA9IGVkaXRvci5ncmFwaC5tb2RlbDsKKyAqIG1vZGVsLmJlZ2luVXBkYXRlKCk7CisgKiB0cnkKKyAqIHsKKyAqICAgZWRpdG9yLmdyYXBoLmluc2VydFZlcnRleChwYXJlbnQsIG51bGwsIHVzZXJPYmplY3QsIDIwLCAyMCwgODAsIDMwKTsKKyAqIH0KKyAqIGZpbmFsbHkKKyAqIHsKKyAqICAgbW9kZWwuZW5kVXBkYXRlKCk7CisgKiB9CisgKiAoZW5kKQorICogCisgKiBJZiBhIHRlbXBsYXRlIGNlbGwgZnJvbSB0aGUgY29uZmlnIGZpbGUgc2hvdWxkIGJlIGluc2VydGVkLCB0aGVuIGEgY2xvbmUKKyAqIG9mIHRoZSB0ZW1wbGF0ZSBjYW4gYmUgY3JlYXRlZCBhcyBmb2xsb3dzLiBUaGUgY2xvbmUgaXMgdGhlbiBpbnNlcnRlZCB1c2luZworICogdGhlIGFkZCBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFkZFZlcnRleC4KKyAqIAorICogKGNvZGUpCisgKiB2YXIgdGVtcGxhdGUgPSBlZGl0b3IudGVtcGxhdGVzWyd0YXNrJ107CisgKiB2YXIgY2xvbmUgPSBlZGl0b3IuZ3JhcGgubW9kZWwuY2xvbmVDZWxsKHRlbXBsYXRlKTsKKyAqIChlbmQpCisgKiAKKyAqIFJlc291cmNlczoKKyAqCisgKiByZXNvdXJjZXMvZWRpdG9yIC0gTGFuZ3VhZ2UgcmVzb3VyY2VzIGZvciBteEVkaXRvcgorICoKKyAqIENhbGxiYWNrOiBvbkluaXQKKyAqCisgKiBDYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGNvbnN0cnVjdG9yLiBJbiB0aGUgY2FsbGJhY2ssCisgKiAidGhpcyIgcmVmZXJzIHRvIHRoZSBlZGl0b3IgaW5zdGFuY2UuCisgKgorICogQ29va2llOiBteGdyYXBoPXNlZW4KKyAqCisgKiBTZXQgd2hlbiB0aGUgZWRpdG9yIGlzIHN0YXJ0ZWQuIE5ldmVyIGV4cGlyZXMuIFVzZQorICogPHJlc2V0Rmlyc3RUaW1lPiB0byByZXNldCB0aGlzIGNvb2tpZS4gVGhpcyBjb29raWUKKyAqIG9ubHkgZXhpc3RzIGlmIDxvbkluaXQ+IGlzIGltcGxlbWVudGVkLgorICoKKyAqIEV2ZW50OiBteEV2ZW50Lk9QRU4KKyAqCisgKiBGaXJlcyBhZnRlciBhIGZpbGUgd2FzIG9wZW5lZCBpbiA8b3Blbj4uIFRoZSA8Y29kZT5maWxlbmFtZTwvY29kZT4gcHJvcGVydHkKKyAqIGNvbnRhaW5zIHRoZSBmaWxlbmFtZSB0aGF0IHdhcyB1c2VkLiBUaGUgc2FtZSB2YWx1ZSBpcyBhbHNvIGF2YWlsYWJsZSBpbgorICogPGZpbGVuYW1lPi4KKyAqCisgKiBFdmVudDogbXhFdmVudC5TQVZFCisgKgorICogRmlyZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgZmlsZSB3YXMgc2F2ZWQgaW4gPHNhdmU+LiBUaGUgPGNvZGU+dXJsPC9jb2RlPgorICogcHJvcGVydHkgY29udGFpbnMgdGhlIFVSTCB0aGF0IHdhcyB1c2VkIGZvciBzYXZpbmcuCisgKgorICogRXZlbnQ6IG14RXZlbnQuUE9TVAorICogCisgKiBGaXJlcyBpZiBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkIGluIDxwb3N0RGlhZ3JhbT4uIFRoZQorICogPGNvZGU+cmVxdWVzdDwvY29kZT4gcHJvcGVydHkgY29udGFpbnMgdGhlIDxteFhtbFJlcXVlc3Q+LCB0aGUKKyAqIDxjb2RlPnVybDwvY29kZT4gYW5kIDxjb2RlPmRhdGE8L2NvZGU+IHByb3BlcnRpZXMgY29udGFpbiB0aGUgVVJMIGFuZCB0aGUKKyAqIGRhdGEgdGhhdCB3ZXJlIHVzZWQgaW4gdGhlIHBvc3QgcmVxdWVzdC4gCisgKgorICogRXZlbnQ6IG14RXZlbnQuUk9PVAorICoKKyAqIEZpcmVzIHdoZW4gdGhlIGN1cnJlbnQgcm9vdCBoYXMgY2hhbmdlZCwgb3Igd2hlbiB0aGUgdGl0bGUgb2YgdGhlIGN1cnJlbnQKKyAqIHJvb3QgaGFzIGNoYW5nZWQuIFRoaXMgZXZlbnQgaGFzIG5vIHByb3BlcnRpZXMuCisgKgorICogRXZlbnQ6IG14RXZlbnQuQkVGT1JFX0FERF9WRVJURVgKKyAqIAorICogRmlyZXMgYmVmb3JlIGEgdmVydGV4IGlzIGFkZGVkIGluIDxhZGRWZXJ0ZXg+LiBUaGUgPGNvZGU+dmVydGV4PC9jb2RlPgorICogcHJvcGVydHkgY29udGFpbnMgdGhlIG5ldyB2ZXJ0ZXggYW5kIHRoZSA8Y29kZT5wYXJlbnQ8L2NvZGU+IHByb3BlcnR5CisgKiBjb250YWlucyBpdHMgcGFyZW50LgorICogCisgKiBFdmVudDogbXhFdmVudC5BRERfVkVSVEVYCisgKiAKKyAqIEZpcmVzIGJldHdlZW4gYmVnaW4tIGFuZCBlbmRVcGRhdGUgaW4gPGFkZFZlcnRleD4uIFRoZSA8Y29kZT52ZXJ0ZXg8L2NvZGU+CisgKiBwcm9wZXJ0eSBjb250YWlucyB0aGUgdmVydGV4IHRoYXQgaXMgYmVpbmcgaW5zZXJ0ZWQuCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LkFGVEVSX0FERF9WRVJURVgKKyAqIAorICogRmlyZXMgYWZ0ZXIgYSB2ZXJ0ZXggd2FzIGluc2VydGVkIGFuZCBzZWxlY3RlZCBpbiA8YWRkVmVydGV4Pi4gVGhlCisgKiA8Y29kZT52ZXJ0ZXg8L2NvZGU+IHByb3BlcnR5IGNvbnRhaW5zIHRoZSBuZXcgdmVydGV4LgorICogCisgKiBFeGFtcGxlOgorICogCisgKiBGb3Igc3RhcnRpbmcgYW4gaW4tcGxhY2UgZWRpdCBhZnRlciBhIG5ldyB2ZXJ0ZXggaGFzIGJlZW4gYWRkZWQgdG8gdGhlCisgKiBncmFwaCwgdGhlIGZvbGxvd2luZyBjb2RlIGNhbiBiZSB1c2VkLgorICogCisgKiAoY29kZSkKKyAqIGVkaXRvci5hZGRMaXN0ZW5lcihteEV2ZW50LkFGVEVSX0FERF9WRVJURVgsIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorICogeworICogICB2YXIgdmVydGV4ID0gZXZ0LmdldFByb3BlcnR5KCd2ZXJ0ZXgnKTsKKyAqIAorICogICBpZiAoZWRpdG9yLmdyYXBoLmlzQ2VsbEVkaXRhYmxlKHZlcnRleCkpCisgKiAgIHsKKyAqICAgCWVkaXRvci5ncmFwaC5zdGFydEVkaXRpbmdBdENlbGwodmVydGV4KTsKKyAqICAgfQorICogfSk7CisgKiAoZW5kKQorICogCisgKiBFdmVudDogbXhFdmVudC5FU0NBUEUKKyAqIAorICogRmlyZXMgd2hlbiB0aGUgZXNjYXBlIGtleSBpcyBwcmVzc2VkLiBUaGUgPGNvZGU+ZXZlbnQ8L2NvZGU+IHByb3BlcnR5CisgKiBjb250YWlucyB0aGUga2V5IGV2ZW50LgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhFZGl0b3IKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGVkaXRvci4gVGhpcyBmdW5jdGlvbiBpbnZva2VzIHRoZSA8b25Jbml0PiBjYWxsYmFjaworICogdXBvbiBjb21wbGV0aW9uLgorICoKKyAqIEV4YW1wbGU6CisgKgorICogKGNvZGUpCisgKiB2YXIgY29uZmlnID0gbXhVdGlscy5sb2FkKCdjb25maWcvZGlhZ3JhbWVkaXRvci54bWwnKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAqIHZhciBlZGl0b3IgPSBuZXcgbXhFZGl0b3IoY29uZmlnKTsKKyAqIChlbmQpCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNvbmZpZyAtIE9wdGlvbmFsIFhNTCBub2RlIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24uCisgKi8KK2Z1bmN0aW9uIG14RWRpdG9yKGNvbmZpZykKK3sKKwl0aGlzLmFjdGlvbnMgPSBbXTsKKwl0aGlzLmFkZEFjdGlvbnMoKTsKKworCS8vIEV4ZWN1dGVzIHRoZSBmb2xsb3dpbmcgb25seSBpZiBhIGRvY3VtZW50IGhhcyBiZWVuIGluc3RhbmNpYXRlZC4KKwkvLyBUaGF0IGlzLCBkb24ndCBleGVjdXRlIHdoZW4gdGhlIGVkaXRvcmNvZGVjIGlzIHNldHVwLgorCWlmIChkb2N1bWVudC5ib2R5ICE9IG51bGwpCisJeworCQkvLyBEZWZpbmVzIGluc3RhbmNlIGZpZWxkcworCQl0aGlzLmN5Y2xlQXR0cmlidXRlVmFsdWVzID0gW107CisJCXRoaXMucG9wdXBIYW5kbGVyID0gbmV3IG14RGVmYXVsdFBvcHVwTWVudSgpOworCQl0aGlzLnVuZG9NYW5hZ2VyID0gbmV3IG14VW5kb01hbmFnZXIoKTsKKworCQkvLyBDcmVhdGVzIHRoZSBncmFwaCBhbmQgdG9vbGJhciB3aXRob3V0IHRoZSBjb250YWluZXJzCisJCXRoaXMuZ3JhcGggPSB0aGlzLmNyZWF0ZUdyYXBoKCk7CisJCXRoaXMudG9vbGJhciA9IHRoaXMuY3JlYXRlVG9vbGJhcigpOworCisJCS8vIENyZWF0ZXMgdGhlIGdsb2JhbCBrZXloYW5kbGVyIChyZXF1aXJlcyBncmFwaCBpbnN0YW5jZSkKKwkJdGhpcy5rZXlIYW5kbGVyID0gbmV3IG14RGVmYXVsdEtleUhhbmRsZXIodGhpcyk7CisKKwkJLy8gQ29uZmlndXJlcyB0aGUgZWRpdG9yIHVzaW5nIHRoZSBVUkkKKwkJLy8gd2hpY2ggd2FzIHBhc3NlZCB0byB0aGUgY3RvcgorCQl0aGlzLmNvbmZpZ3VyZShjb25maWcpOworCQkKKwkJLy8gQXNzaWducyB0aGUgc3dpbWxhbmVJbmRpY2F0b3JDb2xvckF0dHJpYnV0ZSBvbiB0aGUgZ3JhcGgKKwkJdGhpcy5ncmFwaC5zd2ltbGFuZUluZGljYXRvckNvbG9yQXR0cmlidXRlID0gdGhpcy5jeWNsZUF0dHJpYnV0ZU5hbWU7CisKKwkJLy8gQ2hlY2tzIGlmIHRoZSA8b25Jbml0PiBob29rIGhhcyBiZWVuIHNldAorCQlpZiAodGhpcy5vbkluaXQgIT0gbnVsbCkKKwkJeworCQkJLy8gSW52b2tlcyB0aGUgPG9uSW5pdD4gaG9vaworCQkJdGhpcy5vbkluaXQoKTsKKwkJfQorCQkKKwkJLy8gQXV0b21hdGljIGRlYWxsb2NhdGlvbiBvZiBtZW1vcnkKKwkJaWYgKG14Q2xpZW50LklTX0lFKQorCQl7CisJCQlteEV2ZW50LmFkZExpc3RlbmVyKHdpbmRvdywgJ3VubG9hZCcsIG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbigpCisJCQl7CisJCQkJdGhpcy5kZXN0cm95KCk7CisJCQl9KSk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEluc3RhbGxzIHRoZSByZXF1aXJlZCBsYW5ndWFnZSByZXNvdXJjZXMgYXQgY2xhc3MKKyAqIGxvYWRpbmcgdGltZS4KKyAqLworaWYgKG14TG9hZFJlc291cmNlcykKK3sKKwlteFJlc291cmNlcy5hZGQobXhDbGllbnQuYmFzZVBhdGgrJy9yZXNvdXJjZXMvZWRpdG9yJyk7Cit9CisKKy8qKgorICogRXh0ZW5kcyBteEV2ZW50U291cmNlLgorICovCitteEVkaXRvci5wcm90b3R5cGUgPSBuZXcgbXhFdmVudFNvdXJjZSgpOworbXhFZGl0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhFZGl0b3I7CisKKy8qKgorICogR3JvdXA6IENvbnRyb2xzIGFuZCBIYW5kbGVycworICovCisJCisvKioKKyAqIFZhcmlhYmxlOiBhc2tab29tUmVzb3VyY2UKKyAqIAorICogU3BlY2lmaWVzIHRoZSByZXNvdXJjZSBrZXkgZm9yIHRoZSB6b29tIGRpYWxvZy4gSWYgdGhlIHJlc291cmNlIGZvciB0aGlzCisgKiBrZXkgZG9lcyBub3QgZXhpc3QgdGhlbiB0aGUgdmFsdWUgaXMgdXNlZCBhcyB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdAorICogaXMgJ2Fza1pvb20nLgorICovCitteEVkaXRvci5wcm90b3R5cGUuYXNrWm9vbVJlc291cmNlID0gKG14Q2xpZW50Lmxhbmd1YWdlICE9ICdub25lJykgPyAnYXNrWm9vbScgOiAnJzsKKwkKKy8qKgorICogVmFyaWFibGU6IGxhc3RTYXZlZFJlc291cmNlCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgcmVzb3VyY2Uga2V5IGZvciB0aGUgbGFzdCBzYXZlZCBpbmZvLiBJZiB0aGUgcmVzb3VyY2UgZm9yCisgKiB0aGlzIGtleSBkb2VzIG5vdCBleGlzdCB0aGVuIHRoZSB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBlcnJvciBtZXNzYWdlLgorICogRGVmYXVsdCBpcyAnbGFzdFNhdmVkJy4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmxhc3RTYXZlZFJlc291cmNlID0gKG14Q2xpZW50Lmxhbmd1YWdlICE9ICdub25lJykgPyAnbGFzdFNhdmVkJyA6ICcnOworCQorLyoqCisgKiBWYXJpYWJsZTogY3VycmVudEZpbGVSZXNvdXJjZQorICogCisgKiBTcGVjaWZpZXMgdGhlIHJlc291cmNlIGtleSBmb3IgdGhlIGN1cnJlbnQgZmlsZSBpbmZvLiBJZiB0aGUgcmVzb3VyY2UgZm9yCisgKiB0aGlzIGtleSBkb2VzIG5vdCBleGlzdCB0aGVuIHRoZSB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBlcnJvciBtZXNzYWdlLgorICogRGVmYXVsdCBpcyAnbGFzdFNhdmVkJy4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmN1cnJlbnRGaWxlUmVzb3VyY2UgPSAobXhDbGllbnQubGFuZ3VhZ2UgIT0gJ25vbmUnKSA/ICdjdXJyZW50RmlsZScgOiAnJzsKKwkKKy8qKgorICogVmFyaWFibGU6IHByb3BlcnRpZXNSZXNvdXJjZQorICogCisgKiBTcGVjaWZpZXMgdGhlIHJlc291cmNlIGtleSBmb3IgdGhlIHByb3BlcnRpZXMgd2luZG93IHRpdGxlLiBJZiB0aGUKKyAqIHJlc291cmNlIGZvciB0aGlzIGtleSBkb2VzIG5vdCBleGlzdCB0aGVuIHRoZSB2YWx1ZSBpcyB1c2VkIGFzIHRoZQorICogZXJyb3IgbWVzc2FnZS4gRGVmYXVsdCBpcyAncHJvcGVydGllcycuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5wcm9wZXJ0aWVzUmVzb3VyY2UgPSAobXhDbGllbnQubGFuZ3VhZ2UgIT0gJ25vbmUnKSA/ICdwcm9wZXJ0aWVzJyA6ICcnOworCQorLyoqCisgKiBWYXJpYWJsZTogdGFza3NSZXNvdXJjZQorICogCisgKiBTcGVjaWZpZXMgdGhlIHJlc291cmNlIGtleSBmb3IgdGhlIHRhc2tzIHdpbmRvdyB0aXRsZS4gSWYgdGhlCisgKiByZXNvdXJjZSBmb3IgdGhpcyBrZXkgZG9lcyBub3QgZXhpc3QgdGhlbiB0aGUgdmFsdWUgaXMgdXNlZCBhcyB0aGUKKyAqIGVycm9yIG1lc3NhZ2UuIERlZmF1bHQgaXMgJ3Rhc2tzJy4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLnRhc2tzUmVzb3VyY2UgPSAobXhDbGllbnQubGFuZ3VhZ2UgIT0gJ25vbmUnKSA/ICd0YXNrcycgOiAnJzsKKwkKKy8qKgorICogVmFyaWFibGU6IGhlbHBSZXNvdXJjZQorICogCisgKiBTcGVjaWZpZXMgdGhlIHJlc291cmNlIGtleSBmb3IgdGhlIGhlbHAgd2luZG93IHRpdGxlLiBJZiB0aGUKKyAqIHJlc291cmNlIGZvciB0aGlzIGtleSBkb2VzIG5vdCBleGlzdCB0aGVuIHRoZSB2YWx1ZSBpcyB1c2VkIGFzIHRoZQorICogZXJyb3IgbWVzc2FnZS4gRGVmYXVsdCBpcyAnaGVscCcuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5oZWxwUmVzb3VyY2UgPSAobXhDbGllbnQubGFuZ3VhZ2UgIT0gJ25vbmUnKSA/ICdoZWxwJyA6ICcnOworCQorLyoqCisgKiBWYXJpYWJsZTogb3V0bGluZVJlc291cmNlCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgcmVzb3VyY2Uga2V5IGZvciB0aGUgb3V0bGluZSB3aW5kb3cgdGl0bGUuIElmIHRoZQorICogcmVzb3VyY2UgZm9yIHRoaXMga2V5IGRvZXMgbm90IGV4aXN0IHRoZW4gdGhlIHZhbHVlIGlzIHVzZWQgYXMgdGhlCisgKiBlcnJvciBtZXNzYWdlLiBEZWZhdWx0IGlzICdvdXRsaW5lJy4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLm91dGxpbmVSZXNvdXJjZSA9IChteENsaWVudC5sYW5ndWFnZSAhPSAnbm9uZScpID8gJ291dGxpbmUnIDogJyc7CisJCisvKioKKyAqIFZhcmlhYmxlOiBvdXRsaW5lCisgKiAKKyAqIFJlZmVyZW5jZSB0byB0aGUgPG14V2luZG93PiB0aGF0IGNvbnRhaW5zIHRoZSBvdXRsaW5lLiBUaGUgPG14T3V0bGluZT4KKyAqIGlzIHN0b3JlZCBpbiBvdXRsaW5lLm91dGxpbmUuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5vdXRsaW5lID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZ3JhcGgKKyAqCisgKiBIb2xkcyBhIDxteEdyYXBoPiBmb3IgZGlzcGxheWluZyB0aGUgZGlhZ3JhbS4gVGhlIGdyYXBoCisgKiBpcyBjcmVhdGVkIGluIDxzZXRHcmFwaENvbnRhaW5lcj4uCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5ncmFwaCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGdyYXBoUmVuZGVySGludAorICoKKyAqIEhvbGRzIHRoZSByZW5kZXIgaGludCB1c2VkIGZvciBjcmVhdGluZyB0aGUKKyAqIGdyYXBoIGluIDxzZXRHcmFwaENvbnRhaW5lcj4uIFNlZSA8bXhHcmFwaD4uCisgKiBEZWZhdWx0IGlzIG51bGwuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5ncmFwaFJlbmRlckhpbnQgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB0b29sYmFyCisgKgorICogSG9sZHMgYSA8bXhEZWZhdWx0VG9vbGJhcj4gZm9yIGRpc3BsYXlpbmcgdGhlIHRvb2xiYXIuIFRoZQorICogdG9vbGJhciBpcyBjcmVhdGVkIGluIDxzZXRUb29sYmFyQ29udGFpbmVyPi4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLnRvb2xiYXIgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzdGF0dXMKKyAqCisgKiBET00gY29udGFpbmVyIHRoYXQgaG9sZHMgdGhlIHN0YXR1c2Jhci4gRGVmYXVsdCBpcyBudWxsLgorICogVXNlIDxzZXRTdGF0dXNDb250YWluZXI+IHRvIHNldCB0aGlzIHZhbHVlLgorICovCitteEVkaXRvci5wcm90b3R5cGUuc3RhdHVzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogcG9wdXBIYW5kbGVyCisgKgorICogSG9sZHMgYSA8bXhEZWZhdWx0UG9wdXBNZW51PiBmb3IgZGlzcGxheWluZworICogcG9wdXBtZW51cy4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLnBvcHVwSGFuZGxlciA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHVuZG9NYW5hZ2VyCisgKgorICogSG9sZHMgYW4gPG14VW5kb01hbmFnZXI+IGZvciB0aGUgY29tbWFuZCBoaXN0b3J5LgorICovCitteEVkaXRvci5wcm90b3R5cGUudW5kb01hbmFnZXIgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBrZXlIYW5kbGVyCisgKgorICogSG9sZHMgYSA8bXhEZWZhdWx0S2V5SGFuZGxlcj4gZm9yIGhhbmRsaW5nIGtleWJvYXJkIGV2ZW50cy4KKyAqIFRoZSBoYW5kbGVyIGlzIGNyZWF0ZWQgaW4gPHNldEdyYXBoQ29udGFpbmVyPi4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmtleUhhbmRsZXIgPSBudWxsOworCisvKioKKyAqIEdyb3VwOiBBY3Rpb25zIGFuZCBPcHRpb25zCisgKi8KKworLyoqCisgKiBWYXJpYWJsZTogYWN0aW9ucworICoKKyAqIE1hcHMgZnJvbSBhY3Rpb25uYW1lcyB0byBhY3Rpb25zLCB3aGljaCBhcmUgZnVuY3Rpb25zIHRha2luZworICogdGhlIGVkaXRvciBhbmQgdGhlIGNlbGwgYXMgYXJndW1lbnRzLiBVc2UgPGFkZEFjdGlvbj4KKyAqIHRvIGFkZCBvciByZXBsYWNlIGFuIGFjdGlvbiBhbmQgPGV4ZWN1dGU+IHRvIGV4ZWN1dGUgYW4gYWN0aW9uCisgKiBieSBuYW1lLCBwYXNzaW5nIHRoZSBjZWxsIHRvIGJlIG9wZXJhdGVkIHVwb24gYXMgdGhlIHNlY29uZAorICogYXJndW1lbnQuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5hY3Rpb25zID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZGJsQ2xpY2tBY3Rpb24KKyAqCisgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZAorICogd2hlbiBhIGNlbGwgaXMgZG91YmxlIGNsaWNrZWQuIERlZmF1bHQgaXMgZWRpdC4KKyAqIAorICogVG8gaGFuZGxlIGEgc2luZ2xlY2xpY2ssIHVzZSB0aGUgZm9sbG93aW5nIGNvZGUuCisgKiAKKyAqIChjb2RlKQorICogZWRpdG9yLmdyYXBoLmFkZExpc3RlbmVyKG14RXZlbnQuQ0xJQ0ssIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorICogeworICogICB2YXIgZSA9IGV2dC5nZXRQcm9wZXJ0eSgnZXZlbnQnKTsKKyAqICAgdmFyIGNlbGwgPSBldnQuZ2V0UHJvcGVydHkoJ2NlbGwnKTsKKyAqIAorICogICBpZiAoY2VsbCAhPSBudWxsICYmICFlLmlzQ29uc3VtZWQoKSkKKyAqICAgeworICogICAgIC8vIERvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCBjZWxsLi4uCisgKiAgICAgZS5jb25zdW1lKCk7CisgKiAgIH0KKyAqIH0pOworICogKGVuZCkKKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmRibENsaWNrQWN0aW9uID0gJ2VkaXQnOworCisvKioKKyAqIFZhcmlhYmxlOiBzd2ltbGFuZVJlcXVpcmVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiBuZXcgY2VsbHMgbXVzdCBiZSBpbnNlcnRlZAorICogaW50byBhbiBleGlzdGluZyBzd2ltbGFuZS4gT3RoZXJ3aXNlLCBjZWxscworICogdGhhdCBhcmUgbm90IHN3aW1sYW5lcyBjYW4gYmUgaW5zZXJ0ZWQgYXMKKyAqIHRvcC1sZXZlbCBjZWxscy4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLnN3aW1sYW5lUmVxdWlyZWQgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogZGlzYWJsZUNvbnRleHRNZW51CisgKgorICogU3BlY2lmaWVzIGlmIHRoZSBjb250ZXh0IG1lbnUgc2hvdWxkIGJlIGRpc2FibGVkIGluIHRoZSBncmFwaCBjb250YWluZXIuCisgKiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5kaXNhYmxlQ29udGV4dE1lbnUgPSB0cnVlOworCisvKioKKyAqIEdyb3VwOiBUZW1wbGF0ZXMKKyAqLworCisvKioKKyAqIFZhcmlhYmxlOiBpbnNlcnRGdW5jdGlvbgorICoKKyAqIFNwZWNpZmllcyB0aGUgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgaW5zZXJ0aW5nIG5ldworICogY2VsbHMgaW50byB0aGUgZ3JhcGguIFRoaXMgaXMgYXNzaWduZWQgZnJvbSB0aGUKKyAqIDxteERlZmF1bHRUb29sYmFyPiBpZiBhIHZlcnRleC10b29sIGlzIGNsaWNrZWQuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5pbnNlcnRGdW5jdGlvbiA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGZvcmNlZEluc2VydGluZworICoKKyAqIFNwZWNpZmllcyBpZiBhIG5ldyBjZWxsIHNob3VsZCBiZSBpbnNlcnRlZCBvbiBhIHNpbmdsZQorICogY2xpY2sgZXZlbiB1c2luZyA8aW5zZXJ0RnVuY3Rpb24+IGlmIHRoZXJlIGlzIGEgY2VsbCAKKyAqIHVuZGVyIHRoZSBtb3VzZXBvaW50ZXIsIG90aGVyd2lzZSB0aGUgY2VsbCB1bmRlciB0aGUgCisgKiBtb3VzZXBvaW50ZXIgaXMgc2VsZWN0ZWQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5mb3JjZWRJbnNlcnRpbmcgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogdGVtcGxhdGVzCisgKiAKKyAqIE1hcHMgZnJvbSBuYW1lcyB0byBwcm90b3lwZSBjZWxscyB0byBiZSB1c2VkCisgKiBpbiB0aGUgdG9vbGJhciBmb3IgaW5zZXJ0aW5nIG5ldyBjZWxscyBpbnRvCisgKiB0aGUgZGlhZ3JhbS4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLnRlbXBsYXRlcyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGRlZmF1bHRFZGdlCisgKiAKKyAqIFByb3RvdHlwZSBlZGdlIGNlbGwgdGhhdCBpcyB1c2VkIGZvciBjcmVhdGluZworICogbmV3IGVkZ2VzLgorICovCitteEVkaXRvci5wcm90b3R5cGUuZGVmYXVsdEVkZ2UgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBkZWZhdWx0RWRnZVN0eWxlCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgZWRnZSBzdHlsZSB0byBiZSByZXR1cm5lZCBpbiA8Z2V0RWRnZVN0eWxlPi4KKyAqIERlZmF1bHQgaXMgbnVsbC4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmRlZmF1bHRFZGdlU3R5bGUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBkZWZhdWx0R3JvdXAKKyAqIAorICogUHJvdG90eXBlIGdyb3VwIGNlbGwgdGhhdCBpcyB1c2VkIGZvciBjcmVhdGluZworICogbmV3IGdyb3Vwcy4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmRlZmF1bHRHcm91cCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGdyYXBoUmVuZGVySGludAorICoKKyAqIERlZmF1bHQgc2l6ZSBmb3IgdGhlIGJvcmRlciBvZiBuZXcgZ3JvdXBzLiBJZiBudWxsLAorICogdGhlbiB0aGVuIDxteEdyYXBoLmdyaWRTaXplPiBpcyB1c2VkLiBEZWZhdWx0IGlzCisgKiBudWxsLgorICovCitteEVkaXRvci5wcm90b3R5cGUuZ3JvdXBCb3JkZXJTaXplID0gbnVsbDsKKworLyoqCisgKiBHcm91cDogQmFja2VuZCBJbnRlZ3JhdGlvbgorICovCisKKy8qKgorICogVmFyaWFibGU6IGZpbGVuYW1lCisgKgorICogQ29udGFpbnMgdGhlIFVSTCBvZiB0aGUgbGFzdCBvcGVuZWQgZmlsZSBhcyBhIHN0cmluZy4KKyAqIERlZmF1bHQgaXMgbnVsbC4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmZpbGVuYW1lID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbGluZUZlZWQKKyAqCisgKiBDaGFyYWN0ZXIgdG8gYmUgdXNlZCBmb3IgZW5jb2RpbmcgbGluZWZlZWRzIGluIDxzYXZlPi4gRGVmYXVsdCBpcyAnJiN4YTsnLgorICovCitteEVkaXRvci5wcm90b3R5cGUubGluZWZlZWQgPSAnJiN4YTsnOworCisvKioKKyAqIFZhcmlhYmxlOiBwb3N0UGFyYW1ldGVyTmFtZQorICoKKyAqIFNwZWNpZmllcyBpZiB0aGUgbmFtZSBvZiB0aGUgcG9zdCBwYXJhbWV0ZXIgdGhhdCBjb250YWlucyB0aGUgZGlhZ3JhbQorICogZGF0YSBpbiBhIHBvc3QgcmVxdWVzdCB0byB0aGUgc2VydmVyLiBEZWZhdWx0IGlzIHhtbC4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLnBvc3RQYXJhbWV0ZXJOYW1lID0gJ3htbCc7CisKKy8qKgorICogVmFyaWFibGU6IGVzY2FwZVBvc3REYXRhCisgKgorICogU3BlY2lmaWVzIGlmIHRoZSBkYXRhIGluIHRoZSBwb3N0IHJlcXVlc3QgZm9yIHNhdmluZyBhIGRpYWdyYW0KKyAqIHNob3VsZCBiZSBjb252ZXJ0ZWQgdXNpbmcgZW5jb2RlVVJJQ29tcG9uZW50LiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5lc2NhcGVQb3N0RGF0YSA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHVybFBvc3QKKyAqCisgKiBTcGVjaWZpZXMgdGhlIFVSTCB0byBiZSB1c2VkIGZvciBwb3N0aW5nIHRoZSBkaWFncmFtCisgKiB0byBhIGJhY2tlbmQgaW4gPHNhdmU+LgorICovCitteEVkaXRvci5wcm90b3R5cGUudXJsUG9zdCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHVybEltYWdlCisgKgorICogU3BlY2lmaWVzIHRoZSBVUkwgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgYSBiaXRtYXAgb2YKKyAqIHRoZSBncmFwaCBpbiB0aGUgaW1hZ2UgYWN0aW9uLgorICovCitteEVkaXRvci5wcm90b3R5cGUudXJsSW1hZ2UgPSBudWxsOworCisvKioKKyAqIEdyb3VwOiBBdXRvbGF5b3V0CisgKi8KKworLyoqCisgKiBWYXJpYWJsZTogaG9yaXpvbnRhbEZsb3cKKyAqCisgKiBTcGVjaWZpZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgZmxvdworICogaW4gdGhlIGRpYWdyYW0uIFRoaXMgaXMgdXNlZCBpbiB0aGUKKyAqIGxheW91dCBhbGdvcml0aG1zLiBEZWZhdWx0IGlzIGZhbHNlLAorICogaWUuIHZlcnRpY2FsIGZsb3cuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5ob3Jpem9udGFsRmxvdyA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBsYXlvdXREaWFncmFtCisgKgorICogU3BlY2lmaWVzIGlmIHRoZSB0b3AtbGV2ZWwgZWxlbWVudHMgaW4gdGhlCisgKiBkaWFncmFtIHNob3VsZCBiZSBsYXllZCBvdXQgdXNpbmcgYSB2ZXJ0aWNhbAorICogb3IgaG9yaXpvbnRhbCBzdGFjayBkZXBlbmRpbmcgb24gdGhlIHNldHRpbmcKKyAqIG9mIDxob3Jpem9udGFsRmxvdz4uIFRoZSBzcGFjaW5nIGJldHdlZW4gdGhlCisgKiBzd2ltbGFuZXMgaXMgc3BlY2lmaWVkIGJ5IDxzd2ltbGFuZVNwYWNpbmc+LgorICogRGVmYXVsdCBpcyBmYWxzZS4KKyAqIAorICogSWYgdGhlIHRvcC1sZXZlbCBlbGVtZW50cyBhcmUgc3dpbWxhbmVzLCB0aGVuCisgKiB0aGUgaW50cmEtc3dpbWxhbmUgbGF5b3V0IGlzIGFjdGl2YXRlZCBieQorICogdGhlIDxsYXlvdXRTd2ltbGFuZXM+IHN3aXRjaC4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmxheW91dERpYWdyYW0gPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogc3dpbWxhbmVTcGFjaW5nCisgKgorICogU3BlY2lmaWVzIHRoZSBzcGFjaW5nIGJldHdlZW4gc3dpbWxhbmVzIGlmCisgKiBhdXRvbWF0aWMgbGF5b3V0IGlzIHR1cm5lZCBvbiBpbgorICogPGxheW91dERpYWdyYW0+LiBEZWZhdWx0IGlzIDAuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5zd2ltbGFuZVNwYWNpbmcgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBtYWludGFpblN3aW1sYW5lcworICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIHN3aW1sYW5lcyBzaG91bGQgYmUga2VwdCBhdCB0aGUgc2FtZQorICogd2lkdGggb3IgaGVpZ2h0IGRlcGVuZGluZyBvbiB0aGUgc2V0dGluZyBvZgorICogPGhvcml6b250YWxGbG93Pi4gIERlZmF1bHQgaXMgZmFsc2UuCisgKiAKKyAqIEZvciBob3Jpem9udGFsIGZsb3dzLCBhbGwgc3dpbWxhbmVzCisgKiBoYXZlIHRoZSBzYW1lIGhlaWdodCBhbmQgZm9yIHZlcnRpY2FsIGZsb3dzLCBhbGwgc3dpbWxhbmVzCisgKiBoYXZlIHRoZSBzYW1lIHdpZHRoLiBGdXJ0aGVybW9yZSwgdGhlIHN3aW1sYW5lcyBhcmUKKyAqIGF1dG9tYXRpY2FsbHkgInN0YWNrZWQiIGlmIDxsYXlvdXREaWFncmFtPiBpcyB0cnVlLgorICovCitteEVkaXRvci5wcm90b3R5cGUubWFpbnRhaW5Td2ltbGFuZXMgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogbGF5b3V0U3dpbWxhbmVzCisgKgorICogU3BlY2lmaWVzIGlmIHRoZSBjaGlsZHJlbiBvZiBzd2ltbGFuZXMgc2hvdWxkCisgKiBiZSBsYXllZCBvdXQsIGVpdGhlciB2ZXJ0aWNhbGx5IG9yIGhvcml6b250YWxseQorICogZGVwZW5kaW5nIG9uIDxob3Jpem9udGFsRmxvdz4uCisgKiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteEVkaXRvci5wcm90b3R5cGUubGF5b3V0U3dpbWxhbmVzID0gZmFsc2U7CisKKy8qKgorICogR3JvdXA6IEF0dHJpYnV0ZSBDeWNsaW5nCisgKi8KKyAKKy8qKgorICogVmFyaWFibGU6IGN5Y2xlQXR0cmlidXRlVmFsdWVzCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgYXR0cmlidXRlIHZhbHVlcyB0byBiZSBjeWNsZWQgd2hlbgorICogaW5zZXJ0aW5nIG5ldyBzd2ltbGFuZXMuIERlZmF1bHQgaXMgYW4gZW1wdHkKKyAqIGFycmF5LgorICovCitteEVkaXRvci5wcm90b3R5cGUuY3ljbGVBdHRyaWJ1dGVWYWx1ZXMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjeWNsZUF0dHJpYnV0ZUluZGV4CisgKiAKKyAqIEluZGV4IG9mIHRoZSBsYXN0IGNvbnN1bWVkIGF0dHJpYnV0ZSBpbmRleC4gSWYgYSBuZXcKKyAqIHN3aW1sYW5lIGlzIGluc2VydGVkLCB0aGVuIHRoZSA8Y3ljbGVBdHRyaWJ1dGVWYWx1ZXM+CisgKiBhdCB0aGlzIGluZGV4IHdpbGwgYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yCisgKiA8Y3ljbGVBdHRyaWJ1dGVOYW1lPi4gRGVmYXVsdCBpcyAwLgorICovCitteEVkaXRvci5wcm90b3R5cGUuY3ljbGVBdHRyaWJ1dGVJbmRleCA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IGN5Y2xlQXR0cmlidXRlTmFtZQorICogCisgKiBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gYmUgYXNzaWduZWQgYSA8Y3ljbGVBdHRyaWJ1dGVWYWx1ZXM+CisgKiB3aGVuIGluc2VydGluZyBuZXcgc3dpbWxhbmVzLiBEZWZhdWx0IGlzIGZpbGxDb2xvci4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmN5Y2xlQXR0cmlidXRlTmFtZSA9ICdmaWxsQ29sb3InOworCisvKioKKyAqIEdyb3VwOiBXaW5kb3dzCisgKi8KKworLyoqCisgKiBWYXJpYWJsZTogdGFza3MKKyAqIAorICogSG9sZHMgdGhlIDxteFdpbmRvdz4gY3JlYXRlZCBpbiA8c2hvd1Rhc2tzPi4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLnRhc2tzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogdGFza3NXaW5kb3dJbWFnZQorICoKKyAqIEljb24gZm9yIHRoZSB0YXNrcyB3aW5kb3cuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS50YXNrc1dpbmRvd0ltYWdlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogdGFza3NUb3AKKyAqIAorICogU3BlY2lmaWVzIHRoZSB0b3AgY29vcmRpbmF0ZSBvZiB0aGUgdGFza3Mgd2luZG93IGluIHBpeGVscy4KKyAqIERlZmF1bHQgaXMgMjAuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS50YXNrc1RvcCA9IDIwOworCisvKioKKyAqIFZhcmlhYmxlOiBoZWxwCisgKiAKKyAqIEhvbGRzIHRoZSA8bXhXaW5kb3c+IGNyZWF0ZWQgaW4gPHNob3dIZWxwPi4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmhlbHAgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBoZWxwV2luZG93SW1hZ2UKKyAqCisgKiBJY29uIGZvciB0aGUgaGVscCB3aW5kb3cuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5oZWxwV2luZG93SW1hZ2UgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB1cmxIZWxwCisgKgorICogU3BlY2lmaWVzIHRoZSBVUkwgdG8gYmUgdXNlZCBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZQorICogT25saW5lIEhlbHAgd2luZG93LiBUaGlzIGlzIHVzdWFsbHkgc3BlY2lmaWVkIGluIHRoZQorICogcmVzb3VyY2VzIGZpbGUgdW5kZXIgdXJsSGVscCBmb3IgbGFuZ3VhZ2Utc3BlY2lmaWMKKyAqIG9ubGluZSBoZWxwIHN1cHBvcnQuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS51cmxIZWxwID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogaGVscFdpZHRoCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGhlbHAgd2luZG93IGluIHBpeGVscy4KKyAqIERlZmF1bHQgaXMgMzAwLgorICovCitteEVkaXRvci5wcm90b3R5cGUuaGVscFdpZHRoID0gMzAwOworCQorLyoqCisgKiBWYXJpYWJsZTogaGVscFdpZHRoCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGhlbHAgd2luZG93IGluIHBpeGVscy4KKyAqIERlZmF1bHQgaXMgMjYwLgorICovCitteEVkaXRvci5wcm90b3R5cGUuaGVscEhlaWdodCA9IDI2MDsKKworLyoqCisgKiBWYXJpYWJsZTogcHJvcGVydGllc1dpZHRoCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIHByb3BlcnRpZXMgd2luZG93IGluIHBpeGVscy4KKyAqIERlZmF1bHQgaXMgMjQwLgorICovCitteEVkaXRvci5wcm90b3R5cGUucHJvcGVydGllc1dpZHRoID0gMjQwOworCQkKKy8qKgorICogVmFyaWFibGU6IHByb3BlcnRpZXNIZWlnaHQKKyAqIAorICogU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgdGhlIHByb3BlcnRpZXMgd2luZG93IGluIHBpeGVscy4KKyAqIElmIG5vIGhlaWdodCBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgd2luZG93IHdpbGwgYmUgYXV0b21hdGljYWxseQorICogc2l6ZWQgdG8gZml0IGl0cyBjb250ZW50cy4gRGVmYXVsdCBpcyBudWxsLgorICovCitteEVkaXRvci5wcm90b3R5cGUucHJvcGVydGllc0hlaWdodCA9IG51bGw7CisJCQorLyoqCisgKiBWYXJpYWJsZTogbW92ZVByb3BlcnRpZXNEaWFsb2cKKyAqCisgKiBTcGVjaWZpZXMgaWYgdGhlIHByb3BlcnRpZXMgZGlhbG9nIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5CisgKiBtb3ZlZCBuZWFyIHRoZSBjZWxsIGl0IGlzIGRpc3BsYXllZCBmb3IsIG90aGVyd2lzZSB0aGUKKyAqIGRpYWxvZyBpcyBub3QgbW92ZWQuIFRoaXMgdmFsdWUgaXMgb25seSB0YWtlbiBpbnRvIAorICogYWNjb3VudCBpZiB0aGUgZGlhbG9nIGlzIGFscmVhZHkgdmlzaWJsZS4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLm1vdmVQcm9wZXJ0aWVzRGlhbG9nID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHZhbGlkYXRpbmcKKyAqCisgKiBTcGVjaWZpZXMgaWYgPG14R3JhcGgudmFsaWRhdGVHcmFwaD4gc2hvdWxkIGF1dG9tYXRpY2FsbHkgYmUgaW52b2tlZCBhZnRlcgorICogZWFjaCBjaGFuZ2UuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS52YWxpZGF0aW5nID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IG1vZGlmaWVkCisgKgorICogVHJ1ZSBpZiB0aGUgZ3JhcGggaGFzIGJlZW4gbW9kaWZpZWQgc2luY2UgaXQgd2FzIGxhc3Qgc2F2ZWQuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5tb2RpZmllZCA9IGZhbHNlOworCisvKioKKyAqIEZ1bmN0aW9uOiBpc01vZGlmaWVkCisgKiAKKyAqIFJldHVybnMgPG1vZGlmaWVkPi4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmlzTW9kaWZpZWQgPSBmdW5jdGlvbiAoKQoreworCXJldHVybiB0aGlzLm1vZGlmaWVkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0TW9kaWZpZWQKKyAqIAorICogU2V0cyA8bW9kaWZpZWQ+IHRvIHRoZSBzcGVjaWZpZWQgYm9vbGVhbiB2YWx1ZS4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLnNldE1vZGlmaWVkID0gZnVuY3Rpb24gKHZhbHVlKQoreworCXRoaXMubW9kaWZpZWQgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZEFjdGlvbnMKKyAqCisgKiBBZGRzIHRoZSBidWlsdC1pbiBhY3Rpb25zIHRvIHRoZSBlZGl0b3IgaW5zdGFuY2UuCisgKgorICogc2F2ZSAtIFNhdmVzIHRoZSBncmFwaCB1c2luZyA8dXJsUG9zdD4uCisgKiBwcmludCAtIFNob3dzIHRoZSBncmFwaCBpbiBhIG5ldyBwcmludCBwcmV2aWV3IHdpbmRvdy4KKyAqIHNob3cgLSBTaG93cyB0aGUgZ3JhcGggaW4gYSBuZXcgd2luZG93LgorICogZXhwb3J0SW1hZ2UgLSBTaG93cyB0aGUgZ3JhcGggYXMgYSBiaXRtYXAgaW1hZ2UgdXNpbmcgPGdldFVybEltYWdlPi4KKyAqIHJlZnJlc2ggLSBSZWZyZXNoZXMgdGhlIGdyYXBoJ3MgZGlzcGxheS4KKyAqIGN1dCAtIENvcGllcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW50byB0aGUgY2xpcGJvYXJkCisgKiBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBncmFwaC4KKyAqIGNvcHkgLSBDb3BpZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGludG8gdGhlIGNsaXBib2FyZC4KKyAqIHBhc3RlIC0gUGFzdGVzIHRoZSBjbGlwYm9hcmQgaW50byB0aGUgZ3JhcGguCisgKiBkZWxldGUgLSBSZW1vdmVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBmcm9tIHRoZSBncmFwaC4KKyAqIGdyb3VwIC0gUHV0cyB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW50byBhIG5ldyBncm91cC4KKyAqIHVuZ3JvdXAgLSBSZW1vdmVzIHRoZSBzZWxlY3RlZCBncm91cHMgYW5kIHNlbGVjdHMgdGhlIGNoaWxkcmVuLgorICogdW5kbyAtIFVuZG9lcyB0aGUgbGFzdCBjaGFuZ2Ugb24gdGhlIGdyYXBoIG1vZGVsLgorICogcmVkbyAtIFJlZG9lcyB0aGUgbGFzdCBjaGFuZ2Ugb24gdGhlIGdyYXBoIG1vZGVsLgorICogem9vbSAtIFNldHMgdGhlIHpvb20gdmlhIGEgZGlhbG9nLgorICogem9vbUluIC0gWm9vbXMgaW50byB0aGUgZ3JhcGguCisgKiB6b29tT3V0IC0gWm9vbXMgb3V0IG9mIHRoZSBncmFwaAorICogYWN0dWFsU2l6ZSAtIFJlc2V0cyB0aGUgc2NhbGUgYW5kIHRyYW5zbGF0aW9uIG9uIHRoZSBncmFwaC4KKyAqIGZpdCAtIENoYW5nZXMgdGhlIHNjYWxlIHNvIHRoYXQgdGhlIGdyYXBoIGZpdHMgaW50byB0aGUgd2luZG93LgorICogc2hvd1Byb3BlcnRpZXMgLSBTaG93cyB0aGUgcHJvcGVydGllcyBkaWFsb2cuCisgKiBzZWxlY3RBbGwgLSBTZWxlY3RzIGFsbCBjZWxscy4KKyAqIHNlbGVjdE5vbmUgLSBDbGVhcnMgdGhlIHNlbGVjdGlvbi4KKyAqIHNlbGVjdFZlcnRpY2VzIC0gU2VsZWN0cyBhbGwgdmVydGljZXMuCisgKiBzZWxlY3RFZGdlcyA9IFNlbGVjdHMgYWxsIGVkZ2VzLgorICogZWRpdCAtIFN0YXJ0cyBlZGl0aW5nIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBjZWxsLgorICogZW50ZXJHcm91cCAtIERyaWxscyBkb3duIGludG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGNlbGwuCisgKiBleGl0R3JvdXAgLSBNb3ZlcyB1cCBpbiB0aGUgZHJpbGxpbmcgaGllcmFjaHkKKyAqIGhvbWUgLSBNb3ZlcyB0byB0aGUgdG9wbW9zdCBwYXJlbnQgaW4gdGhlIGRyaWxsaW5nIGhpZXJhcmNoeQorICogc2VsZWN0UHJldmlvdXMgLSBTZWxlY3RzIHRoZSBwcmV2aW91cyBjZWxsLgorICogc2VsZWN0TmV4dCAtIFNlbGVjdHMgdGhlIG5leHQgY2VsbC4KKyAqIHNlbGVjdFBhcmVudCAtIFNlbGVjdHMgdGhlIHBhcmVudCBvZiB0aGUgc2VsZWN0aW9uIGNlbGwuCisgKiBzZWxlY3RDaGlsZCAtIFNlbGVjdHMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBzZWxlY3Rpb24gY2VsbC4KKyAqIGNvbGxhcHNlIC0gQ29sbGFwc2VzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY2VsbHMuCisgKiBleHBhbmQgLSBFeHBhbmRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY2VsbHMuCisgKiBib2xkIC0gVG9nZ2xlIGJvbGQgdGV4dCBzdHlsZS4KKyAqIGl0YWxpYyAtIFRvZ2dsZSBpdGFsaWMgdGV4dCBzdHlsZS4KKyAqIHVuZGVybGluZSAtIFRvZ2dsZSB1bmRlcmxpbmUgdGV4dCBzdHlsZS4KKyAqIGFsaWduQ2VsbHNMZWZ0IC0gQWxpZ25zIHRoZSBzZWxlY3Rpb24gY2VsbHMgYXQgdGhlIGxlZnQuCisgKiBhbGlnbkNlbGxzQ2VudGVyIC0gQWxpZ25zIHRoZSBzZWxlY3Rpb24gY2VsbHMgaW4gdGhlIGNlbnRlci4KKyAqIGFsaWduQ2VsbHNSaWdodCAtIEFsaWducyB0aGUgc2VsZWN0aW9uIGNlbGxzIGF0IHRoZSByaWdodC4KKyAqIGFsaWduQ2VsbHNUb3AgLSBBbGlnbnMgdGhlIHNlbGVjdGlvbiBjZWxscyBhdCB0aGUgdG9wLgorICogYWxpZ25DZWxsc01pZGRsZSAtIEFsaWducyB0aGUgc2VsZWN0aW9uIGNlbGxzIGluIHRoZSBtaWRkbGUuCisgKiBhbGlnbkNlbGxzQm90dG9tIC0gQWxpZ25zIHRoZSBzZWxlY3Rpb24gY2VsbHMgYXQgdGhlIGJvdHRvbS4KKyAqIGFsaWduRm9udExlZnQgLSBTZXRzIHRoZSBob3Jpem9udGFsIHRleHQgYWxpZ25tZW50IHRvIGxlZnQuCisgKiBhbGlnbkZvbnRDZW50ZXIgLSBTZXRzIHRoZSBob3Jpem9udGFsIHRleHQgYWxpZ25tZW50IHRvIGNlbnRlci4KKyAqIGFsaWduRm9udFJpZ2h0IC0gU2V0cyB0aGUgaG9yaXpvbnRhbCB0ZXh0IGFsaWdubWVudCB0byByaWdodC4KKyAqIGFsaWduRm9udFRvcCAtIFNldHMgdGhlIHZlcnRpY2FsIHRleHQgYWxpZ25tZW50IHRvIHRvcC4KKyAqIGFsaWduRm9udE1pZGRsZSAtIFNldHMgdGhlIHZlcnRpY2FsIHRleHQgYWxpZ25tZW50IHRvIG1pZGRsZS4KKyAqIGFsaWduRm9udEJvdHRvbSAtIFNldHMgdGhlIHZlcnRpY2FsIHRleHQgYWxpZ25tZW50IHRvIGJvdHRvbS4KKyAqIHRvZ2dsZVRhc2tzIC0gU2hvd3Mgb3IgaGlkZXMgdGhlIHRhc2tzIHdpbmRvdy4KKyAqIHRvZ2dsZUhlbHAgLSBTaG93cyBvciBoaWRlcyB0aGUgaGVscCB3aW5kb3cuCisgKiB0b2dnbGVPdXRsaW5lIC0gU2hvd3Mgb3IgaGlkZXMgdGhlIG91dGxpbmUgd2luZG93LgorICogdG9nZ2xlQ29uc29sZSAtIFNob3dzIG9yIGhpZGVzIHRoZSBjb25zb2xlIHdpbmRvdy4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmFkZEFjdGlvbnMgPSBmdW5jdGlvbiAoKQoreworCXRoaXMuYWRkQWN0aW9uKCdzYXZlJywgZnVuY3Rpb24oZWRpdG9yKQorCXsKKwkJZWRpdG9yLnNhdmUoKTsKKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbigncHJpbnQnLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQl2YXIgcHJldmlldyA9IG5ldyBteFByaW50UHJldmlldyhlZGl0b3IuZ3JhcGgsIDEpOworCQlwcmV2aWV3Lm9wZW4oKTsKKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbignc2hvdycsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCW14VXRpbHMuc2hvdyhlZGl0b3IuZ3JhcGgsIG51bGwsIDEwLCAxMCk7CisJfSk7CisKKwl0aGlzLmFkZEFjdGlvbignZXhwb3J0SW1hZ2UnLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQl2YXIgdXJsID0gZWRpdG9yLmdldFVybEltYWdlKCk7CisJCQorCQlpZiAodXJsID09IG51bGwgfHwgbXhDbGllbnQuSVNfTE9DQUwpCisJCXsKKwkJCWVkaXRvci5leGVjdXRlKCdzaG93Jyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl2YXIgbm9kZSA9IG14VXRpbHMuZ2V0Vmlld1htbChlZGl0b3IuZ3JhcGgsIDEpOworCQkJdmFyIHhtbCA9IG14VXRpbHMuZ2V0WG1sKG5vZGUsICdcbicpOworCisJCQlteFV0aWxzLnN1Ym1pdCh1cmwsIGVkaXRvci5wb3N0UGFyYW1ldGVyTmFtZSArICc9JyArCisJCQkJZW5jb2RlVVJJQ29tcG9uZW50KHhtbCksIGRvY3VtZW50LCAnX2JsYW5rJyk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbigncmVmcmVzaCcsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWVkaXRvci5ncmFwaC5yZWZyZXNoKCk7CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ2N1dCcsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWlmIChlZGl0b3IuZ3JhcGguaXNFbmFibGVkKCkpCisJCXsKKwkJCW14Q2xpcGJvYXJkLmN1dChlZGl0b3IuZ3JhcGgpOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ2NvcHknLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLmdyYXBoLmlzRW5hYmxlZCgpKQorCQl7CisJCQlteENsaXBib2FyZC5jb3B5KGVkaXRvci5ncmFwaCk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbigncGFzdGUnLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLmdyYXBoLmlzRW5hYmxlZCgpKQorCQl7CisJCQlteENsaXBib2FyZC5wYXN0ZShlZGl0b3IuZ3JhcGgpOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ2RlbGV0ZScsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWlmIChlZGl0b3IuZ3JhcGguaXNFbmFibGVkKCkpCisJCXsKKwkJCWVkaXRvci5ncmFwaC5yZW1vdmVDZWxscygpOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ2dyb3VwJywgZnVuY3Rpb24oZWRpdG9yKQorCXsKKwkJaWYgKGVkaXRvci5ncmFwaC5pc0VuYWJsZWQoKSkKKwkJeworCQkJZWRpdG9yLmdyYXBoLnNldFNlbGVjdGlvbkNlbGwoZWRpdG9yLmdyb3VwQ2VsbHMoKSk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbigndW5ncm91cCcsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWlmIChlZGl0b3IuZ3JhcGguaXNFbmFibGVkKCkpCisJCXsKKwkJCWVkaXRvci5ncmFwaC5zZXRTZWxlY3Rpb25DZWxscyhlZGl0b3IuZ3JhcGgudW5ncm91cENlbGxzKCkpOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ3JlbW92ZUZyb21QYXJlbnQnLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLmdyYXBoLmlzRW5hYmxlZCgpKQorCQl7CisJCQllZGl0b3IuZ3JhcGgucmVtb3ZlQ2VsbHNGcm9tUGFyZW50KCk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbigndW5kbycsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWlmIChlZGl0b3IuZ3JhcGguaXNFbmFibGVkKCkpCisJCXsKKwkJCWVkaXRvci51bmRvKCk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbigncmVkbycsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWlmIChlZGl0b3IuZ3JhcGguaXNFbmFibGVkKCkpCisJCXsKKwkJCWVkaXRvci5yZWRvKCk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbignem9vbUluJywgZnVuY3Rpb24oZWRpdG9yKQorCXsKKwkJZWRpdG9yLmdyYXBoLnpvb21JbigpOworCX0pOworCQorCXRoaXMuYWRkQWN0aW9uKCd6b29tT3V0JywgZnVuY3Rpb24oZWRpdG9yKQorCXsKKwkJZWRpdG9yLmdyYXBoLnpvb21PdXQoKTsKKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbignYWN0dWFsU2l6ZScsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWVkaXRvci5ncmFwaC56b29tQWN0dWFsKCk7CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ2ZpdCcsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWVkaXRvci5ncmFwaC5maXQoKTsKKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbignc2hvd1Byb3BlcnRpZXMnLCBmdW5jdGlvbihlZGl0b3IsIGNlbGwpCisJeworCQllZGl0b3Iuc2hvd1Byb3BlcnRpZXMoY2VsbCk7CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ3NlbGVjdEFsbCcsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWlmIChlZGl0b3IuZ3JhcGguaXNFbmFibGVkKCkpCisJCXsKKwkJCWVkaXRvci5ncmFwaC5zZWxlY3RBbGwoKTsKKwkJfQorCX0pOworCQorCXRoaXMuYWRkQWN0aW9uKCdzZWxlY3ROb25lJywgZnVuY3Rpb24oZWRpdG9yKQorCXsKKwkJaWYgKGVkaXRvci5ncmFwaC5pc0VuYWJsZWQoKSkKKwkJeworCQkJZWRpdG9yLmdyYXBoLmNsZWFyU2VsZWN0aW9uKCk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbignc2VsZWN0VmVydGljZXMnLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLmdyYXBoLmlzRW5hYmxlZCgpKQorCQl7CisJCQllZGl0b3IuZ3JhcGguc2VsZWN0VmVydGljZXMoKTsKKwkJfQorCX0pOworCQorCXRoaXMuYWRkQWN0aW9uKCdzZWxlY3RFZGdlcycsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWlmIChlZGl0b3IuZ3JhcGguaXNFbmFibGVkKCkpCisJCXsKKwkJCWVkaXRvci5ncmFwaC5zZWxlY3RFZGdlcygpOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ2VkaXQnLCBmdW5jdGlvbihlZGl0b3IsIGNlbGwpCisJeworCQlpZiAoZWRpdG9yLmdyYXBoLmlzRW5hYmxlZCgpICYmCisJCQllZGl0b3IuZ3JhcGguaXNDZWxsRWRpdGFibGUoY2VsbCkpCisJCXsKKwkJCWVkaXRvci5ncmFwaC5zdGFydEVkaXRpbmdBdENlbGwoY2VsbCk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbigndG9CYWNrJywgZnVuY3Rpb24oZWRpdG9yLCBjZWxsKQorCXsKKwkJaWYgKGVkaXRvci5ncmFwaC5pc0VuYWJsZWQoKSkKKwkJeworCQkJZWRpdG9yLmdyYXBoLm9yZGVyQ2VsbHModHJ1ZSk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbigndG9Gcm9udCcsIGZ1bmN0aW9uKGVkaXRvciwgY2VsbCkKKwl7CisJCWlmIChlZGl0b3IuZ3JhcGguaXNFbmFibGVkKCkpCisJCXsKKwkJCWVkaXRvci5ncmFwaC5vcmRlckNlbGxzKGZhbHNlKTsKKwkJfQorCX0pOworCQorCXRoaXMuYWRkQWN0aW9uKCdlbnRlckdyb3VwJywgZnVuY3Rpb24oZWRpdG9yLCBjZWxsKQorCXsKKwkJZWRpdG9yLmdyYXBoLmVudGVyR3JvdXAoY2VsbCk7CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ2V4aXRHcm91cCcsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWVkaXRvci5ncmFwaC5leGl0R3JvdXAoKTsKKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbignaG9tZScsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWVkaXRvci5ncmFwaC5ob21lKCk7CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ3NlbGVjdFByZXZpb3VzJywgZnVuY3Rpb24oZWRpdG9yKQorCXsKKwkJaWYgKGVkaXRvci5ncmFwaC5pc0VuYWJsZWQoKSkKKwkJeworCQkJZWRpdG9yLmdyYXBoLnNlbGVjdFByZXZpb3VzQ2VsbCgpOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ3NlbGVjdE5leHQnLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLmdyYXBoLmlzRW5hYmxlZCgpKQorCQl7CisJCQllZGl0b3IuZ3JhcGguc2VsZWN0TmV4dENlbGwoKTsKKwkJfQorCX0pOworCQorCXRoaXMuYWRkQWN0aW9uKCdzZWxlY3RQYXJlbnQnLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLmdyYXBoLmlzRW5hYmxlZCgpKQorCQl7CisJCQllZGl0b3IuZ3JhcGguc2VsZWN0UGFyZW50Q2VsbCgpOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ3NlbGVjdENoaWxkJywgZnVuY3Rpb24oZWRpdG9yKQorCXsKKwkJaWYgKGVkaXRvci5ncmFwaC5pc0VuYWJsZWQoKSkKKwkJeworCQkJZWRpdG9yLmdyYXBoLnNlbGVjdENoaWxkQ2VsbCgpOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ2NvbGxhcHNlJywgZnVuY3Rpb24oZWRpdG9yKQorCXsKKwkJaWYgKGVkaXRvci5ncmFwaC5pc0VuYWJsZWQoKSkKKwkJeworCQkJZWRpdG9yLmdyYXBoLmZvbGRDZWxscyh0cnVlKTsKKwkJfQorCX0pOworCQorCXRoaXMuYWRkQWN0aW9uKCdjb2xsYXBzZUFsbCcsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWlmIChlZGl0b3IuZ3JhcGguaXNFbmFibGVkKCkpCisJCXsKKwkJCXZhciBjZWxscyA9IGVkaXRvci5ncmFwaC5nZXRDaGlsZFZlcnRpY2VzKCk7CisJCQllZGl0b3IuZ3JhcGguZm9sZENlbGxzKHRydWUsIGZhbHNlLCBjZWxscyk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbignZXhwYW5kJywgZnVuY3Rpb24oZWRpdG9yKQorCXsKKwkJaWYgKGVkaXRvci5ncmFwaC5pc0VuYWJsZWQoKSkKKwkJeworCQkJZWRpdG9yLmdyYXBoLmZvbGRDZWxscyhmYWxzZSk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbignZXhwYW5kQWxsJywgZnVuY3Rpb24oZWRpdG9yKQorCXsKKwkJaWYgKGVkaXRvci5ncmFwaC5pc0VuYWJsZWQoKSkKKwkJeworCQkJdmFyIGNlbGxzID0gZWRpdG9yLmdyYXBoLmdldENoaWxkVmVydGljZXMoKTsKKwkJCWVkaXRvci5ncmFwaC5mb2xkQ2VsbHMoZmFsc2UsIGZhbHNlLCBjZWxscyk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbignYm9sZCcsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWlmIChlZGl0b3IuZ3JhcGguaXNFbmFibGVkKCkpCisJCXsKKwkJCWVkaXRvci5ncmFwaC50b2dnbGVDZWxsU3R5bGVGbGFncygKKwkJCQlteENvbnN0YW50cy5TVFlMRV9GT05UU1RZTEUsCisJCQkJbXhDb25zdGFudHMuRk9OVF9CT0xEKTsKKwkJfQorCX0pOworCQorCXRoaXMuYWRkQWN0aW9uKCdpdGFsaWMnLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLmdyYXBoLmlzRW5hYmxlZCgpKQorCQl7CisJCQllZGl0b3IuZ3JhcGgudG9nZ2xlQ2VsbFN0eWxlRmxhZ3MoCisJCQkJbXhDb25zdGFudHMuU1RZTEVfRk9OVFNUWUxFLAorCQkJCW14Q29uc3RhbnRzLkZPTlRfSVRBTElDKTsKKwkJfQorCX0pOworCQorCXRoaXMuYWRkQWN0aW9uKCd1bmRlcmxpbmUnLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLmdyYXBoLmlzRW5hYmxlZCgpKQorCQl7CisJCQllZGl0b3IuZ3JhcGgudG9nZ2xlQ2VsbFN0eWxlRmxhZ3MoCisJCQkJbXhDb25zdGFudHMuU1RZTEVfRk9OVFNUWUxFLAorCQkJCW14Q29uc3RhbnRzLkZPTlRfVU5ERVJMSU5FKTsKKwkJfQorCX0pOworCisJdGhpcy5hZGRBY3Rpb24oJ2FsaWduQ2VsbHNMZWZ0JywgZnVuY3Rpb24oZWRpdG9yKQorCXsKKwkJaWYgKGVkaXRvci5ncmFwaC5pc0VuYWJsZWQoKSkKKwkJeworCQkJZWRpdG9yLmdyYXBoLmFsaWduQ2VsbHMobXhDb25zdGFudHMuQUxJR05fTEVGVCk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbignYWxpZ25DZWxsc0NlbnRlcicsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWlmIChlZGl0b3IuZ3JhcGguaXNFbmFibGVkKCkpCisJCXsKKwkJCWVkaXRvci5ncmFwaC5hbGlnbkNlbGxzKG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUik7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbignYWxpZ25DZWxsc1JpZ2h0JywgZnVuY3Rpb24oZWRpdG9yKQorCXsKKwkJaWYgKGVkaXRvci5ncmFwaC5pc0VuYWJsZWQoKSkKKwkJeworCQkJZWRpdG9yLmdyYXBoLmFsaWduQ2VsbHMobXhDb25zdGFudHMuQUxJR05fUklHSFQpOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ2FsaWduQ2VsbHNUb3AnLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLmdyYXBoLmlzRW5hYmxlZCgpKQorCQl7CisJCQllZGl0b3IuZ3JhcGguYWxpZ25DZWxscyhteENvbnN0YW50cy5BTElHTl9UT1ApOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ2FsaWduQ2VsbHNNaWRkbGUnLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLmdyYXBoLmlzRW5hYmxlZCgpKQorCQl7CisJCQllZGl0b3IuZ3JhcGguYWxpZ25DZWxscyhteENvbnN0YW50cy5BTElHTl9NSURETEUpOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ2FsaWduQ2VsbHNCb3R0b20nLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLmdyYXBoLmlzRW5hYmxlZCgpKQorCQl7CisJCQllZGl0b3IuZ3JhcGguYWxpZ25DZWxscyhteENvbnN0YW50cy5BTElHTl9CT1RUT00pOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ2FsaWduRm9udExlZnQnLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQkKKwkJZWRpdG9yLmdyYXBoLnNldENlbGxTdHlsZXMoCisJCQlteENvbnN0YW50cy5TVFlMRV9BTElHTiwKKwkJCW14Q29uc3RhbnRzLkFMSUdOX0xFRlQpOworCX0pOworCQorCXRoaXMuYWRkQWN0aW9uKCdhbGlnbkZvbnRDZW50ZXInLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLmdyYXBoLmlzRW5hYmxlZCgpKQorCQl7CisJCQllZGl0b3IuZ3JhcGguc2V0Q2VsbFN0eWxlcygKKwkJCQlteENvbnN0YW50cy5TVFlMRV9BTElHTiwKKwkJCQlteENvbnN0YW50cy5BTElHTl9DRU5URVIpOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ2FsaWduRm9udFJpZ2h0JywgZnVuY3Rpb24oZWRpdG9yKQorCXsKKwkJaWYgKGVkaXRvci5ncmFwaC5pc0VuYWJsZWQoKSkKKwkJeworCQkJZWRpdG9yLmdyYXBoLnNldENlbGxTdHlsZXMoCisJCQkJbXhDb25zdGFudHMuU1RZTEVfQUxJR04sCisJCQkJbXhDb25zdGFudHMuQUxJR05fUklHSFQpOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ2FsaWduRm9udFRvcCcsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWlmIChlZGl0b3IuZ3JhcGguaXNFbmFibGVkKCkpCisJCXsKKwkJCWVkaXRvci5ncmFwaC5zZXRDZWxsU3R5bGVzKAorCQkJCW14Q29uc3RhbnRzLlNUWUxFX1ZFUlRJQ0FMX0FMSUdOLAorCQkJCW14Q29uc3RhbnRzLkFMSUdOX1RPUCk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbignYWxpZ25Gb250TWlkZGxlJywgZnVuY3Rpb24oZWRpdG9yKQorCXsKKwkJaWYgKGVkaXRvci5ncmFwaC5pc0VuYWJsZWQoKSkKKwkJeworCQkJZWRpdG9yLmdyYXBoLnNldENlbGxTdHlsZXMoCisJCQkJbXhDb25zdGFudHMuU1RZTEVfVkVSVElDQUxfQUxJR04sCisJCQkJbXhDb25zdGFudHMuQUxJR05fTUlERExFKTsKKwkJfQorCX0pOworCQorCXRoaXMuYWRkQWN0aW9uKCdhbGlnbkZvbnRCb3R0b20nLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLmdyYXBoLmlzRW5hYmxlZCgpKQorCQl7CisJCQllZGl0b3IuZ3JhcGguc2V0Q2VsbFN0eWxlcygKKwkJCQlteENvbnN0YW50cy5TVFlMRV9WRVJUSUNBTF9BTElHTiwKKwkJCQlteENvbnN0YW50cy5BTElHTl9CT1RUT00pOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ3pvb20nLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQl2YXIgY3VycmVudCA9IGVkaXRvci5ncmFwaC5nZXRWaWV3KCkuc2NhbGUqMTAwOworCQl2YXIgc2NhbGUgPSBwYXJzZUZsb2F0KG14VXRpbHMucHJvbXB0KAorCQkJbXhSZXNvdXJjZXMuZ2V0KGVkaXRvci5hc2tab29tUmVzb3VyY2UpIHx8CisJCQllZGl0b3IuYXNrWm9vbVJlc291cmNlLAorCQkJY3VycmVudCkpLzEwMDsKKworCQlpZiAoIWlzTmFOKHNjYWxlKSkKKwkJeworCQkJZWRpdG9yLmdyYXBoLmdldFZpZXcoKS5zZXRTY2FsZShzY2FsZSk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbigndG9nZ2xlVGFza3MnLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLnRhc2tzICE9IG51bGwpCisJCXsKKwkJCWVkaXRvci50YXNrcy5zZXRWaXNpYmxlKCFlZGl0b3IudGFza3MuaXNWaXNpYmxlKCkpOworCQl9CisJCWVsc2UKKwkJeworCQkJZWRpdG9yLnNob3dUYXNrcygpOworCQl9CisJfSk7CisJCisJdGhpcy5hZGRBY3Rpb24oJ3RvZ2dsZUhlbHAnLCBmdW5jdGlvbihlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLmhlbHAgIT0gbnVsbCkKKwkJeworCQkJZWRpdG9yLmhlbHAuc2V0VmlzaWJsZSghZWRpdG9yLmhlbHAuaXNWaXNpYmxlKCkpOworCQl9CisJCWVsc2UKKwkJeworCQkJZWRpdG9yLnNob3dIZWxwKCk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmFkZEFjdGlvbigndG9nZ2xlT3V0bGluZScsIGZ1bmN0aW9uKGVkaXRvcikKKwl7CisJCWlmIChlZGl0b3Iub3V0bGluZSA9PSBudWxsKQorCQl7CisJCQllZGl0b3Iuc2hvd091dGxpbmUoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWVkaXRvci5vdXRsaW5lLnNldFZpc2libGUoIWVkaXRvci5vdXRsaW5lLmlzVmlzaWJsZSgpKTsKKwkJfQorCX0pOworCQorCXRoaXMuYWRkQWN0aW9uKCd0b2dnbGVDb25zb2xlJywgZnVuY3Rpb24oZWRpdG9yKQorCXsKKwkJbXhMb2cuc2V0VmlzaWJsZSghbXhMb2cuaXNWaXNpYmxlKCkpOworCX0pOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY29uZmlndXJlCisgKgorICogQ29uZmlndXJlcyB0aGUgZWRpdG9yIHVzaW5nIHRoZSBzcGVjaWZpZWQgbm9kZS4gVG8gbG9hZCB0aGUKKyAqIGNvbmZpZ3VyYXRpb24gZnJvbSBhIGdpdmVuIFVSTCB0aGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQgdG8gb2J0YWluCisgKiB0aGUgWE1MIG5vZGUuCisgKiAKKyAqIChjb2RlKQorICogdmFyIG5vZGUgPSBteFV0aWxzLmxvYWQodXJsKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAqIChlbmQpCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIG5vZGUgLSBYTUwgbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uLgorICovCitteEVkaXRvci5wcm90b3R5cGUuY29uZmlndXJlID0gZnVuY3Rpb24gKG5vZGUpCit7CisJaWYgKG5vZGUgIT0gbnVsbCkKKwl7CisJCS8vIENyZWF0ZXMgYSBkZWNvZGVyIGZvciB0aGUgWE1MIGRhdGEKKwkJLy8gYW5kIHVzZXMgaXQgdG8gY29uZmlndXJlIHRoZSBlZGl0b3IKKwkJdmFyIGRlYyA9IG5ldyBteENvZGVjKG5vZGUub3duZXJEb2N1bWVudCk7CisJCWRlYy5kZWNvZGUobm9kZSwgdGhpcyk7CisJCQorCQkvLyBSZXNldHMgdGhlIGNvdW50ZXJzLCBtb2RpZmllZCBzdGF0ZSBhbmQKKwkJLy8gY29tbWFuZCBoaXN0b3J5CisJCXRoaXMucmVzZXRIaXN0b3J5KCk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVzZXRGaXJzdFRpbWUKKyAqIAorICogUmVzZXRzIHRoZSBjb29raWUgdGhhdCBpcyB1c2VkIHRvIHJlbWVtYmVyIGlmIHRoZSBlZGl0b3IgaGFzIGFscmVhZHkKKyAqIGJlZW4gdXNlZC4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLnJlc2V0Rmlyc3RUaW1lID0gZnVuY3Rpb24gKCkKK3sKKwlkb2N1bWVudC5jb29raWUgPQorCQknbXhncmFwaD1zZWVuOyBleHBpcmVzPUZyaSwgMjcgSnVsIDIwMDEgMDI6NDc6MTEgVVRDOyBwYXRoPS8nOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVzZXRIaXN0b3J5CisgKiAKKyAqIFJlc2V0cyB0aGUgY29tbWFuZCBoaXN0b3J5LCBtb2RpZmllZCBzdGF0ZSBhbmQgY291bnRlcnMuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5yZXNldEhpc3RvcnkgPSBmdW5jdGlvbiAoKQoreworCXRoaXMubGFzdFNuYXBzaG90ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisJdGhpcy51bmRvTWFuYWdlci5jbGVhcigpOworCXRoaXMuaWdub3JlZENoYW5nZXMgPSAwOworCXRoaXMuc2V0TW9kaWZpZWQoZmFsc2UpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYWRkQWN0aW9uCisgKiAKKyAqIEJpbmRzIHRoZSBzcGVjaWZpZWQgYWN0aW9ubmFtZSB0byB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBhY3Rpb25uYW1lIC0gU3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24KKyAqIHRvIGJlIGFkZGVkLgorICogZnVuY3QgLSBGdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgdGhlIG5ldyBhY3Rpb24uIFRoZSBmaXJzdAorICogYXJndW1lbnQgb2YgdGhlIGZ1bmN0aW9uIGlzIHRoZSBlZGl0b3IgaXQgaXMgdXNlZAorICogd2l0aCwgdGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgY2VsbCBpdCBvcGVyYXRlcworICogdXBvbi4KKyAqIAorICogRXhhbXBsZToKKyAqIChjb2RlKQorICogZWRpdG9yLmFkZEFjdGlvbigndGVzdCcsIGZ1bmN0aW9uKGVkaXRvciwgY2VsbCkKKyAqIHsKKyAqIAkJbXhVdGlscy5hbGVydCgidGVzdCAiK2NlbGwpOworICogfSk7CisgKiAoZW5kKQorICovCitteEVkaXRvci5wcm90b3R5cGUuYWRkQWN0aW9uID0gZnVuY3Rpb24gKGFjdGlvbm5hbWUsIGZ1bmN0KQoreworCXRoaXMuYWN0aW9uc1thY3Rpb25uYW1lXSA9IGZ1bmN0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZXhlY3V0ZQorICogCisgKiBFeGVjdXRlcyB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiA8YWN0aW9ucz4gcGFzc2luZyB0aGUKKyAqIGVkaXRvciBpbnN0YW5jZSBhbmQgZ2l2ZW4gY2VsbCBhcyB0aGUgZmlyc3QgYW5kIHNlY29uZCBhcmd1bWVudC4gQWxsCisgKiBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSBhY3Rpb24gYXMgd2VsbC4gVGhpcyBtZXRob2QKKyAqIGNvbnRhaW5zIGEgdHJ5LWNhdGNoIGJsb2NrIGFuZCBkaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlIGlmIGFuIGFjdGlvbgorICogY2F1c2VzIGFuIGV4Y2VwdGlvbi4gVGhlIGV4Y2VwdGlvbiBpcyByZS10aHJvd24gYWZ0ZXIgdGhlIGVycm9yCisgKiBtZXNzYWdlIHdhcyBkaXNwbGF5ZWQuCisgKiAKKyAqIEV4YW1wbGU6CisgKiAKKyAqIChjb2RlKQorICogZWRpdG9yLmV4ZWN1dGUoInNob3dQcm9wZXJ0aWVzIiwgY2VsbCk7CisgKiAoZW5kKQorICovCitteEVkaXRvci5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uIChhY3Rpb25uYW1lLCBjZWxsLCBldnQpCit7CisJdmFyIGFjdGlvbiA9IHRoaXMuYWN0aW9uc1thY3Rpb25uYW1lXTsKKwkKKwlpZiAoYWN0aW9uICE9IG51bGwpCisJeworCQl0cnkKKwkJeworCQkJLy8gQ3JlYXRlcyB0aGUgYXJyYXkgb2YgYXJndW1lbnRzIGJ5IHJlcGxhY2luZyB0aGUgYWN0aW9ubmFtZQorCQkJLy8gd2l0aCB0aGUgZWRpdG9yIGluc3RhbmNlIGluIHRoZSBhcmdzIG9mIHRoaXMgZnVuY3Rpb24KKwkJCXZhciBhcmdzID0gYXJndW1lbnRzOworCQkJYXJnc1swXSA9IHRoaXM7CisJCQkKKwkJCS8vIEludm9rZXMgdGhlIGZ1bmN0aW9uIG9uIHRoZSBlZGl0b3IgdXNpbmcgdGhlIGFyZ3MKKwkJCWFjdGlvbi5hcHBseSh0aGlzLCBhcmdzKTsKKwkJfQorCQljYXRjaCAoZSkKKwkJeworCQkJbXhVdGlscy5lcnJvcignQ2Fubm90IGV4ZWN1dGUgJyArIGFjdGlvbm5hbWUgKworCQkJCSc6ICcgKyBlLm1lc3NhZ2UsIDI4MCwgdHJ1ZSk7CisJCQkKKwkJCXRocm93IGU7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJbXhVdGlscy5lcnJvcignQ2Fubm90IGZpbmQgYWN0aW9uICcrYWN0aW9ubmFtZSwgMjgwLCB0cnVlKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRUZW1wbGF0ZQorICogCisgKiBBZGRzIHRoZSBzcGVjaWZpZWQgdGVtcGxhdGUgdW5kZXIgdGhlIGdpdmVuIG5hbWUgaW4gPHRlbXBsYXRlcz4uCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5hZGRUZW1wbGF0ZSA9IGZ1bmN0aW9uIChuYW1lLCB0ZW1wbGF0ZSkKK3sKKwl0aGlzLnRlbXBsYXRlc1tuYW1lXSA9IHRlbXBsYXRlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0VGVtcGxhdGUKKyAqIAorICogUmV0dXJucyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBnaXZlbiBuYW1lLgorICovCitteEVkaXRvci5wcm90b3R5cGUuZ2V0VGVtcGxhdGUgPSBmdW5jdGlvbiAobmFtZSkKK3sKKwlyZXR1cm4gdGhpcy50ZW1wbGF0ZXNbbmFtZV07Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVHcmFwaAorICogCisgKiBDcmVhdGVzIHRoZSA8Z3JhcGg+IGZvciB0aGUgZWRpdG9yLiBUaGUgZ3JhcGggaXMgY3JlYXRlZCB3aXRoIG5vCisgKiBjb250YWluZXIgYW5kIGlzIGluaXRpYWxpemVkIGZyb20gPHNldEdyYXBoQ29udGFpbmVyPi4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmNyZWF0ZUdyYXBoID0gZnVuY3Rpb24gKCkKK3sKKwl2YXIgZ3JhcGggPSBuZXcgbXhHcmFwaChudWxsLCBudWxsLCB0aGlzLmdyYXBoUmVuZGVySGludCk7CisJCisJLy8gRW5hYmxlcyBydWJiZXJiYW5kLCB0b29sdGlwcywgcGFubmluZworCWdyYXBoLnNldFRvb2x0aXBzKHRydWUpOworCWdyYXBoLnNldFBhbm5pbmcodHJ1ZSk7CisKKwkvLyBPdmVycmlkZXMgdGhlIGRibGNsaWNrIG1ldGhvZCBvbiB0aGUgZ3JhcGggdG8KKwkvLyBpbnZva2UgdGhlIGRibENsaWNrQWN0aW9uIGZvciBhIGNlbGwgYW5kIHJlc2V0CisJLy8gdGhlIHNlbGVjdGlvbiB0b29sIGluIHRoZSB0b29sYmFyCisJdGhpcy5pbnN0YWxsRGJsQ2xpY2tIYW5kbGVyKGdyYXBoKTsKKwkKKwkvLyBJbnN0YWxscyB0aGUgY29tbWFuZCBoaXN0b3J5CisJdGhpcy5pbnN0YWxsVW5kb0hhbmRsZXIoZ3JhcGgpOworCisJLy8gSW5zdGFsbHMgdGhlIGhhbmRsZXJzIGZvciB0aGUgcm9vdCBldmVudAorCXRoaXMuaW5zdGFsbERyaWxsSGFuZGxlcihncmFwaCk7CisJCisJLy8gSW5zdGFsbHMgdGhlIGhhbmRsZXIgZm9yIHZhbGlkYXRpb24KKwl0aGlzLmluc3RhbGxDaGFuZ2VIYW5kbGVyKGdyYXBoKTsKKworCS8vIEluc3RhbGxzIHRoZSBoYW5kbGVyIGZvciBjYWxsaW5nIHRoZQorCS8vIGluc2VydCBmdW5jdGlvbiBhbmQgY29uc3VtZSB0aGUKKwkvLyBldmVudCBpZiBhbiBpbnNlcnQgZnVuY3Rpb24gaXMgZGVmaW5lZAorCXRoaXMuaW5zdGFsbEluc2VydEhhbmRsZXIoZ3JhcGgpOworCisJLy8gUmVkaXJlY3RzIHRoZSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgdGhlCisJLy8gcG9wdXBtZW51IGl0ZW1zCisJZ3JhcGgucG9wdXBNZW51SGFuZGxlci5mYWN0b3J5TWV0aG9kID0KKwkJbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKG1lbnUsIGNlbGwsIGV2dCkKKwkJeworCQkJcmV0dXJuIHRoaXMuY3JlYXRlUG9wdXBNZW51KG1lbnUsIGNlbGwsIGV2dCk7CisJCX0pOworCisJLy8gUmVkaXJlY3RzIHRoZSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcKKwkvLyBuZXcgY29ubmVjdGlvbnMgaW4gdGhlIGRpYWdyYW0KKwlncmFwaC5jb25uZWN0aW9uSGFuZGxlci5mYWN0b3J5TWV0aG9kID0KKwkJbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQorCQl7CisJCQlyZXR1cm4gdGhpcy5jcmVhdGVFZGdlKHNvdXJjZSwgdGFyZ2V0KTsKKwkJfSk7CisJCisJLy8gTWFpbnRhaW5zIHN3aW1sYW5lcyBhbmQgaW5zdGFsbHMgYXV0b2xheW91dAorCXRoaXMuY3JlYXRlU3dpbWxhbmVNYW5hZ2VyKGdyYXBoKTsKKwl0aGlzLmNyZWF0ZUxheW91dE1hbmFnZXIoZ3JhcGgpOworCQorCXJldHVybiBncmFwaDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVN3aW1sYW5lTWFuYWdlcgorICogCisgKiBTZXRzIHRoZSBncmFwaCdzIGNvbnRhaW5lciB1c2luZyA8bXhHcmFwaC5pbml0Pi4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmNyZWF0ZVN3aW1sYW5lTWFuYWdlciA9IGZ1bmN0aW9uIChncmFwaCkKK3sKKwl2YXIgc3dpbWxhbmVNZ3IgPSBuZXcgbXhTd2ltbGFuZU1hbmFnZXIoZ3JhcGgsIGZhbHNlKTsKKworCXN3aW1sYW5lTWdyLmlzSG9yaXpvbnRhbCA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbigpCisJeworCQlyZXR1cm4gdGhpcy5ob3Jpem9udGFsRmxvdzsKKwl9KTsKKwkKKwlzd2ltbGFuZU1nci5pc0VuYWJsZWQgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCXsKKwkJcmV0dXJuIHRoaXMubWFpbnRhaW5Td2ltbGFuZXM7CisJfSk7CisJCisJcmV0dXJuIHN3aW1sYW5lTWdyOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlTGF5b3V0TWFuYWdlcgorICogCisgKiBDcmVhdGVzIGEgbGF5b3V0IG1hbmFnZXIgZm9yIHRoZSBzd2ltbGFuZSBhbmQgZGlhZ3JhbSBsYXlvdXRzLCB0aGF0CisgKiBpcywgdGhlIGxvY2FsbHkgZGVmaW5lZCBpbnRlci0gYW5kIGludHJhc3dpbWxhbmUgbGF5b3V0cy4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmNyZWF0ZUxheW91dE1hbmFnZXIgPSBmdW5jdGlvbiAoZ3JhcGgpCit7CisJdmFyIGxheW91dE1nciA9IG5ldyBteExheW91dE1hbmFnZXIoZ3JhcGgpOworCQorCXZhciBzZWxmID0gdGhpczsgLy8gY2xvc3VyZQorCWxheW91dE1nci5nZXRMYXlvdXQgPSBmdW5jdGlvbihjZWxsKQorCXsKKwkJdmFyIGxheW91dCA9IG51bGw7CisJCXZhciBtb2RlbCA9IHNlbGYuZ3JhcGguZ2V0TW9kZWwoKTsKKwkJCisJCWlmIChtb2RlbC5nZXRQYXJlbnQoY2VsbCkgIT0gbnVsbCkKKwkJeworCQkJLy8gRXhlY3V0ZXMgdGhlIHN3aW1sYW5lIGxheW91dCBpZiBhIGNoaWxkIG9mCisJCQkvLyBhIHN3aW1sYW5lIGhhcyBiZWVuIGNoYW5nZWQuIFRoZSBsYXlvdXQgaXMKKwkJCS8vIGxhenkgY3JlYXRlZCBpbiBjcmVhdGVTd2ltbGFuZUxheW91dC4KKwkJCWlmIChzZWxmLmxheW91dFN3aW1sYW5lcyAmJgorCQkJCWdyYXBoLmlzU3dpbWxhbmUoY2VsbCkpCisJCQl7CisJCQkJaWYgKHNlbGYuc3dpbWxhbmVMYXlvdXQgPT0gbnVsbCkKKwkJCQl7CisJCQkJCXNlbGYuc3dpbWxhbmVMYXlvdXQgPSBzZWxmLmNyZWF0ZVN3aW1sYW5lTGF5b3V0KCk7CisJCQkJfQorCQkJCQorCQkJCWxheW91dCA9IHNlbGYuc3dpbWxhbmVMYXlvdXQ7CisJCQl9CisJCQkKKwkJCS8vIEV4ZWN1dGVzIHRoZSBkaWFncmFtIGxheW91dCBpZiB0aGUgbW9kaWZpZWQKKwkJCS8vIGNlbGwgaXMgYSB0b3AtbGV2ZWwgY2VsbC4gVGhlIGxheW91dCBpcworCQkJLy8gbGF6eSBjcmVhdGVkIGluIGNyZWF0ZURpYWdyYW1MYXlvdXQuCisJCQllbHNlIGlmIChzZWxmLmxheW91dERpYWdyYW0gJiYKKwkJCQkoZ3JhcGguaXNWYWxpZFJvb3QoY2VsbCkgfHwKKwkJCQltb2RlbC5nZXRQYXJlbnQobW9kZWwuZ2V0UGFyZW50KGNlbGwpKSA9PSBudWxsKSkKKwkJCXsKKwkJCQlpZiAoc2VsZi5kaWFncmFtTGF5b3V0ID09IG51bGwpCisJCQkJeworCQkJCQlzZWxmLmRpYWdyYW1MYXlvdXQgPSBzZWxmLmNyZWF0ZURpYWdyYW1MYXlvdXQoKTsKKwkJCQl9CisJCQkJCisJCQkJbGF5b3V0ID0gc2VsZi5kaWFncmFtTGF5b3V0OworCQkJfQorCQl9CisJCQkKKwkJcmV0dXJuIGxheW91dDsKKwl9OworCQorCXJldHVybiBsYXlvdXRNZ3I7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRHcmFwaENvbnRhaW5lcgorICogCisgKiBTZXRzIHRoZSBncmFwaCdzIGNvbnRhaW5lciB1c2luZyA8bXhHcmFwaC5pbml0Pi4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLnNldEdyYXBoQ29udGFpbmVyID0gZnVuY3Rpb24gKGNvbnRhaW5lcikKK3sKKwlpZiAodGhpcy5ncmFwaC5jb250YWluZXIgPT0gbnVsbCkKKwl7CisJCS8vIENyZWF0ZXMgdGhlIGdyYXBoIGluc3RhbmNlIGluc2lkZSB0aGUgZ2l2ZW4gY29udGFpbmVyIGFuZCByZW5kZXIgaGludAorCQkvL3RoaXMuZ3JhcGggPSBuZXcgbXhHcmFwaChjb250YWluZXIsIG51bGwsIHRoaXMuZ3JhcGhSZW5kZXJIaW50KTsKKwkJdGhpcy5ncmFwaC5pbml0KGNvbnRhaW5lcik7CisKKwkJLy8gSW5zdGFsbCBydWJiZXJiYW5kIHNlbGVjdGlvbiBhcyB0aGUgbGFzdAorCQkvLyBhY3Rpb24gaGFuZGxlciBpbiB0aGUgY2hhaW4KKwkJdGhpcy5ydWJiZXJiYW5kID0gbmV3IG14UnViYmVyYmFuZCh0aGlzLmdyYXBoKTsKKworCQkvLyBEaXNhYmxlcyB0aGUgY29udGV4dCBtZW51CisJCWlmICh0aGlzLmRpc2FibGVDb250ZXh0TWVudSkKKwkJeworCQkJbXhFdmVudC5kaXNhYmxlQ29udGV4dE1lbnUoY29udGFpbmVyKTsKKwkJfQorCisJCS8vIFdvcmthcm91bmQgZm9yIHN0eWxlc2hlZXQgZGlyZWN0aXZlcyBpbiBJRQorCQlpZiAobXhDbGllbnQuSVNfUVVJUktTKQorCQl7CisJCQluZXcgbXhEaXZSZXNpemVyKGNvbnRhaW5lcik7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbnN0YWxsRGJsQ2xpY2tIYW5kbGVyCisgKiAKKyAqIE92ZXJyaWRlcyA8bXhHcmFwaC5kYmxDbGljaz4gdG8gaW52b2tlIDxkYmxDbGlja0FjdGlvbj4KKyAqIG9uIGEgY2VsbCBhbmQgcmVzZXQgdGhlIHNlbGVjdGlvbiB0b29sIGluIHRoZSB0b29sYmFyLgorICovCitteEVkaXRvci5wcm90b3R5cGUuaW5zdGFsbERibENsaWNrSGFuZGxlciA9IGZ1bmN0aW9uIChncmFwaCkKK3sKKwkvLyBJbnN0YWxscyBhIGxpc3RlbmVyIGZvciBkb3VibGUgY2xpY2sgZXZlbnRzCisJZ3JhcGguYWRkTGlzdGVuZXIobXhFdmVudC5ET1VCTEVfQ0xJQ0ssCisJCW14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihzZW5kZXIsIGV2dCkKKwkJeworCQkJdmFyIGNlbGwgPSBldnQuZ2V0UHJvcGVydHkoJ2NlbGwnKTsKKwkJCQorCQkJaWYgKGNlbGwgIT0gbnVsbCAmJgorCQkJCWdyYXBoLmlzRW5hYmxlZCgpICYmCisJCQkJdGhpcy5kYmxDbGlja0FjdGlvbiAhPSBudWxsKQorCQkJeworCQkJCXRoaXMuZXhlY3V0ZSh0aGlzLmRibENsaWNrQWN0aW9uLCBjZWxsKTsKKwkJCQlldnQuY29uc3VtZSgpOworCQkJfQorCQl9KQorCSk7Cit9OworCQkKKy8qKgorICogRnVuY3Rpb246IGluc3RhbGxVbmRvSGFuZGxlcgorICogCisgKiBBZGRzIHRoZSA8dW5kb01hbmFnZXI+IHRvIHRoZSBncmFwaCBtb2RlbCBhbmQgdGhlIHZpZXcuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5pbnN0YWxsVW5kb0hhbmRsZXIgPSBmdW5jdGlvbiAoZ3JhcGgpCit7CQkJCQorCXZhciBsaXN0ZW5lciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihzZW5kZXIsIGV2dCkKKwl7CisJCXZhciBlZGl0ID0gZXZ0LmdldFByb3BlcnR5KCdlZGl0Jyk7CisJCXRoaXMudW5kb01hbmFnZXIudW5kb2FibGVFZGl0SGFwcGVuZWQoZWRpdCk7CisJfSk7CisJCisJZ3JhcGguZ2V0TW9kZWwoKS5hZGRMaXN0ZW5lcihteEV2ZW50LlVORE8sIGxpc3RlbmVyKTsKKwlncmFwaC5nZXRWaWV3KCkuYWRkTGlzdGVuZXIobXhFdmVudC5VTkRPLCBsaXN0ZW5lcik7CisKKwkvLyBLZWVwcyB0aGUgc2VsZWN0aW9uIHN0YXRlIGluIHN5bmMKKwl2YXIgdW5kb0hhbmRsZXIgPSBmdW5jdGlvbihzZW5kZXIsIGV2dCkKKwl7CisJCXZhciBjaGFuZ2VzID0gZXZ0LmdldFByb3BlcnR5KCdlZGl0JykuY2hhbmdlczsKKwkJZ3JhcGguc2V0U2VsZWN0aW9uQ2VsbHMoZ3JhcGguZ2V0U2VsZWN0aW9uQ2VsbHNGb3JDaGFuZ2VzKGNoYW5nZXMpKTsKKwl9OworCQorCXRoaXMudW5kb01hbmFnZXIuYWRkTGlzdGVuZXIobXhFdmVudC5VTkRPLCB1bmRvSGFuZGxlcik7CisJdGhpcy51bmRvTWFuYWdlci5hZGRMaXN0ZW5lcihteEV2ZW50LlJFRE8sIHVuZG9IYW5kbGVyKTsKK307CisJCQorLyoqCisgKiBGdW5jdGlvbjogaW5zdGFsbERyaWxsSGFuZGxlcgorICogCisgKiBJbnN0YWxscyBsaXN0ZW5lcnMgZm9yIGRpc3BhdGNoaW5nIHRoZSA8cm9vdD4gZXZlbnQuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5pbnN0YWxsRHJpbGxIYW5kbGVyID0gZnVuY3Rpb24gKGdyYXBoKQorewkJCQkKKwl2YXIgbGlzdGVuZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oc2VuZGVyKQorCXsKKwkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5ST09UKSk7CisJfSk7CisJCisJZ3JhcGguZ2V0VmlldygpLmFkZExpc3RlbmVyKG14RXZlbnQuRE9XTiwgbGlzdGVuZXIpOworCWdyYXBoLmdldFZpZXcoKS5hZGRMaXN0ZW5lcihteEV2ZW50LlVQLCBsaXN0ZW5lcik7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbnN0YWxsQ2hhbmdlSGFuZGxlcgorICogCisgKiBJbnN0YWxscyB0aGUgbGlzdGVuZXJzIHJlcXVpcmVkIHRvIGF1dG9tYXRpY2FsbHkgdmFsaWRhdGUKKyAqIHRoZSBncmFwaC4gT24gZWFjaCBjaGFuZ2Ugb2YgdGhlIHJvb3QsIHRoaXMgaW1wbGVtZW50YXRpb24KKyAqIGZpcmVzIGEgPHJvb3Q+IGV2ZW50LgorICovCitteEVkaXRvci5wcm90b3R5cGUuaW5zdGFsbENoYW5nZUhhbmRsZXIgPSBmdW5jdGlvbiAoZ3JhcGgpCit7CisJdmFyIGxpc3RlbmVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorCXsKKwkJLy8gVXBkYXRlcyB0aGUgbW9kaWZpZWQgc3RhdGUKKwkJdGhpcy5zZXRNb2RpZmllZCh0cnVlKTsKKworCQkvLyBBdXRvbWF0aWNhbGx5IHZhbGlkYXRlcyB0aGUgZ3JhcGgKKwkJLy8gYWZ0ZXIgZWFjaCBjaGFuZ2UKKwkJaWYgKHRoaXMudmFsaWRhdGluZyA9PSB0cnVlKQorCQl7CisJCQlncmFwaC52YWxpZGF0ZUdyYXBoKCk7CisJCX0KKworCQkvLyBDaGVja3MgaWYgdGhlIHJvb3QgaGFzIGJlZW4gY2hhbmdlZAorCQl2YXIgY2hhbmdlcyA9IGV2dC5nZXRQcm9wZXJ0eSgnZWRpdCcpLmNoYW5nZXM7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBjaGFuZ2UgPSBjaGFuZ2VzW2ldOworCQkJCisJCQlpZiAoY2hhbmdlIGluc3RhbmNlb2YgbXhSb290Q2hhbmdlIHx8CisJCQkJKGNoYW5nZSBpbnN0YW5jZW9mIG14VmFsdWVDaGFuZ2UgJiYKKwkJCQljaGFuZ2UuY2VsbCA9PSB0aGlzLmdyYXBoLm1vZGVsLnJvb3QpIHx8CisJCQkJKGNoYW5nZSBpbnN0YW5jZW9mIG14Q2VsbEF0dHJpYnV0ZUNoYW5nZSAmJgorCQkJCWNoYW5nZS5jZWxsID09IHRoaXMuZ3JhcGgubW9kZWwucm9vdCkpCisJCQl7CisJCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5ST09UKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9KTsKKwkKKwlncmFwaC5nZXRNb2RlbCgpLmFkZExpc3RlbmVyKG14RXZlbnQuQ0hBTkdFLCBsaXN0ZW5lcik7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbnN0YWxsSW5zZXJ0SGFuZGxlcgorICogCisgKiBJbnN0YWxscyB0aGUgaGFuZGxlciBmb3IgaW52b2tpbmcgPGluc2VydEZ1bmN0aW9uPiBpZgorICogb25lIGlzIGRlZmluZWQuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5pbnN0YWxsSW5zZXJ0SGFuZGxlciA9IGZ1bmN0aW9uIChncmFwaCkKK3sKKwl2YXIgc2VsZiA9IHRoaXM7IC8vIGNsb3N1cmUKKwl2YXIgaW5zZXJ0SGFuZGxlciA9CisJeworCQltb3VzZURvd246IGZ1bmN0aW9uKHNlbmRlciwgbWUpCisJCXsKKwkJCWlmIChzZWxmLmluc2VydEZ1bmN0aW9uICE9IG51bGwgJiYKKwkJCQkhbWUuaXNQb3B1cFRyaWdnZXIoKSAmJgorCQkJCShzZWxmLmZvcmNlZEluc2VydGluZyB8fAorCQkJCW1lLmdldFN0YXRlKCkgPT0gbnVsbCkpCisJCQl7CisJCQkJc2VsZi5ncmFwaC5jbGVhclNlbGVjdGlvbigpOworCQkJCXNlbGYuaW5zZXJ0RnVuY3Rpb24obWUuZ2V0RXZlbnQoKSwgbWUuZ2V0Q2VsbCgpKTsKKworCQkJCS8vIENvbnN1bWVzIHRoZSByZXN0IG9mIHRoZSBldmVudHMKKwkJCQkvLyBmb3IgdGhpcyBnZXN0dXJlIChkb3duLCBtb3ZlLCB1cCkKKwkJCQl0aGlzLmlzQWN0aXZlID0gdHJ1ZTsKKwkJCQltZS5jb25zdW1lKCk7CisJCQl9CisJCX0sCisJCQorCQltb3VzZU1vdmU6IGZ1bmN0aW9uKHNlbmRlciwgbWUpCisJCXsKKwkJCWlmICh0aGlzLmlzQWN0aXZlKQorCQkJeworCQkJCW1lLmNvbnN1bWUoKTsKKwkJCX0KKwkJfSwKKwkJCisJCW1vdXNlVXA6IGZ1bmN0aW9uKHNlbmRlciwgbWUpCisJCXsKKwkJCWlmICh0aGlzLmlzQWN0aXZlKQorCQkJeworCQkJCXRoaXMuaXNBY3RpdmUgPSBmYWxzZTsKKwkJCQltZS5jb25zdW1lKCk7CisJCQl9CisJCX0KKwl9OworCQorCWdyYXBoLmFkZE1vdXNlTGlzdGVuZXIoaW5zZXJ0SGFuZGxlcik7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVEaWFncmFtTGF5b3V0CisgKiAKKyAqIENyZWF0ZXMgdGhlIGxheW91dCBpbnN0YW5jZSB1c2VkIHRvIGxheW91dCB0aGUKKyAqIHN3aW1sYW5lcyBpbiB0aGUgZGlhZ3JhbS4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmNyZWF0ZURpYWdyYW1MYXlvdXQgPSBmdW5jdGlvbiAoKQoreworCXZhciBncyA9IHRoaXMuZ3JhcGguZ3JpZFNpemU7CisJdmFyIGxheW91dCA9IG5ldyBteFN0YWNrTGF5b3V0KHRoaXMuZ3JhcGgsICF0aGlzLmhvcml6b250YWxGbG93LAorCQkgdGhpcy5zd2ltbGFuZVNwYWNpbmcsIDIqZ3MsIDIqZ3MpOworCQorCS8vIE92ZXJyaWRlcyBpc0lnbm9yZWQgdG8gb25seSB0YWtlIGludG8gYWNjb3VudCBzd2ltbGFuZXMKKwlsYXlvdXQuaXNWZXJ0ZXhJZ25vcmVkID0gZnVuY3Rpb24oY2VsbCkKKwl7CisJCXJldHVybiAhbGF5b3V0LmdyYXBoLmlzU3dpbWxhbmUoY2VsbCk7CisJfTsKKwkKKwlyZXR1cm4gbGF5b3V0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlU3dpbWxhbmVMYXlvdXQKKyAqIAorICogQ3JlYXRlcyB0aGUgbGF5b3V0IGluc3RhbmNlIHVzZWQgdG8gbGF5b3V0IHRoZQorICogY2hpbGRyZW4gb2YgZWFjaCBzd2ltbGFuZS4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmNyZWF0ZVN3aW1sYW5lTGF5b3V0ID0gZnVuY3Rpb24gKCkKK3sKKwlyZXR1cm4gbmV3IG14Q29tcGFjdFRyZWVMYXlvdXQodGhpcy5ncmFwaCwgdGhpcy5ob3Jpem9udGFsRmxvdyk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVUb29sYmFyCisgKiAKKyAqIENyZWF0ZXMgdGhlIDx0b29sYmFyPiB3aXRoIG5vIGNvbnRhaW5lci4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmNyZWF0ZVRvb2xiYXIgPSBmdW5jdGlvbiAoKQoreworCXJldHVybiBuZXcgbXhEZWZhdWx0VG9vbGJhcihudWxsLCB0aGlzKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFRvb2xiYXJDb250YWluZXIKKyAqIAorICogSW5pdGlhbGl6ZXMgdGhlIHRvb2xiYXIgZm9yIHRoZSBnaXZlbiBjb250YWluZXIuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5zZXRUb29sYmFyQ29udGFpbmVyID0gZnVuY3Rpb24gKGNvbnRhaW5lcikKK3sKKwl0aGlzLnRvb2xiYXIuaW5pdChjb250YWluZXIpOworCQorCS8vIFdvcmthcm91bmQgZm9yIHN0eWxlc2hlZXQgZGlyZWN0aXZlcyBpbiBJRQorCWlmIChteENsaWVudC5JU19RVUlSS1MpCisJeworCQluZXcgbXhEaXZSZXNpemVyKGNvbnRhaW5lcik7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0U3RhdHVzQ29udGFpbmVyCisgKiAKKyAqIENyZWF0ZXMgdGhlIDxzdGF0dXM+IHVzaW5nIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyLgorICogCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFkZHMgbGlzdGVuZXJzIGluIHRoZSBlZGl0b3IgdG8gCisgKiBkaXNwbGF5IHRoZSBsYXN0IHNhdmVkIHRpbWUgYW5kIHRoZSBjdXJyZW50IGZpbGVuYW1lIAorICogaW4gdGhlIHN0YXR1cyBiYXIuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNvbnRhaW5lciAtIERPTSBub2RlIHRoYXQgd2lsbCBjb250YWluIHRoZSBzdGF0dXNiYXIuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5zZXRTdGF0dXNDb250YWluZXIgPSBmdW5jdGlvbiAoY29udGFpbmVyKQoreworCWlmICh0aGlzLnN0YXR1cyA9PSBudWxsKQorCXsKKwkJdGhpcy5zdGF0dXMgPSBjb250YWluZXI7CisJCQorCQkvLyBQcmludHMgdGhlIGxhc3Qgc2F2ZWQgdGltZSBpbiB0aGUgc3RhdHVzIGJhcgorCQkvLyB3aGVuIGZpbGVzIGFyZSBzYXZlZAorCQl0aGlzLmFkZExpc3RlbmVyKG14RXZlbnQuU0FWRSwgbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKCkKKwkJeworCQkJdmFyIHRzdGFtcCA9IG5ldyBEYXRlKCkudG9Mb2NhbGVTdHJpbmcoKTsKKwkJCXRoaXMuc2V0U3RhdHVzKChteFJlc291cmNlcy5nZXQodGhpcy5sYXN0U2F2ZWRSZXNvdXJjZSkgfHwKKwkJCQl0aGlzLmxhc3RTYXZlZFJlc291cmNlKSsnOiAnK3RzdGFtcCk7CisJCX0pKTsKKwkJCisJCS8vIFVwZGF0ZXMgdGhlIHN0YXR1c2JhciB0byBkaXNwbGF5IHRoZSBmaWxlbmFtZQorCQkvLyB3aGVuIG5ldyBmaWxlcyBhcmUgb3BlbmVkCisJCXRoaXMuYWRkTGlzdGVuZXIobXhFdmVudC5PUEVOLCBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCQl7CisJCQl0aGlzLnNldFN0YXR1cygobXhSZXNvdXJjZXMuZ2V0KHRoaXMuY3VycmVudEZpbGVSZXNvdXJjZSkgfHwKKwkJCQl0aGlzLmN1cnJlbnRGaWxlUmVzb3VyY2UpKyc6ICcrdGhpcy5maWxlbmFtZSk7CisJCX0pKTsKKwkJCisJCS8vIFdvcmthcm91bmQgZm9yIHN0eWxlc2hlZXQgZGlyZWN0aXZlcyBpbiBJRQorCQlpZiAobXhDbGllbnQuSVNfUVVJUktTKQorCQl7CisJCQluZXcgbXhEaXZSZXNpemVyKGNvbnRhaW5lcik7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRTdGF0dXMKKyAqIAorICogRGlzcGxheSB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgaW4gdGhlIHN0YXR1cyBiYXIuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIG1lc3NhZ2UgLSBTdHJpbmcgdGhlIHNwZWNpZmllZCB0aGUgbWVzc2FnZSB0bworICogYmUgZGlzcGxheWVkLgorICovCitteEVkaXRvci5wcm90b3R5cGUuc2V0U3RhdHVzID0gZnVuY3Rpb24gKG1lc3NhZ2UpCit7CisJaWYgKHRoaXMuc3RhdHVzICE9IG51bGwgJiYgbWVzc2FnZSAhPSBudWxsKQorCXsKKwkJdGhpcy5zdGF0dXMuaW5uZXJIVE1MID0gbWVzc2FnZTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRUaXRsZUNvbnRhaW5lcgorICogCisgKiBDcmVhdGVzIGEgbGlzdGVuZXIgdG8gdXBkYXRlIHRoZSBpbm5lciBIVE1MIG9mIHRoZQorICogc3BlY2lmaWVkIERPTSBub2RlIHdpdGggdGhlIHZhbHVlIG9mIDxnZXRUaXRsZT4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNvbnRhaW5lciAtIERPTSBub2RlIHRoYXQgd2lsbCBjb250YWluIHRoZSB0aXRsZS4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLnNldFRpdGxlQ29udGFpbmVyID0gZnVuY3Rpb24gKGNvbnRhaW5lcikKK3sKKwl0aGlzLmFkZExpc3RlbmVyKG14RXZlbnQuUk9PVCwgbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKHNlbmRlcikKKwl7CisJCWNvbnRhaW5lci5pbm5lckhUTUwgPSB0aGlzLmdldFRpdGxlKCk7CisJfSkpOworCisJLy8gV29ya2Fyb3VuZCBmb3Igc3R5bGVzaGVldCBkaXJlY3RpdmVzIGluIElFCisJaWYgKG14Q2xpZW50LklTX1FVSVJLUykKKwl7CisJCW5ldyBteERpdlJlc2l6ZXIoY29udGFpbmVyKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB0cmVlTGF5b3V0CisgKiAKKyAqIEV4ZWN1dGVzIGEgdmVydGljYWwgb3IgaG9yaXpvbnRhbCBjb21wYWN0IHRyZWUgbGF5b3V0CisgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNlbGwgYXMgYW4gYXJndW1lbnQuIFRoZSBjZWxsIG1heQorICogZWl0aGVyIGJlIGEgZ3JvdXAgb3IgdGhlIHJvb3Qgb2YgYSB0cmVlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdG8gdXNlIGluIHRoZSBjb21wYWN0IHRyZWUgbGF5b3V0LgorICogaG9yaXpvbnRhbCAtIE9wdGlvbmFsIGJvb2xlYW4gdG8gc3BlY2lmeSB0aGUgdHJlZSdzCisgKiBvcmllbnRhdGlvbi4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEVkaXRvci5wcm90b3R5cGUudHJlZUxheW91dCA9IGZ1bmN0aW9uIChjZWxsLCBob3Jpem9udGFsKQoreworCWlmIChjZWxsICE9IG51bGwpCisJeworCQl2YXIgbGF5b3V0ID0gbmV3IG14Q29tcGFjdFRyZWVMYXlvdXQodGhpcy5ncmFwaCwgaG9yaXpvbnRhbCk7CisJCWxheW91dC5leGVjdXRlKGNlbGwpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFRpdGxlCisgKiAKKyAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgcm9vdCBvZiB0aGUKKyAqIGRpYWdyYW0uCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5nZXRUaXRsZSA9IGZ1bmN0aW9uICgpCit7CisJdmFyIHRpdGxlID0gJyc7CisJdmFyIGdyYXBoID0gdGhpcy5ncmFwaDsKKwl2YXIgY2VsbCA9IGdyYXBoLmdldEN1cnJlbnRSb290KCk7CisJCisJd2hpbGUgKGNlbGwgIT0gbnVsbCAmJgorCQkgICBncmFwaC5nZXRNb2RlbCgpLmdldFBhcmVudCgKKwkJCQlncmFwaC5nZXRNb2RlbCgpLmdldFBhcmVudChjZWxsKSkgIT0gbnVsbCkKKwl7CisJCS8vIEFwcGVuZCBlYWNoIGxhYmVsIG9mIGEgdmFsaWQgcm9vdAorCQlpZiAoZ3JhcGguaXNWYWxpZFJvb3QoY2VsbCkpCisJCXsKKwkJCXRpdGxlID0gJyA+ICcgKworCQkJZ3JhcGguY29udmVydFZhbHVlVG9TdHJpbmcoY2VsbCkgKyB0aXRsZTsKKwkJfQorCQkKKwkJY2VsbCA9IGdyYXBoLmdldE1vZGVsKCkuZ2V0UGFyZW50KGNlbGwpOworCX0KKwkKKwl2YXIgcHJlZml4ID0gdGhpcy5nZXRSb290VGl0bGUoKTsKKwkKKwlyZXR1cm4gcHJlZml4ICsgdGl0bGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRSb290VGl0bGUKKyAqIAorICogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSByb290IGNlbGwgaW4KKyAqIDxteEdyYXBoLm1vZGVsPi4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmdldFJvb3RUaXRsZSA9IGZ1bmN0aW9uICgpCit7CisJdmFyIHJvb3QgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCkuZ2V0Um9vdCgpOworCXJldHVybiB0aGlzLmdyYXBoLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKHJvb3QpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdW5kbworICogCisgKiBVbmRvIHRoZSBsYXN0IGNoYW5nZSBpbiA8Z3JhcGg+LgorICovCitteEVkaXRvci5wcm90b3R5cGUudW5kbyA9IGZ1bmN0aW9uICgpCit7CisJdGhpcy51bmRvTWFuYWdlci51bmRvKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWRvCisgKiAKKyAqIFJlZG8gdGhlIGxhc3QgY2hhbmdlIGluIDxncmFwaD4uCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5yZWRvID0gZnVuY3Rpb24gKCkKK3sKKwl0aGlzLnVuZG9NYW5hZ2VyLnJlZG8oKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdyb3VwQ2VsbHMKKyAqIAorICogSW52b2tlcyA8Y3JlYXRlR3JvdXA+IHRvIGNyZWF0ZSBhIG5ldyBncm91cCBjZWxsIGFuZCB0aGUgaW52b2tlcworICogPG14R3JhcGguZ3JvdXBDZWxscz4sIHVzaW5nIHRoZSBncmlkIHNpemUgb2YgdGhlIGdyYXBoIGFzIHRoZSBzcGFjaW5nCisgKiBpbiB0aGUgZ3JvdXAncyBjb250ZW50IGFyZWEuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5ncm91cENlbGxzID0gZnVuY3Rpb24gKCkKK3sKKwl2YXIgYm9yZGVyID0gKHRoaXMuZ3JvdXBCb3JkZXJTaXplICE9IG51bGwpID8KKwkJdGhpcy5ncm91cEJvcmRlclNpemUgOgorCQl0aGlzLmdyYXBoLmdyaWRTaXplOworCXJldHVybiB0aGlzLmdyYXBoLmdyb3VwQ2VsbHModGhpcy5jcmVhdGVHcm91cCgpLCBib3JkZXIpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlR3JvdXAKKyAqIAorICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGNsb25lIG9mIDxkZWZhdWx0R3JvdXA+IHRvIGJlIHVzZWQKKyAqIGFzIGEgbmV3IGdyb3VwIGNlbGwgaW4gPGdyb3VwPi4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmNyZWF0ZUdyb3VwID0gZnVuY3Rpb24gKCkKK3sKKwl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCk7CisJCisJcmV0dXJuIG1vZGVsLmNsb25lQ2VsbCh0aGlzLmRlZmF1bHRHcm91cCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBvcGVuCisgKiAKKyAqIE9wZW5zIHRoZSBzcGVjaWZpZWQgZmlsZSBzeW5jaHJvbm91c2x5IGFuZCBwYXJzZXMgaXQgdXNpbmcKKyAqIDxyZWFkR3JhcGhNb2RlbD4uIEl0IHVwZGF0ZXMgPGZpbGVuYW1lPiBhbmQgZmlyZXMgYW4gPG9wZW4+LWV2ZW50IGFmdGVyCisgKiB0aGUgZmlsZSBoYXMgYmVlbiBvcGVuZWQuIEV4Y2VwdGlvbnMgc2hvdWxkIGJlIGhhbmRsZWQgYXMgZm9sbG93czoKKyAqIAorICogKGNvZGUpCisgKiB0cnkKKyAqIHsKKyAqICAgZWRpdG9yLm9wZW4oZmlsZW5hbWUpOworICogfQorICogY2F0Y2ggKGUpCisgKiB7CisgKiAgIG14VXRpbHMuZXJyb3IoJ0Nhbm5vdCBvcGVuICcgKyBmaWxlbmFtZSArCisgKiAgICAgJzogJyArIGUubWVzc2FnZSwgMjgwLCB0cnVlKTsKKyAqIH0KKyAqIChlbmQpCisgKgorICogUGFyYW1ldGVyczoKKyAqIAorICogZmlsZW5hbWUgLSBVUkwgb2YgdGhlIGZpbGUgdG8gYmUgb3BlbmVkLgorICovCitteEVkaXRvci5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uIChmaWxlbmFtZSkKK3sKKwlpZiAoZmlsZW5hbWUgIT0gbnVsbCkKKwl7CisJCXZhciB4bWwgPSBteFV0aWxzLmxvYWQoZmlsZW5hbWUpLmdldFhtbCgpOworCQl0aGlzLnJlYWRHcmFwaE1vZGVsKHhtbC5kb2N1bWVudEVsZW1lbnQpOworCQl0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7CisJCQorCQl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50Lk9QRU4sICdmaWxlbmFtZScsIGZpbGVuYW1lKSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVhZEdyYXBoTW9kZWwKKyAqIAorICogUmVhZHMgdGhlIHNwZWNpZmllZCBYTUwgbm9kZSBpbnRvIHRoZSBleGlzdGluZyBncmFwaCBtb2RlbCBhbmQgcmVzZXRzCisgKiB0aGUgY29tbWFuZCBoaXN0b3J5IGFuZCBtb2RpZmllZCBzdGF0ZS4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLnJlYWRHcmFwaE1vZGVsID0gZnVuY3Rpb24gKG5vZGUpCit7CisJdmFyIGRlYyA9IG5ldyBteENvZGVjKG5vZGUub3duZXJEb2N1bWVudCk7CisJZGVjLmRlY29kZShub2RlLCB0aGlzLmdyYXBoLmdldE1vZGVsKCkpOworCXRoaXMucmVzZXRIaXN0b3J5KCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzYXZlCisgKiAKKyAqIFBvc3RzIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgPHdyaXRlR3JhcGhNb2RlbD4gdG8gdGhlIGdpdmVuIFVSTCBvciB0aGUKKyAqIFVSTCByZXR1cm5lZCBieSA8Z2V0VXJsUG9zdD4uIFRoZSBhY3R1YWwgcG9zdGluZyBpcyBjYXJyaWVkIG91dCBieQorICogPHBvc3REaWFncmFtPi4gSWYgdGhlIFVSTCBpcyBudWxsIHRoZW4gdGhlIHJlc3VsdGluZyBYTUwgd2lsbCBiZQorICogZGlzcGxheWVkIHVzaW5nIDxteFV0aWxzLnBvcHVwPi4gRXhjZXB0aW9ucyBzaG91bGQgYmUgaGFuZGxlZCBhcworICogZm9sbG93czoKKyAqIAorICogKGNvZGUpCisgKiB0cnkKKyAqIHsKKyAqICAgZWRpdG9yLnNhdmUoKTsKKyAqIH0KKyAqIGNhdGNoIChlKQorICogeworICogICBteFV0aWxzLmVycm9yKCdDYW5ub3Qgc2F2ZSA6ICcgKyBlLm1lc3NhZ2UsIDI4MCwgdHJ1ZSk7CisgKiB9CisgKiAoZW5kKQorICovCitteEVkaXRvci5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uICh1cmwsIGxpbmVmZWVkKQoreworCS8vIEdldHMgdGhlIFVSTCB0byBwb3N0IHRoZSBkYXRhIHRvCisJdXJsID0gdXJsIHx8IHRoaXMuZ2V0VXJsUG9zdCgpOworCisJLy8gUG9zdHMgdGhlIGRhdGEgaWYgdGhlIFVSTCBpcyBub3QgZW1wdHkKKwlpZiAodXJsICE9IG51bGwgJiYgdXJsLmxlbmd0aCA+IDApCisJeworCQl2YXIgZGF0YSA9IHRoaXMud3JpdGVHcmFwaE1vZGVsKGxpbmVmZWVkKTsKKwkJdGhpcy5wb3N0RGlhZ3JhbSh1cmwsIGRhdGEpOworCQkKKwkJLy8gUmVzZXRzIHRoZSBtb2RpZmllZCBmbGFnCisJCXRoaXMuc2V0TW9kaWZpZWQoZmFsc2UpOworCX0KKwkKKwkvLyBEaXNwYXRjaGVzIGEgc2F2ZSBldmVudAorCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuU0FWRSwgJ3VybCcsIHVybCkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcG9zdERpYWdyYW0KKyAqIAorICogSG9vayBmb3Igc3ViY2xhc3NlcnMgdG8gb3ZlcnJpZGUgdGhlIHBvc3Rpbmcgb2YgYSBkaWFncmFtCisgKiByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gbm9kZSB0byB0aGUgZ2l2ZW4gVVJMLiBUaGlzIGZpcmVzCisgKiBhbiBhc3luY2hyb25vdXMgPHBvc3Q+IGV2ZW50IGlmIHRoZSBkaWFncmFtIGhhcyBiZWVuIHBvc3RlZC4KKyAqIAorICogRXhhbXBsZToKKyAqIAorICogVG8gcmVwbGFjZSB0aGUgZGlhZ3JhbSB3aXRoIHRoZSBkaWFncmFtIGluIHRoZSByZXNwb25zZSwgdXNlIHRoZQorICogZm9sbG93aW5nIGNvZGUuCisgKiAKKyAqIChjb2RlKQorICogZWRpdG9yLmFkZExpc3RlbmVyKG14RXZlbnQuUE9TVCwgZnVuY3Rpb24oc2VuZGVyLCBldnQpCisgKiB7CisgKiAgIC8vIFByb2Nlc3MgcmVzcG9uc2UgKHJlcGxhY2UgZGlhZ3JhbSkKKyAqICAgdmFyIHJlcSA9IGV2dC5nZXRQcm9wZXJ0eSgncmVxdWVzdCcpOworICogICB2YXIgcm9vdCA9IHJlcS5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAqICAgZWRpdG9yLmdyYXBoLnJlYWRHcmFwaE1vZGVsKHJvb3QpCisgKiB9KTsKKyAqIChlbmQpCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5wb3N0RGlhZ3JhbSA9IGZ1bmN0aW9uICh1cmwsIGRhdGEpCit7CisJaWYgKHRoaXMuZXNjYXBlUG9zdERhdGEpCisJeworCQlkYXRhID0gZW5jb2RlVVJJQ29tcG9uZW50KGRhdGEpOworCX0KKworCW14VXRpbHMucG9zdCh1cmwsIHRoaXMucG9zdFBhcmFtZXRlck5hbWUrJz0nK2RhdGEsCisJCW14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihyZXEpCisJCXsKKwkJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuUE9TVCwKKwkJCQkncmVxdWVzdCcsIHJlcSwgJ3VybCcsIHVybCwgJ2RhdGEnLCBkYXRhKSk7CisJCX0pCisJKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHdyaXRlR3JhcGhNb2RlbAorICogCisgKiBIb29rIHRvIGNyZWF0ZSB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkaWFncmFtLiBUaGUgZGVmYXVsdAorICogaW1wbGVtZW50YXRpb24gdXNlcyBhbiA8bXhDb2RlYz4gdG8gZW5jb2RlIHRoZSBncmFwaCBtb2RlbCBhcworICogZm9sbG93czoKKyAqIAorICogKGNvZGUpCisgKiB2YXIgZW5jID0gbmV3IG14Q29kZWMoKTsKKyAqIHZhciBub2RlID0gZW5jLmVuY29kZSh0aGlzLmdyYXBoLmdldE1vZGVsKCkpOworICogcmV0dXJuIG14VXRpbHMuZ2V0WG1sKG5vZGUsIHRoaXMubGluZWZlZWQpOworICogKGVuZCkKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogbGluZWZlZWQgLSBPcHRpb25hbCBjaGFyYWN0ZXIgdG8gYmUgdXNlZCBhcyB0aGUgbGluZWZlZWQuIERlZmF1bHQgaXMKKyAqIDxsaW5lZmVlZD4uCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS53cml0ZUdyYXBoTW9kZWwgPSBmdW5jdGlvbiAobGluZWZlZWQpCit7CisJbGluZWZlZWQgPSAobGluZWZlZWQgIT0gbnVsbCkgPyBsaW5lZmVlZCA6IHRoaXMubGluZWZlZWQ7CisJdmFyIGVuYyA9IG5ldyBteENvZGVjKCk7CisJdmFyIG5vZGUgPSBlbmMuZW5jb2RlKHRoaXMuZ3JhcGguZ2V0TW9kZWwoKSk7CisKKwlyZXR1cm4gbXhVdGlscy5nZXRYbWwobm9kZSwgbGluZWZlZWQpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0VXJsUG9zdAorICogCisgKiBSZXR1cm5zIHRoZSBVUkwgdG8gcG9zdCB0aGUgZGlhZ3JhbSB0by4gVGhpcyBpcyB1c2VkCisgKiBpbiA8c2F2ZT4uIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgPHVybFBvc3Q+LAorICogYWRkaW5nIDxjb2RlPj9kcmFmdD10cnVlPC9jb2RlPi4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmdldFVybFBvc3QgPSBmdW5jdGlvbiAoKQoreworCXJldHVybiB0aGlzLnVybFBvc3Q7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRVcmxJbWFnZQorICogCisgKiBSZXR1cm5zIHRoZSBVUkwgdG8gY3JlYXRlIHRoZSBpbWFnZSB3aXRoLiBUaGlzIGlzIHR5cGljYWxseQorICogdGhlIFVSTCBvZiBhIGJhY2tlbmQgd2hpY2ggYWNjZXB0cyBhbiBYTUwgcmVwcmVzZW50YXRpb24KKyAqIG9mIGEgZ3JhcGggdmlldyB0byBjcmVhdGUgYW4gaW1hZ2UuIFRoZSBmdW5jdGlvbiBpcyB1c2VkCisgKiBpbiB0aGUgaW1hZ2UgYWN0aW9uIHRvIGNyZWF0ZSBhbiBpbWFnZS4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICogcmV0dXJucyA8dXJsSW1hZ2U+LgorICovCitteEVkaXRvci5wcm90b3R5cGUuZ2V0VXJsSW1hZ2UgPSBmdW5jdGlvbiAoKQoreworCXJldHVybiB0aGlzLnVybEltYWdlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc3dhcFN0eWxlcworICogCisgKiBTd2FwcyB0aGUgc3R5bGVzIGZvciB0aGUgZ2l2ZW4gbmFtZXMgaW4gdGhlIGdyYXBoJ3MKKyAqIHN0eWxlc2hlZXQgYW5kIHJlZnJlc2hlcyB0aGUgZ3JhcGguCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5zd2FwU3R5bGVzID0gZnVuY3Rpb24gKGZpcnN0LCBzZWNvbmQpCit7CisJdmFyIHN0eWxlID0gdGhpcy5ncmFwaC5nZXRTdHlsZXNoZWV0KCkuc3R5bGVzW3NlY29uZF07CisJdGhpcy5ncmFwaC5nZXRWaWV3KCkuZ2V0U3R5bGVzaGVldCgpLnB1dENlbGxTdHlsZSgKKwkJc2Vjb25kLCB0aGlzLmdyYXBoLmdldFN0eWxlc2hlZXQoKS5zdHlsZXNbZmlyc3RdKTsKKwl0aGlzLmdyYXBoLmdldFN0eWxlc2hlZXQoKS5wdXRDZWxsU3R5bGUoZmlyc3QsIHN0eWxlKTsKKwl0aGlzLmdyYXBoLnJlZnJlc2goKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNob3dQcm9wZXJ0aWVzCisgKiAKKyAqIENyZWF0ZXMgYW5kIHNob3dzIHRoZSBwcm9wZXJ0aWVzIGRpYWxvZyBmb3IgdGhlIGdpdmVuCisgKiBjZWxsLiBUaGUgY29udGVudCBhcmVhIG9mIHRoZSBkaWFsb2cgaXMgY3JlYXRlZCB1c2luZworICogPGNyZWF0ZVByb3BlcnRpZXM+LgorICovCitteEVkaXRvci5wcm90b3R5cGUuc2hvd1Byb3BlcnRpZXMgPSBmdW5jdGlvbiAoY2VsbCkKK3sKKwljZWxsID0gY2VsbCB8fCB0aGlzLmdyYXBoLmdldFNlbGVjdGlvbkNlbGwoKTsKKwkKKwkvLyBVc2VzIHRoZSByb290IG5vZGUgZm9yIHRoZSBwcm9wZXJ0aWVzIGRpYWxvZworCS8vIGlmIG5vdCBjZWxsIHdhcyBwYXNzZWQgaW4gYW5kIG5vIGNlbGwgaXMKKwkvLyBzZWxlY3RlZAorCWlmIChjZWxsID09IG51bGwpCisJeworCQljZWxsID0gdGhpcy5ncmFwaC5nZXRDdXJyZW50Um9vdCgpOworCQkKKwkJaWYgKGNlbGwgPT0gbnVsbCkKKwkJeworCQkJY2VsbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5nZXRSb290KCk7CisJCX0KKwl9CisJCisJaWYgKGNlbGwgIT0gbnVsbCkKKwl7CisJCS8vIE1ha2VzIHN1cmUgdGhlcmUgaXMgbm8gaW4tcGxhY2UgZWRpdG9yIGluIHRoZQorCQkvLyBncmFwaCBhbmQgY29tcHV0ZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBkaWFsb2cKKwkJdGhpcy5ncmFwaC5zdG9wRWRpdGluZyh0cnVlKTsKKworCQl2YXIgb2Zmc2V0ID0gbXhVdGlscy5nZXRPZmZzZXQodGhpcy5ncmFwaC5jb250YWluZXIpOworCQl2YXIgeCA9IG9mZnNldC54KzEwOworCQl2YXIgeSA9IG9mZnNldC55OworCQkKKwkJLy8gQXZvaWRzIG1vdmluZyB0aGUgZGlhbG9nIGlmIGl0IGlzIGFscmVkeSBvcGVuCisJCWlmICh0aGlzLnByb3BlcnRpZXMgIT0gbnVsbCAmJiAhdGhpcy5tb3ZlUHJvcGVydGllc0RpYWxvZykKKwkJeworCQkJeCA9IHRoaXMucHJvcGVydGllcy5nZXRYKCk7CisJCQl5ID0gdGhpcy5wcm9wZXJ0aWVzLmdldFkoKTsKKwkJfQorCQkKKwkJLy8gUGxhY2VzIHRoZSBkaWFsb2cgbmVhciB0aGUgY2VsbCBmb3Igd2hpY2ggaXQKKwkJLy8gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMKKwkJZWxzZQorCQl7CisJCQl2YXIgYm91bmRzID0gdGhpcy5ncmFwaC5nZXRDZWxsQm91bmRzKGNlbGwpOworCQkJCisJCQlpZiAoYm91bmRzICE9IG51bGwpCisJCQl7CisJCQkJeCArPSBib3VuZHMueCtNYXRoLm1pbigyMDAsIGJvdW5kcy53aWR0aCk7CisJCQkJeSArPSBib3VuZHMueTsJCQkJCisJCQl9CQkJCisJCX0KKwkJCisJCS8vIEhpZGVzIHRoZSBleGlzdGluZyBwcm9wZXJ0aWVzIGRpYWxvZyBhbmQgY3JlYXRlcyBhIG5ldyBvbmUgd2l0aCB0aGUKKwkJLy8gY29udGVudHMgY3JlYXRlZCBpbiB0aGUgaG9vayBtZXRob2QKKwkJdGhpcy5oaWRlUHJvcGVydGllcygpOworCQl2YXIgbm9kZSA9IHRoaXMuY3JlYXRlUHJvcGVydGllcyhjZWxsKTsKKwkJCisJCWlmIChub2RlICE9IG51bGwpCisJCXsKKwkJCS8vIERpc3BsYXlzIHRoZSBjb250ZW50cyBpbiBhIHdpbmRvdyBhbmQgc3RvcmVzIGEgcmVmZXJlbmNlIHRvIHRoZQorCQkJLy8gd2luZG93IGZvciBsYXRlciBoaWRpbmcgb2YgdGhlIHdpbmRvdworCQkJdGhpcy5wcm9wZXJ0aWVzID0gbmV3IG14V2luZG93KG14UmVzb3VyY2VzLmdldCh0aGlzLnByb3BlcnRpZXNSZXNvdXJjZSkgfHwKKwkJCQl0aGlzLnByb3BlcnRpZXNSZXNvdXJjZSwgbm9kZSwgeCwgeSwgdGhpcy5wcm9wZXJ0aWVzV2lkdGgsIHRoaXMucHJvcGVydGllc0hlaWdodCwgZmFsc2UpOworCQkJdGhpcy5wcm9wZXJ0aWVzLnNldFZpc2libGUodHJ1ZSk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1Byb3BlcnRpZXNWaXNpYmxlCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydGllcyBkaWFsb2cgaXMgY3VycmVudGx5IHZpc2libGUuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5pc1Byb3BlcnRpZXNWaXNpYmxlID0gZnVuY3Rpb24gKCkKK3sKKwlyZXR1cm4gdGhpcy5wcm9wZXJ0aWVzICE9IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVQcm9wZXJ0aWVzCisgKiAKKyAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIERPTSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgY29udGVudHMKKyAqIG9mIHRoZSBwcm9wZXJ0aWVzIGRpYWxvZyBmb3IgdGhlIGdpdmVuIGNlbGwuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIHdvcmtzIGZvciB1c2VyIG9iamVjdHMgdGhhdCBhcmUgWE1MIG5vZGVzIGFuZCBkaXNwbGF5IGFsbCB0aGUKKyAqIG5vZGUgYXR0cmlidXRlcyBpbiBhIGZvcm0uCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5jcmVhdGVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKGNlbGwpCit7CisJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpOworCXZhciB2YWx1ZSA9IG1vZGVsLmdldFZhbHVlKGNlbGwpOworCQorCWlmIChteFV0aWxzLmlzTm9kZSh2YWx1ZSkpCisJeworCQkvLyBDcmVhdGVzIGEgZm9ybSBmb3IgdGhlIHVzZXIgb2JqZWN0IGluc2lkZQorCQkvLyB0aGUgY2VsbAorCQl2YXIgZm9ybSA9IG5ldyBteEZvcm0oJ3Byb3BlcnRpZXMnKTsKKwkJCisJCS8vIEFkZHMgYSByZWFkb25seSBmaWVsZCBmb3IgdGhlIGNlbGwgaWQKKwkJdmFyIGlkID0gZm9ybS5hZGRUZXh0KCdJRCcsIGNlbGwuZ2V0SWQoKSk7CisJCWlkLnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAndHJ1ZScpOworCisJCXZhciBnZW8gPSBudWxsOworCQl2YXIgeUZpZWxkID0gbnVsbDsKKwkJdmFyIHhGaWVsZCA9IG51bGw7CisJCXZhciB3aWR0aEZpZWxkID0gbnVsbDsKKwkJdmFyIGhlaWdodEZpZWxkID0gbnVsbDsKKworCQkvLyBBZGRzIGZpZWxkcyBmb3IgdGhlIGxvY2F0aW9uIGFuZCBzaXplCisJCWlmIChtb2RlbC5pc1ZlcnRleChjZWxsKSkKKwkJeworCQkJZ2VvID0gbW9kZWwuZ2V0R2VvbWV0cnkoY2VsbCk7CisJCQkKKwkJCWlmIChnZW8gIT0gbnVsbCkKKwkJCXsKKwkJCQl5RmllbGQgPSBmb3JtLmFkZFRleHQoJ3RvcCcsIGdlby55KTsKKwkJCQl4RmllbGQgPSBmb3JtLmFkZFRleHQoJ2xlZnQnLCBnZW8ueCk7CisJCQkJd2lkdGhGaWVsZCA9IGZvcm0uYWRkVGV4dCgnd2lkdGgnLCBnZW8ud2lkdGgpOworCQkJCWhlaWdodEZpZWxkID0gZm9ybS5hZGRUZXh0KCdoZWlnaHQnLCBnZW8uaGVpZ2h0KTsKKwkJCX0KKwkJfQorCQkKKwkJLy8gQWRkcyBhIGZpZWxkIGZvciB0aGUgY2VsbCBzdHlsZQkJCQorCQl2YXIgdG1wID0gbW9kZWwuZ2V0U3R5bGUoY2VsbCk7CisJCXZhciBzdHlsZSA9IGZvcm0uYWRkVGV4dCgnU3R5bGUnLCB0bXAgfHwgJycpOworCQkKKwkJLy8gQ3JlYXRlcyB0ZXh0YXJlYXMgZm9yIGVhY2ggYXR0cmlidXRlIG9mIHRoZQorCQkvLyB1c2VyIG9iamVjdCB3aXRoaW4gdGhlIGNlbGwKKwkJdmFyIGF0dHJzID0gdmFsdWUuYXR0cmlidXRlczsKKwkJdmFyIHRleHRzID0gW107CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKQorCQl7CisJCQkvLyBDcmVhdGVzIGEgdGV4dGFyZWEgd2l0aCBtb3JlIGxpbmVzIGZvcgorCQkJLy8gdGhlIGNlbGwgbGFiZWwKKwkJCXZhciB2YWwgPSBhdHRyc1tpXS52YWx1ZTsKKwkJCXRleHRzW2ldID0gZm9ybS5hZGRUZXh0YXJlYShhdHRyc1tpXS5ub2RlTmFtZSwgdmFsLAorCQkJCShhdHRyc1tpXS5ub2RlTmFtZSA9PSAnbGFiZWwnKSA/IDQgOiAyKTsKKwkJfQorCQkKKwkJLy8gQWRkcyBhbiBPSyBhbmQgQ2FuY2VsIGJ1dHRvbiB0byB0aGUgZGlhbG9nCisJCS8vIGNvbnRlbnRzIGFuZCBpbXBsZW1lbnRzIHRoZSByZXNwZWN0aXZlCisJCS8vIGFjdGlvbnMgYmVsb3cKKwkJCisJCS8vIERlZmluZXMgdGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlCisJCS8vIE9LIGJ1dHRvbiBpcyBwcmVzc2VkIGluIHRoZSBkaWFsb2cKKwkJdmFyIG9rRnVuY3Rpb24gPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCQl7CisJCQkvLyBIaWRlcyB0aGUgZGlhbG9nCisJCQl0aGlzLmhpZGVQcm9wZXJ0aWVzKCk7CisJCQkKKwkJCS8vIFN1cHBvcnRzIHVuZG8gZm9yIHRoZSBjaGFuZ2VzIG9uIHRoZSB1bmRlcmx5aW5nCisJCQkvLyBYTUwgc3RydWN0dXJlIC8gWE1MIG5vZGUgYXR0cmlidXRlIGNoYW5nZXMuCisJCQltb2RlbC5iZWdpblVwZGF0ZSgpOworCQkJdHJ5CisJCQl7CisJCQkJaWYgKGdlbyAhPSBudWxsKQorCQkJCXsKKwkJCQkJZ2VvID0gZ2VvLmNsb25lKCk7CisJCQkJCQorCQkJCQlnZW8ueCA9IHBhcnNlRmxvYXQoeEZpZWxkLnZhbHVlKTsKKwkJCQkJZ2VvLnkgPSBwYXJzZUZsb2F0KHlGaWVsZC52YWx1ZSk7CisJCQkJCWdlby53aWR0aCA9IHBhcnNlRmxvYXQod2lkdGhGaWVsZC52YWx1ZSk7CisJCQkJCWdlby5oZWlnaHQgPSBwYXJzZUZsb2F0KGhlaWdodEZpZWxkLnZhbHVlKTsKKwkJCQkJCisJCQkJCW1vZGVsLnNldEdlb21ldHJ5KGNlbGwsIGdlbyk7CisJCQkJfQorCQkJCQorCQkJCS8vIEFwcGxpZXMgdGhlIHN0eWxlCisJCQkJaWYgKHN0eWxlLnZhbHVlLmxlbmd0aCA+IDApCisJCQkJeworCQkJCQltb2RlbC5zZXRTdHlsZShjZWxsLCBzdHlsZS52YWx1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW1vZGVsLnNldFN0eWxlKGNlbGwsIG51bGwpOworCQkJCX0KKwkJCQkKKwkJCQkvLyBDcmVhdGVzIGFuIHVuZG9hYmxlIGNoYW5nZSBmb3IgZWFjaAorCQkJCS8vIGF0dHJpYnV0ZSBhbmQgZXhlY3V0ZXMgaXQgdXNpbmcgdGhlCisJCQkJLy8gbW9kZWwsIHdoaWNoIHdpbGwgYWxzbyBtYWtlIHRoZSBjaGFuZ2UKKwkJCQkvLyBwYXJ0IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uCisJCQkJZm9yICh2YXIgaT0wOyBpPGF0dHJzLmxlbmd0aDsgaSsrKQorCQkJCXsKKwkJCQkJdmFyIGVkaXQgPSBuZXcgbXhDZWxsQXR0cmlidXRlQ2hhbmdlKAorCQkJCQkJY2VsbCwgYXR0cnNbaV0ubm9kZU5hbWUsCisJCQkJCQl0ZXh0c1tpXS52YWx1ZSk7CisJCQkJCW1vZGVsLmV4ZWN1dGUoZWRpdCk7CisJCQkJfQorCQkJCQorCQkJCS8vIENoZWNrcyBpZiB0aGUgZ3JhcGggd2FudHMgY2VsbHMgdG8gCisJCQkJLy8gYmUgYXV0b21hdGljYWxseSBzaXplZCBhbmQgdXBkYXRlcworCQkJCS8vIHRoZSBzaXplIGFzIGFuIHVuZG9hYmxlIHN0ZXAgaWYKKwkJCQkvLyB0aGUgZmVhdHVyZSBpcyBlbmFibGVkCisJCQkJaWYgKHRoaXMuZ3JhcGguaXNBdXRvU2l6ZUNlbGwoY2VsbCkpCisJCQkJeworCQkJCQl0aGlzLmdyYXBoLnVwZGF0ZUNlbGxTaXplKGNlbGwpOworCQkJCX0KKwkJCX0KKwkJCWZpbmFsbHkKKwkJCXsKKwkJCQltb2RlbC5lbmRVcGRhdGUoKTsKKwkJCX0KKwkJfSk7CisJCQorCQkvLyBEZWZpbmVzIHRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHRoZQorCQkvLyBDYW5jZWwgYnV0dG9uIGlzIHByZXNzZWQgaW4gdGhlIGRpYWxvZworCQl2YXIgY2FuY2VsRnVuY3Rpb24gPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCQl7CisJCQkvLyBIaWRlcyB0aGUgZGlhbG9nCisJCQl0aGlzLmhpZGVQcm9wZXJ0aWVzKCk7CisJCX0pOworCQkKKwkJZm9ybS5hZGRCdXR0b25zKG9rRnVuY3Rpb24sIGNhbmNlbEZ1bmN0aW9uKTsKKwkJCisJCXJldHVybiBmb3JtLnRhYmxlOworCX0KKworCXJldHVybiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaGlkZVByb3BlcnRpZXMKKyAqIAorICogSGlkZXMgdGhlIHByb3BlcnRpZXMgZGlhbG9nLgorICovCitteEVkaXRvci5wcm90b3R5cGUuaGlkZVByb3BlcnRpZXMgPSBmdW5jdGlvbiAoKQoreworCWlmICh0aGlzLnByb3BlcnRpZXMgIT0gbnVsbCkKKwl7CisJCXRoaXMucHJvcGVydGllcy5kZXN0cm95KCk7CisJCXRoaXMucHJvcGVydGllcyA9IG51bGw7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2hvd1Rhc2tzCisgKiAKKyAqIFNob3dzIHRoZSB0YXNrcyB3aW5kb3cuIFRoZSB0YXNrcyB3aW5kb3cgaXMgY3JlYXRlZCB1c2luZyA8Y3JlYXRlVGFza3M+LiBUaGUKKyAqIGRlZmF1bHQgd2lkdGggb2YgdGhlIHdpbmRvdyBpcyAyMDAgcGl4ZWxzLCB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSBsb2NhdGlvbgorICogY2FuIGJlIHNwZWNpZmllcyBpbiA8dGFza3NUb3A+IGFuZCB0aGUgeC1jb29yZGluYXRlIGlzIHJpZ2h0IGFsaWduZWQgd2l0aCBhCisgKiAyMCBwaXhlbCBvZmZzZXQgZnJvbSB0aGUgcmlnaHQgYm9yZGVyLiBUbyBjaGFuZ2UgdGhlIGxvY2F0aW9uIG9mIHRoZSB0YXNrcworICogd2luZG93LCB0aGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQ6CisgKiAKKyAqIChjb2RlKQorICogdmFyIG9sZFNob3dUYXNrcyA9IG14RWRpdG9yLnByb3RvdHlwZS5zaG93VGFza3M7CisgKiBteEVkaXRvci5wcm90b3R5cGUuc2hvd1Rhc2tzID0gZnVuY3Rpb24oKQorICogeworICogICBvbGRTaG93VGFza3MuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gInN1cGVyY2FsbCIKKyAqICAgCisgKiAgIGlmICh0aGlzLnRhc2tzICE9IG51bGwpCisgKiAgIHsKKyAqICAgICB0aGlzLnRhc2tzLnNldExvY2F0aW9uKDEwLCAxMCk7CisgKiAgIH0KKyAqIH07CisgKiAoZW5kKQorICovCitteEVkaXRvci5wcm90b3R5cGUuc2hvd1Rhc2tzID0gZnVuY3Rpb24gKCkKK3sKKwlpZiAodGhpcy50YXNrcyA9PSBudWxsKQorCXsKKwkJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworCQlkaXYuc3R5bGUucGFkZGluZyA9ICc0cHgnOworCQlkaXYuc3R5bGUucGFkZGluZ0xlZnQgPSAnMjBweCc7CisJCXZhciB3ID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDsKKwkJdmFyIHduZCA9IG5ldyBteFdpbmRvdygKKwkJCW14UmVzb3VyY2VzLmdldCh0aGlzLnRhc2tzUmVzb3VyY2UpIHx8CisJCQl0aGlzLnRhc2tzUmVzb3VyY2UsCisJCQlkaXYsIHcgLSAyMjAsIHRoaXMudGFza3NUb3AsIDIwMCk7CisJCXduZC5zZXRDbG9zYWJsZSh0cnVlKTsKKwkJd25kLmRlc3Ryb3lPbkNsb3NlID0gZmFsc2U7CisJCQorCQkvLyBJbnN0YWxscyBhIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgY29udGVudHMKKwkJLy8gb2YgdGhlIHRhc2tzIHdpbmRvdyBvbiBldmVyeSBjaGFuZ2Ugb2YgdGhlCisJCS8vIG1vZGVsLCBzZWxlY3Rpb24gb3Igcm9vdC4KKwkJdmFyIGZ1bmN0ID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKHNlbmRlcikKKwkJeworCQkJbXhFdmVudC5yZWxlYXNlKGRpdik7CisJCQlkaXYuaW5uZXJIVE1MID0gJyc7CisJCQl0aGlzLmNyZWF0ZVRhc2tzKGRpdik7CisJCX0pOworCQkKKwkJdGhpcy5ncmFwaC5nZXRNb2RlbCgpLmFkZExpc3RlbmVyKG14RXZlbnQuQ0hBTkdFLCBmdW5jdCk7CisJCXRoaXMuZ3JhcGguZ2V0U2VsZWN0aW9uTW9kZWwoKS5hZGRMaXN0ZW5lcihteEV2ZW50LkNIQU5HRSwgZnVuY3QpOworCQl0aGlzLmdyYXBoLmFkZExpc3RlbmVyKG14RXZlbnQuUk9PVCwgZnVuY3QpOworCQkKKwkJLy8gQXNzaWducyB0aGUgaWNvbiB0byB0aGUgdGFza3Mgd2luZG93CisJCWlmICh0aGlzLnRhc2tzV2luZG93SW1hZ2UgIT0gbnVsbCkKKwkJeworCQkJd25kLnNldEltYWdlKHRoaXMudGFza3NXaW5kb3dJbWFnZSk7CisJCX0KKwkJCisJCXRoaXMudGFza3MgPSB3bmQ7CisJCXRoaXMuY3JlYXRlVGFza3MoZGl2KTsKKwl9CisJCisJdGhpcy50YXNrcy5zZXRWaXNpYmxlKHRydWUpOworfTsKKwkJCisvKioKKyAqIEZ1bmN0aW9uOiByZWZyZXNoVGFza3MKKyAqIAorICogVXBkYXRlcyB0aGUgY29udGVudHMgb2YgdGhlIHRhc2tzIHdpbmRvdyB1c2luZyA8Y3JlYXRlVGFza3M+LgorICovCitteEVkaXRvci5wcm90b3R5cGUucmVmcmVzaFRhc2tzID0gZnVuY3Rpb24gKGRpdikKK3sKKwlpZiAodGhpcy50YXNrcyAhPSBudWxsKQorCXsKKwkJdmFyIGRpdiA9IHRoaXMudGFza3MuY29udGVudDsKKwkJbXhFdmVudC5yZWxlYXNlKGRpdik7CisJCWRpdi5pbm5lckhUTUwgPSAnJzsKKwkJdGhpcy5jcmVhdGVUYXNrcyhkaXYpOworCX0KK307CisJCQorLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlVGFza3MKKyAqIAorICogVXBkYXRlcyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIERPTSBub2RlIHRvCisgKiBkaXNwbGF5IHRoZSB0YXNrcyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQKKyAqIGVkaXRvciBzdGF0ZS4gVGhpcyBpcyBpbnZva2VkIHdoZW5ldmVyIHRoZXJlCisgKiBpcyBhIHBvc3NpYmxlIGNoYW5nZSBvZiBzdGF0ZSBpbiB0aGUgZWRpdG9yLgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eS4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmNyZWF0ZVRhc2tzID0gZnVuY3Rpb24gKGRpdikKK3sKKwkvLyBvdmVycmlkZQorfTsKKwkKKy8qKgorICogRnVuY3Rpb246IHNob3dIZWxwCisgKiAKKyAqIFNob3dzIHRoZSBoZWxwIHdpbmRvdy4gSWYgdGhlIGhlbHAgd2luZG93IGRvZXMgbm90IGV4aXN0CisgKiB0aGVuIGl0IGlzIGNyZWF0ZWQgdXNpbmcgYW4gaWZyYW1lIHBvaW50aW5nIHRvIHRoZSByZXNvdXJjZQorICogZm9yIHRoZSA8Y29kZT51cmxIZWxwPC9jb2RlPiBrZXkgb3IgPHVybEhlbHA+IGlmIHRoZSByZXNvdXJjZQorICogaXMgdW5kZWZpbmVkLgorICovCitteEVkaXRvci5wcm90b3R5cGUuc2hvd0hlbHAgPSBmdW5jdGlvbiAodGFza3MpCit7CisJaWYgKHRoaXMuaGVscCA9PSBudWxsKQorCXsKKwkJdmFyIGZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CisJCWZyYW1lLnNldEF0dHJpYnV0ZSgnc3JjJywgbXhSZXNvdXJjZXMuZ2V0KCd1cmxIZWxwJykgfHwgdGhpcy51cmxIZWxwKTsKKwkJZnJhbWUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnMTAwJScpOworCQlmcmFtZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzEwMCUnKTsKKwkJZnJhbWUuc2V0QXR0cmlidXRlKCdmcmFtZUJvcmRlcicsICcwJyk7CisJCWZyYW1lLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7CisJCisJCXZhciB3ID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDsKKwkJdmFyIGggPSAoZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCk7CisJCQorCQl2YXIgd25kID0gbmV3IG14V2luZG93KG14UmVzb3VyY2VzLmdldCh0aGlzLmhlbHBSZXNvdXJjZSkgfHwgdGhpcy5oZWxwUmVzb3VyY2UsCisJCQlmcmFtZSwgKHctdGhpcy5oZWxwV2lkdGgpLzIsIChoLXRoaXMuaGVscEhlaWdodCkvMywgdGhpcy5oZWxwV2lkdGgsIHRoaXMuaGVscEhlaWdodCk7CisJCXduZC5zZXRNYXhpbWl6YWJsZSh0cnVlKTsKKwkJd25kLnNldENsb3NhYmxlKHRydWUpOworCQl3bmQuZGVzdHJveU9uQ2xvc2UgPSBmYWxzZTsKKwkJd25kLnNldFJlc2l6YWJsZSh0cnVlKTsKKworCQkvLyBBc3NpZ25zIHRoZSBpY29uIHRvIHRoZSBoZWxwIHdpbmRvdworCQlpZiAodGhpcy5oZWxwV2luZG93SW1hZ2UgIT0gbnVsbCkKKwkJeworCQkJd25kLnNldEltYWdlKHRoaXMuaGVscFdpbmRvd0ltYWdlKTsKKwkJfQorCQkKKwkJLy8gV29ya2Fyb3VuZCBmb3IgaWdub3JlZCBpZnJhbWUgaGVpZ2h0IDEwMCUgaW4gRkYKKwkJaWYgKG14Q2xpZW50LklTX05TKQorCQl7CisJCQl2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKHNlbmRlcikKKwkJCXsKKwkJCQl2YXIgaCA9IHduZC5kaXYub2Zmc2V0SGVpZ2h0OworCQkJCWZyYW1lLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgKGgtMjYpKydweCcpOworCQkJfTsKKwkJCQorCQkJd25kLmFkZExpc3RlbmVyKG14RXZlbnQuUkVTSVpFX0VORCwgaGFuZGxlcik7CisJCQl3bmQuYWRkTGlzdGVuZXIobXhFdmVudC5NQVhJTUlaRSwgaGFuZGxlcik7CisJCQl3bmQuYWRkTGlzdGVuZXIobXhFdmVudC5OT1JNQUxJWkUsIGhhbmRsZXIpOworCQkJd25kLmFkZExpc3RlbmVyKG14RXZlbnQuU0hPVywgaGFuZGxlcik7CisJCX0KKwkJCisJCXRoaXMuaGVscCA9IHduZDsKKwl9CisJCisJdGhpcy5oZWxwLnNldFZpc2libGUodHJ1ZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzaG93T3V0bGluZQorICogCisgKiBTaG93cyB0aGUgb3V0bGluZSB3aW5kb3cuIElmIHRoZSB3aW5kb3cgZG9lcyBub3QgZXhpc3QsIHRoZW4gaXQgaXMKKyAqIGNyZWF0ZWQgdXNpbmcgYW4gPG14T3V0bGluZT4uCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5zaG93T3V0bGluZSA9IGZ1bmN0aW9uICgpCit7CisJdmFyIGNyZWF0ZSA9IHRoaXMub3V0bGluZSA9PSBudWxsOworCQorCWlmIChjcmVhdGUpCisJeworCQl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCQorCQlkaXYuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKKwkJZGl2LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKKwkJZGl2LnN0eWxlLndpZHRoID0gJzEwMCUnOworCQlkaXYuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnOworCQlkaXYuc3R5bGUuYmFja2dyb3VuZCA9ICd3aGl0ZSc7CisJCWRpdi5zdHlsZS5jdXJzb3IgPSAnbW92ZSc7CisJCQorCQlpZiAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09IDgpCisJCXsKKwkJCWRpdi5zdHlsZS5maWx0ZXIgPSAncHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmFscGhhKG9wYWNpdHk9MTAwKSc7CisJCX0KKwkJCisJCXZhciB3bmQgPSBuZXcgbXhXaW5kb3coCisJCQlteFJlc291cmNlcy5nZXQodGhpcy5vdXRsaW5lUmVzb3VyY2UpIHx8CisJCQl0aGlzLm91dGxpbmVSZXNvdXJjZSwKKwkJCWRpdiwgNjAwLCA0ODAsIDIwMCwgMjAwLCBmYWxzZSk7CisJCQkJCisJCS8vIENyZWF0ZXMgdGhlIG91dGxpbmUgaW4gdGhlIHNwZWNpZmllZCBkaXYKKwkJLy8gYW5kIGxpbmtzIGl0IHRvIHRoZSBleGlzdGluZyBncmFwaAorCQl2YXIgb3V0bGluZSA9IG5ldyBteE91dGxpbmUodGhpcy5ncmFwaCwgZGl2KTsJCQkKKwkJd25kLnNldENsb3NhYmxlKHRydWUpOworCQl3bmQuc2V0UmVzaXphYmxlKHRydWUpOworCQl3bmQuZGVzdHJveU9uQ2xvc2UgPSBmYWxzZTsKKwkJCisJCXduZC5hZGRMaXN0ZW5lcihteEV2ZW50LlJFU0laRV9FTkQsIGZ1bmN0aW9uKCkKKwkJeworCQkJb3V0bGluZS51cGRhdGUoKTsKKwkJfSk7CisJCQorCQl0aGlzLm91dGxpbmUgPSB3bmQ7CisJCXRoaXMub3V0bGluZS5vdXRsaW5lID0gb3V0bGluZTsKKwl9CisJCisJLy8gRmluYWxseSBzaG93cyB0aGUgb3V0bGluZQorCXRoaXMub3V0bGluZS5zZXRWaXNpYmxlKHRydWUpOworCXRoaXMub3V0bGluZS5vdXRsaW5lLnVwZGF0ZSh0cnVlKTsKK307CisJCQorLyoqCisgKiBGdW5jdGlvbjogc2V0TW9kZQorICoKKyAqIFB1dHMgdGhlIGdyYXBoIGludG8gdGhlIHNwZWNpZmllZCBtb2RlLiBUaGUgZm9sbG93aW5nIG1vZGVuYW1lcyBhcmUKKyAqIHN1cHBvcnRlZDoKKyAqIAorICogc2VsZWN0IC0gU2VsZWN0cyB1c2luZyB0aGUgbGVmdCBtb3VzZSBidXR0b24sIG5ldyBjb25uZWN0aW9ucworICogYXJlIGRpc2FibGVkLgorICogY29ubmVjdCAtIFNlbGVjdHMgdXNpbmcgdGhlIGxlZnQgbW91c2UgYnV0dG9uIG9yIGNyZWF0ZXMgbmV3CisgKiBjb25uZWN0aW9ucyBpZiBtb3VzZSBvdmVyIGNlbGwgaG90c3BvdC4gU2VlIDxteENvbm5lY3Rpb25IYW5kbGVyPi4KKyAqIHBhbiAtIFBhbnMgdXNpbmcgdGhlIGxlZnQgbW91c2UgYnV0dG9uLCBuZXcgY29ubmVjdGlvbnMgYXJlIGRpc2FibGVkLgorICovCitteEVkaXRvci5wcm90b3R5cGUuc2V0TW9kZSA9IGZ1bmN0aW9uKG1vZGVuYW1lKQoreworCWlmIChtb2RlbmFtZSA9PSAnc2VsZWN0JykKKwl7CisJCXRoaXMuZ3JhcGgucGFubmluZ0hhbmRsZXIudXNlTGVmdEJ1dHRvbkZvclBhbm5pbmcgPSBmYWxzZTsKKwkJdGhpcy5ncmFwaC5zZXRDb25uZWN0YWJsZShmYWxzZSk7CisJfQorCWVsc2UgaWYgKG1vZGVuYW1lID09ICdjb25uZWN0JykKKwl7CisJCXRoaXMuZ3JhcGgucGFubmluZ0hhbmRsZXIudXNlTGVmdEJ1dHRvbkZvclBhbm5pbmcgPSBmYWxzZTsKKwkJdGhpcy5ncmFwaC5zZXRDb25uZWN0YWJsZSh0cnVlKTsKKwl9CisJZWxzZSBpZiAobW9kZW5hbWUgPT0gJ3BhbicpCisJeworCQl0aGlzLmdyYXBoLnBhbm5pbmdIYW5kbGVyLnVzZUxlZnRCdXR0b25Gb3JQYW5uaW5nID0gdHJ1ZTsKKwkJdGhpcy5ncmFwaC5zZXRDb25uZWN0YWJsZShmYWxzZSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlUG9wdXBNZW51CisgKiAKKyAqIFVzZXMgPHBvcHVwSGFuZGxlcj4gdG8gY3JlYXRlIHRoZSBtZW51IGluIHRoZSBncmFwaCdzCisgKiBwYW5uaW5nIGhhbmRsZXIuIFRoZSByZWRpcmVjdGlvbiBpcyBzZXR1cCBpbgorICogPHNldFRvb2xiYXJDb250YWluZXI+LgorICovCitteEVkaXRvci5wcm90b3R5cGUuY3JlYXRlUG9wdXBNZW51ID0gZnVuY3Rpb24gKG1lbnUsIGNlbGwsIGV2dCkKK3sKKwl0aGlzLnBvcHVwSGFuZGxlci5jcmVhdGVNZW51KHRoaXMsIG1lbnUsIGNlbGwsIGV2dCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVFZGdlCisgKiAKKyAqIFVzZXMgPGRlZmF1bHRFZGdlPiBhcyB0aGUgcHJvdG90eXBlIGZvciBjcmVhdGluZyBuZXcgZWRnZXMKKyAqIGluIHRoZSBjb25uZWN0aW9uIGhhbmRsZXIgb2YgdGhlIGdyYXBoLiBUaGUgc3R5bGUgb2YgdGhlCisgKiBlZGdlIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICogPGdldEVkZ2VTdHlsZT4uCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5jcmVhdGVFZGdlID0gZnVuY3Rpb24gKHNvdXJjZSwgdGFyZ2V0KQoreworCS8vIENsb25lcyB0aGUgZGVmYXVsdGVkZ2UgcHJvdG90eXBlCisJdmFyIGUgPSBudWxsOworCQorCWlmICh0aGlzLmRlZmF1bHRFZGdlICE9IG51bGwpCisJeworCQl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCk7CisJCWUgPSBtb2RlbC5jbG9uZUNlbGwodGhpcy5kZWZhdWx0RWRnZSk7CisJfQorCWVsc2UKKwl7CisJCWUgPSBuZXcgbXhDZWxsKCcnKTsKKwkJZS5zZXRFZGdlKHRydWUpOworCQkKKwkJdmFyIGdlbyA9IG5ldyBteEdlb21ldHJ5KCk7CisJCWdlby5yZWxhdGl2ZSA9IHRydWU7CisJCWUuc2V0R2VvbWV0cnkoZ2VvKTsKKwl9CisJCisJLy8gT3ZlcnJpZGVzIHRoZSBlZGdlIHN0eWxlCisJdmFyIHN0eWxlID0gdGhpcy5nZXRFZGdlU3R5bGUoKTsKKwkKKwlpZiAoc3R5bGUgIT0gbnVsbCkKKwl7CisJCWUuc2V0U3R5bGUoc3R5bGUpOworCX0KKwkKKwlyZXR1cm4gZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEVkZ2VTdHlsZQorICogCisgKiBSZXR1cm5zIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBzdHlsZSBvZiBuZXcgZWRnZXMuCisgKiBUaGUgZnVuY3Rpb24gaXMgdXNlZCBpbiA8Y3JlYXRlRWRnZT4gd2hlbiBuZXcgZWRnZXMKKyAqIGFyZSBjcmVhdGVkIGluIHRoZSBncmFwaC4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmdldEVkZ2VTdHlsZSA9IGZ1bmN0aW9uICgpCit7CisJcmV0dXJuIHRoaXMuZGVmYXVsdEVkZ2VTdHlsZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNvbnN1bWVDeWNsZUF0dHJpYnV0ZQorICogCisgKiBSZXR1cm5zIHRoZSBuZXh0IGF0dHJpYnV0ZSBpbiA8Y3ljbGVBdHRyaWJ1dGVWYWx1ZXM+CisgKiBvciBudWxsLCBpZiBub3QgYXR0cmlidXRlIHNob3VsZCBiZSB1c2VkIGluIHRoZQorICogc3BlY2lmaWVkIGNlbGwuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5jb25zdW1lQ3ljbGVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoY2VsbCkKK3sKKwlyZXR1cm4gKHRoaXMuY3ljbGVBdHRyaWJ1dGVWYWx1ZXMgIT0gbnVsbCAmJgorCQl0aGlzLmN5Y2xlQXR0cmlidXRlVmFsdWVzLmxlbmd0aCA+IDAgJiYKKwkJdGhpcy5ncmFwaC5pc1N3aW1sYW5lKGNlbGwpKSA/CisJCXRoaXMuY3ljbGVBdHRyaWJ1dGVWYWx1ZXNbdGhpcy5jeWNsZUF0dHJpYnV0ZUluZGV4KysgJQorCQkJdGhpcy5jeWNsZUF0dHJpYnV0ZVZhbHVlcy5sZW5ndGhdIDogbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGN5Y2xlQXR0cmlidXRlCisgKiAKKyAqIFVzZXMgdGhlIHJldHVybmVkIHZhbHVlIGZyb20gPGNvbnN1bWVDeWNsZUF0dHJpYnV0ZT4KKyAqIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIDxjeWNsZUF0dHJpYnV0ZU5hbWU+IGtleSBpbgorICogdGhlIGdpdmVuIGNlbGwncyBzdHlsZS4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmN5Y2xlQXR0cmlidXRlID0gZnVuY3Rpb24gKGNlbGwpCit7CisJaWYgKHRoaXMuY3ljbGVBdHRyaWJ1dGVOYW1lICE9IG51bGwpCisJeworCQl2YXIgdmFsdWUgPSB0aGlzLmNvbnN1bWVDeWNsZUF0dHJpYnV0ZShjZWxsKTsKKwkJCisJCWlmICh2YWx1ZSAhPSBudWxsKQorCQl7CisJCQljZWxsLnNldFN0eWxlKGNlbGwuZ2V0U3R5bGUoKSsnOycrCisJCQkJdGhpcy5jeWNsZUF0dHJpYnV0ZU5hbWUrJz0nK3ZhbHVlKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZFZlcnRleAorICogCisgKiBBZGRzIHRoZSBnaXZlbiB2ZXJ0ZXggYXMgYSBjaGlsZCBvZiBwYXJlbnQgYXQgdGhlIHNwZWNpZmllZAorICogeCBhbmQgeSBjb29yZGluYXRlIGFuZCBmaXJlcyBhbiA8YWRkVmVydGV4PiBldmVudC4KKyAqLworbXhFZGl0b3IucHJvdG90eXBlLmFkZFZlcnRleCA9IGZ1bmN0aW9uIChwYXJlbnQsIHZlcnRleCwgeCwgeSkKK3sKKwl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCk7CisJCisJd2hpbGUgKHBhcmVudCAhPSBudWxsICYmICF0aGlzLmdyYXBoLmlzVmFsaWREcm9wVGFyZ2V0KHBhcmVudCkpCisJeworCQlwYXJlbnQgPSBtb2RlbC5nZXRQYXJlbnQocGFyZW50KTsKKwl9CisJCisJcGFyZW50ID0gKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudCA6IHRoaXMuZ3JhcGguZ2V0U3dpbWxhbmVBdCh4LCB5KTsKKwl2YXIgc2NhbGUgPSB0aGlzLmdyYXBoLmdldFZpZXcoKS5zY2FsZTsKKwkKKwl2YXIgZ2VvID0gbW9kZWwuZ2V0R2VvbWV0cnkodmVydGV4KTsKKwl2YXIgcGdlbyA9IG1vZGVsLmdldEdlb21ldHJ5KHBhcmVudCk7CisJCisJaWYgKHRoaXMuZ3JhcGguaXNTd2ltbGFuZSh2ZXJ0ZXgpICYmCisJCSF0aGlzLmdyYXBoLnN3aW1sYW5lTmVzdGluZykKKwl7CisJCXBhcmVudCA9IG51bGw7CisJfQorCWVsc2UgaWYgKHBhcmVudCA9PSBudWxsICYmIHRoaXMuc3dpbWxhbmVSZXF1aXJlZCkKKwl7CisJCXJldHVybiBudWxsOworCX0KKwllbHNlIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBwZ2VvICE9IG51bGwpCisJeworCQkvLyBLZWVwcyB2ZXJ0ZXggaW5zaWRlIHBhcmVudAorCQl2YXIgc3RhdGUgPSB0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXRTdGF0ZShwYXJlbnQpOworCQkKKwkJaWYgKHN0YXRlICE9IG51bGwpCisJCXsJCQkKKwkJCXggLT0gc3RhdGUub3JpZ2luLnggKiBzY2FsZTsKKwkJCXkgLT0gc3RhdGUub3JpZ2luLnkgKiBzY2FsZTsKKwkJCQorCQkJaWYgKHRoaXMuZ3JhcGguaXNDb25zdHJhaW5lZE1vdmluZykKKwkJCXsKKwkJCQl2YXIgd2lkdGggPSBnZW8ud2lkdGg7CisJCQkJdmFyIGhlaWdodCA9IGdlby5oZWlnaHQ7CQkJCQorCQkJCXZhciB0bXAgPSBzdGF0ZS54K3N0YXRlLndpZHRoOworCQkJCQorCQkJCWlmICh4K3dpZHRoID4gdG1wKQorCQkJCXsKKwkJCQkJeCAtPSB4K3dpZHRoIC0gdG1wOworCQkJCX0KKwkJCQkKKwkJCQl0bXAgPSBzdGF0ZS55K3N0YXRlLmhlaWdodDsKKwkJCQkKKwkJCQlpZiAoeStoZWlnaHQgPiB0bXApCisJCQkJeworCQkJCQl5IC09IHkraGVpZ2h0IC0gdG1wOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIGlmIChwZ2VvICE9IG51bGwpCisJCXsKKwkJCXggLT0gcGdlby54KnNjYWxlOworCQkJeSAtPSBwZ2VvLnkqc2NhbGU7CisJCX0KKwl9CisJCisJZ2VvID0gZ2VvLmNsb25lKCk7CisJZ2VvLnggPSB0aGlzLmdyYXBoLnNuYXAoeCAvIHNjYWxlIC0KKwkJdGhpcy5ncmFwaC5nZXRWaWV3KCkudHJhbnNsYXRlLnggLQorCQl0aGlzLmdyYXBoLmdyaWRTaXplLzIpOworCWdlby55ID0gdGhpcy5ncmFwaC5zbmFwKHkgLyBzY2FsZSAtCisJCXRoaXMuZ3JhcGguZ2V0VmlldygpLnRyYW5zbGF0ZS55IC0KKwkJdGhpcy5ncmFwaC5ncmlkU2l6ZS8yKTsKKwl2ZXJ0ZXguc2V0R2VvbWV0cnkoZ2VvKTsKKwkKKwlpZiAocGFyZW50ID09IG51bGwpCisJeworCQlwYXJlbnQgPSB0aGlzLmdyYXBoLmdldERlZmF1bHRQYXJlbnQoKTsKKwl9CisKKwl0aGlzLmN5Y2xlQXR0cmlidXRlKHZlcnRleCk7CisJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5CRUZPUkVfQUREX1ZFUlRFWCwKKwkJCSd2ZXJ0ZXgnLCB2ZXJ0ZXgsICdwYXJlbnQnLCBwYXJlbnQpKTsKKworCW1vZGVsLmJlZ2luVXBkYXRlKCk7CisJdHJ5CisJeworCQl2ZXJ0ZXggPSB0aGlzLmdyYXBoLmFkZENlbGwodmVydGV4LCBwYXJlbnQpOworCQkKKwkJaWYgKHZlcnRleCAhPSBudWxsKQorCQl7CisJCQl0aGlzLmdyYXBoLmNvbnN0cmFpbkNoaWxkKHZlcnRleCk7CisJCQkKKwkJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuQUREX1ZFUlRFWCwgJ3ZlcnRleCcsIHZlcnRleCkpOworCQl9CisJfQorCWZpbmFsbHkKKwl7CisJCW1vZGVsLmVuZFVwZGF0ZSgpOworCX0KKwkKKwlpZiAodmVydGV4ICE9IG51bGwpCisJeworCQl0aGlzLmdyYXBoLnNldFNlbGVjdGlvbkNlbGwodmVydGV4KTsKKwkJdGhpcy5ncmFwaC5zY3JvbGxDZWxsVG9WaXNpYmxlKHZlcnRleCk7CisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuQUZURVJfQUREX1ZFUlRFWCwgJ3ZlcnRleCcsIHZlcnRleCkpOworCX0KKwkKKwlyZXR1cm4gdmVydGV4OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZGVzdHJveQorICogCisgKiBSZW1vdmVzIHRoZSBlZGl0b3IgYW5kIGFsbCBpdHMgYXNzb2NpYXRlZCByZXNvdXJjZXMuIFRoaXMgZG9lcyBub3QKKyAqIG5vcm1hbGx5IG5lZWQgdG8gYmUgY2FsbGVkLCBpdCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSB3aW5kb3cKKyAqIHVubG9hZHMuCisgKi8KK214RWRpdG9yLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkKK3sKKwlpZiAoIXRoaXMuZGVzdHJveWVkKQorCXsKKwkJdGhpcy5kZXN0cm95ZWQgPSB0cnVlOworCisJCWlmICh0aGlzLnRhc2tzICE9IG51bGwpCisJCXsKKwkJCXRoaXMudGFza3MuZGVzdHJveSgpOworCQl9CisJCQorCQlpZiAodGhpcy5vdXRsaW5lICE9IG51bGwpCisJCXsKKwkJCXRoaXMub3V0bGluZS5kZXN0cm95KCk7CisJCX0KKwkJCisJCWlmICh0aGlzLnByb3BlcnRpZXMgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5wcm9wZXJ0aWVzLmRlc3Ryb3koKTsKKwkJfQorCQkKKwkJaWYgKHRoaXMua2V5SGFuZGxlciAhPSBudWxsKQorCQl7CisJCQl0aGlzLmtleUhhbmRsZXIuZGVzdHJveSgpOworCQl9CisJCQorCQlpZiAodGhpcy5ydWJiZXJiYW5kICE9IG51bGwpCisJCXsKKwkJCXRoaXMucnViYmVyYmFuZC5kZXN0cm95KCk7CisJCX0KKwkJCisJCWlmICh0aGlzLnRvb2xiYXIgIT0gbnVsbCkKKwkJeworCQkJdGhpcy50b29sYmFyLmRlc3Ryb3koKTsKKwkJfQorCQkKKwkJaWYgKHRoaXMuZ3JhcGggIT0gbnVsbCkKKwkJeworCQkJdGhpcy5ncmFwaC5kZXN0cm95KCk7CisJCX0KKwkKKwkJdGhpcy5zdGF0dXMgPSBudWxsOworCQl0aGlzLnRlbXBsYXRlcyA9IG51bGw7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214Q2VsbEhpZ2hsaWdodC5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214Q2VsbEhpZ2hsaWdodC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzczODZhCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhDZWxsSGlnaGxpZ2h0LmpzCkBAIC0wLDAgKzEsMzE0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteENlbGxIaWdobGlnaHQKKyAqIAorICogQSBoZWxwZXIgY2xhc3MgdG8gaGlnaGxpZ2h0IGNlbGxzLiBIZXJlIGlzIGFuIGV4YW1wbGUgZm9yIGEgZ2l2ZW4gY2VsbC4KKyAqIAorICogKGNvZGUpCisgKiB2YXIgaGlnaGxpZ2h0ID0gbmV3IG14Q2VsbEhpZ2hsaWdodChncmFwaCwgJyNmZjAwMDAnLCAyKTsKKyAqIGhpZ2hsaWdodC5oaWdobGlnaHQoZ3JhcGgudmlldy5nZXRTdGF0ZShjZWxsKSkpOworICogKGVuZCkKKyAqIAorICogQ29uc3RydWN0b3I6IG14Q2VsbEhpZ2hsaWdodAorICogCisgKiBDb25zdHJ1Y3RzIGEgY2VsbCBoaWdobGlnaHQuCisgKi8KK2Z1bmN0aW9uIG14Q2VsbEhpZ2hsaWdodChncmFwaCwgaGlnaGxpZ2h0Q29sb3IsIHN0cm9rZVdpZHRoLCBkYXNoZWQpCit7CisJaWYgKGdyYXBoICE9IG51bGwpCisJeworCQl0aGlzLmdyYXBoID0gZ3JhcGg7CisJCXRoaXMuaGlnaGxpZ2h0Q29sb3IgPSAoaGlnaGxpZ2h0Q29sb3IgIT0gbnVsbCkgPyBoaWdobGlnaHRDb2xvciA6IG14Q29uc3RhbnRzLkRFRkFVTFRfVkFMSURfQ09MT1I7CisJCXRoaXMuc3Ryb2tlV2lkdGggPSAoc3Ryb2tlV2lkdGggIT0gbnVsbCkgPyBzdHJva2VXaWR0aCA6IG14Q29uc3RhbnRzLkhJR0hMSUdIVF9TVFJPS0VXSURUSDsKKwkJdGhpcy5kYXNoZWQgPSAoZGFzaGVkICE9IG51bGwpID8gZGFzaGVkIDogZmFsc2U7CisJCXRoaXMub3BhY2l0eSA9IG14Q29uc3RhbnRzLkhJR0hMSUdIVF9PUEFDSVRZOworCisJCS8vIFVwZGF0ZXMgdGhlIG1hcmtlciBpZiB0aGUgZ3JhcGggY2hhbmdlcworCQl0aGlzLnJlcGFpbnRIYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKCkKKwkJeworCQkJLy8gVXBkYXRlcyByZWZlcmVuY2UgdG8gc3RhdGUKKwkJCWlmICh0aGlzLnN0YXRlICE9IG51bGwpCisJCQl7CisJCQkJdmFyIHRtcCA9IHRoaXMuZ3JhcGgudmlldy5nZXRTdGF0ZSh0aGlzLnN0YXRlLmNlbGwpOworCQkJCQorCQkJCWlmICh0bXAgPT0gbnVsbCkKKwkJCQl7CisJCQkJCXRoaXMuaGlkZSgpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl0aGlzLnN0YXRlID0gdG1wOworCQkJCQl0aGlzLnJlcGFpbnQoKTsKKwkJCQl9CisJCQl9CisJCX0pOworCisJCXRoaXMuZ3JhcGguZ2V0VmlldygpLmFkZExpc3RlbmVyKG14RXZlbnQuU0NBTEUsIHRoaXMucmVwYWludEhhbmRsZXIpOworCQl0aGlzLmdyYXBoLmdldFZpZXcoKS5hZGRMaXN0ZW5lcihteEV2ZW50LlRSQU5TTEFURSwgdGhpcy5yZXBhaW50SGFuZGxlcik7CisJCXRoaXMuZ3JhcGguZ2V0VmlldygpLmFkZExpc3RlbmVyKG14RXZlbnQuU0NBTEVfQU5EX1RSQU5TTEFURSwgdGhpcy5yZXBhaW50SGFuZGxlcik7CisJCXRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5hZGRMaXN0ZW5lcihteEV2ZW50LkNIQU5HRSwgdGhpcy5yZXBhaW50SGFuZGxlcik7CisJCQorCQkvLyBIaWRlcyB0aGUgbWFya2VyIGlmIHRoZSBjdXJyZW50IHJvb3QgY2hhbmdlcworCQl0aGlzLnJlc2V0SGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbigpCisJCXsKKwkJCXRoaXMuaGlkZSgpOworCQl9KTsKKworCQl0aGlzLmdyYXBoLmdldFZpZXcoKS5hZGRMaXN0ZW5lcihteEV2ZW50LkRPV04sIHRoaXMucmVzZXRIYW5kbGVyKTsKKwkJdGhpcy5ncmFwaC5nZXRWaWV3KCkuYWRkTGlzdGVuZXIobXhFdmVudC5VUCwgdGhpcy5yZXNldEhhbmRsZXIpOworCX0KK307CisKKy8qKgorICogVmFyaWFibGU6IGtlZXBPblRvcAorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIGhpZ2hsaWdodHMgc2hvdWxkIGFwcGVhciBvbiB0b3Agb2YgZXZlcnl0aGluZworICogZWxzZSBpbiB0aGUgb3ZlcmxheSBwYW5lLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteENlbGxIaWdobGlnaHQucHJvdG90eXBlLmtlZXBPblRvcCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBncmFwaAorICogCisgKiBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKi8KK214Q2VsbEhpZ2hsaWdodC5wcm90b3R5cGUuZ3JhcGggPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBzdGF0ZQorICogCisgKiBSZWZlcmVuY2UgdG8gdGhlIDxteENlbGxTdGF0ZT4uCisgKi8KK214Q2VsbEhpZ2hsaWdodC5wcm90b3R5cGUuc3RhdGUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzcGFjaW5nCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgc3BhY2luZyBiZXR3ZWVuIHRoZSBoaWdobGlnaHQgZm9yIHZlcnRpY2VzIGFuZCB0aGUgdmVydGV4LgorICogRGVmYXVsdCBpcyAyLgorICovCitteENlbGxIaWdobGlnaHQucHJvdG90eXBlLnNwYWNpbmcgPSAyOworCisvKioKKyAqIFZhcmlhYmxlOiByZXNldEhhbmRsZXIKKyAqIAorICogSG9sZHMgdGhlIGhhbmRsZXIgdGhhdCBhdXRvbWF0aWNhbGx5IGludm9rZXMgcmVzZXQgaWYgdGhlIGhpZ2hsaWdodAorICogc2hvdWxkIGJlIGhpZGRlbi4KKyAqLworbXhDZWxsSGlnaGxpZ2h0LnByb3RvdHlwZS5yZXNldEhhbmRsZXIgPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRIaWdobGlnaHRDb2xvcgorICogCisgKiBTZXRzIHRoZSBjb2xvciBvZiB0aGUgcmVjdGFuZ2xlIHVzZWQgdG8gaGlnaGxpZ2h0IGRyb3AgdGFyZ2V0cy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY29sb3IgLSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBuZXcgaGlnaGxpZ2h0IGNvbG9yLgorICovCitteENlbGxIaWdobGlnaHQucHJvdG90eXBlLnNldEhpZ2hsaWdodENvbG9yID0gZnVuY3Rpb24oY29sb3IpCit7CisJdGhpcy5oaWdobGlnaHRDb2xvciA9IGNvbG9yOworCQorCWlmICh0aGlzLnNoYXBlICE9IG51bGwpCisJeworCQl0aGlzLnNoYXBlLnN0cm9rZSA9IGNvbG9yOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGRyYXdIaWdobGlnaHQKKyAqIAorICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgaGlnaGxpZ2h0IHNoYXBlIGZvciB0aGUgZ2l2ZW4gc3RhdGUuCisgKi8KK214Q2VsbEhpZ2hsaWdodC5wcm90b3R5cGUuZHJhd0hpZ2hsaWdodCA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnNoYXBlID0gdGhpcy5jcmVhdGVTaGFwZSgpOworCXRoaXMucmVwYWludCgpOworCisJaWYgKCF0aGlzLmtlZXBPblRvcCAmJiB0aGlzLnNoYXBlLm5vZGUucGFyZW50Tm9kZS5maXJzdENoaWxkICE9IHRoaXMuc2hhcGUubm9kZSkKKwl7CisJCXRoaXMuc2hhcGUubm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnNoYXBlLm5vZGUsIHRoaXMuc2hhcGUubm9kZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVNoYXBlCisgKiAKKyAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGhpZ2hsaWdodCBzaGFwZSBmb3IgdGhlIGdpdmVuIHN0YXRlLgorICovCitteENlbGxIaWdobGlnaHQucHJvdG90eXBlLmNyZWF0ZVNoYXBlID0gZnVuY3Rpb24oKQoreworCXZhciBzaGFwZSA9IHRoaXMuZ3JhcGguY2VsbFJlbmRlcmVyLmNyZWF0ZVNoYXBlKHRoaXMuc3RhdGUpOworCQorCXNoYXBlLnN2Z1N0cm9rZVRvbGVyYW5jZSA9IHRoaXMuZ3JhcGgudG9sZXJhbmNlOworCXNoYXBlLnBvaW50cyA9IHRoaXMuc3RhdGUuYWJzb2x1dGVQb2ludHM7CisJc2hhcGUuYXBwbHkodGhpcy5zdGF0ZSk7CisJc2hhcGUuc3Ryb2tlID0gdGhpcy5oaWdobGlnaHRDb2xvcjsKKwlzaGFwZS5vcGFjaXR5ID0gdGhpcy5vcGFjaXR5OworCXNoYXBlLmlzRGFzaGVkID0gdGhpcy5kYXNoZWQ7CisJc2hhcGUuaXNTaGFkb3cgPSBmYWxzZTsKKwkKKwlzaGFwZS5kaWFsZWN0ID0gKHRoaXMuZ3JhcGguZGlhbGVjdCAhPSBteENvbnN0YW50cy5ESUFMRUNUX1NWRykgPyBteENvbnN0YW50cy5ESUFMRUNUX1ZNTCA6IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHOworCXNoYXBlLmluaXQodGhpcy5ncmFwaC5nZXRWaWV3KCkuZ2V0T3ZlcmxheVBhbmUoKSk7CisJbXhFdmVudC5yZWRpcmVjdE1vdXNlRXZlbnRzKHNoYXBlLm5vZGUsIHRoaXMuZ3JhcGgsIHRoaXMuc3RhdGUpOworCQorCWlmICh0aGlzLmdyYXBoLmRpYWxlY3QgIT0gbXhDb25zdGFudHMuRElBTEVDVF9TVkcpCisJeworCQlzaGFwZS5wb2ludGVyRXZlbnRzID0gZmFsc2U7CisJfQorCWVsc2UKKwl7CisJCXNoYXBlLnN2Z1BvaW50ZXJFdmVudHMgPSAnc3Ryb2tlJzsKKwl9CisJCisJcmV0dXJuIHNoYXBlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVwYWludAorICogCisgKiBVcGRhdGVzIHRoZSBoaWdobGlnaHQgYWZ0ZXIgYSBjaGFuZ2Ugb2YgdGhlIG1vZGVsIG9yIHZpZXcuCisgKi8KK214Q2VsbEhpZ2hsaWdodC5wcm90b3R5cGUuZ2V0U3Ryb2tlV2lkdGggPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlyZXR1cm4gdGhpcy5zdHJva2VXaWR0aDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlcGFpbnQKKyAqIAorICogVXBkYXRlcyB0aGUgaGlnaGxpZ2h0IGFmdGVyIGEgY2hhbmdlIG9mIHRoZSBtb2RlbCBvciB2aWV3LgorICovCitteENlbGxIaWdobGlnaHQucHJvdG90eXBlLnJlcGFpbnQgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMuc3RhdGUgIT0gbnVsbCAmJiB0aGlzLnNoYXBlICE9IG51bGwpCisJeworCQl0aGlzLnNoYXBlLnNjYWxlID0gdGhpcy5zdGF0ZS52aWV3LnNjYWxlOworCQkKKwkJaWYgKHRoaXMuZ3JhcGgubW9kZWwuaXNFZGdlKHRoaXMuc3RhdGUuY2VsbCkpCisJCXsKKwkJCXRoaXMuc2hhcGUuc3Ryb2tld2lkdGggPSB0aGlzLmdldFN0cm9rZVdpZHRoKCk7CisJCQl0aGlzLnNoYXBlLnBvaW50cyA9IHRoaXMuc3RhdGUuYWJzb2x1dGVQb2ludHM7CisJCQl0aGlzLnNoYXBlLm91dGxpbmUgPSBmYWxzZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRoaXMuc2hhcGUuYm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKHRoaXMuc3RhdGUueCAtIHRoaXMuc3BhY2luZywgdGhpcy5zdGF0ZS55IC0gdGhpcy5zcGFjaW5nLAorCQkJCQl0aGlzLnN0YXRlLndpZHRoICsgMiAqIHRoaXMuc3BhY2luZywgdGhpcy5zdGF0ZS5oZWlnaHQgKyAyICogdGhpcy5zcGFjaW5nKTsKKwkJCXRoaXMuc2hhcGUucm90YXRpb24gPSBOdW1iZXIodGhpcy5zdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9ST1RBVElPTl0gfHwgJzAnKTsKKwkJCXRoaXMuc2hhcGUuc3Ryb2tld2lkdGggPSB0aGlzLmdldFN0cm9rZVdpZHRoKCkgLyB0aGlzLnN0YXRlLnZpZXcuc2NhbGU7CisJCQl0aGlzLnNoYXBlLm91dGxpbmUgPSB0cnVlOworCQl9CisKKwkJLy8gVXNlcyBjdXJzb3IgZnJvbSBzaGFwZSBpbiBoaWdobGlnaHQKKwkJaWYgKHRoaXMuc3RhdGUuc2hhcGUgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5zaGFwZS5zZXRDdXJzb3IodGhpcy5zdGF0ZS5zaGFwZS5nZXRDdXJzb3IoKSk7CisJCX0KKwkJCisJCS8vIFdvcmthcm91bmQgZm9yIGV2ZW50IHRyYW5zcGFyZW5jeSBpbiBWTUwgd2l0aCB0cmFuc3BhcmVudCBjb2xvcgorCQkvLyBpcyB0byB1c2UgYSBub24tdHJhbnNwYXJlbnQgY29sb3Igd2l0aCBuZWFyIHplcm8gb3BhY2l0eQorCQlpZiAobXhDbGllbnQuSVNfUVVJUktTIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSA4KQorCQl7CisJCQlpZiAodGhpcy5zaGFwZS5zdHJva2UgPT0gJ3RyYW5zcGFyZW50JykKKwkJCXsKKwkJCQkvLyBLTk9XTjogUXVpcmtzIG1vZGUgZG9lcyBub3Qgc2VlbSB0byBjYXRjaCBldmVudHMgaWYKKwkJCQkvLyB3ZSBkbyBub3QgZm9yY2UgYW4gdXBkYXRlIG9mIHRoZSBET00gdmlhIGEgY2hhbmdlIHN1Y2gKKwkJCQkvLyBhcyBteExvZy5kZWJ1Zy4gU2luY2UgSUU2IGlzIEVPTCB3ZSBkbyBub3QgYWRkIGEgZml4LgorCQkJCXRoaXMuc2hhcGUuc3Ryb2tlID0gJ3doaXRlJzsKKwkJCQl0aGlzLnNoYXBlLm9wYWNpdHkgPSAxOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRoaXMuc2hhcGUub3BhY2l0eSA9IHRoaXMub3BhY2l0eTsKKwkJCX0KKwkJfQorCQkKKwkJdGhpcy5zaGFwZS5yZWRyYXcoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBoaWRlCisgKiAKKyAqIFJlc2V0cyB0aGUgc3RhdGUgb2YgdGhlIGNlbGwgbWFya2VyLgorICovCitteENlbGxIaWdobGlnaHQucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbigpCit7CisJdGhpcy5oaWdobGlnaHQobnVsbCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtYXJrCisgKiAKKyAqIE1hcmtzIHRoZSA8bWFya2VkU3RhdGU+IGFuZCBmaXJlcyBhIDxtYXJrPiBldmVudC4KKyAqLworbXhDZWxsSGlnaGxpZ2h0LnByb3RvdHlwZS5oaWdobGlnaHQgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlpZiAodGhpcy5zdGF0ZSAhPSBzdGF0ZSkKKwl7CisJCWlmICh0aGlzLnNoYXBlICE9IG51bGwpCisJCXsKKwkJCXRoaXMuc2hhcGUuZGVzdHJveSgpOworCQkJdGhpcy5zaGFwZSA9IG51bGw7CisJCX0KKworCQl0aGlzLnN0YXRlID0gc3RhdGU7CisJCQorCQlpZiAodGhpcy5zdGF0ZSAhPSBudWxsKQorCQl7CisJCQl0aGlzLmRyYXdIaWdobGlnaHQoKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGlzSGlnaGxpZ2h0QXQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaGlnaGxpZ2h0IGlzIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4KKyAqLworbXhDZWxsSGlnaGxpZ2h0LnByb3RvdHlwZS5pc0hpZ2hsaWdodEF0ID0gZnVuY3Rpb24oeCwgeSkKK3sKKwl2YXIgaGl0ID0gZmFsc2U7CisJCisJLy8gUXVpcmtzIG1vZGUgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgYXMgaXQgdXNlZCBhIGRpZmZlcmVudCBjb29yZGluYXRlIHN5c3RlbQorCWlmICh0aGlzLnNoYXBlICE9IG51bGwgJiYgZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCAhPSBudWxsICYmICFteENsaWVudC5JU19RVUlSS1MpCisJeworCQl2YXIgZWx0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTsKKworCQl3aGlsZSAoZWx0ICE9IG51bGwpCisJCXsKKwkJCWlmIChlbHQgPT0gdGhpcy5zaGFwZS5ub2RlKQorCQkJeworCQkJCWhpdCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCWVsdCA9IGVsdC5wYXJlbnROb2RlOworCQl9CisJfQorCQorCXJldHVybiBoaXQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZXN0cm95CisgKiAKKyAqIERlc3Ryb3lzIHRoZSBoYW5kbGVyIGFuZCBhbGwgaXRzIHJlc291cmNlcyBhbmQgRE9NIG5vZGVzLgorICovCitteENlbGxIaWdobGlnaHQucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpCit7CisJdGhpcy5ncmFwaC5nZXRWaWV3KCkucmVtb3ZlTGlzdGVuZXIodGhpcy5yZXNldEhhbmRsZXIpOworCXRoaXMuZ3JhcGguZ2V0VmlldygpLnJlbW92ZUxpc3RlbmVyKHRoaXMucmVwYWludEhhbmRsZXIpOworCXRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5yZW1vdmVMaXN0ZW5lcih0aGlzLnJlcGFpbnRIYW5kbGVyKTsKKwkKKwlpZiAodGhpcy5zaGFwZSAhPSBudWxsKQorCXsKKwkJdGhpcy5zaGFwZS5kZXN0cm95KCk7CisJCXRoaXMuc2hhcGUgPSBudWxsOworCX0KK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teENlbGxNYXJrZXIuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teENlbGxNYXJrZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAwMzdjOAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214Q2VsbE1hcmtlci5qcwpAQCAtMCwwICsxLDQzMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhDZWxsTWFya2VyCisgKiAKKyAqIEEgaGVscGVyIGNsYXNzIHRvIHByb2Nlc3MgbW91c2UgbG9jYXRpb25zIGFuZCBoaWdobGlnaHQgY2VsbHMuCisgKiAKKyAqIEhlbHBlciBjbGFzcyB0byBoaWdobGlnaHQgY2VsbHMuIFRvIGFkZCBhIGNlbGwgbWFya2VyIHRvIGFuIGV4aXN0aW5nIGdyYXBoCisgKiBmb3IgaGlnaGxpZ2h0aW5nIGFsbCBjZWxscywgdGhlIGZvbGxvd2luZyBjb2RlIGlzIHVzZWQ6CisgKiAKKyAqIChjb2RlKQorICogdmFyIG1hcmtlciA9IG5ldyBteENlbGxNYXJrZXIoZ3JhcGgpOworICogZ3JhcGguYWRkTW91c2VMaXN0ZW5lcih7CisgKiAgIG1vdXNlRG93bjogZnVuY3Rpb24oKSB7fSwKKyAqICAgbW91c2VNb3ZlOiBmdW5jdGlvbihzZW5kZXIsIG1lKQorICogICB7CisgKiAgICAgbWFya2VyLnByb2Nlc3MobWUpOworICogICB9LAorICogICBtb3VzZVVwOiBmdW5jdGlvbigpIHt9CisgKiB9KTsKKyAqIChlbmQpCisgKgorICogRXZlbnQ6IG14RXZlbnQuTUFSSworICogCisgKiBGaXJlcyBhZnRlciBhIGNlbGwgaGFzIGJlZW4gbWFya2VkIG9yIHVubWFya2VkLiBUaGUgPGNvZGU+c3RhdGU8L2NvZGU+CisgKiBwcm9wZXJ0eSBjb250YWlucyB0aGUgbWFya2VkIDxteENlbGxTdGF0ZT4gb3IgbnVsbCBpZiBubyBzdGF0ZSBpcyBtYXJrZWQuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteENlbGxNYXJrZXIKKyAqIAorICogQ29uc3RydWN0cyBhIG5ldyBjZWxsIG1hcmtlci4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZ3JhcGggLSBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKiB2YWxpZENvbG9yIC0gT3B0aW9uYWwgbWFya2VyIGNvbG9yIGZvciB2YWxpZCBzdGF0ZXMuIERlZmF1bHQgaXMKKyAqIDxteENvbnN0YW50cy5ERUZBVUxUX1ZBTElEX0NPTE9SPi4KKyAqIGludmFsaWRDb2xvciAtIE9wdGlvbmFsIG1hcmtlciBjb2xvciBmb3IgaW52YWxpZCBzdGF0ZXMuIERlZmF1bHQgaXMKKyAqIDxteENvbnN0YW50cy5ERUZBVUxUX0lOVkFMSURfQ09MT1I+LgorICogaG90c3BvdCAtIFBvcnRpb24gb2YgdGhlIHdpZHRoIGFuZCBoaWdodCB3aGVyZSBhIHN0YXRlIGludGVyc2VjdHMgYQorICogZ2l2ZW4gY29vcmRpbmF0ZSBwYWlyLiBBIHZhbHVlIG9mIDAgbWVhbnMgYWx3YXlzIGhpZ2hsaWdodC4gRGVmYXVsdCBpcworICogPG14Q29uc3RhbnRzLkRFRkFVTFRfSE9UU1BPVD4uCisgKi8KK2Z1bmN0aW9uIG14Q2VsbE1hcmtlcihncmFwaCwgdmFsaWRDb2xvciwgaW52YWxpZENvbG9yLCBob3RzcG90KQoreworCW14RXZlbnRTb3VyY2UuY2FsbCh0aGlzKTsKKwkKKwlpZiAoZ3JhcGggIT0gbnVsbCkKKwl7CisJCXRoaXMuZ3JhcGggPSBncmFwaDsKKwkJdGhpcy52YWxpZENvbG9yID0gKHZhbGlkQ29sb3IgIT0gbnVsbCkgPyB2YWxpZENvbG9yIDogbXhDb25zdGFudHMuREVGQVVMVF9WQUxJRF9DT0xPUjsKKwkJdGhpcy5pbnZhbGlkQ29sb3IgPSAodmFsaWRDb2xvciAhPSBudWxsKSA/IGludmFsaWRDb2xvciA6IG14Q29uc3RhbnRzLkRFRkFVTFRfSU5WQUxJRF9DT0xPUjsKKwkJdGhpcy5ob3RzcG90ID0gKGhvdHNwb3QgIT0gbnVsbCkgPyBob3RzcG90IDogbXhDb25zdGFudHMuREVGQVVMVF9IT1RTUE9UOworCQkKKwkJdGhpcy5oaWdobGlnaHQgPSBuZXcgbXhDZWxsSGlnaGxpZ2h0KGdyYXBoKTsKKwl9Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhFdmVudFNvdXJjZS4KKyAqLworbXhVdGlscy5leHRlbmQobXhDZWxsTWFya2VyLCBteEV2ZW50U291cmNlKTsKKworLyoqCisgKiBWYXJpYWJsZTogZ3JhcGgKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgPG14R3JhcGg+LgorICovCitteENlbGxNYXJrZXIucHJvdG90eXBlLmdyYXBoID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIG1hcmtlciBpcyBlbmFibGVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214Q2VsbE1hcmtlci5wcm90b3R5cGUuZW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGhvdHNwb3QKKyAqIAorICogU3BlY2lmaWVzIHRoZSBwb3J0aW9uIG9mIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHRoYXQgc2hvdWxkIHRyaWdnZXIKKyAqIGEgaGlnaGxpZ2h0LiBUaGUgYXJlYSBhcm91bmQgdGhlIGNlbnRlciBvZiB0aGUgY2VsbCB0byBiZSBtYXJrZWQgaXMgdXNlZAorICogYXMgdGhlIGhvdHNwb3QuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYmV0d2VlbiAwIGFuZCAxLiBEZWZhdWx0IGlzCisgKiBteENvbnN0YW50cy5ERUZBVUxUX0hPVFNQT1QuCisgKi8KK214Q2VsbE1hcmtlci5wcm90b3R5cGUuaG90c3BvdCA9IG14Q29uc3RhbnRzLkRFRkFVTFRfSE9UU1BPVDsgCisKKy8qKgorICogVmFyaWFibGU6IGhvdHNwb3RFbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgaG90c3BvdCBpcyBlbmFibGVkLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteENlbGxNYXJrZXIucHJvdG90eXBlLmhvdHNwb3RFbmFibGVkID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHZhbGlkQ29sb3IKKyAqIAorICogSG9sZHMgdGhlIHZhbGlkIG1hcmtlciBjb2xvci4KKyAqLworbXhDZWxsTWFya2VyLnByb3RvdHlwZS52YWxpZENvbG9yID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogaW52YWxpZENvbG9yCisgKiAKKyAqIEhvbGRzIHRoZSBpbnZhbGlkIG1hcmtlciBjb2xvci4KKyAqLworbXhDZWxsTWFya2VyLnByb3RvdHlwZS5pbnZhbGlkQ29sb3IgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjdXJyZW50Q29sb3IKKyAqIAorICogSG9sZHMgdGhlIGN1cnJlbnQgbWFya2VyIGNvbG9yLgorICovCitteENlbGxNYXJrZXIucHJvdG90eXBlLmN1cnJlbnRDb2xvciA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHZhbGlkU3RhdGUKKyAqIAorICogSG9sZHMgdGhlIG1hcmtlZCA8bXhDZWxsU3RhdGU+IGlmIGl0IGlzIHZhbGlkLgorICovCitteENlbGxNYXJrZXIucHJvdG90eXBlLnZhbGlkU3RhdGUgPSBudWxsOyAKKworLyoqCisgKiBWYXJpYWJsZTogbWFya2VkU3RhdGUKKyAqIAorICogSG9sZHMgdGhlIG1hcmtlZCA8bXhDZWxsU3RhdGU+LgorICovCitteENlbGxNYXJrZXIucHJvdG90eXBlLm1hcmtlZFN0YXRlID0gbnVsbDsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0RW5hYmxlZAorICogCisgKiBFbmFibGVzIG9yIGRpc2FibGVzIGV2ZW50IGhhbmRsaW5nLiBUaGlzIGltcGxlbWVudGF0aW9uCisgKiB1cGRhdGVzIDxlbmFibGVkPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZW5hYmxlZCAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgdGhlIG5ldyBlbmFibGVkIHN0YXRlLgorICovCitteENlbGxNYXJrZXIucHJvdG90eXBlLnNldEVuYWJsZWQgPSBmdW5jdGlvbihlbmFibGVkKQoreworCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0VuYWJsZWQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIGV2ZW50cyBhcmUgaGFuZGxlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICogcmV0dXJucyA8ZW5hYmxlZD4uCisgKi8KK214Q2VsbE1hcmtlci5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmVuYWJsZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRIb3RzcG90CisgKiAKKyAqIFNldHMgdGhlIDxob3RzcG90Pi4KKyAqLworbXhDZWxsTWFya2VyLnByb3RvdHlwZS5zZXRIb3RzcG90ID0gZnVuY3Rpb24oaG90c3BvdCkKK3sKKwl0aGlzLmhvdHNwb3QgPSBob3RzcG90OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0SG90c3BvdAorICogCisgKiBSZXR1cm5zIHRoZSA8aG90c3BvdD4uCisgKi8KK214Q2VsbE1hcmtlci5wcm90b3R5cGUuZ2V0SG90c3BvdCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5ob3RzcG90OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0SG90c3BvdEVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGhvdHNwb3Qgc2hvdWxkIGJlIHVzZWQgaW4gPGludGVyc2VjdHM+LgorICovCitteENlbGxNYXJrZXIucHJvdG90eXBlLnNldEhvdHNwb3RFbmFibGVkID0gZnVuY3Rpb24oZW5hYmxlZCkKK3sKKwl0aGlzLmhvdHNwb3RFbmFibGVkID0gZW5hYmxlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzSG90c3BvdEVuYWJsZWQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIGhvdHNwb3QgaXMgdXNlZCBpbiA8aW50ZXJzZWN0cz4uCisgKi8KK214Q2VsbE1hcmtlci5wcm90b3R5cGUuaXNIb3RzcG90RW5hYmxlZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5ob3RzcG90RW5hYmxlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGhhc1ZhbGlkU3RhdGUKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIDx2YWxpZFN0YXRlPiBpcyBub3QgbnVsbC4KKyAqLworbXhDZWxsTWFya2VyLnByb3RvdHlwZS5oYXNWYWxpZFN0YXRlID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLnZhbGlkU3RhdGUgIT0gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFZhbGlkU3RhdGUKKyAqIAorICogUmV0dXJucyB0aGUgPHZhbGlkU3RhdGU+LgorICovCitteENlbGxNYXJrZXIucHJvdG90eXBlLmdldFZhbGlkU3RhdGUgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMudmFsaWRTdGF0ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldE1hcmtlZFN0YXRlCisgKiAKKyAqIFJldHVybnMgdGhlIDxtYXJrZWRTdGF0ZT4uCisgKi8KK214Q2VsbE1hcmtlci5wcm90b3R5cGUuZ2V0TWFya2VkU3RhdGUgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMubWFya2VkU3RhdGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZXNldAorICogCisgKiBSZXNldHMgdGhlIHN0YXRlIG9mIHRoZSBjZWxsIG1hcmtlci4KKyAqLworbXhDZWxsTWFya2VyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnZhbGlkU3RhdGUgPSBudWxsOworCQorCWlmICh0aGlzLm1hcmtlZFN0YXRlICE9IG51bGwpCisJeworCQl0aGlzLm1hcmtlZFN0YXRlID0gbnVsbDsKKwkJdGhpcy51bm1hcmsoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBwcm9jZXNzCisgKiAKKyAqIFByb2Nlc3NlcyB0aGUgZ2l2ZW4gZXZlbnQgYW5kIGNlbGwgYW5kIG1hcmtzIHRoZSBzdGF0ZSByZXR1cm5lZCBieQorICogPGdldFN0YXRlPiB3aXRoIHRoZSBjb2xvciByZXR1cm5lZCBieSA8Z2V0TWFya2VyQ29sb3I+LiBJZiB0aGUKKyAqIG1hcmtlckNvbG9yIGlzIG5vdCBudWxsLCB0aGVuIHRoZSBzdGF0ZSBpcyBzdG9yZWQgaW4gPG1hcmtlZFN0YXRlPi4gSWYKKyAqIDxpc1ZhbGlkU3RhdGU+IHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgc3RhdGUgaXMgc3RvcmVkIGluIDx2YWxpZFN0YXRlPgorICogcmVnYXJkbGVzcyBvZiB0aGUgbWFya2VyIGNvbG9yLiBUaGUgc3RhdGUgaXMgcmV0dXJuZWQgcmVnYXJkbGVzcyBvZiB0aGUKKyAqIG1hcmtlciBjb2xvciBhbmQgdmFsaWQgc3RhdGUuIAorICovCitteENlbGxNYXJrZXIucHJvdG90eXBlLnByb2Nlc3MgPSBmdW5jdGlvbihtZSkKK3sKKwl2YXIgc3RhdGUgPSBudWxsOworCQorCWlmICh0aGlzLmlzRW5hYmxlZCgpKQorCXsKKwkJc3RhdGUgPSB0aGlzLmdldFN0YXRlKG1lKTsKKwkJdGhpcy5zZXRDdXJyZW50U3RhdGUoc3RhdGUsIG1lKTsKKwl9CisJCisJcmV0dXJuIHN0YXRlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0Q3VycmVudFN0YXRlCisgKiAKKyAqIFNldHMgYW5kIG1hcmtzIHRoZSBjdXJyZW50IHZhbGlkIHN0YXRlLgorICovCitteENlbGxNYXJrZXIucHJvdG90eXBlLnNldEN1cnJlbnRTdGF0ZSA9IGZ1bmN0aW9uKHN0YXRlLCBtZSwgY29sb3IpCit7CisJdmFyIGlzVmFsaWQgPSAoc3RhdGUgIT0gbnVsbCkgPyB0aGlzLmlzVmFsaWRTdGF0ZShzdGF0ZSkgOiBmYWxzZTsKKwljb2xvciA9IChjb2xvciAhPSBudWxsKSA/IGNvbG9yIDogdGhpcy5nZXRNYXJrZXJDb2xvcihtZS5nZXRFdmVudCgpLCBzdGF0ZSwgaXNWYWxpZCk7CisJCisJaWYgKGlzVmFsaWQpCisJeworCQl0aGlzLnZhbGlkU3RhdGUgPSBzdGF0ZTsKKwl9CisJZWxzZQorCXsKKwkJdGhpcy52YWxpZFN0YXRlID0gbnVsbDsKKwl9CisJCisJaWYgKHN0YXRlICE9IHRoaXMubWFya2VkU3RhdGUgfHwgY29sb3IgIT0gdGhpcy5jdXJyZW50Q29sb3IpCisJeworCQl0aGlzLmN1cnJlbnRDb2xvciA9IGNvbG9yOworCQkKKwkJaWYgKHN0YXRlICE9IG51bGwgJiYgdGhpcy5jdXJyZW50Q29sb3IgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5tYXJrZWRTdGF0ZSA9IHN0YXRlOworCQkJdGhpcy5tYXJrKCk7CQkKKwkJfQorCQllbHNlIGlmICh0aGlzLm1hcmtlZFN0YXRlICE9IG51bGwpCisJCXsKKwkJCXRoaXMubWFya2VkU3RhdGUgPSBudWxsOworCQkJdGhpcy51bm1hcmsoKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IG1hcmtDZWxsCisgKiAKKyAqIE1hcmtzIHRoZSBnaXZlbiBjZWxsIHVzaW5nIHRoZSBnaXZlbiBjb2xvciwgb3IgPHZhbGlkQ29sb3I+IGlmIG5vIGNvbG9yIGlzIHNwZWNpZmllZC4KKyAqLworbXhDZWxsTWFya2VyLnByb3RvdHlwZS5tYXJrQ2VsbCA9IGZ1bmN0aW9uKGNlbGwsIGNvbG9yKQoreworCXZhciBzdGF0ZSA9IHRoaXMuZ3JhcGguZ2V0VmlldygpLmdldFN0YXRlKGNlbGwpOworCQorCWlmIChzdGF0ZSAhPSBudWxsKQorCXsKKwkJdGhpcy5jdXJyZW50Q29sb3IgPSAoY29sb3IgIT0gbnVsbCkgPyBjb2xvciA6IHRoaXMudmFsaWRDb2xvcjsKKwkJdGhpcy5tYXJrZWRTdGF0ZSA9IHN0YXRlOworCQl0aGlzLm1hcmsoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtYXJrCisgKiAKKyAqIE1hcmtzIHRoZSA8bWFya2VkU3RhdGU+IGFuZCBmaXJlcyBhIDxtYXJrPiBldmVudC4KKyAqLworbXhDZWxsTWFya2VyLnByb3RvdHlwZS5tYXJrID0gZnVuY3Rpb24oKQoreworCXRoaXMuaGlnaGxpZ2h0LnNldEhpZ2hsaWdodENvbG9yKHRoaXMuY3VycmVudENvbG9yKTsKKwl0aGlzLmhpZ2hsaWdodC5oaWdobGlnaHQodGhpcy5tYXJrZWRTdGF0ZSk7CisJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5NQVJLLCAnc3RhdGUnLCB0aGlzLm1hcmtlZFN0YXRlKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1bm1hcmsKKyAqIAorICogSGlkZXMgdGhlIG1hcmtlciBhbmQgZmlyZXMgYSA8bWFyaz4gZXZlbnQuCisgKi8KK214Q2VsbE1hcmtlci5wcm90b3R5cGUudW5tYXJrID0gZnVuY3Rpb24oKQoreworCXRoaXMubWFyaygpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNWYWxpZFN0YXRlCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gPG14Q2VsbFN0YXRlPiBpcyBhIHZhbGlkIHN0YXRlLiBJZiB0aGlzCisgKiByZXR1cm5zIHRydWUsIHRoZW4gdGhlIHN0YXRlIGlzIHN0b3JlZCBpbiA8dmFsaWRTdGF0ZT4uIFRoZSByZXR1cm4gdmFsdWUKKyAqIG9mIHRoaXMgbWV0aG9kIGlzIHVzZWQgYXMgdGhlIGFyZ3VtZW50IGZvciA8Z2V0TWFya2VyQ29sb3I+LgorICovCitteENlbGxNYXJrZXIucHJvdG90eXBlLmlzVmFsaWRTdGF0ZSA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXJldHVybiB0cnVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0TWFya2VyQ29sb3IKKyAqIAorICogUmV0dXJucyB0aGUgdmFsaWQtIG9yIGludmFsaWRDb2xvciBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGlzVmFsaWQuCisgKiBUaGUgZ2l2ZW4gPG14Q2VsbFN0YXRlPiBpcyBpZ25vcmVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24uCisgKi8KK214Q2VsbE1hcmtlci5wcm90b3R5cGUuZ2V0TWFya2VyQ29sb3IgPSBmdW5jdGlvbihldnQsIHN0YXRlLCBpc1ZhbGlkKQoreworCXJldHVybiAoaXNWYWxpZCkgPyB0aGlzLnZhbGlkQ29sb3IgOiB0aGlzLmludmFsaWRDb2xvcjsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFN0YXRlCisgKiAKKyAqIFVzZXMgPGdldENlbGw+LCA8Z2V0U3RhdGVUb01hcms+IGFuZCA8aW50ZXJzZWN0cz4gdG8gcmV0dXJuIHRoZQorICogPG14Q2VsbFN0YXRlPiBmb3IgdGhlIGdpdmVuIDxteE1vdXNlRXZlbnQ+LgorICovCitteENlbGxNYXJrZXIucHJvdG90eXBlLmdldFN0YXRlID0gZnVuY3Rpb24obWUpCit7CisJdmFyIHZpZXcgPSB0aGlzLmdyYXBoLmdldFZpZXcoKTsKKwl2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbChtZSk7CisJdmFyIHN0YXRlID0gdGhpcy5nZXRTdGF0ZVRvTWFyayh2aWV3LmdldFN0YXRlKGNlbGwpKTsKKworCXJldHVybiAoc3RhdGUgIT0gbnVsbCAmJiB0aGlzLmludGVyc2VjdHMoc3RhdGUsIG1lKSkgPyBzdGF0ZSA6IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDZWxsCisgKiAKKyAqIFJldHVybnMgdGhlIDxteENlbGw+IGZvciB0aGUgZ2l2ZW4gZXZlbnQgYW5kIGNlbGwuIFRoaXMgcmV0dXJucyB0aGUKKyAqIGdpdmVuIGNlbGwuCisgKi8KK214Q2VsbE1hcmtlci5wcm90b3R5cGUuZ2V0Q2VsbCA9IGZ1bmN0aW9uKG1lKQoreworCXJldHVybiBtZS5nZXRDZWxsKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTdGF0ZVRvTWFyaworICogCisgKiBSZXR1cm5zIHRoZSA8bXhDZWxsU3RhdGU+IHRvIGJlIG1hcmtlZCBmb3IgdGhlIGdpdmVuIDxteENlbGxTdGF0ZT4gdW5kZXIKKyAqIHRoZSBtb3VzZS4gVGhpcyByZXR1cm5zIHRoZSBnaXZlbiBzdGF0ZS4KKyAqLworbXhDZWxsTWFya2VyLnByb3RvdHlwZS5nZXRTdGF0ZVRvTWFyayA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXJldHVybiBzdGF0ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGludGVyc2VjdHMKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjb29yZGluYXRlIHBhaXIgaW50ZXJzZWN0cyB0aGUgZ2l2ZW4gc3RhdGUuCisgKiBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgPGhvdHNwb3Q+IGlzIDAgb3IgdGhlIGNvb3JkaW5hdGVzIGFyZSBpbnNpZGUKKyAqIHRoZSBob3RzcG90IGZvciB0aGUgZ2l2ZW4gY2VsbCBzdGF0ZS4KKyAqLworbXhDZWxsTWFya2VyLnByb3RvdHlwZS5pbnRlcnNlY3RzID0gZnVuY3Rpb24oc3RhdGUsIG1lKQoreworCWlmICh0aGlzLmhvdHNwb3RFbmFibGVkKQorCXsKKwkJcmV0dXJuIG14VXRpbHMuaW50ZXJzZWN0c0hvdHNwb3Qoc3RhdGUsIG1lLmdldEdyYXBoWCgpLCBtZS5nZXRHcmFwaFkoKSwKKwkJCXRoaXMuaG90c3BvdCwgbXhDb25zdGFudHMuTUlOX0hPVFNQT1RfU0laRSwKKwkJCW14Q29uc3RhbnRzLk1BWF9IT1RTUE9UX1NJWkUpOworCX0KKwkKKwlyZXR1cm4gdHJ1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqIAorICogRGVzdHJveXMgdGhlIGhhbmRsZXIgYW5kIGFsbCBpdHMgcmVzb3VyY2VzIGFuZCBET00gbm9kZXMuCisgKi8KK214Q2VsbE1hcmtlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLmdyYXBoLmdldFZpZXcoKS5yZW1vdmVMaXN0ZW5lcih0aGlzLnJlc2V0SGFuZGxlcik7CisJdGhpcy5ncmFwaC5nZXRNb2RlbCgpLnJlbW92ZUxpc3RlbmVyKHRoaXMucmVzZXRIYW5kbGVyKTsKKwl0aGlzLmhpZ2hsaWdodC5kZXN0cm95KCk7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhDZWxsVHJhY2tlci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214Q2VsbFRyYWNrZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwYzhiYgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214Q2VsbFRyYWNrZXIuanMKQEAgLTAsMCArMSwxNDUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14Q2VsbFRyYWNrZXIKKyAqIAorICogRXZlbnQgaGFuZGxlciB0aGF0IGhpZ2hsaWdodHMgY2VsbHMuIEluaGVyaXRzIGZyb20gPG14Q2VsbE1hcmtlcj4uCisgKiAKKyAqIEV4YW1wbGU6CisgKiAKKyAqIChjb2RlKQorICogbmV3IG14Q2VsbFRyYWNrZXIoZ3JhcGgsICcjMDBGRjAwJyk7CisgKiAoZW5kKQorICogCisgKiBGb3IgZGV0ZWN0aW5nIGRyYWdFbnRlciwgZHJhZ092ZXIgYW5kIGRyYWdMZWF2ZSBvbiBjZWxscywgdGhlIGZvbGxvd2luZworICogY29kZSBjYW4gYmUgdXNlZDoKKyAqIAorICogKGNvZGUpCisgKiBncmFwaC5hZGRNb3VzZUxpc3RlbmVyKAorICogeworICogICBjZWxsOiBudWxsLAorICogICBtb3VzZURvd246IGZ1bmN0aW9uKHNlbmRlciwgbWUpIHsgfSwKKyAqICAgbW91c2VNb3ZlOiBmdW5jdGlvbihzZW5kZXIsIG1lKQorICogICB7CisgKiAgICAgdmFyIHRtcCA9IG1lLmdldENlbGwoKTsKKyAqICAgICAKKyAqICAgICBpZiAodG1wICE9IHRoaXMuY2VsbCkKKyAqICAgICB7CisgKiAgICAgICBpZiAodGhpcy5jZWxsICE9IG51bGwpCisgKiAgICAgICB7CisgKiAgICAgICAgIHRoaXMuZHJhZ0xlYXZlKG1lLmdldEV2ZW50KCksIHRoaXMuY2VsbCk7CisgKiAgICAgICB9CisgKiAgICAgICAKKyAqICAgICAgIHRoaXMuY2VsbCA9IHRtcDsKKyAqICAgICAgIAorICogICAgICAgaWYgKHRoaXMuY2VsbCAhPSBudWxsKQorICogICAgICAgeworICogICAgICAgICB0aGlzLmRyYWdFbnRlcihtZS5nZXRFdmVudCgpLCB0aGlzLmNlbGwpOworICogICAgICAgfQorICogICAgIH0KKyAqICAgICAKKyAqICAgICBpZiAodGhpcy5jZWxsICE9IG51bGwpCisgKiAgICAgeworICogICAgICAgdGhpcy5kcmFnT3ZlcihtZS5nZXRFdmVudCgpLCB0aGlzLmNlbGwpOworICogICAgIH0KKyAqICAgfSwKKyAqICAgbW91c2VVcDogZnVuY3Rpb24oc2VuZGVyLCBtZSkgeyB9LAorICogICBkcmFnRW50ZXI6IGZ1bmN0aW9uKGV2dCwgY2VsbCkKKyAqICAgeworICogICAgIG14TG9nLmRlYnVnKCdkcmFnRW50ZXInLCBjZWxsLnZhbHVlKTsKKyAqICAgfSwKKyAqICAgZHJhZ092ZXI6IGZ1bmN0aW9uKGV2dCwgY2VsbCkKKyAqICAgeworICogICAgIG14TG9nLmRlYnVnKCdkcmFnT3ZlcicsIGNlbGwudmFsdWUpOworICogICB9LAorICogICBkcmFnTGVhdmU6IGZ1bmN0aW9uKGV2dCwgY2VsbCkKKyAqICAgeworICogICAgIG14TG9nLmRlYnVnKCdkcmFnTGVhdmUnLCBjZWxsLnZhbHVlKTsKKyAqICAgfQorICogfSk7CisgKiAoZW5kKQorICogCisgKiBDb25zdHJ1Y3RvcjogbXhDZWxsVHJhY2tlcgorICogCisgKiBDb25zdHJ1Y3RzIGFuIGV2ZW50IGhhbmRsZXIgdGhhdCBoaWdobGlnaHRzIGNlbGxzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBncmFwaCAtIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEdyYXBoPi4KKyAqIGNvbG9yIC0gQ29sb3Igb2YgdGhlIGhpZ2hsaWdodC4gRGVmYXVsdCBpcyBibHVlLgorICogZnVuY3QgLSBPcHRpb25hbCBKYXZhU2NyaXB0IGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB0byBvdmVycmlkZQorICogPG14Q2VsbE1hcmtlci5nZXRDZWxsPi4KKyAqLworZnVuY3Rpb24gbXhDZWxsVHJhY2tlcihncmFwaCwgY29sb3IsIGZ1bmN0KQoreworCW14Q2VsbE1hcmtlci5jYWxsKHRoaXMsIGdyYXBoLCBjb2xvcik7CisKKwl0aGlzLmdyYXBoLmFkZE1vdXNlTGlzdGVuZXIodGhpcyk7CisJCisJaWYgKGZ1bmN0ICE9IG51bGwpCisJeworCQl0aGlzLmdldENlbGwgPSBmdW5jdDsKKwl9CisJCisJLy8gQXV0b21hdGljIGRlYWxsb2NhdGlvbiBvZiBtZW1vcnkKKwlpZiAobXhDbGllbnQuSVNfSUUpCisJeworCQlteEV2ZW50LmFkZExpc3RlbmVyKHdpbmRvdywgJ3VubG9hZCcsIG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbigpCisJCXsKKwkJCXRoaXMuZGVzdHJveSgpOworCQl9KSk7CisJfQorfTsKKworLyoqCisgKiBFeHRlbmRzIG14Q2VsbE1hcmtlci4KKyAqLworbXhVdGlscy5leHRlbmQobXhDZWxsVHJhY2tlciwgbXhDZWxsTWFya2VyKTsKKworLyoqCisgKiBGdW5jdGlvbjogbW91c2VEb3duCisgKiAKKyAqIElnbm9yZXMgdGhlIGV2ZW50LiBUaGUgZXZlbnQgaXMgbm90IGNvbnN1bWVkLgorICovCitteENlbGxUcmFja2VyLnByb3RvdHlwZS5tb3VzZURvd24gPSBmdW5jdGlvbihzZW5kZXIsIG1lKSB7IH07CisKKy8qKgorICogRnVuY3Rpb246IG1vdXNlTW92ZQorICogCisgKiBIYW5kbGVzIHRoZSBldmVudCBieSBoaWdobGlnaHRpbmcgdGhlIGNlbGwgdW5kZXIgdGhlIG1vdXNlcG9pbnRlciBpZiBpdAorICogaXMgb3ZlciB0aGUgaG90c3BvdCByZWdpb24gb2YgdGhlIGNlbGwuCisgKi8KK214Q2VsbFRyYWNrZXIucHJvdG90eXBlLm1vdXNlTW92ZSA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJaWYgKHRoaXMuaXNFbmFibGVkKCkpCisJeworCQl0aGlzLnByb2Nlc3MobWUpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdXNlVXAKKyAqIAorICogSGFuZGxlcyB0aGUgZXZlbnQgYnkgcmVzZXRpbmcgdGhlIGhpZ2hsaWdodC4KKyAqLworbXhDZWxsVHJhY2tlci5wcm90b3R5cGUubW91c2VVcCA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpIHsgfTsKKworLyoqCisgKiBGdW5jdGlvbjogZGVzdHJveQorICogCisgKiBEZXN0cm95cyB0aGUgb2JqZWN0IGFuZCBhbGwgaXRzIHJlc291cmNlcyBhbmQgRE9NIG5vZGVzLiBUaGlzIGRvZXNuJ3QKKyAqIG5vcm1hbGx5IG5lZWQgdG8gYmUgY2FsbGVkLiBJdCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSB3aW5kb3cKKyAqIHVubG9hZHMuCisgKi8KK214Q2VsbFRyYWNrZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpCit7CisJaWYgKCF0aGlzLmRlc3Ryb3llZCkKKwl7CisJCXRoaXMuZGVzdHJveWVkID0gdHJ1ZTsKKworCQl0aGlzLmdyYXBoLnJlbW92ZU1vdXNlTGlzdGVuZXIodGhpcyk7CisJCW14Q2VsbE1hcmtlci5wcm90b3R5cGUuZGVzdHJveS5hcHBseSh0aGlzKTsKKwl9Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhDb25uZWN0aW9uSGFuZGxlci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214Q29ubmVjdGlvbkhhbmRsZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVhZGU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214Q29ubmVjdGlvbkhhbmRsZXIuanMKQEAgLTAsMCArMSwyMjA0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE2LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNiwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteENvbm5lY3Rpb25IYW5kbGVyCisgKgorICogR3JhcGggZXZlbnQgaGFuZGxlciB0aGF0IGNyZWF0ZXMgbmV3IGNvbm5lY3Rpb25zLiBVc2VzIDxteFRlcm1pbmFsTWFya2VyPgorICogZm9yIGZpbmRpbmcgYW5kIGhpZ2hsaWdodGluZyB0aGUgc291cmNlIGFuZCB0YXJnZXQgdmVydGljZXMgYW5kCisgKiA8ZmFjdG9yeU1ldGhvZD4gdG8gY3JlYXRlIHRoZSBlZGdlIGluc3RhbmNlLiBUaGlzIGhhbmRsZXIgaXMgYnVpbHQtaW50bworICogPG14R3JhcGguY29ubmVjdGlvbkhhbmRsZXI+IGFuZCBlbmFibGVkIHVzaW5nIDxteEdyYXBoLnNldENvbm5lY3RhYmxlPi4KKyAqCisgKiBFeGFtcGxlOgorICogCisgKiAoY29kZSkKKyAqIG5ldyBteENvbm5lY3Rpb25IYW5kbGVyKGdyYXBoLCBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgc3R5bGUpCisgKiB7CisgKiAgIGVkZ2UgPSBuZXcgbXhDZWxsKCcnLCBuZXcgbXhHZW9tZXRyeSgpKTsKKyAqICAgZWRnZS5zZXRFZGdlKHRydWUpOworICogICBlZGdlLnNldFN0eWxlKHN0eWxlKTsKKyAqICAgZWRnZS5nZW9tZXRyeS5yZWxhdGl2ZSA9IHRydWU7CisgKiAgIHJldHVybiBlZGdlOworICogfSk7CisgKiAoZW5kKQorICogCisgKiBIZXJlIGlzIGFuIGFsdGVybmF0aXZlIHNvbHV0aW9uIHRoYXQganVzdCBzZXRzIGEgc3BlY2lmaWMgdXNlciBvYmplY3QgZm9yCisgKiBuZXcgZWRnZXMgYnkgb3ZlcnJpZGluZyA8aW5zZXJ0RWRnZT4uCisgKgorICogKGNvZGUpCisgKiBteENvbm5lY3Rpb25IYW5kbGVySW5zZXJ0RWRnZSA9IG14Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLmluc2VydEVkZ2U7CisgKiBteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5pbnNlcnRFZGdlID0gZnVuY3Rpb24ocGFyZW50LCBpZCwgdmFsdWUsIHNvdXJjZSwgdGFyZ2V0LCBzdHlsZSkKKyAqIHsKKyAqICAgdmFsdWUgPSAnVGVzdCc7CisgKiAKKyAqICAgcmV0dXJuIG14Q29ubmVjdGlvbkhhbmRsZXJJbnNlcnRFZGdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgKiB9OworICogKGVuZCkKKyAqIAorICogVXNpbmcgaW1hZ2VzIHRvIHRyaWdnZXIgY29ubmVjdGlvbnM6CisgKiAKKyAqIFRoaXMgaGFuZGxlciB1c2VzIG14VGVybWluYWxNYXJrZXIgdG8gZmluZCB0aGUgc291cmNlIGFuZCB0YXJnZXQgY2VsbCBmb3IKKyAqIHRoZSBuZXcgY29ubmVjdGlvbiBhbmQgY3JlYXRlcyBhIG5ldyBlZGdlIHVzaW5nIDxjb25uZWN0Pi4gVGhlIG5ldyBlZGdlIGlzCisgKiBjcmVhdGVkIHVzaW5nIDxjcmVhdGVFZGdlPiB3aGljaCBpbiB0dXJuIHVzZXMgPGZhY3RvcnlNZXRob2Q+IG9yIGNyZWF0ZXMgYQorICogbmV3IGRlZmF1bHQgZWRnZS4KKyAqIAorICogVGhlIGhhbmRsZXIgdXNlcyBhICJoaWdobGlnaHQtcGFyYWRpZ20iIGZvciBpbmRpY2F0aW5nIGlmIGEgY2VsbCBpcyBiZWluZworICogdXNlZCBhcyBhIHNvdXJjZSBvciB0YXJnZXQgdGVybWluYWwsIGFzIHNlZW4gaW4gb3RoZXIgZGlhZ3JhbW1pbmcgcHJvZHVjdHMuCisgKiBJbiBvcmRlciB0byBhbGxvdyBib3RoLCBtb3ZpbmcgYW5kIGNvbm5lY3RpbmcgY2VsbHMgYXQgdGhlIHNhbWUgdGltZSwKKyAqIDxteENvbnN0YW50cy5ERUZBVUxUX0hPVFNQT1Q+IGlzIHVzZWQgaW4gdGhlIGhhbmRsZXIgdG8gZGV0ZXJtaW5lIHRoZSBob3RzcG90CisgKiBvZiBhIGNlbGwsIHRoYXQgaXMsIHRoZSByZWdpb24gb2YgdGhlIGNlbGwgd2hpY2ggaXMgdXNlZCB0byB0cmlnZ2VyIGEgbmV3CisgKiBjb25uZWN0aW9uLiBUaGUgY29uc3RhbnQgaXMgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEgdGhhdCBzcGVjaWZpZXMgdGhlCisgKiBhbW91bnQgb2YgdGhlIHdpZHRoIGFuZCBoZWlnaHQgYXJvdW5kIHRoZSBjZW50ZXIgdG8gYmUgdXNlZCBmb3IgdGhlIGhvdHNwb3QKKyAqIG9mIGEgY2VsbCBhbmQgaXRzIGRlZmF1bHQgdmFsdWUgaXMgMC41LiBJbiBhZGRpdGlvbiwKKyAqIDxteENvbnN0YW50cy5NSU5fSE9UU1BPVF9TSVpFPiBkZWZpbmVzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBwaXhlbHMgZm9yIHRoZQorICogd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgaG90c3BvdC4KKyAqIAorICogVGhpcyBzb2x1dGlvbiwgd2hpbGUgc3RhbmRhcmRzIGNvbXBsaWFudCwgbWF5IGJlIHNvbWV3aGF0IGNvbmZ1c2luZyBiZWNhdXNlCisgKiB0aGVyZSBpcyBubyB2aXN1YWwgaW5kaWNhdG9yIGZvciB0aGUgaG90c3BvdCBhbmQgdGhlIGhpZ2hsaWdodCBpcyBzZWVuIHRvCisgKiBzd2l0Y2ggb24gYW5kIG9mZiB3aGlsZSB0aGUgbW91c2UgaXMgYmVpbmcgbW92ZWQgaW4gYW5kIG91dC4gRnVydGhlcm1vcmUsCisgKiB0aGlzIHBhcmFkaWdtIGRvZXMgbm90IGFsbG93IHRvIGNyZWF0ZSBkaWZmZXJlbnQgY29ubmVjdGlvbnMgZGVwZW5kaW5nIG9uCisgKiB0aGUgaGlnaGxpZ2h0ZWQgaG90c3BvdCBhcyB0aGVyZSBpcyBvbmx5IG9uZSBob3RzcG90IHBlciBjZWxsIGFuZCBpdAorICogbm9ybWFsbHkgZG9lcyBub3QgYWxsb3cgY2VsbHMgdG8gYmUgbW92ZWQgYW5kIGNvbm5lY3RlZCBhdCB0aGUgc2FtZSB0aW1lIGFzCisgKiB0aGVyZSBpcyBubyBjbGVhciBpbmRpY2F0aW9uIG9mIHRoZSBjb25uZWN0YWJsZSBhcmVhIG9mIHRoZSBjZWxsLgorICogCisgKiBUbyBjb21lIGFjcm9zcyB0aGVzZSBpc3N1ZXMsIHRoZSBoYW5kbGUgaGFzIGFuIGFkZGl0aW9uYWwgPGNyZWF0ZUljb25zPiBob29rCisgKiB3aXRoIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsbG93cyB0byBjcmVhdGUgb25lIGljb24gdG8gYmUgdXNlZCB0bworICogdHJpZ2dlciBuZXcgY29ubmVjdGlvbnMuIElmIHRoaXMgaWNvbiBpcyBzcGVjaWZpZWQsIHRoZW4gbmV3IGNvbm5lY3Rpb25zIGNhbgorICogb25seSBiZSBjcmVhdGVkIGlmIHRoZSBpbWFnZSBpcyBjbGlja2VkIHdoaWxlIHRoZSBjZWxsIGlzIGJlaW5nIGhpZ2hsaWdodGVkLgorICogVGhlIDxjcmVhdGVJY29ucz4gaG9vayBtYXkgYmUgb3ZlcnJpZGRlbiB0byBjcmVhdGUgbW9yZSB0aGFuIG9uZQorICogPG14SW1hZ2VTaGFwZT4gZm9yIGNyZWF0aW5nIG5ldyBjb25uZWN0aW9ucywgYnV0IHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgKiBzdXBwb3J0cyBvbmUgaW1hZ2UgYW5kIGlzIHVzZWQgYXMgZm9sbG93czoKKyAqIAorICogSW4gb3JkZXIgdG8gZGlzcGxheSB0aGUgImNvbm5lY3QgaW1hZ2UiIHdoZW5ldmVyIHRoZSBtb3VzZSBpcyBvdmVyIHRoZSBjZWxsLAorICogYW4gREVGQVVMVF9IT1RTUE9UIG9mIDEgc2hvdWxkIGJlIHVzZWQ6CisgKiAKKyAqIChjb2RlKQorICogbXhDb25zdGFudHMuREVGQVVMVF9IT1RTUE9UID0gMTsKKyAqIChlbmQpCisgKiAKKyAqIEluIG9yZGVyIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIHRoZSBoaWdobGlnaHRpbmcsIHRoZSBoaWdobGlnaHQgY29sb3IKKyAqIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGEgY29ubmVjdCBpbWFnZToKKyAqIAorICogKGNvZGUpCisgKiBteENvbnN0YW50cy5ISUdITElHSFRfQ09MT1IgPSBudWxsOworICogKGVuZCkKKyAqIAorICogVG8gaW5zdGFsbCB0aGUgaW1hZ2UsIHRoZSBjb25uZWN0SW1hZ2UgZmllbGQgb2YgdGhlIG14Q29ubmVjdGlvbkhhbmRsZXIgbXVzdAorICogYmUgYXNzaWduZWQgYSBuZXcgPG14SW1hZ2U+IGluc3RhbmNlOgorICogCisgKiAoY29kZSkKKyAqIG14Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLmNvbm5lY3RJbWFnZSA9IG5ldyBteEltYWdlKCdpbWFnZXMvZ3JlZW4tZG90LmdpZicsIDE0LCAxNCk7CisgKiAoZW5kKQorICogCisgKiBUaGlzIHdpbGwgdXNlIHRoZSBncmVlbi1kb3QuZ2lmIHdpdGggYSB3aWR0aCBhbmQgaGVpZ2h0IG9mIDE0IHBpeGVscyBhcyB0aGUKKyAqIGltYWdlIHRvIHRyaWdnZXIgbmV3IGNvbm5lY3Rpb25zLiBJbiBjcmVhdGVJY29ucyB0aGUgaWNvbiBmaWVsZCBvZiB0aGUKKyAqIGhhbmRsZXIgd2lsbCBiZSBzZXQgaW4gb3JkZXIgdG8gcmVtZW1iZXIgdGhlIGljb24gdGhhdCBoYXMgYmVlbiBjbGlja2VkIGZvcgorICogY3JlYXRpbmcgdGhlIG5ldyBjb25uZWN0aW9uLiBUaGlzIGZpZWxkIHdpbGwgYmUgYXZhaWxhYmxlIHVuZGVyIHNlbGVjdGVkSWNvbgorICogaW4gdGhlIGNvbm5lY3QgbWV0aG9kLCB3aGljaCBtYXkgYmUgb3ZlcnJpZGRlbiB0byB0YWtlIHRoZSBpY29uIHRoYXQKKyAqIHRyaWdnZXJlZCB0aGUgbmV3IGNvbm5lY3Rpb24gaW50byBhY2NvdW50LiBUaGlzIGlzIHVzZWZ1bCBpZiBtb3JlIHRoYW4gb25lCisgKiBpY29uIG1heSBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNvbm5lY3Rpb24uCisgKgorICogR3JvdXA6IEV2ZW50cworICogCisgKiBFdmVudDogbXhFdmVudC5TVEFSVAorICogCisgKiBGaXJlcyB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gaXMgYmVpbmcgY3JlYXRlZCBieSB0aGUgdXNlci4gVGhlIDxjb2RlPnN0YXRlPC9jb2RlPgorICogcHJvcGVydHkgY29udGFpbnMgdGhlIHN0YXRlIG9mIHRoZSBzb3VyY2UgY2VsbC4KKyAqIAorICogRXZlbnQ6IG14RXZlbnQuQ09OTkVDVAorICogCisgKiBGaXJlcyBiZXR3ZWVuIGJlZ2luLSBhbmQgZW5kVXBkYXRlIGluIDxjb25uZWN0Pi4gVGhlIDxjb2RlPmNlbGw8L2NvZGU+CisgKiBwcm9wZXJ0eSBjb250YWlucyB0aGUgaW5zZXJ0ZWQgZWRnZSwgdGhlIDxjb2RlPmV2ZW50PC9jb2RlPiBhbmQgPGNvZGU+dGFyZ2V0PC9jb2RlPiAKKyAqIHByb3BlcnRpZXMgY29udGFpbiB0aGUgcmVzcGVjdGl2ZSBhcmd1bWVudHMgdGhhdCB3ZXJlIHBhc3NlZCB0byA8Y29ubmVjdD4gKHdoZXJlCisgKiB0YXJnZXQgY29ycmVzcG9uZHMgdG8gdGhlIGRyb3BUYXJnZXQgYXJndW1lbnQpLiBGaW5hbGx5LCB0aGUgPGNvZGU+dGVybWluYWw8L2NvZGU+CisgKiBwcm9wZXJ0eSBjb3JyZXNwb25kcyB0byB0aGUgdGFyZ2V0IGFyZ3VtZW50IGluIDxjb25uZWN0PiBvciB0aGUgY2xvbmUgb2YgdGhlIHNvdXJjZQorICogdGVybWluYWwgaWYgPGNyZWF0ZVRhcmdldD4gaXMgZW5hYmxlZC4KKyAqIAorICogTm90ZSB0aGF0IHRoZSB0YXJnZXQgaXMgdGhlIGNlbGwgdW5kZXIgdGhlIG1vdXNlIHdoZXJlIHRoZSBtb3VzZSBidXR0b24gd2FzIHJlbGVhc2VkLgorICogRGVwZW5kaW5nIG9uIHRoZSBsb2dpYyBpbiB0aGUgaGFuZGxlciwgdGhpcyBkb2Vzbid0IG5lY2Vzc2FyaWx5IGhhdmUgdG8gYmUgdGhlIHRhcmdldAorICogb2YgdGhlIGluc2VydGVkIGVkZ2UuIFRvIHByaW50IHRoZSBzb3VyY2UsIHRhcmdldCBvciBhbnkgb3B0aW9uYWwgcG9ydHMgSURzIHRoYXQgdGhlCisgKiBlZGdlIGlzIGNvbm5lY3RlZCB0bywgdGhlIGZvbGxvd2luZyBjb2RlIGNhbiBiZSB1c2VkLiBUbyBnZXQgbW9yZSBkZXRhaWxzIGFib3V0IHRoZQorICogYWN0dWFsIGNvbm5lY3Rpb24gcG9pbnQsIDxteEdyYXBoLmdldENvbm5lY3Rpb25Db25zdHJhaW50PiBjYW4gYmUgdXNlZC4gVG8gcmVzb2x2ZQorICogdGhlIHBvcnQgSURzLCB1c2UgPG14R3JhcGhNb2RlbC5nZXRDZWxsPi4KKyAqIAorICogKGNvZGUpCisgKiBncmFwaC5jb25uZWN0aW9uSGFuZGxlci5hZGRMaXN0ZW5lcihteEV2ZW50LkNPTk5FQ1QsIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorICogeworICogICB2YXIgZWRnZSA9IGV2dC5nZXRQcm9wZXJ0eSgnY2VsbCcpOworICogICB2YXIgc291cmNlID0gZ3JhcGguZ2V0TW9kZWwoKS5nZXRUZXJtaW5hbChlZGdlLCB0cnVlKTsKKyAqICAgdmFyIHRhcmdldCA9IGdyYXBoLmdldE1vZGVsKCkuZ2V0VGVybWluYWwoZWRnZSwgZmFsc2UpOworICogICAKKyAqICAgdmFyIHN0eWxlID0gZ3JhcGguZ2V0Q2VsbFN0eWxlKGVkZ2UpOworICogICB2YXIgc291cmNlUG9ydElkID0gc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU09VUkNFX1BPUlRdOworICogICB2YXIgdGFyZ2V0UG9ydElkID0gc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfVEFSR0VUX1BPUlRdOworICogICAKKyAqICAgbXhMb2cuc2hvdygpOworICogICBteExvZy5kZWJ1ZygnY29ubmVjdCcsIGVkZ2UsIHNvdXJjZS5pZCwgdGFyZ2V0LmlkLCBzb3VyY2VQb3J0SWQsIHRhcmdldFBvcnRJZCk7CisgKiB9KTsKKyAqIChlbmQpCisgKgorICogRXZlbnQ6IG14RXZlbnQuUkVTRVQKKyAqIAorICogRmlyZXMgd2hlbiB0aGUgPHJlc2V0PiBtZXRob2QgaXMgaW52b2tlZC4KKyAqCisgKiBDb25zdHJ1Y3RvcjogbXhDb25uZWN0aW9uSGFuZGxlcgorICoKKyAqIENvbnN0cnVjdHMgYW4gZXZlbnQgaGFuZGxlciB0aGF0IGNvbm5lY3RzIHZlcnRpY2VzIHVzaW5nIHRoZSBzcGVjaWZpZWQKKyAqIGZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgbmV3IGVkZ2VzLiBNb2RpZnkKKyAqIDxteENvbnN0YW50cy5BQ1RJVkVfUkVHSU9OPiB0byBzZXR1cCB0aGUgcmVnaW9uIG9uIGEgY2VsbCB3aGljaCB0cmlnZ2VycworICogdGhlIGNyZWF0aW9uIG9mIGEgbmV3IGNvbm5lY3Rpb24gb3IgdXNlIGNvbm5lY3QgaWNvbnMgYXMgZXhwbGFpbmVkCisgKiBhYm92ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZ3JhcGggLSBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKiBmYWN0b3J5TWV0aG9kIC0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBlZGdlLiBUaGUgZnVuY3Rpb24gdGFrZXMKKyAqIHRoZSBzb3VyY2UgYW5kIHRhcmdldCA8bXhDZWxsPiBhcyB0aGUgZmlyc3QgYW5kIHNlY29uZCBhcmd1bWVudCBhbmQgYW4KKyAqIG9wdGlvbmFsIGNlbGwgc3R5bGUgZnJvbSB0aGUgcHJldmlldyBhcyB0aGUgdGhpcmQgYXJndW1lbnQuIEl0IHJldHVybnMKKyAqIHRoZSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIG5ldyBlZGdlLgorICovCitmdW5jdGlvbiBteENvbm5lY3Rpb25IYW5kbGVyKGdyYXBoLCBmYWN0b3J5TWV0aG9kKQoreworCW14RXZlbnRTb3VyY2UuY2FsbCh0aGlzKTsKKwkKKwlpZiAoZ3JhcGggIT0gbnVsbCkKKwl7CisJCXRoaXMuZ3JhcGggPSBncmFwaDsKKwkJdGhpcy5mYWN0b3J5TWV0aG9kID0gZmFjdG9yeU1ldGhvZDsKKwkJdGhpcy5pbml0KCk7CisJCQorCQkvLyBIYW5kbGVzIGVzY2FwZSBrZXlzdHJva2VzCisJCXRoaXMuZXNjYXBlSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihzZW5kZXIsIGV2dCkKKwkJeworCQkJdGhpcy5yZXNldCgpOworCQl9KTsKKwkJCisJCXRoaXMuZ3JhcGguYWRkTGlzdGVuZXIobXhFdmVudC5FU0NBUEUsIHRoaXMuZXNjYXBlSGFuZGxlcik7CisJfQorfTsKKworLyoqCisgKiBFeHRlbmRzIG14RXZlbnRTb3VyY2UuCisgKi8KK214VXRpbHMuZXh0ZW5kKG14Q29ubmVjdGlvbkhhbmRsZXIsIG14RXZlbnRTb3VyY2UpOworCisvKioKKyAqIFZhcmlhYmxlOiBncmFwaAorICogCisgKiBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLmdyYXBoID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZmFjdG9yeU1ldGhvZAorICogCisgKiBGdW5jdGlvbiB0aGF0IGlzIHVzZWQgZm9yIGNyZWF0aW5nIG5ldyBlZGdlcy4gVGhlIGZ1bmN0aW9uIHRha2VzIHRoZQorICogc291cmNlIGFuZCB0YXJnZXQgPG14Q2VsbD4gYXMgdGhlIGZpcnN0IGFuZCBzZWNvbmQgYXJndW1lbnQgYW5kIHJldHVybnMKKyAqIGEgbmV3IDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgZWRnZS4gVGhpcyBpcyB1c2VkIGluIDxjcmVhdGVFZGdlPi4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuZmFjdG9yeU1ldGhvZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IG1vdmVJY29uRnJvbnQKKyAqIAorICogU3BlY2lmaWVzIGlmIGljb25zIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW5zaWRlIHRoZSBncmFwaCBjb250YWluZXIgaW5zdGVhZAorICogb2YgdGhlIG92ZXJsYXkgcGFuZS4gVGhpcyBpcyB1c2VkIGZvciBIVE1MIGxhYmVscyBvbiB2ZXJ0aWNlcyB3aGljaCBoaWRlCisgKiB0aGUgY29ubmVjdCBpY29uLiBUaGlzIGhhcyBwcmVjZW5kZW5jZSBvdmVyIDxtb3ZlSWNvbkJhY2s+IHdoZW4gc2V0CisgKiB0byB0cnVlLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5tb3ZlSWNvbkZyb250ID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IG1vdmVJY29uQmFjaworICogCisgKiBTcGVjaWZpZXMgaWYgaWNvbnMgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBiYWNrIG9mIHRoZSBvdmVybGF5IHBhbmUuIFRoaXMgY2FuCisgKiBiZSBzZXQgdG8gdHJ1ZSBpZiB0aGUgaWNvbnMgb2YgdGhlIGNvbm5lY3Rpb24gaGFuZGxlciBjb25mbGljdCB3aXRoIG90aGVyCisgKiBoYW5kbGVzLCBzdWNoIGFzIHRoZSB2ZXJ0ZXggbGFiZWwgbW92ZSBoYW5kbGUuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLm1vdmVJY29uQmFjayA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBjb25uZWN0SW1hZ2UKKyAqIAorICogPG14SW1hZ2U+IHRoYXQgaXMgdXNlZCB0byB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIG5ldyBjb25uZWN0aW9uLiBUaGlzCisgKiBpcyB1c2VkIGluIDxjcmVhdGVJY29ucz4uIERlZmF1bHQgaXMgbnVsbC4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuY29ubmVjdEltYWdlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogdGFyZ2V0Q29ubmVjdEltYWdlCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgY29ubmVjdCBpY29uIHNob3VsZCBiZSBjZW50ZXJlZCBvbiB0aGUgdGFyZ2V0IHN0YXRlCisgKiB3aGlsZSBjb25uZWN0aW9ucyBhcmUgYmVpbmcgcHJldmlld2VkLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS50YXJnZXRDb25uZWN0SW1hZ2UgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogZW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgZXZlbnRzIGFyZSBoYW5kbGVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLmVuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBzZWxlY3QKKyAqIAorICogU3BlY2lmaWVzIGlmIG5ldyBlZGdlcyBzaG91bGQgYmUgc2VsZWN0ZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuc2VsZWN0ID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogY3JlYXRlVGFyZ2V0CisgKiAKKyAqIFNwZWNpZmllcyBpZiA8Y3JlYXRlVGFyZ2V0VmVydGV4PiBzaG91bGQgYmUgY2FsbGVkIGlmIG5vIHRhcmdldCB3YXMgdW5kZXIgdGhlCisgKiBtb3VzZSBmb3IgdGhlIG5ldyBjb25uZWN0aW9uLiBTZXR0aW5nIHRoaXMgdG8gdHJ1ZSBtZWFucyB0aGUgY29ubmVjdGlvbgorICogd2lsbCBiZSBkcmF3biBhcyB2YWxpZCBpZiBubyB0YXJnZXQgaXMgdW5kZXIgdGhlIG1vdXNlLCBhbmQKKyAqIDxjcmVhdGVUYXJnZXRWZXJ0ZXg+IHdpbGwgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY29ubmVjdGlvbiBpcyBjcmVhdGVkIGJldHdlZW4KKyAqIHRoZSBzb3VyY2UgY2VsbCBhbmQgdGhlIG5ld2x5IGNyZWF0ZWQgdmVydGV4IGluIDxjcmVhdGVUYXJnZXRWZXJ0ZXg+LCB3aGljaAorICogY2FuIGJlIG92ZXJyaWRkZW4gdG8gY3JlYXRlIGEgbmV3IHRhcmdldC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuY3JlYXRlVGFyZ2V0ID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IG1hcmtlcgorICogCisgKiBIb2xkcyB0aGUgPG14VGVybWluYWxNYXJrZXI+IHVzZWQgZm9yIGZpbmRpbmcgc291cmNlIGFuZCB0YXJnZXQgY2VsbHMuCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLm1hcmtlciA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGNvbnN0cmFpbnRIYW5kbGVyCisgKiAKKyAqIEhvbGRzIHRoZSA8bXhDb25zdHJhaW50SGFuZGxlcj4gdXNlZCBmb3IgZHJhd2luZyBhbmQgaGlnaGxpZ2h0aW5nCisgKiBjb25zdHJhaW50cy4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuY29uc3RyYWludEhhbmRsZXIgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBlcnJvcgorICogCisgKiBIb2xkcyB0aGUgY3VycmVudCB2YWxpZGF0aW9uIGVycm9yIHdoaWxlIGNvbm5lY3Rpb25zIGFyZSBiZWluZyBjcmVhdGVkLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5lcnJvciA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHdheXBvaW50c0VuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIHNpbmdsZSBjbGlja3Mgc2hvdWxkIGFkZCB3YXlwb2ludHMgb24gdGhlIG5ldyBlZGdlLiBEZWZhdWx0IGlzCisgKiBmYWxzZS4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUud2F5cG9pbnRzRW5hYmxlZCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBpZ25vcmVNb3VzZURvd24KKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBjb25uZWN0aW9uIGhhbmRsZXIgc2hvdWxkIGlnbm9yZSB0aGUgc3RhdGUgb2YgdGhlIG1vdXNlCisgKiBidXR0b24gd2hlbiBoaWdobGlnaHRpbmcgdGhlIHNvdXJjZS4gRGVmYXVsdCBpcyBmYWxzZSwgdGhhdCBpcywgdGhlCisgKiBoYW5kbGVyIG9ubHkgaGlnaGxpZ2h0cyB0aGUgc291cmNlIGlmIG5vIGJ1dHRvbiBpcyBiZWluZyBwcmVzc2VkLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5pZ25vcmVNb3VzZURvd24gPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogZmlyc3QKKyAqIAorICogSG9sZHMgdGhlIDxteFBvaW50PiB3aGVyZSB0aGUgbW91c2VEb3duIHRvb2sgcGxhY2Ugd2hpbGUgdGhlIGhhbmRsZXIgaXMKKyAqIGFjdGl2ZS4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuZmlyc3QgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjb25uZWN0SWNvbk9mZnNldAorICogCisgKiBIb2xkcyB0aGUgb2Zmc2V0IGZvciBjb25uZWN0IGljb25zIGR1cmluZyBjb25uZWN0aW9uIHByZXZpZXcuCisgKiBEZWZhdWx0IGlzIG14UG9pbnQoMCwgPG14Q29uc3RhbnRzLlRPT0xUSVBfVkVSVElDQUxfT0ZGU0VUPikuCisgKiBOb3RlIHRoYXQgcGxhY2luZyB0aGUgaWNvbiB1bmRlciB0aGUgbW91c2UgcG9pbnRlciB3aXRoIGFuCisgKiBvZmZzZXQgb2YgKDAsMCkgd2lsbCBhZmZlY3QgaGl0IGRldGVjdGlvbi4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuY29ubmVjdEljb25PZmZzZXQgPSBuZXcgbXhQb2ludCgwLCBteENvbnN0YW50cy5UT09MVElQX1ZFUlRJQ0FMX09GRlNFVCk7CisKKy8qKgorICogVmFyaWFibGU6IGVkZ2VTdGF0ZQorICogCisgKiBPcHRpb25hbCA8bXhDZWxsU3RhdGU+IHRoYXQgcmVwcmVzZW50cyB0aGUgcHJldmlldyBlZGdlIHdoaWxlIHRoZQorICogaGFuZGxlciBpcyBhY3RpdmUuIFRoaXMgaXMgY3JlYXRlZCBpbiA8Y3JlYXRlRWRnZVN0YXRlPi4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuZWRnZVN0YXRlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogY2hhbmdlSGFuZGxlcgorICogCisgKiBIb2xkcyB0aGUgY2hhbmdlIGV2ZW50IGxpc3RlbmVyIGZvciBsYXRlciByZW1vdmFsLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5jaGFuZ2VIYW5kbGVyID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZHJpbGxIYW5kbGVyCisgKiAKKyAqIEhvbGRzIHRoZSBkcmlsbCBldmVudCBsaXN0ZW5lciBmb3IgbGF0ZXIgcmVtb3ZhbC4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuZHJpbGxIYW5kbGVyID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbW91c2VEb3duQ291bnRlcgorICogCisgKiBDb3VudHMgdGhlIG51bWJlciBvZiBtb3VzZURvd24gZXZlbnRzIHNpbmNlIHRoZSBzdGFydC4gVGhlIGluaXRpYWwgbW91c2UKKyAqIGRvd24gZXZlbnQgY291bnRzIGFzIDEuCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLm1vdXNlRG93bkNvdW50ZXIgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBtb3ZlUHJldmlld0F3YXkKKyAqIAorICogU3dpdGNoIHRvIGVuYWJsZSBtb3ZpbmcgdGhlIHByZXZpZXcgYXdheSBmcm9tIHRoZSBtb3VzZXBvaW50ZXIuIFRoaXMgaXMgcmVxdWlyZWQgaW4gYnJvd3NlcnMKKyAqIHdoZXJlIHRoZSBwcmV2aWV3IGNhbm5vdCBiZSBtYWRlIHRyYW5zcGFyZW50IHRvIGV2ZW50cyBhbmQgaWYgdGhlIGJ1aWx0LWluIGhpdCBkZXRlY3Rpb24gb24KKyAqIHRoZSBIVE1MIGVsZW1lbnRzIGluIHRoZSBwYWdlIHNob3VsZCBiZSB1c2VkLiBEZWZhdWx0IGlzIHRoZSB2YWx1ZSBvZiA8bXhDbGllbnQuSVNfVk1MPi4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUubW92ZVByZXZpZXdBd2F5ID0gbXhDbGllbnQuSVNfVk1MOworCisvKioKKyAqIFZhcmlhYmxlOiBvdXRsaW5lQ29ubmVjdAorICogCisgKiBTcGVjaWZpZXMgaWYgY29ubmVjdGlvbnMgdG8gdGhlIG91dGxpbmUgb2YgYSBoaWdobGlnaHRlZCB0YXJnZXQgc2hvdWxkIGJlCisgKiBlbmFibGVkLiBUaGlzIHdpbGwgYWxsb3cgdG8gcGxhY2UgdGhlIGNvbm5lY3Rpb24gcG9pbnQgYWxvbmcgdGhlIG91dGxpbmUgb2YKKyAqIHRoZSBoaWdobGlnaHRlZCB0YXJnZXQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLm91dGxpbmVDb25uZWN0ID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGxpdmVQcmV2aWV3CisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgYWN0dWFsIHNoYXBlIG9mIHRoZSBlZGdlIHN0YXRlIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcHJldmlldy4KKyAqIERlZmF1bHQgaXMgZmFsc2UuIChJZ25vcmVkIGlmIG5vIGVkZ2Ugc3RhdGUgaXMgY3JlYXRlZCBpbiA8Y3JlYXRlRWRnZVN0YXRlPi4pCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLmxpdmVQcmV2aWV3ID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGN1cnNvcgorICogCisgKiBTcGVjaWZpZXMgdGhlIGN1cnNvciB0byBiZSB1c2VkIHdoaWxlIHRoZSBoYW5kbGVyIGlzIGFjdGl2ZS4gRGVmYXVsdCBpcyBudWxsLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5jdXJzb3IgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBpbnNlcnRCZWZvcmVTb3VyY2UKKyAqIAorICogU3BlY2lmaWVzIGlmIG5ldyBlZGdlcyBzaG91bGQgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBzb3VyY2UgdmVydGV4IGluIHRoZQorICogY2VsbCBoaWVyYXJjaHkuIERlZmF1bHQgaXMgZmFsc2UgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5pbnNlcnRCZWZvcmVTb3VyY2UgPSBmYWxzZTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFbmFibGVkCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiBldmVudHMgYXJlIGhhbmRsZWQuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIHJldHVybnMgPGVuYWJsZWQ+LgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuZW5hYmxlZDsKK307CisJCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRFbmFibGVkCisgKiAKKyAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgZXZlbnQgaGFuZGxpbmcuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIHVwZGF0ZXMgPGVuYWJsZWQ+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlbmFibGVkIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyB0aGUgbmV3IGVuYWJsZWQgc3RhdGUuCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLnNldEVuYWJsZWQgPSBmdW5jdGlvbihlbmFibGVkKQoreworCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0luc2VydEJlZm9yZQorICogCisgKiBSZXR1cm5zIDxpbnNlcnRCZWZvcmVTb3VyY2U+IGZvciBub24tbG9vcHMgYW5kIGZhbHNlIGZvciBsb29wcy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBlZGdlIHRvIGJlIGluc2VydGVkLgorICogc291cmNlIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBzb3VyY2UgdGVybWluYWwuCisgKiB0YXJnZXQgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHRhcmdldCB0ZXJtaW5hbC4KKyAqIGV2dCAtIE1vdXNlZG93biBldmVudCBvZiB0aGUgY29ubmVjdCBnZXN0dXJlLgorICogZHJvcFRhcmdldCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgY2VsbCB1bmRlciB0aGUgbW91c2Ugd2hlbiBpdCB3YXMKKyAqIHJlbGVhc2VkLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5pc0luc2VydEJlZm9yZSA9IGZ1bmN0aW9uKGVkZ2UsIHNvdXJjZSwgdGFyZ2V0LCBldnQsIGRyb3BUYXJnZXQpCit7CisJcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlU291cmNlICYmIHNvdXJjZSAhPSB0YXJnZXQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NyZWF0ZVRhcmdldAorICogCisgKiBSZXR1cm5zIDxjcmVhdGVUYXJnZXQ+LgorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogZXZ0IC0gQ3VycmVudCBhY3RpdmUgbmF0aXZlIHBvaW50ZXIgZXZlbnQuCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLmlzQ3JlYXRlVGFyZ2V0ID0gZnVuY3Rpb24oZXZ0KQoreworCXJldHVybiB0aGlzLmNyZWF0ZVRhcmdldDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldENyZWF0ZVRhcmdldAorICogCisgKiBTZXRzIDxjcmVhdGVUYXJnZXQ+LgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5zZXRDcmVhdGVUYXJnZXQgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmNyZWF0ZVRhcmdldCA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlU2hhcGUKKyAqIAorICogQ3JlYXRlcyB0aGUgcHJldmlldyBzaGFwZSBmb3IgbmV3IGNvbm5lY3Rpb25zLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5jcmVhdGVTaGFwZSA9IGZ1bmN0aW9uKCkKK3sKKwkvLyBDcmVhdGVzIHRoZSBlZGdlIHByZXZpZXcKKwl2YXIgc2hhcGUgPSAodGhpcy5saXZlUHJldmlldyAmJiB0aGlzLmVkZ2VTdGF0ZSAhPSBudWxsKSA/CisJCXRoaXMuZ3JhcGguY2VsbFJlbmRlcmVyLmNyZWF0ZVNoYXBlKHRoaXMuZWRnZVN0YXRlKSA6CisJCW5ldyBteFBvbHlsaW5lKFtdLCBteENvbnN0YW50cy5JTlZBTElEX0NPTE9SKTsKKwlzaGFwZS5kaWFsZWN0ID0gKHRoaXMuZ3JhcGguZGlhbGVjdCAhPSBteENvbnN0YW50cy5ESUFMRUNUX1NWRykgPworCQlteENvbnN0YW50cy5ESUFMRUNUX1ZNTCA6IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHOworCXNoYXBlLnNjYWxlID0gdGhpcy5ncmFwaC52aWV3LnNjYWxlOworCXNoYXBlLnBvaW50ZXJFdmVudHMgPSBmYWxzZTsKKwlzaGFwZS5pc0Rhc2hlZCA9IHRydWU7CisJc2hhcGUuaW5pdCh0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXRPdmVybGF5UGFuZSgpKTsKKwlteEV2ZW50LnJlZGlyZWN0TW91c2VFdmVudHMoc2hhcGUubm9kZSwgdGhpcy5ncmFwaCwgbnVsbCk7CisKKwlyZXR1cm4gc2hhcGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbml0CisgKiAKKyAqIEluaXRpYWxpemVzIHRoZSBzaGFwZXMgcmVxdWlyZWQgZm9yIHRoaXMgY29ubmVjdGlvbiBoYW5kbGVyLiBUaGlzIHNob3VsZAorICogYmUgaW52b2tlZCBpZiA8bXhHcmFwaC5jb250YWluZXI+IGlzIGFzc2lnbmVkIGFmdGVyIHRoZSBjb25uZWN0aW9uCisgKiBoYW5kbGVyIGhhcyBiZWVuIGNyZWF0ZWQuCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbigpCit7CisJdGhpcy5ncmFwaC5hZGRNb3VzZUxpc3RlbmVyKHRoaXMpOworCXRoaXMubWFya2VyID0gdGhpcy5jcmVhdGVNYXJrZXIoKTsKKwl0aGlzLmNvbnN0cmFpbnRIYW5kbGVyID0gbmV3IG14Q29uc3RyYWludEhhbmRsZXIodGhpcy5ncmFwaCk7CisKKwkvLyBSZWRyYXdzIHRoZSBpY29ucyBpZiB0aGUgZ3JhcGggY2hhbmdlcworCXRoaXMuY2hhbmdlSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihzZW5kZXIpCisJeworCQlpZiAodGhpcy5pY29uU3RhdGUgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5pY29uU3RhdGUgPSB0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXRTdGF0ZSh0aGlzLmljb25TdGF0ZS5jZWxsKTsKKwkJfQorCQkKKwkJaWYgKHRoaXMuaWNvblN0YXRlICE9IG51bGwpCisJCXsKKwkJCXRoaXMucmVkcmF3SWNvbnModGhpcy5pY29ucywgdGhpcy5pY29uU3RhdGUpOworCQkJdGhpcy5jb25zdHJhaW50SGFuZGxlci5yZXNldCgpOworCQl9CisJCWVsc2UgaWYgKHRoaXMucHJldmlvdXMgIT0gbnVsbCAmJiB0aGlzLmdyYXBoLnZpZXcuZ2V0U3RhdGUodGhpcy5wcmV2aW91cy5jZWxsKSA9PSBudWxsKQorCQl7CisJCQl0aGlzLnJlc2V0KCk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmdyYXBoLmdldE1vZGVsKCkuYWRkTGlzdGVuZXIobXhFdmVudC5DSEFOR0UsIHRoaXMuY2hhbmdlSGFuZGxlcik7CisJdGhpcy5ncmFwaC5nZXRWaWV3KCkuYWRkTGlzdGVuZXIobXhFdmVudC5TQ0FMRSwgdGhpcy5jaGFuZ2VIYW5kbGVyKTsKKwl0aGlzLmdyYXBoLmdldFZpZXcoKS5hZGRMaXN0ZW5lcihteEV2ZW50LlRSQU5TTEFURSwgdGhpcy5jaGFuZ2VIYW5kbGVyKTsKKwl0aGlzLmdyYXBoLmdldFZpZXcoKS5hZGRMaXN0ZW5lcihteEV2ZW50LlNDQUxFX0FORF9UUkFOU0xBVEUsIHRoaXMuY2hhbmdlSGFuZGxlcik7CisJCisJLy8gUmVtb3ZlcyB0aGUgaWNvbiBpZiB3ZSBzdGVwIGludG8vdXAgb3Igc3RhcnQgZWRpdGluZworCXRoaXMuZHJpbGxIYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKHNlbmRlcikKKwl7CisJCXRoaXMucmVzZXQoKTsKKwl9KTsKKwkKKwl0aGlzLmdyYXBoLmFkZExpc3RlbmVyKG14RXZlbnQuU1RBUlRfRURJVElORywgdGhpcy5kcmlsbEhhbmRsZXIpOworCXRoaXMuZ3JhcGguZ2V0VmlldygpLmFkZExpc3RlbmVyKG14RXZlbnQuRE9XTiwgdGhpcy5kcmlsbEhhbmRsZXIpOworCXRoaXMuZ3JhcGguZ2V0VmlldygpLmFkZExpc3RlbmVyKG14RXZlbnQuVVAsIHRoaXMuZHJpbGxIYW5kbGVyKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQ29ubmVjdGFibGVDZWxsCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbCBpcyBjb25uZWN0YWJsZS4gVGhpcyBpcyBhIGhvb2sgdG8KKyAqIGRpc2FibGUgZmxvYXRpbmcgY29ubmVjdGlvbnMuIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5pc0Nvbm5lY3RhYmxlQ2VsbCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIHRydWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVNYXJrZXIKKyAqIAorICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgPG14Q2VsbE1hcmtlcj4gdXNlZCBpbiA8bWFya2VyPi4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuY3JlYXRlTWFya2VyID0gZnVuY3Rpb24oKQoreworCXZhciBtYXJrZXIgPSBuZXcgbXhDZWxsTWFya2VyKHRoaXMuZ3JhcGgpOworCW1hcmtlci5ob3RzcG90RW5hYmxlZCA9IHRydWU7CisKKwkvLyBPdmVycmlkZXMgdG8gcmV0dXJuIGNlbGwgYXQgbG9jYXRpb24gb25seSBpZiB2YWxpZCAoc28gdGhhdAorCS8vIHRoZXJlIGlzIG5vIGhpZ2hsaWdodCBmb3IgaW52YWxpZCBjZWxscykKKwltYXJrZXIuZ2V0Q2VsbCA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihtZSkKKwl7CisJCXZhciBjZWxsID0gbXhDZWxsTWFya2VyLnByb3RvdHlwZS5nZXRDZWxsLmFwcGx5KG1hcmtlciwgYXJndW1lbnRzKTsKKwkJdGhpcy5lcnJvciA9IG51bGw7CisJCQorCQkvLyBDaGVja3MgZm9yIGNlbGwgYXQgcHJldmlldyBwb2ludCAod2l0aCBncmlkKQorCQlpZiAoY2VsbCA9PSBudWxsICYmIHRoaXMuY3VycmVudFBvaW50ICE9IG51bGwpCisJCXsKKwkJCWNlbGwgPSB0aGlzLmdyYXBoLmdldENlbGxBdCh0aGlzLmN1cnJlbnRQb2ludC54LCB0aGlzLmN1cnJlbnRQb2ludC55KTsKKwkJfQorCQkKKwkJLy8gVXNlcyBjb25uZWN0YWJsZSBwYXJlbnQgdmVydGV4IGlmIG9uZSBleGlzdHMKKwkJaWYgKGNlbGwgIT0gbnVsbCAmJiAhdGhpcy5ncmFwaC5pc0NlbGxDb25uZWN0YWJsZShjZWxsKSkKKwkJeworCQkJdmFyIHBhcmVudCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5nZXRQYXJlbnQoY2VsbCk7CisJCQkKKwkJCWlmICh0aGlzLmdyYXBoLmdldE1vZGVsKCkuaXNWZXJ0ZXgocGFyZW50KSAmJiB0aGlzLmdyYXBoLmlzQ2VsbENvbm5lY3RhYmxlKHBhcmVudCkpCisJCQl7CisJCQkJY2VsbCA9IHBhcmVudDsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKCh0aGlzLmdyYXBoLmlzU3dpbWxhbmUoY2VsbCkgJiYgdGhpcy5jdXJyZW50UG9pbnQgIT0gbnVsbCAmJgorCQkJdGhpcy5ncmFwaC5oaXRzU3dpbWxhbmVDb250ZW50KGNlbGwsIHRoaXMuY3VycmVudFBvaW50LngsIHRoaXMuY3VycmVudFBvaW50LnkpKSB8fAorCQkJIXRoaXMuaXNDb25uZWN0YWJsZUNlbGwoY2VsbCkpCisJCXsKKwkJCWNlbGwgPSBudWxsOworCQl9CisJCQorCQlpZiAoY2VsbCAhPSBudWxsKQorCQl7CisJCQlpZiAodGhpcy5pc0Nvbm5lY3RpbmcoKSkKKwkJCXsKKwkJCQlpZiAodGhpcy5wcmV2aW91cyAhPSBudWxsKQorCQkJCXsKKwkJCQkJdGhpcy5lcnJvciA9IHRoaXMudmFsaWRhdGVDb25uZWN0aW9uKHRoaXMucHJldmlvdXMuY2VsbCwgY2VsbCk7CisJCQkJCQorCQkJCQlpZiAodGhpcy5lcnJvciAhPSBudWxsICYmIHRoaXMuZXJyb3IubGVuZ3RoID09IDApCisJCQkJCXsKKwkJCQkJCWNlbGwgPSBudWxsOworCQkJCQkJCisJCQkJCQkvLyBFbmFibGVzIGNyZWF0ZSB0YXJnZXQgaW5zaWRlIGdyb3VwcworCQkJCQkJaWYgKHRoaXMuaXNDcmVhdGVUYXJnZXQobWUuZ2V0RXZlbnQoKSkpCisJCQkJCQl7CisJCQkJCQkJdGhpcy5lcnJvciA9IG51bGw7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbHNlIGlmICghdGhpcy5pc1ZhbGlkU291cmNlKGNlbGwsIG1lKSkKKwkJCXsKKwkJCQljZWxsID0gbnVsbDsKKwkJCX0KKwkJfQorCQllbHNlIGlmICh0aGlzLmlzQ29ubmVjdGluZygpICYmICF0aGlzLmlzQ3JlYXRlVGFyZ2V0KG1lLmdldEV2ZW50KCkpICYmCisJCQkJIXRoaXMuZ3JhcGguYWxsb3dEYW5nbGluZ0VkZ2VzKQorCQl7CisJCQl0aGlzLmVycm9yID0gJyc7CisJCX0KKworCQlyZXR1cm4gY2VsbDsKKwl9KTsKKworCS8vIFNldHMgdGhlIGhpZ2hsaWdodCBjb2xvciBhY2NvcmRpbmcgdG8gdmFsaWRhdGVDb25uZWN0aW9uCisJbWFya2VyLmlzVmFsaWRTdGF0ZSA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihzdGF0ZSkKKwl7CisJCWlmICh0aGlzLmlzQ29ubmVjdGluZygpKQorCQl7CisJCQlyZXR1cm4gdGhpcy5lcnJvciA9PSBudWxsOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuIG14Q2VsbE1hcmtlci5wcm90b3R5cGUuaXNWYWxpZFN0YXRlLmFwcGx5KG1hcmtlciwgYXJndW1lbnRzKTsKKwkJfQorCX0pOworCisJLy8gT3ZlcnJpZGVzIHRvIHVzZSBtYXJrZXIgY29sb3Igb25seSBpbiBoaWdobGlnaHQgbW9kZSBvciBmb3IKKwkvLyB0YXJnZXQgc2VsZWN0aW9uCisJbWFya2VyLmdldE1hcmtlckNvbG9yID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCwgc3RhdGUsIGlzVmFsaWQpCisJeworCQlyZXR1cm4gKHRoaXMuY29ubmVjdEltYWdlID09IG51bGwgfHwgdGhpcy5pc0Nvbm5lY3RpbmcoKSkgPworCQkJbXhDZWxsTWFya2VyLnByb3RvdHlwZS5nZXRNYXJrZXJDb2xvci5hcHBseShtYXJrZXIsIGFyZ3VtZW50cykgOgorCQkJbnVsbDsKKwl9KTsKKworCS8vIE92ZXJyaWRlcyB0byB1c2UgaG90c3BvdCBvbmx5IGZvciBzb3VyY2Ugc2VsZWN0aW9uIG90aGVyd2lzZQorCS8vIGludGVyc2VjdHMgYWx3YXlzIHJldHVybnMgdHJ1ZSB3aGVuIG92ZXIgYSBjZWxsCisJbWFya2VyLmludGVyc2VjdHMgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oc3RhdGUsIGV2dCkKKwl7CisJCWlmICh0aGlzLmNvbm5lY3RJbWFnZSAhPSBudWxsIHx8IHRoaXMuaXNDb25uZWN0aW5nKCkpCisJCXsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCQorCQlyZXR1cm4gbXhDZWxsTWFya2VyLnByb3RvdHlwZS5pbnRlcnNlY3RzLmFwcGx5KG1hcmtlciwgYXJndW1lbnRzKTsKKwl9KTsKKworCXJldHVybiBtYXJrZXI7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzdGFydAorICogCisgKiBTdGFydHMgYSBuZXcgY29ubmVjdGlvbiBmb3IgdGhlIGdpdmVuIHN0YXRlIGFuZCBjb29yZGluYXRlcy4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbihzdGF0ZSwgeCwgeSwgZWRnZVN0YXRlKQoreworCXRoaXMucHJldmlvdXMgPSBzdGF0ZTsKKwl0aGlzLmZpcnN0ID0gbmV3IG14UG9pbnQoeCwgeSk7CisJdGhpcy5lZGdlU3RhdGUgPSAoZWRnZVN0YXRlICE9IG51bGwpID8gZWRnZVN0YXRlIDogdGhpcy5jcmVhdGVFZGdlU3RhdGUobnVsbCk7CisJCisJLy8gTWFya3MgdGhlIHNvdXJjZSBzdGF0ZQorCXRoaXMubWFya2VyLmN1cnJlbnRDb2xvciA9IHRoaXMubWFya2VyLnZhbGlkQ29sb3I7CisJdGhpcy5tYXJrZXIubWFya2VkU3RhdGUgPSBzdGF0ZTsKKwl0aGlzLm1hcmtlci5tYXJrKCk7CisKKwl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LlNUQVJULCAnc3RhdGUnLCB0aGlzLnByZXZpb3VzKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0Nvbm5lY3RpbmcKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBzb3VyY2UgdGVybWluYWwgaGFzIGJlZW4gY2xpY2tlZCBhbmQgYSBuZXcKKyAqIGNvbm5lY3Rpb24gaXMgY3VycmVudGx5IGJlaW5nIHByZXZpZXdlZC4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuaXNDb25uZWN0aW5nID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmZpcnN0ICE9IG51bGwgJiYgdGhpcy5zaGFwZSAhPSBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNWYWxpZFNvdXJjZQorICogCisgKiBSZXR1cm5zIDxteEdyYXBoLmlzVmFsaWRTb3VyY2U+IGZvciB0aGUgZ2l2ZW4gc291cmNlIHRlcm1pbmFsLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBzb3VyY2UgdGVybWluYWwuCisgKiBtZSAtIDxteE1vdXNlRXZlbnQ+IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2FsbC4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuaXNWYWxpZFNvdXJjZSA9IGZ1bmN0aW9uKGNlbGwsIG1lKQoreworCXJldHVybiB0aGlzLmdyYXBoLmlzVmFsaWRTb3VyY2UoY2VsbCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1ZhbGlkVGFyZ2V0CisgKiAKKyAqIFJldHVybnMgdHJ1ZS4gVGhlIGNhbGwgdG8gPG14R3JhcGguaXNWYWxpZFRhcmdldD4gaXMgaW1wbGljaXQgYnkgY2FsbGluZworICogPG14R3JhcGguZ2V0RWRnZVZhbGlkYXRpb25FcnJvcj4gaW4gPHZhbGlkYXRlQ29ubmVjdGlvbj4uIFRoaXMgaXMgYW4KKyAqIGFkZGl0aW9uYWwgaG9vayBmb3IgZGlzYWJsaW5nIGNlcnRhaW4gdGFyZ2V0cyBpbiB0aGlzIHNwZWNpZmljIGhhbmRsZXIuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHRhcmdldCB0ZXJtaW5hbC4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuaXNWYWxpZFRhcmdldCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIHRydWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB2YWxpZGF0ZUNvbm5lY3Rpb24KKyAqIAorICogUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGNvbm5lY3Rpb24gZm9yIHRoZQorICogZ2l2ZW4gc291cmNlIHRhcmdldCBwYWlyIGlzIG5vdCB2YWxpZC4gT3RoZXJ3aXNlIGl0IHJldHVybnMgbnVsbC4gVGhpcworICogaW1wbGVtZW50YXRpb24gdXNlcyA8bXhHcmFwaC5nZXRFZGdlVmFsaWRhdGlvbkVycm9yPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc291cmNlIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBzb3VyY2UgdGVybWluYWwuCisgKiB0YXJnZXQgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHRhcmdldCB0ZXJtaW5hbC4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUudmFsaWRhdGVDb25uZWN0aW9uID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQpCit7CisJaWYgKCF0aGlzLmlzVmFsaWRUYXJnZXQodGFyZ2V0KSkKKwl7CisJCXJldHVybiAnJzsKKwl9CisJCisJcmV0dXJuIHRoaXMuZ3JhcGguZ2V0RWRnZVZhbGlkYXRpb25FcnJvcihudWxsLCBzb3VyY2UsIHRhcmdldCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDb25uZWN0SW1hZ2UKKyAqIAorICogSG9vayB0byByZXR1cm4gdGhlIDxteEltYWdlPiB1c2VkIGZvciB0aGUgY29ubmVjdGlvbiBpY29uIG9mIHRoZSBnaXZlbgorICogPG14Q2VsbFN0YXRlPi4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb25uZWN0SW1hZ2U+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gd2hvc2UgY29ubmVjdCBpbWFnZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLmdldENvbm5lY3RJbWFnZSA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXJldHVybiB0aGlzLmNvbm5lY3RJbWFnZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzTW92ZUljb25Ub0Zyb250Rm9yU3RhdGUKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdGF0ZSBoYXMgYSBIVE1MIGxhYmVsIGluIHRoZSBncmFwaCdzIGNvbnRhaW5lciwgb3RoZXJ3aXNlCisgKiBpdCByZXR1cm5zIDxtb3ZlSWNvbkZyb250Pi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHdob3NlIGNvbm5lY3QgaWNvbnMgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5pc01vdmVJY29uVG9Gcm9udEZvclN0YXRlID0gZnVuY3Rpb24oc3RhdGUpCit7CisJaWYgKHN0YXRlLnRleHQgIT0gbnVsbCAmJiBzdGF0ZS50ZXh0Lm5vZGUucGFyZW50Tm9kZSA9PSB0aGlzLmdyYXBoLmNvbnRhaW5lcikKKwl7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwlyZXR1cm4gdGhpcy5tb3ZlSWNvbkZyb250OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlSWNvbnMKKyAqIAorICogQ3JlYXRlcyB0aGUgYXJyYXkgPG14SW1hZ2VTaGFwZXM+IHRoYXQgcmVwcmVzZW50IHRoZSBjb25uZWN0IGljb25zIGZvcgorICogdGhlIGdpdmVuIDxteENlbGxTdGF0ZT4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB3aG9zZSBjb25uZWN0IGljb25zIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuY3JlYXRlSWNvbnMgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwl2YXIgaW1hZ2UgPSB0aGlzLmdldENvbm5lY3RJbWFnZShzdGF0ZSk7CisJCisJaWYgKGltYWdlICE9IG51bGwgJiYgc3RhdGUgIT0gbnVsbCkKKwl7CisJCXRoaXMuaWNvblN0YXRlID0gc3RhdGU7CisJCXZhciBpY29ucyA9IFtdOworCisJCS8vIENhbm5vdCB1c2UgSFRNTCBmb3IgdGhlIGNvbm5lY3QgaWNvbnMgYmVjYXVzZSB0aGUgaWNvbiByZWNlaXZlcyBhbGwKKwkJLy8gbW91c2UgbW92ZSBldmVudHMgaW4gSUUsIG11c3QgdXNlIFZNTCBhbmQgU1ZHIGluc3RlYWQgZXZlbiBpZiB0aGUKKwkJLy8gY29ubmVjdC1pY29uIGFwcGVhcnMgYmVoaW5kIHRoZSBzZWxlY3Rpb24gYm9yZGVyIGFuZCB0aGUgc2VsZWN0aW9uCisJCS8vIGJvcmRlciBjb25zdW1lcyB0aGUgZXZlbnRzIGJlZm9yZSB0aGUgaWNvbiBnZXRzIGEgY2hhbmNlCisJCXZhciBib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUoMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCk7CisJCXZhciBpY29uID0gbmV3IG14SW1hZ2VTaGFwZShib3VuZHMsIGltYWdlLnNyYywgbnVsbCwgbnVsbCwgMCk7CisJCWljb24ucHJlc2VydmVJbWFnZUFzcGVjdCA9IGZhbHNlOworCQkKKwkJaWYgKHRoaXMuaXNNb3ZlSWNvblRvRnJvbnRGb3JTdGF0ZShzdGF0ZSkpCisJCXsKKwkJCWljb24uZGlhbGVjdCA9IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1RSSUNUSFRNTDsKKwkJCWljb24uaW5pdCh0aGlzLmdyYXBoLmNvbnRhaW5lcik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpY29uLmRpYWxlY3QgPSAodGhpcy5ncmFwaC5kaWFsZWN0ID09IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHKSA/CisJCQkJbXhDb25zdGFudHMuRElBTEVDVF9TVkcgOiBteENvbnN0YW50cy5ESUFMRUNUX1ZNTDsKKwkJCWljb24uaW5pdCh0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXRPdmVybGF5UGFuZSgpKTsKKworCQkJLy8gTW92ZSB0aGUgaWNvbiBiYWNrIGluIHRoZSBvdmVybGF5IHBhbmUKKwkJCWlmICh0aGlzLm1vdmVJY29uQmFjayAmJiBpY29uLm5vZGUucHJldmlvdXNTaWJsaW5nICE9IG51bGwpCisJCQl7CisJCQkJaWNvbi5ub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGljb24ubm9kZSwgaWNvbi5ub2RlLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7CisJCQl9CisJCX0KKworCQlpY29uLm5vZGUuc3R5bGUuY3Vyc29yID0gbXhDb25zdGFudHMuQ1VSU09SX0NPTk5FQ1Q7CisKKwkJLy8gRXZlbnRzIHRyYW5zcGFyZW5jeQorCQl2YXIgZ2V0U3RhdGUgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCQl7CisJCQlyZXR1cm4gKHRoaXMuY3VycmVudFN0YXRlICE9IG51bGwpID8gdGhpcy5jdXJyZW50U3RhdGUgOiBzdGF0ZTsKKwkJfSk7CisJCQorCQkvLyBVcGRhdGVzIHRoZSBsb2NhbCBpY29uIGJlZm9yZSBmaXJpbmcgdGhlIG1vdXNlIGRvd24gZXZlbnQuCisJCXZhciBtb3VzZURvd24gPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQl7CisJCQlpZiAoIW14RXZlbnQuaXNDb25zdW1lZChldnQpKQorCQkJeworCQkJCXRoaXMuaWNvbiA9IGljb247CisJCQkJdGhpcy5ncmFwaC5maXJlTW91c2VFdmVudChteEV2ZW50Lk1PVVNFX0RPV04sCisJCQkJCW5ldyBteE1vdXNlRXZlbnQoZXZ0LCBnZXRTdGF0ZSgpKSk7CisJCQl9CisJCX0pOworCisJCW14RXZlbnQucmVkaXJlY3RNb3VzZUV2ZW50cyhpY29uLm5vZGUsIHRoaXMuZ3JhcGgsIGdldFN0YXRlLCBtb3VzZURvd24pOworCQkKKwkJaWNvbnMucHVzaChpY29uKTsKKwkJdGhpcy5yZWRyYXdJY29ucyhpY29ucywgdGhpcy5pY29uU3RhdGUpOworCQkKKwkJcmV0dXJuIGljb25zOworCX0KKwkKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlZHJhd0ljb25zCisgKiAKKyAqIFJlZHJhd3MgdGhlIGdpdmVuIGFycmF5IG9mIDxteEltYWdlU2hhcGVzPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogaWNvbnMgLSBPcHRpb25hbCBhcnJheSBvZiA8bXhJbWFnZVNoYXBlcz4gdG8gYmUgcmVkcmF3bi4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUucmVkcmF3SWNvbnMgPSBmdW5jdGlvbihpY29ucywgc3RhdGUpCit7CisJaWYgKGljb25zICE9IG51bGwgJiYgaWNvbnNbMF0gIT0gbnVsbCAmJiBzdGF0ZSAhPSBudWxsKQorCXsKKwkJdmFyIHBvcyA9IHRoaXMuZ2V0SWNvblBvc2l0aW9uKGljb25zWzBdLCBzdGF0ZSk7CisJCWljb25zWzBdLmJvdW5kcy54ID0gcG9zLng7CisJCWljb25zWzBdLmJvdW5kcy55ID0gcG9zLnk7CisJCWljb25zWzBdLnJlZHJhdygpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJlZHJhd0ljb25zCisgKiAKKyAqIFJlZHJhd3MgdGhlIGdpdmVuIGFycmF5IG9mIDxteEltYWdlU2hhcGVzPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogaWNvbnMgLSBPcHRpb25hbCBhcnJheSBvZiA8bXhJbWFnZVNoYXBlcz4gdG8gYmUgcmVkcmF3bi4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuZ2V0SWNvblBvc2l0aW9uID0gZnVuY3Rpb24oaWNvbiwgc3RhdGUpCit7CisJdmFyIHNjYWxlID0gdGhpcy5ncmFwaC5nZXRWaWV3KCkuc2NhbGU7CisJdmFyIGN4ID0gc3RhdGUuZ2V0Q2VudGVyWCgpOworCXZhciBjeSA9IHN0YXRlLmdldENlbnRlclkoKTsKKwkKKwlpZiAodGhpcy5ncmFwaC5pc1N3aW1sYW5lKHN0YXRlLmNlbGwpKQorCXsKKwkJdmFyIHNpemUgPSB0aGlzLmdyYXBoLmdldFN0YXJ0U2l6ZShzdGF0ZS5jZWxsKTsKKwkJCisJCWN4ID0gKHNpemUud2lkdGggIT0gMCkgPyBzdGF0ZS54ICsgc2l6ZS53aWR0aCAqIHNjYWxlIC8gMiA6IGN4OworCQljeSA9IChzaXplLmhlaWdodCAhPSAwKSA/IHN0YXRlLnkgKyBzaXplLmhlaWdodCAqIHNjYWxlIC8gMiA6IGN5OworCQkKKwkJdmFyIGFscGhhID0gbXhVdGlscy50b1JhZGlhbnMobXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfUk9UQVRJT04pIHx8IDApOworCQkKKwkJaWYgKGFscGhhICE9IDApCisJCXsKKwkJCXZhciBjb3MgPSBNYXRoLmNvcyhhbHBoYSk7CisJCQl2YXIgc2luID0gTWF0aC5zaW4oYWxwaGEpOworCQkJdmFyIGN0ID0gbmV3IG14UG9pbnQoc3RhdGUuZ2V0Q2VudGVyWCgpLCBzdGF0ZS5nZXRDZW50ZXJZKCkpOworCQkJdmFyIHB0ID0gbXhVdGlscy5nZXRSb3RhdGVkUG9pbnQobmV3IG14UG9pbnQoY3gsIGN5KSwgY29zLCBzaW4sIGN0KTsKKwkJCWN4ID0gcHQueDsKKwkJCWN5ID0gcHQueTsKKwkJfQorCX0KKworCXJldHVybiBuZXcgbXhQb2ludChjeCAtIGljb24uYm91bmRzLndpZHRoIC8gMiwKKwkJCWN5IC0gaWNvbi5ib3VuZHMuaGVpZ2h0IC8gMik7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZXN0cm95SWNvbnMKKyAqIAorICogRGVzdHJveXMgdGhlIGNvbm5lY3QgaWNvbnMgYW5kIHJlc2V0cyB0aGUgcmVzcGVjdGl2ZSBzdGF0ZS4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuZGVzdHJveUljb25zID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLmljb25zICE9IG51bGwpCisJeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaWNvbnMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXRoaXMuaWNvbnNbaV0uZGVzdHJveSgpOworCQl9CisJCQorCQl0aGlzLmljb25zID0gbnVsbDsKKwkJdGhpcy5pY29uID0gbnVsbDsKKwkJdGhpcy5zZWxlY3RlZEljb24gPSBudWxsOworCQl0aGlzLmljb25TdGF0ZSA9IG51bGw7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNTdGFydEV2ZW50CisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW91c2UgZG93biBldmVudCBzaG91bGQgc3RhcnQgdGhpcyBoYW5kbGVyLiBUaGUKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBkb2VzIG5vdCBmb3JjZSBtYXJxdWVlCisgKiBzZWxlY3Rpb24sIGFuZCB0aGUgY3VycmVudENvbnN0cmFpbnQgYW5kIGN1cnJlbnRGb2N1cyBvZiB0aGUKKyAqIDxjb25zdHJhaW50SGFuZGxlcj4gYXJlIG5vdCBudWxsLCBvciA8cHJldmlvdXM+IGFuZCA8ZXJyb3I+IGFyZSBub3QgbnVsbCBhbmQKKyAqIDxpY29ucz4gaXMgbnVsbCBvciA8aWNvbnM+IGFuZCA8aWNvbj4gYXJlIG5vdCBudWxsLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5pc1N0YXJ0RXZlbnQgPSBmdW5jdGlvbihtZSkKK3sKKwlyZXR1cm4gKCh0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLmN1cnJlbnRGb2N1cyAhPSBudWxsICYmIHRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudENvbnN0cmFpbnQgIT0gbnVsbCkgfHwKKwkJKHRoaXMucHJldmlvdXMgIT0gbnVsbCAmJiB0aGlzLmVycm9yID09IG51bGwgJiYgKHRoaXMuaWNvbnMgPT0gbnVsbCB8fCAodGhpcy5pY29ucyAhPSBudWxsICYmCisJCXRoaXMuaWNvbiAhPSBudWxsKSkpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdXNlRG93bgorICogCisgKiBIYW5kbGVzIHRoZSBldmVudCBieSBpbml0aWF0aW5nIGEgbmV3IGNvbm5lY3Rpb24uCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLm1vdXNlRG93biA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJdGhpcy5tb3VzZURvd25Db3VudGVyKys7CisJCisJaWYgKHRoaXMuaXNFbmFibGVkKCkgJiYgdGhpcy5ncmFwaC5pc0VuYWJsZWQoKSAmJiAhbWUuaXNDb25zdW1lZCgpICYmCisJCSF0aGlzLmlzQ29ubmVjdGluZygpICYmIHRoaXMuaXNTdGFydEV2ZW50KG1lKSkKKwl7CisJCWlmICh0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLmN1cnJlbnRDb25zdHJhaW50ICE9IG51bGwgJiYKKwkJCXRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudEZvY3VzICE9IG51bGwgJiYKKwkJCXRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudFBvaW50ICE9IG51bGwpCisJCXsKKwkJCXRoaXMuc291cmNlQ29uc3RyYWludCA9IHRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudENvbnN0cmFpbnQ7CisJCQl0aGlzLnByZXZpb3VzID0gdGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50Rm9jdXM7CisJCQl0aGlzLmZpcnN0ID0gdGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50UG9pbnQuY2xvbmUoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFN0b3JlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGluaXRpYWwgbW91c2Vkb3duCisJCQl0aGlzLmZpcnN0ID0gbmV3IG14UG9pbnQobWUuZ2V0R3JhcGhYKCksIG1lLmdldEdyYXBoWSgpKTsKKwkJfQorCQorCQl0aGlzLmVkZ2VTdGF0ZSA9IHRoaXMuY3JlYXRlRWRnZVN0YXRlKG1lKTsKKwkJdGhpcy5tb3VzZURvd25Db3VudGVyID0gMTsKKwkJCisJCWlmICh0aGlzLndheXBvaW50c0VuYWJsZWQgJiYgdGhpcy5zaGFwZSA9PSBudWxsKQorCQl7CisJCQl0aGlzLndheXBvaW50cyA9IG51bGw7CisJCQl0aGlzLnNoYXBlID0gdGhpcy5jcmVhdGVTaGFwZSgpOworCQkJCisJCQlpZiAodGhpcy5lZGdlU3RhdGUgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLnNoYXBlLmFwcGx5KHRoaXMuZWRnZVN0YXRlKTsKKwkJCX0KKwkJfQorCisJCS8vIFN0b3JlcyB0aGUgc3RhcnRpbmcgcG9pbnQgaW4gdGhlIGdlb21ldHJ5IG9mIHRoZSBwcmV2aWV3CisJCWlmICh0aGlzLnByZXZpb3VzID09IG51bGwgJiYgdGhpcy5lZGdlU3RhdGUgIT0gbnVsbCkKKwkJeworCQkJdmFyIHB0ID0gdGhpcy5ncmFwaC5nZXRQb2ludEZvckV2ZW50KG1lLmdldEV2ZW50KCkpOworCQkJdGhpcy5lZGdlU3RhdGUuY2VsbC5nZW9tZXRyeS5zZXRUZXJtaW5hbFBvaW50KHB0LCB0cnVlKTsKKwkJfQorCQkKKwkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5TVEFSVCwgJ3N0YXRlJywgdGhpcy5wcmV2aW91cykpOworCisJCW1lLmNvbnN1bWUoKTsKKwl9CisKKwl0aGlzLnNlbGVjdGVkSWNvbiA9IHRoaXMuaWNvbjsKKwl0aGlzLmljb24gPSBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNJbW1lZGlhdGVDb25uZWN0U291cmNlCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiBhIHRhcCBvbiB0aGUgZ2l2ZW4gc291cmNlIHN0YXRlIHNob3VsZCBpbW1lZGlhdGVseSBzdGFydAorICogY29ubmVjdGluZy4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIHN0YXRlIGlzIG5vdCBtb3ZhYmxlCisgKiBpbiB0aGUgZ3JhcGguIAorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5pc0ltbWVkaWF0ZUNvbm5lY3RTb3VyY2UgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlyZXR1cm4gIXRoaXMuZ3JhcGguaXNDZWxsTW92YWJsZShzdGF0ZS5jZWxsKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUVkZ2VTdGF0ZQorICogCisgKiBIb29rIHRvIHJldHVybiBhbiA8bXhDZWxsU3RhdGU+IHdoaWNoIG1heSBiZSB1c2VkIGR1cmluZyB0aGUgcHJldmlldy4KKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgorICogCisgKiBVc2UgdGhlIGZvbGxvd2luZyBjb2RlIHRvIGNyZWF0ZSBhIHByZXZpZXcgZm9yIGFuIGV4aXN0aW5nIGVkZ2Ugc3R5bGU6CisgKiAKKyAqIChjb2RlKQorICogZ3JhcGguY29ubmVjdGlvbkhhbmRsZXIuY3JlYXRlRWRnZVN0YXRlID0gZnVuY3Rpb24obWUpCisgKiB7CisgKiAgIHZhciBlZGdlID0gZ3JhcGguY3JlYXRlRWRnZShudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAnZWRnZVN0eWxlPWVsYm93RWRnZVN0eWxlJyk7CisgKiAgIAorICogICByZXR1cm4gbmV3IG14Q2VsbFN0YXRlKHRoaXMuZ3JhcGgudmlldywgZWRnZSwgdGhpcy5ncmFwaC5nZXRDZWxsU3R5bGUoZWRnZSkpOworICogfTsKKyAqIChlbmQpCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLmNyZWF0ZUVkZ2VTdGF0ZSA9IGZ1bmN0aW9uKG1lKQoreworCXJldHVybiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNPdXRsaW5lQ29ubmVjdEV2ZW50CisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiA8b3V0bGluZUNvbm5lY3Q+IGlzIHRydWUgYW5kIHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50IGlzIHRoZSBvdXRsaW5lIHNoYXBlCisgKiBvciBzaGlmdCBpcyBwcmVzc2VkLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5pc091dGxpbmVDb25uZWN0RXZlbnQgPSBmdW5jdGlvbihtZSkKK3sKKwl2YXIgb2Zmc2V0ID0gbXhVdGlscy5nZXRPZmZzZXQodGhpcy5ncmFwaC5jb250YWluZXIpOworCXZhciBldnQgPSBtZS5nZXRFdmVudCgpOworCQorCXZhciBjbGllbnRYID0gbXhFdmVudC5nZXRDbGllbnRYKGV2dCk7CisJdmFyIGNsaWVudFkgPSBteEV2ZW50LmdldENsaWVudFkoZXZ0KTsKKwkKKwl2YXIgZG9jID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OworCXZhciBsZWZ0ID0gKHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2Muc2Nyb2xsTGVmdCkgLSAoZG9jLmNsaWVudExlZnQgfHwgMCk7CisJdmFyIHRvcCA9ICh3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jLnNjcm9sbFRvcCkgIC0gKGRvYy5jbGllbnRUb3AgfHwgMCk7CisJCisJdmFyIGdyaWRYID0gdGhpcy5jdXJyZW50UG9pbnQueCAtIHRoaXMuZ3JhcGguY29udGFpbmVyLnNjcm9sbExlZnQgKyBvZmZzZXQueCAtIGxlZnQ7CisJdmFyIGdyaWRZID0gdGhpcy5jdXJyZW50UG9pbnQueSAtIHRoaXMuZ3JhcGguY29udGFpbmVyLnNjcm9sbFRvcCArIG9mZnNldC55IC0gdG9wOworCisJcmV0dXJuIHRoaXMub3V0bGluZUNvbm5lY3QgJiYgIW14RXZlbnQuaXNTaGlmdERvd24obWUuZ2V0RXZlbnQoKSkgJiYKKwkJKG1lLmlzU291cmNlKHRoaXMubWFya2VyLmhpZ2hsaWdodC5zaGFwZSkgfHwKKwkJKG14RXZlbnQuaXNBbHREb3duKG1lLmdldEV2ZW50KCkpICYmIG1lLmdldFN0YXRlKCkgIT0gbnVsbCkgfHwKKwkJdGhpcy5tYXJrZXIuaGlnaGxpZ2h0LmlzSGlnaGxpZ2h0QXQoY2xpZW50WCwgY2xpZW50WSkgfHwKKwkJKChncmlkWCAhPSBjbGllbnRYIHx8IGdyaWRZICE9IGNsaWVudFkpICYmIG1lLmdldFN0YXRlKCkgPT0gbnVsbCAmJgorCQl0aGlzLm1hcmtlci5oaWdobGlnaHQuaXNIaWdobGlnaHRBdChncmlkWCwgZ3JpZFkpKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1cGRhdGVDdXJyZW50U3RhdGUKKyAqIAorICogVXBkYXRlcyB0aGUgY3VycmVudCBzdGF0ZSBmb3IgYSBnaXZlbiBtb3VzZSBtb3ZlIGV2ZW50IGJ5IHVzaW5nCisgKiB0aGUgPG1hcmtlcj4uCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLnVwZGF0ZUN1cnJlbnRTdGF0ZSA9IGZ1bmN0aW9uKG1lLCBwb2ludCkKK3sKKwl0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLnVwZGF0ZShtZSwgdGhpcy5maXJzdCA9PSBudWxsLCBmYWxzZSwgKHRoaXMuZmlyc3QgPT0gbnVsbCB8fAorCQltZS5pc1NvdXJjZSh0aGlzLm1hcmtlci5oaWdobGlnaHQuc2hhcGUpKSA/IG51bGwgOiBwb2ludCk7CisJCisJaWYgKHRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudEZvY3VzICE9IG51bGwgJiYgdGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50Q29uc3RyYWludCAhPSBudWxsKQorCXsKKwkJLy8gSGFuZGxlcyBzcGVjaWFsIGNhc2Ugd2hlcmUgZ3JpZCBpcyBsYXJnZSBhbmQgY29ubmVjdGlvbiBwb2ludCBpcyBhdCBhY3R1YWwgcG9pbnQgaW4gd2hpY2gKKwkJLy8gY2FzZSB0aGUgb3V0bGluZSBpcyBub3QgZm9sbG93ZWQgYXMgbG9uZyBhcyB3ZSdyZSA8IGdyaWRTaXplIC8gMiBhd2F5IGZyb20gdGhhdCBwb2ludAorCQlpZiAodGhpcy5tYXJrZXIuaGlnaGxpZ2h0ICE9IG51bGwgJiYgdGhpcy5tYXJrZXIuaGlnaGxpZ2h0LnN0YXRlICE9IG51bGwgJiYKKwkJCXRoaXMubWFya2VyLmhpZ2hsaWdodC5zdGF0ZS5jZWxsID09IHRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudEZvY3VzLmNlbGwpCisJCXsKKwkJCS8vIERpcmVjdCByZXBhaW50IG5lZWRlZCBpZiBjZWxsIGFscmVhZHkgaGlnaGxpZ2h0ZWQKKwkJCWlmICh0aGlzLm1hcmtlci5oaWdobGlnaHQuc2hhcGUuc3Ryb2tlICE9ICd0cmFuc3BhcmVudCcpCisJCQl7CisJCQkJdGhpcy5tYXJrZXIuaGlnaGxpZ2h0LnNoYXBlLnN0cm9rZSA9ICd0cmFuc3BhcmVudCc7CisJCQkJdGhpcy5tYXJrZXIuaGlnaGxpZ2h0LnJlcGFpbnQoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXRoaXMubWFya2VyLm1hcmtDZWxsKHRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudEZvY3VzLmNlbGwsICd0cmFuc3BhcmVudCcpOworCQl9CisKKwkJLy8gVXBkYXRlcyB2YWxpZGF0aW9uIHN0YXRlCisJCWlmICh0aGlzLnByZXZpb3VzICE9IG51bGwpCisJCXsKKwkJCXRoaXMuZXJyb3IgPSB0aGlzLnZhbGlkYXRlQ29ubmVjdGlvbih0aGlzLnByZXZpb3VzLmNlbGwsIHRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudEZvY3VzLmNlbGwpOworCQkJCisJCQlpZiAodGhpcy5lcnJvciA9PSBudWxsKQorCQkJeworCQkJCXRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50Rm9jdXM7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdGhpcy5jb25zdHJhaW50SGFuZGxlci5yZXNldCgpOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCWlmICh0aGlzLmdyYXBoLmlzSWdub3JlVGVybWluYWxFdmVudChtZS5nZXRFdmVudCgpKSkKKwkJeworCQkJdGhpcy5tYXJrZXIucmVzZXQoKTsKKwkJCXRoaXMuY3VycmVudFN0YXRlID0gbnVsbDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRoaXMubWFya2VyLnByb2Nlc3MobWUpOworCQkJdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLm1hcmtlci5nZXRWYWxpZFN0YXRlKCk7CisJCX0KKworCQl2YXIgb3V0bGluZSA9IHRoaXMuaXNPdXRsaW5lQ29ubmVjdEV2ZW50KG1lKTsKKwkJCisJCWlmICh0aGlzLmN1cnJlbnRTdGF0ZSAhPSBudWxsICYmIG91dGxpbmUpCisJCXsKKwkJCS8vIEhhbmRsZXMgc3BlY2lhbCBjYXNlIHdoZXJlIG1vdXNlIGlzIG9uIG91dGxpbmUgYXdheSBmcm9tIGFjdHVhbCBlbmQgcG9pbnQKKwkJCS8vIGluIHdoaWNoIGNhc2UgdGhlIGdyaWQgaXMgaWdub3JlZCBhbmQgbW91c2UgcG9pbnQgaXMgdXNlZCBpbnN0ZWFkCisJCQlpZiAobWUuaXNTb3VyY2UodGhpcy5tYXJrZXIuaGlnaGxpZ2h0LnNoYXBlKSkKKwkJCXsKKwkJCQlwb2ludCA9IG5ldyBteFBvaW50KG1lLmdldEdyYXBoWCgpLCBtZS5nZXRHcmFwaFkoKSk7CisJCQl9CisJCQkKKwkJCXZhciBjb25zdHJhaW50ID0gdGhpcy5ncmFwaC5nZXRPdXRsaW5lQ29uc3RyYWludChwb2ludCwgdGhpcy5jdXJyZW50U3RhdGUsIG1lKTsKKwkJCXRoaXMuY29uc3RyYWludEhhbmRsZXIuc2V0Rm9jdXMobWUsIHRoaXMuY3VycmVudFN0YXRlLCBmYWxzZSk7CisJCQl0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLmN1cnJlbnRDb25zdHJhaW50ID0gY29uc3RyYWludDsKKwkJCXRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudFBvaW50ID0gcG9pbnQ7CisJCX0KKworCQlpZiAodGhpcy5vdXRsaW5lQ29ubmVjdCkKKwkJeworCQkJaWYgKHRoaXMubWFya2VyLmhpZ2hsaWdodCAhPSBudWxsICYmIHRoaXMubWFya2VyLmhpZ2hsaWdodC5zaGFwZSAhPSBudWxsKQorCQkJeworCQkJCXZhciBzID0gdGhpcy5ncmFwaC52aWV3LnNjYWxlOworCQkJCQorCQkJCWlmICh0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLmN1cnJlbnRDb25zdHJhaW50ICE9IG51bGwgJiYKKwkJCQkJdGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50Rm9jdXMgIT0gbnVsbCkKKwkJCQl7CisJCQkJCXRoaXMubWFya2VyLmhpZ2hsaWdodC5zaGFwZS5zdHJva2UgPSBteENvbnN0YW50cy5PVVRMSU5FX0hJR0hMSUdIVF9DT0xPUjsKKwkJCQkJdGhpcy5tYXJrZXIuaGlnaGxpZ2h0LnNoYXBlLnN0cm9rZXdpZHRoID0gbXhDb25zdGFudHMuT1VUTElORV9ISUdITElHSFRfU1RST0tFV0lEVEggLyBzIC8gczsKKwkJCQkJdGhpcy5tYXJrZXIuaGlnaGxpZ2h0LnJlcGFpbnQoKTsKKwkJCQl9IAorCQkJCWVsc2UgaWYgKHRoaXMubWFya2VyLmhhc1ZhbGlkU3RhdGUoKSkKKwkJCQl7CisJCQkJCS8vIEhhbmRsZXMgc3BlY2lhbCBjYXNlIHdoZXJlIGFjdHVhbCBlbmQgcG9pbnQgb2YgZWRnZSBhbmQgY3VycmVudCBtb3VzZSBwb2ludAorCQkJCQkvLyBhcmUgbm90IGVxdWFsIChkdWUgdG8gZ3JpZCBzbmFwcGluZykgYW5kIHRoZXJlIGlzIG5vIGhpdCBvbiBzaGFwZSBvciBoaWdobGlnaHQKKwkJCQkJaWYgKHRoaXMubWFya2VyLmdldFZhbGlkU3RhdGUoKSAhPSBtZS5nZXRTdGF0ZSgpKQorCQkJCQl7CisJCQkJCQl0aGlzLm1hcmtlci5oaWdobGlnaHQuc2hhcGUuc3Ryb2tlID0gJ3RyYW5zcGFyZW50JzsKKwkJCQkJCXRoaXMuY3VycmVudFN0YXRlID0gbnVsbDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXRoaXMubWFya2VyLmhpZ2hsaWdodC5zaGFwZS5zdHJva2UgPSBteENvbnN0YW50cy5ERUZBVUxUX1ZBTElEX0NPTE9SOworCQkJCQl9CisJCisJCQkJCXRoaXMubWFya2VyLmhpZ2hsaWdodC5zaGFwZS5zdHJva2V3aWR0aCA9IG14Q29uc3RhbnRzLkhJR0hMSUdIVF9TVFJPS0VXSURUSCAvIHMgLyBzOworCQkJCQl0aGlzLm1hcmtlci5oaWdobGlnaHQucmVwYWludCgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGNvbnZlcnRXYXlwb2ludAorICogCisgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gcG9pbnQgZnJvbSBzY3JlZW4gY29vcmRpbmF0ZXMgdG8gbW9kZWwgY29vcmRpbmF0ZXMuCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLmNvbnZlcnRXYXlwb2ludCA9IGZ1bmN0aW9uKHBvaW50KQoreworCXZhciBzY2FsZSA9IHRoaXMuZ3JhcGguZ2V0VmlldygpLmdldFNjYWxlKCk7CisJdmFyIHRyID0gdGhpcy5ncmFwaC5nZXRWaWV3KCkuZ2V0VHJhbnNsYXRlKCk7CisJCisJcG9pbnQueCA9IHBvaW50LnggLyBzY2FsZSAtIHRyLng7CisJcG9pbnQueSA9IHBvaW50LnkgLyBzY2FsZSAtIHRyLnk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzbmFwVG9QcmV2aWV3CisgKiAKKyAqIENhbGxlZCB0byBzbmFwIHRoZSBnaXZlbiBwb2ludCB0byB0aGUgY3VycmVudCBwcmV2aWV3LiBUaGlzIHNuYXBzIHRvIHRoZQorICogZmlyc3QgcG9pbnQgb2YgdGhlIHByZXZpZXcgaWYgYWx0IGlzIG5vdCBwcmVzc2VkLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5zbmFwVG9QcmV2aWV3ID0gZnVuY3Rpb24obWUsIHBvaW50KQoreworCWlmICghbXhFdmVudC5pc0FsdERvd24obWUuZ2V0RXZlbnQoKSkgJiYgdGhpcy5wcmV2aW91cyAhPSBudWxsKQorCXsKKwkJdmFyIHRvbCA9IHRoaXMuZ3JhcGguZ3JpZFNpemUgKiB0aGlzLmdyYXBoLnZpZXcuc2NhbGUgLyAyOwkKKwkJdmFyIHRtcCA9ICh0aGlzLnNvdXJjZUNvbnN0cmFpbnQgIT0gbnVsbCkgPyB0aGlzLmZpcnN0IDoKKwkJCW5ldyBteFBvaW50KHRoaXMucHJldmlvdXMuZ2V0Q2VudGVyWCgpLCB0aGlzLnByZXZpb3VzLmdldENlbnRlclkoKSk7CisKKwkJaWYgKE1hdGguYWJzKHRtcC54IC0gbWUuZ2V0R3JhcGhYKCkpIDwgdG9sKQorCQl7CisJCQlwb2ludC54ID0gdG1wLng7CisJCX0KKwkJCisJCWlmIChNYXRoLmFicyh0bXAueSAtIG1lLmdldEdyYXBoWSgpKSA8IHRvbCkKKwkJeworCQkJcG9pbnQueSA9IHRtcC55OworCQl9CisJfQkKK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdXNlTW92ZQorICogCisgKiBIYW5kbGVzIHRoZSBldmVudCBieSB1cGRhdGluZyB0aGUgcHJldmlldyBlZGdlIG9yIGJ5IGhpZ2hsaWdodGluZworICogYSBwb3NzaWJsZSBzb3VyY2Ugb3IgdGFyZ2V0IHRlcm1pbmFsLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5tb3VzZU1vdmUgPSBmdW5jdGlvbihzZW5kZXIsIG1lKQoreworCWlmICghbWUuaXNDb25zdW1lZCgpICYmICh0aGlzLmlnbm9yZU1vdXNlRG93biB8fCB0aGlzLmZpcnN0ICE9IG51bGwgfHwgIXRoaXMuZ3JhcGguaXNNb3VzZURvd24pKQorCXsKKwkJLy8gSGFuZGxlcyBzcGVjaWFsIGNhc2Ugd2hlbiBoYW5kbGVyIGlzIGRpc2FibGVkIGR1cmluZyBoaWdobGlnaHQKKwkJaWYgKCF0aGlzLmlzRW5hYmxlZCgpICYmIHRoaXMuY3VycmVudFN0YXRlICE9IG51bGwpCisJCXsKKwkJCXRoaXMuZGVzdHJveUljb25zKCk7CisJCQl0aGlzLmN1cnJlbnRTdGF0ZSA9IG51bGw7CisJCX0KKworCQl2YXIgdmlldyA9IHRoaXMuZ3JhcGguZ2V0VmlldygpOworCQl2YXIgc2NhbGUgPSB2aWV3LnNjYWxlOworCQl2YXIgdHIgPSB2aWV3LnRyYW5zbGF0ZTsKKwkJdmFyIHBvaW50ID0gbmV3IG14UG9pbnQobWUuZ2V0R3JhcGhYKCksIG1lLmdldEdyYXBoWSgpKTsKKwkJdGhpcy5lcnJvciA9IG51bGw7CisKKwkJaWYgKHRoaXMuZ3JhcGguaXNHcmlkRW5hYmxlZEV2ZW50KG1lLmdldEV2ZW50KCkpKQorCQl7CisJCQlwb2ludCA9IG5ldyBteFBvaW50KCh0aGlzLmdyYXBoLnNuYXAocG9pbnQueCAvIHNjYWxlIC0gdHIueCkgKyB0ci54KSAqIHNjYWxlLAorCQkJCSh0aGlzLmdyYXBoLnNuYXAocG9pbnQueSAvIHNjYWxlIC0gdHIueSkgKyB0ci55KSAqIHNjYWxlKTsKKwkJfQorCQkKKwkJdGhpcy5zbmFwVG9QcmV2aWV3KG1lLCBwb2ludCk7CisJCXRoaXMuY3VycmVudFBvaW50ID0gcG9pbnQ7CisJCQorCQlpZiAodGhpcy5maXJzdCAhPSBudWxsIHx8ICh0aGlzLmlzRW5hYmxlZCgpICYmIHRoaXMuZ3JhcGguaXNFbmFibGVkKCkpKQorCQl7CisJCQl0aGlzLnVwZGF0ZUN1cnJlbnRTdGF0ZShtZSwgcG9pbnQpOworCQl9CisKKwkJaWYgKHRoaXMuZmlyc3QgIT0gbnVsbCkKKwkJeworCQkJdmFyIGNvbnN0cmFpbnQgPSBudWxsOworCQkJdmFyIGN1cnJlbnQgPSBwb2ludDsKKwkJCQorCQkJLy8gVXNlcyB0aGUgY3VycmVudCBwb2ludCBmcm9tIHRoZSBjb25zdHJhaW50IGhhbmRsZXIgaWYgYXZhaWxhYmxlCisJCQlpZiAodGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50Q29uc3RyYWludCAhPSBudWxsICYmCisJCQkJdGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50Rm9jdXMgIT0gbnVsbCAmJgorCQkJCXRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudFBvaW50ICE9IG51bGwpCisJCQl7CisJCQkJY29uc3RyYWludCA9IHRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudENvbnN0cmFpbnQ7CisJCQkJY3VycmVudCA9IHRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudFBvaW50LmNsb25lKCk7CisJCQl9CisJCQllbHNlIGlmICh0aGlzLnByZXZpb3VzICE9IG51bGwgJiYgIXRoaXMuZ3JhcGguaXNJZ25vcmVUZXJtaW5hbEV2ZW50KG1lLmdldEV2ZW50KCkpICYmIG14RXZlbnQuaXNTaGlmdERvd24obWUuZ2V0RXZlbnQoKSkpCisJCQl7CisJCQkJaWYgKE1hdGguYWJzKHRoaXMucHJldmlvdXMuZ2V0Q2VudGVyWCgpIC0gcG9pbnQueCkgPCBNYXRoLmFicyh0aGlzLnByZXZpb3VzLmdldENlbnRlclkoKSAtIHBvaW50LnkpKQorCQkJCXsKKwkJCQkJcG9pbnQueCA9IHRoaXMucHJldmlvdXMuZ2V0Q2VudGVyWCgpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwb2ludC55ID0gdGhpcy5wcmV2aW91cy5nZXRDZW50ZXJZKCk7CisJCQkJfQorCQkJfQorCQkJCisJCQl2YXIgcHQyID0gdGhpcy5maXJzdDsKKwkJCQorCQkJLy8gTW92ZXMgdGhlIGNvbm5lY3QgaWNvbiB3aXRoIHRoZSBtb3VzZQorCQkJaWYgKHRoaXMuc2VsZWN0ZWRJY29uICE9IG51bGwpCisJCQl7CisJCQkJdmFyIHcgPSB0aGlzLnNlbGVjdGVkSWNvbi5ib3VuZHMud2lkdGg7CisJCQkJdmFyIGggPSB0aGlzLnNlbGVjdGVkSWNvbi5ib3VuZHMuaGVpZ2h0OworCQkJCQorCQkJCWlmICh0aGlzLmN1cnJlbnRTdGF0ZSAhPSBudWxsICYmIHRoaXMudGFyZ2V0Q29ubmVjdEltYWdlKQorCQkJCXsKKwkJCQkJdmFyIHBvcyA9IHRoaXMuZ2V0SWNvblBvc2l0aW9uKHRoaXMuc2VsZWN0ZWRJY29uLCB0aGlzLmN1cnJlbnRTdGF0ZSk7CisJCQkJCXRoaXMuc2VsZWN0ZWRJY29uLmJvdW5kcy54ID0gcG9zLng7CisJCQkJCXRoaXMuc2VsZWN0ZWRJY29uLmJvdW5kcy55ID0gcG9zLnk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXZhciBib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUobWUuZ2V0R3JhcGhYKCkgKyB0aGlzLmNvbm5lY3RJY29uT2Zmc2V0LngsCisJCQkJCQltZS5nZXRHcmFwaFkoKSArIHRoaXMuY29ubmVjdEljb25PZmZzZXQueSwgdywgaCk7CisJCQkJCXRoaXMuc2VsZWN0ZWRJY29uLmJvdW5kcyA9IGJvdW5kczsKKwkJCQl9CisJCQkJCisJCQkJdGhpcy5zZWxlY3RlZEljb24ucmVkcmF3KCk7CisJCQl9CisKKwkJCS8vIFVzZXMgZWRnZSBzdGF0ZSB0byBjb21wdXRlIHRoZSB0ZXJtaW5hbCBwb2ludHMKKwkJCWlmICh0aGlzLmVkZ2VTdGF0ZSAhPSBudWxsKQorCQkJeworCQkJCXRoaXMudXBkYXRlRWRnZVN0YXRlKGN1cnJlbnQsIGNvbnN0cmFpbnQpOworCQkJCWN1cnJlbnQgPSB0aGlzLmVkZ2VTdGF0ZS5hYnNvbHV0ZVBvaW50c1t0aGlzLmVkZ2VTdGF0ZS5hYnNvbHV0ZVBvaW50cy5sZW5ndGggLSAxXTsKKwkJCQlwdDIgPSB0aGlzLmVkZ2VTdGF0ZS5hYnNvbHV0ZVBvaW50c1swXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAodGhpcy5jdXJyZW50U3RhdGUgIT0gbnVsbCkKKwkJCQl7CisJCQkJCWlmICh0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLmN1cnJlbnRDb25zdHJhaW50ID09IG51bGwpCisJCQkJCXsKKwkJCQkJCXZhciB0bXAgPSB0aGlzLmdldFRhcmdldFBlcmltZXRlclBvaW50KHRoaXMuY3VycmVudFN0YXRlLCBtZSk7CisJCQkJCQkKKwkJCQkJCWlmICh0bXAgIT0gbnVsbCkKKwkJCQkJCXsKKwkJCQkJCQljdXJyZW50ID0gdG1wOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCS8vIENvbXB1dGVzIHRoZSBzb3VyY2UgcGVyaW1ldGVyIHBvaW50CisJCQkJaWYgKHRoaXMuc291cmNlQ29uc3RyYWludCA9PSBudWxsICYmIHRoaXMucHJldmlvdXMgIT0gbnVsbCkKKwkJCQl7CisJCQkJCXZhciBuZXh0ID0gKHRoaXMud2F5cG9pbnRzICE9IG51bGwgJiYgdGhpcy53YXlwb2ludHMubGVuZ3RoID4gMCkgPworCQkJCQkJCXRoaXMud2F5cG9pbnRzWzBdIDogY3VycmVudDsKKwkJCQkJdmFyIHRtcCA9IHRoaXMuZ2V0U291cmNlUGVyaW1ldGVyUG9pbnQodGhpcy5wcmV2aW91cywgbmV4dCwgbWUpOworCQkJCQkKKwkJCQkJaWYgKHRtcCAhPSBudWxsKQorCQkJCQl7CisJCQkJCQlwdDIgPSB0bXA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIE1ha2VzIHN1cmUgdGhlIGNlbGwgdW5kZXIgdGhlIG1vdXNlcG9pbnRlciBjYW4gYmUgZGV0ZWN0ZWQKKwkJCS8vIGJ5IG1vdmluZyB0aGUgcHJldmlldyBzaGFwZSBhd2F5IGZyb20gdGhlIG1vdXNlLiBUaGlzCisJCQkvLyBtYWtlcyBzdXJlIHRoZSBwcmV2aWV3IHNoYXBlIGRvZXMgbm90IHByZXZlbnQgdGhlIGRldGVjdGlvbgorCQkJLy8gb2YgdGhlIGNlbGwgdW5kZXIgdGhlIG1vdXNlcG9pbnRlciBldmVuIGZvciBzbG93IGdlc3R1cmVzLgorCQkJaWYgKHRoaXMuY3VycmVudFN0YXRlID09IG51bGwgJiYgdGhpcy5tb3ZlUHJldmlld0F3YXkpCisJCQl7CisJCQkJdmFyIHRtcCA9IHB0MjsgCisJCQkJCisJCQkJaWYgKHRoaXMuZWRnZVN0YXRlICE9IG51bGwgJiYgdGhpcy5lZGdlU3RhdGUuYWJzb2x1dGVQb2ludHMubGVuZ3RoID49IDIpCisJCQkJeworCQkJCQl2YXIgdG1wMiA9IHRoaXMuZWRnZVN0YXRlLmFic29sdXRlUG9pbnRzW3RoaXMuZWRnZVN0YXRlLmFic29sdXRlUG9pbnRzLmxlbmd0aCAtIDJdOworCQkJCQkKKwkJCQkJaWYgKHRtcDIgIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJdG1wID0gdG1wMjsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQl2YXIgZHggPSBjdXJyZW50LnggLSB0bXAueDsKKwkJCQl2YXIgZHkgPSBjdXJyZW50LnkgLSB0bXAueTsKKwkJCQkKKwkJCQl2YXIgbGVuID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTsKKwkJCQkKKwkJCQlpZiAobGVuID09IDApCisJCQkJeworCQkJCQlyZXR1cm47CisJCQkJfQorCisJCQkJLy8gU3RvcmVzIG9sZCBwb2ludCB0byByZXVzZSB3aGVuIGNyZWF0aW5nIGVkZ2UKKwkJCQl0aGlzLm9yaWdpbmFsUG9pbnQgPSBjdXJyZW50LmNsb25lKCk7CisJCQkJY3VycmVudC54IC09IGR4ICogNCAvIGxlbjsKKwkJCQljdXJyZW50LnkgLT0gZHkgKiA0IC8gbGVuOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRoaXMub3JpZ2luYWxQb2ludCA9IG51bGw7CisJCQl9CisJCQkKKwkJCS8vIENyZWF0ZXMgdGhlIHByZXZpZXcgc2hhcGUgKGxhenkpCisJCQlpZiAodGhpcy5zaGFwZSA9PSBudWxsKQorCQkJeworCQkJCXZhciBkeCA9IE1hdGguYWJzKHBvaW50LnggLSB0aGlzLmZpcnN0LngpOworCQkJCXZhciBkeSA9IE1hdGguYWJzKHBvaW50LnkgLSB0aGlzLmZpcnN0LnkpOworCisJCQkJaWYgKGR4ID4gdGhpcy5ncmFwaC50b2xlcmFuY2UgfHwgZHkgPiB0aGlzLmdyYXBoLnRvbGVyYW5jZSkKKwkJCQl7CisJCQkJCXRoaXMuc2hhcGUgPSB0aGlzLmNyZWF0ZVNoYXBlKCk7CisKKwkJCQkJaWYgKHRoaXMuZWRnZVN0YXRlICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCXRoaXMuc2hhcGUuYXBwbHkodGhpcy5lZGdlU3RhdGUpOworCQkJCQl9CisJCQkJCQorCQkJCQkvLyBSZXZhbGlkYXRlcyBjdXJyZW50IGNvbm5lY3Rpb24KKwkJCQkJdGhpcy51cGRhdGVDdXJyZW50U3RhdGUobWUsIHBvaW50KTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIFVwZGF0ZXMgdGhlIHBvaW50cyBpbiB0aGUgcHJldmlldyBlZGdlCisJCQlpZiAodGhpcy5zaGFwZSAhPSBudWxsKQorCQkJeworCQkJCWlmICh0aGlzLmVkZ2VTdGF0ZSAhPSBudWxsKQorCQkJCXsKKwkJCQkJdGhpcy5zaGFwZS5wb2ludHMgPSB0aGlzLmVkZ2VTdGF0ZS5hYnNvbHV0ZVBvaW50czsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdmFyIHB0cyA9IFtwdDJdOworCQkJCQkKKwkJCQkJaWYgKHRoaXMud2F5cG9pbnRzICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCXB0cyA9IHB0cy5jb25jYXQodGhpcy53YXlwb2ludHMpOworCQkJCQl9CisKKwkJCQkJcHRzLnB1c2goY3VycmVudCk7CisJCQkJCXRoaXMuc2hhcGUucG9pbnRzID0gcHRzOworCQkJCX0KKwkJCQkKKwkJCQl0aGlzLmRyYXdQcmV2aWV3KCk7CisJCQl9CisJCQkKKwkJCS8vIE1ha2VzIHN1cmUgZW5kcG9pbnQgb2YgZWRnZSBpcyB2aXNpYmxlIGR1cmluZyBjb25uZWN0CisJCQlpZiAodGhpcy5jdXJzb3IgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLmdyYXBoLmNvbnRhaW5lci5zdHlsZS5jdXJzb3IgPSB0aGlzLmN1cnNvcjsKKwkJCX0KKwkJCQorCQkJbXhFdmVudC5jb25zdW1lKG1lLmdldEV2ZW50KCkpOworCQkJbWUuY29uc3VtZSgpOworCQl9CisJCWVsc2UgaWYgKCF0aGlzLmlzRW5hYmxlZCgpIHx8ICF0aGlzLmdyYXBoLmlzRW5hYmxlZCgpKQorCQl7CisJCQl0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLnJlc2V0KCk7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5wcmV2aW91cyAhPSB0aGlzLmN1cnJlbnRTdGF0ZSAmJiB0aGlzLmVkZ2VTdGF0ZSA9PSBudWxsKQorCQl7CisJCQl0aGlzLmRlc3Ryb3lJY29ucygpOworCQkJCisJCQkvLyBTZXRzIHRoZSBjdXJzb3Igb24gdGhlIGN1cnJlbnQgc2hhcGUJCQkJCisJCQlpZiAodGhpcy5jdXJyZW50U3RhdGUgIT0gbnVsbCAmJiB0aGlzLmVycm9yID09IG51bGwgJiYgdGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50Q29uc3RyYWludCA9PSBudWxsKQorCQkJeworCQkJCXRoaXMuaWNvbnMgPSB0aGlzLmNyZWF0ZUljb25zKHRoaXMuY3VycmVudFN0YXRlKTsKKworCQkJCWlmICh0aGlzLmljb25zID09IG51bGwpCisJCQkJeworCQkJCQl0aGlzLmN1cnJlbnRTdGF0ZS5zZXRDdXJzb3IobXhDb25zdGFudHMuQ1VSU09SX0NPTk5FQ1QpOworCQkJCQltZS5jb25zdW1lKCk7CisJCQkJfQorCQkJfQorCisJCQl0aGlzLnByZXZpb3VzID0gdGhpcy5jdXJyZW50U3RhdGU7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5wcmV2aW91cyA9PSB0aGlzLmN1cnJlbnRTdGF0ZSAmJiB0aGlzLmN1cnJlbnRTdGF0ZSAhPSBudWxsICYmIHRoaXMuaWNvbnMgPT0gbnVsbCAmJgorCQkJIXRoaXMuZ3JhcGguaXNNb3VzZURvd24pCisJCXsKKwkJCS8vIE1ha2VzIHN1cmUgdGhhdCBubyBjdXJzb3JzIGFyZSBjaGFuZ2VkCisJCQltZS5jb25zdW1lKCk7CisJCX0KKworCQlpZiAoIXRoaXMuZ3JhcGguaXNNb3VzZURvd24gJiYgdGhpcy5jdXJyZW50U3RhdGUgIT0gbnVsbCAmJiB0aGlzLmljb25zICE9IG51bGwpCisJCXsKKwkJCXZhciBoaXRzSWNvbiA9IGZhbHNlOworCQkJdmFyIHRhcmdldCA9IG1lLmdldFNvdXJjZSgpOworCQkJCisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaWNvbnMubGVuZ3RoICYmICFoaXRzSWNvbjsgaSsrKQorCQkJeworCQkJCWhpdHNJY29uID0gdGFyZ2V0ID09IHRoaXMuaWNvbnNbaV0ubm9kZSB8fCB0YXJnZXQucGFyZW50Tm9kZSA9PSB0aGlzLmljb25zW2ldLm5vZGU7CisJCQl9CisKKwkJCWlmICghaGl0c0ljb24pCisJCQl7CisJCQkJdGhpcy51cGRhdGVJY29ucyh0aGlzLmN1cnJlbnRTdGF0ZSwgdGhpcy5pY29ucywgbWUpOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCXRoaXMuY29uc3RyYWludEhhbmRsZXIucmVzZXQoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1cGRhdGVFZGdlU3RhdGUKKyAqIAorICogVXBkYXRlcyA8ZWRnZVN0YXRlPi4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUudXBkYXRlRWRnZVN0YXRlID0gZnVuY3Rpb24oY3VycmVudCwgY29uc3RyYWludCkKK3sKKwkvLyBUT0RPOiBVc2UgZ2VuZXJpYyBtZXRob2QgZm9yIHdyaXRpbmcgY29uc3RyYWludCB0byBzdHlsZQorCWlmICh0aGlzLnNvdXJjZUNvbnN0cmFpbnQgIT0gbnVsbCAmJiB0aGlzLnNvdXJjZUNvbnN0cmFpbnQucG9pbnQgIT0gbnVsbCkKKwl7CisJCXRoaXMuZWRnZVN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0VYSVRfWF0gPSB0aGlzLnNvdXJjZUNvbnN0cmFpbnQucG9pbnQueDsKKwkJdGhpcy5lZGdlU3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRVhJVF9ZXSA9IHRoaXMuc291cmNlQ29uc3RyYWludC5wb2ludC55OworCX0KKworCWlmIChjb25zdHJhaW50ICE9IG51bGwgJiYgY29uc3RyYWludC5wb2ludCAhPSBudWxsKQorCXsKKwkJdGhpcy5lZGdlU3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRU5UUllfWF0gPSBjb25zdHJhaW50LnBvaW50Lng7CisJCXRoaXMuZWRnZVN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0VOVFJZX1ldID0gY29uc3RyYWludC5wb2ludC55OworCX0KKwllbHNlCisJeworCQlkZWxldGUgdGhpcy5lZGdlU3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRU5UUllfWF07CisJCWRlbGV0ZSB0aGlzLmVkZ2VTdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9FTlRSWV9ZXTsKKwl9CisJCisJdGhpcy5lZGdlU3RhdGUuYWJzb2x1dGVQb2ludHMgPSBbbnVsbCwgKHRoaXMuY3VycmVudFN0YXRlICE9IG51bGwpID8gbnVsbCA6IGN1cnJlbnRdOworCXRoaXMuZ3JhcGgudmlldy51cGRhdGVGaXhlZFRlcm1pbmFsUG9pbnQodGhpcy5lZGdlU3RhdGUsIHRoaXMucHJldmlvdXMsIHRydWUsIHRoaXMuc291cmNlQ29uc3RyYWludCk7CisJCisJaWYgKHRoaXMuY3VycmVudFN0YXRlICE9IG51bGwpCisJeworCQlpZiAoY29uc3RyYWludCA9PSBudWxsKQorCQl7CisJCQljb25zdHJhaW50ID0gdGhpcy5ncmFwaC5nZXRDb25uZWN0aW9uQ29uc3RyYWludCh0aGlzLmVkZ2VTdGF0ZSwgdGhpcy5wcmV2aW91cywgZmFsc2UpOworCQl9CisJCQorCQl0aGlzLmVkZ2VTdGF0ZS5zZXRBYnNvbHV0ZVRlcm1pbmFsUG9pbnQobnVsbCwgZmFsc2UpOworCQl0aGlzLmdyYXBoLnZpZXcudXBkYXRlRml4ZWRUZXJtaW5hbFBvaW50KHRoaXMuZWRnZVN0YXRlLCB0aGlzLmN1cnJlbnRTdGF0ZSwgZmFsc2UsIGNvbnN0cmFpbnQpOworCX0KKwkKKwkvLyBTY2FsZXMgYW5kIHRyYW5zbGF0ZXMgdGhlIHdheXBvaW50cyB0byB0aGUgbW9kZWwKKwl2YXIgcmVhbFBvaW50cyA9IG51bGw7CisJCisJaWYgKHRoaXMud2F5cG9pbnRzICE9IG51bGwpCisJeworCQlyZWFsUG9pbnRzID0gW107CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMud2F5cG9pbnRzLmxlbmd0aDsgaSsrKQorCQl7CisJCQl2YXIgcHQgPSB0aGlzLndheXBvaW50c1tpXS5jbG9uZSgpOworCQkJdGhpcy5jb252ZXJ0V2F5cG9pbnQocHQpOworCQkJcmVhbFBvaW50c1tpXSA9IHB0OworCQl9CisJfQorCQorCXRoaXMuZ3JhcGgudmlldy51cGRhdGVQb2ludHModGhpcy5lZGdlU3RhdGUsIHJlYWxQb2ludHMsIHRoaXMucHJldmlvdXMsIHRoaXMuY3VycmVudFN0YXRlKTsKKwl0aGlzLmdyYXBoLnZpZXcudXBkYXRlRmxvYXRpbmdUZXJtaW5hbFBvaW50cyh0aGlzLmVkZ2VTdGF0ZSwgdGhpcy5wcmV2aW91cywgdGhpcy5jdXJyZW50U3RhdGUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0VGFyZ2V0UGVyaW1ldGVyUG9pbnQKKyAqIAorICogUmV0dXJucyB0aGUgcGVyaW1ldGVyIHBvaW50IGZvciB0aGUgZ2l2ZW4gdGFyZ2V0IHN0YXRlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gdGhhdCByZXByZXNlbnRzIHRoZSB0YXJnZXQgY2VsbCBzdGF0ZS4KKyAqIG1lIC0gPG14TW91c2VFdmVudD4gdGhhdCByZXByZXNlbnRzIHRoZSBtb3VzZSBtb3ZlLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5nZXRUYXJnZXRQZXJpbWV0ZXJQb2ludCA9IGZ1bmN0aW9uKHN0YXRlLCBtZSkKK3sKKwl2YXIgcmVzdWx0ID0gbnVsbDsKKwl2YXIgdmlldyA9IHN0YXRlLnZpZXc7CisJdmFyIHRhcmdldFBlcmltZXRlciA9IHZpZXcuZ2V0UGVyaW1ldGVyRnVuY3Rpb24oc3RhdGUpOworCQorCWlmICh0YXJnZXRQZXJpbWV0ZXIgIT0gbnVsbCkKKwl7CisJCXZhciBuZXh0ID0gKHRoaXMud2F5cG9pbnRzICE9IG51bGwgJiYgdGhpcy53YXlwb2ludHMubGVuZ3RoID4gMCkgPworCQkJCXRoaXMud2F5cG9pbnRzW3RoaXMud2F5cG9pbnRzLmxlbmd0aCAtIDFdIDoKKwkJCQluZXcgbXhQb2ludCh0aGlzLnByZXZpb3VzLmdldENlbnRlclgoKSwgdGhpcy5wcmV2aW91cy5nZXRDZW50ZXJZKCkpOworCQl2YXIgdG1wID0gdGFyZ2V0UGVyaW1ldGVyKHZpZXcuZ2V0UGVyaW1ldGVyQm91bmRzKHN0YXRlKSwKKwkJCXRoaXMuZWRnZVN0YXRlLCBuZXh0LCBmYWxzZSk7CisJCQkKKwkJaWYgKHRtcCAhPSBudWxsKQorCQl7CisJCQlyZXN1bHQgPSB0bXA7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcmVzdWx0ID0gbmV3IG14UG9pbnQoc3RhdGUuZ2V0Q2VudGVyWCgpLCBzdGF0ZS5nZXRDZW50ZXJZKCkpOworCX0KKwkKKwlyZXR1cm4gcmVzdWx0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0U291cmNlUGVyaW1ldGVyUG9pbnQKKyAqIAorICogSG9vayB0byB1cGRhdGUgdGhlIGljb24gcG9zaXRpb24ocykgYmFzZWQgb24gYSBtb3VzZU92ZXIgZXZlbnQuIFRoaXMgaXMKKyAqIGFuIGVtcHR5IGltcGxlbWVudGF0aW9uLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gdGhhdCByZXByZXNlbnRzIHRoZSB0YXJnZXQgY2VsbCBzdGF0ZS4KKyAqIG5leHQgLSA8bXhQb2ludD4gdGhhdCByZXByZXNlbnRzIHRoZSBuZXh0IHBvaW50IGFsb25nIHRoZSBwcmV2aWV3ZWQgZWRnZS4KKyAqIG1lIC0gPG14TW91c2VFdmVudD4gdGhhdCByZXByZXNlbnRzIHRoZSBtb3VzZSBtb3ZlLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5nZXRTb3VyY2VQZXJpbWV0ZXJQb2ludCA9IGZ1bmN0aW9uKHN0YXRlLCBuZXh0LCBtZSkKK3sKKwl2YXIgcmVzdWx0ID0gbnVsbDsKKwl2YXIgdmlldyA9IHN0YXRlLnZpZXc7CisJdmFyIHNvdXJjZVBlcmltZXRlciA9IHZpZXcuZ2V0UGVyaW1ldGVyRnVuY3Rpb24oc3RhdGUpOworCXZhciBjID0gbmV3IG14UG9pbnQoc3RhdGUuZ2V0Q2VudGVyWCgpLCBzdGF0ZS5nZXRDZW50ZXJZKCkpOworCQorCWlmIChzb3VyY2VQZXJpbWV0ZXIgIT0gbnVsbCkKKwl7CisJCXZhciB0aGV0YSA9IG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1JPVEFUSU9OLCAwKTsKKwkJdmFyIHJhZCA9IC10aGV0YSAqIChNYXRoLlBJIC8gMTgwKTsKKwkJCisJCWlmICh0aGV0YSAhPSAwKQorCQl7CisJCQluZXh0ID0gbXhVdGlscy5nZXRSb3RhdGVkUG9pbnQobmV3IG14UG9pbnQobmV4dC54LCBuZXh0LnkpLCBNYXRoLmNvcyhyYWQpLCBNYXRoLnNpbihyYWQpLCBjKTsKKwkJfQorCQkKKwkJdmFyIHRtcCA9IHNvdXJjZVBlcmltZXRlcih2aWV3LmdldFBlcmltZXRlckJvdW5kcyhzdGF0ZSksIHN0YXRlLCBuZXh0LCBmYWxzZSk7CisJCQkKKwkJaWYgKHRtcCAhPSBudWxsKQorCQl7CisJCQlpZiAodGhldGEgIT0gMCkKKwkJCXsKKwkJCQl0bXAgPSBteFV0aWxzLmdldFJvdGF0ZWRQb2ludChuZXcgbXhQb2ludCh0bXAueCwgdG1wLnkpLCBNYXRoLmNvcygtcmFkKSwgTWF0aC5zaW4oLXJhZCksIGMpOworCQkJfQorCQkJCisJCQlyZXN1bHQgPSB0bXA7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcmVzdWx0ID0gYzsKKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK307CisKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlSWNvbnMKKyAqIAorICogSG9vayB0byB1cGRhdGUgdGhlIGljb24gcG9zaXRpb24ocykgYmFzZWQgb24gYSBtb3VzZU92ZXIgZXZlbnQuIFRoaXMgaXMKKyAqIGFuIGVtcHR5IGltcGxlbWVudGF0aW9uLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gdW5kZXIgdGhlIG1vdXNlLgorICogaWNvbnMgLSBBcnJheSBvZiBjdXJyZW50bHkgZGlzcGxheWVkIGljb25zLgorICogbWUgLSA8bXhNb3VzZUV2ZW50PiB0aGF0IGNvbnRhaW5zIHRoZSBtb3VzZSBldmVudC4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUudXBkYXRlSWNvbnMgPSBmdW5jdGlvbihzdGF0ZSwgaWNvbnMsIG1lKQoreworCS8vIGVtcHR5Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1N0b3BFdmVudAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vdXNlIHVwIGV2ZW50IHNob3VsZCBzdG9wIHRoaXMgaGFuZGxlci4gVGhlCisgKiBjb25uZWN0aW9uIHdpbGwgYmUgY3JlYXRlZCBpZiA8ZXJyb3I+IGlzIG51bGwuIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkKKyAqIGNhbGxlZCBpZiA8d2F5cG9pbnRzRW5hYmxlZD4gaXMgdHJ1ZS4gVGhpcyBpbXBsZW10YXRpb24gcmV0dXJucyB0cnVlCisgKiBpZiB0aGVyZSBpcyBhIGNlbGwgc3RhdGUgaW4gdGhlIGdpdmVuIGV2ZW50LgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5pc1N0b3BFdmVudCA9IGZ1bmN0aW9uKG1lKQoreworCXJldHVybiBtZS5nZXRTdGF0ZSgpICE9IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRXYXlwb2ludAorICogCisgKiBBZGRzIHRoZSB3YXlwb2ludCBmb3IgdGhlIGdpdmVuIGV2ZW50IHRvIDx3YXlwb2ludHM+LgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5hZGRXYXlwb2ludEZvckV2ZW50ID0gZnVuY3Rpb24obWUpCit7CisJdmFyIHBvaW50ID0gbXhVdGlscy5jb252ZXJ0UG9pbnQodGhpcy5ncmFwaC5jb250YWluZXIsIG1lLmdldFgoKSwgbWUuZ2V0WSgpKTsKKwl2YXIgZHggPSBNYXRoLmFicyhwb2ludC54IC0gdGhpcy5maXJzdC54KTsKKwl2YXIgZHkgPSBNYXRoLmFicyhwb2ludC55IC0gdGhpcy5maXJzdC55KTsKKwl2YXIgYWRkUG9pbnQgPSB0aGlzLndheXBvaW50cyAhPSBudWxsIHx8ICh0aGlzLm1vdXNlRG93bkNvdW50ZXIgPiAxICYmCisJCQkoZHggPiB0aGlzLmdyYXBoLnRvbGVyYW5jZSB8fCBkeSA+IHRoaXMuZ3JhcGgudG9sZXJhbmNlKSk7CisKKwlpZiAoYWRkUG9pbnQpCisJeworCQlpZiAodGhpcy53YXlwb2ludHMgPT0gbnVsbCkKKwkJeworCQkJdGhpcy53YXlwb2ludHMgPSBbXTsKKwkJfQorCQkKKwkJdmFyIHNjYWxlID0gdGhpcy5ncmFwaC52aWV3LnNjYWxlOworCQl2YXIgcG9pbnQgPSBuZXcgbXhQb2ludCh0aGlzLmdyYXBoLnNuYXAobWUuZ2V0R3JhcGhYKCkgLyBzY2FsZSkgKiBzY2FsZSwKKwkJCQl0aGlzLmdyYXBoLnNuYXAobWUuZ2V0R3JhcGhZKCkgLyBzY2FsZSkgKiBzY2FsZSk7CisJCXRoaXMud2F5cG9pbnRzLnB1c2gocG9pbnQpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdXNlVXAKKyAqIAorICogSGFuZGxlcyB0aGUgZXZlbnQgYnkgaW5zZXJ0aW5nIHRoZSBuZXcgY29ubmVjdGlvbi4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUubW91c2VVcCA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJaWYgKCFtZS5pc0NvbnN1bWVkKCkgJiYgdGhpcy5pc0Nvbm5lY3RpbmcoKSkKKwl7CisJCWlmICh0aGlzLndheXBvaW50c0VuYWJsZWQgJiYgIXRoaXMuaXNTdG9wRXZlbnQobWUpKQorCQl7CisJCQl0aGlzLmFkZFdheXBvaW50Rm9yRXZlbnQobWUpOworCQkJbWUuY29uc3VtZSgpOworCQkJCisJCQlyZXR1cm47CisJCX0KKwkJCisJCS8vIEluc2VydHMgdGhlIGVkZ2UgaWYgbm8gdmFsaWRhdGlvbiBlcnJvciBleGlzdHMKKwkJaWYgKHRoaXMuZXJyb3IgPT0gbnVsbCkKKwkJeworCQkJdmFyIHNvdXJjZSA9ICh0aGlzLnByZXZpb3VzICE9IG51bGwpID8gdGhpcy5wcmV2aW91cy5jZWxsIDogbnVsbDsKKwkJCXZhciB0YXJnZXQgPSBudWxsOworCQkJCisJCQlpZiAodGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50Q29uc3RyYWludCAhPSBudWxsICYmCisJCQkJdGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50Rm9jdXMgIT0gbnVsbCkKKwkJCXsKKwkJCQl0YXJnZXQgPSB0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLmN1cnJlbnRGb2N1cy5jZWxsOworCQkJfQorCQkJCisJCQlpZiAodGFyZ2V0ID09IG51bGwgJiYgdGhpcy5jdXJyZW50U3RhdGUgIT0gbnVsbCkKKwkJCXsKKwkJCQl0YXJnZXQgPSB0aGlzLmN1cnJlbnRTdGF0ZS5jZWxsOworCQkJfQorCQkJCisJCQl0aGlzLmNvbm5lY3Qoc291cmNlLCB0YXJnZXQsIG1lLmdldEV2ZW50KCksIG1lLmdldENlbGwoKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBTZWxlY3RzIHRoZSBzb3VyY2UgdGVybWluYWwgZm9yIHNlbGYtcmVmZXJlbmNlcworCQkJaWYgKHRoaXMucHJldmlvdXMgIT0gbnVsbCAmJiB0aGlzLm1hcmtlci52YWxpZFN0YXRlICE9IG51bGwgJiYKKwkJCQl0aGlzLnByZXZpb3VzLmNlbGwgPT0gdGhpcy5tYXJrZXIudmFsaWRTdGF0ZS5jZWxsKQorCQkJeworCQkJCXRoaXMuZ3JhcGguc2VsZWN0Q2VsbEZvckV2ZW50KHRoaXMubWFya2VyLnNvdXJjZSwgZXZ0KTsKKwkJCX0KKwkJCQorCQkJLy8gRGlzcGxheXMgdGhlIGVycm9yIG1lc3NhZ2UgaWYgaXQgaXMgbm90IGFuIGVtcHR5IHN0cmluZywKKwkJCS8vIGZvciBlbXB0eSBlcnJvciBtZXNzYWdlcywgdGhlIGV2ZW50IGlzIHNpbGVudGx5IGRyb3BwZWQKKwkJCWlmICh0aGlzLmVycm9yLmxlbmd0aCA+IDApCisJCQl7CisJCQkJdGhpcy5ncmFwaC52YWxpZGF0aW9uQWxlcnQodGhpcy5lcnJvcik7CisJCQl9CisJCX0KKwkJCisJCS8vIFJlZHJhd3MgdGhlIGNvbm5lY3QgaWNvbnMgYW5kIHJlc2V0cyB0aGUgaGFuZGxlciBzdGF0ZQorCQl0aGlzLmRlc3Ryb3lJY29ucygpOworCQltZS5jb25zdW1lKCk7CisJfQorCisJaWYgKHRoaXMuZmlyc3QgIT0gbnVsbCkKKwl7CisJCXRoaXMucmVzZXQoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZXNldAorICogCisgKiBSZXNldHMgdGhlIHN0YXRlIG9mIHRoaXMgaGFuZGxlci4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMuc2hhcGUgIT0gbnVsbCkKKwl7CisJCXRoaXMuc2hhcGUuZGVzdHJveSgpOworCQl0aGlzLnNoYXBlID0gbnVsbDsKKwl9CisJCisJLy8gUmVzZXRzIHRoZSBjdXJzb3Igb24gdGhlIGNvbnRhaW5lcgorCWlmICh0aGlzLmN1cnNvciAhPSBudWxsICYmIHRoaXMuZ3JhcGguY29udGFpbmVyICE9IG51bGwpCisJeworCQl0aGlzLmdyYXBoLmNvbnRhaW5lci5zdHlsZS5jdXJzb3IgPSAnJzsKKwl9CisJCisJdGhpcy5kZXN0cm95SWNvbnMoKTsKKwl0aGlzLm1hcmtlci5yZXNldCgpOworCXRoaXMuY29uc3RyYWludEhhbmRsZXIucmVzZXQoKTsKKwl0aGlzLm9yaWdpbmFsUG9pbnQgPSBudWxsOworCXRoaXMuY3VycmVudFBvaW50ID0gbnVsbDsKKwl0aGlzLmVkZ2VTdGF0ZSA9IG51bGw7CisJdGhpcy5wcmV2aW91cyA9IG51bGw7CisJdGhpcy5lcnJvciA9IG51bGw7CisJdGhpcy5zb3VyY2VDb25zdHJhaW50ID0gbnVsbDsKKwl0aGlzLm1vdXNlRG93bkNvdW50ZXIgPSAwOworCXRoaXMuZmlyc3QgPSBudWxsOworCisJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5SRVNFVCkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZHJhd1ByZXZpZXcKKyAqIAorICogUmVkcmF3cyB0aGUgcHJldmlldyBlZGdlIHVzaW5nIHRoZSBjb2xvciBhbmQgd2lkdGggcmV0dXJuZWQgYnkKKyAqIDxnZXRFZGdlQ29sb3I+IGFuZCA8Z2V0RWRnZVdpZHRoPi4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuZHJhd1ByZXZpZXcgPSBmdW5jdGlvbigpCit7CisJdGhpcy51cGRhdGVQcmV2aWV3KHRoaXMuZXJyb3IgPT0gbnVsbCk7CisJdGhpcy5zaGFwZS5yZWRyYXcoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEVkZ2VDb2xvcgorICogCisgKiBSZXR1cm5zIHRoZSBjb2xvciB1c2VkIHRvIGRyYXcgdGhlIHByZXZpZXcgZWRnZS4gVGhpcyByZXR1cm5zIGdyZWVuIGlmCisgKiB0aGVyZSBpcyBubyBlZGdlIHZhbGlkYXRpb24gZXJyb3IgYW5kIHJlZCBvdGhlcndpc2UuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbGlkIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBjb2xvciBmb3IgYSB2YWxpZCBlZGdlIHNob3VsZCBiZQorICogcmV0dXJuZWQuCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLnVwZGF0ZVByZXZpZXcgPSBmdW5jdGlvbih2YWxpZCkKK3sKKwl0aGlzLnNoYXBlLnN0cm9rZXdpZHRoID0gdGhpcy5nZXRFZGdlV2lkdGgodmFsaWQpOworCXRoaXMuc2hhcGUuc3Ryb2tlID0gdGhpcy5nZXRFZGdlQ29sb3IodmFsaWQpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0RWRnZUNvbG9yCisgKiAKKyAqIFJldHVybnMgdGhlIGNvbG9yIHVzZWQgdG8gZHJhdyB0aGUgcHJldmlldyBlZGdlLiBUaGlzIHJldHVybnMgZ3JlZW4gaWYKKyAqIHRoZXJlIGlzIG5vIGVkZ2UgdmFsaWRhdGlvbiBlcnJvciBhbmQgcmVkIG90aGVyd2lzZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsaWQgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGNvbG9yIGZvciBhIHZhbGlkIGVkZ2Ugc2hvdWxkIGJlCisgKiByZXR1cm5lZC4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuZ2V0RWRnZUNvbG9yID0gZnVuY3Rpb24odmFsaWQpCit7CisJcmV0dXJuICh2YWxpZCkgPyBteENvbnN0YW50cy5WQUxJRF9DT0xPUiA6IG14Q29uc3RhbnRzLklOVkFMSURfQ09MT1I7Cit9OworCQorLyoqCisgKiBGdW5jdGlvbjogZ2V0RWRnZVdpZHRoCisgKiAKKyAqIFJldHVybnMgdGhlIHdpZHRoIHVzZWQgdG8gZHJhdyB0aGUgcHJldmlldyBlZGdlLiBUaGlzIHJldHVybnMgMyBpZgorICogdGhlcmUgaXMgbm8gZWRnZSB2YWxpZGF0aW9uIGVycm9yIGFuZCAxIG90aGVyd2lzZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsaWQgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHdpZHRoIGZvciBhIHZhbGlkIGVkZ2Ugc2hvdWxkIGJlCisgKiByZXR1cm5lZC4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuZ2V0RWRnZVdpZHRoID0gZnVuY3Rpb24odmFsaWQpCit7CisJcmV0dXJuICh2YWxpZCkgPyAzIDogMTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNvbm5lY3QKKyAqIAorICogQ29ubmVjdHMgdGhlIGdpdmVuIHNvdXJjZSBhbmQgdGFyZ2V0IHVzaW5nIGEgbmV3IGVkZ2UuIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIHVzZXMgPGNyZWF0ZUVkZ2U+IHRvIGNyZWF0ZSB0aGUgZWRnZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc291cmNlIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBzb3VyY2UgdGVybWluYWwuCisgKiB0YXJnZXQgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHRhcmdldCB0ZXJtaW5hbC4KKyAqIGV2dCAtIE1vdXNlZG93biBldmVudCBvZiB0aGUgY29ubmVjdCBnZXN0dXJlLgorICogZHJvcFRhcmdldCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgY2VsbCB1bmRlciB0aGUgbW91c2Ugd2hlbiBpdCB3YXMKKyAqIHJlbGVhc2VkLgorICovCitteENvbm5lY3Rpb25IYW5kbGVyLnByb3RvdHlwZS5jb25uZWN0ID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQsIGV2dCwgZHJvcFRhcmdldCkKK3sKKwlpZiAodGFyZ2V0ICE9IG51bGwgfHwgdGhpcy5pc0NyZWF0ZVRhcmdldChldnQpIHx8IHRoaXMuZ3JhcGguYWxsb3dEYW5nbGluZ0VkZ2VzKQorCXsKKwkJLy8gVXNlcyB0aGUgY29tbW9uIHBhcmVudCBvZiBzb3VyY2UgYW5kIHRhcmdldCBvcgorCQkvLyB0aGUgZGVmYXVsdCBwYXJlbnQgdG8gaW5zZXJ0IHRoZSBlZGdlCisJCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwkJdmFyIHRlcm1pbmFsSW5zZXJ0ZWQgPSBmYWxzZTsKKwkJdmFyIGVkZ2UgPSBudWxsOworCisJCW1vZGVsLmJlZ2luVXBkYXRlKCk7CisJCXRyeQorCQl7CisJCQlpZiAoc291cmNlICE9IG51bGwgJiYgdGFyZ2V0ID09IG51bGwgJiYgIXRoaXMuZ3JhcGguaXNJZ25vcmVUZXJtaW5hbEV2ZW50KGV2dCkgJiYgdGhpcy5pc0NyZWF0ZVRhcmdldChldnQpKQorCQkJeworCQkJCXRhcmdldCA9IHRoaXMuY3JlYXRlVGFyZ2V0VmVydGV4KGV2dCwgc291cmNlKTsKKwkJCQkKKwkJCQlpZiAodGFyZ2V0ICE9IG51bGwpCisJCQkJeworCQkJCQlkcm9wVGFyZ2V0ID0gdGhpcy5ncmFwaC5nZXREcm9wVGFyZ2V0KFt0YXJnZXRdLCBldnQsIGRyb3BUYXJnZXQpOworCQkJCQl0ZXJtaW5hbEluc2VydGVkID0gdHJ1ZTsKKwkJCQkJCisJCQkJCS8vIERpc2FibGVzIGVkZ2VzIGFzIGRyb3AgdGFyZ2V0cyBpZiB0aGUgdGFyZ2V0IGNlbGwgd2FzIGNyZWF0ZWQKKwkJCQkJLy8gRklYTUU6IFNob3VsZCBub3Qgc2hpZnQgaWYgdmVydGV4IHdhcyBhbGlnbmVkIChzYW1lIGluIEphdmEpCisJCQkJCWlmIChkcm9wVGFyZ2V0ID09IG51bGwgfHwgIXRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5pc0VkZ2UoZHJvcFRhcmdldCkpCisJCQkJCXsKKwkJCQkJCXZhciBwc3RhdGUgPSB0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXRTdGF0ZShkcm9wVGFyZ2V0KTsKKwkJCQkJCQorCQkJCQkJaWYgKHBzdGF0ZSAhPSBudWxsKQorCQkJCQkJeworCQkJCQkJCXZhciB0bXAgPSBtb2RlbC5nZXRHZW9tZXRyeSh0YXJnZXQpOworCQkJCQkJCXRtcC54IC09IHBzdGF0ZS5vcmlnaW4ueDsKKwkJCQkJCQl0bXAueSAtPSBwc3RhdGUub3JpZ2luLnk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlkcm9wVGFyZ2V0ID0gdGhpcy5ncmFwaC5nZXREZWZhdWx0UGFyZW50KCk7CisJCQkJCX0KKwkJCQkJCQorCQkJCQl0aGlzLmdyYXBoLmFkZENlbGwodGFyZ2V0LCBkcm9wVGFyZ2V0KTsKKwkJCQl9CisJCQl9CisKKwkJCXZhciBwYXJlbnQgPSB0aGlzLmdyYXBoLmdldERlZmF1bHRQYXJlbnQoKTsKKworCQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHRhcmdldCAhPSBudWxsICYmCisJCQkJbW9kZWwuZ2V0UGFyZW50KHNvdXJjZSkgPT0gbW9kZWwuZ2V0UGFyZW50KHRhcmdldCkgJiYKKwkJCQltb2RlbC5nZXRQYXJlbnQobW9kZWwuZ2V0UGFyZW50KHNvdXJjZSkpICE9IG1vZGVsLmdldFJvb3QoKSkKKwkJCXsKKwkJCQlwYXJlbnQgPSBtb2RlbC5nZXRQYXJlbnQoc291cmNlKTsKKworCQkJCWlmICgoc291cmNlLmdlb21ldHJ5ICE9IG51bGwgJiYgc291cmNlLmdlb21ldHJ5LnJlbGF0aXZlKSAmJgorCQkJCQkodGFyZ2V0Lmdlb21ldHJ5ICE9IG51bGwgJiYgdGFyZ2V0Lmdlb21ldHJ5LnJlbGF0aXZlKSkKKwkJCQl7CisJCQkJCXBhcmVudCA9IG1vZGVsLmdldFBhcmVudChwYXJlbnQpOworCQkJCX0KKwkJCX0KKwkJCQorCQkJLy8gVXNlcyB0aGUgdmFsdWUgb2YgdGhlIHByZXZpZXcgZWRnZSBzdGF0ZSBmb3IgaW5zZXJ0aW5nCisJCQkvLyB0aGUgbmV3IGVkZ2UgaW50byB0aGUgZ3JhcGgKKwkJCXZhciB2YWx1ZSA9IG51bGw7CisJCQl2YXIgc3R5bGUgPSBudWxsOworCQkJCisJCQlpZiAodGhpcy5lZGdlU3RhdGUgIT0gbnVsbCkKKwkJCXsKKwkJCQl2YWx1ZSA9IHRoaXMuZWRnZVN0YXRlLmNlbGwudmFsdWU7CisJCQkJc3R5bGUgPSB0aGlzLmVkZ2VTdGF0ZS5jZWxsLnN0eWxlOworCQkJfQorCisJCQllZGdlID0gdGhpcy5pbnNlcnRFZGdlKHBhcmVudCwgbnVsbCwgdmFsdWUsIHNvdXJjZSwgdGFyZ2V0LCBzdHlsZSk7CisJCQkKKwkJCWlmIChlZGdlICE9IG51bGwpCisJCQl7CisJCQkJLy8gVXBkYXRlcyB0aGUgY29ubmVjdGlvbiBjb25zdHJhaW50cworCQkJCXRoaXMuZ3JhcGguc2V0Q29ubmVjdGlvbkNvbnN0cmFpbnQoZWRnZSwgc291cmNlLCB0cnVlLCB0aGlzLnNvdXJjZUNvbnN0cmFpbnQpOworCQkJCXRoaXMuZ3JhcGguc2V0Q29ubmVjdGlvbkNvbnN0cmFpbnQoZWRnZSwgdGFyZ2V0LCBmYWxzZSwgdGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50Q29uc3RyYWludCk7CisJCQkJCisJCQkJLy8gVXNlcyBnZW9tZXRyeSBvZiB0aGUgcHJldmlldyBlZGdlIHN0YXRlCisJCQkJaWYgKHRoaXMuZWRnZVN0YXRlICE9IG51bGwpCisJCQkJeworCQkJCQltb2RlbC5zZXRHZW9tZXRyeShlZGdlLCB0aGlzLmVkZ2VTdGF0ZS5jZWxsLmdlb21ldHJ5KTsKKwkJCQl9CisJCQkJCisJCQkJdmFyIHBhcmVudCA9IG1vZGVsLmdldFBhcmVudChzb3VyY2UpOworCQkJCQorCQkJCS8vIEluc2VydHMgZWRnZSBiZWZvcmUgc291cmNlCisJCQkJaWYgKHRoaXMuaXNJbnNlcnRCZWZvcmUoZWRnZSwgc291cmNlLCB0YXJnZXQsIGV2dCwgZHJvcFRhcmdldCkpCisJCQkJeworCQkJCQl2YXIgaW5kZXggPSBudWxsOworCQkJCQl2YXIgdG1wID0gc291cmNlOworCisJCQkJCXdoaWxlICh0bXAucGFyZW50ICE9IG51bGwgJiYgdG1wLmdlb21ldHJ5ICE9IG51bGwgJiYKKwkJCQkJCXRtcC5nZW9tZXRyeS5yZWxhdGl2ZSAmJiB0bXAucGFyZW50ICE9IGVkZ2UucGFyZW50KQorCQkJCQl7CisJCQkJCQl0bXAgPSB0aGlzLmdyYXBoLm1vZGVsLmdldFBhcmVudCh0bXApOworCQkJCQl9CisKKwkJCQkJaWYgKHRtcCAhPSBudWxsICYmIHRtcC5wYXJlbnQgIT0gbnVsbCAmJiB0bXAucGFyZW50ID09IGVkZ2UucGFyZW50KQorCQkJCQl7CisJCQkJCQl2YXIgaW5kZXggPSB0bXAucGFyZW50LmdldEluZGV4KHRtcCk7CisJCQkJCQl0bXAucGFyZW50Lmluc2VydChlZGdlLCBpbmRleCk7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJLy8gTWFrZXMgc3VyZSB0aGUgZWRnZSBoYXMgYSBub24tbnVsbCwgcmVsYXRpdmUgZ2VvbWV0cnkKKwkJCQl2YXIgZ2VvID0gbW9kZWwuZ2V0R2VvbWV0cnkoZWRnZSk7CisKKwkJCQlpZiAoZ2VvID09IG51bGwpCisJCQkJeworCQkJCQlnZW8gPSBuZXcgbXhHZW9tZXRyeSgpOworCQkJCQlnZW8ucmVsYXRpdmUgPSB0cnVlOworCQkJCQkKKwkJCQkJbW9kZWwuc2V0R2VvbWV0cnkoZWRnZSwgZ2VvKTsKKwkJCQl9CisJCQkJCisJCQkJLy8gVXNlcyBzY2FsZWQgd2F5cG9pbnRzIGluIGdlb21ldHJ5CisJCQkJaWYgKHRoaXMud2F5cG9pbnRzICE9IG51bGwgJiYgdGhpcy53YXlwb2ludHMubGVuZ3RoID4gMCkKKwkJCQl7CisJCQkJCXZhciBzID0gdGhpcy5ncmFwaC52aWV3LnNjYWxlOworCQkJCQl2YXIgdHIgPSB0aGlzLmdyYXBoLnZpZXcudHJhbnNsYXRlOworCQkJCQlnZW8ucG9pbnRzID0gW107CisJCQkJCQorCQkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMud2F5cG9pbnRzLmxlbmd0aDsgaSsrKQorCQkJCQl7CisJCQkJCQl2YXIgcHQgPSB0aGlzLndheXBvaW50c1tpXTsKKwkJCQkJCWdlby5wb2ludHMucHVzaChuZXcgbXhQb2ludChwdC54IC8gcyAtIHRyLngsIHB0LnkgLyBzIC0gdHIueSkpOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKHRhcmdldCA9PSBudWxsKQorCQkJCXsKKwkJCQkJdmFyIHQgPSB0aGlzLmdyYXBoLnZpZXcudHJhbnNsYXRlOworCQkJCQl2YXIgcyA9IHRoaXMuZ3JhcGgudmlldy5zY2FsZTsKKwkJCQkJdmFyIHB0ID0gKHRoaXMub3JpZ2luYWxQb2ludCAhPSBudWxsKSA/CisJCQkJCQkJbmV3IG14UG9pbnQodGhpcy5vcmlnaW5hbFBvaW50LnggLyBzIC0gdC54LCB0aGlzLm9yaWdpbmFsUG9pbnQueSAvIHMgLSB0LnkpIDoKKwkJCQkJCW5ldyBteFBvaW50KHRoaXMuY3VycmVudFBvaW50LnggLyBzIC0gdC54LCB0aGlzLmN1cnJlbnRQb2ludC55IC8gcyAtIHQueSk7CisJCQkJCXB0LnggLT0gdGhpcy5ncmFwaC5wYW5EeCAvIHRoaXMuZ3JhcGgudmlldy5zY2FsZTsKKwkJCQkJcHQueSAtPSB0aGlzLmdyYXBoLnBhbkR5IC8gdGhpcy5ncmFwaC52aWV3LnNjYWxlOworCQkJCQlnZW8uc2V0VGVybWluYWxQb2ludChwdCwgZmFsc2UpOworCQkJCX0KKwkJCQkKKwkJCQl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LkNPTk5FQ1QsICdjZWxsJywgZWRnZSwgJ3Rlcm1pbmFsJywgdGFyZ2V0LAorCQkJCQknZXZlbnQnLCBldnQsICd0YXJnZXQnLCBkcm9wVGFyZ2V0LCAndGVybWluYWxJbnNlcnRlZCcsIHRlcm1pbmFsSW5zZXJ0ZWQpKTsKKwkJCX0KKwkJfQorCQljYXRjaCAoZSkKKwkJeworCQkJbXhMb2cuc2hvdygpOworCQkJbXhMb2cuZGVidWcoZS5tZXNzYWdlKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCW1vZGVsLmVuZFVwZGF0ZSgpOworCQl9CisJCQorCQlpZiAodGhpcy5zZWxlY3QpCisJCXsKKwkJCXRoaXMuc2VsZWN0Q2VsbHMoZWRnZSwgKHRlcm1pbmFsSW5zZXJ0ZWQpID8gdGFyZ2V0IDogbnVsbCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZWxlY3RDZWxscworICogCisgKiBTZWxlY3RzIHRoZSBnaXZlbiBlZGdlIGFmdGVyIGFkZGluZyBhIG5ldyBjb25uZWN0aW9uLiBUaGUgdGFyZ2V0IGFyZ3VtZW50CisgKiBjb250YWlucyB0aGUgdGFyZ2V0IHZlcnRleCBpZiBvbmUgaGFzIGJlZW4gaW5zZXJ0ZWQuCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLnNlbGVjdENlbGxzID0gZnVuY3Rpb24oZWRnZSwgdGFyZ2V0KQoreworCXRoaXMuZ3JhcGguc2V0U2VsZWN0aW9uQ2VsbChlZGdlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGluc2VydEVkZ2UKKyAqIAorICogQ3JlYXRlcywgaW5zZXJ0cyBhbmQgcmV0dXJucyB0aGUgbmV3IGVkZ2UgZm9yIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiBkb2VzIG9ubHkgdXNlIDxjcmVhdGVFZGdlPiBpZiA8ZmFjdG9yeU1ldGhvZD4gaXMgZGVmaW5lZCwKKyAqIG90aGVyd2lzZSA8bXhHcmFwaC5pbnNlcnRFZGdlPiB3aWxsIGJlIHVzZWQuCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLmluc2VydEVkZ2UgPSBmdW5jdGlvbihwYXJlbnQsIGlkLCB2YWx1ZSwgc291cmNlLCB0YXJnZXQsIHN0eWxlKQoreworCWlmICh0aGlzLmZhY3RvcnlNZXRob2QgPT0gbnVsbCkKKwl7CisJCXJldHVybiB0aGlzLmdyYXBoLmluc2VydEVkZ2UocGFyZW50LCBpZCwgdmFsdWUsIHNvdXJjZSwgdGFyZ2V0LCBzdHlsZSk7CisJfQorCWVsc2UKKwl7CisJCXZhciBlZGdlID0gdGhpcy5jcmVhdGVFZGdlKHZhbHVlLCBzb3VyY2UsIHRhcmdldCwgc3R5bGUpOworCQllZGdlID0gdGhpcy5ncmFwaC5hZGRFZGdlKGVkZ2UsIHBhcmVudCwgc291cmNlLCB0YXJnZXQpOworCQkKKwkJcmV0dXJuIGVkZ2U7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlVGFyZ2V0VmVydGV4CisgKiAKKyAqIEhvb2sgbWV0aG9kIGZvciBjcmVhdGluZyBuZXcgdmVydGljZXMgb24gdGhlIGZseSBpZiBubyB0YXJnZXQgd2FzCisgKiB1bmRlciB0aGUgbW91c2UuIFRoaXMgaXMgb25seSBjYWxsZWQgaWYgPGNyZWF0ZVRhcmdldD4gaXMgdHJ1ZSBhbmQKKyAqIHJldHVybnMgbnVsbC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZXZ0IC0gTW91c2Vkb3duIGV2ZW50IG9mIHRoZSBjb25uZWN0IGdlc3R1cmUuCisgKiBzb3VyY2UgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHNvdXJjZSB0ZXJtaW5hbC4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuY3JlYXRlVGFyZ2V0VmVydGV4ID0gZnVuY3Rpb24oZXZ0LCBzb3VyY2UpCit7CisJLy8gVXNlcyB0aGUgZmlyc3Qgbm9uLXJlbGF0aXZlIHNvdXJjZQorCXZhciBnZW8gPSB0aGlzLmdyYXBoLmdldENlbGxHZW9tZXRyeShzb3VyY2UpOworCQorCXdoaWxlIChnZW8gIT0gbnVsbCAmJiBnZW8ucmVsYXRpdmUpCisJeworCQlzb3VyY2UgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCkuZ2V0UGFyZW50KHNvdXJjZSk7CisJCWdlbyA9IHRoaXMuZ3JhcGguZ2V0Q2VsbEdlb21ldHJ5KHNvdXJjZSk7CisJfQorCQorCXZhciBjbG9uZSA9IHRoaXMuZ3JhcGguY2xvbmVDZWxscyhbc291cmNlXSlbMF07CisJdmFyIGdlbyA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5nZXRHZW9tZXRyeShjbG9uZSk7CisJCisJaWYgKGdlbyAhPSBudWxsKQorCXsKKwkJdmFyIHQgPSB0aGlzLmdyYXBoLnZpZXcudHJhbnNsYXRlOworCQl2YXIgcyA9IHRoaXMuZ3JhcGgudmlldy5zY2FsZTsKKwkJdmFyIHBvaW50ID0gbmV3IG14UG9pbnQodGhpcy5jdXJyZW50UG9pbnQueCAvIHMgLSB0LngsIHRoaXMuY3VycmVudFBvaW50LnkgLyBzIC0gdC55KTsKKwkJZ2VvLnggPSBNYXRoLnJvdW5kKHBvaW50LnggLSBnZW8ud2lkdGggLyAyIC0gdGhpcy5ncmFwaC5wYW5EeCAvIHMpOworCQlnZW8ueSA9IE1hdGgucm91bmQocG9pbnQueSAtIGdlby5oZWlnaHQgLyAyIC0gdGhpcy5ncmFwaC5wYW5EeSAvIHMpOworCisJCS8vIEFsaWducyB3aXRoIHNvdXJjZSBpZiB3aXRoaW4gY2VydGFpbiB0b2xlcmFuY2UKKwkJdmFyIHRvbCA9IHRoaXMuZ2V0QWxpZ25tZW50VG9sZXJhbmNlKCk7CisJCQorCQlpZiAodG9sID4gMCkKKwkJeworCQkJdmFyIHNvdXJjZVN0YXRlID0gdGhpcy5ncmFwaC52aWV3LmdldFN0YXRlKHNvdXJjZSk7CisJCQkKKwkJCWlmIChzb3VyY2VTdGF0ZSAhPSBudWxsKQorCQkJeworCQkJCXZhciB4ID0gc291cmNlU3RhdGUueCAvIHMgLSB0Lng7CisJCQkJdmFyIHkgPSBzb3VyY2VTdGF0ZS55IC8gcyAtIHQueTsKKwkJCQkKKwkJCQlpZiAoTWF0aC5hYnMoeCAtIGdlby54KSA8PSB0b2wpCisJCQkJeworCQkJCQlnZW8ueCA9IE1hdGgucm91bmQoeCk7CisJCQkJfQorCQkJCQorCQkJCWlmIChNYXRoLmFicyh5IC0gZ2VvLnkpIDw9IHRvbCkKKwkJCQl7CisJCQkJCWdlby55ID0gTWF0aC5yb3VuZCh5KTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gY2xvbmU7CQkKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEFsaWdubWVudFRvbGVyYW5jZQorICogCisgKiBSZXR1cm5zIHRoZSB0b2xlcmFuY2UgZm9yIGFsaWduaW5nIG5ldyB0YXJnZXRzIHRvIHNvdXJjZXMuIFRoaXMgcmV0dXJucyB0aGUgZ3JpZCBzaXplIC8gMi4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuZ2V0QWxpZ25tZW50VG9sZXJhbmNlID0gZnVuY3Rpb24oZXZ0KQoreworCXJldHVybiAodGhpcy5ncmFwaC5pc0dyaWRFbmFibGVkKCkpID8gdGhpcy5ncmFwaC5ncmlkU2l6ZSAvIDIgOiB0aGlzLmdyYXBoLnRvbGVyYW5jZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUVkZ2UKKyAqIAorICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBlZGdlIHVzaW5nIDxmYWN0b3J5TWV0aG9kPiBpZiBvbmUgZXhpc3RzLiBJZgorICogbm8gZmFjdG9yeSBtZXRob2QgaXMgZGVmaW5lZCwgdGhlbiBhIG5ldyBkZWZhdWx0IGVkZ2UgaXMgcmV0dXJuZWQuIFRoZQorICogc291cmNlIGFuZCB0YXJnZXQgYXJndW1lbnRzIGFyZSBpbmZvcm1hbCwgdGhlIGFjdHVhbCBjb25uZWN0aW9uIGlzCisgKiBzZXR1cCBsYXRlciBieSB0aGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbHVlIC0gVmFsdWUgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGVkZ2UuCisgKiBzb3VyY2UgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHNvdXJjZSB0ZXJtaW5hbC4KKyAqIHRhcmdldCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgdGFyZ2V0IHRlcm1pbmFsLgorICogc3R5bGUgLSBPcHRpb25hbCBzdHlsZSBmcm9tIHRoZSBwcmV2aWV3IGVkZ2UuCisgKi8KK214Q29ubmVjdGlvbkhhbmRsZXIucHJvdG90eXBlLmNyZWF0ZUVkZ2UgPSBmdW5jdGlvbih2YWx1ZSwgc291cmNlLCB0YXJnZXQsIHN0eWxlKQoreworCXZhciBlZGdlID0gbnVsbDsKKwkKKwkvLyBDcmVhdGVzIGEgbmV3IGVkZ2UgdXNpbmcgdGhlIGZhY3RvcnlNZXRob2QKKwlpZiAodGhpcy5mYWN0b3J5TWV0aG9kICE9IG51bGwpCisJeworCQllZGdlID0gdGhpcy5mYWN0b3J5TWV0aG9kKHNvdXJjZSwgdGFyZ2V0LCBzdHlsZSk7CisJfQorCQorCWlmIChlZGdlID09IG51bGwpCisJeworCQllZGdlID0gbmV3IG14Q2VsbCh2YWx1ZSB8fCAnJyk7CisJCWVkZ2Uuc2V0RWRnZSh0cnVlKTsKKwkJZWRnZS5zZXRTdHlsZShzdHlsZSk7CisJCQorCQl2YXIgZ2VvID0gbmV3IG14R2VvbWV0cnkoKTsKKwkJZ2VvLnJlbGF0aXZlID0gdHJ1ZTsKKwkJZWRnZS5zZXRHZW9tZXRyeShnZW8pOworCX0KKworCXJldHVybiBlZGdlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZGVzdHJveQorICogCisgKiBEZXN0cm95cyB0aGUgaGFuZGxlciBhbmQgYWxsIGl0cyByZXNvdXJjZXMgYW5kIERPTSBub2Rlcy4gVGhpcyBzaG91bGQgYmUKKyAqIGNhbGxlZCBvbiBhbGwgaW5zdGFuY2VzLiBJdCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBmb3IgdGhlIGJ1aWx0LWluCisgKiBpbnN0YW5jZSBjcmVhdGVkIGZvciBlYWNoIDxteEdyYXBoPi4KKyAqLworbXhDb25uZWN0aW9uSGFuZGxlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLmdyYXBoLnJlbW92ZU1vdXNlTGlzdGVuZXIodGhpcyk7CisJCisJaWYgKHRoaXMuc2hhcGUgIT0gbnVsbCkKKwl7CisJCXRoaXMuc2hhcGUuZGVzdHJveSgpOworCQl0aGlzLnNoYXBlID0gbnVsbDsKKwl9CisJCisJaWYgKHRoaXMubWFya2VyICE9IG51bGwpCisJeworCQl0aGlzLm1hcmtlci5kZXN0cm95KCk7CisJCXRoaXMubWFya2VyID0gbnVsbDsKKwl9CisKKwlpZiAodGhpcy5jb25zdHJhaW50SGFuZGxlciAhPSBudWxsKQorCXsKKwkJdGhpcy5jb25zdHJhaW50SGFuZGxlci5kZXN0cm95KCk7CisJCXRoaXMuY29uc3RyYWludEhhbmRsZXIgPSBudWxsOworCX0KKworCWlmICh0aGlzLmNoYW5nZUhhbmRsZXIgIT0gbnVsbCkKKwl7CisJCXRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5yZW1vdmVMaXN0ZW5lcih0aGlzLmNoYW5nZUhhbmRsZXIpOworCQl0aGlzLmdyYXBoLmdldFZpZXcoKS5yZW1vdmVMaXN0ZW5lcih0aGlzLmNoYW5nZUhhbmRsZXIpOworCQl0aGlzLmNoYW5nZUhhbmRsZXIgPSBudWxsOworCX0KKwkKKwlpZiAodGhpcy5kcmlsbEhhbmRsZXIgIT0gbnVsbCkKKwl7CisJCXRoaXMuZ3JhcGgucmVtb3ZlTGlzdGVuZXIodGhpcy5kcmlsbEhhbmRsZXIpOworCQl0aGlzLmdyYXBoLmdldFZpZXcoKS5yZW1vdmVMaXN0ZW5lcih0aGlzLmRyaWxsSGFuZGxlcik7CisJCXRoaXMuZHJpbGxIYW5kbGVyID0gbnVsbDsKKwl9CisJCisJaWYgKHRoaXMuZXNjYXBlSGFuZGxlciAhPSBudWxsKQorCXsKKwkJdGhpcy5ncmFwaC5yZW1vdmVMaXN0ZW5lcih0aGlzLmVzY2FwZUhhbmRsZXIpOworCQl0aGlzLmVzY2FwZUhhbmRsZXIgPSBudWxsOworCX0KK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teENvbnN0cmFpbnRIYW5kbGVyLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhDb25zdHJhaW50SGFuZGxlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWEwN2EyCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhDb25zdHJhaW50SGFuZGxlci5qcwpAQCAtMCwwICsxLDUyMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhDb25zdHJhaW50SGFuZGxlcgorICoKKyAqIEhhbmRsZXMgY29uc3RyYWludHMgb24gY29ubmVjdGlvbiB0YXJnZXRzLiBUaGlzIGNsYXNzIGlzIGluIGNoYXJnZSBvZgorICogc2hvd2luZyBmaXhlZCBwb2ludHMgd2hlbiB0aGUgbW91c2UgaXMgb3ZlciBhIHZlcnRleCBhbmQgaGFuZGxlcyBjb25zdHJhaW50cworICogdG8gZXN0YWJsaXNoIG5ldyBjb25uZWN0aW9ucy4KKyAqCisgKiBDb25zdHJ1Y3RvcjogbXhDb25zdHJhaW50SGFuZGxlcgorICoKKyAqIENvbnN0cnVjdHMgYW4gbmV3IGNvbnN0cmFpbnQgaGFuZGxlci4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZ3JhcGggLSBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKiBmYWN0b3J5TWV0aG9kIC0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBlZGdlLiBUaGUgZnVuY3Rpb24gdGFrZXMKKyAqIHRoZSBzb3VyY2UgYW5kIHRhcmdldCA8bXhDZWxsPiBhcyB0aGUgZmlyc3QgYW5kIHNlY29uZCBhcmd1bWVudCBhbmQKKyAqIHJldHVybnMgdGhlIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgbmV3IGVkZ2UuCisgKi8KK2Z1bmN0aW9uIG14Q29uc3RyYWludEhhbmRsZXIoZ3JhcGgpCit7CisJdGhpcy5ncmFwaCA9IGdyYXBoOworCQorCS8vIEFkZHMgYSBncmFwaCBtb2RlbCBsaXN0ZW5lciB0byB1cGRhdGUgdGhlIGN1cnJlbnQgZm9jdXMgb24gY2hhbmdlcworCXRoaXMucmVzZXRIYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorCXsKKwkJaWYgKHRoaXMuY3VycmVudEZvY3VzICE9IG51bGwgJiYgdGhpcy5ncmFwaC52aWV3LmdldFN0YXRlKHRoaXMuY3VycmVudEZvY3VzLmNlbGwpID09IG51bGwpCisJCXsKKwkJCXRoaXMucmVzZXQoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRoaXMucmVkcmF3KCk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmdyYXBoLm1vZGVsLmFkZExpc3RlbmVyKG14RXZlbnQuQ0hBTkdFLCB0aGlzLnJlc2V0SGFuZGxlcik7CisJdGhpcy5ncmFwaC52aWV3LmFkZExpc3RlbmVyKG14RXZlbnQuU0NBTEUsIHRoaXMucmVzZXRIYW5kbGVyKTsKKwl0aGlzLmdyYXBoLmFkZExpc3RlbmVyKG14RXZlbnQuUk9PVCwgdGhpcy5yZXNldEhhbmRsZXIpOworfTsKKworLyoqCisgKiBWYXJpYWJsZTogcG9pbnRJbWFnZQorICogCisgKiA8bXhJbWFnZT4gdG8gYmUgdXNlZCBhcyB0aGUgaW1hZ2UgZm9yIGZpeGVkIGNvbm5lY3Rpb24gcG9pbnRzLgorICovCitteENvbnN0cmFpbnRIYW5kbGVyLnByb3RvdHlwZS5wb2ludEltYWdlID0gbmV3IG14SW1hZ2UobXhDbGllbnQuaW1hZ2VCYXNlUGF0aCArICcvcG9pbnQuZ2lmJywgNSwgNSk7CisKKy8qKgorICogVmFyaWFibGU6IGdyYXBoCisgKiAKKyAqIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEdyYXBoPi4KKyAqLworbXhDb25zdHJhaW50SGFuZGxlci5wcm90b3R5cGUuZ3JhcGggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBlbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiBldmVudHMgYXJlIGhhbmRsZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhDb25zdHJhaW50SGFuZGxlci5wcm90b3R5cGUuZW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGhpZ2hsaWdodENvbG9yCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgY29sb3IgZm9yIHRoZSBoaWdobGlnaHQuIERlZmF1bHQgaXMgPG14Q29uc3RhbnRzLkRFRkFVTFRfVkFMSURfQ09MT1I+LgorICovCitteENvbnN0cmFpbnRIYW5kbGVyLnByb3RvdHlwZS5oaWdobGlnaHRDb2xvciA9IG14Q29uc3RhbnRzLkRFRkFVTFRfVkFMSURfQ09MT1I7CisKKy8qKgorICogRnVuY3Rpb246IGlzRW5hYmxlZAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgZXZlbnRzIGFyZSBoYW5kbGVkLiBUaGlzIGltcGxlbWVudGF0aW9uCisgKiByZXR1cm5zIDxlbmFibGVkPi4KKyAqLworbXhDb25zdHJhaW50SGFuZGxlci5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmVuYWJsZWQ7Cit9OworCQorLyoqCisgKiBGdW5jdGlvbjogc2V0RW5hYmxlZAorICogCisgKiBFbmFibGVzIG9yIGRpc2FibGVzIGV2ZW50IGhhbmRsaW5nLiBUaGlzIGltcGxlbWVudGF0aW9uCisgKiB1cGRhdGVzIDxlbmFibGVkPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZW5hYmxlZCAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgdGhlIG5ldyBlbmFibGVkIHN0YXRlLgorICovCitteENvbnN0cmFpbnRIYW5kbGVyLnByb3RvdHlwZS5zZXRFbmFibGVkID0gZnVuY3Rpb24oZW5hYmxlZCkKK3sKKwl0aGlzLmVuYWJsZWQgPSBlbmFibGVkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVzZXQKKyAqIAorICogUmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGlzIGhhbmRsZXIuCisgKi8KK214Q29uc3RyYWludEhhbmRsZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLmZvY3VzSWNvbnMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mb2N1c0ljb25zLmxlbmd0aDsgaSsrKQorCQl7CisJCQl0aGlzLmZvY3VzSWNvbnNbaV0uZGVzdHJveSgpOworCQl9CisJCQorCQl0aGlzLmZvY3VzSWNvbnMgPSBudWxsOworCX0KKwkKKwlpZiAodGhpcy5mb2N1c0hpZ2hsaWdodCAhPSBudWxsKQorCXsKKwkJdGhpcy5mb2N1c0hpZ2hsaWdodC5kZXN0cm95KCk7CisJCXRoaXMuZm9jdXNIaWdobGlnaHQgPSBudWxsOworCX0KKwkKKwl0aGlzLmN1cnJlbnRDb25zdHJhaW50ID0gbnVsbDsKKwl0aGlzLmN1cnJlbnRGb2N1c0FyZWEgPSBudWxsOworCXRoaXMuY3VycmVudFBvaW50ID0gbnVsbDsKKwl0aGlzLmN1cnJlbnRGb2N1cyA9IG51bGw7CisJdGhpcy5mb2N1c1BvaW50cyA9IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRUb2xlcmFuY2UKKyAqIAorICogUmV0dXJucyB0aGUgdG9sZXJhbmNlIHRvIGJlIHVzZWQgZm9yIGludGVyc2VjdGluZyBjb25uZWN0aW9uIHBvaW50cy4gVGhpcworICogaW1wbGVtZW50YXRpb24gcmV0dXJucyA8bXhHcmFwaC50b2xlcmFuY2U+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBtZSAtIDxteE1vdXNlRXZlbnQ+IHdob3NlIHRvbGVyYW5jZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214Q29uc3RyYWludEhhbmRsZXIucHJvdG90eXBlLmdldFRvbGVyYW5jZSA9IGZ1bmN0aW9uKG1lKQoreworCXJldHVybiB0aGlzLmdyYXBoLmdldFRvbGVyYW5jZSgpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0SW1hZ2VGb3JDb25zdHJhaW50CisgKiAKKyAqIFJldHVybnMgdGhlIHRvbGVyYW5jZSB0byBiZSB1c2VkIGZvciBpbnRlcnNlY3RpbmcgY29ubmVjdGlvbiBwb2ludHMuCisgKi8KK214Q29uc3RyYWludEhhbmRsZXIucHJvdG90eXBlLmdldEltYWdlRm9yQ29uc3RyYWludCA9IGZ1bmN0aW9uKHN0YXRlLCBjb25zdHJhaW50LCBwb2ludCkKK3sKKwlyZXR1cm4gdGhpcy5wb2ludEltYWdlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFdmVudElnbm9yZWQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8bXhNb3VzZUV2ZW50PiBzaG91bGQgYmUgaWdub3JlZCBpbiA8dXBkYXRlPi4gVGhpcworICogaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgZmFsc2UuCisgKi8KK214Q29uc3RyYWludEhhbmRsZXIucHJvdG90eXBlLmlzRXZlbnRJZ25vcmVkID0gZnVuY3Rpb24obWUsIHNvdXJjZSkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1N0YXRlSWdub3JlZAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN0YXRlIHNob3VsZCBiZSBpZ25vcmVkLiBUaGlzIGFsd2F5cyByZXR1cm5zIGZhbHNlLgorICovCitteENvbnN0cmFpbnRIYW5kbGVyLnByb3RvdHlwZS5pc1N0YXRlSWdub3JlZCA9IGZ1bmN0aW9uKHN0YXRlLCBzb3VyY2UpCit7CisJcmV0dXJuIGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZGVzdHJveUljb25zCisgKiAKKyAqIERlc3Ryb3lzIHRoZSA8Zm9jdXNJY29ucz4gaWYgdGhleSBleGlzdC4KKyAqLworbXhDb25zdHJhaW50SGFuZGxlci5wcm90b3R5cGUuZGVzdHJveUljb25zID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLmZvY3VzSWNvbnMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mb2N1c0ljb25zLmxlbmd0aDsgaSsrKQorCQl7CisJCQl0aGlzLmZvY3VzSWNvbnNbaV0uZGVzdHJveSgpOworCQl9CisJCQorCQl0aGlzLmZvY3VzSWNvbnMgPSBudWxsOworCQl0aGlzLmZvY3VzUG9pbnRzID0gbnVsbDsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZXN0cm95Rm9jdXNIaWdobGlnaHQKKyAqIAorICogRGVzdHJveXMgdGhlIDxmb2N1c0hpZ2hsaWdodD4gaWYgb25lIGV4aXN0cy4KKyAqLworbXhDb25zdHJhaW50SGFuZGxlci5wcm90b3R5cGUuZGVzdHJveUZvY3VzSGlnaGxpZ2h0ID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLmZvY3VzSGlnaGxpZ2h0ICE9IG51bGwpCisJeworCQl0aGlzLmZvY3VzSGlnaGxpZ2h0LmRlc3Ryb3koKTsKKwkJdGhpcy5mb2N1c0hpZ2hsaWdodCA9IG51bGw7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNLZWVwRm9jdXNFdmVudAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgZm9jdXNlZCBzdGF0ZSBzaG91bGQgbm90IGJlIGNoYW5nZWQgZm9yIHRoZSBnaXZlbiBldmVudC4KKyAqIFRoaXMgcmV0dXJucyB0cnVlIGlmIHNoaWZ0IGFuZCBhbHQgYXJlIHByZXNzZWQuCisgKi8KK214Q29uc3RyYWludEhhbmRsZXIucHJvdG90eXBlLmlzS2VlcEZvY3VzRXZlbnQgPSBmdW5jdGlvbihtZSkKK3sKKwlyZXR1cm4gbXhFdmVudC5pc1NoaWZ0RG93bihtZS5nZXRFdmVudCgpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldENlbGxGb3JFdmVudAorICogCisgKiBSZXR1cm5zIHRoZSBjZWxsIGZvciB0aGUgZ2l2ZW4gZXZlbnQuCisgKi8KK214Q29uc3RyYWludEhhbmRsZXIucHJvdG90eXBlLmdldENlbGxGb3JFdmVudCA9IGZ1bmN0aW9uKG1lLCBwb2ludCkKK3sKKwl2YXIgY2VsbCA9IG1lLmdldENlbGwoKTsKKwkKKwkvLyBHZXRzIGNlbGwgdW5kZXIgYWN0dWFsIHBvaW50IGlmIGRpZmZlcmVudCBmcm9tIGV2ZW50IGxvY2F0aW9uCisJaWYgKGNlbGwgPT0gbnVsbCAmJiBwb2ludCAhPSBudWxsICYmIChtZS5nZXRHcmFwaFgoKSAhPSBwb2ludC54IHx8IG1lLmdldEdyYXBoWSgpICE9IHBvaW50LnkpKQorCXsKKwkJY2VsbCA9IHRoaXMuZ3JhcGguZ2V0Q2VsbEF0KHBvaW50LngsIHBvaW50LnkpOworCX0KKwkKKwkvLyBVc2VzIGNvbm5lY3RhYmxlIHBhcmVudCB2ZXJ0ZXggaWYgb25lIGV4aXN0cworCWlmIChjZWxsICE9IG51bGwgJiYgIXRoaXMuZ3JhcGguaXNDZWxsQ29ubmVjdGFibGUoY2VsbCkpCisJeworCQl2YXIgcGFyZW50ID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpLmdldFBhcmVudChjZWxsKTsKKwkJCisJCWlmICh0aGlzLmdyYXBoLmdldE1vZGVsKCkuaXNWZXJ0ZXgocGFyZW50KSAmJiB0aGlzLmdyYXBoLmlzQ2VsbENvbm5lY3RhYmxlKHBhcmVudCkpCisJCXsKKwkJCWNlbGwgPSBwYXJlbnQ7CisJCX0KKwl9CisJCisJcmV0dXJuIGNlbGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1cGRhdGUKKyAqIAorICogVXBkYXRlcyB0aGUgc3RhdGUgb2YgdGhpcyBoYW5kbGVyIGJhc2VkIG9uIHRoZSBnaXZlbiA8bXhNb3VzZUV2ZW50Pi4KKyAqIFNvdXJjZSBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY2VsbCBpcyBhIHNvdXJjZSBvciB0YXJnZXQuCisgKi8KK214Q29uc3RyYWludEhhbmRsZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKG1lLCBzb3VyY2UsIGV4aXN0aW5nRWRnZSwgcG9pbnQpCit7CisJaWYgKHRoaXMuaXNFbmFibGVkKCkgJiYgIXRoaXMuaXNFdmVudElnbm9yZWQobWUpKQorCXsKKwkJLy8gTGF6eSBpbnN0YWxsYXRpb24gb2YgbW91c2VsZWF2ZSBoYW5kbGVyCisJCWlmICh0aGlzLm1vdXNlbGVhdmVIYW5kbGVyID09IG51bGwgJiYgdGhpcy5ncmFwaC5jb250YWluZXIgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5tb3VzZWxlYXZlSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbigpCisJCQl7CisJCQkJdGhpcy5yZXNldCgpOworCQkJfSk7CisKKwkJCW14RXZlbnQuYWRkTGlzdGVuZXIodGhpcy5ncmFwaC5jb250YWluZXIsICdtb3VzZWxlYXZlJywgdGhpcy5yZXNldEhhbmRsZXIpOwkKKwkJfQorCQkKKwkJdmFyIHRvbCA9IHRoaXMuZ2V0VG9sZXJhbmNlKG1lKTsKKwkJdmFyIHggPSAocG9pbnQgIT0gbnVsbCkgPyBwb2ludC54IDogbWUuZ2V0R3JhcGhYKCk7CisJCXZhciB5ID0gKHBvaW50ICE9IG51bGwpID8gcG9pbnQueSA6IG1lLmdldEdyYXBoWSgpOworCQl2YXIgZ3JpZCA9IG5ldyBteFJlY3RhbmdsZSh4IC0gdG9sLCB5IC0gdG9sLCAyICogdG9sLCAyICogdG9sKTsKKwkJdmFyIG1vdXNlID0gbmV3IG14UmVjdGFuZ2xlKG1lLmdldEdyYXBoWCgpIC0gdG9sLCBtZS5nZXRHcmFwaFkoKSAtIHRvbCwgMiAqIHRvbCwgMiAqIHRvbCk7CisJCXZhciBzdGF0ZSA9IHRoaXMuZ3JhcGgudmlldy5nZXRTdGF0ZSh0aGlzLmdldENlbGxGb3JFdmVudChtZSwgcG9pbnQpKTsKKworCQkvLyBLZWVwcyBmb2N1cyBpY29ucyB2aXNpYmxlIHdoaWxlIG92ZXIgdmVydGV4IGJvdW5kcyBhbmQgbm8gb3RoZXIgY2VsbCB1bmRlciBtb3VzZSBvciBzaGlmdCBpcyBwcmVzc2VkCisJCWlmICghdGhpcy5pc0tlZXBGb2N1c0V2ZW50KG1lKSAmJiAodGhpcy5jdXJyZW50Rm9jdXNBcmVhID09IG51bGwgfHwgdGhpcy5jdXJyZW50Rm9jdXMgPT0gbnVsbCB8fAorCQkJKHN0YXRlICE9IG51bGwpIHx8ICF0aGlzLmdyYXBoLmdldE1vZGVsKCkuaXNWZXJ0ZXgodGhpcy5jdXJyZW50Rm9jdXMuY2VsbCkgfHwKKwkJCSFteFV0aWxzLmludGVyc2VjdHModGhpcy5jdXJyZW50Rm9jdXNBcmVhLCBtb3VzZSkpICYmIChzdGF0ZSAhPSB0aGlzLmN1cnJlbnRGb2N1cykpCisJCXsKKwkJCXRoaXMuY3VycmVudEZvY3VzQXJlYSA9IG51bGw7CisJCQl0aGlzLmN1cnJlbnRGb2N1cyA9IG51bGw7CisJCQl0aGlzLnNldEZvY3VzKG1lLCBzdGF0ZSwgc291cmNlKTsKKwkJfQorCisJCXRoaXMuY3VycmVudENvbnN0cmFpbnQgPSBudWxsOworCQl0aGlzLmN1cnJlbnRQb2ludCA9IG51bGw7CisJCXZhciBtaW5EaXN0U3EgPSBudWxsOworCQkKKwkJaWYgKHRoaXMuZm9jdXNJY29ucyAhPSBudWxsICYmIHRoaXMuY29uc3RyYWludHMgIT0gbnVsbCAmJgorCQkJKHN0YXRlID09IG51bGwgfHwgdGhpcy5jdXJyZW50Rm9jdXMgPT0gc3RhdGUpKQorCQl7CisJCQl2YXIgY3ggPSBtb3VzZS5nZXRDZW50ZXJYKCk7CisJCQl2YXIgY3kgPSBtb3VzZS5nZXRDZW50ZXJZKCk7CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5mb2N1c0ljb25zLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCXZhciBkeCA9IGN4IC0gdGhpcy5mb2N1c0ljb25zW2ldLmJvdW5kcy5nZXRDZW50ZXJYKCk7CisJCQkJdmFyIGR5ID0gY3kgLSB0aGlzLmZvY3VzSWNvbnNbaV0uYm91bmRzLmdldENlbnRlclkoKTsKKwkJCQl2YXIgdG1wID0gZHggKiBkeCArIGR5ICogZHk7CisJCQkJCisJCQkJaWYgKCh0aGlzLmludGVyc2VjdHModGhpcy5mb2N1c0ljb25zW2ldLCBtb3VzZSwgc291cmNlLCBleGlzdGluZ0VkZ2UpIHx8IChwb2ludCAhPSBudWxsICYmCisJCQkJCXRoaXMuaW50ZXJzZWN0cyh0aGlzLmZvY3VzSWNvbnNbaV0sIGdyaWQsIHNvdXJjZSwgZXhpc3RpbmdFZGdlKSkpICYmCisJCQkJCShtaW5EaXN0U3EgPT0gbnVsbCB8fCB0bXAgPCBtaW5EaXN0U3EpKQorCQkJCXsKKwkJCQkJdGhpcy5jdXJyZW50Q29uc3RyYWludCA9IHRoaXMuY29uc3RyYWludHNbaV07CisJCQkJCXRoaXMuY3VycmVudFBvaW50ID0gdGhpcy5mb2N1c1BvaW50c1tpXTsKKwkJCQkJbWluRGlzdFNxID0gdG1wOworCQkJCQkKKwkJCQkJdmFyIHRtcCA9IHRoaXMuZm9jdXNJY29uc1tpXS5ib3VuZHMuY2xvbmUoKTsKKwkJCQkJdG1wLmdyb3cobXhDb25zdGFudHMuSElHSExJR0hUX1NJWkUpOworCQkJCQkKKwkJCQkJaWYgKG14Q2xpZW50LklTX0lFKQorCQkJCQl7CisJCQkJCQl0bXAuZ3JvdygxKTsKKwkJCQkJCXRtcC53aWR0aCAtPSAxOworCQkJCQkJdG1wLmhlaWdodCAtPSAxOworCQkJCQl9CisJCQkJCQorCQkJCQlpZiAodGhpcy5mb2N1c0hpZ2hsaWdodCA9PSBudWxsKQorCQkJCQl7CisJCQkJCQl2YXIgaGwgPSB0aGlzLmNyZWF0ZUhpZ2hsaWdodFNoYXBlKCk7CisJCQkJCQlobC5kaWFsZWN0ID0gKHRoaXMuZ3JhcGguZGlhbGVjdCA9PSBteENvbnN0YW50cy5ESUFMRUNUX1NWRykgPworCQkJCQkJCQlteENvbnN0YW50cy5ESUFMRUNUX1NWRyA6IG14Q29uc3RhbnRzLkRJQUxFQ1RfVk1MOworCQkJCQkJaGwucG9pbnRlckV2ZW50cyA9IGZhbHNlOworCisJCQkJCQlobC5pbml0KHRoaXMuZ3JhcGguZ2V0VmlldygpLmdldE92ZXJsYXlQYW5lKCkpOworCQkJCQkJdGhpcy5mb2N1c0hpZ2hsaWdodCA9IGhsOworCQkJCQkJCisJCQkJCQl2YXIgZ2V0U3RhdGUgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCQkJCQkJeworCQkJCQkJCXJldHVybiAodGhpcy5jdXJyZW50Rm9jdXMgIT0gbnVsbCkgPyB0aGlzLmN1cnJlbnRGb2N1cyA6IHN0YXRlOworCQkJCQkJfSk7CisJCisJCQkJCQlteEV2ZW50LnJlZGlyZWN0TW91c2VFdmVudHMoaGwubm9kZSwgdGhpcy5ncmFwaCwgZ2V0U3RhdGUpOworCQkJCQl9CisKKwkJCQkJdGhpcy5mb2N1c0hpZ2hsaWdodC5ib3VuZHMgPSB0bXA7CisJCQkJCXRoaXMuZm9jdXNIaWdobGlnaHQucmVkcmF3KCk7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlpZiAodGhpcy5jdXJyZW50Q29uc3RyYWludCA9PSBudWxsKQorCQl7CisJCQl0aGlzLmRlc3Ryb3lGb2N1c0hpZ2hsaWdodCgpOworCQl9CisJfQorCWVsc2UKKwl7CisJCXRoaXMuY3VycmVudENvbnN0cmFpbnQgPSBudWxsOworCQl0aGlzLmN1cnJlbnRGb2N1cyA9IG51bGw7CisJCXRoaXMuY3VycmVudFBvaW50ID0gbnVsbDsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWRyYXcKKyAqIAorICogVHJhbnNmZXJzIHRoZSBmb2N1cyB0byB0aGUgZ2l2ZW4gc3RhdGUgYXMgYSBzb3VyY2Ugb3IgdGFyZ2V0IHRlcm1pbmFsLiBJZgorICogdGhlIGhhbmRsZXIgaXMgbm90IGVuYWJsZWQgdGhlbiB0aGUgb3V0bGluZSBpcyBwYWludGVkLCBidXQgdGhlIGNvbnN0cmFpbnRzCisgKiBhcmUgaWdub3JlZC4KKyAqLworbXhDb25zdHJhaW50SGFuZGxlci5wcm90b3R5cGUucmVkcmF3ID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLmN1cnJlbnRGb2N1cyAhPSBudWxsICYmIHRoaXMuY29uc3RyYWludHMgIT0gbnVsbCAmJiB0aGlzLmZvY3VzSWNvbnMgIT0gbnVsbCkKKwl7CisJCXZhciBzdGF0ZSA9IHRoaXMuZ3JhcGgudmlldy5nZXRTdGF0ZSh0aGlzLmN1cnJlbnRGb2N1cy5jZWxsKTsKKwkJdGhpcy5jdXJyZW50Rm9jdXMgPSBzdGF0ZTsKKwkJdGhpcy5jdXJyZW50Rm9jdXNBcmVhID0gbmV3IG14UmVjdGFuZ2xlKHN0YXRlLngsIHN0YXRlLnksIHN0YXRlLndpZHRoLCBzdGF0ZS5oZWlnaHQpOworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKQorCQl7CisJCQl2YXIgY3AgPSB0aGlzLmdyYXBoLmdldENvbm5lY3Rpb25Qb2ludChzdGF0ZSwgdGhpcy5jb25zdHJhaW50c1tpXSk7CisJCQl2YXIgaW1nID0gdGhpcy5nZXRJbWFnZUZvckNvbnN0cmFpbnQoc3RhdGUsIHRoaXMuY29uc3RyYWludHNbaV0sIGNwKTsKKworCQkJdmFyIGJvdW5kcyA9IG5ldyBteFJlY3RhbmdsZShNYXRoLnJvdW5kKGNwLnggLSBpbWcud2lkdGggLyAyKSwKKwkJCQlNYXRoLnJvdW5kKGNwLnkgLSBpbWcuaGVpZ2h0IC8gMiksIGltZy53aWR0aCwgaW1nLmhlaWdodCk7CisJCQl0aGlzLmZvY3VzSWNvbnNbaV0uYm91bmRzID0gYm91bmRzOworCQkJdGhpcy5mb2N1c0ljb25zW2ldLnJlZHJhdygpOworCQkJdGhpcy5jdXJyZW50Rm9jdXNBcmVhLmFkZCh0aGlzLmZvY3VzSWNvbnNbaV0uYm91bmRzKTsKKwkJCXRoaXMuZm9jdXNQb2ludHNbaV0gPSBjcDsKKwkJfQorCX0JCit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRGb2N1cworICogCisgKiBUcmFuc2ZlcnMgdGhlIGZvY3VzIHRvIHRoZSBnaXZlbiBzdGF0ZSBhcyBhIHNvdXJjZSBvciB0YXJnZXQgdGVybWluYWwuIElmCisgKiB0aGUgaGFuZGxlciBpcyBub3QgZW5hYmxlZCB0aGVuIHRoZSBvdXRsaW5lIGlzIHBhaW50ZWQsIGJ1dCB0aGUgY29uc3RyYWludHMKKyAqIGFyZSBpZ25vcmVkLgorICovCitteENvbnN0cmFpbnRIYW5kbGVyLnByb3RvdHlwZS5zZXRGb2N1cyA9IGZ1bmN0aW9uKG1lLCBzdGF0ZSwgc291cmNlKQoreworCXRoaXMuY29uc3RyYWludHMgPSAoc3RhdGUgIT0gbnVsbCAmJiAhdGhpcy5pc1N0YXRlSWdub3JlZChzdGF0ZSwgc291cmNlKSAmJgorCQl0aGlzLmdyYXBoLmlzQ2VsbENvbm5lY3RhYmxlKHN0YXRlLmNlbGwpKSA/ICgodGhpcy5pc0VuYWJsZWQoKSkgPworCQkodGhpcy5ncmFwaC5nZXRBbGxDb25uZWN0aW9uQ29uc3RyYWludHMoc3RhdGUsIHNvdXJjZSkgfHwgW10pIDogW10pIDogbnVsbDsKKworCS8vIE9ubHkgdXNlcyBjZWxscyB3aGljaCBoYXZlIGNvbnN0cmFpbnRzCisJaWYgKHRoaXMuY29uc3RyYWludHMgIT0gbnVsbCkKKwl7CisJCXRoaXMuY3VycmVudEZvY3VzID0gc3RhdGU7CisJCXRoaXMuY3VycmVudEZvY3VzQXJlYSA9IG5ldyBteFJlY3RhbmdsZShzdGF0ZS54LCBzdGF0ZS55LCBzdGF0ZS53aWR0aCwgc3RhdGUuaGVpZ2h0KTsKKwkJCisJCWlmICh0aGlzLmZvY3VzSWNvbnMgIT0gbnVsbCkKKwkJeworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmZvY3VzSWNvbnMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJdGhpcy5mb2N1c0ljb25zW2ldLmRlc3Ryb3koKTsKKwkJCX0KKwkJCQorCQkJdGhpcy5mb2N1c0ljb25zID0gbnVsbDsKKwkJCXRoaXMuZm9jdXNQb2ludHMgPSBudWxsOworCQl9CisJCQorCQl0aGlzLmZvY3VzUG9pbnRzID0gW107CisJCXRoaXMuZm9jdXNJY29ucyA9IFtdOworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKQorCQl7CisJCQl2YXIgY3AgPSB0aGlzLmdyYXBoLmdldENvbm5lY3Rpb25Qb2ludChzdGF0ZSwgdGhpcy5jb25zdHJhaW50c1tpXSk7CisJCQl2YXIgaW1nID0gdGhpcy5nZXRJbWFnZUZvckNvbnN0cmFpbnQoc3RhdGUsIHRoaXMuY29uc3RyYWludHNbaV0sIGNwKTsKKworCQkJdmFyIHNyYyA9IGltZy5zcmM7CisJCQl2YXIgYm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKE1hdGgucm91bmQoY3AueCAtIGltZy53aWR0aCAvIDIpLAorCQkJCU1hdGgucm91bmQoY3AueSAtIGltZy5oZWlnaHQgLyAyKSwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTsKKwkJCXZhciBpY29uID0gbmV3IG14SW1hZ2VTaGFwZShib3VuZHMsIHNyYyk7CisJCQlpY29uLmRpYWxlY3QgPSAodGhpcy5ncmFwaC5kaWFsZWN0ICE9IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHKSA/CisJCQkJCW14Q29uc3RhbnRzLkRJQUxFQ1RfTUlYRURIVE1MIDogbXhDb25zdGFudHMuRElBTEVDVF9TVkc7CisJCQlpY29uLnByZXNlcnZlSW1hZ2VBc3BlY3QgPSBmYWxzZTsKKwkJCWljb24uaW5pdCh0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXREZWNvcmF0b3JQYW5lKCkpOworCQkJCisJCQkvLyBGaXhlcyBsb3N0IGV2ZW50IHRyYWNraW5nIGZvciBpbWFnZXMgaW4gcXVpcmtzIC8gSUU4IHN0YW5kYXJkcworCQkJaWYgKG14Q2xpZW50LklTX1FVSVJLUyB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gOCkKKwkJCXsKKwkJCQlteEV2ZW50LmFkZExpc3RlbmVyKGljb24ubm9kZSwgJ2RyYWdzdGFydCcsIGZ1bmN0aW9uKGV2dCkKKwkJCQl7CisJCQkJCW14RXZlbnQuY29uc3VtZShldnQpOworCQkJCQkKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0pOworCQkJfQorCQkJCisJCQkvLyBNb3ZlIHRoZSBpY29uIGJlaGluZCBhbGwgb3RoZXIgb3ZlcmxheXMKKwkJCWlmIChpY29uLm5vZGUucHJldmlvdXNTaWJsaW5nICE9IG51bGwpCisJCQl7CisJCQkJaWNvbi5ub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGljb24ubm9kZSwgaWNvbi5ub2RlLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7CisJCQl9CisKKwkJCXZhciBnZXRTdGF0ZSA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbigpCisJCQl7CisJCQkJcmV0dXJuICh0aGlzLmN1cnJlbnRGb2N1cyAhPSBudWxsKSA/IHRoaXMuY3VycmVudEZvY3VzIDogc3RhdGU7CisJCQl9KTsKKwkJCQorCQkJaWNvbi5yZWRyYXcoKTsKKworCQkJbXhFdmVudC5yZWRpcmVjdE1vdXNlRXZlbnRzKGljb24ubm9kZSwgdGhpcy5ncmFwaCwgZ2V0U3RhdGUpOworCQkJdGhpcy5jdXJyZW50Rm9jdXNBcmVhLmFkZChpY29uLmJvdW5kcyk7CisJCQl0aGlzLmZvY3VzSWNvbnMucHVzaChpY29uKTsKKwkJCXRoaXMuZm9jdXNQb2ludHMucHVzaChjcCk7CisJCX0KKwkJCisJCXRoaXMuY3VycmVudEZvY3VzQXJlYS5ncm93KHRoaXMuZ2V0VG9sZXJhbmNlKG1lKSk7CisJfQorCWVsc2UKKwl7CisJCXRoaXMuZGVzdHJveUljb25zKCk7CisJCXRoaXMuZGVzdHJveUZvY3VzSGlnaGxpZ2h0KCk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlSGlnaGxpZ2h0U2hhcGUKKyAqIAorICogQ3JlYXRlIHRoZSBzaGFwZSB1c2VkIHRvIHBhaW50IHRoZSBoaWdobGlnaHQuCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gaWNvbiBpbnRlcnNlY3RzIHRoZSBnaXZlbiBwb2ludC4KKyAqLworbXhDb25zdHJhaW50SGFuZGxlci5wcm90b3R5cGUuY3JlYXRlSGlnaGxpZ2h0U2hhcGUgPSBmdW5jdGlvbigpCit7CisJdmFyIGhsID0gbmV3IG14UmVjdGFuZ2xlU2hhcGUobnVsbCwgdGhpcy5oaWdobGlnaHRDb2xvciwgdGhpcy5oaWdobGlnaHRDb2xvciwgbXhDb25zdGFudHMuSElHSExJR0hUX1NUUk9LRVdJRFRIKTsKKwlobC5vcGFjaXR5ID0gbXhDb25zdGFudHMuSElHSExJR0hUX09QQUNJVFk7CisJCisJcmV0dXJuIGhsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaW50ZXJzZWN0cworICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGljb24gaW50ZXJzZWN0cyB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLgorICovCitteENvbnN0cmFpbnRIYW5kbGVyLnByb3RvdHlwZS5pbnRlcnNlY3RzID0gZnVuY3Rpb24oaWNvbiwgbW91c2UsIHNvdXJjZSwgZXhpc3RpbmdFZGdlKQoreworCXJldHVybiBteFV0aWxzLmludGVyc2VjdHMoaWNvbi5ib3VuZHMsIG1vdXNlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqIAorICogRGVzdHJveSB0aGlzIGhhbmRsZXIuCisgKi8KK214Q29uc3RyYWludEhhbmRsZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpCit7CisJdGhpcy5yZXNldCgpOworCQorCWlmICh0aGlzLnJlc2V0SGFuZGxlciAhPSBudWxsKQorCXsKKwkJdGhpcy5ncmFwaC5tb2RlbC5yZW1vdmVMaXN0ZW5lcih0aGlzLnJlc2V0SGFuZGxlcik7CisJCXRoaXMuZ3JhcGgudmlldy5yZW1vdmVMaXN0ZW5lcih0aGlzLnJlc2V0SGFuZGxlcik7CisJCXRoaXMuZ3JhcGgucmVtb3ZlTGlzdGVuZXIodGhpcy5yZXNldEhhbmRsZXIpOworCQl0aGlzLnJlc2V0SGFuZGxlciA9IG51bGw7CisJfQorCQorCWlmICh0aGlzLm1vdXNlbGVhdmVIYW5kbGVyICE9IG51bGwgJiYgdGhpcy5ncmFwaC5jb250YWluZXIgIT0gbnVsbCkKKwl7CisJCW14RXZlbnQucmVtb3ZlTGlzdGVuZXIodGhpcy5ncmFwaC5jb250YWluZXIsICdtb3VzZWxlYXZlJywgdGhpcy5tb3VzZWxlYXZlSGFuZGxlcik7CisJCXRoaXMubW91c2VsZWF2ZUhhbmRsZXIgPSBudWxsOworCX0KK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teEVkZ2VIYW5kbGVyLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhFZGdlSGFuZGxlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGQ3NzYxCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhFZGdlSGFuZGxlci5qcwpAQCAtMCwwICsxLDI0MDkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14RWRnZUhhbmRsZXIKKyAqCisgKiBHcmFwaCBldmVudCBoYW5kbGVyIHRoYXQgcmVjb25uZWN0cyBlZGdlcyBhbmQgbW9kaWZpZXMgY29udHJvbCBwb2ludHMgYW5kCisgKiB0aGUgZWRnZSBsYWJlbCBsb2NhdGlvbi4gVXNlcyA8bXhUZXJtaW5hbE1hcmtlcj4gZm9yIGZpbmRpbmcgYW5kCisgKiBoaWdobGlnaHRpbmcgbmV3IHNvdXJjZSBhbmQgdGFyZ2V0IHZlcnRpY2VzLiBUaGlzIGhhbmRsZXIgaXMgYXV0b21hdGljYWxseQorICogY3JlYXRlZCBpbiA8bXhHcmFwaC5jcmVhdGVIYW5kbGVyPiBmb3IgZWFjaCBzZWxlY3RlZCBlZGdlLgorICogCisgKiBUbyBlbmFibGUgYWRkaW5nL3JlbW92aW5nIGNvbnRyb2wgcG9pbnRzLCB0aGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQ6CisgKiAKKyAqIChjb2RlKQorICogbXhFZGdlSGFuZGxlci5wcm90b3R5cGUuYWRkRW5hYmxlZCA9IHRydWU7CisgKiBteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5yZW1vdmVFbmFibGVkID0gdHJ1ZTsKKyAqIChlbmQpCisgKiAKKyAqIE5vdGU6IFRoaXMgZXhwZXJpbWVudGFsIGZlYXR1cmUgaXMgbm90IHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uIHVzZS4KKyAqIAorICogQ29uc3RydWN0b3I6IG14RWRnZUhhbmRsZXIKKyAqCisgKiBDb25zdHJ1Y3RzIGFuIGVkZ2UgaGFuZGxlciBmb3IgdGhlIHNwZWNpZmllZCA8bXhDZWxsU3RhdGU+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gb2YgdGhlIGNlbGwgdG8gYmUgaGFuZGxlZC4KKyAqLworZnVuY3Rpb24gbXhFZGdlSGFuZGxlcihzdGF0ZSkKK3sKKwlpZiAoc3RhdGUgIT0gbnVsbCkKKwl7CisJCXRoaXMuc3RhdGUgPSBzdGF0ZTsKKwkJdGhpcy5pbml0KCk7CisJCQorCQkvLyBIYW5kbGVzIGVzY2FwZSBrZXlzdHJva2VzCisJCXRoaXMuZXNjYXBlSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihzZW5kZXIsIGV2dCkKKwkJeworCQkJdGhpcy5yZXNldCgpOworCQl9KTsKKwkJCisJCXRoaXMuc3RhdGUudmlldy5ncmFwaC5hZGRMaXN0ZW5lcihteEV2ZW50LkVTQ0FQRSwgdGhpcy5lc2NhcGVIYW5kbGVyKTsKKwl9Cit9OworCisvKioKKyAqIFZhcmlhYmxlOiBncmFwaAorICogCisgKiBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmdyYXBoID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogc3RhdGUKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSA8bXhDZWxsU3RhdGU+IGJlaW5nIG1vZGlmaWVkLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5zdGF0ZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IG1hcmtlcgorICogCisgKiBIb2xkcyB0aGUgPG14VGVybWluYWxNYXJrZXI+IHdoaWNoIGlzIHVzZWQgZm9yIGhpZ2hsaWdodGluZyB0ZXJtaW5hbHMuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLm1hcmtlciA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGNvbnN0cmFpbnRIYW5kbGVyCisgKiAKKyAqIEhvbGRzIHRoZSA8bXhDb25zdHJhaW50SGFuZGxlcj4gdXNlZCBmb3IgZHJhd2luZyBhbmQgaGlnaGxpZ2h0aW5nCisgKiBjb25zdHJhaW50cy4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUuY29uc3RyYWludEhhbmRsZXIgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBlcnJvcgorICogCisgKiBIb2xkcyB0aGUgY3VycmVudCB2YWxpZGF0aW9uIGVycm9yIHdoaWxlIGEgY29ubmVjdGlvbiBpcyBiZWluZyBjaGFuZ2VkLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5lcnJvciA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHNoYXBlCisgKiAKKyAqIEhvbGRzIHRoZSA8bXhTaGFwZT4gdGhhdCByZXByZXNlbnRzIHRoZSBwcmV2aWV3IGVkZ2UuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLnNoYXBlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogYmVuZHMKKyAqIAorICogSG9sZHMgdGhlIDxteFNoYXBlcz4gdGhhdCByZXByZXNlbnQgdGhlIHBvaW50cy4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUuYmVuZHMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBsYWJlbFNoYXBlCisgKiAKKyAqIEhvbGRzIHRoZSA8bXhTaGFwZT4gdGhhdCByZXByZXNlbnRzIHRoZSBsYWJlbCBwb3NpdGlvbi4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUubGFiZWxTaGFwZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGNsb25lRW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgY2xvbmluZyBieSBjb250cm9sLWRyYWcgaXMgZW5hYmxlZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5jbG9uZUVuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBhZGRFbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiBhZGRpbmcgYmVuZHMgYnkgc2hpZnQtY2xpY2sgaXMgZW5hYmxlZC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqIE5vdGU6IFRoaXMgZXhwZXJpbWVudGFsIGZlYXR1cmUgaXMgbm90IHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uIHVzZS4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUuYWRkRW5hYmxlZCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiByZW1vdmVFbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiByZW1vdmluZyBiZW5kcyBieSBzaGlmdC1jbGljayBpcyBlbmFibGVkLiBEZWZhdWx0IGlzIGZhbHNlLgorICogTm90ZTogVGhpcyBleHBlcmltZW50YWwgZmVhdHVyZSBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24gdXNlLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5yZW1vdmVFbmFibGVkID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGRibENsaWNrUmVtb3ZlRW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgcmVtb3ZpbmcgYmVuZHMgYnkgZG91YmxlIGNsaWNrIGlzIGVuYWJsZWQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmRibENsaWNrUmVtb3ZlRW5hYmxlZCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBtZXJnZVJlbW92ZUVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIHJlbW92aW5nIGJlbmRzIGJ5IGRyb3BwaW5nIHRoZW0gb24gb3RoZXIgYmVuZHMgaXMgZW5hYmxlZC4KKyAqIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLm1lcmdlUmVtb3ZlRW5hYmxlZCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBzdHJhaWdodFJlbW92ZUVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIHJlbW92aW5nIGJlbmRzIGJ5IGNyZWF0aW5nIHN0cmFpZ2h0IHNlZ21lbnRzIHNob3VsZCBiZSBlbmFibGVkLgorICogSWYgZW5hYmxlZCwgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBob2xkaW5nIGRvd24gdGhlIGFsdCBrZXkgd2hpbGUgbW92aW5nLgorICogRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUuc3RyYWlnaHRSZW1vdmVFbmFibGVkID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHZpcnR1YWxCZW5kc0VuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIHZpcnR1YWwgYmVuZHMgc2hvdWxkIGJlIGFkZGVkIGluIHRoZSBjZW50ZXIgb2YgZWFjaAorICogc2VnbWVudHMuIFRoZXNlIGJlbmRzIGNhbiB0aGVuIGJlIHVzZWQgdG8gYWRkIG5ldyB3YXlwb2ludHMuCisgKiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS52aXJ0dWFsQmVuZHNFbmFibGVkID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHZpcnR1YWxCZW5kT3BhY2l0eQorICogCisgKiBPcGFjaXR5IHRvIGJlIHVzZWQgZm9yIHZpcnR1YWwgYmVuZHMgKHNlZSA8dmlydHVhbEJlbmRzRW5hYmxlZD4pLgorICogRGVmYXVsdCBpcyAyMC4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUudmlydHVhbEJlbmRPcGFjaXR5ID0gMjA7CisKKy8qKgorICogVmFyaWFibGU6IHBhcmVudEhpZ2hsaWdodEVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBwYXJlbnQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIGlmIGEgY2hpbGQgY2VsbCBpcyBzZWxlY3RlZC4KKyAqIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLnBhcmVudEhpZ2hsaWdodEVuYWJsZWQgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogcHJlZmVySHRtbAorICogCisgKiBTcGVjaWZpZXMgaWYgYmVuZHMgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBncmFwaCBjb250YWluZXIuIFRoaXMgaXMgdXBkYXRlZAorICogaW4gPGluaXQ+IGJhc2VkIG9uIHdoZXRoZXIgdGhlIGVkZ2Ugb3Igb25lIG9mIGl0cyB0ZXJtaW5hbHMgaGFzIGFuIEhUTUwKKyAqIGxhYmVsIGluIHRoZSBjb250YWluZXIuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLnByZWZlckh0bWwgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogYWxsb3dIYW5kbGVCb3VuZHNDaGVjaworICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIGJvdW5kcyBvZiBoYW5kbGVzIHNob3VsZCBiZSB1c2VkIGZvciBoaXQtZGV0ZWN0aW9uIGluIElFCisgKiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmFsbG93SGFuZGxlQm91bmRzQ2hlY2sgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBzbmFwVG9UZXJtaW5hbHMKKyAqIAorICogU3BlY2lmaWVzIGlmIHdheXBvaW50cyBzaG91bGQgc25hcCB0byB0aGUgcm91dGluZyBjZW50ZXJzIG9mIHRlcm1pbmFscy4KKyAqIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLnNuYXBUb1Rlcm1pbmFscyA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBoYW5kbGVJbWFnZQorICogCisgKiBPcHRpb25hbCA8bXhJbWFnZT4gdG8gYmUgdXNlZCBhcyBoYW5kbGVzLiBEZWZhdWx0IGlzIG51bGwuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmhhbmRsZUltYWdlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogdG9sZXJhbmNlCisgKiAKKyAqIE9wdGlvbmFsIHRvbGVyYW5jZSBmb3IgaGl0LWRldGVjdGlvbiBpbiA8Z2V0SGFuZGxlRm9yRXZlbnQ+LiBEZWZhdWx0IGlzIDAuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLnRvbGVyYW5jZSA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IG91dGxpbmVDb25uZWN0CisgKiAKKyAqIFNwZWNpZmllcyBpZiBjb25uZWN0aW9ucyB0byB0aGUgb3V0bGluZSBvZiBhIGhpZ2hsaWdodGVkIHRhcmdldCBzaG91bGQgYmUKKyAqIGVuYWJsZWQuIFRoaXMgd2lsbCBhbGxvdyB0byBwbGFjZSB0aGUgY29ubmVjdGlvbiBwb2ludCBhbG9uZyB0aGUgb3V0bGluZSBvZgorICogdGhlIGhpZ2hsaWdodGVkIHRhcmdldC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUub3V0bGluZUNvbm5lY3QgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogbWFuYWdlTGFiZWxIYW5kbGUKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBsYWJlbCBoYW5kbGUgc2hvdWxkIGJlIG1vdmVkIGlmIGl0IGludGVyc2VjdHMgd2l0aCBhbm90aGVyCisgKiBoYW5kbGUuIFVzZXMgPGNoZWNrTGFiZWxIYW5kbGU+IGZvciBjaGVja2luZyBhbmQgbW92aW5nLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5tYW5hZ2VMYWJlbEhhbmRsZSA9IGZhbHNlOworCisvKioKKyAqIEZ1bmN0aW9uOiBpbml0CisgKiAKKyAqIEluaXRpYWxpemVzIHRoZSBzaGFwZXMgcmVxdWlyZWQgZm9yIHRoaXMgZWRnZSBoYW5kbGVyLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKQoreworCXRoaXMuZ3JhcGggPSB0aGlzLnN0YXRlLnZpZXcuZ3JhcGg7CisJdGhpcy5tYXJrZXIgPSB0aGlzLmNyZWF0ZU1hcmtlcigpOworCXRoaXMuY29uc3RyYWludEhhbmRsZXIgPSBuZXcgbXhDb25zdHJhaW50SGFuZGxlcih0aGlzLmdyYXBoKTsKKwkKKwkvLyBDbG9uZXMgdGhlIG9yaWdpbmFsIHBvaW50cyBmcm9tIHRoZSBjZWxsCisJLy8gYW5kIG1ha2VzIHN1cmUgYXQgbGVhc3Qgb25lIHBvaW50IGV4aXN0cworCXRoaXMucG9pbnRzID0gW107CisJCisJLy8gVXNlcyB0aGUgYWJzb2x1dGUgcG9pbnRzIG9mIHRoZSBzdGF0ZQorCS8vIGZvciB0aGUgaW5pdGlhbCBjb25maWd1cmF0aW9uIGFuZCBwcmV2aWV3CisJdGhpcy5hYnNwb2ludHMgPSB0aGlzLmdldFNlbGVjdGlvblBvaW50cyh0aGlzLnN0YXRlKTsKKwl0aGlzLnNoYXBlID0gdGhpcy5jcmVhdGVTZWxlY3Rpb25TaGFwZSh0aGlzLmFic3BvaW50cyk7CisJdGhpcy5zaGFwZS5kaWFsZWN0ID0gKHRoaXMuZ3JhcGguZGlhbGVjdCAhPSBteENvbnN0YW50cy5ESUFMRUNUX1NWRykgPworCQlteENvbnN0YW50cy5ESUFMRUNUX01JWEVESFRNTCA6IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHOworCXRoaXMuc2hhcGUuaW5pdCh0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXRPdmVybGF5UGFuZSgpKTsKKwl0aGlzLnNoYXBlLnBvaW50ZXJFdmVudHMgPSBmYWxzZTsKKwl0aGlzLnNoYXBlLnNldEN1cnNvcihteENvbnN0YW50cy5DVVJTT1JfTU9WQUJMRV9FREdFKTsKKwlteEV2ZW50LnJlZGlyZWN0TW91c2VFdmVudHModGhpcy5zaGFwZS5ub2RlLCB0aGlzLmdyYXBoLCB0aGlzLnN0YXRlKTsKKworCS8vIFVwZGF0ZXMgcHJlZmVySHRtbAorCXRoaXMucHJlZmVySHRtbCA9IHRoaXMuc3RhdGUudGV4dCAhPSBudWxsICYmCisJCXRoaXMuc3RhdGUudGV4dC5ub2RlLnBhcmVudE5vZGUgPT0gdGhpcy5ncmFwaC5jb250YWluZXI7CisJCisJaWYgKCF0aGlzLnByZWZlckh0bWwpCisJeworCQkvLyBDaGVja3Mgc291cmNlIHRlcm1pbmFsCisJCXZhciBzb3VyY2VTdGF0ZSA9IHRoaXMuc3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsU3RhdGUodHJ1ZSk7CisJCQorCQlpZiAoc291cmNlU3RhdGUgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5wcmVmZXJIdG1sID0gc291cmNlU3RhdGUudGV4dCAhPSBudWxsICYmCisJCQkJc291cmNlU3RhdGUudGV4dC5ub2RlLnBhcmVudE5vZGUgPT0gdGhpcy5ncmFwaC5jb250YWluZXI7CisJCX0KKwkJCisJCWlmICghdGhpcy5wcmVmZXJIdG1sKQorCQl7CisJCQkvLyBDaGVja3MgdGFyZ2V0IHRlcm1pbmFsCisJCQl2YXIgdGFyZ2V0U3RhdGUgPSB0aGlzLnN0YXRlLmdldFZpc2libGVUZXJtaW5hbFN0YXRlKGZhbHNlKTsKKwkJCQorCQkJaWYgKHRhcmdldFN0YXRlICE9IG51bGwpCisJCQl7CisJCQkJdGhpcy5wcmVmZXJIdG1sID0gdGFyZ2V0U3RhdGUudGV4dCAhPSBudWxsICYmCisJCQkJdGFyZ2V0U3RhdGUudGV4dC5ub2RlLnBhcmVudE5vZGUgPT0gdGhpcy5ncmFwaC5jb250YWluZXI7CisJCQl9CisJCX0KKwl9CisJCisJLy8gQWRkcyBoaWdobGlnaHQgZm9yIHBhcmVudCBncm91cAorCWlmICh0aGlzLnBhcmVudEhpZ2hsaWdodEVuYWJsZWQpCisJeworCQl2YXIgcGFyZW50ID0gdGhpcy5ncmFwaC5tb2RlbC5nZXRQYXJlbnQodGhpcy5zdGF0ZS5jZWxsKTsKKwkJCisJCWlmICh0aGlzLmdyYXBoLm1vZGVsLmlzVmVydGV4KHBhcmVudCkpCisJCXsKKwkJCXZhciBwc3RhdGUgPSB0aGlzLmdyYXBoLnZpZXcuZ2V0U3RhdGUocGFyZW50KTsKKwkJCQorCQkJaWYgKHBzdGF0ZSAhPSBudWxsKQorCQkJeworCQkJCXRoaXMucGFyZW50SGlnaGxpZ2h0ID0gdGhpcy5jcmVhdGVQYXJlbnRIaWdobGlnaHRTaGFwZShwc3RhdGUpOworCQkJCS8vIFZNTCBkaWFsZWN0IHJlcXVpcmVkIGhlcmUgZm9yIGV2ZW50IHRyYW5zcGFyZW5jeSBpbiBJRQorCQkJCXRoaXMucGFyZW50SGlnaGxpZ2h0LmRpYWxlY3QgPSAodGhpcy5ncmFwaC5kaWFsZWN0ICE9IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHKSA/IG14Q29uc3RhbnRzLkRJQUxFQ1RfVk1MIDogbXhDb25zdGFudHMuRElBTEVDVF9TVkc7CisJCQkJdGhpcy5wYXJlbnRIaWdobGlnaHQucG9pbnRlckV2ZW50cyA9IGZhbHNlOworCQkJCXRoaXMucGFyZW50SGlnaGxpZ2h0LnJvdGF0aW9uID0gTnVtYmVyKHBzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9ST1RBVElPTl0gfHwgJzAnKTsKKwkJCQl0aGlzLnBhcmVudEhpZ2hsaWdodC5pbml0KHRoaXMuZ3JhcGguZ2V0VmlldygpLmdldE92ZXJsYXlQYW5lKCkpOworCQkJfQorCQl9CisJfQorCQorCS8vIENyZWF0ZXMgYmVuZHMgZm9yIHRoZSBub24tcm91dGVkIGFic29sdXRlIHBvaW50cworCS8vIG9yIGJlbmRzIHRoYXQgZG9uJ3QgY29ycmVzcG9uZCB0byBwb2ludHMKKwlpZiAodGhpcy5ncmFwaC5nZXRTZWxlY3Rpb25Db3VudCgpIDwgbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLm1heENlbGxzIHx8CisJCW14R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5tYXhDZWxscyA8PSAwKQorCXsKKwkJdGhpcy5iZW5kcyA9IHRoaXMuY3JlYXRlQmVuZHMoKTsKKworCQlpZiAodGhpcy5pc1ZpcnR1YWxCZW5kc0VuYWJsZWQoKSkKKwkJeworCQkJdGhpcy52aXJ0dWFsQmVuZHMgPSB0aGlzLmNyZWF0ZVZpcnR1YWxCZW5kcygpOworCQl9CisJfQorCisJLy8gQWRkcyBhIHJlY3Rhbmd1bGFyIGhhbmRsZSBmb3IgdGhlIGxhYmVsIHBvc2l0aW9uCisJdGhpcy5sYWJlbCA9IG5ldyBteFBvaW50KHRoaXMuc3RhdGUuYWJzb2x1dGVPZmZzZXQueCwgdGhpcy5zdGF0ZS5hYnNvbHV0ZU9mZnNldC55KTsKKwl0aGlzLmxhYmVsU2hhcGUgPSB0aGlzLmNyZWF0ZUxhYmVsSGFuZGxlU2hhcGUoKTsKKwl0aGlzLmluaXRCZW5kKHRoaXMubGFiZWxTaGFwZSk7CisJdGhpcy5sYWJlbFNoYXBlLnNldEN1cnNvcihteENvbnN0YW50cy5DVVJTT1JfTEFCRUxfSEFORExFKTsKKwkKKwl0aGlzLmN1c3RvbUhhbmRsZXMgPSB0aGlzLmNyZWF0ZUN1c3RvbUhhbmRsZXMoKTsKKwkKKwl0aGlzLnJlZHJhdygpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlQ3VzdG9tSGFuZGxlcworICogCisgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGN1c3RvbSBoYW5kbGVzLiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUuY3JlYXRlQ3VzdG9tSGFuZGxlcyA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzVmlydHVhbEJlbmRzRW5hYmxlZAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdmlydHVhbCBiZW5kcyBzaG91bGQgYmUgYWRkZWQuIFRoaXMgcmV0dXJucyB0cnVlIGlmCisgKiA8dmlydHVhbEJlbmRzRW5hYmxlZD4gaXMgdHJ1ZSBhbmQgdGhlIGN1cnJlbnQgc3R5bGUgYWxsb3dzIGFuZAorICogcmVuZGVycyBjdXN0b20gd2F5cG9pbnRzLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5pc1ZpcnR1YWxCZW5kc0VuYWJsZWQgPSBmdW5jdGlvbihldnQpCit7CisJcmV0dXJuIHRoaXMudmlydHVhbEJlbmRzRW5hYmxlZCAmJiAodGhpcy5zdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9FREdFXSA9PSBudWxsIHx8CisJCQl0aGlzLnN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0VER0VdID09IG14Q29uc3RhbnRzLk5PTkUgfHwKKwkJCXRoaXMuc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfTk9FREdFU1RZTEVdID09IDEpICAmJgorCQkJbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9TSEFQRSwgbnVsbCkgIT0gJ2Fycm93JzsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQWRkUG9pbnRFdmVudAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGV2ZW50IGlzIGEgdHJpZ2dlciB0byBhZGQgYSBuZXcgcG9pbnQuIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZSBpZiBzaGlmdCBpcyBwcmVzc2VkLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5pc0FkZFBvaW50RXZlbnQgPSBmdW5jdGlvbihldnQpCit7CisJcmV0dXJuIG14RXZlbnQuaXNTaGlmdERvd24oZXZ0KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzUmVtb3ZlUG9pbnRFdmVudAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGV2ZW50IGlzIGEgdHJpZ2dlciB0byByZW1vdmUgYSBwb2ludC4gVGhpcworICogaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmIHNoaWZ0IGlzIHByZXNzZWQuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmlzUmVtb3ZlUG9pbnRFdmVudCA9IGZ1bmN0aW9uKGV2dCkKK3sKKwlyZXR1cm4gbXhFdmVudC5pc1NoaWZ0RG93bihldnQpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0U2VsZWN0aW9uUG9pbnRzCisgKiAKKyAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcG9pbnRzIHRoYXQgZGVmaW5lcyB0aGUgc2VsZWN0aW9uIHN0cm9rZS4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uUG9pbnRzID0gZnVuY3Rpb24oc3RhdGUpCit7CisJcmV0dXJuIHN0YXRlLmFic29sdXRlUG9pbnRzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlU2VsZWN0aW9uU2hhcGUKKyAqIAorICogQ3JlYXRlcyB0aGUgc2hhcGUgdXNlZCB0byBkcmF3IHRoZSBzZWxlY3Rpb24gYm9yZGVyLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5jcmVhdGVQYXJlbnRIaWdobGlnaHRTaGFwZSA9IGZ1bmN0aW9uKGJvdW5kcykKK3sKKwl2YXIgc2hhcGUgPSBuZXcgbXhSZWN0YW5nbGVTaGFwZShib3VuZHMsIG51bGwsIHRoaXMuZ2V0U2VsZWN0aW9uQ29sb3IoKSk7CisJc2hhcGUuc3Ryb2tld2lkdGggPSB0aGlzLmdldFNlbGVjdGlvblN0cm9rZVdpZHRoKCk7CisJc2hhcGUuaXNEYXNoZWQgPSB0aGlzLmlzU2VsZWN0aW9uRGFzaGVkKCk7CisJCisJcmV0dXJuIHNoYXBlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlU2VsZWN0aW9uU2hhcGUKKyAqIAorICogQ3JlYXRlcyB0aGUgc2hhcGUgdXNlZCB0byBkcmF3IHRoZSBzZWxlY3Rpb24gYm9yZGVyLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5jcmVhdGVTZWxlY3Rpb25TaGFwZSA9IGZ1bmN0aW9uKHBvaW50cykKK3sKKwl2YXIgc2hhcGUgPSBuZXcgdGhpcy5zdGF0ZS5zaGFwZS5jb25zdHJ1Y3RvcigpOworCXNoYXBlLm91dGxpbmUgPSB0cnVlOworCXNoYXBlLmFwcGx5KHRoaXMuc3RhdGUpOworCQorCXNoYXBlLmlzRGFzaGVkID0gdGhpcy5pc1NlbGVjdGlvbkRhc2hlZCgpOworCXNoYXBlLnN0cm9rZSA9IHRoaXMuZ2V0U2VsZWN0aW9uQ29sb3IoKTsKKwlzaGFwZS5pc1NoYWRvdyA9IGZhbHNlOworCQorCXJldHVybiBzaGFwZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFNlbGVjdGlvbkNvbG9yCisgKiAKKyAqIFJldHVybnMgPG14Q29uc3RhbnRzLkVER0VfU0VMRUNUSU9OX0NPTE9SPi4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uQ29sb3IgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIG14Q29uc3RhbnRzLkVER0VfU0VMRUNUSU9OX0NPTE9SOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0U2VsZWN0aW9uU3Ryb2tlV2lkdGgKKyAqIAorICogUmV0dXJucyA8bXhDb25zdGFudHMuRURHRV9TRUxFQ1RJT05fU1RST0tFV0lEVEg+LgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5nZXRTZWxlY3Rpb25TdHJva2VXaWR0aCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gbXhDb25zdGFudHMuRURHRV9TRUxFQ1RJT05fU1RST0tFV0lEVEg7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1NlbGVjdGlvbkRhc2hlZAorICogCisgKiBSZXR1cm5zIDxteENvbnN0YW50cy5FREdFX1NFTEVDVElPTl9EQVNIRUQ+LgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5pc1NlbGVjdGlvbkRhc2hlZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gbXhDb25zdGFudHMuRURHRV9TRUxFQ1RJT05fREFTSEVEOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDb25uZWN0YWJsZUNlbGwKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjZWxsIGlzIGNvbm5lY3RhYmxlLiBUaGlzIGlzIGEgaG9vayB0bworICogZGlzYWJsZSBmbG9hdGluZyBjb25uZWN0aW9ucy4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmlzQ29ubmVjdGFibGVDZWxsID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldENlbGxBdAorICogCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSA8bXhDZWxsTWFya2VyPiB1c2VkIGluIDxtYXJrZXI+LgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5nZXRDZWxsQXQgPSBmdW5jdGlvbih4LCB5KQoreworCXJldHVybiAoIXRoaXMub3V0bGluZUNvbm5lY3QpID8gdGhpcy5ncmFwaC5nZXRDZWxsQXQoeCwgeSkgOiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlTWFya2VyCisgKiAKKyAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIDxteENlbGxNYXJrZXI+IHVzZWQgaW4gPG1hcmtlcj4uCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmNyZWF0ZU1hcmtlciA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgbWFya2VyID0gbmV3IG14Q2VsbE1hcmtlcih0aGlzLmdyYXBoKTsKKwl2YXIgc2VsZiA9IHRoaXM7IC8vIGNsb3N1cmUKKworCS8vIE9ubHkgcmV0dXJucyBlZGdlcyBpZiB0aGV5IGFyZSBjb25uZWN0YWJsZSBhbmQgbmV2ZXIgcmV0dXJucworCS8vIHRoZSBlZGdlIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIG1vZGlmaWVkCisJbWFya2VyLmdldENlbGwgPSBmdW5jdGlvbihtZSkKKwl7CisJCXZhciBjZWxsID0gbXhDZWxsTWFya2VyLnByb3RvdHlwZS5nZXRDZWxsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKwkJLy8gQ2hlY2tzIGZvciBjZWxsIGF0IHByZXZpZXcgcG9pbnQgKHdpdGggZ3JpZCkKKwkJaWYgKChjZWxsID09IHNlbGYuc3RhdGUuY2VsbCB8fCBjZWxsID09IG51bGwpICYmIHNlbGYuY3VycmVudFBvaW50ICE9IG51bGwpCisJCXsKKwkJCWNlbGwgPSBzZWxmLmdyYXBoLmdldENlbGxBdChzZWxmLmN1cnJlbnRQb2ludC54LCBzZWxmLmN1cnJlbnRQb2ludC55KTsKKwkJfQorCQkKKwkJLy8gVXNlcyBjb25uZWN0YWJsZSBwYXJlbnQgdmVydGV4IGlmIG9uZSBleGlzdHMKKwkJaWYgKGNlbGwgIT0gbnVsbCAmJiAhdGhpcy5ncmFwaC5pc0NlbGxDb25uZWN0YWJsZShjZWxsKSkKKwkJeworCQkJdmFyIHBhcmVudCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5nZXRQYXJlbnQoY2VsbCk7CisJCQkKKwkJCWlmICh0aGlzLmdyYXBoLmdldE1vZGVsKCkuaXNWZXJ0ZXgocGFyZW50KSAmJiB0aGlzLmdyYXBoLmlzQ2VsbENvbm5lY3RhYmxlKHBhcmVudCkpCisJCQl7CisJCQkJY2VsbCA9IHBhcmVudDsKKwkJCX0KKwkJfQorCQkKKwkJdmFyIG1vZGVsID0gc2VsZi5ncmFwaC5nZXRNb2RlbCgpOworCQkKKwkJaWYgKCh0aGlzLmdyYXBoLmlzU3dpbWxhbmUoY2VsbCkgJiYgc2VsZi5jdXJyZW50UG9pbnQgIT0gbnVsbCAmJgorCQkJdGhpcy5ncmFwaC5oaXRzU3dpbWxhbmVDb250ZW50KGNlbGwsIHNlbGYuY3VycmVudFBvaW50LngsIHNlbGYuY3VycmVudFBvaW50LnkpKSB8fAorCQkJKCFzZWxmLmlzQ29ubmVjdGFibGVDZWxsKGNlbGwpKSB8fCAoY2VsbCA9PSBzZWxmLnN0YXRlLmNlbGwgfHwKKwkJCShjZWxsICE9IG51bGwgJiYgIXNlbGYuZ3JhcGguY29ubmVjdGFibGVFZGdlcyAmJiBtb2RlbC5pc0VkZ2UoY2VsbCkpKSB8fAorCQkJbW9kZWwuaXNBbmNlc3RvcihzZWxmLnN0YXRlLmNlbGwsIGNlbGwpKQorCQl7CisJCQljZWxsID0gbnVsbDsKKwkJfQorCQkKKwkJaWYgKCF0aGlzLmdyYXBoLmlzQ2VsbENvbm5lY3RhYmxlKGNlbGwpKQorCQl7CisJCQljZWxsID0gbnVsbDsKKwkJfQorCQkKKwkJcmV0dXJuIGNlbGw7CisJfTsKKworCS8vIFNldHMgdGhlIGhpZ2hsaWdodCBjb2xvciBhY2NvcmRpbmcgdG8gdmFsaWRhdGVDb25uZWN0aW9uCisJbWFya2VyLmlzVmFsaWRTdGF0ZSA9IGZ1bmN0aW9uKHN0YXRlKQorCXsKKwkJdmFyIG1vZGVsID0gc2VsZi5ncmFwaC5nZXRNb2RlbCgpOworCQl2YXIgb3RoZXIgPSBzZWxmLmdyYXBoLnZpZXcuZ2V0VGVybWluYWxQb3J0KHN0YXRlLAorCQkJc2VsZi5ncmFwaC52aWV3LmdldFN0YXRlKG1vZGVsLmdldFRlcm1pbmFsKHNlbGYuc3RhdGUuY2VsbCwKKwkJCSFzZWxmLmlzU291cmNlKSksICFzZWxmLmlzU291cmNlKTsKKwkJdmFyIG90aGVyQ2VsbCA9IChvdGhlciAhPSBudWxsKSA/IG90aGVyLmNlbGwgOiBudWxsOworCQl2YXIgc291cmNlID0gKHNlbGYuaXNTb3VyY2UpID8gc3RhdGUuY2VsbCA6IG90aGVyQ2VsbDsKKwkJdmFyIHRhcmdldCA9IChzZWxmLmlzU291cmNlKSA/IG90aGVyQ2VsbCA6IHN0YXRlLmNlbGw7CisJCQorCQkvLyBVcGRhdGVzIHRoZSBlcnJvciBtZXNzYWdlIG9mIHRoZSBoYW5kbGVyCisJCXNlbGYuZXJyb3IgPSBzZWxmLnZhbGlkYXRlQ29ubmVjdGlvbihzb3VyY2UsIHRhcmdldCk7CisKKwkJcmV0dXJuIHNlbGYuZXJyb3IgPT0gbnVsbDsKKwl9OworCQorCXJldHVybiBtYXJrZXI7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB2YWxpZGF0ZUNvbm5lY3Rpb24KKyAqIAorICogUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGNvbm5lY3Rpb24gZm9yIHRoZQorICogZ2l2ZW4gc291cmNlLCB0YXJnZXQgcGFpciBpcyBub3QgdmFsaWQuIE90aGVyd2lzZSBpdCByZXR1cm5zIG51bGwuIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIHVzZXMgPG14R3JhcGguZ2V0RWRnZVZhbGlkYXRpb25FcnJvcj4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHNvdXJjZSAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgc291cmNlIHRlcm1pbmFsLgorICogdGFyZ2V0IC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSB0YXJnZXQgdGVybWluYWwuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLnZhbGlkYXRlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQoreworCXJldHVybiB0aGlzLmdyYXBoLmdldEVkZ2VWYWxpZGF0aW9uRXJyb3IodGhpcy5zdGF0ZS5jZWxsLCBzb3VyY2UsIHRhcmdldCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVCZW5kcworICogCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBiZW5kcyB1c2VkIGZvciBtb2RpZnlpbmcgdGhlIGVkZ2UuIFRoaXMgaXMKKyAqIHR5cGljYWxseSBhbiBhcnJheSBvZiA8bXhSZWN0YW5nbGVTaGFwZXM+LgorICovCisgbXhFZGdlSGFuZGxlci5wcm90b3R5cGUuY3JlYXRlQmVuZHMgPSBmdW5jdGlvbigpCisgeworCXZhciBjZWxsID0gdGhpcy5zdGF0ZS5jZWxsOworCXZhciBiZW5kcyA9IFtdOworCisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFic3BvaW50cy5sZW5ndGg7IGkrKykKKwl7CisJCWlmICh0aGlzLmlzSGFuZGxlVmlzaWJsZShpKSkKKwkJeworCQkJdmFyIHNvdXJjZSA9IGkgPT0gMDsKKwkJCXZhciB0YXJnZXQgPSBpID09IHRoaXMuYWJzcG9pbnRzLmxlbmd0aCAtIDE7CisJCQl2YXIgdGVybWluYWwgPSBzb3VyY2UgfHwgdGFyZ2V0OworCisJCQlpZiAodGVybWluYWwgfHwgdGhpcy5ncmFwaC5pc0NlbGxCZW5kYWJsZShjZWxsKSkKKwkJCXsKKwkJCQkobXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGluZGV4KQorCQkJCXsKKwkJCQkJdmFyIGJlbmQgPSB0aGlzLmNyZWF0ZUhhbmRsZVNoYXBlKGluZGV4KTsKKwkJCQkJdGhpcy5pbml0QmVuZChiZW5kLCBteFV0aWxzLmJpbmQodGhpcywgbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKCkKKwkJCQkJeworCQkJCQkJaWYgKHRoaXMuZGJsQ2xpY2tSZW1vdmVFbmFibGVkKQorCQkJCQkJeworCQkJCQkJCXRoaXMucmVtb3ZlUG9pbnQodGhpcy5zdGF0ZSwgaW5kZXgpOworCQkJCQkJfQorCQkJCQl9KSkpOworCQorCQkJCQlpZiAodGhpcy5pc0hhbmRsZUVuYWJsZWQoaSkpCisJCQkJCXsKKwkJCQkJCWJlbmQuc2V0Q3Vyc29yKCh0ZXJtaW5hbCkgPyBteENvbnN0YW50cy5DVVJTT1JfVEVSTUlOQUxfSEFORExFIDogbXhDb25zdGFudHMuQ1VSU09SX0JFTkRfSEFORExFKTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJYmVuZHMucHVzaChiZW5kKTsKKwkJCQkKKwkJCQkJaWYgKCF0ZXJtaW5hbCkKKwkJCQkJeworCQkJCQkJdGhpcy5wb2ludHMucHVzaChuZXcgbXhQb2ludCgwLDApKTsKKwkJCQkJCWJlbmQubm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CisJCQkJCX0KKwkJCQl9KSkoaSk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gYmVuZHM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVWaXJ0dWFsQmVuZHMKKyAqIAorICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgYmVuZHMgdXNlZCBmb3IgbW9kaWZ5aW5nIHRoZSBlZGdlLiBUaGlzIGlzCisgKiB0eXBpY2FsbHkgYW4gYXJyYXkgb2YgPG14UmVjdGFuZ2xlU2hhcGVzPi4KKyAqLworIG14RWRnZUhhbmRsZXIucHJvdG90eXBlLmNyZWF0ZVZpcnR1YWxCZW5kcyA9IGZ1bmN0aW9uKCkKKyB7CisJdmFyIGNlbGwgPSB0aGlzLnN0YXRlLmNlbGw7CisJdmFyIGxhc3QgPSB0aGlzLmFic3BvaW50c1swXTsKKwl2YXIgYmVuZHMgPSBbXTsKKworCWlmICh0aGlzLmdyYXBoLmlzQ2VsbEJlbmRhYmxlKGNlbGwpKQorCXsKKwkJZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLmFic3BvaW50cy5sZW5ndGg7IGkrKykKKwkJeworCQkJKG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihiZW5kKQorCQkJeworCQkJCXRoaXMuaW5pdEJlbmQoYmVuZCk7CisJCQkJYmVuZC5zZXRDdXJzb3IobXhDb25zdGFudHMuQ1VSU09SX1ZJUlRVQUxfQkVORF9IQU5ETEUpOworCQkJCWJlbmRzLnB1c2goYmVuZCk7CisJCQl9KSkodGhpcy5jcmVhdGVIYW5kbGVTaGFwZSgpKTsKKwkJfQorCX0KKworCXJldHVybiBiZW5kczsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzSGFuZGxlRW5hYmxlZAorICogCisgKiBDcmVhdGVzIHRoZSBzaGFwZSB1c2VkIHRvIGRpc3BsYXkgdGhlIGdpdmVuIGJlbmQuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmlzSGFuZGxlRW5hYmxlZCA9IGZ1bmN0aW9uKGluZGV4KQoreworCXJldHVybiB0cnVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNIYW5kbGVWaXNpYmxlCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaGFuZGxlIGF0IHRoZSBnaXZlbiBpbmRleCBpcyB2aXNpYmxlLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5pc0hhbmRsZVZpc2libGUgPSBmdW5jdGlvbihpbmRleCkKK3sKKwl2YXIgc291cmNlID0gdGhpcy5zdGF0ZS5nZXRWaXNpYmxlVGVybWluYWxTdGF0ZSh0cnVlKTsKKwl2YXIgdGFyZ2V0ID0gdGhpcy5zdGF0ZS5nZXRWaXNpYmxlVGVybWluYWxTdGF0ZShmYWxzZSk7CisJdmFyIGdlbyA9IHRoaXMuZ3JhcGguZ2V0Q2VsbEdlb21ldHJ5KHRoaXMuc3RhdGUuY2VsbCk7CisJdmFyIGVkZ2VTdHlsZSA9IChnZW8gIT0gbnVsbCkgPyB0aGlzLmdyYXBoLnZpZXcuZ2V0RWRnZVN0eWxlKHRoaXMuc3RhdGUsIGdlby5wb2ludHMsIHNvdXJjZSwgdGFyZ2V0KSA6IG51bGw7CisKKwlyZXR1cm4gZWRnZVN0eWxlICE9IG14RWRnZVN0eWxlLkVudGl0eVJlbGF0aW9uIHx8IGluZGV4ID09IDAgfHwgaW5kZXggPT0gdGhpcy5hYnNwb2ludHMubGVuZ3RoIC0gMTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUhhbmRsZVNoYXBlCisgKiAKKyAqIENyZWF0ZXMgdGhlIHNoYXBlIHVzZWQgdG8gZGlzcGxheSB0aGUgZ2l2ZW4gYmVuZC4gTm90ZSB0aGF0IHRoZSBpbmRleCBtYXkgYmUKKyAqIG51bGwgZm9yIHNwZWNpYWwgY2FzZXMsIHN1Y2ggYXMgd2hlbiBjYWxsZWQgZnJvbQorICogPG14RWxib3dFZGdlSGFuZGxlci5jcmVhdGVWaXJ0dWFsQmVuZD4uIE9ubHkgaW1hZ2VzIGFuZCByZWN0YW5nbGVzIHNob3VsZCBiZQorICogcmV0dXJuZWQgaWYgc3VwcG9ydCBmb3IgSFRNTCBsYWJlbHMgd2l0aCBub3QgZm9yZWlnbiBvYmplY3RzIGlzIHJlcXVpcmVkLgorICogSW5kZXggaWYgbnVsbCBmb3IgdmlydHVhbCBoYW5kbGVzLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5jcmVhdGVIYW5kbGVTaGFwZSA9IGZ1bmN0aW9uKGluZGV4KQoreworCWlmICh0aGlzLmhhbmRsZUltYWdlICE9IG51bGwpCisJeworCQl2YXIgc2hhcGUgPSBuZXcgbXhJbWFnZVNoYXBlKG5ldyBteFJlY3RhbmdsZSgwLCAwLCB0aGlzLmhhbmRsZUltYWdlLndpZHRoLCB0aGlzLmhhbmRsZUltYWdlLmhlaWdodCksIHRoaXMuaGFuZGxlSW1hZ2Uuc3JjKTsKKwkJCisJCS8vIEFsbG93cyBIVE1MIHJlbmRlcmluZyBvZiB0aGUgaW1hZ2VzCisJCXNoYXBlLnByZXNlcnZlSW1hZ2VBc3BlY3QgPSBmYWxzZTsKKworCQlyZXR1cm4gc2hhcGU7CisJfQorCWVsc2UKKwl7CisJCXZhciBzID0gbXhDb25zdGFudHMuSEFORExFX1NJWkU7CisJCQorCQlpZiAodGhpcy5wcmVmZXJIdG1sKQorCQl7CisJCQlzIC09IDE7CisJCX0KKwkJCisJCXJldHVybiBuZXcgbXhSZWN0YW5nbGVTaGFwZShuZXcgbXhSZWN0YW5nbGUoMCwgMCwgcywgcyksIG14Q29uc3RhbnRzLkhBTkRMRV9GSUxMQ09MT1IsIG14Q29uc3RhbnRzLkhBTkRMRV9TVFJPS0VDT0xPUik7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlTGFiZWxIYW5kbGVTaGFwZQorICogCisgKiBDcmVhdGVzIHRoZSBzaGFwZSB1c2VkIHRvIGRpc3BsYXkgdGhlIHRoZSBsYWJlbCBoYW5kbGUuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmNyZWF0ZUxhYmVsSGFuZGxlU2hhcGUgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMubGFiZWxIYW5kbGVJbWFnZSAhPSBudWxsKQorCXsKKwkJdmFyIHNoYXBlID0gbmV3IG14SW1hZ2VTaGFwZShuZXcgbXhSZWN0YW5nbGUoMCwgMCwgdGhpcy5sYWJlbEhhbmRsZUltYWdlLndpZHRoLCB0aGlzLmxhYmVsSGFuZGxlSW1hZ2UuaGVpZ2h0KSwgdGhpcy5sYWJlbEhhbmRsZUltYWdlLnNyYyk7CisJCQorCQkvLyBBbGxvd3MgSFRNTCByZW5kZXJpbmcgb2YgdGhlIGltYWdlcworCQlzaGFwZS5wcmVzZXJ2ZUltYWdlQXNwZWN0ID0gZmFsc2U7CisKKwkJcmV0dXJuIHNoYXBlOworCX0KKwllbHNlCisJeworCQl2YXIgcyA9IG14Q29uc3RhbnRzLkxBQkVMX0hBTkRMRV9TSVpFOworCQlyZXR1cm4gbmV3IG14UmVjdGFuZ2xlU2hhcGUobmV3IG14UmVjdGFuZ2xlKDAsIDAsIHMsIHMpLCBteENvbnN0YW50cy5MQUJFTF9IQU5ETEVfRklMTENPTE9SLCBteENvbnN0YW50cy5IQU5ETEVfU1RST0tFQ09MT1IpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGluaXRCZW5kCisgKiAKKyAqIEhlbHBlciBtZXRob2QgdG8gaW5pdGlhbGl6ZSB0aGUgZ2l2ZW4gYmVuZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogYmVuZCAtIDxteFNoYXBlPiB0aGF0IHJlcHJlc2VudHMgdGhlIGJlbmQgdG8gYmUgaW5pdGlhbGl6ZWQuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmluaXRCZW5kID0gZnVuY3Rpb24oYmVuZCwgZGJsQ2xpY2spCit7CisJaWYgKHRoaXMucHJlZmVySHRtbCkKKwl7CisJCWJlbmQuZGlhbGVjdCA9IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1RSSUNUSFRNTDsKKwkJYmVuZC5pbml0KHRoaXMuZ3JhcGguY29udGFpbmVyKTsKKwl9CisJZWxzZQorCXsKKwkJYmVuZC5kaWFsZWN0ID0gKHRoaXMuZ3JhcGguZGlhbGVjdCAhPSBteENvbnN0YW50cy5ESUFMRUNUX1NWRykgPworCQkJbXhDb25zdGFudHMuRElBTEVDVF9NSVhFREhUTUwgOiBteENvbnN0YW50cy5ESUFMRUNUX1NWRzsKKwkJYmVuZC5pbml0KHRoaXMuZ3JhcGguZ2V0VmlldygpLmdldE92ZXJsYXlQYW5lKCkpOworCX0KKworCW14RXZlbnQucmVkaXJlY3RNb3VzZUV2ZW50cyhiZW5kLm5vZGUsIHRoaXMuZ3JhcGgsIHRoaXMuc3RhdGUsCisJCQludWxsLCBudWxsLCBudWxsLCBkYmxDbGljayk7CisJCisJLy8gRml4ZXMgbG9zdCBldmVudCB0cmFja2luZyBmb3IgaW1hZ2VzIGluIHF1aXJrcyAvIElFOCBzdGFuZGFyZHMKKwlpZiAobXhDbGllbnQuSVNfUVVJUktTIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSA4KQorCXsKKwkJbXhFdmVudC5hZGRMaXN0ZW5lcihiZW5kLm5vZGUsICdkcmFnc3RhcnQnLCBmdW5jdGlvbihldnQpCisJCXsKKwkJCW14RXZlbnQuY29uc3VtZShldnQpOworCQkJCisJCQlyZXR1cm4gZmFsc2U7CisJCX0pOworCX0KKwkKKwlpZiAobXhDbGllbnQuSVNfVE9VQ0gpCisJeworCQliZW5kLm5vZGUuc2V0QXR0cmlidXRlKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0SGFuZGxlRm9yRXZlbnQKKyAqIAorICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGhhbmRsZSBmb3IgdGhlIGdpdmVuIGV2ZW50LgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5nZXRIYW5kbGVGb3JFdmVudCA9IGZ1bmN0aW9uKG1lKQoreworCS8vIENvbm5lY3Rpb24gaGlnaGxpZ2h0IG1heSBjb25zdW1lIGV2ZW50cyBiZWZvcmUgdGhleSByZWFjaCBzaXplciBoYW5kbGUKKwl2YXIgdG9sID0gKCFteEV2ZW50LmlzTW91c2VFdmVudChtZS5nZXRFdmVudCgpKSkgPyB0aGlzLnRvbGVyYW5jZSA6IDE7CisJdmFyIGhpdCA9ICh0aGlzLmFsbG93SGFuZGxlQm91bmRzQ2hlY2sgJiYgKG14Q2xpZW50LklTX0lFIHx8IHRvbCA+IDApKSA/CisJCW5ldyBteFJlY3RhbmdsZShtZS5nZXRHcmFwaFgoKSAtIHRvbCwgbWUuZ2V0R3JhcGhZKCkgLSB0b2wsIDIgKiB0b2wsIDIgKiB0b2wpIDogbnVsbDsKKwl2YXIgbWluRGlzdFNxID0gbnVsbDsKKwl2YXIgcmVzdWx0ID0gbnVsbDsKKworCWZ1bmN0aW9uIGNoZWNrU2hhcGUoc2hhcGUpCisJeworCQlpZiAoc2hhcGUgIT0gbnVsbCAmJiBzaGFwZS5ub2RlLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnICYmIHNoYXBlLm5vZGUuc3R5bGUudmlzaWJpbGl0eSAhPSAnaGlkZGVuJyAmJgorCQkJKG1lLmlzU291cmNlKHNoYXBlKSB8fCAoaGl0ICE9IG51bGwgJiYgbXhVdGlscy5pbnRlcnNlY3RzKHNoYXBlLmJvdW5kcywgaGl0KSkpKQorCQl7CisJCQl2YXIgZHggPSBtZS5nZXRHcmFwaFgoKSAtIHNoYXBlLmJvdW5kcy5nZXRDZW50ZXJYKCk7CisJCQl2YXIgZHkgPSBtZS5nZXRHcmFwaFkoKSAtIHNoYXBlLmJvdW5kcy5nZXRDZW50ZXJZKCk7CisJCQl2YXIgdG1wID0gZHggKiBkeCArIGR5ICogZHk7CisJCQkKKwkJCWlmIChtaW5EaXN0U3EgPT0gbnVsbCB8fCB0bXAgPD0gbWluRGlzdFNxKQorCQkJeworCQkJCW1pbkRpc3RTcSA9IHRtcDsKKwkJCQorCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCWlmICh0aGlzLmN1c3RvbUhhbmRsZXMgIT0gbnVsbCAmJiB0aGlzLmlzQ3VzdG9tSGFuZGxlRXZlbnQobWUpKQorCXsKKwkJLy8gSW52ZXJzZSBsb29wIG9yZGVyIHRvIG1hdGNoIGRpc3BsYXkgb3JkZXIKKwkJZm9yICh2YXIgaSA9IHRoaXMuY3VzdG9tSGFuZGxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKKwkJeworCQkJaWYgKGNoZWNrU2hhcGUodGhpcy5jdXN0b21IYW5kbGVzW2ldLnNoYXBlKSkKKwkJCXsKKwkJCQkvLyBMQVRFUjogUmV0dXJuIHJlZmVyZW5jZSB0byBhY3RpdmUgc2hhcGUKKwkJCQlyZXR1cm4gbXhFdmVudC5DVVNUT01fSEFORExFIC0gaTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChtZS5pc1NvdXJjZSh0aGlzLnN0YXRlLnRleHQpIHx8IGNoZWNrU2hhcGUodGhpcy5sYWJlbFNoYXBlKSkKKwl7CisJCXJlc3VsdCA9IG14RXZlbnQuTEFCRUxfSEFORExFOworCX0KKwkKKwlpZiAodGhpcy5iZW5kcyAhPSBudWxsKQorCXsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmJlbmRzLmxlbmd0aDsgaSsrKQorCQl7CisJCQlpZiAoY2hlY2tTaGFwZSh0aGlzLmJlbmRzW2ldKSkKKwkJCXsKKwkJCQlyZXN1bHQgPSBpOworCQkJfQorCQl9CisJfQorCQorCWlmICh0aGlzLnZpcnR1YWxCZW5kcyAhPSBudWxsICYmIHRoaXMuaXNBZGRWaXJ0dWFsQmVuZEV2ZW50KG1lKSkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy52aXJ0dWFsQmVuZHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCWlmIChjaGVja1NoYXBlKHRoaXMudmlydHVhbEJlbmRzW2ldKSkKKwkJCXsKKwkJCQlyZXN1bHQgPSBteEV2ZW50LlZJUlRVQUxfSEFORExFIC0gaTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXN1bHQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0FkZFZpcnR1YWxCZW5kRXZlbnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBldmVudCBhbGxvd3MgdmlydHVhbCBiZW5kcyB0byBiZSBhZGRlZC4gVGhpcworICogaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5pc0FkZFZpcnR1YWxCZW5kRXZlbnQgPSBmdW5jdGlvbihtZSkKK3sKKwlyZXR1cm4gdHJ1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQ3VzdG9tSGFuZGxlRXZlbnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBldmVudCBhbGxvd3MgY3VzdG9tIGhhbmRsZXMgdG8gYmUgY2hhbmdlZC4gVGhpcworICogaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5pc0N1c3RvbUhhbmRsZUV2ZW50ID0gZnVuY3Rpb24obWUpCit7CisJcmV0dXJuIHRydWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3VzZURvd24KKyAqIAorICogSGFuZGxlcyB0aGUgZXZlbnQgYnkgY2hlY2tpbmcgaWYgYSBzcGVjaWFsIGVsZW1lbnQgb2YgdGhlIGhhbmRsZXIKKyAqIHdhcyBjbGlja2VkLCBpbiB3aGljaCBjYXNlIHRoZSBpbmRleCBwYXJhbWV0ZXIgaXMgbm9uLW51bGwuIFRoZQorICogaW5kaWNlcyBtYXkgYmUgb25lIG9mIDxMQUJFTF9IQU5ETEU+IG9yIHRoZSBudW1iZXIgb2YgdGhlIHJlc3BlY3RpdmUKKyAqIGNvbnRyb2wgcG9pbnQuIFRoZSBzb3VyY2UgYW5kIHRhcmdldCBwb2ludHMgYXJlIHVzZWQgZm9yIHJlY29ubmVjdGluZworICogdGhlIGVkZ2UuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLm1vdXNlRG93biA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJdmFyIGhhbmRsZSA9IHRoaXMuZ2V0SGFuZGxlRm9yRXZlbnQobWUpOworCQorCWlmICh0aGlzLmJlbmRzICE9IG51bGwgJiYgdGhpcy5iZW5kc1toYW5kbGVdICE9IG51bGwpCisJeworCQl2YXIgYiA9IHRoaXMuYmVuZHNbaGFuZGxlXS5ib3VuZHM7CisJCXRoaXMuc25hcFBvaW50ID0gbmV3IG14UG9pbnQoYi5nZXRDZW50ZXJYKCksIGIuZ2V0Q2VudGVyWSgpKTsKKwl9CisJCisJaWYgKHRoaXMuYWRkRW5hYmxlZCAmJiBoYW5kbGUgPT0gbnVsbCAmJiB0aGlzLmlzQWRkUG9pbnRFdmVudChtZS5nZXRFdmVudCgpKSkKKwl7CisJCXRoaXMuYWRkUG9pbnQodGhpcy5zdGF0ZSwgbWUuZ2V0RXZlbnQoKSk7CisJCW1lLmNvbnN1bWUoKTsKKwl9CisJZWxzZSBpZiAoaGFuZGxlICE9IG51bGwgJiYgIW1lLmlzQ29uc3VtZWQoKSAmJiB0aGlzLmdyYXBoLmlzRW5hYmxlZCgpKQorCXsKKwkJaWYgKHRoaXMucmVtb3ZlRW5hYmxlZCAmJiB0aGlzLmlzUmVtb3ZlUG9pbnRFdmVudChtZS5nZXRFdmVudCgpKSkKKwkJeworCQkJdGhpcy5yZW1vdmVQb2ludCh0aGlzLnN0YXRlLCBoYW5kbGUpOworCQl9CisJCWVsc2UgaWYgKGhhbmRsZSAhPSBteEV2ZW50LkxBQkVMX0hBTkRMRSB8fCB0aGlzLmdyYXBoLmlzTGFiZWxNb3ZhYmxlKG1lLmdldENlbGwoKSkpCisJCXsKKwkJCWlmIChoYW5kbGUgPD0gbXhFdmVudC5WSVJUVUFMX0hBTkRMRSkKKwkJCXsKKwkJCQlteFV0aWxzLnNldE9wYWNpdHkodGhpcy52aXJ0dWFsQmVuZHNbbXhFdmVudC5WSVJUVUFMX0hBTkRMRSAtIGhhbmRsZV0ubm9kZSwgMTAwKTsKKwkJCX0KKwkJCQorCQkJdGhpcy5zdGFydChtZS5nZXRYKCksIG1lLmdldFkoKSwgaGFuZGxlKTsKKwkJfQorCQkKKwkJbWUuY29uc3VtZSgpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHN0YXJ0CisgKiAKKyAqIFN0YXJ0cyB0aGUgaGFuZGxpbmcgb2YgdGhlIG1vdXNlIGdlc3R1cmUuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24oeCwgeSwgaW5kZXgpCit7CisJdGhpcy5zdGFydFggPSB4OworCXRoaXMuc3RhcnRZID0geTsKKworCXRoaXMuaXNTb3VyY2UgPSAodGhpcy5iZW5kcyA9PSBudWxsKSA/IGZhbHNlIDogaW5kZXggPT0gMDsKKwl0aGlzLmlzVGFyZ2V0ID0gKHRoaXMuYmVuZHMgPT0gbnVsbCkgPyBmYWxzZSA6IGluZGV4ID09IHRoaXMuYmVuZHMubGVuZ3RoIC0gMTsKKwl0aGlzLmlzTGFiZWwgPSBpbmRleCA9PSBteEV2ZW50LkxBQkVMX0hBTkRMRTsKKworCWlmICh0aGlzLmlzU291cmNlIHx8IHRoaXMuaXNUYXJnZXQpCisJeworCQl2YXIgY2VsbCA9IHRoaXMuc3RhdGUuY2VsbDsKKwkJdmFyIHRlcm1pbmFsID0gdGhpcy5ncmFwaC5tb2RlbC5nZXRUZXJtaW5hbChjZWxsLCB0aGlzLmlzU291cmNlKTsKKworCQlpZiAoKHRlcm1pbmFsID09IG51bGwgJiYgdGhpcy5ncmFwaC5pc1Rlcm1pbmFsUG9pbnRNb3ZhYmxlKGNlbGwsIHRoaXMuaXNTb3VyY2UpKSB8fAorCQkJKHRlcm1pbmFsICE9IG51bGwgJiYgdGhpcy5ncmFwaC5pc0NlbGxEaXNjb25uZWN0YWJsZShjZWxsLCB0ZXJtaW5hbCwgdGhpcy5pc1NvdXJjZSkpKQorCQl7CisJCQl0aGlzLmluZGV4ID0gaW5kZXg7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJdGhpcy5pbmRleCA9IGluZGV4OworCX0KKwkKKwkvLyBIaWRlcyBvdGhlciBjdXN0b20gaGFuZGxlcworCWlmICh0aGlzLmluZGV4IDw9IG14RXZlbnQuQ1VTVE9NX0hBTkRMRSAmJiB0aGlzLmluZGV4ID4gbXhFdmVudC5WSVJUVUFMX0hBTkRMRSkKKwl7CisJCWlmICh0aGlzLmN1c3RvbUhhbmRsZXMgIT0gbnVsbCkKKwkJeworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmN1c3RvbUhhbmRsZXMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJaWYgKGkgIT0gbXhFdmVudC5DVVNUT01fSEFORExFIC0gdGhpcy5pbmRleCkKKwkJCQl7CisJCQkJCXRoaXMuY3VzdG9tSGFuZGxlc1tpXS5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjbG9uZVByZXZpZXdTdGF0ZQorICogCisgKiBSZXR1cm5zIGEgY2xvbmUgb2YgdGhlIGN1cnJlbnQgcHJldmlldyBzdGF0ZSBmb3IgdGhlIGdpdmVuIHBvaW50IGFuZCB0ZXJtaW5hbC4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUuY2xvbmVQcmV2aWV3U3RhdGUgPSBmdW5jdGlvbihwb2ludCwgdGVybWluYWwpCit7CisJcmV0dXJuIHRoaXMuc3RhdGUuY2xvbmUoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFNuYXBUb1Rlcm1pbmFsVG9sZXJhbmNlCisgKiAKKyAqIFJldHVybnMgdGhlIHRvbGVyYW5jZSBmb3IgdGhlIGd1aWRlcy4gRGVmYXVsdCB2YWx1ZSBpcworICogZ3JpZFNpemUgKiBzY2FsZSAvIDIuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmdldFNuYXBUb1Rlcm1pbmFsVG9sZXJhbmNlID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmdyYXBoLmdyaWRTaXplICogdGhpcy5ncmFwaC52aWV3LnNjYWxlIC8gMjsKK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZUhpbnQKKyAqIAorICogSG9vayBmb3Igc3ViY2xhc3NlcnMgZG8gc2hvdyBkZXRhaWxzIHdoaWxlIHRoZSBoYW5kbGVyIGlzIGFjdGl2ZS4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUudXBkYXRlSGludCA9IGZ1bmN0aW9uKG1lLCBwb2ludCkgeyB9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZW1vdmVIaW50CisgKiAKKyAqIEhvb2tzIGZvciBzdWJjbGFzc2VycyB0byBoaWRlIGRldGFpbHMgd2hlbiB0aGUgaGFuZGxlciBnZXRzIGluYWN0aXZlLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5yZW1vdmVIaW50ID0gZnVuY3Rpb24oKSB7IH07CisKKy8qKgorICogRnVuY3Rpb246IHJvdW5kTGVuZ3RoCisgKiAKKyAqIEhvb2sgZm9yIHJvdW5kaW5nIHRoZSB1bnNjYWxlZCB3aWR0aCBvciBoZWlnaHQuIFRoaXMgdXNlcyBNYXRoLnJvdW5kLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5yb3VuZExlbmd0aCA9IGZ1bmN0aW9uKGxlbmd0aCkKK3sKKwlyZXR1cm4gTWF0aC5yb3VuZChsZW5ndGgpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNTbmFwVG9UZXJtaW5hbHNFdmVudAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgPHNuYXBUb1Rlcm1pbmFscz4gaXMgdHJ1ZSBhbmQgaWYgYWx0IGlzIG5vdCBwcmVzc2VkLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5pc1NuYXBUb1Rlcm1pbmFsc0V2ZW50ID0gZnVuY3Rpb24obWUpCit7CisJcmV0dXJuIHRoaXMuc25hcFRvVGVybWluYWxzICYmICFteEV2ZW50LmlzQWx0RG93bihtZS5nZXRFdmVudCgpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFBvaW50Rm9yRXZlbnQKKyAqIAorICogUmV0dXJucyB0aGUgcG9pbnQgZm9yIHRoZSBnaXZlbiBldmVudC4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUuZ2V0UG9pbnRGb3JFdmVudCA9IGZ1bmN0aW9uKG1lKQoreworCXZhciB2aWV3ID0gdGhpcy5ncmFwaC5nZXRWaWV3KCk7CisJdmFyIHNjYWxlID0gdmlldy5zY2FsZTsKKwl2YXIgcG9pbnQgPSBuZXcgbXhQb2ludCh0aGlzLnJvdW5kTGVuZ3RoKG1lLmdldEdyYXBoWCgpIC8gc2NhbGUpICogc2NhbGUsCisJCXRoaXMucm91bmRMZW5ndGgobWUuZ2V0R3JhcGhZKCkgLyBzY2FsZSkgKiBzY2FsZSk7CisJCisJdmFyIHR0ID0gdGhpcy5nZXRTbmFwVG9UZXJtaW5hbFRvbGVyYW5jZSgpOworCXZhciBvdmVycmlkZVggPSBmYWxzZTsKKwl2YXIgb3ZlcnJpZGVZID0gZmFsc2U7CQkKKwkKKwlpZiAodHQgPiAwICYmIHRoaXMuaXNTbmFwVG9UZXJtaW5hbHNFdmVudChtZSkpCisJeworCQlmdW5jdGlvbiBzbmFwVG9Qb2ludChwdCkKKwkJeworCQkJaWYgKHB0ICE9IG51bGwpCisJCQl7CisJCQkJdmFyIHggPSBwdC54OworCisJCQkJaWYgKE1hdGguYWJzKHBvaW50LnggLSB4KSA8IHR0KQorCQkJCXsKKwkJCQkJcG9pbnQueCA9IHg7CisJCQkJCW92ZXJyaWRlWCA9IHRydWU7CisJCQkJfQorCQkJCQorCQkJCXZhciB5ID0gcHQueTsKKworCQkJCWlmIChNYXRoLmFicyhwb2ludC55IC0geSkgPCB0dCkKKwkJCQl7CisJCQkJCXBvaW50LnkgPSB5OworCQkJCQlvdmVycmlkZVkgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLy8gVGVtcG9yYXJ5IGZ1bmN0aW9uCisJCWZ1bmN0aW9uIHNuYXBUb1Rlcm1pbmFsKHRlcm1pbmFsKQorCQl7CisJCQlpZiAodGVybWluYWwgIT0gbnVsbCkKKwkJCXsKKwkJCQlzbmFwVG9Qb2ludC5jYWxsKHRoaXMsIG5ldyBteFBvaW50KHZpZXcuZ2V0Um91dGluZ0NlbnRlclgodGVybWluYWwpLAorCQkJCQkJdmlldy5nZXRSb3V0aW5nQ2VudGVyWSh0ZXJtaW5hbCkpKTsKKwkJCX0KKwkJfTsKKworCQlzbmFwVG9UZXJtaW5hbC5jYWxsKHRoaXMsIHRoaXMuc3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsU3RhdGUodHJ1ZSkpOworCQlzbmFwVG9UZXJtaW5hbC5jYWxsKHRoaXMsIHRoaXMuc3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsU3RhdGUoZmFsc2UpKTsKKworCQlpZiAodGhpcy5zdGF0ZS5hYnNvbHV0ZVBvaW50cyAhPSBudWxsKQorCQl7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3RhdGUuYWJzb2x1dGVQb2ludHMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJc25hcFRvUG9pbnQuY2FsbCh0aGlzLCB0aGlzLnN0YXRlLmFic29sdXRlUG9pbnRzW2ldKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICh0aGlzLmdyYXBoLmlzR3JpZEVuYWJsZWRFdmVudChtZS5nZXRFdmVudCgpKSkKKwl7CisJCXZhciB0ciA9IHZpZXcudHJhbnNsYXRlOworCQkKKwkJaWYgKCFvdmVycmlkZVgpCisJCXsKKwkJCXBvaW50LnggPSAodGhpcy5ncmFwaC5zbmFwKHBvaW50LnggLyBzY2FsZSAtIHRyLngpICsgdHIueCkgKiBzY2FsZTsKKwkJfQorCQkKKwkJaWYgKCFvdmVycmlkZVkpCisJCXsKKwkJCXBvaW50LnkgPSAodGhpcy5ncmFwaC5zbmFwKHBvaW50LnkgLyBzY2FsZSAtIHRyLnkpICsgdHIueSkgKiBzY2FsZTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gcG9pbnQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRQcmV2aWV3VGVybWluYWxTdGF0ZQorICogCisgKiBVcGRhdGVzIHRoZSBnaXZlbiBwcmV2aWV3IHN0YXRlIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHN0YXRlIG9mIHRoZSBjb25zdHJhaW50IGhhbmRsZXIuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmdldFByZXZpZXdUZXJtaW5hbFN0YXRlID0gZnVuY3Rpb24obWUpCit7CisJdGhpcy5jb25zdHJhaW50SGFuZGxlci51cGRhdGUobWUsIHRoaXMuaXNTb3VyY2UsIHRydWUsIG1lLmlzU291cmNlKHRoaXMubWFya2VyLmhpZ2hsaWdodC5zaGFwZSkgPyBudWxsIDogdGhpcy5jdXJyZW50UG9pbnQpOworCQorCWlmICh0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLmN1cnJlbnRGb2N1cyAhPSBudWxsICYmIHRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudENvbnN0cmFpbnQgIT0gbnVsbCkKKwl7CisJCS8vIEhhbmRsZXMgc3BlY2lhbCBjYXNlIHdoZXJlIGdyaWQgaXMgbGFyZ2UgYW5kIGNvbm5lY3Rpb24gcG9pbnQgaXMgYXQgYWN0dWFsIHBvaW50IGluIHdoaWNoCisJCS8vIGNhc2UgdGhlIG91dGxpbmUgaXMgbm90IGZvbGxvd2VkIGFzIGxvbmcgYXMgd2UncmUgPCBncmlkU2l6ZSAvIDIgYXdheSBmcm9tIHRoYXQgcG9pbnQKKwkJaWYgKHRoaXMubWFya2VyLmhpZ2hsaWdodCAhPSBudWxsICYmIHRoaXMubWFya2VyLmhpZ2hsaWdodC5zdGF0ZSAhPSBudWxsICYmCisJCQl0aGlzLm1hcmtlci5oaWdobGlnaHQuc3RhdGUuY2VsbCA9PSB0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLmN1cnJlbnRGb2N1cy5jZWxsKQorCQl7CisJCQkvLyBEaXJlY3QgcmVwYWludCBuZWVkZWQgaWYgY2VsbCBhbHJlYWR5IGhpZ2hsaWdodGVkCisJCQlpZiAodGhpcy5tYXJrZXIuaGlnaGxpZ2h0LnNoYXBlLnN0cm9rZSAhPSAndHJhbnNwYXJlbnQnKQorCQkJeworCQkJCXRoaXMubWFya2VyLmhpZ2hsaWdodC5zaGFwZS5zdHJva2UgPSAndHJhbnNwYXJlbnQnOworCQkJCXRoaXMubWFya2VyLmhpZ2hsaWdodC5yZXBhaW50KCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLm1hcmtlci5tYXJrQ2VsbCh0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLmN1cnJlbnRGb2N1cy5jZWxsLCAndHJhbnNwYXJlbnQnKTsKKwkJfQorCQkKKwkJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpOworCQl2YXIgb3RoZXIgPSB0aGlzLmdyYXBoLnZpZXcuZ2V0VGVybWluYWxQb3J0KHRoaXMuc3RhdGUsCisJCQkJdGhpcy5ncmFwaC52aWV3LmdldFN0YXRlKG1vZGVsLmdldFRlcm1pbmFsKHRoaXMuc3RhdGUuY2VsbCwKKwkJCSF0aGlzLmlzU291cmNlKSksICF0aGlzLmlzU291cmNlKTsKKwkJdmFyIG90aGVyQ2VsbCA9IChvdGhlciAhPSBudWxsKSA/IG90aGVyLmNlbGwgOiBudWxsOworCQl2YXIgc291cmNlID0gKHRoaXMuaXNTb3VyY2UpID8gdGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50Rm9jdXMuY2VsbCA6IG90aGVyQ2VsbDsKKwkJdmFyIHRhcmdldCA9ICh0aGlzLmlzU291cmNlKSA/IG90aGVyQ2VsbCA6IHRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudEZvY3VzLmNlbGw7CisJCQorCQkvLyBVcGRhdGVzIHRoZSBlcnJvciBtZXNzYWdlIG9mIHRoZSBoYW5kbGVyCisJCXRoaXMuZXJyb3IgPSB0aGlzLnZhbGlkYXRlQ29ubmVjdGlvbihzb3VyY2UsIHRhcmdldCk7CisJCXZhciByZXN1bHQgPSBudWxsOworCQkKKwkJaWYgKHRoaXMuZXJyb3IgPT0gbnVsbCkKKwkJeworCQkJcmVzdWx0ID0gdGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50Rm9jdXM7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLnJlc2V0KCk7CisJCX0KKwkJCisJCXJldHVybiByZXN1bHQ7CisJfQorCWVsc2UgaWYgKCF0aGlzLmdyYXBoLmlzSWdub3JlVGVybWluYWxFdmVudChtZS5nZXRFdmVudCgpKSkKKwl7CisJCXRoaXMubWFya2VyLnByb2Nlc3MobWUpOworCisJCXJldHVybiB0aGlzLm1hcmtlci5nZXRWYWxpZFN0YXRlKCk7CisJfQorCWVsc2UKKwl7CisJCXRoaXMubWFya2VyLnJlc2V0KCk7CisJCQorCQlyZXR1cm4gbnVsbDsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRQcmV2aWV3UG9pbnRzCisgKiAKKyAqIFVwZGF0ZXMgdGhlIGdpdmVuIHByZXZpZXcgc3RhdGUgdGFraW5nIGludG8gYWNjb3VudCB0aGUgc3RhdGUgb2YgdGhlIGNvbnN0cmFpbnQgaGFuZGxlci4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogcHQgLSA8bXhQb2ludD4gdGhhdCBjb250YWlucyB0aGUgY3VycmVudCBwb2ludGVyIHBvc2l0aW9uLgorICogbWUgLSBPcHRpb25hbCA8bXhNb3VzZUV2ZW50PiB0aGF0IGNvbnRhaW5zIHRoZSBjdXJyZW50IGV2ZW50LgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5nZXRQcmV2aWV3UG9pbnRzID0gZnVuY3Rpb24ocHQsIG1lKQoreworCXZhciBnZW9tZXRyeSA9IHRoaXMuZ3JhcGguZ2V0Q2VsbEdlb21ldHJ5KHRoaXMuc3RhdGUuY2VsbCk7CisJdmFyIHBvaW50cyA9IChnZW9tZXRyeS5wb2ludHMgIT0gbnVsbCkgPyBnZW9tZXRyeS5wb2ludHMuc2xpY2UoKSA6IG51bGw7CisJdmFyIHBvaW50ID0gbmV3IG14UG9pbnQocHQueCwgcHQueSk7CisJdmFyIHJlc3VsdCA9IG51bGw7CisJCisJaWYgKCF0aGlzLmlzU291cmNlICYmICF0aGlzLmlzVGFyZ2V0KQorCXsKKwkJdGhpcy5jb252ZXJ0UG9pbnQocG9pbnQsIGZhbHNlKTsKKwkJCisJCWlmIChwb2ludHMgPT0gbnVsbCkKKwkJeworCQkJcG9pbnRzID0gW3BvaW50XTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIEFkZHMgcG9pbnQgZnJvbSB2aXJ0dWFsIGJlbmQKKwkJCWlmICh0aGlzLmluZGV4IDw9IG14RXZlbnQuVklSVFVBTF9IQU5ETEUpCisJCQl7CisJCQkJcG9pbnRzLnNwbGljZShteEV2ZW50LlZJUlRVQUxfSEFORExFIC0gdGhpcy5pbmRleCwgMCwgcG9pbnQpOworCQkJfQorCisJCQkvLyBSZW1vdmVzIHBvaW50IGlmIGRyYWdnZWQgb24gdGVybWluYWwgcG9pbnQKKwkJCWlmICghdGhpcy5pc1NvdXJjZSAmJiAhdGhpcy5pc1RhcmdldCkKKwkJCXsKKwkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYmVuZHMubGVuZ3RoOyBpKyspCisJCQkJeworCQkJCQlpZiAoaSAhPSB0aGlzLmluZGV4KQorCQkJCQl7CisJCQkJCQl2YXIgYmVuZCA9IHRoaXMuYmVuZHNbaV07CisJCQkJCQkKKwkJCQkJCWlmIChiZW5kICE9IG51bGwgJiYgbXhVdGlscy5jb250YWlucyhiZW5kLmJvdW5kcywgcHQueCwgcHQueSkpCisJCQkJCQl7CisJCQkJCQkJaWYgKHRoaXMuaW5kZXggPD0gbXhFdmVudC5WSVJUVUFMX0hBTkRMRSkKKwkJCQkJCQl7CisJCQkJCQkJCXBvaW50cy5zcGxpY2UobXhFdmVudC5WSVJUVUFMX0hBTkRMRSAtIHRoaXMuaW5kZXgsIDEpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlwb2ludHMuc3BsaWNlKHRoaXMuaW5kZXggLSAxLCAxKTsKKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkJcmVzdWx0ID0gcG9pbnRzOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCS8vIFJlbW92ZXMgcG9pbnQgaWYgdXNlciB0cmllcyB0byBzdHJhaWdodGVuIGEgc2VnbWVudAorCQkJCWlmIChyZXN1bHQgPT0gbnVsbCAmJiB0aGlzLnN0cmFpZ2h0UmVtb3ZlRW5hYmxlZCAmJiAobWUgPT0gbnVsbCB8fCAhbXhFdmVudC5pc0FsdERvd24obWUuZ2V0RXZlbnQoKSkpKQorCQkJCXsKKwkJCQkJdmFyIHRvbCA9IHRoaXMuZ3JhcGgudG9sZXJhbmNlICogdGhpcy5ncmFwaC50b2xlcmFuY2U7CisJCQkJCXZhciBhYnMgPSB0aGlzLnN0YXRlLmFic29sdXRlUG9pbnRzLnNsaWNlKCk7CisJCQkJCWFic1t0aGlzLmluZGV4XSA9IHB0OworCQkJCQkKKwkJCQkJLy8gSGFuZGVzIHNwZWNpYWwgY2FzZSB3aGVyZSByZW1vdmluZyB3YXlwb2ludCBhZmZlY3RzIHRvbGVyYW5jZSAoZmxpY2tlcmluZykKKwkJCQkJdmFyIHNyYyA9IHRoaXMuc3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsU3RhdGUodHJ1ZSk7CisJCQkJCQorCQkJCQlpZiAoc3JjICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCXZhciBjID0gdGhpcy5ncmFwaC5nZXRDb25uZWN0aW9uQ29uc3RyYWludCh0aGlzLnN0YXRlLCBzcmMsIHRydWUpOworCQkJCQkJCisJCQkJCQkvLyBDaGVja3MgaWYgcG9pbnQgaXMgbm90IGZpeGVkCisJCQkJCQlpZiAoYyA9PSBudWxsIHx8IHRoaXMuZ3JhcGguZ2V0Q29ubmVjdGlvblBvaW50KHNyYywgYykgPT0gbnVsbCkKKwkJCQkJCXsKKwkJCQkJCQlhYnNbMF0gPSBuZXcgbXhQb2ludChzcmMudmlldy5nZXRSb3V0aW5nQ2VudGVyWChzcmMpLCBzcmMudmlldy5nZXRSb3V0aW5nQ2VudGVyWShzcmMpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkKKwkJCQkJdmFyIHRyZyA9IHRoaXMuc3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsU3RhdGUoZmFsc2UpOworCQkJCQkKKwkJCQkJaWYgKHRyZyAhPSBudWxsKQorCQkJCQl7CisJCQkJCQl2YXIgYyA9IHRoaXMuZ3JhcGguZ2V0Q29ubmVjdGlvbkNvbnN0cmFpbnQodGhpcy5zdGF0ZSwgdHJnLCBmYWxzZSk7CisJCQkJCQkKKwkJCQkJCS8vIENoZWNrcyBpZiBwb2ludCBpcyBub3QgZml4ZWQKKwkJCQkJCWlmIChjID09IG51bGwgfHwgdGhpcy5ncmFwaC5nZXRDb25uZWN0aW9uUG9pbnQodHJnLCBjKSA9PSBudWxsKQorCQkJCQkJeworCQkJCQkJCWFic1thYnMubGVuZ3RoIC0gMV0gPSBuZXcgbXhQb2ludCh0cmcudmlldy5nZXRSb3V0aW5nQ2VudGVyWCh0cmcpLCB0cmcudmlldy5nZXRSb3V0aW5nQ2VudGVyWSh0cmcpKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCWZ1bmN0aW9uIGNoZWNrUmVtb3ZlKGlkeCwgdG1wKQorCQkJCQl7CisJCQkJCQlpZiAoaWR4ID4gMCAmJiBpZHggPCBhYnMubGVuZ3RoIC0gMSAmJgorCQkJCQkJCW14VXRpbHMucHRTZWdEaXN0U3EoYWJzW2lkeCAtIDFdLngsIGFic1tpZHggLSAxXS55LAorCQkJCQkJCQlhYnNbaWR4ICsgMV0ueCwgYWJzW2lkeCArIDFdLnksIHRtcC54LCB0bXAueSkgPCB0b2wpCisJCQkJCQl7CisJCQkJCQkJcG9pbnRzLnNwbGljZShpZHggLSAxLCAxKTsKKwkJCQkJCQlyZXN1bHQgPSBwb2ludHM7CisJCQkJCQl9CisJCQkJCX07CisJCQkJCQorCQkJCQkvLyBMQVRFUjogQ2hlY2sgaWYgb3RoZXIgcG9pbnRzIGNhbiBiZSByZW1vdmVkIGlmIGEgc2VnbWVudCBpcyBtYWRlIHN0cmFpZ2h0CisJCQkJCWNoZWNrUmVtb3ZlKHRoaXMuaW5kZXgsIHB0KTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCS8vIFVwZGF0ZXMgZXhpc3RpbmcgcG9pbnQKKwkJCWlmIChyZXN1bHQgPT0gbnVsbCAmJiB0aGlzLmluZGV4ID4gbXhFdmVudC5WSVJUVUFMX0hBTkRMRSkKKwkJCXsKKwkJCQlwb2ludHNbdGhpcy5pbmRleCAtIDFdID0gcG9pbnQ7CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiAodGhpcy5ncmFwaC5yZXNldEVkZ2VzT25Db25uZWN0KQorCXsKKwkJcG9pbnRzID0gbnVsbDsKKwl9CisJCisJcmV0dXJuIChyZXN1bHQgIT0gbnVsbCkgPyByZXN1bHQgOiBwb2ludHM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc091dGxpbmVDb25uZWN0RXZlbnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIDxvdXRsaW5lQ29ubmVjdD4gaXMgdHJ1ZSBhbmQgdGhlIHNvdXJjZSBvZiB0aGUgZXZlbnQgaXMgdGhlIG91dGxpbmUgc2hhcGUKKyAqIG9yIHNoaWZ0IGlzIHByZXNzZWQuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmlzT3V0bGluZUNvbm5lY3RFdmVudCA9IGZ1bmN0aW9uKG1lKQoreworCXZhciBvZmZzZXQgPSBteFV0aWxzLmdldE9mZnNldCh0aGlzLmdyYXBoLmNvbnRhaW5lcik7CisJdmFyIGV2dCA9IG1lLmdldEV2ZW50KCk7CisJCisJdmFyIGNsaWVudFggPSBteEV2ZW50LmdldENsaWVudFgoZXZ0KTsKKwl2YXIgY2xpZW50WSA9IG14RXZlbnQuZ2V0Q2xpZW50WShldnQpOworCQorCXZhciBkb2MgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CisJdmFyIGxlZnQgPSAod2luZG93LnBhZ2VYT2Zmc2V0IHx8IGRvYy5zY3JvbGxMZWZ0KSAtIChkb2MuY2xpZW50TGVmdCB8fCAwKTsKKwl2YXIgdG9wID0gKHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2Muc2Nyb2xsVG9wKSAgLSAoZG9jLmNsaWVudFRvcCB8fCAwKTsKKwkKKwl2YXIgZ3JpZFggPSB0aGlzLmN1cnJlbnRQb2ludC54IC0gdGhpcy5ncmFwaC5jb250YWluZXIuc2Nyb2xsTGVmdCArIG9mZnNldC54IC0gbGVmdDsKKwl2YXIgZ3JpZFkgPSB0aGlzLmN1cnJlbnRQb2ludC55IC0gdGhpcy5ncmFwaC5jb250YWluZXIuc2Nyb2xsVG9wICsgb2Zmc2V0LnkgLSB0b3A7CisKKwlyZXR1cm4gdGhpcy5vdXRsaW5lQ29ubmVjdCAmJiAhbXhFdmVudC5pc1NoaWZ0RG93bihtZS5nZXRFdmVudCgpKSAmJgorCQkobWUuaXNTb3VyY2UodGhpcy5tYXJrZXIuaGlnaGxpZ2h0LnNoYXBlKSB8fAorCQkobXhFdmVudC5pc0FsdERvd24obWUuZ2V0RXZlbnQoKSkgJiYgbWUuZ2V0U3RhdGUoKSAhPSBudWxsKSB8fAorCQl0aGlzLm1hcmtlci5oaWdobGlnaHQuaXNIaWdobGlnaHRBdChjbGllbnRYLCBjbGllbnRZKSB8fAorCQkoKGdyaWRYICE9IGNsaWVudFggfHwgZ3JpZFkgIT0gY2xpZW50WSkgJiYgbWUuZ2V0U3RhdGUoKSA9PSBudWxsICYmCisJCXRoaXMubWFya2VyLmhpZ2hsaWdodC5pc0hpZ2hsaWdodEF0KGdyaWRYLCBncmlkWSkpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZVByZXZpZXdTdGF0ZQorICogCisgKiBVcGRhdGVzIHRoZSBnaXZlbiBwcmV2aWV3IHN0YXRlIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHN0YXRlIG9mIHRoZSBjb25zdHJhaW50IGhhbmRsZXIuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLnVwZGF0ZVByZXZpZXdTdGF0ZSA9IGZ1bmN0aW9uKGVkZ2UsIHBvaW50LCB0ZXJtaW5hbFN0YXRlLCBtZSwgb3V0bGluZSkKK3sKKwkvLyBDb21wdXRlcyB0aGUgcG9pbnRzIGZvciB0aGUgZWRnZSBzdHlsZSBhbmQgdGVybWluYWxzCisJdmFyIHNvdXJjZVN0YXRlID0gKHRoaXMuaXNTb3VyY2UpID8gdGVybWluYWxTdGF0ZSA6IHRoaXMuc3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsU3RhdGUodHJ1ZSk7CisJdmFyIHRhcmdldFN0YXRlID0gKHRoaXMuaXNUYXJnZXQpID8gdGVybWluYWxTdGF0ZSA6IHRoaXMuc3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsU3RhdGUoZmFsc2UpOworCQorCXZhciBzb3VyY2VDb25zdHJhaW50ID0gdGhpcy5ncmFwaC5nZXRDb25uZWN0aW9uQ29uc3RyYWludChlZGdlLCBzb3VyY2VTdGF0ZSwgdHJ1ZSk7CisJdmFyIHRhcmdldENvbnN0cmFpbnQgPSB0aGlzLmdyYXBoLmdldENvbm5lY3Rpb25Db25zdHJhaW50KGVkZ2UsIHRhcmdldFN0YXRlLCBmYWxzZSk7CisKKwl2YXIgY29uc3RyYWludCA9IHRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudENvbnN0cmFpbnQ7CisKKwlpZiAoY29uc3RyYWludCA9PSBudWxsICYmIG91dGxpbmUpCisJeworCQlpZiAodGVybWluYWxTdGF0ZSAhPSBudWxsKQorCQl7CisJCQkvLyBIYW5kbGVzIHNwZWNpYWwgY2FzZSB3aGVyZSBtb3VzZSBpcyBvbiBvdXRsaW5lIGF3YXkgZnJvbSBhY3R1YWwgZW5kIHBvaW50CisJCQkvLyBpbiB3aGljaCBjYXNlIHRoZSBncmlkIGlzIGlnbm9yZWQgYW5kIG1vdXNlIHBvaW50IGlzIHVzZWQgaW5zdGVhZAorCQkJaWYgKG1lLmlzU291cmNlKHRoaXMubWFya2VyLmhpZ2hsaWdodC5zaGFwZSkpCisJCQl7CisJCQkJcG9pbnQgPSBuZXcgbXhQb2ludChtZS5nZXRHcmFwaFgoKSwgbWUuZ2V0R3JhcGhZKCkpOworCQkJfQorCQkJCisJCQljb25zdHJhaW50ID0gdGhpcy5ncmFwaC5nZXRPdXRsaW5lQ29uc3RyYWludChwb2ludCwgdGVybWluYWxTdGF0ZSwgbWUpOworCQkJdGhpcy5jb25zdHJhaW50SGFuZGxlci5zZXRGb2N1cyhtZSwgdGVybWluYWxTdGF0ZSwgdGhpcy5pc1NvdXJjZSk7CisJCQl0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLmN1cnJlbnRDb25zdHJhaW50ID0gY29uc3RyYWludDsKKwkJCXRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudFBvaW50ID0gcG9pbnQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQljb25zdHJhaW50ID0gbmV3IG14Q29ubmVjdGlvbkNvbnN0cmFpbnQoKTsKKwkJfQorCX0KKwkKKwlpZiAodGhpcy5vdXRsaW5lQ29ubmVjdCAmJiB0aGlzLm1hcmtlci5oaWdobGlnaHQgIT0gbnVsbCAmJiB0aGlzLm1hcmtlci5oaWdobGlnaHQuc2hhcGUgIT0gbnVsbCkKKwl7CisJCXZhciBzID0gdGhpcy5ncmFwaC52aWV3LnNjYWxlOworCQkKKwkJaWYgKHRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudENvbnN0cmFpbnQgIT0gbnVsbCAmJgorCQkJdGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50Rm9jdXMgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5tYXJrZXIuaGlnaGxpZ2h0LnNoYXBlLnN0cm9rZSA9IChvdXRsaW5lKSA/IG14Q29uc3RhbnRzLk9VVExJTkVfSElHSExJR0hUX0NPTE9SIDogJ3RyYW5zcGFyZW50JzsKKwkJCXRoaXMubWFya2VyLmhpZ2hsaWdodC5zaGFwZS5zdHJva2V3aWR0aCA9IG14Q29uc3RhbnRzLk9VVExJTkVfSElHSExJR0hUX1NUUk9LRVdJRFRIIC8gcyAvIHM7CisJCQl0aGlzLm1hcmtlci5oaWdobGlnaHQucmVwYWludCgpOworCQl9CisJCWVsc2UgaWYgKHRoaXMubWFya2VyLmhhc1ZhbGlkU3RhdGUoKSkKKwkJeworCQkJdGhpcy5tYXJrZXIuaGlnaGxpZ2h0LnNoYXBlLnN0cm9rZSA9ICh0aGlzLm1hcmtlci5nZXRWYWxpZFN0YXRlKCkgPT0gbWUuZ2V0U3RhdGUoKSkgPworCQkJCW14Q29uc3RhbnRzLkRFRkFVTFRfVkFMSURfQ09MT1IgOiAndHJhbnNwYXJlbnQnOworCQkJdGhpcy5tYXJrZXIuaGlnaGxpZ2h0LnNoYXBlLnN0cm9rZXdpZHRoID0gbXhDb25zdGFudHMuSElHSExJR0hUX1NUUk9LRVdJRFRIIC8gcyAvIHM7CisJCQl0aGlzLm1hcmtlci5oaWdobGlnaHQucmVwYWludCgpOworCQl9CisJfQorCQorCWlmICh0aGlzLmlzU291cmNlKQorCXsKKwkJc291cmNlQ29uc3RyYWludCA9IGNvbnN0cmFpbnQ7CisJfQorCWVsc2UgaWYgKHRoaXMuaXNUYXJnZXQpCisJeworCQl0YXJnZXRDb25zdHJhaW50ID0gY29uc3RyYWludDsKKwl9CisJCisJaWYgKHRoaXMuaXNTb3VyY2UgfHwgdGhpcy5pc1RhcmdldCkKKwl7CisJCWlmIChjb25zdHJhaW50ICE9IG51bGwgJiYgY29uc3RyYWludC5wb2ludCAhPSBudWxsKQorCQl7CisJCQllZGdlLnN0eWxlWyh0aGlzLmlzU291cmNlKSA/IG14Q29uc3RhbnRzLlNUWUxFX0VYSVRfWCA6IG14Q29uc3RhbnRzLlNUWUxFX0VOVFJZX1hdID0gY29uc3RyYWludC5wb2ludC54OworCQkJZWRnZS5zdHlsZVsodGhpcy5pc1NvdXJjZSkgPyBteENvbnN0YW50cy5TVFlMRV9FWElUX1kgOiBteENvbnN0YW50cy5TVFlMRV9FTlRSWV9ZXSA9IGNvbnN0cmFpbnQucG9pbnQueTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRlbGV0ZSBlZGdlLnN0eWxlWyh0aGlzLmlzU291cmNlKSA/IG14Q29uc3RhbnRzLlNUWUxFX0VYSVRfWCA6IG14Q29uc3RhbnRzLlNUWUxFX0VOVFJZX1hdOworCQkJZGVsZXRlIGVkZ2Uuc3R5bGVbKHRoaXMuaXNTb3VyY2UpID8gbXhDb25zdGFudHMuU1RZTEVfRVhJVF9ZIDogbXhDb25zdGFudHMuU1RZTEVfRU5UUllfWV07CisJCX0KKwl9CisJCisJZWRnZS5zZXRWaXNpYmxlVGVybWluYWxTdGF0ZShzb3VyY2VTdGF0ZSwgdHJ1ZSk7CisJZWRnZS5zZXRWaXNpYmxlVGVybWluYWxTdGF0ZSh0YXJnZXRTdGF0ZSwgZmFsc2UpOworCQorCWlmICghdGhpcy5pc1NvdXJjZSB8fCBzb3VyY2VTdGF0ZSAhPSBudWxsKQorCXsKKwkJZWRnZS52aWV3LnVwZGF0ZUZpeGVkVGVybWluYWxQb2ludChlZGdlLCBzb3VyY2VTdGF0ZSwgdHJ1ZSwgc291cmNlQ29uc3RyYWludCk7CisJfQorCQorCWlmICghdGhpcy5pc1RhcmdldCB8fCB0YXJnZXRTdGF0ZSAhPSBudWxsKQorCXsKKwkJZWRnZS52aWV3LnVwZGF0ZUZpeGVkVGVybWluYWxQb2ludChlZGdlLCB0YXJnZXRTdGF0ZSwgZmFsc2UsIHRhcmdldENvbnN0cmFpbnQpOworCX0KKwkKKwlpZiAoKHRoaXMuaXNTb3VyY2UgfHwgdGhpcy5pc1RhcmdldCkgJiYgdGVybWluYWxTdGF0ZSA9PSBudWxsKQorCXsKKwkJZWRnZS5zZXRBYnNvbHV0ZVRlcm1pbmFsUG9pbnQocG9pbnQsIHRoaXMuaXNTb3VyY2UpOworCisJCWlmICh0aGlzLm1hcmtlci5nZXRNYXJrZWRTdGF0ZSgpID09IG51bGwpCisJCXsKKwkJCXRoaXMuZXJyb3IgPSAodGhpcy5ncmFwaC5hbGxvd0RhbmdsaW5nRWRnZXMpID8gbnVsbCA6ICcnOworCQl9CisJfQorCQorCWVkZ2Uudmlldy51cGRhdGVQb2ludHMoZWRnZSwgdGhpcy5wb2ludHMsIHNvdXJjZVN0YXRlLCB0YXJnZXRTdGF0ZSk7CisJZWRnZS52aWV3LnVwZGF0ZUZsb2F0aW5nVGVybWluYWxQb2ludHMoZWRnZSwgc291cmNlU3RhdGUsIHRhcmdldFN0YXRlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdXNlTW92ZQorICogCisgKiBIYW5kbGVzIHRoZSBldmVudCBieSB1cGRhdGluZyB0aGUgcHJldmlldy4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUubW91c2VNb3ZlID0gZnVuY3Rpb24oc2VuZGVyLCBtZSkKK3sKKwlpZiAodGhpcy5pbmRleCAhPSBudWxsICYmIHRoaXMubWFya2VyICE9IG51bGwpCisJeworCQl0aGlzLmN1cnJlbnRQb2ludCA9IHRoaXMuZ2V0UG9pbnRGb3JFdmVudChtZSk7CisJCXRoaXMuZXJyb3IgPSBudWxsOworCQkKKwkJLy8gVXNlcyB0aGUgY3VycmVudCBwb2ludCBmcm9tIHRoZSBjb25zdHJhaW50IGhhbmRsZXIgaWYgYXZhaWxhYmxlCisJCWlmICghdGhpcy5ncmFwaC5pc0lnbm9yZVRlcm1pbmFsRXZlbnQobWUuZ2V0RXZlbnQoKSkgJiYgbXhFdmVudC5pc1NoaWZ0RG93bihtZS5nZXRFdmVudCgpKSAmJiB0aGlzLnNuYXBQb2ludCAhPSBudWxsKQorCQl7CisJCQlpZiAoTWF0aC5hYnModGhpcy5zbmFwUG9pbnQueCAtIHRoaXMuY3VycmVudFBvaW50LngpIDwgTWF0aC5hYnModGhpcy5zbmFwUG9pbnQueSAtIHRoaXMuY3VycmVudFBvaW50LnkpKQorCQkJeworCQkJCXRoaXMuY3VycmVudFBvaW50LnggPSB0aGlzLnNuYXBQb2ludC54OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRoaXMuY3VycmVudFBvaW50LnkgPSB0aGlzLnNuYXBQb2ludC55OworCQkJfQorCQl9CisJCQorCQlpZiAodGhpcy5pbmRleCA8PSBteEV2ZW50LkNVU1RPTV9IQU5ETEUgJiYgdGhpcy5pbmRleCA+IG14RXZlbnQuVklSVFVBTF9IQU5ETEUpCisJCXsKKwkJCWlmICh0aGlzLmN1c3RvbUhhbmRsZXMgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLmN1c3RvbUhhbmRsZXNbbXhFdmVudC5DVVNUT01fSEFORExFIC0gdGhpcy5pbmRleF0ucHJvY2Vzc0V2ZW50KG1lKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmICh0aGlzLmlzTGFiZWwpCisJCXsKKwkJCXRoaXMubGFiZWwueCA9IHRoaXMuY3VycmVudFBvaW50Lng7CisJCQl0aGlzLmxhYmVsLnkgPSB0aGlzLmN1cnJlbnRQb2ludC55OworCQl9CisJCWVsc2UKKwkJeworCQkJdGhpcy5wb2ludHMgPSB0aGlzLmdldFByZXZpZXdQb2ludHModGhpcy5jdXJyZW50UG9pbnQsIG1lKTsKKwkJCXZhciB0ZXJtaW5hbFN0YXRlID0gKHRoaXMuaXNTb3VyY2UgfHwgdGhpcy5pc1RhcmdldCkgPyB0aGlzLmdldFByZXZpZXdUZXJtaW5hbFN0YXRlKG1lKSA6IG51bGw7CisKKwkJCWlmICh0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLmN1cnJlbnRDb25zdHJhaW50ICE9IG51bGwgJiYKKwkJCQl0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLmN1cnJlbnRGb2N1cyAhPSBudWxsICYmCisJCQkJdGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50UG9pbnQgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLmN1cnJlbnRQb2ludCA9IHRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudFBvaW50LmNsb25lKCk7CisJCQl9CisJCQllbHNlIGlmICh0aGlzLm91dGxpbmVDb25uZWN0KQorCQkJeworCQkJCS8vIE5lZWQgdG8gY2hlY2sgb3V0bGluZSBiZWZvcmUgY2xvbmluZyB0ZXJtaW5hbCBzdGF0ZQorCQkJCXZhciBvdXRsaW5lID0gKHRoaXMuaXNTb3VyY2UgfHwgdGhpcy5pc1RhcmdldCkgPyB0aGlzLmlzT3V0bGluZUNvbm5lY3RFdmVudChtZSkgOiBmYWxzZQorCQkJCQkJCisJCQkJaWYgKG91dGxpbmUpCisJCQkJeworCQkJCQl0ZXJtaW5hbFN0YXRlID0gdGhpcy5tYXJrZXIuaGlnaGxpZ2h0LnN0YXRlOworCQkJCX0KKwkJCQllbHNlIGlmICh0ZXJtaW5hbFN0YXRlICE9IG51bGwgJiYgdGVybWluYWxTdGF0ZSAhPSBtZS5nZXRTdGF0ZSgpICYmIHRoaXMubWFya2VyLmhpZ2hsaWdodC5zaGFwZSAhPSBudWxsKQorCQkJCXsKKwkJCQkJdGhpcy5tYXJrZXIuaGlnaGxpZ2h0LnNoYXBlLnN0cm9rZSA9ICd0cmFuc3BhcmVudCc7CisJCQkJCXRoaXMubWFya2VyLmhpZ2hsaWdodC5yZXBhaW50KCk7CisJCQkJCXRlcm1pbmFsU3RhdGUgPSBudWxsOworCQkJCX0KKwkJCX0KKwkJCQorCQkJdmFyIGNsb25lID0gdGhpcy5jbG9uZVByZXZpZXdTdGF0ZSh0aGlzLmN1cnJlbnRQb2ludCwgKHRlcm1pbmFsU3RhdGUgIT0gbnVsbCkgPyB0ZXJtaW5hbFN0YXRlLmNlbGwgOiBudWxsKTsKKwkJCXRoaXMudXBkYXRlUHJldmlld1N0YXRlKGNsb25lLCB0aGlzLmN1cnJlbnRQb2ludCwgdGVybWluYWxTdGF0ZSwgbWUsIG91dGxpbmUpOworCisJCQkvLyBTZXRzIHRoZSBjb2xvciBvZiB0aGUgcHJldmlldyB0byB2YWxpZCBvciBpbnZhbGlkLCB1cGRhdGVzIHRoZQorCQkJLy8gcG9pbnRzIG9mIHRoZSBwcmV2aWV3IGFuZCByZWRyYXdzCisJCQl2YXIgY29sb3IgPSAodGhpcy5lcnJvciA9PSBudWxsKSA/IHRoaXMubWFya2VyLnZhbGlkQ29sb3IgOiB0aGlzLm1hcmtlci5pbnZhbGlkQ29sb3I7CisJCQl0aGlzLnNldFByZXZpZXdDb2xvcihjb2xvcik7CisJCQl0aGlzLmFic3BvaW50cyA9IGNsb25lLmFic29sdXRlUG9pbnRzOworCQkJdGhpcy5hY3RpdmUgPSB0cnVlOworCQl9CisKKwkJLy8gVGhpcyBzaG91bGQgZ28gYmVmb3JlIGNhbGxpbmcgaXNPdXRsaW5lQ29ubmVjdEV2ZW50IGFib3ZlLiBBcyBhIHdvcmthcm91bmQKKwkJLy8gd2UgYWRkIGFuIG9mZnNldCBvZiBncmlkU2l6ZSB0byB0aGUgaGludCB0byBhdm9pZCBwcm9ibGVtIHdpdGggaGl0IGRldGVjdGlvbgorCQkvLyBpbiBoaWdobGlnaHQuaXNIaWdobGlnaHRBdCAod2hpY2ggdXNlcyBjb21vbmVudEZyb21Qb2ludCkKKwkJdGhpcy51cGRhdGVIaW50KG1lLCB0aGlzLmN1cnJlbnRQb2ludCk7CisJCXRoaXMuZHJhd1ByZXZpZXcoKTsKKwkJbXhFdmVudC5jb25zdW1lKG1lLmdldEV2ZW50KCkpOworCQltZS5jb25zdW1lKCk7CisJfQorCS8vIFdvcmthcm91bmQgZm9yIGRpc2FibGluZyB0aGUgY29ubmVjdCBoaWdobGlnaHQgd2hlbiBvdmVyIGhhbmRsZQorCWVsc2UgaWYgKG14Q2xpZW50LklTX0lFICYmIHRoaXMuZ2V0SGFuZGxlRm9yRXZlbnQobWUpICE9IG51bGwpCisJeworCQltZS5jb25zdW1lKGZhbHNlKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3VzZVVwCisgKiAKKyAqIEhhbmRsZXMgdGhlIGV2ZW50IHRvIGFwcGx5aW5nIHRoZSBwcmV2aWV3ZWQgY2hhbmdlcyBvbiB0aGUgZWRnZSBieQorICogdXNpbmcgPG1vdmVMYWJlbD4sIDxjb25uZWN0PiBvciA8Y2hhbmdlUG9pbnRzPi4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUubW91c2VVcCA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJLy8gV29ya2Fyb3VuZCBmb3Igd3JvbmcgZXZlbnQgc291cmNlIGluIFdlYmtpdAorCWlmICh0aGlzLmluZGV4ICE9IG51bGwgJiYgdGhpcy5tYXJrZXIgIT0gbnVsbCkKKwl7CisJCXZhciBlZGdlID0gdGhpcy5zdGF0ZS5jZWxsOworCQkKKwkJLy8gSWdub3JlcyBldmVudCBpZiBtb3VzZSBoYXMgbm90IGJlZW4gbW92ZWQKKwkJaWYgKG1lLmdldFgoKSAhPSB0aGlzLnN0YXJ0WCB8fCBtZS5nZXRZKCkgIT0gdGhpcy5zdGFydFkpCisJCXsKKwkJCXZhciBjbG9uZSA9ICF0aGlzLmdyYXBoLmlzSWdub3JlVGVybWluYWxFdmVudChtZS5nZXRFdmVudCgpKSAmJiB0aGlzLmdyYXBoLmlzQ2xvbmVFdmVudChtZS5nZXRFdmVudCgpKSAmJgorCQkJCXRoaXMuY2xvbmVFbmFibGVkICYmIHRoaXMuZ3JhcGguaXNDZWxsc0Nsb25lYWJsZSgpOworCQkJCisJCQkvLyBEaXNwbGF5cyB0aGUgcmVhc29uIGZvciBub3QgY2Fycml5aW5nIG91dCB0aGUgY2hhbmdlCisJCQkvLyBpZiB0aGVyZSBpcyBhbiBlcnJvciBtZXNzYWdlIHdpdGggbm9uLXplcm8gbGVuZ3RoCisJCQlpZiAodGhpcy5lcnJvciAhPSBudWxsKQorCQkJeworCQkJCWlmICh0aGlzLmVycm9yLmxlbmd0aCA+IDApCisJCQkJeworCQkJCQl0aGlzLmdyYXBoLnZhbGlkYXRpb25BbGVydCh0aGlzLmVycm9yKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmICh0aGlzLmluZGV4IDw9IG14RXZlbnQuQ1VTVE9NX0hBTkRMRSAmJiB0aGlzLmluZGV4ID4gbXhFdmVudC5WSVJUVUFMX0hBTkRMRSkKKwkJCXsKKwkJCQlpZiAodGhpcy5jdXN0b21IYW5kbGVzICE9IG51bGwpCisJCQkJeworCQkJCQl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCk7CisJCQkJCQorCQkJCQltb2RlbC5iZWdpblVwZGF0ZSgpOworCQkJCQl0cnkKKwkJCQkJeworCQkJCQkJdGhpcy5jdXN0b21IYW5kbGVzW214RXZlbnQuQ1VTVE9NX0hBTkRMRSAtIHRoaXMuaW5kZXhdLmV4ZWN1dGUoKTsKKwkJCQkJfQorCQkJCQlmaW5hbGx5CisJCQkJCXsKKwkJCQkJCW1vZGVsLmVuZFVwZGF0ZSgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAodGhpcy5pc0xhYmVsKQorCQkJeworCQkJCXRoaXMubW92ZUxhYmVsKHRoaXMuc3RhdGUsIHRoaXMubGFiZWwueCwgdGhpcy5sYWJlbC55KTsKKwkJCX0KKwkJCWVsc2UgaWYgKHRoaXMuaXNTb3VyY2UgfHwgdGhpcy5pc1RhcmdldCkKKwkJCXsKKwkJCQl2YXIgdGVybWluYWwgPSBudWxsOworCQkJCQorCQkJCWlmICh0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLmN1cnJlbnRDb25zdHJhaW50ICE9IG51bGwgJiYKKwkJCQkJdGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50Rm9jdXMgIT0gbnVsbCkKKwkJCQl7CisJCQkJCXRlcm1pbmFsID0gdGhpcy5jb25zdHJhaW50SGFuZGxlci5jdXJyZW50Rm9jdXMuY2VsbDsKKwkJCQl9CisJCQkJCisJCQkJaWYgKHRlcm1pbmFsID09IG51bGwgJiYgdGhpcy5tYXJrZXIuaGFzVmFsaWRTdGF0ZSgpICYmIHRoaXMubWFya2VyLmhpZ2hsaWdodCAhPSBudWxsICYmCisJCQkJCXRoaXMubWFya2VyLmhpZ2hsaWdodC5zaGFwZSAhPSBudWxsICYmCisJCQkJCXRoaXMubWFya2VyLmhpZ2hsaWdodC5zaGFwZS5zdHJva2UgIT0gJ3RyYW5zcGFyZW50JyAmJgorCQkJCQl0aGlzLm1hcmtlci5oaWdobGlnaHQuc2hhcGUuc3Ryb2tlICE9ICd3aGl0ZScpCisJCQkJeworCQkJCQl0ZXJtaW5hbCA9IHRoaXMubWFya2VyLnZhbGlkU3RhdGUuY2VsbDsKKwkJCQl9CisJCQkJCisJCQkJaWYgKHRlcm1pbmFsICE9IG51bGwpCisJCQkJeworCQkJCQllZGdlID0gdGhpcy5jb25uZWN0KGVkZ2UsIHRlcm1pbmFsLCB0aGlzLmlzU291cmNlLCBjbG9uZSwgbWUpOworCQkJCX0KKwkJCQllbHNlIGlmICh0aGlzLmdyYXBoLmlzQWxsb3dEYW5nbGluZ0VkZ2VzKCkpCisJCQkJeworCQkJCQl2YXIgcHQgPSB0aGlzLmFic3BvaW50c1sodGhpcy5pc1NvdXJjZSkgPyAwIDogdGhpcy5hYnNwb2ludHMubGVuZ3RoIC0gMV07CisJCQkJCXB0LnggPSB0aGlzLnJvdW5kTGVuZ3RoKHB0LnggLyB0aGlzLmdyYXBoLnZpZXcuc2NhbGUgLSB0aGlzLmdyYXBoLnZpZXcudHJhbnNsYXRlLngpOworCQkJCQlwdC55ID0gdGhpcy5yb3VuZExlbmd0aChwdC55IC8gdGhpcy5ncmFwaC52aWV3LnNjYWxlIC0gdGhpcy5ncmFwaC52aWV3LnRyYW5zbGF0ZS55KTsKKworCQkJCQl2YXIgcHN0YXRlID0gdGhpcy5ncmFwaC5nZXRWaWV3KCkuZ2V0U3RhdGUoCisJCQkJCQkJdGhpcy5ncmFwaC5nZXRNb2RlbCgpLmdldFBhcmVudChlZGdlKSk7CisJCQkJCQkJCisJCQkJCWlmIChwc3RhdGUgIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJcHQueCAtPSBwc3RhdGUub3JpZ2luLng7CisJCQkJCQlwdC55IC09IHBzdGF0ZS5vcmlnaW4ueTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJcHQueCAtPSB0aGlzLmdyYXBoLnBhbkR4IC8gdGhpcy5ncmFwaC52aWV3LnNjYWxlOworCQkJCQlwdC55IC09IHRoaXMuZ3JhcGgucGFuRHkgLyB0aGlzLmdyYXBoLnZpZXcuc2NhbGU7CisJCQkJCQkJCQkJCisJCQkJCS8vIERlc3Ryb3lzIGFuZCByZWNyZWF0ZXMgdGhpcyBoYW5kbGVyCisJCQkJCWVkZ2UgPSB0aGlzLmNoYW5nZVRlcm1pbmFsUG9pbnQoZWRnZSwgcHQsIHRoaXMuaXNTb3VyY2UsIGNsb25lKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmICh0aGlzLmFjdGl2ZSkKKwkJCXsKKwkJCQllZGdlID0gdGhpcy5jaGFuZ2VQb2ludHMoZWRnZSwgdGhpcy5wb2ludHMsIGNsb25lKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl0aGlzLmdyYXBoLmdldFZpZXcoKS5pbnZhbGlkYXRlKHRoaXMuc3RhdGUuY2VsbCk7CisJCQkJdGhpcy5ncmFwaC5nZXRWaWV3KCkudmFsaWRhdGUodGhpcy5zdGF0ZS5jZWxsKTsJCQkJCQkKKwkJCX0KKwkJfQorCQkKKwkJLy8gUmVzZXRzIHRoZSBwcmV2aWV3IGNvbG9yIHRoZSBzdGF0ZSBvZiB0aGUgaGFuZGxlciBpZiB0aGlzCisJCS8vIGhhbmRsZXIgaGFzIG5vdCBiZWVuIHJlY3JlYXRlZAorCQlpZiAodGhpcy5tYXJrZXIgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5yZXNldCgpOworCisJCQkvLyBVcGRhdGVzIHRoZSBzZWxlY3Rpb24gaWYgdGhlIGVkZ2UgaGFzIGJlZW4gY2xvbmVkCisJCQlpZiAoZWRnZSAhPSB0aGlzLnN0YXRlLmNlbGwpCisJCQl7CisJCQkJdGhpcy5ncmFwaC5zZXRTZWxlY3Rpb25DZWxsKGVkZ2UpOworCQkJfQorCQl9CisKKwkJbWUuY29uc3VtZSgpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJlc2V0CisgKiAKKyAqIFJlc2V0cyB0aGUgc3RhdGUgb2YgdGhpcyBoYW5kbGVyLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLmVycm9yID0gbnVsbDsKKwl0aGlzLmluZGV4ID0gbnVsbDsKKwl0aGlzLmxhYmVsID0gbnVsbDsKKwl0aGlzLnBvaW50cyA9IG51bGw7CisJdGhpcy5zbmFwUG9pbnQgPSBudWxsOworCXRoaXMuYWN0aXZlID0gZmFsc2U7CisJdGhpcy5pc0xhYmVsID0gZmFsc2U7CisJdGhpcy5pc1NvdXJjZSA9IGZhbHNlOworCXRoaXMuaXNUYXJnZXQgPSBmYWxzZTsKKwkKKwlpZiAodGhpcy5saXZlUHJldmlldyAmJiB0aGlzLnNpemVycyAhPSBudWxsKQorCXsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNpemVycy5sZW5ndGg7IGkrKykKKwkJeworCQkJaWYgKHRoaXMuc2l6ZXJzW2ldICE9IG51bGwpCisJCQl7CisJCQkJdGhpcy5zaXplcnNbaV0ubm9kZS5zdHlsZS5kaXNwbGF5ID0gJyc7CisJCQl9CisJCX0KKwl9CisKKwlpZiAodGhpcy5tYXJrZXIgIT0gbnVsbCkKKwl7CisJCXRoaXMubWFya2VyLnJlc2V0KCk7CisJfQorCQorCWlmICh0aGlzLmNvbnN0cmFpbnRIYW5kbGVyICE9IG51bGwpCisJeworCQl0aGlzLmNvbnN0cmFpbnRIYW5kbGVyLnJlc2V0KCk7CisJfQorCQorCWlmICh0aGlzLmN1c3RvbUhhbmRsZXMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jdXN0b21IYW5kbGVzLmxlbmd0aDsgaSsrKQorCQl7CisJCQl0aGlzLmN1c3RvbUhhbmRsZXNbaV0ucmVzZXQoKTsKKwkJfQorCX0KKworCXRoaXMuc2V0UHJldmlld0NvbG9yKG14Q29uc3RhbnRzLkVER0VfU0VMRUNUSU9OX0NPTE9SKTsKKwl0aGlzLnJlbW92ZUhpbnQoKTsKKwl0aGlzLnJlZHJhdygpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0UHJldmlld0NvbG9yCisgKiAKKyAqIFNldHMgdGhlIGNvbG9yIG9mIHRoZSBwcmV2aWV3IHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUuc2V0UHJldmlld0NvbG9yID0gZnVuY3Rpb24oY29sb3IpCit7CisJaWYgKHRoaXMuc2hhcGUgIT0gbnVsbCkKKwl7CisJCXRoaXMuc2hhcGUuc3Ryb2tlID0gY29sb3I7CisJfQorfTsKKworCisvKioKKyAqIEZ1bmN0aW9uOiBjb252ZXJ0UG9pbnQKKyAqIAorICogQ29udmVydHMgdGhlIGdpdmVuIHBvaW50IGluLXBsYWNlIGZyb20gc2NyZWVuIHRvIHVuc2NhbGVkLCB1bnRyYW5zbGF0ZWQKKyAqIGdyYXBoIGNvb3JkaW5hdGVzIGFuZCBhcHBsaWVzIHRoZSBncmlkLiBSZXR1cm5zIHRoZSBnaXZlbiwgbW9kaWZpZWQKKyAqIHBvaW50IGluc3RhbmNlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwb2ludCAtIDxteFBvaW50PiB0byBiZSBjb252ZXJ0ZWQuCisgKiBncmlkRW5hYmxlZCAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIGdyaWQgc2hvdWxkIGJlIGFwcGxpZWQuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmNvbnZlcnRQb2ludCA9IGZ1bmN0aW9uKHBvaW50LCBncmlkRW5hYmxlZCkKK3sKKwl2YXIgc2NhbGUgPSB0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXRTY2FsZSgpOworCXZhciB0ciA9IHRoaXMuZ3JhcGguZ2V0VmlldygpLmdldFRyYW5zbGF0ZSgpOworCQkKKwlpZiAoZ3JpZEVuYWJsZWQpCisJeworCQlwb2ludC54ID0gdGhpcy5ncmFwaC5zbmFwKHBvaW50LngpOworCQlwb2ludC55ID0gdGhpcy5ncmFwaC5zbmFwKHBvaW50LnkpOworCX0KKwkKKwlwb2ludC54ID0gTWF0aC5yb3VuZChwb2ludC54IC8gc2NhbGUgLSB0ci54KTsKKwlwb2ludC55ID0gTWF0aC5yb3VuZChwb2ludC55IC8gc2NhbGUgLSB0ci55KTsKKworCXZhciBwc3RhdGUgPSB0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXRTdGF0ZSgKKwkJdGhpcy5ncmFwaC5nZXRNb2RlbCgpLmdldFBhcmVudCh0aGlzLnN0YXRlLmNlbGwpKTsKKworCWlmIChwc3RhdGUgIT0gbnVsbCkKKwl7CisJCXBvaW50LnggLT0gcHN0YXRlLm9yaWdpbi54OworCQlwb2ludC55IC09IHBzdGF0ZS5vcmlnaW4ueTsKKwl9CisKKwlyZXR1cm4gcG9pbnQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3ZlTGFiZWwKKyAqIAorICogQ2hhbmdlcyB0aGUgY29vcmRpbmF0ZXMgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWRnZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZWRnZSAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgZWRnZS4KKyAqIHggLSBJbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIG5ldyBsb2NhdGlvbi4KKyAqIHkgLSBJbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIG5ldyBsb2NhdGlvbi4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUubW92ZUxhYmVsID0gZnVuY3Rpb24oZWRnZVN0YXRlLCB4LCB5KQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwl2YXIgZ2VvbWV0cnkgPSBtb2RlbC5nZXRHZW9tZXRyeShlZGdlU3RhdGUuY2VsbCk7CisJCisJaWYgKGdlb21ldHJ5ICE9IG51bGwpCisJeworCQl2YXIgc2NhbGUgPSB0aGlzLmdyYXBoLmdldFZpZXcoKS5zY2FsZTsKKwkJZ2VvbWV0cnkgPSBnZW9tZXRyeS5jbG9uZSgpOworCQkKKwkJaWYgKGdlb21ldHJ5LnJlbGF0aXZlKQorCQl7CisJCQkvLyBSZXNldHMgdGhlIHJlbGF0aXZlIGxvY2F0aW9uIHN0b3JlZCBpbnNpZGUgdGhlIGdlb21ldHJ5CisJCQl2YXIgcHQgPSB0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXRSZWxhdGl2ZVBvaW50KGVkZ2VTdGF0ZSwgeCwgeSk7CisJCQlnZW9tZXRyeS54ID0gTWF0aC5yb3VuZChwdC54ICogMTAwMDApIC8gMTAwMDA7CisJCQlnZW9tZXRyeS55ID0gTWF0aC5yb3VuZChwdC55KTsKKwkJCQorCQkJLy8gUmVzZXRzIHRoZSBvZmZzZXQgaW5zaWRlIHRoZSBnZW9tZXRyeSB0byBmaW5kIHRoZSBvZmZzZXQKKwkJCS8vIGZyb20gdGhlIHJlc3VsdGluZyBwb2ludAorCQkJZ2VvbWV0cnkub2Zmc2V0ID0gbmV3IG14UG9pbnQoMCwgMCk7CisJCQl2YXIgcHQgPSB0aGlzLmdyYXBoLnZpZXcuZ2V0UG9pbnQoZWRnZVN0YXRlLCBnZW9tZXRyeSk7CisJCQlnZW9tZXRyeS5vZmZzZXQgPSBuZXcgbXhQb2ludChNYXRoLnJvdW5kKCh4IC0gcHQueCkgLyBzY2FsZSksIE1hdGgucm91bmQoKHkgLSBwdC55KSAvIHNjYWxlKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl2YXIgcG9pbnRzID0gZWRnZVN0YXRlLmFic29sdXRlUG9pbnRzOworCQkJdmFyIHAwID0gcG9pbnRzWzBdOworCQkJdmFyIHBlID0gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTsKKwkJCQorCQkJaWYgKHAwICE9IG51bGwgJiYgcGUgIT0gbnVsbCkKKwkJCXsKKwkJCQl2YXIgY3ggPSBwMC54ICsgKHBlLnggLSBwMC54KSAvIDI7CisJCQkJdmFyIGN5ID0gcDAueSArIChwZS55IC0gcDAueSkgLyAyOworCQkJCQorCQkJCWdlb21ldHJ5Lm9mZnNldCA9IG5ldyBteFBvaW50KE1hdGgucm91bmQoKHggLSBjeCkgLyBzY2FsZSksIE1hdGgucm91bmQoKHkgLSBjeSkgLyBzY2FsZSkpOworCQkJCWdlb21ldHJ5LnggPSAwOworCQkJCWdlb21ldHJ5LnkgPSAwOworCQkJfQorCQl9CisKKwkJbW9kZWwuc2V0R2VvbWV0cnkoZWRnZVN0YXRlLmNlbGwsIGdlb21ldHJ5KTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjb25uZWN0CisgKiAKKyAqIENoYW5nZXMgdGhlIHRlcm1pbmFsIG9yIHRlcm1pbmFsIHBvaW50IG9mIHRoZSBnaXZlbiBlZGdlIGluIHRoZSBncmFwaAorICogbW9kZWwuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGVkZ2UgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIGVkZ2UgdG8gYmUgcmVjb25uZWN0ZWQuCisgKiB0ZXJtaW5hbCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgbmV3IHRlcm1pbmFsLgorICogaXNTb3VyY2UgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIG5ldyB0ZXJtaW5hbCBpcyB0aGUgc291cmNlIG9yCisgKiB0YXJnZXQgdGVybWluYWwuCisgKiBpc0Nsb25lIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBuZXcgY29ubmVjdGlvbiBzaG91bGQgYmUgYSBjbG9uZSBvZgorICogdGhlIG9sZCBlZGdlLgorICogbWUgLSA8bXhNb3VzZUV2ZW50PiB0aGF0IGNvbnRhaW5zIHRoZSBtb3VzZSB1cCBldmVudC4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uKGVkZ2UsIHRlcm1pbmFsLCBpc1NvdXJjZSwgaXNDbG9uZSwgbWUpCit7CisJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpOworCXZhciBwYXJlbnQgPSBtb2RlbC5nZXRQYXJlbnQoZWRnZSk7CisJCisJbW9kZWwuYmVnaW5VcGRhdGUoKTsKKwl0cnkKKwl7CisJCS8vIENsb25lcyBhbmQgYWRkcyB0aGUgY2VsbAorCQlpZiAoaXNDbG9uZSkKKwkJeworCQkJdmFyIGNsb25lID0gdGhpcy5ncmFwaC5jbG9uZUNlbGxzKFtlZGdlXSlbMF07CisJCQltb2RlbC5hZGQocGFyZW50LCBjbG9uZSwgbW9kZWwuZ2V0Q2hpbGRDb3VudChwYXJlbnQpKTsKKwkJCQorCQkJdmFyIG90aGVyID0gbW9kZWwuZ2V0VGVybWluYWwoZWRnZSwgIWlzU291cmNlKTsKKwkJCXRoaXMuZ3JhcGguY29ubmVjdENlbGwoY2xvbmUsIG90aGVyLCAhaXNTb3VyY2UpOworCQkJCisJCQllZGdlID0gY2xvbmU7CisJCX0KKworCQl2YXIgY29uc3RyYWludCA9IHRoaXMuY29uc3RyYWludEhhbmRsZXIuY3VycmVudENvbnN0cmFpbnQ7CisJCQorCQlpZiAoY29uc3RyYWludCA9PSBudWxsKQorCQl7CisJCQljb25zdHJhaW50ID0gbmV3IG14Q29ubmVjdGlvbkNvbnN0cmFpbnQoKTsKKwkJfQorCisJCXRoaXMuZ3JhcGguY29ubmVjdENlbGwoZWRnZSwgdGVybWluYWwsIGlzU291cmNlLCBjb25zdHJhaW50KTsKKwl9CisJZmluYWxseQorCXsKKwkJbW9kZWwuZW5kVXBkYXRlKCk7CisJfQorCQorCXJldHVybiBlZGdlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY2hhbmdlVGVybWluYWxQb2ludAorICogCisgKiBDaGFuZ2VzIHRoZSB0ZXJtaW5hbCBwb2ludCBvZiB0aGUgZ2l2ZW4gZWRnZS4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUuY2hhbmdlVGVybWluYWxQb2ludCA9IGZ1bmN0aW9uKGVkZ2UsIHBvaW50LCBpc1NvdXJjZSwgY2xvbmUpCit7CisJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpOworCisJbW9kZWwuYmVnaW5VcGRhdGUoKTsKKwl0cnkKKwl7CisJCWlmIChjbG9uZSkKKwkJeworCQkJdmFyIHBhcmVudCA9IG1vZGVsLmdldFBhcmVudChlZGdlKTsKKwkJCXZhciB0ZXJtaW5hbCA9IG1vZGVsLmdldFRlcm1pbmFsKGVkZ2UsICFpc1NvdXJjZSk7CisJCQllZGdlID0gdGhpcy5ncmFwaC5jbG9uZUNlbGxzKFtlZGdlXSlbMF07CisJCQltb2RlbC5hZGQocGFyZW50LCBlZGdlLCBtb2RlbC5nZXRDaGlsZENvdW50KHBhcmVudCkpOworCQkJbW9kZWwuc2V0VGVybWluYWwoZWRnZSwgdGVybWluYWwsICFpc1NvdXJjZSk7CisJCX0KKworCQl2YXIgZ2VvID0gbW9kZWwuZ2V0R2VvbWV0cnkoZWRnZSk7CisJCQorCQlpZiAoZ2VvICE9IG51bGwpCisJCXsKKwkJCWdlbyA9IGdlby5jbG9uZSgpOworCQkJZ2VvLnNldFRlcm1pbmFsUG9pbnQocG9pbnQsIGlzU291cmNlKTsKKwkJCW1vZGVsLnNldEdlb21ldHJ5KGVkZ2UsIGdlbyk7CisJCQl0aGlzLmdyYXBoLmNvbm5lY3RDZWxsKGVkZ2UsIG51bGwsIGlzU291cmNlLCBuZXcgbXhDb25uZWN0aW9uQ29uc3RyYWludCgpKTsKKwkJfQorCX0KKwlmaW5hbGx5CisJeworCQltb2RlbC5lbmRVcGRhdGUoKTsKKwl9CisJCisJcmV0dXJuIGVkZ2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjaGFuZ2VQb2ludHMKKyAqIAorICogQ2hhbmdlcyB0aGUgY29udHJvbCBwb2ludHMgb2YgdGhlIGdpdmVuIGVkZ2UgaW4gdGhlIGdyYXBoIG1vZGVsLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5jaGFuZ2VQb2ludHMgPSBmdW5jdGlvbihlZGdlLCBwb2ludHMsIGNsb25lKQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwltb2RlbC5iZWdpblVwZGF0ZSgpOworCXRyeQorCXsKKwkJaWYgKGNsb25lKQorCQl7CisJCQl2YXIgcGFyZW50ID0gbW9kZWwuZ2V0UGFyZW50KGVkZ2UpOworCQkJdmFyIHNvdXJjZSA9IG1vZGVsLmdldFRlcm1pbmFsKGVkZ2UsIHRydWUpOworCQkJdmFyIHRhcmdldCA9IG1vZGVsLmdldFRlcm1pbmFsKGVkZ2UsIGZhbHNlKTsKKwkJCWVkZ2UgPSB0aGlzLmdyYXBoLmNsb25lQ2VsbHMoW2VkZ2VdKVswXTsKKwkJCW1vZGVsLmFkZChwYXJlbnQsIGVkZ2UsIG1vZGVsLmdldENoaWxkQ291bnQocGFyZW50KSk7CisJCQltb2RlbC5zZXRUZXJtaW5hbChlZGdlLCBzb3VyY2UsIHRydWUpOworCQkJbW9kZWwuc2V0VGVybWluYWwoZWRnZSwgdGFyZ2V0LCBmYWxzZSk7CisJCX0KKwkJCisJCXZhciBnZW8gPSBtb2RlbC5nZXRHZW9tZXRyeShlZGdlKTsKKwkJCisJCWlmIChnZW8gIT0gbnVsbCkKKwkJeworCQkJZ2VvID0gZ2VvLmNsb25lKCk7CisJCQlnZW8ucG9pbnRzID0gcG9pbnRzOworCQkJCisJCQltb2RlbC5zZXRHZW9tZXRyeShlZGdlLCBnZW8pOworCQl9CisJfQorCWZpbmFsbHkKKwl7CisJCW1vZGVsLmVuZFVwZGF0ZSgpOworCX0KKwkKKwlyZXR1cm4gZWRnZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZFBvaW50CisgKiAKKyAqIEFkZHMgYSBjb250cm9sIHBvaW50IGZvciB0aGUgZ2l2ZW4gc3RhdGUgYW5kIGV2ZW50LgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5hZGRQb2ludCA9IGZ1bmN0aW9uKHN0YXRlLCBldnQpCit7CisJdmFyIHB0ID0gbXhVdGlscy5jb252ZXJ0UG9pbnQodGhpcy5ncmFwaC5jb250YWluZXIsIG14RXZlbnQuZ2V0Q2xpZW50WChldnQpLAorCQkJbXhFdmVudC5nZXRDbGllbnRZKGV2dCkpOworCXZhciBncmlkRW5hYmxlZCA9IHRoaXMuZ3JhcGguaXNHcmlkRW5hYmxlZEV2ZW50KGV2dCk7CisJdGhpcy5jb252ZXJ0UG9pbnQocHQsIGdyaWRFbmFibGVkKTsKKwl0aGlzLmFkZFBvaW50QXQoc3RhdGUsIHB0LngsIHB0LnkpOworCW14RXZlbnQuY29uc3VtZShldnQpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYWRkUG9pbnRBdAorICogCisgKiBBZGRzIGEgY29udHJvbCBwb2ludCBhdCB0aGUgZ2l2ZW4gcG9pbnQuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmFkZFBvaW50QXQgPSBmdW5jdGlvbihzdGF0ZSwgeCwgeSkKK3sKKwl2YXIgZ2VvID0gdGhpcy5ncmFwaC5nZXRDZWxsR2VvbWV0cnkoc3RhdGUuY2VsbCk7CisJdmFyIHB0ID0gbmV3IG14UG9pbnQoeCwgeSk7CisJCisJaWYgKGdlbyAhPSBudWxsKQorCXsKKwkJZ2VvID0gZ2VvLmNsb25lKCk7CisJCXZhciB0ID0gdGhpcy5ncmFwaC52aWV3LnRyYW5zbGF0ZTsKKwkJdmFyIHMgPSB0aGlzLmdyYXBoLnZpZXcuc2NhbGU7CisJCXZhciBvZmZzZXQgPSBuZXcgbXhQb2ludCh0LnggKiBzLCB0LnkgKiBzKTsKKwkJCisJCXZhciBwYXJlbnQgPSB0aGlzLmdyYXBoLm1vZGVsLmdldFBhcmVudCh0aGlzLnN0YXRlLmNlbGwpOworCQkKKwkJaWYgKHRoaXMuZ3JhcGgubW9kZWwuaXNWZXJ0ZXgocGFyZW50KSkKKwkJeworCQkJdmFyIHBTdGF0ZSA9IHRoaXMuZ3JhcGgudmlldy5nZXRTdGF0ZShwYXJlbnQpOworCQkJb2Zmc2V0ID0gbmV3IG14UG9pbnQocFN0YXRlLngsIHBTdGF0ZS55KTsKKwkJfQorCQkKKwkJdmFyIGluZGV4ID0gbXhVdGlscy5maW5kTmVhcmVzdFNlZ21lbnQoc3RhdGUsIHB0LnggKiBzICsgb2Zmc2V0LngsIHB0LnkgKiBzICsgb2Zmc2V0LnkpOworCisJCWlmIChnZW8ucG9pbnRzID09IG51bGwpCisJCXsKKwkJCWdlby5wb2ludHMgPSBbcHRdOworCQl9CisJCWVsc2UKKwkJeworCQkJZ2VvLnBvaW50cy5zcGxpY2UoaW5kZXgsIDAsIHB0KTsKKwkJfQorCQkKKwkJdGhpcy5ncmFwaC5nZXRNb2RlbCgpLnNldEdlb21ldHJ5KHN0YXRlLmNlbGwsIGdlbyk7CisJCXRoaXMucmVmcmVzaCgpOwkKKwkJdGhpcy5yZWRyYXcoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZW1vdmVQb2ludAorICogCisgKiBSZW1vdmVzIHRoZSBjb250cm9sIHBvaW50IGF0IHRoZSBnaXZlbiBpbmRleCBmcm9tIHRoZSBnaXZlbiBzdGF0ZS4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUucmVtb3ZlUG9pbnQgPSBmdW5jdGlvbihzdGF0ZSwgaW5kZXgpCit7CisJaWYgKGluZGV4ID4gMCAmJiBpbmRleCA8IHRoaXMuYWJzcG9pbnRzLmxlbmd0aCAtIDEpCisJeworCQl2YXIgZ2VvID0gdGhpcy5ncmFwaC5nZXRDZWxsR2VvbWV0cnkodGhpcy5zdGF0ZS5jZWxsKTsKKwkJCisJCWlmIChnZW8gIT0gbnVsbCAmJiBnZW8ucG9pbnRzICE9IG51bGwpCisJCXsKKwkJCWdlbyA9IGdlby5jbG9uZSgpOworCQkJZ2VvLnBvaW50cy5zcGxpY2UoaW5kZXggLSAxLCAxKTsKKwkJCXRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5zZXRHZW9tZXRyeShzdGF0ZS5jZWxsLCBnZW8pOworCQkJdGhpcy5yZWZyZXNoKCk7CisJCQl0aGlzLnJlZHJhdygpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0SGFuZGxlRmlsbENvbG9yCisgKiAKKyAqIFJldHVybnMgdGhlIGZpbGxjb2xvciBmb3IgdGhlIGhhbmRsZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmdldEhhbmRsZUZpbGxDb2xvciA9IGZ1bmN0aW9uKGluZGV4KQoreworCXZhciBpc1NvdXJjZSA9IGluZGV4ID09IDA7CisJdmFyIGNlbGwgPSB0aGlzLnN0YXRlLmNlbGw7CisJdmFyIHRlcm1pbmFsID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpLmdldFRlcm1pbmFsKGNlbGwsIGlzU291cmNlKTsKKwl2YXIgY29sb3IgPSBteENvbnN0YW50cy5IQU5ETEVfRklMTENPTE9SOworCQorCWlmICgodGVybWluYWwgIT0gbnVsbCAmJiAhdGhpcy5ncmFwaC5pc0NlbGxEaXNjb25uZWN0YWJsZShjZWxsLCB0ZXJtaW5hbCwgaXNTb3VyY2UpKSB8fAorCQkodGVybWluYWwgPT0gbnVsbCAmJiAhdGhpcy5ncmFwaC5pc1Rlcm1pbmFsUG9pbnRNb3ZhYmxlKGNlbGwsIGlzU291cmNlKSkpCisJeworCQljb2xvciA9IG14Q29uc3RhbnRzLkxPQ0tFRF9IQU5ETEVfRklMTENPTE9SOworCX0KKwllbHNlIGlmICh0ZXJtaW5hbCAhPSBudWxsICYmIHRoaXMuZ3JhcGguaXNDZWxsRGlzY29ubmVjdGFibGUoY2VsbCwgdGVybWluYWwsIGlzU291cmNlKSkKKwl7CisJCWNvbG9yID0gbXhDb25zdGFudHMuQ09OTkVDVF9IQU5ETEVfRklMTENPTE9SOworCX0KKwkKKwlyZXR1cm4gY29sb3I7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWRyYXcKKyAqIAorICogUmVkcmF3cyB0aGUgcHJldmlldywgYW5kIHRoZSBiZW5kcy0gYW5kIGxhYmVsIGNvbnRyb2wgcG9pbnRzLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5yZWRyYXcgPSBmdW5jdGlvbigpCit7CisJdGhpcy5hYnNwb2ludHMgPSB0aGlzLnN0YXRlLmFic29sdXRlUG9pbnRzLnNsaWNlKCk7CisJdGhpcy5yZWRyYXdIYW5kbGVzKCk7CisJCisJdmFyIGcgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCkuZ2V0R2VvbWV0cnkodGhpcy5zdGF0ZS5jZWxsKTsKKwl2YXIgcHRzID0gZy5wb2ludHM7CisKKwlpZiAodGhpcy5iZW5kcyAhPSBudWxsICYmIHRoaXMuYmVuZHMubGVuZ3RoID4gMCkKKwl7CisJCWlmIChwdHMgIT0gbnVsbCkKKwkJeworCQkJaWYgKHRoaXMucG9pbnRzID09IG51bGwpCisJCQl7CisJCQkJdGhpcy5wb2ludHMgPSBbXTsKKwkJCX0KKwkJCQorCQkJZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLmJlbmRzLmxlbmd0aCAtIDE7IGkrKykKKwkJCXsKKwkJCQlpZiAodGhpcy5iZW5kc1tpXSAhPSBudWxsICYmIHRoaXMuYWJzcG9pbnRzW2ldICE9IG51bGwpCisJCQkJeworCQkJCQl0aGlzLnBvaW50c1tpIC0gMV0gPSBwdHNbaSAtIDFdOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXRoaXMuZHJhd1ByZXZpZXcoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlZHJhd0hhbmRsZXMKKyAqIAorICogUmVkcmF3cyB0aGUgaGFuZGxlcy4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUucmVkcmF3SGFuZGxlcyA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgY2VsbCA9IHRoaXMuc3RhdGUuY2VsbDsKKworCS8vIFVwZGF0ZXMgdGhlIGhhbmRsZSBmb3IgdGhlIGxhYmVsIHBvc2l0aW9uCisJdmFyIGIgPSB0aGlzLmxhYmVsU2hhcGUuYm91bmRzOworCXRoaXMubGFiZWwgPSBuZXcgbXhQb2ludCh0aGlzLnN0YXRlLmFic29sdXRlT2Zmc2V0LngsIHRoaXMuc3RhdGUuYWJzb2x1dGVPZmZzZXQueSk7CisJdGhpcy5sYWJlbFNoYXBlLmJvdW5kcyA9IG5ldyBteFJlY3RhbmdsZShNYXRoLnJvdW5kKHRoaXMubGFiZWwueCAtIGIud2lkdGggLyAyKSwKKwkJTWF0aC5yb3VuZCh0aGlzLmxhYmVsLnkgLSBiLmhlaWdodCAvIDIpLCBiLndpZHRoLCBiLmhlaWdodCk7CisKKwkvLyBTaG93cyBvciBoaWRlcyB0aGUgbGFiZWwgaGFuZGxlIGRlcGVuZGluZyBvbiB0aGUgbGFiZWwKKwl2YXIgbGFiID0gdGhpcy5ncmFwaC5nZXRMYWJlbChjZWxsKTsKKwl0aGlzLmxhYmVsU2hhcGUudmlzaWJsZSA9IChsYWIgIT0gbnVsbCAmJiBsYWIubGVuZ3RoID4gMCAmJiB0aGlzLmdyYXBoLmlzTGFiZWxNb3ZhYmxlKGNlbGwpKTsKKwkKKwlpZiAodGhpcy5iZW5kcyAhPSBudWxsICYmIHRoaXMuYmVuZHMubGVuZ3RoID4gMCkKKwl7CisJCXZhciBuID0gdGhpcy5hYnNwb2ludHMubGVuZ3RoIC0gMTsKKwkJCisJCXZhciBwMCA9IHRoaXMuYWJzcG9pbnRzWzBdOworCQl2YXIgeDAgPSBwMC54OworCQl2YXIgeTAgPSBwMC55OworCQkKKwkJYiA9IHRoaXMuYmVuZHNbMF0uYm91bmRzOworCQl0aGlzLmJlbmRzWzBdLmJvdW5kcyA9IG5ldyBteFJlY3RhbmdsZShNYXRoLmZsb29yKHgwIC0gYi53aWR0aCAvIDIpLAorCQkJCU1hdGguZmxvb3IoeTAgLSBiLmhlaWdodCAvIDIpLCBiLndpZHRoLCBiLmhlaWdodCk7CisJCXRoaXMuYmVuZHNbMF0uZmlsbCA9IHRoaXMuZ2V0SGFuZGxlRmlsbENvbG9yKDApOworCQl0aGlzLmJlbmRzWzBdLnJlZHJhdygpOworCQkKKwkJaWYgKHRoaXMubWFuYWdlTGFiZWxIYW5kbGUpCisJCXsKKwkJCXRoaXMuY2hlY2tMYWJlbEhhbmRsZSh0aGlzLmJlbmRzWzBdLmJvdW5kcyk7CisJCX0KKwkJCQkKKwkJdmFyIHBlID0gdGhpcy5hYnNwb2ludHNbbl07CisJCXZhciB4biA9IHBlLng7CisJCXZhciB5biA9IHBlLnk7CisJCQorCQl2YXIgYm4gPSB0aGlzLmJlbmRzLmxlbmd0aCAtIDE7CisJCWIgPSB0aGlzLmJlbmRzW2JuXS5ib3VuZHM7CisJCXRoaXMuYmVuZHNbYm5dLmJvdW5kcyA9IG5ldyBteFJlY3RhbmdsZShNYXRoLmZsb29yKHhuIC0gYi53aWR0aCAvIDIpLAorCQkJCU1hdGguZmxvb3IoeW4gLSBiLmhlaWdodCAvIDIpLCBiLndpZHRoLCBiLmhlaWdodCk7CisJCXRoaXMuYmVuZHNbYm5dLmZpbGwgPSB0aGlzLmdldEhhbmRsZUZpbGxDb2xvcihibik7CisJCXRoaXMuYmVuZHNbYm5dLnJlZHJhdygpOworCQkJCQorCQlpZiAodGhpcy5tYW5hZ2VMYWJlbEhhbmRsZSkKKwkJeworCQkJdGhpcy5jaGVja0xhYmVsSGFuZGxlKHRoaXMuYmVuZHNbYm5dLmJvdW5kcyk7CisJCX0KKwkJCisJCXRoaXMucmVkcmF3SW5uZXJCZW5kcyhwMCwgcGUpOworCX0KKworCWlmICh0aGlzLmFic3BvaW50cyAhPSBudWxsICYmIHRoaXMudmlydHVhbEJlbmRzICE9IG51bGwgJiYgdGhpcy52aXJ0dWFsQmVuZHMubGVuZ3RoID4gMCkKKwl7CisJCXZhciBsYXN0ID0gdGhpcy5hYnNwb2ludHNbMF07CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudmlydHVhbEJlbmRzLmxlbmd0aDsgaSsrKQorCQl7CisJCQlpZiAodGhpcy52aXJ0dWFsQmVuZHNbaV0gIT0gbnVsbCAmJiB0aGlzLmFic3BvaW50c1tpICsgMV0gIT0gbnVsbCkKKwkJCXsKKwkJCQl2YXIgcHQgPSB0aGlzLmFic3BvaW50c1tpICsgMV07CisJCQkJdmFyIGIgPSB0aGlzLnZpcnR1YWxCZW5kc1tpXTsKKwkJCQl2YXIgeCA9IGxhc3QueCArIChwdC54IC0gbGFzdC54KSAvIDI7CisJCQkJdmFyIHkgPSBsYXN0LnkgKyAocHQueSAtIGxhc3QueSkgLyAyOworCQkJCWIuYm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKE1hdGguZmxvb3IoeCAtIGIuYm91bmRzLndpZHRoIC8gMiksCisJCQkJCQlNYXRoLmZsb29yKHkgLSBiLmJvdW5kcy5oZWlnaHQgLyAyKSwgYi5ib3VuZHMud2lkdGgsIGIuYm91bmRzLmhlaWdodCk7CisJCQkJYi5yZWRyYXcoKTsKKwkJCQlteFV0aWxzLnNldE9wYWNpdHkoYi5ub2RlLCB0aGlzLnZpcnR1YWxCZW5kT3BhY2l0eSk7CisJCQkJbGFzdCA9IHB0OworCQkJCQorCQkJCWlmICh0aGlzLm1hbmFnZUxhYmVsSGFuZGxlKQorCQkJCXsKKwkJCQkJdGhpcy5jaGVja0xhYmVsSGFuZGxlKGIuYm91bmRzKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJaWYgKHRoaXMubGFiZWxTaGFwZSAhPSBudWxsKQorCXsKKwkJdGhpcy5sYWJlbFNoYXBlLnJlZHJhdygpOworCX0KKwkKKwlpZiAodGhpcy5jdXN0b21IYW5kbGVzICE9IG51bGwpCisJeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY3VzdG9tSGFuZGxlcy5sZW5ndGg7IGkrKykKKwkJeworCQkJdGhpcy5jdXN0b21IYW5kbGVzW2ldLnJlZHJhdygpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogaGlkZUhhbmRsZXMKKyAqIAorICogU2hvcnRjdXQgdG8gPGhpZGVTaXplcnM+LgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5zZXRIYW5kbGVzVmlzaWJsZSA9IGZ1bmN0aW9uKHZpc2libGUpCit7CisJaWYgKHRoaXMuYmVuZHMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5iZW5kcy5sZW5ndGg7IGkrKykKKwkJeworCQkJdGhpcy5iZW5kc1tpXS5ub2RlLnN0eWxlLmRpc3BsYXkgPSAodmlzaWJsZSkgPyAnJyA6ICdub25lJzsKKwkJfQorCX0KKwkKKwlpZiAodGhpcy52aXJ0dWFsQmVuZHMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy52aXJ0dWFsQmVuZHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXRoaXMudmlydHVhbEJlbmRzW2ldLm5vZGUuc3R5bGUuZGlzcGxheSA9ICh2aXNpYmxlKSA/ICcnIDogJ25vbmUnOworCQl9CisJfQorCisJaWYgKHRoaXMubGFiZWxTaGFwZSAhPSBudWxsKQorCXsKKwkJdGhpcy5sYWJlbFNoYXBlLm5vZGUuc3R5bGUuZGlzcGxheSA9ICh2aXNpYmxlKSA/ICcnIDogJ25vbmUnOworCX0KKwkKKwlpZiAodGhpcy5jdXN0b21IYW5kbGVzICE9IG51bGwpCisJeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY3VzdG9tSGFuZGxlcy5sZW5ndGg7IGkrKykKKwkJeworCQkJdGhpcy5jdXN0b21IYW5kbGVzW2ldLnNldFZpc2libGUodmlzaWJsZSk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWRyYXdJbm5lckJlbmRzCisgKiAKKyAqIFVwZGF0ZXMgYW5kIHJlZHJhd3MgdGhlIGlubmVyIGJlbmRzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwMCAtIDxteFBvaW50PiB0aGF0IHJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBwb2ludC4KKyAqIHBlIC0gPG14UG9pbnQ+IHRoYXQgcmVwcmVzZW50cyB0aGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgcG9pbnQuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLnJlZHJhd0lubmVyQmVuZHMgPSBmdW5jdGlvbihwMCwgcGUpCit7CisJZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLmJlbmRzLmxlbmd0aCAtIDE7IGkrKykKKwl7CisJCWlmICh0aGlzLmJlbmRzW2ldICE9IG51bGwpCisJCXsKKwkJCWlmICh0aGlzLmFic3BvaW50c1tpXSAhPSBudWxsKQorCQkJeworCQkJCXZhciB4ID0gdGhpcy5hYnNwb2ludHNbaV0ueDsKKwkJCQl2YXIgeSA9IHRoaXMuYWJzcG9pbnRzW2ldLnk7CisJCQkJCisJCQkJdmFyIGIgPSB0aGlzLmJlbmRzW2ldLmJvdW5kczsKKwkJCQl0aGlzLmJlbmRzW2ldLm5vZGUuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsKKwkJCQl0aGlzLmJlbmRzW2ldLmJvdW5kcyA9IG5ldyBteFJlY3RhbmdsZShNYXRoLnJvdW5kKHggLSBiLndpZHRoIC8gMiksCisJCQkJCQlNYXRoLnJvdW5kKHkgLSBiLmhlaWdodCAvIDIpLCBiLndpZHRoLCBiLmhlaWdodCk7CisJCQkJCisJCQkJaWYgKHRoaXMubWFuYWdlTGFiZWxIYW5kbGUpCisJCQkJeworCQkJCQl0aGlzLmNoZWNrTGFiZWxIYW5kbGUodGhpcy5iZW5kc1tpXS5ib3VuZHMpOworCQkJCX0KKwkJCQllbHNlIGlmICh0aGlzLmhhbmRsZUltYWdlID09IG51bGwgJiYgdGhpcy5sYWJlbFNoYXBlLnZpc2libGUgJiYgbXhVdGlscy5pbnRlcnNlY3RzKHRoaXMuYmVuZHNbaV0uYm91bmRzLCB0aGlzLmxhYmVsU2hhcGUuYm91bmRzKSkKKwkJCQl7CisJCQkJCXcgPSBteENvbnN0YW50cy5IQU5ETEVfU0laRSArIDM7CisJCQkJCWggPSBteENvbnN0YW50cy5IQU5ETEVfU0laRSArIDM7CisJCQkJCXRoaXMuYmVuZHNbaV0uYm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKE1hdGgucm91bmQoeCAtIHcgLyAyKSwgTWF0aC5yb3VuZCh5IC0gaCAvIDIpLCB3LCBoKTsKKwkJCQl9CisJCQkJCisJCQkJdGhpcy5iZW5kc1tpXS5yZWRyYXcoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl0aGlzLmJlbmRzW2ldLmRlc3Ryb3koKTsKKwkJCQl0aGlzLmJlbmRzW2ldID0gbnVsbDsKKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGNoZWNrTGFiZWxIYW5kbGUKKyAqIAorICogQ2hlY2tzIGlmIHRoZSBsYWJlbCBoYW5kbGUgaW50ZXJzZWN0cyB0aGUgZ2l2ZW4gYm91bmRzIGFuZCBtb3ZlcyBpdCBpZiBpdAorICogaW50ZXJzZWN0cy4KKyAqLworbXhFZGdlSGFuZGxlci5wcm90b3R5cGUuY2hlY2tMYWJlbEhhbmRsZSA9IGZ1bmN0aW9uKGIpCit7CisJaWYgKHRoaXMubGFiZWxTaGFwZSAhPSBudWxsKQorCXsKKwkJdmFyIGIyID0gdGhpcy5sYWJlbFNoYXBlLmJvdW5kczsKKwkJCisJCWlmIChteFV0aWxzLmludGVyc2VjdHMoYiwgYjIpKQorCQl7CisJCQlpZiAoYi5nZXRDZW50ZXJZKCkgPCBiMi5nZXRDZW50ZXJZKCkpCisJCQl7CisJCQkJYjIueSA9IGIueSArIGIuaGVpZ2h0OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWIyLnkgPSBiLnkgLSBiMi5oZWlnaHQ7CisJCQl9CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkcmF3UHJldmlldworICogCisgKiBSZWRyYXdzIHRoZSBwcmV2aWV3LgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5kcmF3UHJldmlldyA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAodGhpcy5pc0xhYmVsKQorCXsKKwkJdmFyIGIgPSB0aGlzLmxhYmVsU2hhcGUuYm91bmRzOworCQl2YXIgYm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKE1hdGgucm91bmQodGhpcy5sYWJlbC54IC0gYi53aWR0aCAvIDIpLAorCQkJCU1hdGgucm91bmQodGhpcy5sYWJlbC55IC0gYi5oZWlnaHQgLyAyKSwgYi53aWR0aCwgYi5oZWlnaHQpOworCQl0aGlzLmxhYmVsU2hhcGUuYm91bmRzID0gYm91bmRzOworCQl0aGlzLmxhYmVsU2hhcGUucmVkcmF3KCk7CisJfQorCWVsc2UgaWYgKHRoaXMuc2hhcGUgIT0gbnVsbCkKKwl7CisJCXRoaXMuc2hhcGUuYXBwbHkodGhpcy5zdGF0ZSk7CisJCXRoaXMuc2hhcGUucG9pbnRzID0gdGhpcy5hYnNwb2ludHM7CisJCXRoaXMuc2hhcGUuc2NhbGUgPSB0aGlzLnN0YXRlLnZpZXcuc2NhbGU7CisJCXRoaXMuc2hhcGUuaXNEYXNoZWQgPSB0aGlzLmlzU2VsZWN0aW9uRGFzaGVkKCk7CisJCXRoaXMuc2hhcGUuc3Ryb2tlID0gdGhpcy5nZXRTZWxlY3Rpb25Db2xvcigpOworCQl0aGlzLnNoYXBlLnN0cm9rZXdpZHRoID0gdGhpcy5nZXRTZWxlY3Rpb25TdHJva2VXaWR0aCgpIC8gdGhpcy5zaGFwZS5zY2FsZSAvIHRoaXMuc2hhcGUuc2NhbGU7CisJCXRoaXMuc2hhcGUuaXNTaGFkb3cgPSBmYWxzZTsKKwkJdGhpcy5zaGFwZS5yZWRyYXcoKTsKKwl9CisJCisJaWYgKHRoaXMucGFyZW50SGlnaGxpZ2h0ICE9IG51bGwpCisJeworCQl0aGlzLnBhcmVudEhpZ2hsaWdodC5yZWRyYXcoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWZyZXNoCisgKiAKKyAqIFJlZnJlc2hlcyB0aGUgYmVuZHMgb2YgdGhpcyBoYW5kbGVyLgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24oKQoreworCXRoaXMuYWJzcG9pbnRzID0gdGhpcy5nZXRTZWxlY3Rpb25Qb2ludHModGhpcy5zdGF0ZSk7CisJdGhpcy5wb2ludHMgPSBbXTsKKworCWlmICh0aGlzLnNoYXBlICE9IG51bGwpCisJeworCQl0aGlzLnNoYXBlLnBvaW50cyA9IHRoaXMuYWJzcG9pbnRzOworCX0KKwkKKwlpZiAodGhpcy5iZW5kcyAhPSBudWxsKQorCXsKKwkJdGhpcy5kZXN0cm95QmVuZHModGhpcy5iZW5kcyk7CisJCXRoaXMuYmVuZHMgPSB0aGlzLmNyZWF0ZUJlbmRzKCk7CisJfQorCQorCWlmICh0aGlzLnZpcnR1YWxCZW5kcyAhPSBudWxsKQorCXsKKwkJdGhpcy5kZXN0cm95QmVuZHModGhpcy52aXJ0dWFsQmVuZHMpOworCQl0aGlzLnZpcnR1YWxCZW5kcyA9IHRoaXMuY3JlYXRlVmlydHVhbEJlbmRzKCk7CisJfQorCQorCWlmICh0aGlzLmN1c3RvbUhhbmRsZXMgIT0gbnVsbCkKKwl7CisJCXRoaXMuZGVzdHJveUJlbmRzKHRoaXMuY3VzdG9tSGFuZGxlcyk7CisJCXRoaXMuY3VzdG9tSGFuZGxlcyA9IHRoaXMuY3JlYXRlQ3VzdG9tSGFuZGxlcygpOworCX0KKwkKKwkvLyBQdXRzIGxhYmVsIG5vZGUgb24gdG9wIG9mIGJlbmRzCisJaWYgKHRoaXMubGFiZWxTaGFwZSAhPSBudWxsICYmIHRoaXMubGFiZWxTaGFwZS5ub2RlICE9IG51bGwgJiYgdGhpcy5sYWJlbFNoYXBlLm5vZGUucGFyZW50Tm9kZSAhPSBudWxsKQorCXsKKwkJdGhpcy5sYWJlbFNoYXBlLm5vZGUucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLmxhYmVsU2hhcGUubm9kZSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZGVzdHJveUJlbmRzCisgKiAKKyAqIERlc3Ryb3lzIGFsbCBlbGVtZW50cyBpbiA8YmVuZHM+LgorICovCitteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5kZXN0cm95QmVuZHMgPSBmdW5jdGlvbihiZW5kcykKK3sKKwlpZiAoYmVuZHMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgYmVuZHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCWlmIChiZW5kc1tpXSAhPSBudWxsKQorCQkJeworCQkJCWJlbmRzW2ldLmRlc3Ryb3koKTsKKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqIAorICogRGVzdHJveXMgdGhlIGhhbmRsZXIgYW5kIGFsbCBpdHMgcmVzb3VyY2VzIGFuZCBET00gbm9kZXMuIFRoaXMgZG9lcworICogbm9ybWFsbHkgbm90IG5lZWQgdG8gYmUgY2FsbGVkIGFzIGhhbmRsZXJzIGFyZSBkZXN0cm95ZWQgYXV0b21hdGljYWxseQorICogd2hlbiB0aGUgY29ycmVzcG9uZGluZyBjZWxsIGlzIGRlc2VsZWN0ZWQuCisgKi8KK214RWRnZUhhbmRsZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMuZXNjYXBlSGFuZGxlciAhPSBudWxsKQorCXsKKwkJdGhpcy5zdGF0ZS52aWV3LmdyYXBoLnJlbW92ZUxpc3RlbmVyKHRoaXMuZXNjYXBlSGFuZGxlcik7CisJCXRoaXMuZXNjYXBlSGFuZGxlciA9IG51bGw7CisJfQorCQorCWlmICh0aGlzLm1hcmtlciAhPSBudWxsKQorCXsKKwkJdGhpcy5tYXJrZXIuZGVzdHJveSgpOworCQl0aGlzLm1hcmtlciA9IG51bGw7CisJfQorCQorCWlmICh0aGlzLnNoYXBlICE9IG51bGwpCisJeworCQl0aGlzLnNoYXBlLmRlc3Ryb3koKTsKKwkJdGhpcy5zaGFwZSA9IG51bGw7CisJfQorCQorCWlmICh0aGlzLnBhcmVudEhpZ2hsaWdodCAhPSBudWxsKQorCXsKKwkJdGhpcy5wYXJlbnRIaWdobGlnaHQuZGVzdHJveSgpOworCQl0aGlzLnBhcmVudEhpZ2hsaWdodCA9IG51bGw7CisJfQorCQorCWlmICh0aGlzLmxhYmVsU2hhcGUgIT0gbnVsbCkKKwl7CisJCXRoaXMubGFiZWxTaGFwZS5kZXN0cm95KCk7CisJCXRoaXMubGFiZWxTaGFwZSA9IG51bGw7CisJfQorCisJaWYgKHRoaXMuY29uc3RyYWludEhhbmRsZXIgIT0gbnVsbCkKKwl7CisJCXRoaXMuY29uc3RyYWludEhhbmRsZXIuZGVzdHJveSgpOworCQl0aGlzLmNvbnN0cmFpbnRIYW5kbGVyID0gbnVsbDsKKwl9CisJCisJdGhpcy5kZXN0cm95QmVuZHModGhpcy52aXJ0dWFsQmVuZHMpOworCXRoaXMudmlydHVhbEJlbmRzID0gbnVsbDsKKwkKKwl0aGlzLmRlc3Ryb3lCZW5kcyh0aGlzLmN1c3RvbUhhbmRsZXMpOworCXRoaXMuY3VzdG9tSGFuZGxlcyA9IG51bGw7CisKKwl0aGlzLmRlc3Ryb3lCZW5kcyh0aGlzLmJlbmRzKTsKKwl0aGlzLmJlbmRzID0gbnVsbDsKKwkKKwl0aGlzLnJlbW92ZUhpbnQoKTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teEVkZ2VTZWdtZW50SGFuZGxlci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214RWRnZVNlZ21lbnRIYW5kbGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMzM0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teEVkZ2VTZWdtZW50SGFuZGxlci5qcwpAQCAtMCwwICsxLDQwMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworZnVuY3Rpb24gbXhFZGdlU2VnbWVudEhhbmRsZXIoc3RhdGUpCit7CisJbXhFZGdlSGFuZGxlci5jYWxsKHRoaXMsIHN0YXRlKTsKK307CisKKy8qKgorICogRXh0ZW5kcyBteEVkZ2VIYW5kbGVyLgorICovCitteFV0aWxzLmV4dGVuZChteEVkZ2VTZWdtZW50SGFuZGxlciwgbXhFbGJvd0VkZ2VIYW5kbGVyKTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q3VycmVudFBvaW50cworICogCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFic29sdXRlIHBvaW50cy4KKyAqLworbXhFZGdlU2VnbWVudEhhbmRsZXIucHJvdG90eXBlLmdldEN1cnJlbnRQb2ludHMgPSBmdW5jdGlvbigpCit7CisJdmFyIHB0cyA9IHRoaXMuc3RhdGUuYWJzb2x1dGVQb2ludHM7CisJCisJaWYgKHB0cyAhPSBudWxsKQorCXsKKwkJLy8gU3BlY2lhbCBjYXNlIGZvciBzdHJhaWdodCBlZGdlcyB3aGVyZSB3ZSBhZGQgYSB2aXJ0dWFsIG1pZGRsZSBoYW5kbGUgZm9yIG1vdmluZyB0aGUgZWRnZQorCQlpZiAocHRzLmxlbmd0aCA9PSAyIHx8IChwdHMubGVuZ3RoID09IDMgJiYgKHB0c1swXS54ID09IHB0c1sxXS54ICYmIHB0c1sxXS54ID09IHB0c1syXS54IHx8CisJCQkJcHRzWzBdLnkgPT0gcHRzWzFdLnkgJiYgcHRzWzFdLnkgPT0gcHRzWzJdLnkpKSkKKwkJeworCQkJdmFyIGN4ID0gcHRzWzBdLnggKyAocHRzW3B0cy5sZW5ndGggLSAxXS54IC0gcHRzWzBdLngpIC8gMjsKKwkJCXZhciBjeSA9IHB0c1swXS55ICsgKHB0c1twdHMubGVuZ3RoIC0gMV0ueSAtIHB0c1swXS55KSAvIDI7CisJCQkKKwkJCXB0cyA9IFtwdHNbMF0sIG5ldyBteFBvaW50KGN4LCBjeSksIG5ldyBteFBvaW50KGN4LCBjeSksIHB0c1twdHMubGVuZ3RoIC0gMV1dOwkKKwkJfQorCX0KKworCXJldHVybiBwdHM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRQcmV2aWV3UG9pbnRzCisgKiAKKyAqIFVwZGF0ZXMgdGhlIGdpdmVuIHByZXZpZXcgc3RhdGUgdGFraW5nIGludG8gYWNjb3VudCB0aGUgc3RhdGUgb2YgdGhlIGNvbnN0cmFpbnQgaGFuZGxlci4KKyAqLworbXhFZGdlU2VnbWVudEhhbmRsZXIucHJvdG90eXBlLmdldFByZXZpZXdQb2ludHMgPSBmdW5jdGlvbihwb2ludCkKK3sKKwlpZiAodGhpcy5pc1NvdXJjZSB8fCB0aGlzLmlzVGFyZ2V0KQorCXsKKwkJcmV0dXJuIG14RWxib3dFZGdlSGFuZGxlci5wcm90b3R5cGUuZ2V0UHJldmlld1BvaW50cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX0KKwllbHNlCisJeworCQl2YXIgcHRzID0gdGhpcy5nZXRDdXJyZW50UG9pbnRzKCk7CisJCXZhciBsYXN0ID0gdGhpcy5jb252ZXJ0UG9pbnQocHRzWzBdLmNsb25lKCksIGZhbHNlKTsKKwkJcG9pbnQgPSB0aGlzLmNvbnZlcnRQb2ludChwb2ludC5jbG9uZSgpLCBmYWxzZSk7CisJCXZhciByZXN1bHQgPSBbXTsKKworCQlmb3IgKHZhciBpID0gMTsgaSA8IHB0cy5sZW5ndGg7IGkrKykKKwkJeworCQkJdmFyIHB0ID0gdGhpcy5jb252ZXJ0UG9pbnQocHRzW2ldLmNsb25lKCksIGZhbHNlKTsKKwkJCQorCQkJaWYgKGkgPT0gdGhpcy5pbmRleCkKKwkJCXsKKwkJCQlpZiAoTWF0aC5yb3VuZChsYXN0LnggLSBwdC54KSA9PSAwKQorCQkgCQl7CisJCQkJCWxhc3QueCA9IHBvaW50Lng7CisJCQkJCXB0LnggPSBwb2ludC54OworCQkgCQl9CisJCSAJCQorCQkJCWlmIChNYXRoLnJvdW5kKGxhc3QueSAtIHB0LnkpID09IDApCisJCSAJCXsKKwkJIAkJCWxhc3QueSA9IHBvaW50Lnk7CisJCSAJCQlwdC55ID0gcG9pbnQueTsKKwkJIAkJfQorCQkJfQorCisJCQlpZiAoaSA8IHB0cy5sZW5ndGggLSAxKQorCQkJeworCQkJCXJlc3VsdC5wdXNoKHB0KTsKKwkJCX0KKworCQkJbGFzdCA9IHB0OworCQl9CisJCQorCQkvLyBSZXBsYWNlcyBzaW5nbGUgcG9pbnQgdGhhdCBpbnRlcnNlY3RzIHdpdGggc291cmNlIG9yIHRhcmdldAorCQlpZiAocmVzdWx0Lmxlbmd0aCA9PSAxKQorCQl7CisJCQl2YXIgc291cmNlID0gdGhpcy5zdGF0ZS5nZXRWaXNpYmxlVGVybWluYWxTdGF0ZSh0cnVlKTsKKwkJCXZhciB0YXJnZXQgPSB0aGlzLnN0YXRlLmdldFZpc2libGVUZXJtaW5hbFN0YXRlKGZhbHNlKTsKKwkJCXZhciBzY2FsZSA9IHRoaXMuc3RhdGUudmlldy5nZXRTY2FsZSgpOworCQkJdmFyIHRyID0gdGhpcy5zdGF0ZS52aWV3LmdldFRyYW5zbGF0ZSgpOworCQkJCisJCQl2YXIgeCA9IHJlc3VsdFswXS54ICogc2NhbGUgKyB0ci54OworCQkJdmFyIHkgPSByZXN1bHRbMF0ueSAqIHNjYWxlICsgdHIueTsKKwkJCQorCQkJaWYgKChzb3VyY2UgIT0gbnVsbCAmJiBteFV0aWxzLmNvbnRhaW5zKHNvdXJjZSwgeCwgeSkpIHx8CisJCQkJKHRhcmdldCAhPSBudWxsICYmIG14VXRpbHMuY29udGFpbnModGFyZ2V0LCB4LCB5KSkpCisJCQl7CisJCQkJcmVzdWx0ID0gW3BvaW50LCBwb2ludF07CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZVByZXZpZXdTdGF0ZQorICogCisgKiBPdmVycmlkZGVuIHRvIHBlcmZvcm0gb3B0aW1pemF0aW9uIG9mIHRoZSBlZGdlIHN0eWxlIHJlc3VsdC4KKyAqLworbXhFZGdlU2VnbWVudEhhbmRsZXIucHJvdG90eXBlLnVwZGF0ZVByZXZpZXdTdGF0ZSA9IGZ1bmN0aW9uKGVkZ2UsIHBvaW50LCB0ZXJtaW5hbFN0YXRlLCBtZSkKK3sKKwlteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS51cGRhdGVQcmV2aWV3U3RhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworCS8vIENoZWNrcyBhbmQgY29ycmVjdHMgcHJldmlldyBieSBydW5uaW5nIGVkZ2Ugc3R5bGUgYWdhaW4KKwlpZiAoIXRoaXMuaXNTb3VyY2UgJiYgIXRoaXMuaXNUYXJnZXQpCisJeworCQlwb2ludCA9IHRoaXMuY29udmVydFBvaW50KHBvaW50LmNsb25lKCksIGZhbHNlKTsKKwkJdmFyIHB0cyA9IGVkZ2UuYWJzb2x1dGVQb2ludHM7CisJCXZhciBwdDAgPSBwdHNbMF07CisJCXZhciBwdDEgPSBwdHNbMV07CisKKwkJdmFyIHJlc3VsdCA9IFtdOworCQkKKwkJZm9yICh2YXIgaSA9IDI7IGkgPCBwdHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBwdDIgPSBwdHNbaV07CisJCQorCQkJLy8gTWVyZ2VzIGFkamFjZW50IHNlZ21lbnRzIG9ubHkgaWYgbW9yZSB0aGFuIDIgdG8gYWxsb3cgZm9yIHN0cmFpZ2h0IGVkZ2VzCisJCQlpZiAoKE1hdGgucm91bmQocHQwLnggLSBwdDEueCkgIT0gMCB8fCBNYXRoLnJvdW5kKHB0MS54IC0gcHQyLngpICE9IDApICYmCisJCQkJKE1hdGgucm91bmQocHQwLnkgLSBwdDEueSkgIT0gMCB8fCBNYXRoLnJvdW5kKHB0MS55IC0gcHQyLnkpICE9IDApKQorCQkJeworCQkJCXJlc3VsdC5wdXNoKHRoaXMuY29udmVydFBvaW50KHB0MS5jbG9uZSgpLCBmYWxzZSkpOworCQkJfQorCisJCQlwdDAgPSBwdDE7CisJCQlwdDEgPSBwdDI7CisJCX0KKwkJCisJCXZhciBzb3VyY2UgPSB0aGlzLnN0YXRlLmdldFZpc2libGVUZXJtaW5hbFN0YXRlKHRydWUpOworCQl2YXIgdGFyZ2V0ID0gdGhpcy5zdGF0ZS5nZXRWaXNpYmxlVGVybWluYWxTdGF0ZShmYWxzZSk7CisJCXZhciBycHRzID0gdGhpcy5zdGF0ZS5hYnNvbHV0ZVBvaW50czsKKwkJCisJCS8vIEEgc3RyYWlnaHQgbGluZSBpcyByZXByZXNlbnRlZCBieSAzIGhhbmRsZXMKKwkJaWYgKHJlc3VsdC5sZW5ndGggPT0gMCAmJiAoTWF0aC5yb3VuZChwdHNbMF0ueCAtIHB0c1twdHMubGVuZ3RoIC0gMV0ueCkgPT0gMCB8fAorCQkJTWF0aC5yb3VuZChwdHNbMF0ueSAtIHB0c1twdHMubGVuZ3RoIC0gMV0ueSkgPT0gMCkpCisJCXsKKwkJCXJlc3VsdCA9IFtwb2ludCwgcG9pbnRdOworCQl9CisJCS8vIEhhbmRsZXMgc3BlY2lhbCBjYXNlIG9mIHRyYW5zaXRpb25zIGZyb20gc3RyYWlnaHQgdmVydGljYWwgdG8gcm91dGVkCisJCWVsc2UgaWYgKHB0cy5sZW5ndGggPT0gNSAmJiByZXN1bHQubGVuZ3RoID09IDIgJiYgc291cmNlICE9IG51bGwgJiYgdGFyZ2V0ICE9IG51bGwgJiYKKwkJCQlycHRzICE9IG51bGwgJiYgTWF0aC5yb3VuZChycHRzWzBdLnggLSBycHRzW3JwdHMubGVuZ3RoIC0gMV0ueCkgPT0gMCkKKwkJeworCQkJdmFyIHZpZXcgPSB0aGlzLmdyYXBoLmdldFZpZXcoKTsKKwkJCXZhciBzY2FsZSA9IHZpZXcuZ2V0U2NhbGUoKTsKKwkJCXZhciB0ciA9IHZpZXcuZ2V0VHJhbnNsYXRlKCk7CisJCQkKKwkJCXZhciB5MCA9IHZpZXcuZ2V0Um91dGluZ0NlbnRlclkoc291cmNlKSAvIHNjYWxlIC0gdHIueTsKKwkJCQorCQkJLy8gVXNlIGZpeGVkIGNvbm5lY3Rpb24gcG9pbnQgeS1jb29yZGluYXRlIGlmIG9uZSBleGlzdHMKKwkJCXZhciBzYyA9IHRoaXMuZ3JhcGguZ2V0Q29ubmVjdGlvbkNvbnN0cmFpbnQoZWRnZSwgc291cmNlLCB0cnVlKTsKKwkJCQorCQkJaWYgKHNjICE9IG51bGwpCisJCQl7CisJCQkJdmFyIHB0ID0gdGhpcy5ncmFwaC5nZXRDb25uZWN0aW9uUG9pbnQoc291cmNlLCBzYyk7CisJCQkJCisJCQkJaWYgKHB0ICE9IG51bGwpCisJCQkJeworCQkJCQl0aGlzLmNvbnZlcnRQb2ludChwdCwgZmFsc2UpOworCQkJCQl5MCA9IHB0Lnk7CisJCQkJfQorCQkJfQorCQkJCisJCQl2YXIgeWUgPSB2aWV3LmdldFJvdXRpbmdDZW50ZXJZKHRhcmdldCkgLyBzY2FsZSAtIHRyLnk7CisJCQkKKwkJCS8vIFVzZSBmaXhlZCBjb25uZWN0aW9uIHBvaW50IHktY29vcmRpbmF0ZSBpZiBvbmUgZXhpc3RzCisJCQl2YXIgdGMgPSB0aGlzLmdyYXBoLmdldENvbm5lY3Rpb25Db25zdHJhaW50KGVkZ2UsIHRhcmdldCwgZmFsc2UpOworCQkJCisJCQlpZiAodGMpCisJCQl7CisJCQkJdmFyIHB0ID0gdGhpcy5ncmFwaC5nZXRDb25uZWN0aW9uUG9pbnQodGFyZ2V0LCB0Yyk7CisJCQkJCisJCQkJaWYgKHB0ICE9IG51bGwpCisJCQkJeworCQkJCQl0aGlzLmNvbnZlcnRQb2ludChwdCwgZmFsc2UpOworCQkJCQl5ZSA9IHB0Lnk7CisJCQkJfQorCQkJfQorCQkJCisJCQlyZXN1bHQgPSBbbmV3IG14UG9pbnQocG9pbnQueCwgeTApLCBuZXcgbXhQb2ludChwb2ludC54LCB5ZSldOworCQl9CisKKwkJdGhpcy5wb2ludHMgPSByZXN1bHQ7CisKKwkJLy8gTEFURVI6IENoZWNrIGlmIHBvaW50cyBhbmQgcmVzdWx0IGFyZSBkaWZmZXJlbnQKKwkJZWRnZS52aWV3LnVwZGF0ZUZpeGVkVGVybWluYWxQb2ludHMoZWRnZSwgc291cmNlLCB0YXJnZXQpOworCQllZGdlLnZpZXcudXBkYXRlUG9pbnRzKGVkZ2UsIHRoaXMucG9pbnRzLCBzb3VyY2UsIHRhcmdldCk7CisJCWVkZ2Uudmlldy51cGRhdGVGbG9hdGluZ1Rlcm1pbmFsUG9pbnRzKGVkZ2UsIHNvdXJjZSwgdGFyZ2V0KTsKKwl9Cit9OworCisvKioKKyAqIE92ZXJyaWRlbiB0byBtZXJnZSBlZGdlIHNlZ21lbnRzLgorICovCitteEVkZ2VTZWdtZW50SGFuZGxlci5wcm90b3R5cGUuY29ubmVjdCA9IGZ1bmN0aW9uKGVkZ2UsIHRlcm1pbmFsLCBpc1NvdXJjZSwgaXNDbG9uZSwgbWUpCit7CisJLy8gTWVyZ2VzIGFkamFjZW50IGVkZ2Ugc2VnbWVudHMKKwl2YXIgcHRzID0gdGhpcy5hYnNwb2ludHM7CisJdmFyIHB0MCA9IHB0c1swXTsKKwl2YXIgcHQxID0gcHRzWzFdOworCXZhciByZXN1bHQgPSBbXTsKKwkKKwlmb3IgKHZhciBpID0gMjsgaSA8IHB0cy5sZW5ndGg7IGkrKykKKwl7CisJCXZhciBwdDIgPSBwdHNbaV07CisJCisJCS8vIE1lcmdlcyBhZGphY2VudCBzZWdtZW50cyBvbmx5IGlmIG1vcmUgdGhhbiAyIHRvIGFsbG93IGZvciBzdHJhaWdodCBlZGdlcworCQlpZiAoKE1hdGgucm91bmQocHQwLnggLSBwdDEueCkgIT0gMCB8fCBNYXRoLnJvdW5kKHB0MS54IC0gcHQyLngpICE9IDApICYmCisJCQkoTWF0aC5yb3VuZChwdDAueSAtIHB0MS55KSAhPSAwIHx8IE1hdGgucm91bmQocHQxLnkgLSBwdDIueSkgIT0gMCkpCisJCXsKKwkJCXJlc3VsdC5wdXNoKHRoaXMuY29udmVydFBvaW50KHB0MS5jbG9uZSgpLCBmYWxzZSkpOworCQl9CisKKwkJcHQwID0gcHQxOworCQlwdDEgPSBwdDI7CisJfQorCQorCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwkKKwltb2RlbC5iZWdpblVwZGF0ZSgpOworCXRyeQorCXsKKwkJdmFyIGdlbyA9IG1vZGVsLmdldEdlb21ldHJ5KGVkZ2UpOworCQkKKwkJaWYgKGdlbyAhPSBudWxsKQorCQl7CisJCQlnZW8gPSBnZW8uY2xvbmUoKTsKKwkJCWdlby5wb2ludHMgPSByZXN1bHQ7CisJCQkKKwkJCW1vZGVsLnNldEdlb21ldHJ5KGVkZ2UsIGdlbyk7CisJCX0KKwkJCisJCWVkZ2UgPSBteEVkZ2VIYW5kbGVyLnByb3RvdHlwZS5jb25uZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfQorCWZpbmFsbHkKKwl7CisJCW1vZGVsLmVuZFVwZGF0ZSgpOworCX0KKwkKKwlyZXR1cm4gZWRnZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFRvb2x0aXBGb3JOb2RlCisgKiAKKyAqIFJldHVybnMgbm8gdG9vbHRpcHMuCisgKi8KK214RWRnZVNlZ21lbnRIYW5kbGVyLnByb3RvdHlwZS5nZXRUb29sdGlwRm9yTm9kZSA9IGZ1bmN0aW9uKG5vZGUpCit7CisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVCZW5kcworICogCisgKiBBZGRzIGN1c3RvbSBiZW5kcyBmb3IgdGhlIGNlbnRlciBvZiBlYWNoIHNlZ21lbnQuCisgKi8KK214RWRnZVNlZ21lbnRIYW5kbGVyLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKHgsIHksIGluZGV4KQoreworCW14RWRnZUhhbmRsZXIucHJvdG90eXBlLnN0YXJ0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCisJaWYgKHRoaXMuYmVuZHNbaW5kZXhdICE9IG51bGwgJiYgIXRoaXMuaXNTb3VyY2UgJiYgIXRoaXMuaXNUYXJnZXQpCisJeworCQlteFV0aWxzLnNldE9wYWNpdHkodGhpcy5iZW5kc1tpbmRleF0ubm9kZSwgMTAwKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVCZW5kcworICogCisgKiBBZGRzIGN1c3RvbSBiZW5kcyBmb3IgdGhlIGNlbnRlciBvZiBlYWNoIHNlZ21lbnQuCisgKi8KK214RWRnZVNlZ21lbnRIYW5kbGVyLnByb3RvdHlwZS5jcmVhdGVCZW5kcyA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgYmVuZHMgPSBbXTsKKwkKKwkvLyBTb3VyY2UKKwl2YXIgYmVuZCA9IHRoaXMuY3JlYXRlSGFuZGxlU2hhcGUoMCk7CisJdGhpcy5pbml0QmVuZChiZW5kKTsKKwliZW5kLnNldEN1cnNvcihteENvbnN0YW50cy5DVVJTT1JfVEVSTUlOQUxfSEFORExFKTsKKwliZW5kcy5wdXNoKGJlbmQpOworCisJdmFyIHB0cyA9IHRoaXMuZ2V0Q3VycmVudFBvaW50cygpOworCisJLy8gV2F5cG9pbnRzIChzZWdtZW50IGhhbmRsZXMpCisJaWYgKHRoaXMuZ3JhcGguaXNDZWxsQmVuZGFibGUodGhpcy5zdGF0ZS5jZWxsKSkKKwl7CisJCWlmICh0aGlzLnBvaW50cyA9PSBudWxsKQorCQl7CisJCQl0aGlzLnBvaW50cyA9IFtdOworCQl9CisKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBwdHMubGVuZ3RoIC0gMTsgaSsrKQorCQl7CisJCQliZW5kID0gdGhpcy5jcmVhdGVWaXJ0dWFsQmVuZCgpOworCQkJYmVuZHMucHVzaChiZW5kKTsKKwkJCXZhciBob3Jpem9udGFsID0gTWF0aC5yb3VuZChwdHNbaV0ueCAtIHB0c1tpICsgMV0ueCkgPT0gMDsKKwkJCQorCQkJLy8gU3BlY2lhbCBjYXNlIHdoZXJlIGR5IGlzIDAgYXMgd2VsbAorCQkJaWYgKE1hdGgucm91bmQocHRzW2ldLnkgLSBwdHNbaSArIDFdLnkpID09IDAgJiYgaSA8IHB0cy5sZW5ndGggLSAyKQorCQkJeworCQkJCWhvcml6b250YWwgPSBNYXRoLnJvdW5kKHB0c1tpXS54IC0gcHRzW2kgKyAyXS54KSA9PSAwOworCQkJfQorCQkJCisJCQliZW5kLnNldEN1cnNvcigoaG9yaXpvbnRhbCkgPyAnY29sLXJlc2l6ZScgOiAncm93LXJlc2l6ZScpOworCQkJdGhpcy5wb2ludHMucHVzaChuZXcgbXhQb2ludCgwLDApKTsKKwkJfQorCX0KKworCS8vIFRhcmdldAorCXZhciBiZW5kID0gdGhpcy5jcmVhdGVIYW5kbGVTaGFwZShwdHMubGVuZ3RoKTsKKwl0aGlzLmluaXRCZW5kKGJlbmQpOworCWJlbmQuc2V0Q3Vyc29yKG14Q29uc3RhbnRzLkNVUlNPUl9URVJNSU5BTF9IQU5ETEUpOworCWJlbmRzLnB1c2goYmVuZCk7CisKKwlyZXR1cm4gYmVuZHM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWRyYXcKKyAqIAorICogT3ZlcnJpZGRlbiB0byBpbnZva2UgPHJlZnJlc2g+IGJlZm9yZSB0aGUgcmVkcmF3LgorICovCitteEVkZ2VTZWdtZW50SGFuZGxlci5wcm90b3R5cGUucmVkcmF3ID0gZnVuY3Rpb24oKQoreworCXRoaXMucmVmcmVzaCgpOworCW14RWRnZUhhbmRsZXIucHJvdG90eXBlLnJlZHJhdy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVkcmF3SW5uZXJCZW5kcworICogCisgKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3VzdG9tIGJlbmRzLgorICovCitteEVkZ2VTZWdtZW50SGFuZGxlci5wcm90b3R5cGUucmVkcmF3SW5uZXJCZW5kcyA9IGZ1bmN0aW9uKHAwLCBwZSkKK3sKKwlpZiAodGhpcy5ncmFwaC5pc0NlbGxCZW5kYWJsZSh0aGlzLnN0YXRlLmNlbGwpKQorCXsKKwkJdmFyIHB0cyA9IHRoaXMuZ2V0Q3VycmVudFBvaW50cygpOworCQkKKwkJaWYgKHB0cyAhPSBudWxsICYmIHB0cy5sZW5ndGggPiAxKQorCQl7CisJCQl2YXIgc3RyYWlnaHQgPSBmYWxzZTsKKwkJCQorCQkJLy8gUHV0cyBoYW5kbGUgaW4gdGhlIGNlbnRlciBvZiBzdHJhaWdodCBlZGdlcworCQkJaWYgKHB0cy5sZW5ndGggPT0gNCAmJiBNYXRoLnJvdW5kKHB0c1sxXS54IC0gcHRzWzJdLngpID09IDAgJiYgTWF0aC5yb3VuZChwdHNbMV0ueSAtIHB0c1syXS55KSA9PSAwKQorCQkJeworCQkJCXN0cmFpZ2h0ID0gdHJ1ZTsKKwkJCQkKKwkJCQlpZiAoTWF0aC5yb3VuZChwdHNbMF0ueSAtIHB0c1twdHMubGVuZ3RoIC0gMV0ueSkgPT0gMCkKKwkJCQl7CisJCQkJCXZhciBjeCA9IHB0c1swXS54ICsgKHB0c1twdHMubGVuZ3RoIC0gMV0ueCAtIHB0c1swXS54KSAvIDI7CisJCQkJCXB0c1sxXSA9IG5ldyBteFBvaW50KGN4LCBwdHNbMV0ueSk7CisJCQkJCXB0c1syXSA9IG5ldyBteFBvaW50KGN4LCBwdHNbMl0ueSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXZhciBjeSA9IHB0c1swXS55ICsgKHB0c1twdHMubGVuZ3RoIC0gMV0ueSAtIHB0c1swXS55KSAvIDI7CisJCQkJCXB0c1sxXSA9IG5ldyBteFBvaW50KHB0c1sxXS54LCBjeSk7CisJCQkJCXB0c1syXSA9IG5ldyBteFBvaW50KHB0c1syXS54LCBjeSk7CisJCQkJfQorCQkJfQorCQkJCisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHB0cy5sZW5ndGggLSAxOyBpKyspCisJCQl7CisJCQkJaWYgKHRoaXMuYmVuZHNbaSArIDFdICE9IG51bGwpCisJCQkJeworCQkgCQkJdmFyIHAwID0gcHRzW2ldOworCSAJCQkJdmFyIHBlID0gcHRzW2kgKyAxXTsKKwkJCSAJCXZhciBwdCA9IG5ldyBteFBvaW50KHAwLnggKyAocGUueCAtIHAwLngpIC8gMiwgcDAueSArIChwZS55IC0gcDAueSkgLyAyKTsKKwkJCSAJCXZhciBiID0gdGhpcy5iZW5kc1tpICsgMV0uYm91bmRzOworCQkJIAkJdGhpcy5iZW5kc1tpICsgMV0uYm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKE1hdGguZmxvb3IocHQueCAtIGIud2lkdGggLyAyKSwKKwkJCSAJCQkJTWF0aC5mbG9vcihwdC55IC0gYi5oZWlnaHQgLyAyKSwgYi53aWR0aCwgYi5oZWlnaHQpOworCQkJCSAJdGhpcy5iZW5kc1tpICsgMV0ucmVkcmF3KCk7CisJCQkJIAkKKwkJCQkgCWlmICh0aGlzLm1hbmFnZUxhYmVsSGFuZGxlKQorCQkJCQl7CisJCQkJCQl0aGlzLmNoZWNrTGFiZWxIYW5kbGUodGhpcy5iZW5kc1tpICsgMV0uYm91bmRzKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQorCQkJaWYgKHN0cmFpZ2h0KQorCQkJeworCQkJCW14VXRpbHMuc2V0T3BhY2l0eSh0aGlzLmJlbmRzWzFdLm5vZGUsIHRoaXMudmlydHVhbEJlbmRPcGFjaXR5KTsKKwkJCQlteFV0aWxzLnNldE9wYWNpdHkodGhpcy5iZW5kc1szXS5ub2RlLCB0aGlzLnZpcnR1YWxCZW5kT3BhY2l0eSk7CisJCQl9CisJCX0KKwl9Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhFbGJvd0VkZ2VIYW5kbGVyLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhFbGJvd0VkZ2VIYW5kbGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDhmMDQKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teEVsYm93RWRnZUhhbmRsZXIuanMKQEAgLTAsMCArMSwyMjkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14RWxib3dFZGdlSGFuZGxlcgorICoKKyAqIEdyYXBoIGV2ZW50IGhhbmRsZXIgdGhhdCByZWNvbm5lY3RzIGVkZ2VzIGFuZCBtb2RpZmllcyBjb250cm9sIHBvaW50cyBhbmQKKyAqIHRoZSBlZGdlIGxhYmVsIGxvY2F0aW9uLiBVc2VzIDxteFRlcm1pbmFsTWFya2VyPiBmb3IgZmluZGluZyBhbmQKKyAqIGhpZ2hsaWdodGluZyBuZXcgc291cmNlIGFuZCB0YXJnZXQgdmVydGljZXMuIFRoaXMgaGFuZGxlciBpcyBhdXRvbWF0aWNhbGx5CisgKiBjcmVhdGVkIGluIDxteEdyYXBoLmNyZWF0ZUhhbmRsZXI+LiBJdCBleHRlbmRzIDxteEVkZ2VIYW5kbGVyPi4KKyAqIAorICogQ29uc3RydWN0b3I6IG14RWRnZUhhbmRsZXIKKyAqCisgKiBDb25zdHJ1Y3RzIGFuIGVkZ2UgaGFuZGxlciBmb3IgdGhlIHNwZWNpZmllZCA8bXhDZWxsU3RhdGU+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gb2YgdGhlIGNlbGwgdG8gYmUgbW9kaWZpZWQuCisgKi8KK2Z1bmN0aW9uIG14RWxib3dFZGdlSGFuZGxlcihzdGF0ZSkKK3sKKwlteEVkZ2VIYW5kbGVyLmNhbGwodGhpcywgc3RhdGUpOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14RWRnZUhhbmRsZXIuCisgKi8KK214VXRpbHMuZXh0ZW5kKG14RWxib3dFZGdlSGFuZGxlciwgbXhFZGdlSGFuZGxlcik7CisKKy8qKgorICogU3BlY2lmaWVzIGlmIGEgZG91YmxlIGNsaWNrIG9uIHRoZSBtaWRkbGUgaGFuZGxlIHNob3VsZCBjYWxsCisgKiA8bXhHcmFwaC5mbGlwRWRnZT4uIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhFbGJvd0VkZ2VIYW5kbGVyLnByb3RvdHlwZS5mbGlwRW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGRvdWJsZUNsaWNrT3JpZW50YXRpb25SZXNvdXJjZQorICogCisgKiBTcGVjaWZpZXMgdGhlIHJlc291cmNlIGtleSBmb3IgdGhlIHRvb2x0aXAgdG8gYmUgZGlzcGxheWVkIG9uIHRoZSBzaW5nbGUKKyAqIGNvbnRyb2wgcG9pbnQgZm9yIHJvdXRlZCBlZGdlcy4gSWYgdGhlIHJlc291cmNlIGZvciB0aGlzIGtleSBkb2VzIG5vdAorICogZXhpc3QgdGhlbiB0aGUgdmFsdWUgaXMgdXNlZCBhcyB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdCBpcworICogJ2RvdWJsZUNsaWNrT3JpZW50YXRpb24nLgorICovCitteEVsYm93RWRnZUhhbmRsZXIucHJvdG90eXBlLmRvdWJsZUNsaWNrT3JpZW50YXRpb25SZXNvdXJjZSA9CisJKG14Q2xpZW50Lmxhbmd1YWdlICE9ICdub25lJykgPyAnZG91YmxlQ2xpY2tPcmllbnRhdGlvbicgOiAnJzsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlQmVuZHMKKyAqIAorICogT3ZlcnJpZGVzIDxteEVkZ2VIYW5kbGVyLmNyZWF0ZUJlbmRzPiB0byBjcmVhdGUgY3VzdG9tIGJlbmRzLgorICovCisgbXhFbGJvd0VkZ2VIYW5kbGVyLnByb3RvdHlwZS5jcmVhdGVCZW5kcyA9IGZ1bmN0aW9uKCkKKyB7CisJdmFyIGJlbmRzID0gW107CisJCisJLy8gU291cmNlCisJdmFyIGJlbmQgPSB0aGlzLmNyZWF0ZUhhbmRsZVNoYXBlKDApOworCXRoaXMuaW5pdEJlbmQoYmVuZCk7CisJYmVuZC5zZXRDdXJzb3IobXhDb25zdGFudHMuQ1VSU09SX1RFUk1JTkFMX0hBTkRMRSk7CisJYmVuZHMucHVzaChiZW5kKTsKKworCS8vIFZpcnR1YWwKKwliZW5kcy5wdXNoKHRoaXMuY3JlYXRlVmlydHVhbEJlbmQobXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwl7CisJCWlmICghbXhFdmVudC5pc0NvbnN1bWVkKGV2dCkgJiYgdGhpcy5mbGlwRW5hYmxlZCkKKwkJeworCQkJdGhpcy5ncmFwaC5mbGlwRWRnZSh0aGlzLnN0YXRlLmNlbGwsIGV2dCk7CisJCQlteEV2ZW50LmNvbnN1bWUoZXZ0KTsKKwkJfQorCX0pKSk7CisJdGhpcy5wb2ludHMucHVzaChuZXcgbXhQb2ludCgwLDApKTsKKworCS8vIFRhcmdldAorCWJlbmQgPSB0aGlzLmNyZWF0ZUhhbmRsZVNoYXBlKDIpOworCXRoaXMuaW5pdEJlbmQoYmVuZCk7CisJYmVuZC5zZXRDdXJzb3IobXhDb25zdGFudHMuQ1VSU09SX1RFUk1JTkFMX0hBTkRMRSk7CisJYmVuZHMucHVzaChiZW5kKTsKKwkKKwlyZXR1cm4gYmVuZHM7CisgfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlVmlydHVhbEJlbmQKKyAqIAorICogQ3JlYXRlcyBhIHZpcnR1YWwgYmVuZCB0aGF0IHN1cHBvcnRzIGRvdWJsZSBjbGlja2luZyBhbmQgY2FsbHMKKyAqIDxteEdyYXBoLmZsaXBFZGdlPi4KKyAqLworbXhFbGJvd0VkZ2VIYW5kbGVyLnByb3RvdHlwZS5jcmVhdGVWaXJ0dWFsQmVuZCA9IGZ1bmN0aW9uKGRibENsaWNrSGFuZGxlcikKK3sKKwl2YXIgYmVuZCA9IHRoaXMuY3JlYXRlSGFuZGxlU2hhcGUoKTsKKwl0aGlzLmluaXRCZW5kKGJlbmQsIGRibENsaWNrSGFuZGxlcik7CisKKwliZW5kLnNldEN1cnNvcih0aGlzLmdldEN1cnNvckZvckJlbmQoKSk7CisKKwlpZiAoIXRoaXMuZ3JhcGguaXNDZWxsQmVuZGFibGUodGhpcy5zdGF0ZS5jZWxsKSkKKwl7CisJCWJlbmQubm9kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworCX0KKworCXJldHVybiBiZW5kOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q3Vyc29yRm9yQmVuZAorICogCisgKiBSZXR1cm5zIHRoZSBjdXJzb3IgdG8gYmUgdXNlZCBmb3IgdGhlIGJlbmQuCisgKi8KK214RWxib3dFZGdlSGFuZGxlci5wcm90b3R5cGUuZ2V0Q3Vyc29yRm9yQmVuZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gKHRoaXMuc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRURHRV0gPT0gbXhFZGdlU3R5bGUuVG9wVG9Cb3R0b20gfHwKKwkJdGhpcy5zdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9FREdFXSA9PSBteENvbnN0YW50cy5FREdFU1RZTEVfVE9QVE9CT1RUT00gfHwKKwkJKCh0aGlzLnN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0VER0VdID09IG14RWRnZVN0eWxlLkVsYm93Q29ubmVjdG9yIHx8CisJCXRoaXMuc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRURHRV0gPT0gbXhDb25zdGFudHMuRURHRVNUWUxFX0VMQk9XKSYmCisJCXRoaXMuc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRUxCT1ddID09IG14Q29uc3RhbnRzLkVMQk9XX1ZFUlRJQ0FMKSkgPyAKKwkJJ3Jvdy1yZXNpemUnIDogJ2NvbC1yZXNpemUnOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0VG9vbHRpcEZvck5vZGUKKyAqIAorICogUmV0dXJucyB0aGUgdG9vbHRpcCBmb3IgdGhlIGdpdmVuIG5vZGUuCisgKi8KK214RWxib3dFZGdlSGFuZGxlci5wcm90b3R5cGUuZ2V0VG9vbHRpcEZvck5vZGUgPSBmdW5jdGlvbihub2RlKQoreworCXZhciB0aXAgPSBudWxsOworCQorCWlmICh0aGlzLmJlbmRzICE9IG51bGwgJiYgdGhpcy5iZW5kc1sxXSAhPSBudWxsICYmIChub2RlID09IHRoaXMuYmVuZHNbMV0ubm9kZSB8fAorCQlub2RlLnBhcmVudE5vZGUgPT0gdGhpcy5iZW5kc1sxXS5ub2RlKSkKKwl7CisJCXRpcCA9IHRoaXMuZG91YmxlQ2xpY2tPcmllbnRhdGlvblJlc291cmNlOworCQl0aXAgPSBteFJlc291cmNlcy5nZXQodGlwKSB8fCB0aXA7IC8vIHRyYW5zbGF0ZQorCX0KKworCXJldHVybiB0aXA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjb252ZXJ0UG9pbnQKKyAqIAorICogQ29udmVydHMgdGhlIGdpdmVuIHBvaW50IGluLXBsYWNlIGZyb20gc2NyZWVuIHRvIHVuc2NhbGVkLCB1bnRyYW5zbGF0ZWQKKyAqIGdyYXBoIGNvb3JkaW5hdGVzIGFuZCBhcHBsaWVzIHRoZSBncmlkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwb2ludCAtIDxteFBvaW50PiB0byBiZSBjb252ZXJ0ZWQuCisgKiBncmlkRW5hYmxlZCAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIGdyaWQgc2hvdWxkIGJlIGFwcGxpZWQuCisgKi8KK214RWxib3dFZGdlSGFuZGxlci5wcm90b3R5cGUuY29udmVydFBvaW50ID0gZnVuY3Rpb24ocG9pbnQsIGdyaWRFbmFibGVkKQoreworCXZhciBzY2FsZSA9IHRoaXMuZ3JhcGguZ2V0VmlldygpLmdldFNjYWxlKCk7CisJdmFyIHRyID0gdGhpcy5ncmFwaC5nZXRWaWV3KCkuZ2V0VHJhbnNsYXRlKCk7CisJdmFyIG9yaWdpbiA9IHRoaXMuc3RhdGUub3JpZ2luOworCQorCWlmIChncmlkRW5hYmxlZCkKKwl7CisJCXBvaW50LnggPSB0aGlzLmdyYXBoLnNuYXAocG9pbnQueCk7CisJCXBvaW50LnkgPSB0aGlzLmdyYXBoLnNuYXAocG9pbnQueSk7CisJfQorCQorCXBvaW50LnggPSBNYXRoLnJvdW5kKHBvaW50LnggLyBzY2FsZSAtIHRyLnggLSBvcmlnaW4ueCk7CisJcG9pbnQueSA9IE1hdGgucm91bmQocG9pbnQueSAvIHNjYWxlIC0gdHIueSAtIG9yaWdpbi55KTsKKwkKKwlyZXR1cm4gcG9pbnQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWRyYXdJbm5lckJlbmRzCisgKiAKKyAqIFVwZGF0ZXMgYW5kIHJlZHJhd3MgdGhlIGlubmVyIGJlbmRzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwMCAtIDxteFBvaW50PiB0aGF0IHJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBwb2ludC4KKyAqIHBlIC0gPG14UG9pbnQ+IHRoYXQgcmVwcmVzZW50cyB0aGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgcG9pbnQuCisgKi8KK214RWxib3dFZGdlSGFuZGxlci5wcm90b3R5cGUucmVkcmF3SW5uZXJCZW5kcyA9IGZ1bmN0aW9uKHAwLCBwZSkKK3sKKwl2YXIgZyA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5nZXRHZW9tZXRyeSh0aGlzLnN0YXRlLmNlbGwpOworCXZhciBwdHMgPSB0aGlzLnN0YXRlLmFic29sdXRlUG9pbnRzOworCXZhciBwdCA9IG51bGw7CisKKwkvLyBLZWVwcyB0aGUgdmlydHVhbCBiZW5kIG9uIHRoZSBlZGdlIHNoYXBlCisJaWYgKHB0cy5sZW5ndGggPiAxKQorCXsKKwkJcDAgPSBwdHNbMV07CisJCXBlID0gcHRzW3B0cy5sZW5ndGggLSAyXTsKKwl9CisJZWxzZSBpZiAoZy5wb2ludHMgIT0gbnVsbCAmJiBnLnBvaW50cy5sZW5ndGggPiAwKQorCXsKKwkJcHQgPSBwdHNbMF07CisJfQorCQorCWlmIChwdCA9PSBudWxsKQorCXsKKwkJcHQgPSBuZXcgbXhQb2ludChwMC54ICsgKHBlLnggLSBwMC54KSAvIDIsIHAwLnkgKyAocGUueSAtIHAwLnkpIC8gMik7CisJfQorCWVsc2UKKwl7CisJCXB0ID0gbmV3IG14UG9pbnQodGhpcy5ncmFwaC5nZXRWaWV3KCkuc2NhbGUgKiAocHQueCArIHRoaXMuZ3JhcGguZ2V0VmlldygpLnRyYW5zbGF0ZS54ICsgdGhpcy5zdGF0ZS5vcmlnaW4ueCksCisJCQkJdGhpcy5ncmFwaC5nZXRWaWV3KCkuc2NhbGUgKiAocHQueSArIHRoaXMuZ3JhcGguZ2V0VmlldygpLnRyYW5zbGF0ZS55ICsgdGhpcy5zdGF0ZS5vcmlnaW4ueSkpOworCX0KKworCS8vIE1ha2VzIGhhbmRsZSBzbGlnaHRseSBiaWdnZXIgaWYgdGhlIHllbGxvdyAgbGFiZWwgaGFuZGxlCisJLy8gZXhpc3RzIGFuZCBpbnRlcnNlY3RzIHRoaXMgZ3JlZW4gaGFuZGxlCisJdmFyIGIgPSB0aGlzLmJlbmRzWzFdLmJvdW5kczsKKwl2YXIgdyA9IGIud2lkdGg7CisJdmFyIGggPSBiLmhlaWdodDsKKwl2YXIgYm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKE1hdGgucm91bmQocHQueCAtIHcgLyAyKSwgTWF0aC5yb3VuZChwdC55IC0gaCAvIDIpLCB3LCBoKTsKKworCWlmICh0aGlzLm1hbmFnZUxhYmVsSGFuZGxlKQorCXsKKwkJdGhpcy5jaGVja0xhYmVsSGFuZGxlKGJvdW5kcyk7CisJfQorCWVsc2UgaWYgKHRoaXMuaGFuZGxlSW1hZ2UgPT0gbnVsbCAmJiB0aGlzLmxhYmVsU2hhcGUudmlzaWJsZSAmJiBteFV0aWxzLmludGVyc2VjdHMoYm91bmRzLCB0aGlzLmxhYmVsU2hhcGUuYm91bmRzKSkKKwl7CisJCXcgPSBteENvbnN0YW50cy5IQU5ETEVfU0laRSArIDM7CisJCWggPSBteENvbnN0YW50cy5IQU5ETEVfU0laRSArIDM7CisJCWJvdW5kcyA9IG5ldyBteFJlY3RhbmdsZShNYXRoLmZsb29yKHB0LnggLSB3IC8gMiksIE1hdGguZmxvb3IocHQueSAtIGggLyAyKSwgdywgaCk7CisJfQorCisJdGhpcy5iZW5kc1sxXS5ib3VuZHMgPSBib3VuZHM7CisJdGhpcy5iZW5kc1sxXS5yZWRyYXcoKTsKKwkKKwlpZiAodGhpcy5tYW5hZ2VMYWJlbEhhbmRsZSkKKwl7CisJCXRoaXMuY2hlY2tMYWJlbEhhbmRsZSh0aGlzLmJlbmRzWzFdLmJvdW5kcyk7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214R3JhcGhIYW5kbGVyLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhHcmFwaEhhbmRsZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxOWQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214R3JhcGhIYW5kbGVyLmpzCkBAIC0wLDAgKzEsMTA3NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhHcmFwaEhhbmRsZXIKKyAqIAorICogR3JhcGggZXZlbnQgaGFuZGxlciB0aGF0IGhhbmRsZXMgc2VsZWN0aW9uLiBJbmRpdmlkdWFsIGNlbGxzIGFyZSBoYW5kbGVkCisgKiBzZXBhcmF0ZWx5IHVzaW5nIDxteFZlcnRleEhhbmRsZXI+IG9yIG9uZSBvZiB0aGUgZWRnZSBoYW5kbGVycy4gVGhlc2UKKyAqIGhhbmRsZXJzIGFyZSBjcmVhdGVkIHVzaW5nIDxteEdyYXBoLmNyZWF0ZUhhbmRsZXI+IGluCisgKiA8bXhHcmFwaFNlbGVjdGlvbk1vZGVsLmNlbGxBZGRlZD4uCisgKiAKKyAqIFRvIGF2b2lkIHRoZSBjb250YWluZXIgdG8gc2Nyb2xsIGEgbW92ZWQgY2VsbCBpbnRvIHZpZXcsIHNldAorICogPHNjcm9sbEFmdGVyTW92ZT4gdG8gZmFsc2UuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteEdyYXBoSGFuZGxlcgorICogCisgKiBDb25zdHJ1Y3RzIGFuIGV2ZW50IGhhbmRsZXIgdGhhdCBjcmVhdGVzIGhhbmRsZXMgZm9yIHRoZQorICogc2VsZWN0aW9uIGNlbGxzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBncmFwaCAtIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEdyYXBoPi4KKyAqLworZnVuY3Rpb24gbXhHcmFwaEhhbmRsZXIoZ3JhcGgpCit7CisJdGhpcy5ncmFwaCA9IGdyYXBoOworCXRoaXMuZ3JhcGguYWRkTW91c2VMaXN0ZW5lcih0aGlzKTsKKwkKKwkvLyBSZXBhaW50cyB0aGUgaGFuZGxlciBhZnRlciBhdXRvc2Nyb2xsCisJdGhpcy5wYW5IYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKCkKKwl7CisJCXRoaXMudXBkYXRlUHJldmlld1NoYXBlKCk7CisJCXRoaXMudXBkYXRlSGludCgpOworCX0pOworCQorCXRoaXMuZ3JhcGguYWRkTGlzdGVuZXIobXhFdmVudC5QQU4sIHRoaXMucGFuSGFuZGxlcik7CisJCisJLy8gSGFuZGxlcyBlc2NhcGUga2V5c3Ryb2tlcworCXRoaXMuZXNjYXBlSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihzZW5kZXIsIGV2dCkKKwl7CisJCXRoaXMucmVzZXQoKTsKKwl9KTsKKwkKKwl0aGlzLmdyYXBoLmFkZExpc3RlbmVyKG14RXZlbnQuRVNDQVBFLCB0aGlzLmVzY2FwZUhhbmRsZXIpOworfTsKKworLyoqCisgKiBWYXJpYWJsZTogZ3JhcGgKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgPG14R3JhcGg+LgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUuZ3JhcGggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBtYXhDZWxscworICogCisgKiBEZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjZWxscyB0byBwYWludCBzdWJoYW5kbGVzCisgKiBmb3IuIERlZmF1bHQgaXMgNTAgZm9yIEZpcmVmb3ggYW5kIDIwIGZvciBJRS4gU2V0IHRoaXMKKyAqIHRvIDAgaWYgeW91IHdhbnQgYW4gdW5saW1pdGVkIG51bWJlciBvZiBoYW5kbGVzIHRvIGJlCisgKiBkaXNwbGF5ZWQuIFRoaXMgaXMgb25seSByZWNvbW1lbmRlZCBpZiB0aGUgbnVtYmVyIG9mCisgKiBjZWxscyBpbiB0aGUgZ3JhcGggaXMgbGltaXRlZCB0byBhIHNtYWxsIG51bWJlciwgZWcuCisgKiA1MDAuCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5tYXhDZWxscyA9IChteENsaWVudC5JU19JRSkgPyAyMCA6IDUwOworCisvKioKKyAqIFZhcmlhYmxlOiBlbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiBldmVudHMgYXJlIGhhbmRsZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLmVuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBoaWdobGlnaHRFbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiBkcm9wIHRhcmdldHMgdW5kZXIgdGhlIG1vdXNlIHNob3VsZCBiZSBlbmFibGVkLiBEZWZhdWx0IGlzCisgKiB0cnVlLgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUuaGlnaGxpZ2h0RW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGNsb25lRW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgY2xvbmluZyBieSBjb250cm9sLWRyYWcgaXMgZW5hYmxlZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUuY2xvbmVFbmFibGVkID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogbW92ZUVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIG1vdmluZyBpcyBlbmFibGVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5tb3ZlRW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGd1aWRlc0VuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIG90aGVyIGNlbGxzIHNob3VsZCBiZSB1c2VkIGZvciBzbmFwcGluZyB0aGUgcmlnaHQsIGNlbnRlciBvcgorICogbGVmdCBzaWRlIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLmd1aWRlc0VuYWJsZWQgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogZ3VpZGUKKyAqIAorICogSG9sZHMgdGhlIDxteEd1aWRlPiBpbnN0YW5jZSB0aGF0IGlzIHVzZWQgZm9yIGFsaWdubWVudC4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLmd1aWRlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogY3VycmVudER4CisgKiAKKyAqIFN0b3JlcyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBjdXJyZW50IG1vdXNlIG1vdmUuCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5jdXJyZW50RHggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjdXJyZW50RHkKKyAqIAorICogU3RvcmVzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGN1cnJlbnQgbW91c2UgbW92ZS4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLmN1cnJlbnREeSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHVwZGF0ZUN1cnNvcgorICogCisgKiBTcGVjaWZpZXMgaWYgYSBtb3ZlIGN1cnNvciBzaG91bGQgYmUgc2hvd24gaWYgdGhlIG1vdXNlIGlzIG92ZXIgYSBtb3ZhYmxlCisgKiBjZWxsLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS51cGRhdGVDdXJzb3IgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBzZWxlY3RFbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiBzZWxlY3RpbmcgaXMgZW5hYmxlZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUuc2VsZWN0RW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHJlbW92ZUNlbGxzRnJvbVBhcmVudAorICogCisgKiBTcGVjaWZpZXMgaWYgY2VsbHMgbWF5IGJlIG1vdmVkIG91dCBvZiB0aGVpciBwYXJlbnRzLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5yZW1vdmVDZWxsc0Zyb21QYXJlbnQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBjb25uZWN0T25Ecm9wCisgKiAKKyAqIFNwZWNpZmllcyBpZiBkcm9wIGV2ZW50cyBhcmUgaW50ZXJwcmV0ZWQgYXMgbmV3IGNvbm5lY3Rpb25zIGlmIG5vIG90aGVyCisgKiBkcm9wIGFjdGlvbiBpcyBkZWZpbmVkLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUuY29ubmVjdE9uRHJvcCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBzY3JvbGxPbk1vdmUKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSB2aWV3IHNob3VsZCBiZSBzY3JvbGxlZCBzbyB0aGF0IGEgbW92ZWQgY2VsbCBpcworICogdmlzaWJsZS4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUuc2Nyb2xsT25Nb3ZlID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogbWluaW11bVNpemUKKyAqIAorICogU3BlY2lmaWVzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBwaXhlbHMgZm9yIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIGEKKyAqIHNlbGVjdGlvbiBib3JkZXIuIERlZmF1bHQgaXMgNi4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLm1pbmltdW1TaXplID0gNjsKKworLyoqCisgKiBWYXJpYWJsZTogcHJldmlld0NvbG9yCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgY29sb3Igb2YgdGhlIHByZXZpZXcgc2hhcGUuIERlZmF1bHQgaXMgYmxhY2suCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5wcmV2aWV3Q29sb3IgPSAnYmxhY2snOworCisvKioKKyAqIFZhcmlhYmxlOiBodG1sUHJldmlldworICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIGdyYXBoIGNvbnRhaW5lciBzaG91bGQgYmUgdXNlZCBmb3IgcHJldmlldy4gSWYgdGhpcyBpcyB1c2VkCisgKiB0aGVuIGRyb3AgdGFyZ2V0IGRldGVjdGlvbiByZWxpZXMgZW50aXJlbHkgb24gPG14R3JhcGguZ2V0Q2VsbEF0PiBiZWNhdXNlCisgKiB0aGUgSFRNTCBwcmV2aWV3IGRvZXMgbm90ICJsZXQgZXZlbnRzIHRocm91Z2giLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUuaHRtbFByZXZpZXcgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogc2hhcGUKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSA8bXhTaGFwZT4gdGhhdCByZXByZXNlbnRzIHRoZSBwcmV2aWV3LgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUuc2hhcGUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzY2FsZUdyaWQKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBncmlkIHNob3VsZCBiZSBzY2FsZWQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5zY2FsZUdyaWQgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogcm90YXRpb25FbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgYm91bmRpbmcgYm94IHNob3VsZCBhbGxvdyBmb3Igcm90YXRpb24uIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLnJvdGF0aW9uRW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogRnVuY3Rpb246IGlzRW5hYmxlZAorICogCisgKiBSZXR1cm5zIDxlbmFibGVkPi4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5lbmFibGVkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0RW5hYmxlZAorICogCisgKiBTZXRzIDxlbmFibGVkPi4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLnNldEVuYWJsZWQgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmVuYWJsZWQgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQ2xvbmVFbmFibGVkCisgKiAKKyAqIFJldHVybnMgPGNsb25lRW5hYmxlZD4uCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5pc0Nsb25lRW5hYmxlZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5jbG9uZUVuYWJsZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRDbG9uZUVuYWJsZWQKKyAqIAorICogU2V0cyA8Y2xvbmVFbmFibGVkPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBCb29sZWFuIHRoYXQgc3BlY2lmaWVzIHRoZSBuZXcgY2xvbmUgZW5hYmxlZCBzdGF0ZS4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLnNldENsb25lRW5hYmxlZCA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuY2xvbmVFbmFibGVkID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc01vdmVFbmFibGVkCisgKiAKKyAqIFJldHVybnMgPG1vdmVFbmFibGVkPi4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLmlzTW92ZUVuYWJsZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMubW92ZUVuYWJsZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRNb3ZlRW5hYmxlZAorICogCisgKiBTZXRzIDxtb3ZlRW5hYmxlZD4uCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5zZXRNb3ZlRW5hYmxlZCA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMubW92ZUVuYWJsZWQgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzU2VsZWN0RW5hYmxlZAorICogCisgKiBSZXR1cm5zIDxzZWxlY3RFbmFibGVkPi4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLmlzU2VsZWN0RW5hYmxlZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5zZWxlY3RFbmFibGVkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0U2VsZWN0RW5hYmxlZAorICogCisgKiBTZXRzIDxzZWxlY3RFbmFibGVkPi4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLnNldFNlbGVjdEVuYWJsZWQgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLnNlbGVjdEVuYWJsZWQgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzUmVtb3ZlQ2VsbHNGcm9tUGFyZW50CisgKiAKKyAqIFJldHVybnMgPHJlbW92ZUNlbGxzRnJvbVBhcmVudD4uCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5pc1JlbW92ZUNlbGxzRnJvbVBhcmVudCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5yZW1vdmVDZWxsc0Zyb21QYXJlbnQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRSZW1vdmVDZWxsc0Zyb21QYXJlbnQKKyAqIAorICogU2V0cyA8cmVtb3ZlQ2VsbHNGcm9tUGFyZW50Pi4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLnNldFJlbW92ZUNlbGxzRnJvbVBhcmVudCA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMucmVtb3ZlQ2VsbHNGcm9tUGFyZW50ID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRJbml0aWFsQ2VsbEZvckV2ZW50CisgKiAKKyAqIEhvb2sgdG8gcmV0dXJuIGluaXRpYWwgY2VsbCBmb3IgdGhlIGdpdmVuIGV2ZW50LgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUuZ2V0SW5pdGlhbENlbGxGb3JFdmVudCA9IGZ1bmN0aW9uKG1lKQoreworCXJldHVybiBtZS5nZXRDZWxsKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0RlbGF5ZWRTZWxlY3Rpb24KKyAqIAorICogSG9vayB0byByZXR1cm4gdHJ1ZSBmb3IgZGVsYXllZCBzZWxlY3Rpb25zLgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUuaXNEZWxheWVkU2VsZWN0aW9uID0gZnVuY3Rpb24oY2VsbCwgbWUpCit7CisJcmV0dXJuIHRoaXMuZ3JhcGguaXNDZWxsU2VsZWN0ZWQoY2VsbCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjb25zdW1lTW91c2VFdmVudAorICogCisgKiBDb25zdW1lcyB0aGUgZ2l2ZW4gbW91c2UgZXZlbnQuIE5PVEU6IFRoaXMgbWF5IGJlIHVzZWQgdG8gZW5hYmxlIGNsaWNrCisgKiBldmVudHMgZm9yIGxpbmtzIGluIGxhYmVscyBvbiBpT1MgYXMgZm9sbG93cyBhcyBjb25zdW1pbmcgdGhlIGluaXRpYWwKKyAqIHRvdWNoU3RhcnQgZGlzYWJsZXMgZmlyaW5nIHRoZSBzdWJzZXF1ZW50IGNsaWNrIGV2bmVudCBvbiB0aGUgbGluay4KKyAqIAorICogPGNvZGU+CisgKiBteEdyYXBoSGFuZGxlci5wcm90b3R5cGUuY29uc3VtZU1vdXNlRXZlbnQgPSBmdW5jdGlvbihldnROYW1lLCBtZSkKKyAqIHsKKyAqICAgdmFyIHNvdXJjZSA9IG14RXZlbnQuZ2V0U291cmNlKG1lLmdldEV2ZW50KCkpOworICogICAKKyAqICAgaWYgKCFteEV2ZW50LmlzVG91Y2hFdmVudChtZS5nZXRFdmVudCgpKSB8fCBzb3VyY2Uubm9kZU5hbWUgIT0gJ0EnKQorICogICB7CisgKiAgICAgbWUuY29uc3VtZSgpOworICogICB9CisgKiB9CisgKiA8L2NvZGU+CisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5jb25zdW1lTW91c2VFdmVudCA9IGZ1bmN0aW9uKGV2dE5hbWUsIG1lKQoreworCW1lLmNvbnN1bWUoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdXNlRG93bgorICogCisgKiBIYW5kbGVzIHRoZSBldmVudCBieSBzZWxlY2luZyB0aGUgZ2l2ZW4gY2VsbCBhbmQgY3JlYXRpbmcgYSBoYW5kbGUgZm9yCisgKiBpdC4gQnkgY29uc3VtaW5nIHRoZSBldmVudCBhbGwgc3Vic2VxdWVudCBldmVudHMgb2YgdGhlIGdlc3R1cmUgYXJlCisgKiByZWRpcmVjdGVkIHRvIHRoaXMgaGFuZGxlci4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLm1vdXNlRG93biA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJaWYgKCFtZS5pc0NvbnN1bWVkKCkgJiYgdGhpcy5pc0VuYWJsZWQoKSAmJiB0aGlzLmdyYXBoLmlzRW5hYmxlZCgpICYmCisJCW1lLmdldFN0YXRlKCkgIT0gbnVsbCAmJiAhbXhFdmVudC5pc011bHRpVG91Y2hFdmVudChtZS5nZXRFdmVudCgpKSkKKwl7CisJCXZhciBjZWxsID0gdGhpcy5nZXRJbml0aWFsQ2VsbEZvckV2ZW50KG1lKTsKKwkJdGhpcy5kZWxheWVkU2VsZWN0aW9uID0gdGhpcy5pc0RlbGF5ZWRTZWxlY3Rpb24oY2VsbCwgbWUpOworCQl0aGlzLmNlbGwgPSBudWxsOworCQkKKwkJaWYgKHRoaXMuaXNTZWxlY3RFbmFibGVkKCkgJiYgIXRoaXMuZGVsYXllZFNlbGVjdGlvbikKKwkJeworCQkJdGhpcy5ncmFwaC5zZWxlY3RDZWxsRm9yRXZlbnQoY2VsbCwgbWUuZ2V0RXZlbnQoKSk7CisJCX0KKworCQlpZiAodGhpcy5pc01vdmVFbmFibGVkKCkpCisJCXsKKwkJCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGgubW9kZWw7CisJCQl2YXIgZ2VvID0gbW9kZWwuZ2V0R2VvbWV0cnkoY2VsbCk7CisKKwkJCWlmICh0aGlzLmdyYXBoLmlzQ2VsbE1vdmFibGUoY2VsbCkgJiYgKCghbW9kZWwuaXNFZGdlKGNlbGwpIHx8IHRoaXMuZ3JhcGguZ2V0U2VsZWN0aW9uQ291bnQoKSA+IDEgfHwKKwkJCQkoZ2VvLnBvaW50cyAhPSBudWxsICYmIGdlby5wb2ludHMubGVuZ3RoID4gMCkgfHwgbW9kZWwuZ2V0VGVybWluYWwoY2VsbCwgdHJ1ZSkgPT0gbnVsbCB8fAorCQkJCW1vZGVsLmdldFRlcm1pbmFsKGNlbGwsIGZhbHNlKSA9PSBudWxsKSB8fCB0aGlzLmdyYXBoLmFsbG93RGFuZ2xpbmdFZGdlcyB8fCAKKwkJCQkodGhpcy5ncmFwaC5pc0Nsb25lRXZlbnQobWUuZ2V0RXZlbnQoKSkgJiYgdGhpcy5ncmFwaC5pc0NlbGxzQ2xvbmVhYmxlKCkpKSkKKwkJCXsKKwkJCQl0aGlzLnN0YXJ0KGNlbGwsIG1lLmdldFgoKSwgbWUuZ2V0WSgpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKHRoaXMuZGVsYXllZFNlbGVjdGlvbikKKwkJCXsKKwkJCQl0aGlzLmNlbGwgPSBjZWxsOworCQkJfQorCisJCQl0aGlzLmNlbGxXYXNDbGlja2VkID0gdHJ1ZTsKKwkJCXRoaXMuY29uc3VtZU1vdXNlRXZlbnQobXhFdmVudC5NT1VTRV9ET1dOLCBtZSk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRHdWlkZVN0YXRlcworICogCisgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGNlbGwgc3RhdGVzIHdoaWNoIHNob3VsZCBiZSB1c2VkIGFzIGd1aWRlcy4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLmdldEd1aWRlU3RhdGVzID0gZnVuY3Rpb24oKQoreworCXZhciBwYXJlbnQgPSB0aGlzLmdyYXBoLmdldERlZmF1bHRQYXJlbnQoKTsKKwl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCk7CisJCisJdmFyIGZpbHRlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihjZWxsKQorCXsKKwkJcmV0dXJuIHRoaXMuZ3JhcGgudmlldy5nZXRTdGF0ZShjZWxsKSAhPSBudWxsICYmCisJCQltb2RlbC5pc1ZlcnRleChjZWxsKSAmJgorCQkJbW9kZWwuZ2V0R2VvbWV0cnkoY2VsbCkgIT0gbnVsbCAmJgorCQkJIW1vZGVsLmdldEdlb21ldHJ5KGNlbGwpLnJlbGF0aXZlOworCX0pOworCQorCXJldHVybiB0aGlzLmdyYXBoLnZpZXcuZ2V0Q2VsbFN0YXRlcyhtb2RlbC5maWx0ZXJEZXNjZW5kYW50cyhmaWx0ZXIsIHBhcmVudCkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q2VsbHMKKyAqIAorICogUmV0dXJucyB0aGUgY2VsbHMgdG8gYmUgbW9kaWZpZWQgYnkgdGhpcyBoYW5kbGVyLiBUaGlzIGltcGxlbWVudGF0aW9uCisgKiByZXR1cm5zIGFsbCBzZWxlY3Rpb24gY2VsbHMgdGhhdCBhcmUgbW92YWJsZSwgb3IgdGhlIGdpdmVuIGluaXRpYWwgY2VsbCBpZgorICogdGhlIGdpdmVuIGNlbGwgaXMgbm90IHNlbGVjdGVkIGFuZCBtb3ZhYmxlLiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugb2YgbW92aW5nCisgKiB1bnNlbGVjdGFibGUgb3IgdW5zZWxlY3RlZCBjZWxscy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogaW5pdGlhbENlbGwgLSA8bXhDZWxsPiB0aGF0IHRyaWdnZXJlZCB0aGlzIGhhbmRsZXIuCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5nZXRDZWxscyA9IGZ1bmN0aW9uKGluaXRpYWxDZWxsKQoreworCWlmICghdGhpcy5kZWxheWVkU2VsZWN0aW9uICYmIHRoaXMuZ3JhcGguaXNDZWxsTW92YWJsZShpbml0aWFsQ2VsbCkpCisJeworCQlyZXR1cm4gW2luaXRpYWxDZWxsXTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIHRoaXMuZ3JhcGguZ2V0TW92YWJsZUNlbGxzKHRoaXMuZ3JhcGguZ2V0U2VsZWN0aW9uQ2VsbHMoKSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0UHJldmlld0JvdW5kcworICogCisgKiBSZXR1cm5zIHRoZSA8bXhSZWN0YW5nbGU+IHVzZWQgYXMgdGhlIHByZXZpZXcgYm91bmRzIGZvcgorICogbW92aW5nIHRoZSBnaXZlbiBjZWxscy4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLmdldFByZXZpZXdCb3VuZHMgPSBmdW5jdGlvbihjZWxscykKK3sKKwl2YXIgYm91bmRzID0gdGhpcy5nZXRCb3VuZGluZ0JveChjZWxscyk7CisJCisJaWYgKGJvdW5kcyAhPSBudWxsKQorCXsKKwkJLy8gQ29ycmVjdHMgd2lkdGggYW5kIGhlaWdodAorCQlib3VuZHMud2lkdGggPSBNYXRoLm1heCgwLCBib3VuZHMud2lkdGggLSAxKTsKKwkJYm91bmRzLmhlaWdodCA9IE1hdGgubWF4KDAsIGJvdW5kcy5oZWlnaHQgLSAxKTsKKwkJCisJCWlmIChib3VuZHMud2lkdGggPCB0aGlzLm1pbmltdW1TaXplKQorCQl7CisJCQl2YXIgZHggPSB0aGlzLm1pbmltdW1TaXplIC0gYm91bmRzLndpZHRoOworCQkJYm91bmRzLnggLT0gZHggLyAyOworCQkJYm91bmRzLndpZHRoID0gdGhpcy5taW5pbXVtU2l6ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJvdW5kcy54ID0gTWF0aC5yb3VuZChib3VuZHMueCk7CisJCQlib3VuZHMud2lkdGggPSBNYXRoLmNlaWwoYm91bmRzLndpZHRoKTsKKwkJfQorCQkKKwkJdmFyIHRyID0gdGhpcy5ncmFwaC52aWV3LnRyYW5zbGF0ZTsKKwkJdmFyIHMgPSB0aGlzLmdyYXBoLnZpZXcuc2NhbGU7CisJCQorCQlpZiAoYm91bmRzLmhlaWdodCA8IHRoaXMubWluaW11bVNpemUpCisJCXsKKwkJCXZhciBkeSA9IHRoaXMubWluaW11bVNpemUgLSBib3VuZHMuaGVpZ2h0OworCQkJYm91bmRzLnkgLT0gZHkgLyAyOworCQkJYm91bmRzLmhlaWdodCA9IHRoaXMubWluaW11bVNpemU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlib3VuZHMueSA9IE1hdGgucm91bmQoYm91bmRzLnkpOworCQkJYm91bmRzLmhlaWdodCA9IE1hdGguY2VpbChib3VuZHMuaGVpZ2h0KTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gYm91bmRzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Qm91bmRpbmdCb3gKKyAqIAorICogUmV0dXJucyB0aGUgdW5pb24gb2YgdGhlIDxteENlbGxTdGF0ZXM+IGZvciB0aGUgZ2l2ZW4gYXJyYXkgb2YgPG14Q2VsbHM+LgorICogRm9yIHZlcnRpY2VzLCB0aGlzIG1ldGhvZCB1c2VzIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2hhcGUKKyAqIGlmIG9uZSBleGlzdHMuIFRoZSBib3VuZGluZyBib3ggb2YgdGhlIGNvcnJlc3BvbmRpbmcgdGV4dCBsYWJlbCBhbmQgYWxsCisgKiBjb250cm9scyBhbmQgb3ZlcmxheXMgYXJlIGlnbm9yZWQuIFNlZSBhbHNvOiA8bXhHcmFwaFZpZXcuZ2V0Qm91bmRzPiBhbmQKKyAqIDxteEdyYXBoLmdldEJvdW5kaW5nQm94Pi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGNlbGxzIC0gQXJyYXkgb2YgPG14Q2VsbHM+IHdob3NlIGJvdW5kaW5nIGJveCBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5nZXRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uKGNlbGxzKQoreworCXZhciByZXN1bHQgPSBudWxsOworCQorCWlmIChjZWxscyAhPSBudWxsICYmIGNlbGxzLmxlbmd0aCA+IDApCisJeworCQl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCk7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorCQl7CisJCQlpZiAobW9kZWwuaXNWZXJ0ZXgoY2VsbHNbaV0pIHx8IG1vZGVsLmlzRWRnZShjZWxsc1tpXSkpCisJCQl7CisJCQkJdmFyIHN0YXRlID0gdGhpcy5ncmFwaC52aWV3LmdldFN0YXRlKGNlbGxzW2ldKTsKKwkJCQorCQkJCWlmIChzdGF0ZSAhPSBudWxsKQorCQkJCXsKKwkJCQkJdmFyIGJib3ggPSBzdGF0ZTsKKwkJCQkJCisJCQkJCWlmIChtb2RlbC5pc1ZlcnRleChjZWxsc1tpXSkgJiYgc3RhdGUuc2hhcGUgIT0gbnVsbCAmJiBzdGF0ZS5zaGFwZS5ib3VuZGluZ0JveCAhPSBudWxsKQorCQkJCQl7CisJCQkJCQliYm94ID0gc3RhdGUuc2hhcGUuYm91bmRpbmdCb3g7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJeworCQkJCQkJcmVzdWx0ID0gbXhSZWN0YW5nbGUuZnJvbVJlY3RhbmdsZShiYm94KTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXJlc3VsdC5hZGQoYmJveCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVByZXZpZXdTaGFwZQorICogCisgKiBDcmVhdGVzIHRoZSBzaGFwZSB1c2VkIHRvIGRyYXcgdGhlIHByZXZpZXcgZm9yIHRoZSBnaXZlbiBib3VuZHMuCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5jcmVhdGVQcmV2aWV3U2hhcGUgPSBmdW5jdGlvbihib3VuZHMpCit7CisJdmFyIHNoYXBlID0gbmV3IG14UmVjdGFuZ2xlU2hhcGUoYm91bmRzLCBudWxsLCB0aGlzLnByZXZpZXdDb2xvcik7CisJc2hhcGUuaXNEYXNoZWQgPSB0cnVlOworCQorCWlmICh0aGlzLmh0bWxQcmV2aWV3KQorCXsKKwkJc2hhcGUuZGlhbGVjdCA9IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1RSSUNUSFRNTDsKKwkJc2hhcGUuaW5pdCh0aGlzLmdyYXBoLmNvbnRhaW5lcik7CisJfQorCWVsc2UKKwl7CisJCS8vIE1ha2VzIHN1cmUgdG8gdXNlIGVpdGhlciBWTUwgb3IgU1ZHIHNoYXBlcyBpbiBvcmRlciB0byBpbXBsZW1lbnQKKwkJLy8gZXZlbnQtdHJhbnNwYXJlbmN5IG9uIHRoZSBiYWNrZ3JvdW5kIGFyZWEgb2YgdGhlIHJlY3RhbmdsZSBzaW5jZQorCQkvLyBIVE1MIHNoYXBlcyBkbyBub3QgbGV0IG1vdXNlZXZlbnRzIHRocm91Z2ggZXZlbiB3aGVuIHRyYW5zcGFyZW50CisJCXNoYXBlLmRpYWxlY3QgPSAodGhpcy5ncmFwaC5kaWFsZWN0ICE9IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHKSA/CisJCQlteENvbnN0YW50cy5ESUFMRUNUX1ZNTCA6IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHOworCQlzaGFwZS5pbml0KHRoaXMuZ3JhcGguZ2V0VmlldygpLmdldE92ZXJsYXlQYW5lKCkpOworCQlzaGFwZS5wb2ludGVyRXZlbnRzID0gZmFsc2U7CisJCQorCQkvLyBXb3JrYXJvdW5kIGZvciBhcnRpZmFjdHMgb24gaU9TCisJCWlmIChteENsaWVudC5JU19JT1MpCisJCXsKKwkJCXNoYXBlLmdldFN2Z1NjcmVlbk9mZnNldCA9IGZ1bmN0aW9uKCkKKwkJCXsKKwkJCQlyZXR1cm4gMDsKKwkJCX07CisJCX0KKwl9CisJCisJcmV0dXJuIHNoYXBlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc3RhcnQKKyAqIAorICogU3RhcnRzIHRoZSBoYW5kbGluZyBvZiB0aGUgbW91c2UgZ2VzdHVyZS4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24oY2VsbCwgeCwgeSkKK3sKKwl0aGlzLmNlbGwgPSBjZWxsOworCXRoaXMuZmlyc3QgPSBteFV0aWxzLmNvbnZlcnRQb2ludCh0aGlzLmdyYXBoLmNvbnRhaW5lciwgeCwgeSk7CisJdGhpcy5jZWxscyA9IHRoaXMuZ2V0Q2VsbHModGhpcy5jZWxsKTsKKwl0aGlzLmJvdW5kcyA9IHRoaXMuZ3JhcGguZ2V0VmlldygpLmdldEJvdW5kcyh0aGlzLmNlbGxzKTsKKwl0aGlzLnBCb3VuZHMgPSB0aGlzLmdldFByZXZpZXdCb3VuZHModGhpcy5jZWxscyk7CisKKwlpZiAodGhpcy5ndWlkZXNFbmFibGVkKQorCXsKKwkJdGhpcy5ndWlkZSA9IG5ldyBteEd1aWRlKHRoaXMuZ3JhcGgsIHRoaXMuZ2V0R3VpZGVTdGF0ZXMoKSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXNlR3VpZGVzRm9yRXZlbnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBndWlkZXMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiA8bXhNb3VzZUV2ZW50Pi4KKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8bXhHdWlkZS5pc0VuYWJsZWRGb3JFdmVudD4uCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS51c2VHdWlkZXNGb3JFdmVudCA9IGZ1bmN0aW9uKG1lKQoreworCXJldHVybiAodGhpcy5ndWlkZSAhPSBudWxsKSA/IHRoaXMuZ3VpZGUuaXNFbmFibGVkRm9yRXZlbnQobWUuZ2V0RXZlbnQoKSkgOiB0cnVlOworfTsKKworCisvKioKKyAqIEZ1bmN0aW9uOiBzbmFwCisgKiAKKyAqIFNuYXBzIHRoZSBnaXZlbiB2ZWN0b3IgdG8gdGhlIGdyaWQgYW5kIHJldHVybnMgdGhlIGdpdmVuIG14UG9pbnQgaW5zdGFuY2UuCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5zbmFwID0gZnVuY3Rpb24odmVjdG9yKQoreworCXZhciBzY2FsZSA9ICh0aGlzLnNjYWxlR3JpZCkgPyB0aGlzLmdyYXBoLnZpZXcuc2NhbGUgOiAxOworCQorCXZlY3Rvci54ID0gdGhpcy5ncmFwaC5zbmFwKHZlY3Rvci54IC8gc2NhbGUpICogc2NhbGU7CisJdmVjdG9yLnkgPSB0aGlzLmdyYXBoLnNuYXAodmVjdG9yLnkgLyBzY2FsZSkgKiBzY2FsZTsKKwkKKwlyZXR1cm4gdmVjdG9yOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0RGVsdGEKKyAqIAorICogUmV0dXJucyBhbiA8bXhQb2ludD4gdGhhdCByZXByZXNlbnRzIHRoZSB2ZWN0b3IgZm9yIG1vdmluZyB0aGUgY2VsbHMKKyAqIGZvciB0aGUgZ2l2ZW4gPG14TW91c2VFdmVudD4uCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5nZXREZWx0YSA9IGZ1bmN0aW9uKG1lKQoreworCXZhciBwb2ludCA9IG14VXRpbHMuY29udmVydFBvaW50KHRoaXMuZ3JhcGguY29udGFpbmVyLCBtZS5nZXRYKCksIG1lLmdldFkoKSk7CisJdmFyIHMgPSB0aGlzLmdyYXBoLnZpZXcuc2NhbGU7CisJCisJcmV0dXJuIG5ldyBteFBvaW50KHRoaXMucm91bmRMZW5ndGgoKHBvaW50LnggLSB0aGlzLmZpcnN0LngpIC8gcykgKiBzLAorCQl0aGlzLnJvdW5kTGVuZ3RoKChwb2ludC55IC0gdGhpcy5maXJzdC55KSAvIHMpICogcyk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1cGRhdGVIaW50CisgKiAKKyAqIEhvb2sgZm9yIHN1YmNsYXNzZXJzIGRvIHNob3cgZGV0YWlscyB3aGlsZSB0aGUgaGFuZGxlciBpcyBhY3RpdmUuCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS51cGRhdGVIaW50ID0gZnVuY3Rpb24obWUpIHsgfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVtb3ZlSGludAorICogCisgKiBIb29rcyBmb3Igc3ViY2xhc3NlcnMgdG8gaGlkZSBkZXRhaWxzIHdoZW4gdGhlIGhhbmRsZXIgZ2V0cyBpbmFjdGl2ZS4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLnJlbW92ZUhpbnQgPSBmdW5jdGlvbigpIHsgfTsKKworLyoqCisgKiBGdW5jdGlvbjogcm91bmRMZW5ndGgKKyAqIAorICogSG9vayBmb3Igcm91bmRpbmcgdGhlIHVuc2NhbGVkIHZlY3Rvci4gVGhpcyB1c2VzIE1hdGgucm91bmQuCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5yb3VuZExlbmd0aCA9IGZ1bmN0aW9uKGxlbmd0aCkKK3sKKwlyZXR1cm4gTWF0aC5yb3VuZChsZW5ndGgpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogbW91c2VNb3ZlCisgKiAKKyAqIEhhbmRsZXMgdGhlIGV2ZW50IGJ5IGhpZ2hsaWdodGluZyBwb3NzaWJsZSBkcm9wIHRhcmdldHMgYW5kIHVwZGF0aW5nIHRoZQorICogcHJldmlldy4KKyAqLworbXhHcmFwaEhhbmRsZXIucHJvdG90eXBlLm1vdXNlTW92ZSA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJdmFyIGdyYXBoID0gdGhpcy5ncmFwaDsKKworCWlmICghbWUuaXNDb25zdW1lZCgpICYmIGdyYXBoLmlzTW91c2VEb3duICYmIHRoaXMuY2VsbCAhPSBudWxsICYmCisJCXRoaXMuZmlyc3QgIT0gbnVsbCAmJiB0aGlzLmJvdW5kcyAhPSBudWxsKQorCXsKKwkJLy8gU3RvcHMgbW92aW5nIGlmIGEgbXVsdGkgdG91Y2ggZXZlbnQgaXMgcmVjZWl2ZWQKKwkJaWYgKG14RXZlbnQuaXNNdWx0aVRvdWNoRXZlbnQobWUuZ2V0RXZlbnQoKSkpCisJCXsKKwkJCXRoaXMucmVzZXQoKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJdmFyIGRlbHRhID0gdGhpcy5nZXREZWx0YShtZSk7CisJCXZhciBkeCA9IGRlbHRhLng7CisJCXZhciBkeSA9IGRlbHRhLnk7CisJCXZhciB0b2wgPSBncmFwaC50b2xlcmFuY2U7CisKKwkJaWYgKHRoaXMuc2hhcGUgIT0gbnVsbCB8fCBNYXRoLmFicyhkeCkgPiB0b2wgfHwgTWF0aC5hYnMoZHkpID4gdG9sKQorCQl7CisJCQkvLyBIaWdobGlnaHQgaXMgdXNlZCBmb3IgaGlnaGxpZ2h0aW5nIGRyb3AgdGFyZ2V0cworCQkJaWYgKHRoaXMuaGlnaGxpZ2h0ID09IG51bGwpCisJCQl7CisJCQkJdGhpcy5oaWdobGlnaHQgPSBuZXcgbXhDZWxsSGlnaGxpZ2h0KHRoaXMuZ3JhcGgsCisJCQkJCW14Q29uc3RhbnRzLkRST1BfVEFSR0VUX0NPTE9SLCAzKTsKKwkJCX0KKwkJCQorCQkJaWYgKHRoaXMuc2hhcGUgPT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLnNoYXBlID0gdGhpcy5jcmVhdGVQcmV2aWV3U2hhcGUodGhpcy5ib3VuZHMpOworCQkJfQorCQkJCisJCQl2YXIgZ3JpZEVuYWJsZWQgPSBncmFwaC5pc0dyaWRFbmFibGVkRXZlbnQobWUuZ2V0RXZlbnQoKSk7CisJCQl2YXIgaGlkZUd1aWRlID0gdHJ1ZTsKKwkJCQorCQkJaWYgKHRoaXMuZ3VpZGUgIT0gbnVsbCAmJiB0aGlzLnVzZUd1aWRlc0ZvckV2ZW50KG1lKSkKKwkJCXsKKwkJCQlkZWx0YSA9IHRoaXMuZ3VpZGUubW92ZSh0aGlzLmJvdW5kcywgbmV3IG14UG9pbnQoZHgsIGR5KSwgZ3JpZEVuYWJsZWQpOworCQkJCWhpZGVHdWlkZSA9IGZhbHNlOworCQkJCWR4ID0gZGVsdGEueDsKKwkJCQlkeSA9IGRlbHRhLnk7CisJCQl9CisJCQllbHNlIGlmIChncmlkRW5hYmxlZCkKKwkJCXsKKwkJCQl2YXIgdHJ4ID0gZ3JhcGguZ2V0VmlldygpLnRyYW5zbGF0ZTsKKwkJCQl2YXIgc2NhbGUgPSBncmFwaC5nZXRWaWV3KCkuc2NhbGU7CQkJCQorCQkJCQorCQkJCXZhciB0eCA9IHRoaXMuYm91bmRzLnggLSAoZ3JhcGguc25hcCh0aGlzLmJvdW5kcy54IC8gc2NhbGUgLSB0cngueCkgKyB0cngueCkgKiBzY2FsZTsKKwkJCQl2YXIgdHkgPSB0aGlzLmJvdW5kcy55IC0gKGdyYXBoLnNuYXAodGhpcy5ib3VuZHMueSAvIHNjYWxlIC0gdHJ4LnkpICsgdHJ4LnkpICogc2NhbGU7CisJCQkJdmFyIHYgPSB0aGlzLnNuYXAobmV3IG14UG9pbnQoZHgsIGR5KSk7CisJCQkKKwkJCQlkeCA9IHYueCAtIHR4OworCQkJCWR5ID0gdi55IC0gdHk7CisJCQl9CisJCQkKKwkJCWlmICh0aGlzLmd1aWRlICE9IG51bGwgJiYgaGlkZUd1aWRlKQorCQkJeworCQkJCXRoaXMuZ3VpZGUuaGlkZSgpOworCQkJfQorCisJCQkvLyBDb25zdHJhaW5lZCBtb3ZlbWVudCBpZiBzaGlmdCBrZXkgaXMgcHJlc3NlZAorCQkJaWYgKGdyYXBoLmlzQ29uc3RyYWluZWRFdmVudChtZS5nZXRFdmVudCgpKSkKKwkJCXsKKwkJCQlpZiAoTWF0aC5hYnMoZHgpID4gTWF0aC5hYnMoZHkpKQorCQkJCXsKKwkJCQkJZHkgPSAwOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlkeCA9IDA7CisJCQkJfQorCQkJfQorCisJCQl0aGlzLmN1cnJlbnREeCA9IGR4OworCQkJdGhpcy5jdXJyZW50RHkgPSBkeTsKKwkJCXRoaXMudXBkYXRlUHJldmlld1NoYXBlKCk7CisKKwkJCXZhciB0YXJnZXQgPSBudWxsOworCQkJdmFyIGNlbGwgPSBtZS5nZXRDZWxsKCk7CisKKwkJCXZhciBjbG9uZSA9IGdyYXBoLmlzQ2xvbmVFdmVudChtZS5nZXRFdmVudCgpKSAmJiBncmFwaC5pc0NlbGxzQ2xvbmVhYmxlKCkgJiYgdGhpcy5pc0Nsb25lRW5hYmxlZCgpOworCQkJCisJCQlpZiAoZ3JhcGguaXNEcm9wRW5hYmxlZCgpICYmIHRoaXMuaGlnaGxpZ2h0RW5hYmxlZCkKKwkJCXsKKwkJCQkvLyBDb250YWlucyBhIGNhbGwgdG8gZ2V0Q2VsbEF0IHRvIGZpbmQgdGhlIGNlbGwgdW5kZXIgdGhlIG1vdXNlCisJCQkJdGFyZ2V0ID0gZ3JhcGguZ2V0RHJvcFRhcmdldCh0aGlzLmNlbGxzLCBtZS5nZXRFdmVudCgpLCBjZWxsLCBjbG9uZSk7CisJCQl9CisKKwkJCXZhciBzdGF0ZSA9IGdyYXBoLmdldFZpZXcoKS5nZXRTdGF0ZSh0YXJnZXQpOworCQkJdmFyIGhpZ2hsaWdodCA9IGZhbHNlOworCQkJCisJCQlpZiAoc3RhdGUgIT0gbnVsbCAmJiAoZ3JhcGgubW9kZWwuZ2V0UGFyZW50KHRoaXMuY2VsbCkgIT0gdGFyZ2V0IHx8IGNsb25lKSkKKwkJCXsKKwkJCSAgICBpZiAodGhpcy50YXJnZXQgIT0gdGFyZ2V0KQorCQkJICAgIHsKKwkJCQkgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7CisJCQkJICAgIHRoaXMuc2V0SGlnaGxpZ2h0Q29sb3IobXhDb25zdGFudHMuRFJPUF9UQVJHRVRfQ09MT1IpOworCQkJCX0KKwkJCSAgICAKKwkJCSAgICBoaWdobGlnaHQgPSB0cnVlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRoaXMudGFyZ2V0ID0gbnVsbDsKKworCQkJCWlmICh0aGlzLmNvbm5lY3RPbkRyb3AgJiYgY2VsbCAhPSBudWxsICYmIHRoaXMuY2VsbHMubGVuZ3RoID09IDEgJiYKKwkJCQkJZ3JhcGguZ2V0TW9kZWwoKS5pc1ZlcnRleChjZWxsKSAmJiBncmFwaC5pc0NlbGxDb25uZWN0YWJsZShjZWxsKSkKKwkJCQl7CisJCQkJCXN0YXRlID0gZ3JhcGguZ2V0VmlldygpLmdldFN0YXRlKGNlbGwpOworCQkJCQkKKwkJCQkJaWYgKHN0YXRlICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCXZhciBlcnJvciA9IGdyYXBoLmdldEVkZ2VWYWxpZGF0aW9uRXJyb3IobnVsbCwgdGhpcy5jZWxsLCBjZWxsKTsKKwkJCQkJCXZhciBjb2xvciA9IChlcnJvciA9PSBudWxsKSA/CisJCQkJCQkJbXhDb25zdGFudHMuVkFMSURfQ09MT1IgOgorCQkJCQkJCW14Q29uc3RhbnRzLklOVkFMSURfQ09OTkVDVF9UQVJHRVRfQ09MT1I7CisJCQkJCQl0aGlzLnNldEhpZ2hsaWdodENvbG9yKGNvbG9yKTsKKwkJCQkJCWhpZ2hsaWdodCA9IHRydWU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmIChzdGF0ZSAhPSBudWxsICYmIGhpZ2hsaWdodCkKKwkJCXsKKwkJCQl0aGlzLmhpZ2hsaWdodC5oaWdobGlnaHQoc3RhdGUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRoaXMuaGlnaGxpZ2h0LmhpZGUoKTsKKwkJCX0KKwkJfQorCisJCXRoaXMudXBkYXRlSGludChtZSk7CisJCXRoaXMuY29uc3VtZU1vdXNlRXZlbnQobXhFdmVudC5NT1VTRV9NT1ZFLCBtZSk7CisJCQorCQkvLyBDYW5jZWxzIHRoZSBidWJibGluZyBvZiBldmVudHMgdG8gdGhlIGNvbnRhaW5lciBzbworCQkvLyB0aGF0IHRoZSBkcm9wdGFyZ2V0IGlzIG5vdCByZXNldCBkdWUgdG8gYW4gbW91c2VNb3ZlCisJCS8vIGZpcmVkIG9uIHRoZSBjb250YWluZXIgd2l0aCBubyBhc3NvY2lhdGVkIHN0YXRlLgorCQlteEV2ZW50LmNvbnN1bWUobWUuZ2V0RXZlbnQoKSk7CisJfQorCWVsc2UgaWYgKCh0aGlzLmlzTW92ZUVuYWJsZWQoKSB8fCB0aGlzLmlzQ2xvbmVFbmFibGVkKCkpICYmIHRoaXMudXBkYXRlQ3Vyc29yICYmCisJCSFtZS5pc0NvbnN1bWVkKCkgJiYgbWUuZ2V0U3RhdGUoKSAhPSBudWxsICYmICFncmFwaC5pc01vdXNlRG93bikKKwl7CisJCXZhciBjdXJzb3IgPSBncmFwaC5nZXRDdXJzb3JGb3JNb3VzZUV2ZW50KG1lKTsKKwkJCisJCWlmIChjdXJzb3IgPT0gbnVsbCAmJiBncmFwaC5pc0VuYWJsZWQoKSAmJiBncmFwaC5pc0NlbGxNb3ZhYmxlKG1lLmdldENlbGwoKSkpCisJCXsKKwkJCWlmIChncmFwaC5nZXRNb2RlbCgpLmlzRWRnZShtZS5nZXRDZWxsKCkpKQorCQkJeworCQkJCWN1cnNvciA9IG14Q29uc3RhbnRzLkNVUlNPUl9NT1ZBQkxFX0VER0U7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJY3Vyc29yID0gbXhDb25zdGFudHMuQ1VSU09SX01PVkFCTEVfVkVSVEVYOworCQkJfQorCQl9CisKKwkJLy8gU2V0cyB0aGUgY3Vyc29yIG9uIHRoZSBvcmlnaW5hbCBzb3VyY2Ugc3RhdGUgdW5kZXIgdGhlIG1vdXNlCisJCS8vIGluc3RlYWQgb2YgdGhlIGV2ZW50IHNvdXJjZSBzdGF0ZSB3aGljaCBjYW4gYmUgdGhlIHBhcmVudAorCQlpZiAobWUuc291cmNlU3RhdGUgIT0gbnVsbCkKKwkJeworCQkJbWUuc291cmNlU3RhdGUuc2V0Q3Vyc29yKGN1cnNvcik7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1cGRhdGVQcmV2aWV3U2hhcGUKKyAqIAorICogVXBkYXRlcyB0aGUgYm91bmRzIG9mIHRoZSBwcmV2aWV3IHNoYXBlLgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUudXBkYXRlUHJldmlld1NoYXBlID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLnNoYXBlICE9IG51bGwpCisJeworCQl0aGlzLnNoYXBlLmJvdW5kcyA9IG5ldyBteFJlY3RhbmdsZShNYXRoLnJvdW5kKHRoaXMucEJvdW5kcy54ICsgdGhpcy5jdXJyZW50RHggLSB0aGlzLmdyYXBoLnBhbkR4KSwKKwkJCQlNYXRoLnJvdW5kKHRoaXMucEJvdW5kcy55ICsgdGhpcy5jdXJyZW50RHkgLSB0aGlzLmdyYXBoLnBhbkR5KSwgdGhpcy5wQm91bmRzLndpZHRoLCB0aGlzLnBCb3VuZHMuaGVpZ2h0KTsKKwkJdGhpcy5zaGFwZS5yZWRyYXcoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRIaWdobGlnaHRDb2xvcgorICogCisgKiBTZXRzIHRoZSBjb2xvciBvZiB0aGUgcmVjdGFuZ2xlIHVzZWQgdG8gaGlnaGxpZ2h0IGRyb3AgdGFyZ2V0cy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY29sb3IgLSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBuZXcgaGlnaGxpZ2h0IGNvbG9yLgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUuc2V0SGlnaGxpZ2h0Q29sb3IgPSBmdW5jdGlvbihjb2xvcikKK3sKKwlpZiAodGhpcy5oaWdobGlnaHQgIT0gbnVsbCkKKwl7CisJCXRoaXMuaGlnaGxpZ2h0LnNldEhpZ2hsaWdodENvbG9yKGNvbG9yKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3VzZVVwCisgKiAKKyAqIEhhbmRsZXMgdGhlIGV2ZW50IGJ5IGFwcGx5aW5nIHRoZSBjaGFuZ2VzIHRvIHRoZSBzZWxlY3Rpb24gY2VsbHMuCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5tb3VzZVVwID0gZnVuY3Rpb24oc2VuZGVyLCBtZSkKK3sKKwlpZiAoIW1lLmlzQ29uc3VtZWQoKSkKKwl7CisJCXZhciBncmFwaCA9IHRoaXMuZ3JhcGg7CisJCQorCQlpZiAodGhpcy5jZWxsICE9IG51bGwgJiYgdGhpcy5maXJzdCAhPSBudWxsICYmIHRoaXMuc2hhcGUgIT0gbnVsbCAmJgorCQkJdGhpcy5jdXJyZW50RHggIT0gbnVsbCAmJiB0aGlzLmN1cnJlbnREeSAhPSBudWxsKQorCQl7CisJCQl2YXIgY2VsbCA9IG1lLmdldENlbGwoKTsKKwkJCQorCQkJaWYgKHRoaXMuY29ubmVjdE9uRHJvcCAmJiB0aGlzLnRhcmdldCA9PSBudWxsICYmIGNlbGwgIT0gbnVsbCAmJiBncmFwaC5nZXRNb2RlbCgpLmlzVmVydGV4KGNlbGwpICYmCisJCQkJZ3JhcGguaXNDZWxsQ29ubmVjdGFibGUoY2VsbCkgJiYgZ3JhcGguaXNFZGdlVmFsaWQobnVsbCwgdGhpcy5jZWxsLCBjZWxsKSkKKwkJCXsKKwkJCQlncmFwaC5jb25uZWN0aW9uSGFuZGxlci5jb25uZWN0KHRoaXMuY2VsbCwgY2VsbCwgbWUuZ2V0RXZlbnQoKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdmFyIGNsb25lID0gZ3JhcGguaXNDbG9uZUV2ZW50KG1lLmdldEV2ZW50KCkpICYmIGdyYXBoLmlzQ2VsbHNDbG9uZWFibGUoKSAmJiB0aGlzLmlzQ2xvbmVFbmFibGVkKCk7CisJCQkJdmFyIHNjYWxlID0gZ3JhcGguZ2V0VmlldygpLnNjYWxlOworCQkJCXZhciBkeCA9IHRoaXMucm91bmRMZW5ndGgodGhpcy5jdXJyZW50RHggLyBzY2FsZSk7CisJCQkJdmFyIGR5ID0gdGhpcy5yb3VuZExlbmd0aCh0aGlzLmN1cnJlbnREeSAvIHNjYWxlKTsKKwkJCQl2YXIgdGFyZ2V0ID0gdGhpcy50YXJnZXQ7CisJCQkJCisJCQkJaWYgKGdyYXBoLmlzU3BsaXRFbmFibGVkKCkgJiYgZ3JhcGguaXNTcGxpdFRhcmdldCh0YXJnZXQsIHRoaXMuY2VsbHMsIG1lLmdldEV2ZW50KCkpKQorCQkJCXsKKwkJCQkJZ3JhcGguc3BsaXRFZGdlKHRhcmdldCwgdGhpcy5jZWxscywgbnVsbCwgZHgsIGR5KTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdGhpcy5tb3ZlQ2VsbHModGhpcy5jZWxscywgZHgsIGR5LCBjbG9uZSwgdGhpcy50YXJnZXQsIG1lLmdldEV2ZW50KCkpOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIGlmICh0aGlzLmlzU2VsZWN0RW5hYmxlZCgpICYmIHRoaXMuZGVsYXllZFNlbGVjdGlvbiAmJiB0aGlzLmNlbGwgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5zZWxlY3REZWxheWVkKG1lKTsKKwkJfQorCX0KKworCS8vIENvbnN1bWVzIHRoZSBldmVudCBpZiBhIGNlbGwgd2FzIGluaXRpYWxseSBjbGlja2VkCisJaWYgKHRoaXMuY2VsbFdhc0NsaWNrZWQpCisJeworCQl0aGlzLmNvbnN1bWVNb3VzZUV2ZW50KG14RXZlbnQuTU9VU0VfVVAsIG1lKTsKKwl9CisKKwl0aGlzLnJlc2V0KCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZWxlY3REZWxheWVkCisgKiAKKyAqIEltcGxlbWVudHMgdGhlIGRlbGF5ZWQgc2VsZWN0aW9uIGZvciB0aGUgZ2l2ZW4gbW91c2UgZXZlbnQuCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5zZWxlY3REZWxheWVkID0gZnVuY3Rpb24obWUpCit7CisJaWYgKCF0aGlzLmdyYXBoLmlzQ2VsbFNlbGVjdGVkKHRoaXMuY2VsbCkgfHwgIXRoaXMuZ3JhcGgucG9wdXBNZW51SGFuZGxlci5pc1BvcHVwVHJpZ2dlcihtZSkpCisJeworCQl0aGlzLmdyYXBoLnNlbGVjdENlbGxGb3JFdmVudCh0aGlzLmNlbGwsIG1lLmdldEV2ZW50KCkpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJlc2V0CisgKiAKKyAqIFJlc2V0cyB0aGUgc3RhdGUgb2YgdGhpcyBoYW5kbGVyLgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpCit7CisJdGhpcy5kZXN0cm95U2hhcGVzKCk7CisJdGhpcy5yZW1vdmVIaW50KCk7CisJCisJdGhpcy5jZWxsV2FzQ2xpY2tlZCA9IGZhbHNlOworCXRoaXMuZGVsYXllZFNlbGVjdGlvbiA9IGZhbHNlOworCXRoaXMuY3VycmVudER4ID0gbnVsbDsKKwl0aGlzLmN1cnJlbnREeSA9IG51bGw7CisJdGhpcy5ndWlkZXMgPSBudWxsOworCXRoaXMuZmlyc3QgPSBudWxsOworCXRoaXMuY2VsbCA9IG51bGw7CisJdGhpcy50YXJnZXQgPSBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2hvdWxkUmVtb3ZlQ2VsbHNGcm9tUGFyZW50CisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbHMgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50IGZvciB0aGUgc3BlY2lmaWVkCisgKiBtb3VzZXJlbGVhc2VkIGV2ZW50LgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUuc2hvdWxkUmVtb3ZlQ2VsbHNGcm9tUGFyZW50ID0gZnVuY3Rpb24ocGFyZW50LCBjZWxscywgZXZ0KQoreworCWlmICh0aGlzLmdyYXBoLmdldE1vZGVsKCkuaXNWZXJ0ZXgocGFyZW50KSkKKwl7CisJCXZhciBwU3RhdGUgPSB0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXRTdGF0ZShwYXJlbnQpOworCQkKKwkJaWYgKHBTdGF0ZSAhPSBudWxsKQorCQl7CisJCQl2YXIgcHQgPSBteFV0aWxzLmNvbnZlcnRQb2ludCh0aGlzLmdyYXBoLmNvbnRhaW5lciwKKwkJCQlteEV2ZW50LmdldENsaWVudFgoZXZ0KSwgbXhFdmVudC5nZXRDbGllbnRZKGV2dCkpOworCQkJdmFyIGFscGhhID0gbXhVdGlscy50b1JhZGlhbnMobXhVdGlscy5nZXRWYWx1ZShwU3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1JPVEFUSU9OKSB8fCAwKTsKKwkJCQorCQkJaWYgKGFscGhhICE9IDApCisJCQl7CisJCQkJdmFyIGNvcyA9IE1hdGguY29zKC1hbHBoYSk7CisJCQkJdmFyIHNpbiA9IE1hdGguc2luKC1hbHBoYSk7CisJCQkJdmFyIGN4ID0gbmV3IG14UG9pbnQocFN0YXRlLmdldENlbnRlclgoKSwgcFN0YXRlLmdldENlbnRlclkoKSk7CisJCQkJcHQgPSBteFV0aWxzLmdldFJvdGF0ZWRQb2ludChwdCwgY29zLCBzaW4sIGN4KTsKKwkJCX0KKwkJCisJCQlyZXR1cm4gIW14VXRpbHMuY29udGFpbnMocFN0YXRlLCBwdC54LCBwdC55KTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gZmFsc2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3ZlQ2VsbHMKKyAqIAorICogTW92ZXMgdGhlIGdpdmVuIGNlbGxzIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUubW92ZUNlbGxzID0gZnVuY3Rpb24oY2VsbHMsIGR4LCBkeSwgY2xvbmUsIHRhcmdldCwgZXZ0KQoreworCWlmIChjbG9uZSkKKwl7CisJCWNlbGxzID0gdGhpcy5ncmFwaC5nZXRDbG9uZWFibGVDZWxscyhjZWxscyk7CisJfQorCQorCS8vIFJlbW92ZXMgY2VsbHMgZnJvbSBwYXJlbnQKKwlpZiAodGFyZ2V0ID09IG51bGwgJiYgdGhpcy5pc1JlbW92ZUNlbGxzRnJvbVBhcmVudCgpICYmCisJCXRoaXMuc2hvdWxkUmVtb3ZlQ2VsbHNGcm9tUGFyZW50KHRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5nZXRQYXJlbnQodGhpcy5jZWxsKSwgY2VsbHMsIGV2dCkpCisJeworCQl0YXJnZXQgPSB0aGlzLmdyYXBoLmdldERlZmF1bHRQYXJlbnQoKTsKKwl9CisJCisJLy8gUGFzc2VzIGFsbCBzZWxlY3RlZCBjZWxscyBpbiBvcmRlciB0byBjb3JyZWN0bHkgY2xvbmUgb3IgbW92ZSBpbnRvCisJLy8gdGhlIHRhcmdldCBjZWxsLiBUaGUgbWV0aG9kIGNoZWNrcyBmb3IgZWFjaCBjZWxsIGlmIGl0cyBtb3ZhYmxlLgorCWNlbGxzID0gdGhpcy5ncmFwaC5tb3ZlQ2VsbHMoY2VsbHMsIGR4IC0gdGhpcy5ncmFwaC5wYW5EeCAvIHRoaXMuZ3JhcGgudmlldy5zY2FsZSwKKwkJCWR5IC0gdGhpcy5ncmFwaC5wYW5EeSAvIHRoaXMuZ3JhcGgudmlldy5zY2FsZSwgY2xvbmUsIHRhcmdldCwgZXZ0KTsKKwkKKwlpZiAodGhpcy5pc1NlbGVjdEVuYWJsZWQoKSAmJiB0aGlzLnNjcm9sbE9uTW92ZSkKKwl7CisJCXRoaXMuZ3JhcGguc2Nyb2xsQ2VsbFRvVmlzaWJsZShjZWxsc1swXSk7CisJfQorCQkJCisJLy8gU2VsZWN0cyB0aGUgbmV3IGNlbGxzIGlmIGNlbGxzIGhhdmUgYmVlbiBjbG9uZWQKKwlpZiAoY2xvbmUpCisJeworCQl0aGlzLmdyYXBoLnNldFNlbGVjdGlvbkNlbGxzKGNlbGxzKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZXN0cm95U2hhcGVzCisgKiAKKyAqIERlc3Ryb3kgdGhlIHByZXZpZXcgYW5kIGhpZ2hsaWdodCBzaGFwZXMuCisgKi8KK214R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5kZXN0cm95U2hhcGVzID0gZnVuY3Rpb24oKQoreworCS8vIERlc3Ryb3lzIHRoZSBwcmV2aWV3IGRhc2hlZCByZWN0YW5nbGUKKwlpZiAodGhpcy5zaGFwZSAhPSBudWxsKQorCXsKKwkJdGhpcy5zaGFwZS5kZXN0cm95KCk7CisJCXRoaXMuc2hhcGUgPSBudWxsOworCX0KKwkKKwlpZiAodGhpcy5ndWlkZSAhPSBudWxsKQorCXsKKwkJdGhpcy5ndWlkZS5kZXN0cm95KCk7CisJCXRoaXMuZ3VpZGUgPSBudWxsOworCX0KKwkKKwkvLyBEZXN0cm95cyB0aGUgZHJvcCB0YXJnZXQgaGlnaGxpZ2h0CisJaWYgKHRoaXMuaGlnaGxpZ2h0ICE9IG51bGwpCisJeworCQl0aGlzLmhpZ2hsaWdodC5kZXN0cm95KCk7CisJCXRoaXMuaGlnaGxpZ2h0ID0gbnVsbDsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZXN0cm95CisgKiAKKyAqIERlc3Ryb3lzIHRoZSBoYW5kbGVyIGFuZCBhbGwgaXRzIHJlc291cmNlcyBhbmQgRE9NIG5vZGVzLgorICovCitteEdyYXBoSGFuZGxlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLmdyYXBoLnJlbW92ZU1vdXNlTGlzdGVuZXIodGhpcyk7CisJdGhpcy5ncmFwaC5yZW1vdmVMaXN0ZW5lcih0aGlzLnBhbkhhbmRsZXIpOworCQorCWlmICh0aGlzLmVzY2FwZUhhbmRsZXIgIT0gbnVsbCkKKwl7CisJCXRoaXMuZ3JhcGgucmVtb3ZlTGlzdGVuZXIodGhpcy5lc2NhcGVIYW5kbGVyKTsKKwkJdGhpcy5lc2NhcGVIYW5kbGVyID0gbnVsbDsKKwl9CisJCisJdGhpcy5kZXN0cm95U2hhcGVzKCk7CisJdGhpcy5yZW1vdmVIaW50KCk7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhIYW5kbGUuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teEhhbmRsZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTY0OTI1Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhIYW5kbGUuanMKQEAgLTAsMCArMSwzNTMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14SGFuZGxlCisgKiAKKyAqIEltcGxlbWVudHMgYSBzaW5nbGUgY3VzdG9tIGhhbmRsZSBmb3IgdmVydGljZXMuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteEhhbmRsZQorICogCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGhhbmRsZSBmb3IgdGhlIGdpdmVuIHN0YXRlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gb2YgdGhlIGNlbGwgdG8gYmUgaGFuZGxlZC4KKyAqLworZnVuY3Rpb24gbXhIYW5kbGUoc3RhdGUsIGN1cnNvciwgaW1hZ2UpCit7CisJdGhpcy5ncmFwaCA9IHN0YXRlLnZpZXcuZ3JhcGg7CisJdGhpcy5zdGF0ZSA9IHN0YXRlOworCXRoaXMuY3Vyc29yID0gKGN1cnNvciAhPSBudWxsKSA/IGN1cnNvciA6IHRoaXMuY3Vyc29yOworCXRoaXMuaW1hZ2UgPSAoaW1hZ2UgIT0gbnVsbCkgPyBpbWFnZSA6IHRoaXMuaW1hZ2U7CisJdGhpcy5pbml0KCk7Cit9OworCisvKioKKyAqIFZhcmlhYmxlOiBjdXJzb3IKKyAqIAorICogU3BlY2lmaWVzIHRoZSBjdXJzb3IgdG8gYmUgdXNlZCBmb3IgdGhpcyBoYW5kbGUuIERlZmF1bHQgaXMgJ2RlZmF1bHQnLgorICovCitteEhhbmRsZS5wcm90b3R5cGUuY3Vyc29yID0gJ2RlZmF1bHQnOworCisvKioKKyAqIFZhcmlhYmxlOiBpbWFnZQorICogCisgKiBTcGVjaWZpZXMgdGhlIDxteEltYWdlPiB0byBiZSB1c2VkIHRvIHJlbmRlciB0aGUgaGFuZGxlLiBEZWZhdWx0IGlzIG51bGwuCisgKi8KK214SGFuZGxlLnByb3RvdHlwZS5pbWFnZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGltYWdlCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgPG14SW1hZ2U+IHRvIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSBoYW5kbGUuIERlZmF1bHQgaXMgbnVsbC4KKyAqLworbXhIYW5kbGUucHJvdG90eXBlLmlnbm9yZUdyaWQgPSBmYWxzZTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0UG9zaXRpb24KKyAqIAorICogSG9vayBmb3Igc3ViY2xhc3NlcnMgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBoYW5kbGUuCisgKi8KK214SGFuZGxlLnByb3RvdHlwZS5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKGJvdW5kcykgeyB9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRQb3NpdGlvbgorICogCisgKiBIb29rcyBmb3Igc3ViY2xhc3NlcnMgdG8gdXBkYXRlIHRoZSBzdHlsZSBpbiB0aGUgPHN0YXRlPi4KKyAqLworbXhIYW5kbGUucHJvdG90eXBlLnNldFBvc2l0aW9uID0gZnVuY3Rpb24oYm91bmRzLCBwdCwgbWUpIHsgfTsKKworLyoqCisgKiBGdW5jdGlvbjogZXhlY3V0ZQorICogCisgKiBIb29rIGZvciBzdWJjbGFzc2VycyB0byBleGVjdXRlIHRoZSBoYW5kbGUuCisgKi8KK214SGFuZGxlLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24oKSB7IH07CisKKy8qKgorICogRnVuY3Rpb246IGNvcHlTdHlsZQorICogCisgKiBTZXRzIHRoZSBjZWxsIHN0eWxlIHdpdGggdGhlIGdpdmVuIG5hbWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gPHN0YXRlPi4KKyAqLworbXhIYW5kbGUucHJvdG90eXBlLmNvcHlTdHlsZSA9IGZ1bmN0aW9uKGtleSkKK3sKKwl0aGlzLmdyYXBoLnNldENlbGxTdHlsZXMoa2V5LCB0aGlzLnN0YXRlLnN0eWxlW2tleV0sIFt0aGlzLnN0YXRlLmNlbGxdKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHByb2Nlc3NFdmVudAorICogCisgKiBQcm9jZXNzZXMgdGhlIGdpdmVuIDxteE1vdXNlRXZlbnQ+IGFuZCBpbnZva2VzIDxzZXRQb3NpdGlvbj4uCisgKi8KK214SGFuZGxlLnByb3RvdHlwZS5wcm9jZXNzRXZlbnQgPSBmdW5jdGlvbihtZSkKK3sKKwl2YXIgc2NhbGUgPSB0aGlzLmdyYXBoLnZpZXcuc2NhbGU7CisJdmFyIHRyID0gdGhpcy5ncmFwaC52aWV3LnRyYW5zbGF0ZTsKKwl2YXIgcHQgPSBuZXcgbXhQb2ludChtZS5nZXRHcmFwaFgoKSAvIHNjYWxlIC0gdHIueCwgbWUuZ2V0R3JhcGhZKCkgLyBzY2FsZSAtIHRyLnkpOworCQorCS8vIENlbnRlciBzaGFwZSBvbiBtb3VzZSBjdXJzb3IKKwlpZiAodGhpcy5zaGFwZSAhPSBudWxsICYmIHRoaXMuc2hhcGUuYm91bmRzICE9IG51bGwpCisJeworCQlwdC54IC09IHRoaXMuc2hhcGUuYm91bmRzLndpZHRoIC8gc2NhbGUgLyA0OworCQlwdC55IC09IHRoaXMuc2hhcGUuYm91bmRzLmhlaWdodCAvIHNjYWxlIC8gNDsKKwl9CisKKwkvLyBTbmFwcyB0byBncmlkIGZvciB0aGUgcm90YXRlZCBwb3NpdGlvbiB0aGVuIGFwcGxpZXMgdGhlIHJvdGF0aW9uIGZvciB0aGUgZGlyZWN0aW9uIGFmdGVyIHRoYXQKKwl2YXIgYWxwaGExID0gLW14VXRpbHMudG9SYWRpYW5zKHRoaXMuZ2V0Um90YXRpb24oKSk7CisJdmFyIGFscGhhMiA9IC1teFV0aWxzLnRvUmFkaWFucyh0aGlzLmdldFRvdGFsUm90YXRpb24oKSkgLSBhbHBoYTE7CisJcHQgPSB0aGlzLmZsaXBQb2ludCh0aGlzLnJvdGF0ZVBvaW50KHRoaXMuc25hcFBvaW50KHRoaXMucm90YXRlUG9pbnQocHQsIGFscGhhMSksCisJCQl0aGlzLmlnbm9yZUdyaWQgfHwgIXRoaXMuZ3JhcGguaXNHcmlkRW5hYmxlZEV2ZW50KG1lLmdldEV2ZW50KCkpKSwgYWxwaGEyKSk7CisJdGhpcy5zZXRQb3NpdGlvbih0aGlzLnN0YXRlLmdldFBhaW50Qm91bmRzKCksIHB0LCBtZSk7CisJdGhpcy5wb3NpdGlvbkNoYW5nZWQoKTsKKwl0aGlzLnJlZHJhdygpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcG9zaXRpb25DaGFuZ2VkCisgKiAKKyAqIENhbGxlZCBhZnRlciA8c2V0UG9zaXRpb24+IGhhcyBiZWVuIGNhbGxlZCBpbiA8cHJvY2Vzc0V2ZW50Pi4gVGhpcyByZXBhaW50cworICogdGhlIHN0YXRlIHVzaW5nIDxteENlbGxSZW5kZXJlcj4uCisgKi8KK214SGFuZGxlLnByb3RvdHlwZS5wb3NpdGlvbkNoYW5nZWQgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMuc3RhdGUudGV4dCAhPSBudWxsKQorCXsKKwkJdGhpcy5zdGF0ZS50ZXh0LmFwcGx5KHRoaXMuc3RhdGUpOworCX0KKwkKKwlpZiAodGhpcy5zdGF0ZS5zaGFwZSAhPSBudWxsKQorCXsKKwkJdGhpcy5zdGF0ZS5zaGFwZS5hcHBseSh0aGlzLnN0YXRlKTsKKwl9CisJCisJLy8gTmVlZGVkIHRvIGZvcmNlIHVwZGF0ZSBvZiB0ZXh0IGJvdW5kcworCXRoaXMuc3RhdGUudW5zY2FsZWRXaWR0aCA9IG51bGw7CisJdGhpcy5ncmFwaC5jZWxsUmVuZGVyZXIucmVkcmF3KHRoaXMuc3RhdGUsIHRydWUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Um90YXRpb24KKyAqIAorICogUmV0dXJucyB0aGUgcm90YXRpb24gZGVmaW5lZCBpbiB0aGUgc3R5bGUgb2YgdGhlIGNlbGwuCisgKi8KK214SGFuZGxlLnByb3RvdHlwZS5nZXRSb3RhdGlvbiA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAodGhpcy5zdGF0ZS5zaGFwZSAhPSBudWxsKQorCXsKKwkJcmV0dXJuIHRoaXMuc3RhdGUuc2hhcGUuZ2V0Um90YXRpb24oKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRUb3RhbFJvdGF0aW9uCisgKiAKKyAqIFJldHVybnMgdGhlIHJvdGF0aW9uIGZyb20gdGhlIHN0eWxlIGFuZCB0aGUgcm90YXRpb24gZnJvbSB0aGUgZGlyZWN0aW9uIG9mCisgKiB0aGUgY2VsbC4KKyAqLworbXhIYW5kbGUucHJvdG90eXBlLmdldFRvdGFsUm90YXRpb24gPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMuc3RhdGUuc2hhcGUgIT0gbnVsbCkKKwl7CisJCXJldHVybiB0aGlzLnN0YXRlLnNoYXBlLmdldFNoYXBlUm90YXRpb24oKTsKKwl9CisJCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbml0CisgKiAKKyAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBzaGFwZXMgcmVxdWlyZWQgZm9yIHRoaXMgaGFuZGxlLgorICovCitteEhhbmRsZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgaHRtbCA9IHRoaXMuaXNIdG1sUmVxdWlyZWQoKTsKKwkKKwlpZiAodGhpcy5pbWFnZSAhPSBudWxsKQorCXsKKwkJdGhpcy5zaGFwZSA9IG5ldyBteEltYWdlU2hhcGUobmV3IG14UmVjdGFuZ2xlKDAsIDAsIHRoaXMuaW1hZ2Uud2lkdGgsIHRoaXMuaW1hZ2UuaGVpZ2h0KSwgdGhpcy5pbWFnZS5zcmMpOworCQl0aGlzLnNoYXBlLnByZXNlcnZlSW1hZ2VBc3BlY3QgPSBmYWxzZTsKKwl9CisJZWxzZQorCXsKKwkJdGhpcy5zaGFwZSA9IHRoaXMuY3JlYXRlU2hhcGUoaHRtbCk7CisJfQorCQorCXRoaXMuaW5pdFNoYXBlKGh0bWwpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlU2hhcGUKKyAqIAorICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgc2hhcGUgZm9yIHRoaXMgaGFuZGxlLgorICovCitteEhhbmRsZS5wcm90b3R5cGUuY3JlYXRlU2hhcGUgPSBmdW5jdGlvbihodG1sKQoreworCXZhciBib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUoMCwgMCwgbXhDb25zdGFudHMuSEFORExFX1NJWkUsIG14Q29uc3RhbnRzLkhBTkRMRV9TSVpFKTsKKwkKKwlyZXR1cm4gbmV3IG14UmVjdGFuZ2xlU2hhcGUoYm91bmRzLCBteENvbnN0YW50cy5IQU5ETEVfRklMTENPTE9SLCBteENvbnN0YW50cy5IQU5ETEVfU1RST0tFQ09MT1IpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaW5pdFNoYXBlCisgKiAKKyAqIEluaXRpYWxpemVzIDxzaGFwZT4gYW5kIHNldHMgaXRzIGN1cnNvci4KKyAqLworbXhIYW5kbGUucHJvdG90eXBlLmluaXRTaGFwZSA9IGZ1bmN0aW9uKGh0bWwpCit7CisJaWYgKGh0bWwgJiYgdGhpcy5zaGFwZS5pc0h0bWxBbGxvd2VkKCkpCisJeworCQl0aGlzLnNoYXBlLmRpYWxlY3QgPSBteENvbnN0YW50cy5ESUFMRUNUX1NUUklDVEhUTUw7CisJCXRoaXMuc2hhcGUuaW5pdCh0aGlzLmdyYXBoLmNvbnRhaW5lcik7CisJfQorCWVsc2UKKwl7CisJCXRoaXMuc2hhcGUuZGlhbGVjdCA9ICh0aGlzLmdyYXBoLmRpYWxlY3QgIT0gbXhDb25zdGFudHMuRElBTEVDVF9TVkcpID8gbXhDb25zdGFudHMuRElBTEVDVF9NSVhFREhUTUwgOiBteENvbnN0YW50cy5ESUFMRUNUX1NWRzsKKwkJCisJCWlmICh0aGlzLmN1cnNvciAhPSBudWxsKQorCQl7CisJCQl0aGlzLnNoYXBlLmluaXQodGhpcy5ncmFwaC5nZXRWaWV3KCkuZ2V0T3ZlcmxheVBhbmUoKSk7CisJCX0KKwl9CisKKwlteEV2ZW50LnJlZGlyZWN0TW91c2VFdmVudHModGhpcy5zaGFwZS5ub2RlLCB0aGlzLmdyYXBoLCB0aGlzLnN0YXRlKTsKKwl0aGlzLnNoYXBlLm5vZGUuc3R5bGUuY3Vyc29yID0gdGhpcy5jdXJzb3I7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWRyYXcKKyAqIAorICogUmVuZGVycyB0aGUgc2hhcGUgZm9yIHRoaXMgaGFuZGxlLgorICovCitteEhhbmRsZS5wcm90b3R5cGUucmVkcmF3ID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLnNoYXBlICE9IG51bGwgJiYgdGhpcy5zdGF0ZS5zaGFwZSAhPSBudWxsKQorCXsKKwkJdmFyIHB0ID0gdGhpcy5nZXRQb3NpdGlvbih0aGlzLnN0YXRlLmdldFBhaW50Qm91bmRzKCkpOworCQkKKwkJaWYgKHB0ICE9IG51bGwpCisJCXsKKwkJCXZhciBhbHBoYSA9IG14VXRpbHMudG9SYWRpYW5zKHRoaXMuZ2V0VG90YWxSb3RhdGlvbigpKTsKKwkJCXB0ID0gdGhpcy5yb3RhdGVQb2ludCh0aGlzLmZsaXBQb2ludChwdCksIGFscGhhKTsKKwkKKwkJCXZhciBzY2FsZSA9IHRoaXMuZ3JhcGgudmlldy5zY2FsZTsKKwkJCXZhciB0ciA9IHRoaXMuZ3JhcGgudmlldy50cmFuc2xhdGU7CisJCQl0aGlzLnNoYXBlLmJvdW5kcy54ID0gTWF0aC5mbG9vcigocHQueCArIHRyLngpICogc2NhbGUgLSB0aGlzLnNoYXBlLmJvdW5kcy53aWR0aCAvIDIpOworCQkJdGhpcy5zaGFwZS5ib3VuZHMueSA9IE1hdGguZmxvb3IoKHB0LnkgKyB0ci55KSAqIHNjYWxlIC0gdGhpcy5zaGFwZS5ib3VuZHMuaGVpZ2h0IC8gMik7CisJCQkKKwkJCS8vIE5lZWRlZCB0byBmb3JjZSB1cGRhdGUgb2YgdGV4dCBib3VuZHMKKwkJCXRoaXMuc2hhcGUucmVkcmF3KCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0h0bWxSZXF1aXJlZAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBoYW5kbGUgc2hvdWxkIGJlIHJlbmRlcmVkIGluIEhUTUwuIFRoaXMgcmV0dXJucyB0cnVlIGlmCisgKiB0aGUgdGV4dCBub2RlIGlzIGluIHRoZSBncmFwaCBjb250YWluZXIuCisgKi8KK214SGFuZGxlLnByb3RvdHlwZS5pc0h0bWxSZXF1aXJlZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5zdGF0ZS50ZXh0ICE9IG51bGwgJiYgdGhpcy5zdGF0ZS50ZXh0Lm5vZGUucGFyZW50Tm9kZSA9PSB0aGlzLmdyYXBoLmNvbnRhaW5lcjsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJvdGF0ZVBvaW50CisgKiAKKyAqIFJvdGF0ZXMgdGhlIHBvaW50IGJ5IHRoZSBnaXZlbiBhbmdsZS4KKyAqLworbXhIYW5kbGUucHJvdG90eXBlLnJvdGF0ZVBvaW50ID0gZnVuY3Rpb24ocHQsIGFscGhhKQoreworCXZhciBib3VuZHMgPSB0aGlzLnN0YXRlLmdldENlbGxCb3VuZHMoKTsKKwl2YXIgY3ggPSBuZXcgbXhQb2ludChib3VuZHMuZ2V0Q2VudGVyWCgpLCBib3VuZHMuZ2V0Q2VudGVyWSgpKTsKKwl2YXIgY29zID0gTWF0aC5jb3MoYWxwaGEpOworCXZhciBzaW4gPSBNYXRoLnNpbihhbHBoYSk7IAorCisJcmV0dXJuIG14VXRpbHMuZ2V0Um90YXRlZFBvaW50KHB0LCBjb3MsIHNpbiwgY3gpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZmxpcFBvaW50CisgKiAKKyAqIEZsaXBzIHRoZSBnaXZlbiBwb2ludCB2ZXJ0aWNhbGx5IGFuZC9vciBob3Jpem9udGFsbHkuCisgKi8KK214SGFuZGxlLnByb3RvdHlwZS5mbGlwUG9pbnQgPSBmdW5jdGlvbihwdCkKK3sKKwlpZiAodGhpcy5zdGF0ZS5zaGFwZSAhPSBudWxsKQorCXsKKwkJdmFyIGJvdW5kcyA9IHRoaXMuc3RhdGUuZ2V0Q2VsbEJvdW5kcygpOworCQkKKwkJaWYgKHRoaXMuc3RhdGUuc2hhcGUuZmxpcEgpCisJCXsKKwkJCXB0LnggPSAyICogYm91bmRzLnggKyBib3VuZHMud2lkdGggLSBwdC54OworCQl9CisJCQorCQlpZiAodGhpcy5zdGF0ZS5zaGFwZS5mbGlwVikKKwkJeworCQkJcHQueSA9IDIgKiBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgLSBwdC55OworCQl9CisJfQorCQorCXJldHVybiBwdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNuYXBQb2ludAorICogCisgKiBTbmFwcyB0aGUgZ2l2ZW4gcG9pbnQgdG8gdGhlIGdyaWQgaWYgaWdub3JlIGlzIGZhbHNlLiBUaGlzIG1vZGlmaWVzCisgKiB0aGUgZ2l2ZW4gcG9pbnQgaW4tcGxhY2UgYW5kIGFsc28gcmV0dXJucyBpdC4KKyAqLworbXhIYW5kbGUucHJvdG90eXBlLnNuYXBQb2ludCA9IGZ1bmN0aW9uKHB0LCBpZ25vcmUpCit7CisJaWYgKCFpZ25vcmUpCisJeworCQlwdC54ID0gdGhpcy5ncmFwaC5zbmFwKHB0LngpOworCQlwdC55ID0gdGhpcy5ncmFwaC5zbmFwKHB0LnkpOworCX0KKwkKKwlyZXR1cm4gcHQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRWaXNpYmxlCisgKiAKKyAqIFNob3dzIG9yIGhpZGVzIHRoaXMgaGFuZGxlLgorICovCitteEhhbmRsZS5wcm90b3R5cGUuc2V0VmlzaWJsZSA9IGZ1bmN0aW9uKHZpc2libGUpCit7CisJaWYgKHRoaXMuc2hhcGUgIT0gbnVsbCAmJiB0aGlzLnNoYXBlLm5vZGUgIT0gbnVsbCkKKwl7CisJCXRoaXMuc2hhcGUubm9kZS5zdHlsZS5kaXNwbGF5ID0gKHZpc2libGUpID8gJycgOiAnbm9uZSc7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVzZXQKKyAqIAorICogUmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGlzIGhhbmRsZSBieSBzZXR0aW5nIGl0cyB2aXNpYmlsaXR5IHRvIHRydWUuCisgKi8KK214SGFuZGxlLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnNldFZpc2libGUodHJ1ZSk7CisJdGhpcy5zdGF0ZS5zdHlsZSA9IHRoaXMuZ3JhcGguZ2V0Q2VsbFN0eWxlKHRoaXMuc3RhdGUuY2VsbCk7CisJdGhpcy5wb3NpdGlvbkNoYW5nZWQoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqIAorICogRGVzdHJveXMgdGhpcyBoYW5kbGUuCisgKi8KK214SGFuZGxlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLnNoYXBlICE9IG51bGwpCisJeworCQl0aGlzLnNoYXBlLmRlc3Ryb3koKTsKKwkJdGhpcy5zaGFwZSA9IG51bGw7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214S2V5SGFuZGxlci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214S2V5SGFuZGxlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTM5MWYwCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhLZXlIYW5kbGVyLmpzCkBAIC0wLDAgKzEsNDI4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteEtleUhhbmRsZXIKKyAqCisgKiBFdmVudCBoYW5kbGVyIHRoYXQgbGlzdGVucyB0byBrZXlzdHJva2UgZXZlbnRzLiBUaGlzIGlzIG5vdCBhIHNpbmdsZXRvbiwKKyAqIGhvd2V2ZXIsIGl0IGlzIG5vcm1hbGx5IG9ubHkgcmVxdWlyZWQgb25jZSBpZiB0aGUgdGFyZ2V0IGlzIHRoZSBkb2N1bWVudAorICogZWxlbWVudCAoZGVmYXVsdCkuCisgKiAKKyAqIFRoaXMgaGFuZGxlciBpbnN0YWxscyBhIGtleSBldmVudCBsaXN0ZW5lciBpbiB0aGUgdG9wbW9zdCBET00gbm9kZSBhbmQKKyAqIHByb2Nlc3NlcyBhbGwgZXZlbnRzIHRoYXQgb3JpZ2luYXRlIGZyb20gZGVzY2FuZGFudHMgb2YgPG14R3JhcGguY29udGFpbmVyPgorICogb3IgZnJvbSB0aGUgdG9wbW9zdCBET00gbm9kZS4gVGhlIGxhdHRlciBtZWFucyB0aGF0IGFsbCB1bmhhbmRsZWQga2V5c3Ryb2tlcworICogYXJlIGhhbmRsZWQgYnkgdGhpcyBvYmplY3QgcmVnYXJkbGVzcyBvZiB0aGUgZm9jdXNlZCBzdGF0ZSBvZiB0aGUgPGdyYXBoPi4KKyAqIAorICogRXhhbXBsZToKKyAqIAorICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGNyZWF0ZXMgYSBrZXkgaGFuZGxlciB0aGF0IGxpc3RlbnMgdG8gdGhlIGRlbGV0ZSBrZXkKKyAqICg0NikgYW5kIGRlbGV0ZXMgdGhlIHNlbGVjdGlvbiBjZWxscyBpZiB0aGUgZ3JhcGggaXMgZW5hYmxlZC4KKyAqIAorICogKGNvZGUpCisgKiB2YXIga2V5SGFuZGxlciA9IG5ldyBteEtleUhhbmRsZXIoZ3JhcGgpOworICoga2V5SGFuZGxlci5iaW5kS2V5KDQ2LCBmdW5jdGlvbihldnQpCisgKiB7CisgKiAgIGlmIChncmFwaC5pc0VuYWJsZWQoKSkKKyAqICAgeworICogICAgIGdyYXBoLnJlbW92ZUNlbGxzKCk7CisgKiAgIH0KKyAqIH0pOworICogKGVuZCkKKyAqIAorICogS2V5Y29kZXM6CisgKiAKKyAqIFNlZSBodHRwOi8vdGlueXVybC5jb20veXA4amdsIG9yIGh0dHA6Ly90aW55dXJsLmNvbS8yMjl5cXcgZm9yIGEgbGlzdCBvZgorICoga2V5Y29kZXMgb3IgaW5zdGFsbCBhIGtleSBldmVudCBsaXN0ZW5lciBpbnRvIHRoZSBkb2N1bWVudCBlbGVtZW50IGFuZCBwcmludAorICogdGhlIGtleSBjb2RlcyBvZiB0aGUgcmVzcGVjdGl2ZSBldmVudHMgdG8gdGhlIGNvbnNvbGUuCisgKiAKKyAqIFRvIHN1cHBvcnQgdGhlIENvbW1hbmQga2V5IGFuZCB0aGUgQ29udHJvbCBrZXkgb24gdGhlIE1hYywgdGhlIGZvbGxvd2luZworICogY29kZSBjYW4gYmUgdXNlZC4KKyAqCisgKiAoY29kZSkKKyAqIGtleUhhbmRsZXIuZ2V0RnVuY3Rpb24gPSBmdW5jdGlvbihldnQpCisgKiB7CisgKiAgIGlmIChldnQgIT0gbnVsbCkKKyAqICAgeworICogICAgIHJldHVybiAobXhFdmVudC5pc0NvbnRyb2xEb3duKGV2dCkgfHwgKG14Q2xpZW50LklTX01BQyAmJiBldnQubWV0YUtleSkpID8gdGhpcy5jb250cm9sS2V5c1tldnQua2V5Q29kZV0gOiB0aGlzLm5vcm1hbEtleXNbZXZ0LmtleUNvZGVdOworICogICB9CisgKiAgIAorICogICByZXR1cm4gbnVsbDsKKyAqIH07CisgKiAoZW5kKQorICogCisgKiBDb25zdHJ1Y3RvcjogbXhLZXlIYW5kbGVyCisgKgorICogQ29uc3RydWN0cyBhbiBldmVudCBoYW5kbGVyIHRoYXQgZXhlY3V0ZXMgZnVuY3Rpb25zIGJvdW5kIHRvIHNwZWNpZmljCisgKiBrZXlzdHJva2VzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBncmFwaCAtIFJlZmVyZW5jZSB0byB0aGUgYXNzb2NpYXRlZCA8bXhHcmFwaD4uCisgKiB0YXJnZXQgLSBPcHRpb25hbCByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IHRhcmdldC4gSWYgbnVsbCwgdGhlIGRvY3VtZW50CisgKiBlbGVtZW50IGlzIHVzZWQgYXMgdGhlIGV2ZW50IHRhcmdldCwgdGhhdCBpcywgdGhlIG9iamVjdCB3aGVyZSB0aGUga2V5CisgKiBldmVudCBsaXN0ZW5lciBpcyBpbnN0YWxsZWQuCisgKi8KK2Z1bmN0aW9uIG14S2V5SGFuZGxlcihncmFwaCwgdGFyZ2V0KQoreworCWlmIChncmFwaCAhPSBudWxsKQorCXsKKwkJdGhpcy5ncmFwaCA9IGdyYXBoOworCQl0aGlzLnRhcmdldCA9IHRhcmdldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CisJCQorCQkvLyBDcmVhdGVzIHRoZSBhcnJheXMgdG8gbWFwIGZyb20ga2V5Y29kZXMgdG8gZnVuY3Rpb25zCisJCXRoaXMubm9ybWFsS2V5cyA9IFtdOworCQl0aGlzLnNoaWZ0S2V5cyA9IFtdOworCQl0aGlzLmNvbnRyb2xLZXlzID0gW107CisJCXRoaXMuY29udHJvbFNoaWZ0S2V5cyA9IFtdOworCQkKKwkJdGhpcy5rZXlkb3duSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJCXsKKwkJCXRoaXMua2V5RG93bihldnQpOworCQl9KTsKKworCQkvLyBJbnN0YWxscyB0aGUga2V5c3Ryb2tlIGxpc3RlbmVyIGluIHRoZSB0YXJnZXQKKwkJbXhFdmVudC5hZGRMaXN0ZW5lcih0aGlzLnRhcmdldCwgJ2tleWRvd24nLCB0aGlzLmtleWRvd25IYW5kbGVyKTsKKwkJCisJCS8vIEF1dG9tYXRpY2FsbHkgZGVhbGxvY2F0ZXMgbWVtb3J5IGluIElFCisJCWlmIChteENsaWVudC5JU19JRSkKKwkJeworCQkJbXhFdmVudC5hZGRMaXN0ZW5lcih3aW5kb3csICd1bmxvYWQnLAorCQkJCW14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbigpCisJCQkJeworCQkJCQl0aGlzLmRlc3Ryb3koKTsKKwkJCQl9KQorCQkJKTsKKwkJfQorCX0KK307CisKKy8qKgorICogVmFyaWFibGU6IGdyYXBoCisgKiAKKyAqIFJlZmVyZW5jZSB0byB0aGUgPG14R3JhcGg+IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGhhbmRsZXIuCisgKi8KK214S2V5SGFuZGxlci5wcm90b3R5cGUuZ3JhcGggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB0YXJnZXQKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSB0YXJnZXQgRE9NLCB0aGF0IGlzLCB0aGUgRE9NIG5vZGUgd2hlcmUgdGhlIGtleSBldmVudAorICogbGlzdGVuZXJzIGFyZSBpbnN0YWxsZWQuCisgKi8KK214S2V5SGFuZGxlci5wcm90b3R5cGUudGFyZ2V0ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbm9ybWFsS2V5cworICogCisgKiBNYXBzIGZyb20ga2V5Y29kZXMgdG8gZnVuY3Rpb25zIGZvciBub24tcHJlc3NlZCBjb250cm9sIGtleXMuCisgKi8KK214S2V5SGFuZGxlci5wcm90b3R5cGUubm9ybWFsS2V5cyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHNoaWZ0S2V5cworICogCisgKiBNYXBzIGZyb20ga2V5Y29kZXMgdG8gZnVuY3Rpb25zIGZvciBwcmVzc2VkIHNoaWZ0IGtleXMuCisgKi8KK214S2V5SGFuZGxlci5wcm90b3R5cGUuc2hpZnRLZXlzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogY29udHJvbEtleXMKKyAqIAorICogTWFwcyBmcm9tIGtleWNvZGVzIHRvIGZ1bmN0aW9ucyBmb3IgcHJlc3NlZCBjb250cm9sIGtleXMuCisgKi8KK214S2V5SGFuZGxlci5wcm90b3R5cGUuY29udHJvbEtleXMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjb250cm9sU2hpZnRLZXlzCisgKiAKKyAqIE1hcHMgZnJvbSBrZXljb2RlcyB0byBmdW5jdGlvbnMgZm9yIHByZXNzZWQgY29udHJvbCBhbmQgc2hpZnQga2V5cy4KKyAqLworbXhLZXlIYW5kbGVyLnByb3RvdHlwZS5jb250cm9sU2hpZnRLZXlzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgZXZlbnRzIGFyZSBoYW5kbGVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214S2V5SGFuZGxlci5wcm90b3R5cGUuZW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogRnVuY3Rpb246IGlzRW5hYmxlZAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgZXZlbnRzIGFyZSBoYW5kbGVkLiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMKKyAqIDxlbmFibGVkPi4KKyAqLworbXhLZXlIYW5kbGVyLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuZW5hYmxlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEVuYWJsZWQKKyAqIAorICogRW5hYmxlcyBvciBkaXNhYmxlcyBldmVudCBoYW5kbGluZyBieSB1cGRhdGluZyA8ZW5hYmxlZD4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGVuYWJsZWQgLSBCb29sZWFuIHRoYXQgc3BlY2lmaWVzIHRoZSBuZXcgZW5hYmxlZCBzdGF0ZS4KKyAqLworbXhLZXlIYW5kbGVyLnByb3RvdHlwZS5zZXRFbmFibGVkID0gZnVuY3Rpb24oZW5hYmxlZCkKK3sKKwl0aGlzLmVuYWJsZWQgPSBlbmFibGVkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYmluZEtleQorICogCisgKiBCaW5kcyB0aGUgc3BlY2lmaWVkIGtleWNvZGUgdG8gdGhlIGdpdmVuIGZ1bmN0aW9uLiBUaGlzIGJpbmRpbmcgaXMgdXNlZAorICogaWYgdGhlIGNvbnRyb2wga2V5IGlzIG5vdCBwcmVzc2VkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGNvZGUgLSBJbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSBrZXljb2RlLgorICogZnVuY3QgLSBKYXZhU2NyaXB0IGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIGtleSBldmVudCBhcyBhbiBhcmd1bWVudC4KKyAqLworbXhLZXlIYW5kbGVyLnByb3RvdHlwZS5iaW5kS2V5ID0gZnVuY3Rpb24oY29kZSwgZnVuY3QpCit7CisJdGhpcy5ub3JtYWxLZXlzW2NvZGVdID0gZnVuY3Q7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBiaW5kU2hpZnRLZXkKKyAqIAorICogQmluZHMgdGhlIHNwZWNpZmllZCBrZXljb2RlIHRvIHRoZSBnaXZlbiBmdW5jdGlvbi4gVGhpcyBiaW5kaW5nIGlzIHVzZWQKKyAqIGlmIHRoZSBzaGlmdCBrZXkgaXMgcHJlc3NlZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqCisgKiBjb2RlIC0gSW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUga2V5Y29kZS4KKyAqIGZ1bmN0IC0gSmF2YVNjcmlwdCBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBrZXkgZXZlbnQgYXMgYW4gYXJndW1lbnQuCisgKi8KK214S2V5SGFuZGxlci5wcm90b3R5cGUuYmluZFNoaWZ0S2V5ID0gZnVuY3Rpb24oY29kZSwgZnVuY3QpCit7CisJdGhpcy5zaGlmdEtleXNbY29kZV0gPSBmdW5jdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGJpbmRDb250cm9sS2V5CisgKiAKKyAqIEJpbmRzIHRoZSBzcGVjaWZpZWQga2V5Y29kZSB0byB0aGUgZ2l2ZW4gZnVuY3Rpb24uIFRoaXMgYmluZGluZyBpcyB1c2VkCisgKiBpZiB0aGUgY29udHJvbCBrZXkgaXMgcHJlc3NlZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqCisgKiBjb2RlIC0gSW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUga2V5Y29kZS4KKyAqIGZ1bmN0IC0gSmF2YVNjcmlwdCBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBrZXkgZXZlbnQgYXMgYW4gYXJndW1lbnQuCisgKi8KK214S2V5SGFuZGxlci5wcm90b3R5cGUuYmluZENvbnRyb2xLZXkgPSBmdW5jdGlvbihjb2RlLCBmdW5jdCkKK3sKKwl0aGlzLmNvbnRyb2xLZXlzW2NvZGVdID0gZnVuY3Q7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBiaW5kQ29udHJvbFNoaWZ0S2V5CisgKiAKKyAqIEJpbmRzIHRoZSBzcGVjaWZpZWQga2V5Y29kZSB0byB0aGUgZ2l2ZW4gZnVuY3Rpb24uIFRoaXMgYmluZGluZyBpcyB1c2VkCisgKiBpZiB0aGUgY29udHJvbCBhbmQgc2hpZnQga2V5IGFyZSBwcmVzc2VkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGNvZGUgLSBJbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSBrZXljb2RlLgorICogZnVuY3QgLSBKYXZhU2NyaXB0IGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIGtleSBldmVudCBhcyBhbiBhcmd1bWVudC4KKyAqLworbXhLZXlIYW5kbGVyLnByb3RvdHlwZS5iaW5kQ29udHJvbFNoaWZ0S2V5ID0gZnVuY3Rpb24oY29kZSwgZnVuY3QpCit7CisJdGhpcy5jb250cm9sU2hpZnRLZXlzW2NvZGVdID0gZnVuY3Q7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NvbnRyb2xEb3duCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udHJvbCBrZXkgaXMgcHJlc3NlZC4gVGhpcyB1c2VzIDxteEV2ZW50LmlzQ29udHJvbERvd24+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBldnQgLSBLZXkgZXZlbnQgd2hvc2UgY29udHJvbCBrZXkgcHJlc3NlZCBzdGF0ZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214S2V5SGFuZGxlci5wcm90b3R5cGUuaXNDb250cm9sRG93biA9IGZ1bmN0aW9uKGV2dCkKK3sKKwlyZXR1cm4gbXhFdmVudC5pc0NvbnRyb2xEb3duKGV2dCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRGdW5jdGlvbgorICogCisgKiBSZXR1cm5zIHRoZSBmdW5jdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGtleSBldmVudCBvciBudWxsIGlmIG5vCisgKiBmdW5jdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGV2ZW50LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBldnQgLSBLZXkgZXZlbnQgd2hvc2UgYXNzb2NpYXRlZCBmdW5jdGlvbiBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214S2V5SGFuZGxlci5wcm90b3R5cGUuZ2V0RnVuY3Rpb24gPSBmdW5jdGlvbihldnQpCit7CisJaWYgKGV2dCAhPSBudWxsICYmICFteEV2ZW50LmlzQWx0RG93bihldnQpKQorCXsKKwkJaWYgKHRoaXMuaXNDb250cm9sRG93bihldnQpKQorCQl7CisJCQlpZiAobXhFdmVudC5pc1NoaWZ0RG93bihldnQpKQorCQkJeworCQkJCXJldHVybiB0aGlzLmNvbnRyb2xTaGlmdEtleXNbZXZ0LmtleUNvZGVdOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiB0aGlzLmNvbnRyb2xLZXlzW2V2dC5rZXlDb2RlXTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChteEV2ZW50LmlzU2hpZnREb3duKGV2dCkpCisJCQl7CisJCQkJcmV0dXJuIHRoaXMuc2hpZnRLZXlzW2V2dC5rZXlDb2RlXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gdGhpcy5ub3JtYWxLZXlzW2V2dC5rZXlDb2RlXTsKKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gbnVsbDsKK307CisJCisvKioKKyAqIEZ1bmN0aW9uOiBpc0dyYXBoRXZlbnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHRoaXMgaGFuZGxlciwgdGhhdCBpcywKKyAqIGlmIHRoZSBldmVudCBzb3VyY2UgaXMgZWl0aGVyIHRoZSB0YXJnZXQsIG9uZSBvZiBpdHMgZGlyZWN0IGNoaWxkcmVuLCBhCisgKiBkZXNjZW5kYW50IG9mIHRoZSA8bXhHcmFwaC5jb250YWluZXI+LCBvciB0aGUgPG14R3JhcGguY2VsbEVkaXRvcj4gb2YgdGhlCisgKiA8Z3JhcGg+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBldnQgLSBLZXkgZXZlbnQgdGhhdCByZXByZXNlbnRzIHRoZSBrZXlzdHJva2UuCisgKi8KK214S2V5SGFuZGxlci5wcm90b3R5cGUuaXNHcmFwaEV2ZW50ID0gZnVuY3Rpb24oZXZ0KQoreworCXZhciBzb3VyY2UgPSBteEV2ZW50LmdldFNvdXJjZShldnQpOworCQorCS8vIEFjY2VwdHMgZXZlbnRzIGZyb20gdGhlIHRhcmdldCBvYmplY3Qgb3IKKwkvLyBpbi1wbGFjZSBlZGl0aW5nIGluc2lkZSBncmFwaAorCWlmICgoc291cmNlID09IHRoaXMudGFyZ2V0IHx8IHNvdXJjZS5wYXJlbnROb2RlID09IHRoaXMudGFyZ2V0KSB8fAorCQkodGhpcy5ncmFwaC5jZWxsRWRpdG9yICE9IG51bGwgJiYgdGhpcy5ncmFwaC5jZWxsRWRpdG9yLmlzRXZlbnRTb3VyY2UoZXZ0KSkpCisJeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJLy8gQWNjZXB0cyBldmVudHMgZnJvbSBpbnNpZGUgdGhlIGNvbnRhaW5lcgorCXJldHVybiBteFV0aWxzLmlzQW5jZXN0b3JOb2RlKHRoaXMuZ3JhcGguY29udGFpbmVyLCBzb3VyY2UpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjoga2V5RG93bgorICogCisgKiBIYW5kbGVzIHRoZSBldmVudCBieSBpbnZva2luZyB0aGUgZnVuY3Rpb24gYm91bmQgdG8gdGhlIHJlc3BlY3RpdmUga2V5c3Ryb2tlCisgKiBpZiA8aXNFbmFibGVkRm9yRXZlbnQ+IHJldHVybnMgdHJ1ZSBmb3IgdGhlIGdpdmVuIGV2ZW50IGFuZCBpZgorICogPGlzRXZlbnRJZ25vcmVkPiByZXR1cm5zIGZhbHNlLCBleGNlcHQgZm9yIGVzY2FwZSBmb3Igd2hpY2gKKyAqIDxpc0V2ZW50SWdub3JlZD4gaXMgbm90IGludm9rZWQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGV2dCAtIEtleSBldmVudCB0aGF0IHJlcHJlc2VudHMgdGhlIGtleXN0cm9rZS4KKyAqLworbXhLZXlIYW5kbGVyLnByb3RvdHlwZS5rZXlEb3duID0gZnVuY3Rpb24oZXZ0KQoreworCWlmICh0aGlzLmlzRW5hYmxlZEZvckV2ZW50KGV2dCkpCisJeworCQkvLyBDYW5jZWxzIHRoZSBlZGl0aW5nIGlmIGVzY2FwZSBpcyBwcmVzc2VkCisJCWlmIChldnQua2V5Q29kZSA9PSAyNyAvKiBFc2NhcGUgKi8pCisJCXsKKwkJCXRoaXMuZXNjYXBlKGV2dCk7CisJCX0KKwkJCisJCS8vIEludm9rZXMgdGhlIGZ1bmN0aW9uIGZvciB0aGUga2V5c3Ryb2tlCisJCWVsc2UgaWYgKCF0aGlzLmlzRXZlbnRJZ25vcmVkKGV2dCkpCisJCXsKKwkJCXZhciBib3VuZEZ1bmN0aW9uID0gdGhpcy5nZXRGdW5jdGlvbihldnQpOworCQkJCisJCQlpZiAoYm91bmRGdW5jdGlvbiAhPSBudWxsKQorCQkJeworCQkJCWJvdW5kRnVuY3Rpb24oZXZ0KTsKKwkJCQlteEV2ZW50LmNvbnN1bWUoZXZ0KTsKKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGlzRW5hYmxlZEZvckV2ZW50CisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZXZlbnQgc2hvdWxkIGJlIGhhbmRsZWQuIDxpc0V2ZW50SWdub3JlZD4gaXMKKyAqIGNhbGxlZCBsYXRlciBpZiB0aGUgZXZlbnQgaXMgbm90IGFuIGVzY2FwZSBrZXkgc3Ryb2tlLCBpbiB3aGljaCBjYXNlCisgKiA8ZXNjYXBlPiBpcyBjYWxsZWQuIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmIDxpc0VuYWJsZWQ+CisgKiByZXR1cm5zIHRydWUgZm9yIGJvdGgsIHRoaXMgaGFuZGxlciBhbmQgPGdyYXBoPiwgaWYgdGhlIGV2ZW50IGlzIG5vdAorICogY29uc3VtZWQgYW5kIGlmIDxpc0dyYXBoRXZlbnQ+IHJldHVybnMgdHJ1ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZXZ0IC0gS2V5IGV2ZW50IHRoYXQgcmVwcmVzZW50cyB0aGUga2V5c3Ryb2tlLgorICovCitteEtleUhhbmRsZXIucHJvdG90eXBlLmlzRW5hYmxlZEZvckV2ZW50ID0gZnVuY3Rpb24oZXZ0KQoreworCXJldHVybiAodGhpcy5ncmFwaC5pc0VuYWJsZWQoKSAmJiAhbXhFdmVudC5pc0NvbnN1bWVkKGV2dCkgJiYKKwkJdGhpcy5pc0dyYXBoRXZlbnQoZXZ0KSAmJiB0aGlzLmlzRW5hYmxlZCgpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzRXZlbnRJZ25vcmVkCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4ga2V5c3Ryb2tlIHNob3VsZCBiZSBpZ25vcmVkLiBUaGlzIHJldHVybnMKKyAqIGdyYXBoLmlzRWRpdGluZygpLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBldnQgLSBLZXkgZXZlbnQgdGhhdCByZXByZXNlbnRzIHRoZSBrZXlzdHJva2UuCisgKi8KK214S2V5SGFuZGxlci5wcm90b3R5cGUuaXNFdmVudElnbm9yZWQgPSBmdW5jdGlvbihldnQpCit7CisJcmV0dXJuIHRoaXMuZ3JhcGguaXNFZGl0aW5nKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBlc2NhcGUKKyAqIAorICogSG9vayB0byBwcm9jZXNzIEVTQ0FQRSBrZXlzdHJva2VzLiBUaGlzIGltcGxlbWVudGF0aW9uIGludm9rZXMKKyAqIDxteEdyYXBoLnN0b3BFZGl0aW5nPiB0byBjYW5jZWwgdGhlIGN1cnJlbnQgZWRpdGluZywgY29ubmVjdGluZworICogYW5kL29yIG90aGVyIG9uZ29pbmcgbW9kaWZpY2F0aW9ucy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZXZ0IC0gS2V5IGV2ZW50IHRoYXQgcmVwcmVzZW50cyB0aGUga2V5c3Ryb2tlLiBQb3NzaWJsZSBrZXljb2RlIGluIHRoaXMKKyAqIGNhc2UgaXMgMjcgKEVTQ0FQRSkuCisgKi8KK214S2V5SGFuZGxlci5wcm90b3R5cGUuZXNjYXBlID0gZnVuY3Rpb24oZXZ0KQoreworCWlmICh0aGlzLmdyYXBoLmlzRXNjYXBlRW5hYmxlZCgpKQorCXsKKwkJdGhpcy5ncmFwaC5lc2NhcGUoZXZ0KTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZXN0cm95CisgKiAKKyAqIERlc3Ryb3lzIHRoZSBoYW5kbGVyIGFuZCBhbGwgaXRzIHJlZmVyZW5jZXMgaW50byB0aGUgRE9NLiBUaGlzIGRvZXMKKyAqIG5vcm1hbGx5IG5vdCBuZWVkIHRvIGJlIGNhbGxlZCwgaXQgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUKKyAqIHdpbmRvdyB1bmxvYWRzIChpbiBJRSkuCisgKi8KK214S2V5SGFuZGxlci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAodGhpcy50YXJnZXQgIT0gbnVsbCAmJiB0aGlzLmtleWRvd25IYW5kbGVyICE9IG51bGwpCisJeworCQlteEV2ZW50LnJlbW92ZUxpc3RlbmVyKHRoaXMudGFyZ2V0LCAna2V5ZG93bicsIHRoaXMua2V5ZG93bkhhbmRsZXIpOworCQl0aGlzLmtleWRvd25IYW5kbGVyID0gbnVsbDsKKwl9CisJCisJdGhpcy50YXJnZXQgPSBudWxsOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214UGFubmluZ0hhbmRsZXIuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teFBhbm5pbmdIYW5kbGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OWU2NzYKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teFBhbm5pbmdIYW5kbGVyLmpzCkBAIC0wLDAgKzEsNDYyIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFBhbm5pbmdIYW5kbGVyCisgKiAKKyAqIEV2ZW50IGhhbmRsZXIgdGhhdCBwYW5zIGFuZCBjcmVhdGVzIHBvcHVwbWVudXMuIFRvIHVzZSB0aGUgbGVmdAorICogbW91c2VidXR0b24gZm9yIHBhbm5pbmcgd2l0aG91dCBpbnRlcmZlcmluZyB3aXRoIGNlbGwgbW92aW5nIGFuZAorICogcmVzaXppbmcsIHVzZSA8aXNVc2VMZWZ0QnV0dG9uPiBhbmQgPGlzSWdub3JlQ2VsbD4uIEZvciBncmlkIHNpemUKKyAqIHN0ZXBzIHdoaWxlIHBhbm5pbmcsIHVzZSA8dXNlR3JpZD4uIFRoaXMgaGFuZGxlciBpcyBidWlsdC1pbnRvCisgKiA8bXhHcmFwaC5wYW5uaW5nSGFuZGxlcj4gYW5kIGVuYWJsZWQgdXNpbmcgPG14R3JhcGguc2V0UGFubmluZz4uCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteFBhbm5pbmdIYW5kbGVyCisgKiAKKyAqIENvbnN0cnVjdHMgYW4gZXZlbnQgaGFuZGxlciB0aGF0IGNyZWF0ZXMgYSA8bXhQb3B1cE1lbnU+CisgKiBhbmQgcGFucyB0aGUgZ3JhcGguCisgKgorICogRXZlbnQ6IG14RXZlbnQuUEFOX1NUQVJUCisgKgorICogRmlyZXMgd2hlbiB0aGUgcGFubmluZyBoYW5kbGVyIGNoYW5nZXMgaXRzIDxhY3RpdmU+IHN0YXRlIHRvIHRydWUuIFRoZQorICogPGNvZGU+ZXZlbnQ8L2NvZGU+IHByb3BlcnR5IGNvbnRhaW5zIHRoZSBjb3JyZXNwb25kaW5nIDxteE1vdXNlRXZlbnQ+LgorICoKKyAqIEV2ZW50OiBteEV2ZW50LlBBTgorICoKKyAqIEZpcmVzIHdoaWxlIGhhbmRsZSBpcyBwcm9jZXNzaW5nIGV2ZW50cy4gVGhlIDxjb2RlPmV2ZW50PC9jb2RlPiBwcm9wZXJ0eSBjb250YWlucworICogdGhlIGNvcnJlc3BvbmRpbmcgPG14TW91c2VFdmVudD4uCisgKgorICogRXZlbnQ6IG14RXZlbnQuUEFOX0VORAorICoKKyAqIEZpcmVzIHdoZW4gdGhlIHBhbm5pbmcgaGFuZGxlciBjaGFuZ2VzIGl0cyA8YWN0aXZlPiBzdGF0ZSB0byBmYWxzZS4gVGhlCisgKiA8Y29kZT5ldmVudDwvY29kZT4gcHJvcGVydHkgY29udGFpbnMgdGhlIGNvcnJlc3BvbmRpbmcgPG14TW91c2VFdmVudD4uCisgKi8KK2Z1bmN0aW9uIG14UGFubmluZ0hhbmRsZXIoZ3JhcGgpCit7CisJaWYgKGdyYXBoICE9IG51bGwpCisJeworCQl0aGlzLmdyYXBoID0gZ3JhcGg7CisJCXRoaXMuZ3JhcGguYWRkTW91c2VMaXN0ZW5lcih0aGlzKTsKKworCQkvLyBIYW5kbGVzIGZvcmNlIHBhbm5pbmcgZXZlbnQKKwkJdGhpcy5mb3JjZVBhbm5pbmdIYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorCQl7CisJCQl2YXIgZXZ0TmFtZSA9IGV2dC5nZXRQcm9wZXJ0eSgnZXZlbnROYW1lJyk7CisJCQl2YXIgbWUgPSBldnQuZ2V0UHJvcGVydHkoJ2V2ZW50Jyk7CisJCQkKKwkJCWlmIChldnROYW1lID09IG14RXZlbnQuTU9VU0VfRE9XTiAmJiB0aGlzLmlzRm9yY2VQYW5uaW5nRXZlbnQobWUpKQorCQkJeworCQkJCXRoaXMuc3RhcnQobWUpOworCQkJCXRoaXMuYWN0aXZlID0gdHJ1ZTsKKwkJCQl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LlBBTl9TVEFSVCwgJ2V2ZW50JywgbWUpKTsKKwkJCQltZS5jb25zdW1lKCk7CisJCQl9CisJCX0pOworCisJCXRoaXMuZ3JhcGguYWRkTGlzdGVuZXIobXhFdmVudC5GSVJFX01PVVNFX0VWRU5ULCB0aGlzLmZvcmNlUGFubmluZ0hhbmRsZXIpOworCQkKKwkJLy8gSGFuZGxlcyBwaW5jaCBnZXN0dXJlcworCQl0aGlzLmdlc3R1cmVIYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKHNlbmRlciwgZW8pCisJCXsKKwkJCWlmICh0aGlzLmlzUGluY2hFbmFibGVkKCkpCisJCQl7CisJCQkJdmFyIGV2dCA9IGVvLmdldFByb3BlcnR5KCdldmVudCcpOworCQkJCQorCQkJCWlmICghbXhFdmVudC5pc0NvbnN1bWVkKGV2dCkgJiYgZXZ0LnR5cGUgPT0gJ2dlc3R1cmVzdGFydCcpCisJCQkJeworCQkJCQl0aGlzLmluaXRpYWxTY2FsZSA9IHRoaXMuZ3JhcGgudmlldy5zY2FsZTsKKwkJCQkKKwkJCQkJLy8gRm9yY2VzIHN0YXJ0IG9mIHBhbm5pbmcgd2hlbiBwaW5jaCBnZXN0dXJlIHN0YXJ0cworCQkJCQlpZiAoIXRoaXMuYWN0aXZlICYmIHRoaXMubW91c2VEb3duRXZlbnQgIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJdGhpcy5zdGFydCh0aGlzLm1vdXNlRG93bkV2ZW50KTsKKwkJCQkJCXRoaXMubW91c2VEb3duRXZlbnQgPSBudWxsOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKGV2dC50eXBlID09ICdnZXN0dXJlZW5kJyAmJiB0aGlzLmluaXRpYWxTY2FsZSAhPSBudWxsKQorCQkJCXsKKwkJCQkJdGhpcy5pbml0aWFsU2NhbGUgPSBudWxsOworCQkJCX0KKwkJCQkKKwkJCQlpZiAodGhpcy5pbml0aWFsU2NhbGUgIT0gbnVsbCkKKwkJCQl7CisJCQkJCXZhciB2YWx1ZSA9IE1hdGgucm91bmQodGhpcy5pbml0aWFsU2NhbGUgKiBldnQuc2NhbGUgKiAxMDApIC8gMTAwOworCQkJCQkKKwkJCQkJaWYgKHRoaXMubWluU2NhbGUgIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJdmFsdWUgPSBNYXRoLm1heCh0aGlzLm1pblNjYWxlLCB2YWx1ZSk7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmICh0aGlzLm1heFNjYWxlICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCXZhbHVlID0gTWF0aC5taW4odGhpcy5tYXhTY2FsZSwgdmFsdWUpOworCQkJCQl9CisJCisJCQkJCWlmICh0aGlzLmdyYXBoLnZpZXcuc2NhbGUgIT0gdmFsdWUpCisJCQkJCXsKKwkJCQkJCXRoaXMuZ3JhcGguem9vbVRvKHZhbHVlKTsKKwkJCQkJCW14RXZlbnQuY29uc3VtZShldnQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9KTsKKwkJCisJCXRoaXMuZ3JhcGguYWRkTGlzdGVuZXIobXhFdmVudC5HRVNUVVJFLCB0aGlzLmdlc3R1cmVIYW5kbGVyKTsKKwl9Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhFdmVudFNvdXJjZS4KKyAqLworbXhQYW5uaW5nSGFuZGxlci5wcm90b3R5cGUgPSBuZXcgbXhFdmVudFNvdXJjZSgpOworbXhQYW5uaW5nSGFuZGxlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBteFBhbm5pbmdIYW5kbGVyOworCisvKioKKyAqIFZhcmlhYmxlOiBncmFwaAorICogCisgKiBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKi8KK214UGFubmluZ0hhbmRsZXIucHJvdG90eXBlLmdyYXBoID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogdXNlTGVmdEJ1dHRvbkZvclBhbm5pbmcKKyAqIAorICogU3BlY2lmaWVzIGlmIHBhbm5pbmcgc2hvdWxkIGJlIGFjdGl2ZSBmb3IgdGhlIGxlZnQgbW91c2UgYnV0dG9uLgorICogU2V0dGluZyB0aGlzIHRvIHRydWUgbWF5IGNvbmZsaWN0IHdpdGggPG14UnViYmVyYmFuZD4uIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214UGFubmluZ0hhbmRsZXIucHJvdG90eXBlLnVzZUxlZnRCdXR0b25Gb3JQYW5uaW5nID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHVzZVBvcHVwVHJpZ2dlcgorICogCisgKiBTcGVjaWZpZXMgaWYgPG14RXZlbnQuaXNQb3B1cFRyaWdnZXI+IHNob3VsZCBhbHNvIGJlIHVzZWQgZm9yIHBhbm5pbmcuCisgKi8KK214UGFubmluZ0hhbmRsZXIucHJvdG90eXBlLnVzZVBvcHVwVHJpZ2dlciA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGlnbm9yZUNlbGwKKyAqIAorICogU3BlY2lmaWVzIGlmIHBhbm5pbmcgc2hvdWxkIGJlIGFjdGl2ZSBldmVuIGlmIHRoZXJlIGlzIGEgY2VsbCB1bmRlciB0aGUKKyAqIG1vdXNlcG9pbnRlci4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhQYW5uaW5nSGFuZGxlci5wcm90b3R5cGUuaWdub3JlQ2VsbCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBwcmV2aWV3RW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIHBhbm5pbmcgc2hvdWxkIGJlIHByZXZpZXdlZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteFBhbm5pbmdIYW5kbGVyLnByb3RvdHlwZS5wcmV2aWV3RW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHVzZUdyaWQKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBwYW5uaW5nIHN0ZXBzIHNob3VsZCBiZSBhbGlnbmVkIHRvIHRoZSBncmlkIHNpemUuCisgKiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteFBhbm5pbmdIYW5kbGVyLnByb3RvdHlwZS51c2VHcmlkID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHBhbm5pbmdFbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiBwYW5uaW5nIHNob3VsZCBiZSBlbmFibGVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214UGFubmluZ0hhbmRsZXIucHJvdG90eXBlLnBhbm5pbmdFbmFibGVkID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogcGluY2hFbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiBwaW5jaCBnZXN0dXJlcyBzaG91bGQgYmUgaGFuZGxlZCBhcyB6b29tLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214UGFubmluZ0hhbmRsZXIucHJvdG90eXBlLnBpbmNoRW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IG1heFNjYWxlCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgbWF4aW11bSBzY2FsZS4gRGVmYXVsdCBpcyA4LgorICovCitteFBhbm5pbmdIYW5kbGVyLnByb3RvdHlwZS5tYXhTY2FsZSA9IDg7CisKKy8qKgorICogVmFyaWFibGU6IG1pblNjYWxlCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgbWluaW11bSBzY2FsZS4gRGVmYXVsdCBpcyAwLjAxLgorICovCitteFBhbm5pbmdIYW5kbGVyLnByb3RvdHlwZS5taW5TY2FsZSA9IDAuMDE7CisKKy8qKgorICogVmFyaWFibGU6IGR4CisgKiAKKyAqIEhvbGRzIHRoZSBjdXJyZW50IGhvcml6b250YWwgb2Zmc2V0LgorICovCitteFBhbm5pbmdIYW5kbGVyLnByb3RvdHlwZS5keCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGR5CisgKiAKKyAqIEhvbGRzIHRoZSBjdXJyZW50IHZlcnRpY2FsIG9mZnNldC4KKyAqLworbXhQYW5uaW5nSGFuZGxlci5wcm90b3R5cGUuZHkgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzdGFydFgKKyAqIAorICogSG9sZHMgdGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnQgcG9pbnQuCisgKi8KK214UGFubmluZ0hhbmRsZXIucHJvdG90eXBlLnN0YXJ0WCA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IHN0YXJ0WQorICogCisgKiBIb2xkcyB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSBzdGFydCBwb2ludC4KKyAqLworbXhQYW5uaW5nSGFuZGxlci5wcm90b3R5cGUuc3RhcnRZID0gMDsKKworLyoqCisgKiBGdW5jdGlvbjogaXNBY3RpdmUKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBoYW5kbGVyIGlzIGN1cnJlbnRseSBhY3RpdmUuCisgKi8KK214UGFubmluZ0hhbmRsZXIucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmFjdGl2ZSB8fCB0aGlzLmluaXRpYWxTY2FsZSAhPSBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNQYW5uaW5nRW5hYmxlZAorICogCisgKiBSZXR1cm5zIDxwYW5uaW5nRW5hYmxlZD4uCisgKi8KK214UGFubmluZ0hhbmRsZXIucHJvdG90eXBlLmlzUGFubmluZ0VuYWJsZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMucGFubmluZ0VuYWJsZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRQYW5uaW5nRW5hYmxlZAorICogCisgKiBTZXRzIDxwYW5uaW5nRW5hYmxlZD4uCisgKi8KK214UGFubmluZ0hhbmRsZXIucHJvdG90eXBlLnNldFBhbm5pbmdFbmFibGVkID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5wYW5uaW5nRW5hYmxlZCA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNQaW5jaEVuYWJsZWQKKyAqIAorICogUmV0dXJucyA8cGluY2hFbmFibGVkPi4KKyAqLworbXhQYW5uaW5nSGFuZGxlci5wcm90b3R5cGUuaXNQaW5jaEVuYWJsZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMucGluY2hFbmFibGVkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0UGluY2hFbmFibGVkCisgKiAKKyAqIFNldHMgPHBpbmNoRW5hYmxlZD4uCisgKi8KK214UGFubmluZ0hhbmRsZXIucHJvdG90eXBlLnNldFBpbmNoRW5hYmxlZCA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMucGluY2hFbmFibGVkID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1Bhbm5pbmdUcmlnZ2VyCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZXZlbnQgaXMgYSBwYW5uaW5nIHRyaWdnZXIgZm9yIHRoZSBvcHRpb25hbAorICogZ2l2ZW4gY2VsbC4gVGhpcyByZXR1cm5zIHRydWUgaWYgY29udHJvbC1zaGlmdCBpcyBwcmVzc2VkIG9yIGlmCisgKiA8dXNlUG9wdXBUcmlnZ2VyPiBpcyB0cnVlIGFuZCB0aGUgZXZlbnQgaXMgYSBwb3B1cCB0cmlnZ2VyLgorICovCitteFBhbm5pbmdIYW5kbGVyLnByb3RvdHlwZS5pc1Bhbm5pbmdUcmlnZ2VyID0gZnVuY3Rpb24obWUpCit7CisJdmFyIGV2dCA9IG1lLmdldEV2ZW50KCk7CisJCisJcmV0dXJuICh0aGlzLnVzZUxlZnRCdXR0b25Gb3JQYW5uaW5nICYmIG1lLmdldFN0YXRlKCkgPT0gbnVsbCAmJgorCQkJbXhFdmVudC5pc0xlZnRNb3VzZUJ1dHRvbihldnQpKSB8fCAobXhFdmVudC5pc0NvbnRyb2xEb3duKGV2dCkgJiYKKwkJCW14RXZlbnQuaXNTaGlmdERvd24oZXZ0KSkgfHwgKHRoaXMudXNlUG9wdXBUcmlnZ2VyICYmIG14RXZlbnQuaXNQb3B1cFRyaWdnZXIoZXZ0KSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0ZvcmNlUGFubmluZ0V2ZW50CisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gPG14TW91c2VFdmVudD4gc2hvdWxkIHN0YXJ0IHBhbm5pbmcuIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIHRydWUgaWYgPGlnbm9yZUNlbGw+IGlzIHRydWUgb3IgZm9yCisgKiBtdWx0aSB0b3VjaCBldmVudHMuCisgKi8KK214UGFubmluZ0hhbmRsZXIucHJvdG90eXBlLmlzRm9yY2VQYW5uaW5nRXZlbnQgPSBmdW5jdGlvbihtZSkKK3sKKwlyZXR1cm4gdGhpcy5pZ25vcmVDZWxsIHx8IG14RXZlbnQuaXNNdWx0aVRvdWNoRXZlbnQobWUuZ2V0RXZlbnQoKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3VzZURvd24KKyAqIAorICogSGFuZGxlcyB0aGUgZXZlbnQgYnkgaW5pdGlhdGluZyB0aGUgcGFubmluZy4gQnkgY29uc3VtaW5nIHRoZSBldmVudCBhbGwKKyAqIHN1YnNlcXVlbnQgZXZlbnRzIG9mIHRoZSBnZXN0dXJlIGFyZSByZWRpcmVjdGVkIHRvIHRoaXMgaGFuZGxlci4KKyAqLworbXhQYW5uaW5nSGFuZGxlci5wcm90b3R5cGUubW91c2VEb3duID0gZnVuY3Rpb24oc2VuZGVyLCBtZSkKK3sKKwl0aGlzLm1vdXNlRG93bkV2ZW50ID0gbWU7CisJCisJaWYgKCFtZS5pc0NvbnN1bWVkKCkgJiYgdGhpcy5pc1Bhbm5pbmdFbmFibGVkKCkgJiYgIXRoaXMuYWN0aXZlICYmIHRoaXMuaXNQYW5uaW5nVHJpZ2dlcihtZSkpCisJeworCQl0aGlzLnN0YXJ0KG1lKTsKKwkJdGhpcy5jb25zdW1lUGFubmluZ1RyaWdnZXIobWUpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHN0YXJ0CisgKiAKKyAqIFN0YXJ0cyBwYW5uaW5nIGF0IHRoZSBnaXZlbiBldmVudC4KKyAqLworbXhQYW5uaW5nSGFuZGxlci5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbihtZSkKK3sKKwl0aGlzLmR4MCA9IC10aGlzLmdyYXBoLmNvbnRhaW5lci5zY3JvbGxMZWZ0OworCXRoaXMuZHkwID0gLXRoaXMuZ3JhcGguY29udGFpbmVyLnNjcm9sbFRvcDsKKworCS8vIFN0b3JlcyB0aGUgbG9jYXRpb24gb2YgdGhlIHRyaWdnZXIgZXZlbnQKKwl0aGlzLnN0YXJ0WCA9IG1lLmdldFgoKTsKKwl0aGlzLnN0YXJ0WSA9IG1lLmdldFkoKTsKKwl0aGlzLmR4ID0gbnVsbDsKKwl0aGlzLmR5ID0gbnVsbDsKKwkKKwl0aGlzLnBhbm5pbmdUcmlnZ2VyID0gdHJ1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNvbnN1bWVQYW5uaW5nVHJpZ2dlcgorICogCisgKiBDb25zdW1lcyB0aGUgZ2l2ZW4gPG14TW91c2VFdmVudD4gaWYgaXQgd2FzIGEgcGFubmluZyB0cmlnZ2VyIGluCisgKiA8bW91c2VEb3duPi4gVGhlIGRlZmF1bHQgaXMgdG8gaW52b2tlIDxteE1vdXNlRXZlbnQuY29uc3VtZT4uIE5vdGUgdGhhdCB0aGlzCisgKiB3aWxsIGJsb2NrIGFueSBmdXJ0aGVyIGV2ZW50IHByb2Nlc3NpbmcuIElmIHlvdSBoYXZlbid0IGRpc2FibGVkIGJ1aWx0LWluCisgKiBjb250ZXh0IG1lbnVzIGFuZCByZXF1aXJlIGltbWVkaWF0ZSBzZWxlY3Rpb24gb2YgdGhlIGNlbGwgb24gbW91c2VEb3duIGluCisgKiBTYWZhcmkgYW5kL29yIG9uIHRoZSBNYWMsIHRoZW4gdXNlIHRoZSBmb2xsb3dpbmcgY29kZToKKyAqIAorICogKGNvZGUpCisgKiBteFBhbm5pbmdIYW5kbGVyLnByb3RvdHlwZS5jb25zdW1lUGFubmluZ1RyaWdnZXIgPSBmdW5jdGlvbihtZSkKKyAqIHsKKyAqICAgaWYgKG1lLmV2dC5wcmV2ZW50RGVmYXVsdCkKKyAqICAgeworICogICAgIG1lLmV2dC5wcmV2ZW50RGVmYXVsdCgpOworICogICB9CisgKiAgIAorICogICAvLyBTdG9wcyBldmVudCBwcm9jZXNzaW5nIGluIElFCisgKiAgIG1lLmV2dC5yZXR1cm5WYWx1ZSA9IGZhbHNlOworICogICAKKyAqICAgLy8gU2V0cyBsb2NhbCBjb25zdW1lZCBzdGF0ZQorICogICBpZiAoIW14Q2xpZW50LklTX1NGICYmICFteENsaWVudC5JU19NQUMpCisgKiAgIHsKKyAqICAgICBtZS5jb25zdW1lZCA9IHRydWU7CisgKiAgIH0KKyAqIH07CisgKiAoZW5kKQorICovCitteFBhbm5pbmdIYW5kbGVyLnByb3RvdHlwZS5jb25zdW1lUGFubmluZ1RyaWdnZXIgPSBmdW5jdGlvbihtZSkKK3sKKwltZS5jb25zdW1lKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3VzZU1vdmUKKyAqIAorICogSGFuZGxlcyB0aGUgZXZlbnQgYnkgdXBkYXRpbmcgdGhlIHBhbm5pbmcgb24gdGhlIGdyYXBoLgorICovCitteFBhbm5pbmdIYW5kbGVyLnByb3RvdHlwZS5tb3VzZU1vdmUgPSBmdW5jdGlvbihzZW5kZXIsIG1lKQoreworCXRoaXMuZHggPSBtZS5nZXRYKCkgLSB0aGlzLnN0YXJ0WDsKKwl0aGlzLmR5ID0gbWUuZ2V0WSgpIC0gdGhpcy5zdGFydFk7CisJCisJaWYgKHRoaXMuYWN0aXZlKQorCXsKKwkJaWYgKHRoaXMucHJldmlld0VuYWJsZWQpCisJCXsKKwkJCS8vIEFwcGxpZXMgdGhlIGdyaWQgdG8gdGhlIHBhbm5pbmcgc3RlcHMKKwkJCWlmICh0aGlzLnVzZUdyaWQpCisJCQl7CisJCQkJdGhpcy5keCA9IHRoaXMuZ3JhcGguc25hcCh0aGlzLmR4KTsKKwkJCQl0aGlzLmR5ID0gdGhpcy5ncmFwaC5zbmFwKHRoaXMuZHkpOworCQkJfQorCQkJCisJCQl0aGlzLmdyYXBoLnBhbkdyYXBoKHRoaXMuZHggKyB0aGlzLmR4MCwgdGhpcy5keSArIHRoaXMuZHkwKTsKKwkJfQorCisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuUEFOLCAnZXZlbnQnLCBtZSkpOworCX0KKwllbHNlIGlmICh0aGlzLnBhbm5pbmdUcmlnZ2VyKQorCXsKKwkJdmFyIHRtcCA9IHRoaXMuYWN0aXZlOworCisJCS8vIFBhbm5pbmcgaXMgYWN0aXZhdGVkIG9ubHkgaWYgdGhlIG1vdXNlIGlzIG1vdmVkCisJCS8vIGJleW9uZCB0aGUgZ3JhcGggdG9sZXJhbmNlCisJCXRoaXMuYWN0aXZlID0gTWF0aC5hYnModGhpcy5keCkgPiB0aGlzLmdyYXBoLnRvbGVyYW5jZSB8fCBNYXRoLmFicyh0aGlzLmR5KSA+IHRoaXMuZ3JhcGgudG9sZXJhbmNlOworCisJCWlmICghdG1wICYmIHRoaXMuYWN0aXZlKQorCQl7CisJCQl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LlBBTl9TVEFSVCwgJ2V2ZW50JywgbWUpKTsKKwkJfQorCX0KKwkKKwlpZiAodGhpcy5hY3RpdmUgfHwgdGhpcy5wYW5uaW5nVHJpZ2dlcikKKwl7CisJCW1lLmNvbnN1bWUoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3VzZVVwCisgKiAKKyAqIEhhbmRsZXMgdGhlIGV2ZW50IGJ5IHNldHRpbmcgdGhlIHRyYW5zbGF0aW9uIG9uIHRoZSB2aWV3IG9yIHNob3dpbmcgdGhlCisgKiBwb3B1cG1lbnUuCisgKi8KK214UGFubmluZ0hhbmRsZXIucHJvdG90eXBlLm1vdXNlVXAgPSBmdW5jdGlvbihzZW5kZXIsIG1lKQoreworCWlmICh0aGlzLmFjdGl2ZSkKKwl7CisJCWlmICh0aGlzLmR4ICE9IG51bGwgJiYgdGhpcy5keSAhPSBudWxsKQorCQl7CisJCQkvLyBJZ25vcmVzIGlmIHNjcm9sbGJhcnMgaGF2ZSBiZWVuIHVzZWQgZm9yIHBhbm5pbmcKKwkJCWlmICghdGhpcy5ncmFwaC51c2VTY3JvbGxiYXJzRm9yUGFubmluZyB8fCAhbXhVdGlscy5oYXNTY3JvbGxiYXJzKHRoaXMuZ3JhcGguY29udGFpbmVyKSkKKwkJCXsKKwkJCQl2YXIgc2NhbGUgPSB0aGlzLmdyYXBoLmdldFZpZXcoKS5zY2FsZTsKKwkJCQl2YXIgdCA9IHRoaXMuZ3JhcGguZ2V0VmlldygpLnRyYW5zbGF0ZTsKKwkJCQl0aGlzLmdyYXBoLnBhbkdyYXBoKDAsIDApOworCQkJCXRoaXMucGFuR3JhcGgodC54ICsgdGhpcy5keCAvIHNjYWxlLCB0LnkgKyB0aGlzLmR5IC8gc2NhbGUpOworCQkJfQorCQkJCisJCQltZS5jb25zdW1lKCk7CisJCX0KKwkJCisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuUEFOX0VORCwgJ2V2ZW50JywgbWUpKTsKKwl9CisJCisJdGhpcy5wYW5uaW5nVHJpZ2dlciA9IGZhbHNlOworCXRoaXMubW91c2VEb3duRXZlbnQgPSBudWxsOworCXRoaXMuYWN0aXZlID0gZmFsc2U7CisJdGhpcy5keCA9IG51bGw7CisJdGhpcy5keSA9IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBwYW5HcmFwaAorICogCisgKiBQYW5zIDxncmFwaD4gYnkgdGhlIGdpdmVuIGFtb3VudC4KKyAqLworbXhQYW5uaW5nSGFuZGxlci5wcm90b3R5cGUucGFuR3JhcGggPSBmdW5jdGlvbihkeCwgZHkpCit7CisJdGhpcy5ncmFwaC5nZXRWaWV3KCkuc2V0VHJhbnNsYXRlKGR4LCBkeSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZXN0cm95CisgKiAKKyAqIERlc3Ryb3lzIHRoZSBoYW5kbGVyIGFuZCBhbGwgaXRzIHJlc291cmNlcyBhbmQgRE9NIG5vZGVzLgorICovCitteFBhbm5pbmdIYW5kbGVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKQoreworCXRoaXMuZ3JhcGgucmVtb3ZlTW91c2VMaXN0ZW5lcih0aGlzKTsKKwl0aGlzLmdyYXBoLnJlbW92ZUxpc3RlbmVyKHRoaXMuZm9yY2VQYW5uaW5nSGFuZGxlcik7CisJdGhpcy5ncmFwaC5yZW1vdmVMaXN0ZW5lcih0aGlzLmdlc3R1cmVIYW5kbGVyKTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teFBvcHVwTWVudUhhbmRsZXIuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teFBvcHVwTWVudUhhbmRsZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4ODMxOQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214UG9wdXBNZW51SGFuZGxlci5qcwpAQCAtMCwwICsxLDIxOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhQb3B1cE1lbnVIYW5kbGVyCisgKiAKKyAqIEV2ZW50IGhhbmRsZXIgdGhhdCBjcmVhdGVzIHBvcHVwbWVudXMuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteFBvcHVwTWVudUhhbmRsZXIKKyAqIAorICogQ29uc3RydWN0cyBhbiBldmVudCBoYW5kbGVyIHRoYXQgY3JlYXRlcyBhIDxteFBvcHVwTWVudT4uCisgKi8KK2Z1bmN0aW9uIG14UG9wdXBNZW51SGFuZGxlcihncmFwaCwgZmFjdG9yeU1ldGhvZCkKK3sKKwlpZiAoZ3JhcGggIT0gbnVsbCkKKwl7CisJCXRoaXMuZ3JhcGggPSBncmFwaDsKKwkJdGhpcy5mYWN0b3J5TWV0aG9kID0gZmFjdG9yeU1ldGhvZDsKKwkJdGhpcy5ncmFwaC5hZGRNb3VzZUxpc3RlbmVyKHRoaXMpOworCQkKKwkJLy8gRG9lcyBub3Qgc2hvdyBtZW51IGlmIGFueSB0b3VjaCBnZXN0dXJlcyB0YWtlIHBsYWNlIGFmdGVyIHRoZSB0cmlnZ2VyCisJCXRoaXMuZ2VzdHVyZUhhbmRsZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oc2VuZGVyLCBlbykKKwkJeworCQkJdGhpcy5pblRvbGVyYW5jZSA9IGZhbHNlOworCQl9KTsKKwkJCisJCXRoaXMuZ3JhcGguYWRkTGlzdGVuZXIobXhFdmVudC5HRVNUVVJFLCB0aGlzLmdlc3R1cmVIYW5kbGVyKTsKKwkJCisJCXRoaXMuaW5pdCgpOworCX0KK307CisKKy8qKgorICogRXh0ZW5kcyBteFBvcHVwTWVudS4KKyAqLworbXhQb3B1cE1lbnVIYW5kbGVyLnByb3RvdHlwZSA9IG5ldyBteFBvcHVwTWVudSgpOworbXhQb3B1cE1lbnVIYW5kbGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG14UG9wdXBNZW51SGFuZGxlcjsKKworLyoqCisgKiBWYXJpYWJsZTogZ3JhcGgKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgPG14R3JhcGg+LgorICovCitteFBvcHVwTWVudUhhbmRsZXIucHJvdG90eXBlLmdyYXBoID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogc2VsZWN0T25Qb3B1cAorICogCisgKiBTcGVjaWZpZXMgaWYgY2VsbHMgc2hvdWxkIGJlIHNlbGVjdGVkIGlmIGEgcG9wdXBtZW51IGlzIGRpc3BsYXllZCBmb3IKKyAqIHRoZW0uIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhQb3B1cE1lbnVIYW5kbGVyLnByb3RvdHlwZS5zZWxlY3RPblBvcHVwID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogY2xlYXJTZWxlY3Rpb25PbkJhY2tncm91bmQKKyAqIAorICogU3BlY2lmaWVzIGlmIGNlbGxzIHNob3VsZCBiZSBkZXNlbGVjdGVkIGlmIGEgcG9wdXBtZW51IGlzIGRpc3BsYXllZCBmb3IKKyAqIHRoZSBkaWFncmFtIGJhY2tncm91bmQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhQb3B1cE1lbnVIYW5kbGVyLnByb3RvdHlwZS5jbGVhclNlbGVjdGlvbk9uQmFja2dyb3VuZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHRyaWdnZXJYCisgKiAKKyAqIFgtY29vcmRpbmF0ZSBvZiB0aGUgbW91c2UgZG93biBldmVudC4KKyAqLworbXhQb3B1cE1lbnVIYW5kbGVyLnByb3RvdHlwZS50cmlnZ2VyWCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHRyaWdnZXJZCisgKiAKKyAqIFktY29vcmRpbmF0ZSBvZiB0aGUgbW91c2UgZG93biBldmVudC4KKyAqLworbXhQb3B1cE1lbnVIYW5kbGVyLnByb3RvdHlwZS50cmlnZ2VyWSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHNjcmVlblgKKyAqIAorICogU2NyZWVuIFgtY29vcmRpbmF0ZSBvZiB0aGUgbW91c2UgZG93biBldmVudC4KKyAqLworbXhQb3B1cE1lbnVIYW5kbGVyLnByb3RvdHlwZS5zY3JlZW5YID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogc2NyZWVuWQorICogCisgKiBTY3JlZW4gWS1jb29yZGluYXRlIG9mIHRoZSBtb3VzZSBkb3duIGV2ZW50LgorICovCitteFBvcHVwTWVudUhhbmRsZXIucHJvdG90eXBlLnNjcmVlblkgPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiBpbml0CisgKiAKKyAqIEluaXRpYWxpemVzIHRoZSBzaGFwZXMgcmVxdWlyZWQgZm9yIHRoaXMgdmVydGV4IGhhbmRsZXIuCisgKi8KK214UG9wdXBNZW51SGFuZGxlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKCkKK3sKKwkvLyBTdXBlcmNhbGwKKwlteFBvcHVwTWVudS5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzKTsKKworCS8vIEhpZGVzIHRoZSB0b29sdGlwIGlmIHRoZSBtb3VzZSBpcyBvdmVyCisJLy8gdGhlIGNvbnRleHQgbWVudQorCW14RXZlbnQuYWRkR2VzdHVyZUxpc3RlbmVycyh0aGlzLmRpdiwgbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwl7CisJCXRoaXMuZ3JhcGgudG9vbHRpcEhhbmRsZXIuaGlkZSgpOworCX0pKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzU2VsZWN0T25Qb3B1cAorICogCisgKiBIb29rIGZvciByZXR1cm5pbmcgaWYgYSBjZWxsIHNob3VsZCBiZSBzZWxlY3RlZCBmb3IgYSBnaXZlbiA8bXhNb3VzZUV2ZW50Pi4KKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8c2VsZWN0T25Qb3B1cD4uCisgKi8KK214UG9wdXBNZW51SGFuZGxlci5wcm90b3R5cGUuaXNTZWxlY3RPblBvcHVwID0gZnVuY3Rpb24obWUpCit7CisJcmV0dXJuIHRoaXMuc2VsZWN0T25Qb3B1cDsKK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdXNlRG93bgorICogCisgKiBIYW5kbGVzIHRoZSBldmVudCBieSBpbml0aWF0aW5nIHRoZSBwYW5uaW5nLiBCeSBjb25zdW1pbmcgdGhlIGV2ZW50IGFsbAorICogc3Vic2VxdWVudCBldmVudHMgb2YgdGhlIGdlc3R1cmUgYXJlIHJlZGlyZWN0ZWQgdG8gdGhpcyBoYW5kbGVyLgorICovCitteFBvcHVwTWVudUhhbmRsZXIucHJvdG90eXBlLm1vdXNlRG93biA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJaWYgKHRoaXMuaXNFbmFibGVkKCkgJiYgIW14RXZlbnQuaXNNdWx0aVRvdWNoRXZlbnQobWUuZ2V0RXZlbnQoKSkpCisJeworCQkvLyBIaWRlcyB0aGUgcG9wdXBtZW51IGlmIGlzIGlzIGJlaW5nIGRpc3BsYXllZAorCQl0aGlzLmhpZGVNZW51KCk7CisJCXRoaXMudHJpZ2dlclggPSBtZS5nZXRHcmFwaFgoKTsKKwkJdGhpcy50cmlnZ2VyWSA9IG1lLmdldEdyYXBoWSgpOworCQl0aGlzLnNjcmVlblggPSBteEV2ZW50LmdldE1haW5FdmVudChtZS5nZXRFdmVudCgpKS5zY3JlZW5YOworCQl0aGlzLnNjcmVlblkgPSBteEV2ZW50LmdldE1haW5FdmVudChtZS5nZXRFdmVudCgpKS5zY3JlZW5ZOworCQl0aGlzLnBvcHVwVHJpZ2dlciA9IHRoaXMuaXNQb3B1cFRyaWdnZXIobWUpOworCQl0aGlzLmluVG9sZXJhbmNlID0gdHJ1ZTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3VzZU1vdmUKKyAqIAorICogSGFuZGxlcyB0aGUgZXZlbnQgYnkgdXBkYXRpbmcgdGhlIHBhbm5pbmcgb24gdGhlIGdyYXBoLgorICovCitteFBvcHVwTWVudUhhbmRsZXIucHJvdG90eXBlLm1vdXNlTW92ZSA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJLy8gUG9wdXAgdHJpZ2dlciBtYXkgY2hhbmdlIG9uIG1vdXNlVXAgc28gaWdub3JlIGl0CisJaWYgKHRoaXMuaW5Ub2xlcmFuY2UgJiYgdGhpcy5zY3JlZW5YICE9IG51bGwgJiYgdGhpcy5zY3JlZW5ZICE9IG51bGwpCisJeworCQlpZiAoTWF0aC5hYnMobXhFdmVudC5nZXRNYWluRXZlbnQobWUuZ2V0RXZlbnQoKSkuc2NyZWVuWCAtIHRoaXMuc2NyZWVuWCkgPiB0aGlzLmdyYXBoLnRvbGVyYW5jZSB8fAorCQkJTWF0aC5hYnMobXhFdmVudC5nZXRNYWluRXZlbnQobWUuZ2V0RXZlbnQoKSkuc2NyZWVuWSAtIHRoaXMuc2NyZWVuWSkgPiB0aGlzLmdyYXBoLnRvbGVyYW5jZSkKKwkJeworCQkJdGhpcy5pblRvbGVyYW5jZSA9IGZhbHNlOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogbW91c2VVcAorICogCisgKiBIYW5kbGVzIHRoZSBldmVudCBieSBzZXR0aW5nIHRoZSB0cmFuc2xhdGlvbiBvbiB0aGUgdmlldyBvciBzaG93aW5nIHRoZQorICogcG9wdXBtZW51LgorICovCitteFBvcHVwTWVudUhhbmRsZXIucHJvdG90eXBlLm1vdXNlVXAgPSBmdW5jdGlvbihzZW5kZXIsIG1lKQoreworCWlmICh0aGlzLnBvcHVwVHJpZ2dlciAmJiB0aGlzLmluVG9sZXJhbmNlICYmIHRoaXMudHJpZ2dlclggIT0gbnVsbCAmJiB0aGlzLnRyaWdnZXJZICE9IG51bGwpCisJeworCQl2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbEZvclBvcHVwRXZlbnQobWUpOworCisJCS8vIFNlbGVjdHMgdGhlIGNlbGwgZm9yIHdoaWNoIHRoZSBjb250ZXh0IG1lbnUgaXMgYmVpbmcgZGlzcGxheWVkCisJCWlmICh0aGlzLmdyYXBoLmlzRW5hYmxlZCgpICYmIHRoaXMuaXNTZWxlY3RPblBvcHVwKG1lKSAmJgorCQkJY2VsbCAhPSBudWxsICYmICF0aGlzLmdyYXBoLmlzQ2VsbFNlbGVjdGVkKGNlbGwpKQorCQl7CisJCQl0aGlzLmdyYXBoLnNldFNlbGVjdGlvbkNlbGwoY2VsbCk7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5jbGVhclNlbGVjdGlvbk9uQmFja2dyb3VuZCAmJiBjZWxsID09IG51bGwpCisJCXsKKwkJCXRoaXMuZ3JhcGguY2xlYXJTZWxlY3Rpb24oKTsKKwkJfQorCQkKKwkJLy8gSGlkZXMgdGhlIHRvb2x0aXAgaWYgdGhlcmUgaXMgb25lCisJCXRoaXMuZ3JhcGgudG9vbHRpcEhhbmRsZXIuaGlkZSgpOworCisJCS8vIE1lbnUgaXMgc2hpZnRlZCBieSAxIHBpeGVsIHNvIHRoYXQgdGhlIG1vdXNlIHVwIGV2ZW50CisJCS8vIGlzIHJvdXRlZCB2aWEgdGhlIHVuZGVybHlpbmcgc2hhcGUgaW5zdGVhZCBvZiB0aGUgRElWCisJCXZhciBvcmlnaW4gPSBteFV0aWxzLmdldFNjcm9sbE9yaWdpbigpOworCQl0aGlzLnBvcHVwKG1lLmdldFgoKSArIG9yaWdpbi54ICsgMSwgbWUuZ2V0WSgpICsgb3JpZ2luLnkgKyAxLCBjZWxsLCBtZS5nZXRFdmVudCgpKTsKKwkJbWUuY29uc3VtZSgpOworCX0KKwkKKwl0aGlzLnBvcHVwVHJpZ2dlciA9IGZhbHNlOworCXRoaXMuaW5Ub2xlcmFuY2UgPSBmYWxzZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldENlbGxGb3JQb3B1cEV2ZW50CisgKiAKKyAqIEhvb2sgdG8gcmV0dXJuIHRoZSBjZWxsIGZvciB0aGUgbW91c2UgdXAgcG9wdXAgdHJpZ2dlciBoYW5kbGluZy4KKyAqLworbXhQb3B1cE1lbnVIYW5kbGVyLnByb3RvdHlwZS5nZXRDZWxsRm9yUG9wdXBFdmVudCA9IGZ1bmN0aW9uKG1lKQoreworCXJldHVybiBtZS5nZXRDZWxsKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZXN0cm95CisgKiAKKyAqIERlc3Ryb3lzIHRoZSBoYW5kbGVyIGFuZCBhbGwgaXRzIHJlc291cmNlcyBhbmQgRE9NIG5vZGVzLgorICovCitteFBvcHVwTWVudUhhbmRsZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpCit7CisJdGhpcy5ncmFwaC5yZW1vdmVNb3VzZUxpc3RlbmVyKHRoaXMpOworCXRoaXMuZ3JhcGgucmVtb3ZlTGlzdGVuZXIodGhpcy5nZXN0dXJlSGFuZGxlcik7CisJCisJLy8gU3VwZXJjYWxsCisJbXhQb3B1cE1lbnUucHJvdG90eXBlLmRlc3Ryb3kuYXBwbHkodGhpcyk7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhSdWJiZXJiYW5kLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhSdWJiZXJiYW5kLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMjlmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teFJ1YmJlcmJhbmQuanMKQEAgLTAsMCArMSw0MDEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTYsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE2LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14UnViYmVyYmFuZAorICogCisgKiBFdmVudCBoYW5kbGVyIHRoYXQgc2VsZWN0cyByZWN0YW5ndWxhciByZWdpb25zLiBUaGlzIGlzIG5vdCBidWlsdC1pbnRvCisgKiA8bXhHcmFwaD4uIFRvIGVuYWJsZSBydWJiZXJiYW5kIHNlbGVjdGlvbiBpbiBhIGdyYXBoLCB1c2UgdGhlIGZvbGxvd2luZyBjb2RlLgorICogCisgKiBFeGFtcGxlOgorICogCisgKiAoY29kZSkKKyAqIHZhciBydWJiZXJiYW5kID0gbmV3IG14UnViYmVyYmFuZChncmFwaCk7CisgKiAoZW5kKQorICogCisgKiBDb25zdHJ1Y3RvcjogbXhSdWJiZXJiYW5kCisgKiAKKyAqIENvbnN0cnVjdHMgYW4gZXZlbnQgaGFuZGxlciB0aGF0IHNlbGVjdHMgcmVjdGFuZ3VsYXIgcmVnaW9ucyBpbiB0aGUgZ3JhcGgKKyAqIHVzaW5nIHJ1YmJlcmJhbmQgc2VsZWN0aW9uLgorICovCitmdW5jdGlvbiBteFJ1YmJlcmJhbmQoZ3JhcGgpCit7CisJaWYgKGdyYXBoICE9IG51bGwpCisJeworCQl0aGlzLmdyYXBoID0gZ3JhcGg7CisJCXRoaXMuZ3JhcGguYWRkTW91c2VMaXN0ZW5lcih0aGlzKTsKKworCQkvLyBIYW5kbGVzIGZvcmNlIHJ1YmJlcmJhbmQgZXZlbnQKKwkJdGhpcy5mb3JjZVJ1YmJlcmJhbmRIYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorCQl7CisJCQl2YXIgZXZ0TmFtZSA9IGV2dC5nZXRQcm9wZXJ0eSgnZXZlbnROYW1lJyk7CisJCQl2YXIgbWUgPSBldnQuZ2V0UHJvcGVydHkoJ2V2ZW50Jyk7CisJCQkKKwkJCWlmIChldnROYW1lID09IG14RXZlbnQuTU9VU0VfRE9XTiAmJiB0aGlzLmlzRm9yY2VSdWJiZXJiYW5kRXZlbnQobWUpKQorCQkJeworCQkJCXZhciBvZmZzZXQgPSBteFV0aWxzLmdldE9mZnNldCh0aGlzLmdyYXBoLmNvbnRhaW5lcik7CisJCQkJdmFyIG9yaWdpbiA9IG14VXRpbHMuZ2V0U2Nyb2xsT3JpZ2luKHRoaXMuZ3JhcGguY29udGFpbmVyKTsKKwkJCQlvcmlnaW4ueCAtPSBvZmZzZXQueDsKKwkJCQlvcmlnaW4ueSAtPSBvZmZzZXQueTsKKwkJCQl0aGlzLnN0YXJ0KG1lLmdldFgoKSArIG9yaWdpbi54LCBtZS5nZXRZKCkgKyBvcmlnaW4ueSk7CisJCQkJbWUuY29uc3VtZShmYWxzZSk7CisJCQl9CisJCX0pOworCQkKKwkJdGhpcy5ncmFwaC5hZGRMaXN0ZW5lcihteEV2ZW50LkZJUkVfTU9VU0VfRVZFTlQsIHRoaXMuZm9yY2VSdWJiZXJiYW5kSGFuZGxlcik7CisJCQorCQkvLyBSZXBhaW50cyB0aGUgbWFycXVlZSBhZnRlciBhdXRvc2Nyb2xsCisJCXRoaXMucGFuSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbigpCisJCXsKKwkJCXRoaXMucmVwYWludCgpOworCQl9KTsKKwkJCisJCXRoaXMuZ3JhcGguYWRkTGlzdGVuZXIobXhFdmVudC5QQU4sIHRoaXMucGFuSGFuZGxlcik7CisJCQorCQkvLyBEb2VzIG5vdCBzaG93IG1lbnUgaWYgYW55IHRvdWNoIGdlc3R1cmVzIHRha2UgcGxhY2UgYWZ0ZXIgdGhlIHRyaWdnZXIKKwkJdGhpcy5nZXN0dXJlSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihzZW5kZXIsIGVvKQorCQl7CisJCQlpZiAodGhpcy5maXJzdCAhPSBudWxsKQorCQkJeworCQkJCXRoaXMucmVzZXQoKTsKKwkJCX0KKwkJfSk7CisJCQorCQl0aGlzLmdyYXBoLmFkZExpc3RlbmVyKG14RXZlbnQuR0VTVFVSRSwgdGhpcy5nZXN0dXJlSGFuZGxlcik7CisJCQorCQkvLyBBdXRvbWF0aWMgZGVhbGxvY2F0aW9uIG9mIG1lbW9yeQorCQlpZiAobXhDbGllbnQuSVNfSUUpCisJCXsKKwkJCW14RXZlbnQuYWRkTGlzdGVuZXIod2luZG93LCAndW5sb2FkJywKKwkJCQlteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCQkJCXsKKwkJCQkJdGhpcy5kZXN0cm95KCk7CisJCQkJfSkKKwkJCSk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIFZhcmlhYmxlOiBkZWZhdWx0T3BhY2l0eQorICogCisgKiBTcGVjaWZpZXMgdGhlIGRlZmF1bHQgb3BhY2l0eSB0byBiZSB1c2VkIGZvciB0aGUgcnViYmVyYmFuZCBkaXYuIERlZmF1bHQKKyAqIGlzIDIwLgorICovCitteFJ1YmJlcmJhbmQucHJvdG90eXBlLmRlZmF1bHRPcGFjaXR5ID0gMjA7CisKKy8qKgorICogVmFyaWFibGU6IGVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIGV2ZW50cyBhcmUgaGFuZGxlZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteFJ1YmJlcmJhbmQucHJvdG90eXBlLmVuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBkaXYKKyAqIAorICogSG9sZHMgdGhlIERJViBlbGVtZW50IHdoaWNoIGlzIGN1cnJlbnRseSB2aXNpYmxlLgorICovCitteFJ1YmJlcmJhbmQucHJvdG90eXBlLmRpdiA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHNoYXJlZERpdgorICogCisgKiBIb2xkcyB0aGUgRElWIGVsZW1lbnQgd2hpY2ggaXMgdXNlZCB0byBkaXNwbGF5IHRoZSBydWJiZXJiYW5kLgorICovCitteFJ1YmJlcmJhbmQucHJvdG90eXBlLnNoYXJlZERpdiA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGN1cnJlbnRYCisgKiAKKyAqIEhvbGRzIHRoZSB2YWx1ZSBvZiB0aGUgeCBhcmd1bWVudCBpbiB0aGUgbGFzdCBjYWxsIHRvIDx1cGRhdGU+LgorICovCitteFJ1YmJlcmJhbmQucHJvdG90eXBlLmN1cnJlbnRYID0gMDsKKworLyoqCisgKiBWYXJpYWJsZTogY3VycmVudFkKKyAqIAorICogSG9sZHMgdGhlIHZhbHVlIG9mIHRoZSB5IGFyZ3VtZW50IGluIHRoZSBsYXN0IGNhbGwgdG8gPHVwZGF0ZT4uCisgKi8KK214UnViYmVyYmFuZC5wcm90b3R5cGUuY3VycmVudFkgPSAwOworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0VuYWJsZWQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIGV2ZW50cyBhcmUgaGFuZGxlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zCisgKiA8ZW5hYmxlZD4uCisgKi8KK214UnViYmVyYmFuZC5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmVuYWJsZWQ7Cit9OworCQkKKy8qKgorICogRnVuY3Rpb246IHNldEVuYWJsZWQKKyAqIAorICogRW5hYmxlcyBvciBkaXNhYmxlcyBldmVudCBoYW5kbGluZy4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1cGRhdGVzCisgKiA8ZW5hYmxlZD4uCisgKi8KK214UnViYmVyYmFuZC5wcm90b3R5cGUuc2V0RW5hYmxlZCA9IGZ1bmN0aW9uKGVuYWJsZWQpCit7CisJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzRm9yY2VSdWJiZXJiYW5kRXZlbnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8bXhNb3VzZUV2ZW50PiBzaG91bGQgc3RhcnQgcnViYmVyYmFuZCBzZWxlY3Rpb24uCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgYWx0IGtleSBpcyBwcmVzc2VkLgorICovCitteFJ1YmJlcmJhbmQucHJvdG90eXBlLmlzRm9yY2VSdWJiZXJiYW5kRXZlbnQgPSBmdW5jdGlvbihtZSkKK3sKKwlyZXR1cm4gbXhFdmVudC5pc0FsdERvd24obWUuZ2V0RXZlbnQoKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3VzZURvd24KKyAqIAorICogSGFuZGxlcyB0aGUgZXZlbnQgYnkgaW5pdGlhdGluZyBhIHJ1YmJlcmJhbmQgc2VsZWN0aW9uLiBCeSBjb25zdW1pbmcgdGhlCisgKiBldmVudCBhbGwgc3Vic2VxdWVudCBldmVudHMgb2YgdGhlIGdlc3R1cmUgYXJlIHJlZGlyZWN0ZWQgdG8gdGhpcworICogaGFuZGxlci4KKyAqLworbXhSdWJiZXJiYW5kLnByb3RvdHlwZS5tb3VzZURvd24gPSBmdW5jdGlvbihzZW5kZXIsIG1lKQoreworCWlmICghbWUuaXNDb25zdW1lZCgpICYmIHRoaXMuaXNFbmFibGVkKCkgJiYgdGhpcy5ncmFwaC5pc0VuYWJsZWQoKSAmJgorCQltZS5nZXRTdGF0ZSgpID09IG51bGwgJiYgIW14RXZlbnQuaXNNdWx0aVRvdWNoRXZlbnQobWUuZ2V0RXZlbnQoKSkpCisJeworCQl2YXIgb2Zmc2V0ID0gbXhVdGlscy5nZXRPZmZzZXQodGhpcy5ncmFwaC5jb250YWluZXIpOworCQl2YXIgb3JpZ2luID0gbXhVdGlscy5nZXRTY3JvbGxPcmlnaW4odGhpcy5ncmFwaC5jb250YWluZXIpOworCQlvcmlnaW4ueCAtPSBvZmZzZXQueDsKKwkJb3JpZ2luLnkgLT0gb2Zmc2V0Lnk7CisJCXRoaXMuc3RhcnQobWUuZ2V0WCgpICsgb3JpZ2luLngsIG1lLmdldFkoKSArIG9yaWdpbi55KTsKKworCQkvLyBEb2VzIG5vdCBwcmV2ZW50IHRoZSBkZWZhdWx0IGZvciB0aGlzIGV2ZW50IHNvIHRoYXQgdGhlCisJCS8vIGV2ZW50IHByb2Nlc3NpbmcgY2hhaW4gaXMgc3RpbGwgZXhlY3V0ZWQgZXZlbiBpZiB3ZSBzdGFydAorCQkvLyBydWJiZXJiYW5kaW5nLiBUaGlzIGlzIHJlcXVpcmVkIGVnLiBpbiBFeHRKcyB0byBoaWRlIHRoZQorCQkvLyBjdXJyZW50IGNvbnRleHQgbWVudS4gSW4gbW91c2VNb3ZlIHdlJ2xsIG1ha2Ugc3VyZSB3ZSdyZQorCQkvLyBub3Qgc2VsZWN0aW5nIGFueXRoaW5nIHdoaWxlIHdlJ3JlIHJ1YmJlcmJhbmRpbmcuCisJCW1lLmNvbnN1bWUoZmFsc2UpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHN0YXJ0CisgKiAKKyAqIFNldHMgdGhlIHN0YXJ0IHBvaW50IGZvciB0aGUgcnViYmVyYmFuZCBzZWxlY3Rpb24uCisgKi8KK214UnViYmVyYmFuZC5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbih4LCB5KQoreworCXRoaXMuZmlyc3QgPSBuZXcgbXhQb2ludCh4LCB5KTsKKworCXZhciBjb250YWluZXIgPSB0aGlzLmdyYXBoLmNvbnRhaW5lcjsKKwkKKwlmdW5jdGlvbiBjcmVhdGVNb3VzZUV2ZW50KGV2dCkKKwl7CisJCXZhciBtZSA9IG5ldyBteE1vdXNlRXZlbnQoZXZ0KTsKKwkJdmFyIHB0ID0gbXhVdGlscy5jb252ZXJ0UG9pbnQoY29udGFpbmVyLCBtZS5nZXRYKCksIG1lLmdldFkoKSk7CisJCQorCQltZS5ncmFwaFggPSBwdC54OworCQltZS5ncmFwaFkgPSBwdC55OworCQkKKwkJcmV0dXJuIG1lOworCX07CisKKwl0aGlzLmRyYWdIYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwl7CisJCXRoaXMubW91c2VNb3ZlKHRoaXMuZ3JhcGgsIGNyZWF0ZU1vdXNlRXZlbnQoZXZ0KSk7CisJfSk7CisKKwl0aGlzLmRyb3BIYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwl7CisJCXRoaXMubW91c2VVcCh0aGlzLmdyYXBoLCBjcmVhdGVNb3VzZUV2ZW50KGV2dCkpOworCX0pOworCisJLy8gV29ya2Fyb3VuZCBmb3IgcnViYmVyYmFuZCBzdG9wcGluZyBpZiB0aGUgbW91c2UgbGVhdmVzIHRoZSBjb250YWluZXIgaW4gRmlyZWZveAorCWlmIChteENsaWVudC5JU19GRikKKwl7CisJCW14RXZlbnQuYWRkR2VzdHVyZUxpc3RlbmVycyhkb2N1bWVudCwgbnVsbCwgdGhpcy5kcmFnSGFuZGxlciwgdGhpcy5kcm9wSGFuZGxlcik7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogbW91c2VNb3ZlCisgKiAKKyAqIEhhbmRsZXMgdGhlIGV2ZW50IGJ5IHVwZGF0aW5nIHRoZXJ1YmJlcmJhbmQgc2VsZWN0aW9uLgorICovCitteFJ1YmJlcmJhbmQucHJvdG90eXBlLm1vdXNlTW92ZSA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJaWYgKCFtZS5pc0NvbnN1bWVkKCkgJiYgdGhpcy5maXJzdCAhPSBudWxsKQorCXsKKwkJdmFyIG9yaWdpbiA9IG14VXRpbHMuZ2V0U2Nyb2xsT3JpZ2luKHRoaXMuZ3JhcGguY29udGFpbmVyKTsKKwkJdmFyIG9mZnNldCA9IG14VXRpbHMuZ2V0T2Zmc2V0KHRoaXMuZ3JhcGguY29udGFpbmVyKTsKKwkJb3JpZ2luLnggLT0gb2Zmc2V0Lng7CisJCW9yaWdpbi55IC09IG9mZnNldC55OworCQl2YXIgeCA9IG1lLmdldFgoKSArIG9yaWdpbi54OworCQl2YXIgeSA9IG1lLmdldFkoKSArIG9yaWdpbi55OworCQl2YXIgZHggPSB0aGlzLmZpcnN0LnggLSB4OworCQl2YXIgZHkgPSB0aGlzLmZpcnN0LnkgLSB5OworCQl2YXIgdG9sID0gdGhpcy5ncmFwaC50b2xlcmFuY2U7CisJCQorCQlpZiAodGhpcy5kaXYgIT0gbnVsbCB8fCBNYXRoLmFicyhkeCkgPiB0b2wgfHwgIE1hdGguYWJzKGR5KSA+IHRvbCkKKwkJeworCQkJaWYgKHRoaXMuZGl2ID09IG51bGwpCisJCQl7CisJCQkJdGhpcy5kaXYgPSB0aGlzLmNyZWF0ZVNoYXBlKCk7CisJCQl9CisJCQkKKwkJCS8vIENsZWFycyBzZWxlY3Rpb24gd2hpbGUgcnViYmVyYmFuZGluZy4gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlCisJCQkvLyB0aGUgZXZlbnQgaXMgbm90IGNvbnN1bWVkIGluIG1vdXNlRG93bi4KKwkJCW14VXRpbHMuY2xlYXJTZWxlY3Rpb24oKTsKKwkJCQorCQkJdGhpcy51cGRhdGUoeCwgeSk7CisJCQltZS5jb25zdW1lKCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVTaGFwZQorICogCisgKiBDcmVhdGVzIHRoZSBydWJiZXJiYW5kIHNlbGVjdGlvbiBzaGFwZS4KKyAqLworbXhSdWJiZXJiYW5kLnByb3RvdHlwZS5jcmVhdGVTaGFwZSA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAodGhpcy5zaGFyZWREaXYgPT0gbnVsbCkKKwl7CisJCXRoaXMuc2hhcmVkRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCXRoaXMuc2hhcmVkRGl2LmNsYXNzTmFtZSA9ICdteFJ1YmJlcmJhbmQnOworCQlteFV0aWxzLnNldE9wYWNpdHkodGhpcy5zaGFyZWREaXYsIHRoaXMuZGVmYXVsdE9wYWNpdHkpOworCX0KKworCXRoaXMuZ3JhcGguY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc2hhcmVkRGl2KTsKKwkJCisJcmV0dXJuIHRoaXMuc2hhcmVkRGl2OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNBY3RpdmUKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaGFuZGxlciBpcyBhY3RpdmUuCisgKi8KK214UnViYmVyYmFuZC5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbihzZW5kZXIsIG1lKQoreworCXJldHVybiB0aGlzLmRpdiAhPSBudWxsICYmIHRoaXMuZGl2LnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogbW91c2VVcAorICogCisgKiBIYW5kbGVzIHRoZSBldmVudCBieSBzZWxlY3RpbmcgdGhlIHJlZ2lvbiBvZiB0aGUgcnViYmVyYmFuZCB1c2luZworICogPG14R3JhcGguc2VsZWN0UmVnaW9uPi4KKyAqLworbXhSdWJiZXJiYW5kLnByb3RvdHlwZS5tb3VzZVVwID0gZnVuY3Rpb24oc2VuZGVyLCBtZSkKK3sKKwl2YXIgYWN0aXZlID0gdGhpcy5pc0FjdGl2ZSgpOworCXRoaXMucmVzZXQoKTsKKwkKKwlpZiAoYWN0aXZlKQorCXsKKwkJdGhpcy5leGVjdXRlKG1lLmdldEV2ZW50KCkpOworCQltZS5jb25zdW1lKCk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZXhlY3V0ZQorICogCisgKiBSZXNldHMgdGhlIHN0YXRlIG9mIHRoaXMgaGFuZGxlciBhbmQgc2VsZWN0cyB0aGUgY3VycmVudCByZWdpb24KKyAqIGZvciB0aGUgZ2l2ZW4gZXZlbnQuCisgKi8KK214UnViYmVyYmFuZC5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uKGV2dCkKK3sKKwl2YXIgcmVjdCA9IG5ldyBteFJlY3RhbmdsZSh0aGlzLngsIHRoaXMueSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpOworCXRoaXMuZ3JhcGguc2VsZWN0UmVnaW9uKHJlY3QsIGV2dCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZXNldAorICogCisgKiBSZXNldHMgdGhlIHN0YXRlIG9mIHRoZSBydWJiZXJiYW5kIHNlbGVjdGlvbi4KKyAqLworbXhSdWJiZXJiYW5kLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAodGhpcy5kaXYgIT0gbnVsbCkKKwl7CisJCXRoaXMuZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kaXYpOworCX0KKworCW14RXZlbnQucmVtb3ZlR2VzdHVyZUxpc3RlbmVycyhkb2N1bWVudCwgbnVsbCwgdGhpcy5kcmFnSGFuZGxlciwgdGhpcy5kcm9wSGFuZGxlcik7CisJdGhpcy5kcmFnSGFuZGxlciA9IG51bGw7CisJdGhpcy5kcm9wSGFuZGxlciA9IG51bGw7CisJCisJdGhpcy5jdXJyZW50WCA9IDA7CisJdGhpcy5jdXJyZW50WSA9IDA7CisJdGhpcy5maXJzdCA9IG51bGw7CisJdGhpcy5kaXYgPSBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlCisgKiAKKyAqIFNldHMgPGN1cnJlbnRYPiBhbmQgPGN1cnJlbnRZPiBhbmQgY2FsbHMgPHJlcGFpbnQ+LgorICovCitteFJ1YmJlcmJhbmQucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKHgsIHkpCit7CisJdGhpcy5jdXJyZW50WCA9IHg7CisJdGhpcy5jdXJyZW50WSA9IHk7CisJCisJdGhpcy5yZXBhaW50KCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZXBhaW50CisgKiAKKyAqIENvbXB1dGVzIHRoZSBib3VuZGluZyBib3ggYW5kIHVwZGF0ZXMgdGhlIHN0eWxlIG9mIHRoZSA8ZGl2Pi4KKyAqLworbXhSdWJiZXJiYW5kLnByb3RvdHlwZS5yZXBhaW50ID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLmRpdiAhPSBudWxsKQorCXsKKwkJdmFyIHggPSB0aGlzLmN1cnJlbnRYIC0gdGhpcy5ncmFwaC5wYW5EeDsKKwkJdmFyIHkgPSB0aGlzLmN1cnJlbnRZIC0gdGhpcy5ncmFwaC5wYW5EeTsKKwkJCisJCXRoaXMueCA9IE1hdGgubWluKHRoaXMuZmlyc3QueCwgeCk7CisJCXRoaXMueSA9IE1hdGgubWluKHRoaXMuZmlyc3QueSwgeSk7CisJCXRoaXMud2lkdGggPSBNYXRoLm1heCh0aGlzLmZpcnN0LngsIHgpIC0gdGhpcy54OworCQl0aGlzLmhlaWdodCA9ICBNYXRoLm1heCh0aGlzLmZpcnN0LnksIHkpIC0gdGhpcy55OworCisJCXZhciBkeCA9IChteENsaWVudC5JU19WTUwpID8gdGhpcy5ncmFwaC5wYW5EeCA6IDA7CisJCXZhciBkeSA9IChteENsaWVudC5JU19WTUwpID8gdGhpcy5ncmFwaC5wYW5EeSA6IDA7CisJCQorCQl0aGlzLmRpdi5zdHlsZS5sZWZ0ID0gKHRoaXMueCArIGR4KSArICdweCc7CisJCXRoaXMuZGl2LnN0eWxlLnRvcCA9ICh0aGlzLnkgKyBkeSkgKyAncHgnOworCQl0aGlzLmRpdi5zdHlsZS53aWR0aCA9IE1hdGgubWF4KDEsIHRoaXMud2lkdGgpICsgJ3B4JzsKKwkJdGhpcy5kaXYuc3R5bGUuaGVpZ2h0ID0gTWF0aC5tYXgoMSwgdGhpcy5oZWlnaHQpICsgJ3B4JzsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZXN0cm95CisgKiAKKyAqIERlc3Ryb3lzIHRoZSBoYW5kbGVyIGFuZCBhbGwgaXRzIHJlc291cmNlcyBhbmQgRE9NIG5vZGVzLiBUaGlzIGRvZXMKKyAqIG5vcm1hbGx5IG5vdCBuZWVkIHRvIGJlIGNhbGxlZCwgaXQgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUKKyAqIHdpbmRvdyB1bmxvYWRzLgorICovCitteFJ1YmJlcmJhbmQucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpCit7CisJaWYgKCF0aGlzLmRlc3Ryb3llZCkKKwl7CisJCXRoaXMuZGVzdHJveWVkID0gdHJ1ZTsKKwkJdGhpcy5ncmFwaC5yZW1vdmVNb3VzZUxpc3RlbmVyKHRoaXMpOworCQl0aGlzLmdyYXBoLnJlbW92ZUxpc3RlbmVyKHRoaXMuZm9yY2VSdWJiZXJiYW5kSGFuZGxlcik7CisJCXRoaXMuZ3JhcGgucmVtb3ZlTGlzdGVuZXIodGhpcy5wYW5IYW5kbGVyKTsKKwkJdGhpcy5yZXNldCgpOworCQkKKwkJaWYgKHRoaXMuc2hhcmVkRGl2ICE9IG51bGwpCisJCXsKKwkJCXRoaXMuc2hhcmVkRGl2ID0gbnVsbDsKKwkJfQorCX0KK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teFNlbGVjdGlvbkNlbGxzSGFuZGxlci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214U2VsZWN0aW9uQ2VsbHNIYW5kbGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMmUyMzcKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teFNlbGVjdGlvbkNlbGxzSGFuZGxlci5qcwpAQCAtMCwwICsxLDI4NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhTZWxlY3Rpb25DZWxsc0hhbmRsZXIKKyAqIAorICogQW4gZXZlbnQgaGFuZGxlciB0aGF0IG1hbmFnZXMgY2VsbCBoYW5kbGVycyBhbmQgaW52b2tlcyB0aGVpciBtb3VzZSBldmVudAorICogcHJvY2Vzc2luZyBmdW5jdGlvbnMuCisgKiAKKyAqIEdyb3VwOiBFdmVudHMKKyAqIAorICogRXZlbnQ6IG14RXZlbnQuQURECisgKiAKKyAqIEZpcmVzIGlmIGEgY2VsbCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgc2VsZWN0aW9uLiBUaGUgPGNvZGU+c3RhdGU8L2NvZGU+CisgKiBwcm9wZXJ0eSBjb250YWlucyB0aGUgPG14Q2VsbFN0YXRlPiB0aGF0IGhhcyBiZWVuIGFkZGVkLgorICogCisgKiBFdmVudDogbXhFdmVudC5SRU1PVkUKKyAqIAorICogRmlyZXMgaWYgYSBjZWxsIGhhcyBiZWVuIHJlbW92ZSBmcm9tIHRoZSBzZWxlY3Rpb24uIFRoZSA8Y29kZT5zdGF0ZTwvY29kZT4KKyAqIHByb3BlcnR5IGNvbnRhaW5zIHRoZSA8bXhDZWxsU3RhdGU+IHRoYXQgaGFzIGJlZW4gcmVtb3ZlZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZ3JhcGggLSBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKi8KK2Z1bmN0aW9uIG14U2VsZWN0aW9uQ2VsbHNIYW5kbGVyKGdyYXBoKQoreworCW14RXZlbnRTb3VyY2UuY2FsbCh0aGlzKTsKKwkKKwl0aGlzLmdyYXBoID0gZ3JhcGg7CisJdGhpcy5oYW5kbGVycyA9IG5ldyBteERpY3Rpb25hcnkoKTsKKwl0aGlzLmdyYXBoLmFkZE1vdXNlTGlzdGVuZXIodGhpcyk7CisJCisJdGhpcy5yZWZyZXNoSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihzZW5kZXIsIGV2dCkKKwl7CisJCWlmICh0aGlzLmlzRW5hYmxlZCgpKQorCQl7CisJCQl0aGlzLnJlZnJlc2goKTsKKwkJfQorCX0pOworCQorCXRoaXMuZ3JhcGguZ2V0U2VsZWN0aW9uTW9kZWwoKS5hZGRMaXN0ZW5lcihteEV2ZW50LkNIQU5HRSwgdGhpcy5yZWZyZXNoSGFuZGxlcik7CisJdGhpcy5ncmFwaC5nZXRNb2RlbCgpLmFkZExpc3RlbmVyKG14RXZlbnQuQ0hBTkdFLCB0aGlzLnJlZnJlc2hIYW5kbGVyKTsKKwl0aGlzLmdyYXBoLmdldFZpZXcoKS5hZGRMaXN0ZW5lcihteEV2ZW50LlNDQUxFLCB0aGlzLnJlZnJlc2hIYW5kbGVyKTsKKwl0aGlzLmdyYXBoLmdldFZpZXcoKS5hZGRMaXN0ZW5lcihteEV2ZW50LlRSQU5TTEFURSwgdGhpcy5yZWZyZXNoSGFuZGxlcik7CisJdGhpcy5ncmFwaC5nZXRWaWV3KCkuYWRkTGlzdGVuZXIobXhFdmVudC5TQ0FMRV9BTkRfVFJBTlNMQVRFLCB0aGlzLnJlZnJlc2hIYW5kbGVyKTsKKwl0aGlzLmdyYXBoLmdldFZpZXcoKS5hZGRMaXN0ZW5lcihteEV2ZW50LkRPV04sIHRoaXMucmVmcmVzaEhhbmRsZXIpOworCXRoaXMuZ3JhcGguZ2V0VmlldygpLmFkZExpc3RlbmVyKG14RXZlbnQuVVAsIHRoaXMucmVmcmVzaEhhbmRsZXIpOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14RXZlbnRTb3VyY2UuCisgKi8KK214VXRpbHMuZXh0ZW5kKG14U2VsZWN0aW9uQ2VsbHNIYW5kbGVyLCBteEV2ZW50U291cmNlKTsKKworLyoqCisgKiBWYXJpYWJsZTogZ3JhcGgKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgPG14R3JhcGg+LgorICovCitteFNlbGVjdGlvbkNlbGxzSGFuZGxlci5wcm90b3R5cGUuZ3JhcGggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBlbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiBldmVudHMgYXJlIGhhbmRsZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhTZWxlY3Rpb25DZWxsc0hhbmRsZXIucHJvdG90eXBlLmVuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiByZWZyZXNoSGFuZGxlcgorICogCisgKiBLZWVwcyBhIHJlZmVyZW5jZSB0byBhbiBldmVudCBsaXN0ZW5lciBmb3IgbGF0ZXIgcmVtb3ZhbC4KKyAqLworbXhTZWxlY3Rpb25DZWxsc0hhbmRsZXIucHJvdG90eXBlLnJlZnJlc2hIYW5kbGVyID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbWF4SGFuZGxlcnMKKyAqIAorICogRGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaGFuZGxlcnMgdG8gcGFpbnQgaW5kaXZpZHVhbGx5LiBEZWZhdWx0IGlzIDEwMC4KKyAqLworbXhTZWxlY3Rpb25DZWxsc0hhbmRsZXIucHJvdG90eXBlLm1heEhhbmRsZXJzID0gMTAwOworCisvKioKKyAqIFZhcmlhYmxlOiBoYW5kbGVycworICogCisgKiA8bXhEaWN0aW9uYXJ5PiB0aGF0IG1hcHMgZnJvbSBjZWxscyB0byBoYW5kbGVycy4KKyAqLworbXhTZWxlY3Rpb25DZWxsc0hhbmRsZXIucHJvdG90eXBlLmhhbmRsZXJzID0gbnVsbDsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFbmFibGVkCisgKiAKKyAqIFJldHVybnMgPGVuYWJsZWQ+LgorICovCitteFNlbGVjdGlvbkNlbGxzSGFuZGxlci5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmVuYWJsZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRFbmFibGVkCisgKiAKKyAqIFNldHMgPGVuYWJsZWQ+LgorICovCitteFNlbGVjdGlvbkNlbGxzSGFuZGxlci5wcm90b3R5cGUuc2V0RW5hYmxlZCA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuZW5hYmxlZCA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0SGFuZGxlcgorICogCisgKiBSZXR1cm5zIHRoZSBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gY2VsbC4KKyAqLworbXhTZWxlY3Rpb25DZWxsc0hhbmRsZXIucHJvdG90eXBlLmdldEhhbmRsZXIgPSBmdW5jdGlvbihjZWxsKQoreworCXJldHVybiB0aGlzLmhhbmRsZXJzLmdldChjZWxsKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlc2V0CisgKiAKKyAqIFJlc2V0cyBhbGwgaGFuZGxlcnMuCisgKi8KK214U2VsZWN0aW9uQ2VsbHNIYW5kbGVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLmhhbmRsZXJzLnZpc2l0KGZ1bmN0aW9uKGtleSwgaGFuZGxlcikKKwl7CisJCWhhbmRsZXIucmVzZXQuYXBwbHkoaGFuZGxlcik7CisJfSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWZyZXNoCisgKiAKKyAqIFJlbG9hZHMgb3IgdXBkYXRlcyBhbGwgaGFuZGxlcnMuCisgKi8KK214U2VsZWN0aW9uQ2VsbHNIYW5kbGVyLnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24oKQoreworCS8vIFJlbW92ZXMgYWxsIGV4aXN0aW5nIGhhbmRsZXJzCisJdmFyIG9sZEhhbmRsZXJzID0gdGhpcy5oYW5kbGVyczsKKwl0aGlzLmhhbmRsZXJzID0gbmV3IG14RGljdGlvbmFyeSgpOworCQorCS8vIENyZWF0ZXMgaGFuZGxlcyBmb3IgYWxsIHNlbGVjdGlvbiBjZWxscworCXZhciB0bXAgPSB0aGlzLmdyYXBoLmdldFNlbGVjdGlvbkNlbGxzKCk7CisKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRtcC5sZW5ndGg7IGkrKykKKwl7CisJCXZhciBzdGF0ZSA9IHRoaXMuZ3JhcGgudmlldy5nZXRTdGF0ZSh0bXBbaV0pOworCisJCWlmIChzdGF0ZSAhPSBudWxsKQorCQl7CisJCQl2YXIgaGFuZGxlciA9IG9sZEhhbmRsZXJzLnJlbW92ZSh0bXBbaV0pOworCisJCQlpZiAoaGFuZGxlciAhPSBudWxsKQorCQkJeworCQkJCWlmIChoYW5kbGVyLnN0YXRlICE9IHN0YXRlKQorCQkJCXsKKwkJCQkJaGFuZGxlci5kZXN0cm95KCk7CisJCQkJCWhhbmRsZXIgPSBudWxsOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZiAoaGFuZGxlci5yZWZyZXNoICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCWhhbmRsZXIucmVmcmVzaCgpOworCQkJCQl9CisJCQkJCQorCQkJCQloYW5kbGVyLnJlZHJhdygpOworCQkJCX0KKwkJCX0KKwkJCQorCQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKKwkJCXsKKwkJCQloYW5kbGVyID0gdGhpcy5ncmFwaC5jcmVhdGVIYW5kbGVyKHN0YXRlKTsKKwkJCQl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LkFERCwgJ3N0YXRlJywgc3RhdGUpKTsKKwkJCX0KKwkJCQorCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLmhhbmRsZXJzLnB1dCh0bXBbaV0sIGhhbmRsZXIpOworCQkJfQorCQl9CisJfQorCQorCS8vIERlc3Ryb3lzIGFsbCB1bnVzZWQgaGFuZGxlcnMKKwlvbGRIYW5kbGVycy52aXNpdChteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oa2V5LCBoYW5kbGVyKQorCXsKKwkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5SRU1PVkUsICdzdGF0ZScsIGhhbmRsZXIuc3RhdGUpKTsKKwkJaGFuZGxlci5kZXN0cm95KCk7CisJfSkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlSGFuZGxlcgorICogCisgKiBVcGRhdGVzIHRoZSBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gc2hhcGUgaWYgb25lIGV4aXN0cy4KKyAqLworbXhTZWxlY3Rpb25DZWxsc0hhbmRsZXIucHJvdG90eXBlLnVwZGF0ZUhhbmRsZXIgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwl2YXIgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMucmVtb3ZlKHN0YXRlLmNlbGwpOworCQorCWlmIChoYW5kbGVyICE9IG51bGwpCisJeworCQloYW5kbGVyLmRlc3Ryb3koKTsKKwkJaGFuZGxlciA9IHRoaXMuZ3JhcGguY3JlYXRlSGFuZGxlcihzdGF0ZSk7CisJCQorCQlpZiAoaGFuZGxlciAhPSBudWxsKQorCQl7CisJCQl0aGlzLmhhbmRsZXJzLnB1dChzdGF0ZS5jZWxsLCBoYW5kbGVyKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdXNlRG93bgorICogCisgKiBSZWRpcmVjdHMgdGhlIGdpdmVuIGV2ZW50IHRvIHRoZSBoYW5kbGVycy4KKyAqLworbXhTZWxlY3Rpb25DZWxsc0hhbmRsZXIucHJvdG90eXBlLm1vdXNlRG93biA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJaWYgKHRoaXMuZ3JhcGguaXNFbmFibGVkKCkgJiYgdGhpcy5pc0VuYWJsZWQoKSkKKwl7CisJCXZhciBhcmdzID0gW3NlbmRlciwgbWVdOworCisJCXRoaXMuaGFuZGxlcnMudmlzaXQoZnVuY3Rpb24oa2V5LCBoYW5kbGVyKQorCQl7CisJCQloYW5kbGVyLm1vdXNlRG93bi5hcHBseShoYW5kbGVyLCBhcmdzKTsKKwkJfSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogbW91c2VNb3ZlCisgKiAKKyAqIFJlZGlyZWN0cyB0aGUgZ2l2ZW4gZXZlbnQgdG8gdGhlIGhhbmRsZXJzLgorICovCitteFNlbGVjdGlvbkNlbGxzSGFuZGxlci5wcm90b3R5cGUubW91c2VNb3ZlID0gZnVuY3Rpb24oc2VuZGVyLCBtZSkKK3sKKwlpZiAodGhpcy5ncmFwaC5pc0VuYWJsZWQoKSAmJiB0aGlzLmlzRW5hYmxlZCgpKQorCXsKKwkJdmFyIGFyZ3MgPSBbc2VuZGVyLCBtZV07CisKKwkJdGhpcy5oYW5kbGVycy52aXNpdChmdW5jdGlvbihrZXksIGhhbmRsZXIpCisJCXsKKwkJCWhhbmRsZXIubW91c2VNb3ZlLmFwcGx5KGhhbmRsZXIsIGFyZ3MpOworCQl9KTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3VzZVVwCisgKiAKKyAqIFJlZGlyZWN0cyB0aGUgZ2l2ZW4gZXZlbnQgdG8gdGhlIGhhbmRsZXJzLgorICovCitteFNlbGVjdGlvbkNlbGxzSGFuZGxlci5wcm90b3R5cGUubW91c2VVcCA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJaWYgKHRoaXMuZ3JhcGguaXNFbmFibGVkKCkgJiYgdGhpcy5pc0VuYWJsZWQoKSkKKwl7CisJCXZhciBhcmdzID0gW3NlbmRlciwgbWVdOworCisJCXRoaXMuaGFuZGxlcnMudmlzaXQoZnVuY3Rpb24oa2V5LCBoYW5kbGVyKQorCQl7CisJCQloYW5kbGVyLm1vdXNlVXAuYXBwbHkoaGFuZGxlciwgYXJncyk7CisJCX0pOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqIAorICogRGVzdHJveXMgdGhlIGhhbmRsZXIgYW5kIGFsbCBpdHMgcmVzb3VyY2VzIGFuZCBET00gbm9kZXMuCisgKi8KK214U2VsZWN0aW9uQ2VsbHNIYW5kbGVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKQoreworCXRoaXMuZ3JhcGgucmVtb3ZlTW91c2VMaXN0ZW5lcih0aGlzKTsKKwkKKwlpZiAodGhpcy5yZWZyZXNoSGFuZGxlciAhPSBudWxsKQorCXsKKwkJdGhpcy5ncmFwaC5nZXRTZWxlY3Rpb25Nb2RlbCgpLnJlbW92ZUxpc3RlbmVyKHRoaXMucmVmcmVzaEhhbmRsZXIpOworCQl0aGlzLmdyYXBoLmdldE1vZGVsKCkucmVtb3ZlTGlzdGVuZXIodGhpcy5yZWZyZXNoSGFuZGxlcik7CisJCXRoaXMuZ3JhcGguZ2V0VmlldygpLnJlbW92ZUxpc3RlbmVyKHRoaXMucmVmcmVzaEhhbmRsZXIpOworCQl0aGlzLnJlZnJlc2hIYW5kbGVyID0gbnVsbDsKKwl9Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2hhbmRsZXIvbXhUb29sdGlwSGFuZGxlci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214VG9vbHRpcEhhbmRsZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzN2UwYwotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214VG9vbHRpcEhhbmRsZXIuanMKQEAgLTAsMCArMSwzMzcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14VG9vbHRpcEhhbmRsZXIKKyAqIAorICogR3JhcGggZXZlbnQgaGFuZGxlciB0aGF0IGRpc3BsYXlzIHRvb2x0aXBzLiA8bXhHcmFwaC5nZXRUb29sdGlwPiBpcyB1c2VkIHRvCisgKiBnZXQgdGhlIHRvb2x0aXAgZm9yIGEgY2VsbCBvciBoYW5kbGUuIFRoaXMgaGFuZGxlciBpcyBidWlsdC1pbnRvCisgKiA8bXhHcmFwaC50b29sdGlwSGFuZGxlcj4gYW5kIGVuYWJsZWQgdXNpbmcgPG14R3JhcGguc2V0VG9vbHRpcHM+LgorICoKKyAqIEV4YW1wbGU6CisgKiAKKyAqIChjb2RlPgorICogbmV3IG14VG9vbHRpcEhhbmRsZXIoZ3JhcGgpOworICogKGVuZCkKKyAqIAorICogQ29uc3RydWN0b3I6IG14VG9vbHRpcEhhbmRsZXIKKyAqIAorICogQ29uc3RydWN0cyBhbiBldmVudCBoYW5kbGVyIHRoYXQgZGlzcGxheXMgdG9vbHRpcHMgd2l0aCB0aGUgc3BlY2lmaWVkCisgKiBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKS4gSWYgbm8gZGVsYXkgaXMgc3BlY2lmaWVkIHRoZW4gYSBkZWZhdWx0IGRlbGF5CisgKiBvZiA1MDAgbXMgKDAuNSBzZWMpIGlzIHVzZWQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGdyYXBoIC0gUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgPG14R3JhcGg+LgorICogZGVsYXkgLSBPcHRpb25hbCBkZWxheSBpbiBtaWxsaXNlY29uZHMuCisgKi8KK2Z1bmN0aW9uIG14VG9vbHRpcEhhbmRsZXIoZ3JhcGgsIGRlbGF5KQoreworCWlmIChncmFwaCAhPSBudWxsKQorCXsKKwkJdGhpcy5ncmFwaCA9IGdyYXBoOworCQl0aGlzLmRlbGF5ID0gZGVsYXkgfHwgNTAwOworCQl0aGlzLmdyYXBoLmFkZE1vdXNlTGlzdGVuZXIodGhpcyk7CisJfQorfTsKKworLyoqCisgKiBWYXJpYWJsZTogekluZGV4CisgKiAKKyAqIFNwZWNpZmllcyB0aGUgekluZGV4IGZvciB0aGUgdG9vbHRpcCBhbmQgaXRzIHNoYWRvdy4gRGVmYXVsdCBpcyAxMDAwNS4KKyAqLworbXhUb29sdGlwSGFuZGxlci5wcm90b3R5cGUuekluZGV4ID0gMTAwMDU7CisKKy8qKgorICogVmFyaWFibGU6IGdyYXBoCisgKiAKKyAqIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEdyYXBoPi4KKyAqLworbXhUb29sdGlwSGFuZGxlci5wcm90b3R5cGUuZ3JhcGggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBkZWxheQorICogCisgKiBEZWxheSB0byBzaG93IHRoZSB0b29sdGlwIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdCBpcyA1MDAuCisgKi8KK214VG9vbHRpcEhhbmRsZXIucHJvdG90eXBlLmRlbGF5ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogaWdub3JlVG91Y2hFdmVudHMKKyAqIAorICogU3BlY2lmaWVzIGlmIHRvdWNoIGFuZCBwZW4gZXZlbnRzIHNob3VsZCBiZSBpZ25vcmVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214VG9vbHRpcEhhbmRsZXIucHJvdG90eXBlLmlnbm9yZVRvdWNoRXZlbnRzID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogaGlkZU9uSG92ZXIKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSB0b29sdGlwIHNob3VsZCBiZSBoaWRkZW4gaWYgdGhlIG1vdXNlIGlzIG1vdmVkIG92ZXIgdGhlCisgKiBjdXJyZW50IGNlbGwuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214VG9vbHRpcEhhbmRsZXIucHJvdG90eXBlLmhpZGVPbkhvdmVyID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGRlc3Ryb3llZAorICogCisgKiBUcnVlIGlmIHRoaXMgaGFuZGxlciB3YXMgZGVzdHJveWVkIHVzaW5nIDxkZXN0cm95Pi4KKyAqLworbXhUb29sdGlwSGFuZGxlci5wcm90b3R5cGUuZGVzdHJveWVkID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIGV2ZW50cyBhcmUgaGFuZGxlZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteFRvb2x0aXBIYW5kbGVyLnByb3RvdHlwZS5lbmFibGVkID0gdHJ1ZTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFbmFibGVkCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiBldmVudHMgYXJlIGhhbmRsZWQuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIHJldHVybnMgPGVuYWJsZWQ+LgorICovCitteFRvb2x0aXBIYW5kbGVyLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuZW5hYmxlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEVuYWJsZWQKKyAqIAorICogRW5hYmxlcyBvciBkaXNhYmxlcyBldmVudCBoYW5kbGluZy4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICogdXBkYXRlcyA8ZW5hYmxlZD4uCisgKi8KK214VG9vbHRpcEhhbmRsZXIucHJvdG90eXBlLnNldEVuYWJsZWQgPSBmdW5jdGlvbihlbmFibGVkKQoreworCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0hpZGVPbkhvdmVyCisgKiAKKyAqIFJldHVybnMgPGhpZGVPbkhvdmVyPi4KKyAqLworbXhUb29sdGlwSGFuZGxlci5wcm90b3R5cGUuaXNIaWRlT25Ib3ZlciA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5oaWRlT25Ib3ZlcjsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEhpZGVPbkhvdmVyCisgKiAKKyAqIFNldHMgPGhpZGVPbkhvdmVyPi4KKyAqLworbXhUb29sdGlwSGFuZGxlci5wcm90b3R5cGUuc2V0SGlkZU9uSG92ZXIgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmhpZGVPbkhvdmVyID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbml0CisgKiAKKyAqIEluaXRpYWxpemVzIHRoZSBET00gbm9kZXMgcmVxdWlyZWQgZm9yIHRoaXMgdG9vbHRpcCBoYW5kbGVyLgorICovCitteFRvb2x0aXBIYW5kbGVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKQoreworCWlmIChkb2N1bWVudC5ib2R5ICE9IG51bGwpCisJeworCQl0aGlzLmRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworCQl0aGlzLmRpdi5jbGFzc05hbWUgPSAnbXhUb29sdGlwJzsKKwkJdGhpcy5kaXYuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOworCisJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5kaXYpOworCisJCW14RXZlbnQuYWRkR2VzdHVyZUxpc3RlbmVycyh0aGlzLmRpdiwgbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwkJeworCQkJdGhpcy5oaWRlVG9vbHRpcCgpOworCQl9KSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogbW91c2VEb3duCisgKiAKKyAqIEhhbmRsZXMgdGhlIGV2ZW50IGJ5IGluaXRpYXRpbmcgYSBydWJiZXJiYW5kIHNlbGVjdGlvbi4gQnkgY29uc3VtaW5nIHRoZQorICogZXZlbnQgYWxsIHN1YnNlcXVlbnQgZXZlbnRzIG9mIHRoZSBnZXN0dXJlIGFyZSByZWRpcmVjdGVkIHRvIHRoaXMKKyAqIGhhbmRsZXIuCisgKi8KK214VG9vbHRpcEhhbmRsZXIucHJvdG90eXBlLm1vdXNlRG93biA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJdGhpcy5yZXNldChtZSwgZmFsc2UpOworCXRoaXMuaGlkZVRvb2x0aXAoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdXNlTW92ZQorICogCisgKiBIYW5kbGVzIHRoZSBldmVudCBieSB1cGRhdGluZyB0aGUgcnViYmVyYmFuZCBzZWxlY3Rpb24uCisgKi8KK214VG9vbHRpcEhhbmRsZXIucHJvdG90eXBlLm1vdXNlTW92ZSA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJaWYgKG1lLmdldFgoKSAhPSB0aGlzLmxhc3RYIHx8IG1lLmdldFkoKSAhPSB0aGlzLmxhc3RZKQorCXsKKwkJdGhpcy5yZXNldChtZSwgdHJ1ZSk7CisJCQorCQlpZiAodGhpcy5pc0hpZGVPbkhvdmVyKCkgfHwgbWUuZ2V0U3RhdGUoKSAhPSB0aGlzLnN0YXRlIHx8IChtZS5nZXRTb3VyY2UoKSAhPSB0aGlzLm5vZGUgJiYKKwkJCSghdGhpcy5zdGF0ZVNvdXJjZSB8fCAobWUuZ2V0U3RhdGUoKSAhPSBudWxsICYmIHRoaXMuc3RhdGVTb3VyY2UgPT0KKwkJCShtZS5pc1NvdXJjZShtZS5nZXRTdGF0ZSgpLnNoYXBlKSB8fCAhbWUuaXNTb3VyY2UobWUuZ2V0U3RhdGUoKS50ZXh0KSkpKSkpCisJCXsKKwkJCXRoaXMuaGlkZVRvb2x0aXAoKTsKKwkJfQorCX0KKwkKKwl0aGlzLmxhc3RYID0gbWUuZ2V0WCgpOworCXRoaXMubGFzdFkgPSBtZS5nZXRZKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3VzZVVwCisgKiAKKyAqIEhhbmRsZXMgdGhlIGV2ZW50IGJ5IHJlc2V0dGluZyB0aGUgdG9vbHRpcCB0aW1lciBvciBoaWRpbmcgdGhlIGV4aXN0aW5nCisgKiB0b29sdGlwLgorICovCitteFRvb2x0aXBIYW5kbGVyLnByb3RvdHlwZS5tb3VzZVVwID0gZnVuY3Rpb24oc2VuZGVyLCBtZSkKK3sKKwl0aGlzLnJlc2V0KG1lLCB0cnVlKTsKKwl0aGlzLmhpZGVUb29sdGlwKCk7Cit9OworCisKKy8qKgorICogRnVuY3Rpb246IHJlc2V0VGltZXIKKyAqIAorICogUmVzZXRzIHRoZSB0aW1lci4KKyAqLworbXhUb29sdGlwSGFuZGxlci5wcm90b3R5cGUucmVzZXRUaW1lciA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAodGhpcy50aHJlYWQgIT0gbnVsbCkKKwl7CisJCXdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy50aHJlYWQpOworCQl0aGlzLnRocmVhZCA9IG51bGw7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVzZXQKKyAqIAorICogUmVzZXRzIGFuZC9vciByZXN0YXJ0cyB0aGUgdGltZXIgdG8gdHJpZ2dlciB0aGUgZGlzcGxheSBvZiB0aGUgdG9vbHRpcC4KKyAqLworbXhUb29sdGlwSGFuZGxlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbihtZSwgcmVzdGFydCkKK3sKKwlpZiAoIXRoaXMuaWdub3JlVG91Y2hFdmVudHMgfHwgbXhFdmVudC5pc01vdXNlRXZlbnQobWUuZ2V0RXZlbnQoKSkpCisJeworCQl0aGlzLnJlc2V0VGltZXIoKTsKKwkJCisJCWlmIChyZXN0YXJ0ICYmIHRoaXMuaXNFbmFibGVkKCkgJiYgbWUuZ2V0U3RhdGUoKSAhPSBudWxsICYmICh0aGlzLmRpdiA9PSBudWxsIHx8CisJCQl0aGlzLmRpdi5zdHlsZS52aXNpYmlsaXR5ID09ICdoaWRkZW4nKSkKKwkJeworCQkJdmFyIHN0YXRlID0gbWUuZ2V0U3RhdGUoKTsKKwkJCXZhciBub2RlID0gbWUuZ2V0U291cmNlKCk7CisJCQl2YXIgeCA9IG1lLmdldFgoKTsKKwkJCXZhciB5ID0gbWUuZ2V0WSgpOworCQkJdmFyIHN0YXRlU291cmNlID0gbWUuaXNTb3VyY2Uoc3RhdGUuc2hhcGUpIHx8IG1lLmlzU291cmNlKHN0YXRlLnRleHQpOworCQorCQkJdGhpcy50aHJlYWQgPSB3aW5kb3cuc2V0VGltZW91dChteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCQkJeworCQkJCWlmICghdGhpcy5ncmFwaC5pc0VkaXRpbmcoKSAmJiAhdGhpcy5ncmFwaC5wb3B1cE1lbnVIYW5kbGVyLmlzTWVudVNob3dpbmcoKSAmJiAhdGhpcy5ncmFwaC5pc01vdXNlRG93bikKKwkJCQl7CisJCQkJCS8vIFVzZXMgaW5mb3JtYXRpb24gZnJvbSBpbnNpZGUgZXZlbnQgY2F1c2UgdXNpbmcgdGhlIGV2ZW50IGF0CisJCQkJCS8vIHRoaXMgKGRlbGF5ZWQpIHBvaW50IGluIHRpbWUgaXMgbm90IHBvc3NpYmxlIGluIElFIGFzIGl0IG5vCisJCQkJCS8vIGxvbmdlciBjb250YWlucyB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24gKG1lbWJlciBub3QgZm91bmQpCisJCQkJCXZhciB0aXAgPSB0aGlzLmdyYXBoLmdldFRvb2x0aXAoc3RhdGUsIG5vZGUsIHgsIHkpOworCQkJCQl0aGlzLnNob3codGlwLCB4LCB5KTsKKwkJCQkJdGhpcy5zdGF0ZSA9IHN0YXRlOworCQkJCQl0aGlzLm5vZGUgPSBub2RlOworCQkJCQl0aGlzLnN0YXRlU291cmNlID0gc3RhdGVTb3VyY2U7CisJCQkJfQorCQkJfSksIHRoaXMuZGVsYXkpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogaGlkZQorICogCisgKiBIaWRlcyB0aGUgdG9vbHRpcCBhbmQgcmVzZXRzIHRoZSB0aW1lci4KKyAqLworbXhUb29sdGlwSGFuZGxlci5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnJlc2V0VGltZXIoKTsKKwl0aGlzLmhpZGVUb29sdGlwKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBoaWRlVG9vbHRpcAorICogCisgKiBIaWRlcyB0aGUgdG9vbHRpcC4KKyAqLworbXhUb29sdGlwSGFuZGxlci5wcm90b3R5cGUuaGlkZVRvb2x0aXAgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMuZGl2ICE9IG51bGwpCisJeworCQl0aGlzLmRpdi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CisJCXRoaXMuZGl2LmlubmVySFRNTCA9ICcnOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHNob3cKKyAqIAorICogU2hvd3MgdGhlIHRvb2x0aXAgZm9yIHRoZSBzcGVjaWZpZWQgY2VsbCBhbmQgb3B0aW9uYWwgaW5kZXggYXQgdGhlCisgKiBzcGVjaWZpZWQgbG9jYXRpb24gKHdpdGggYSB2ZXJ0aWNhbCBvZmZzZXQgb2YgMTAgcGl4ZWxzKS4KKyAqLworbXhUb29sdGlwSGFuZGxlci5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKHRpcCwgeCwgeSkKK3sKKwlpZiAoIXRoaXMuZGVzdHJveWVkICYmIHRpcCAhPSBudWxsICYmIHRpcC5sZW5ndGggPiAwKQorCXsKKwkJLy8gSW5pdGlhbGl6ZXMgdGhlIERPTSBub2RlcyBpZiByZXF1aXJlZAorCQlpZiAodGhpcy5kaXYgPT0gbnVsbCkKKwkJeworCQkJdGhpcy5pbml0KCk7CisJCX0KKwkJCisJCXZhciBvcmlnaW4gPSBteFV0aWxzLmdldFNjcm9sbE9yaWdpbigpOworCisJCXRoaXMuZGl2LnN0eWxlLnpJbmRleCA9IHRoaXMuekluZGV4OworCQl0aGlzLmRpdi5zdHlsZS5sZWZ0ID0gKHggKyBvcmlnaW4ueCkgKyAncHgnOworCQl0aGlzLmRpdi5zdHlsZS50b3AgPSAoeSArIG14Q29uc3RhbnRzLlRPT0xUSVBfVkVSVElDQUxfT0ZGU0VUICsKKwkJCW9yaWdpbi55KSArICdweCc7CisKKwkJaWYgKCFteFV0aWxzLmlzTm9kZSh0aXApKQorCQl7CQorCQkJdGhpcy5kaXYuaW5uZXJIVE1MID0gdGlwLnJlcGxhY2UoL1xuL2csICc8YnI+Jyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLmRpdi5pbm5lckhUTUwgPSAnJzsKKwkJCXRoaXMuZGl2LmFwcGVuZENoaWxkKHRpcCk7CisJCX0KKwkJCisJCXRoaXMuZGl2LnN0eWxlLnZpc2liaWxpdHkgPSAnJzsKKwkJbXhVdGlscy5maXQodGhpcy5kaXYpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqIAorICogRGVzdHJveXMgdGhlIGhhbmRsZXIgYW5kIGFsbCBpdHMgcmVzb3VyY2VzIGFuZCBET00gbm9kZXMuCisgKi8KK214VG9vbHRpcEhhbmRsZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpCit7CisJaWYgKCF0aGlzLmRlc3Ryb3llZCkKKwl7CisJCXRoaXMuZ3JhcGgucmVtb3ZlTW91c2VMaXN0ZW5lcih0aGlzKTsKKwkJbXhFdmVudC5yZWxlYXNlKHRoaXMuZGl2KTsKKwkJCisJCWlmICh0aGlzLmRpdiAhPSBudWxsICYmIHRoaXMuZGl2LnBhcmVudE5vZGUgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5kaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRpdik7CisJCX0KKwkJCisJCXRoaXMuZGVzdHJveWVkID0gdHJ1ZTsKKwkJdGhpcy5kaXYgPSBudWxsOworCX0KK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teFZlcnRleEhhbmRsZXIuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaGFuZGxlci9teFZlcnRleEhhbmRsZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2OWQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9oYW5kbGVyL214VmVydGV4SGFuZGxlci5qcwpAQCAtMCwwICsxLDE5NTAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14VmVydGV4SGFuZGxlcgorICogCisgKiBFdmVudCBoYW5kbGVyIGZvciByZXNpemluZyBjZWxscy4gVGhpcyBoYW5kbGVyIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBpbgorICogPG14R3JhcGguY3JlYXRlSGFuZGxlcj4uCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteFZlcnRleEhhbmRsZXIKKyAqIAorICogQ29uc3RydWN0cyBhbiBldmVudCBoYW5kbGVyIHRoYXQgYWxsb3dzIHRvIHJlc2l6ZSB2ZXJ0aWNlcworICogYW5kIGdyb3Vwcy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IG9mIHRoZSBjZWxsIHRvIGJlIHJlc2l6ZWQuCisgKi8KK2Z1bmN0aW9uIG14VmVydGV4SGFuZGxlcihzdGF0ZSkKK3sKKwlpZiAoc3RhdGUgIT0gbnVsbCkKKwl7CisJCXRoaXMuc3RhdGUgPSBzdGF0ZTsKKwkJdGhpcy5pbml0KCk7CisJCQorCQkvLyBIYW5kbGVzIGVzY2FwZSBrZXlzdHJva2VzCisJCXRoaXMuZXNjYXBlSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihzZW5kZXIsIGV2dCkKKwkJeworCQkJaWYgKHRoaXMubGl2ZVByZXZpZXcgJiYgdGhpcy5pbmRleCAhPSBudWxsKQorCQkJeworCQkJCS8vIFJlZHJhd3MgdGhlIGxpdmUgcHJldmlldworCQkJCXRoaXMuc3RhdGUudmlldy5ncmFwaC5jZWxsUmVuZGVyZXIucmVkcmF3KHRoaXMuc3RhdGUsIHRydWUpOworCQkJCQorCQkJCS8vIFJlZHJhd3MgY29ubmVjdGVkIGVkZ2VzCisJCQkJdGhpcy5zdGF0ZS52aWV3LmludmFsaWRhdGUodGhpcy5zdGF0ZS5jZWxsKTsKKwkJCQl0aGlzLnN0YXRlLmludmFsaWQgPSBmYWxzZTsKKwkJCQl0aGlzLnN0YXRlLnZpZXcudmFsaWRhdGUoKTsKKwkJCX0KKwkJCQorCQkJdGhpcy5yZXNldCgpOworCQl9KTsKKwkJCisJCXRoaXMuc3RhdGUudmlldy5ncmFwaC5hZGRMaXN0ZW5lcihteEV2ZW50LkVTQ0FQRSwgdGhpcy5lc2NhcGVIYW5kbGVyKTsKKwl9Cit9OworCisvKioKKyAqIFZhcmlhYmxlOiBncmFwaAorICogCisgKiBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUuZ3JhcGggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzdGF0ZQorICogCisgKiBSZWZlcmVuY2UgdG8gdGhlIDxteENlbGxTdGF0ZT4gYmVpbmcgbW9kaWZpZWQuCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUuc3RhdGUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzaW5nbGVTaXplcgorICogCisgKiBTcGVjaWZpZXMgaWYgb25seSBvbmUgc2l6ZXIgaGFuZGxlIGF0IHRoZSBib3R0b20sIHJpZ2h0IGNvcm5lciBzaG91bGQgYmUKKyAqIHVzZWQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUuc2luZ2xlU2l6ZXIgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogaW5kZXgKKyAqIAorICogSG9sZHMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGhhbmRsZS4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5pbmRleCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGFsbG93SGFuZGxlQm91bmRzQ2hlY2sKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBib3VuZHMgb2YgaGFuZGxlcyBzaG91bGQgYmUgdXNlZCBmb3IgaGl0LWRldGVjdGlvbiBpbiBJRSBvcgorICogaWYgPHRvbGVyYW5jZT4gPiAwLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUuYWxsb3dIYW5kbGVCb3VuZHNDaGVjayA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGhhbmRsZUltYWdlCisgKiAKKyAqIE9wdGlvbmFsIDxteEltYWdlPiB0byBiZSB1c2VkIGFzIGhhbmRsZXMuIERlZmF1bHQgaXMgbnVsbC4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5oYW5kbGVJbWFnZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHRvbGVyYW5jZQorICogCisgKiBPcHRpb25hbCB0b2xlcmFuY2UgZm9yIGhpdC1kZXRlY3Rpb24gaW4gPGdldEhhbmRsZUZvckV2ZW50Pi4gRGVmYXVsdCBpcyAwLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLnRvbGVyYW5jZSA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IHJvdGF0aW9uRW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgYSByb3RhdGlvbiBoYW5kbGUgc2hvdWxkIGJlIHZpc2libGUuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUucm90YXRpb25FbmFibGVkID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHBhcmVudEhpZ2hsaWdodEVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBwYXJlbnQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIGlmIGEgY2hpbGQgY2VsbCBpcyBzZWxlY3RlZC4KKyAqIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUucGFyZW50SGlnaGxpZ2h0RW5hYmxlZCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiByb3RhdGlvblJhc3RlcgorICogCisgKiBTcGVjaWZpZXMgaWYgcm90YXRpb24gc3RlcHMgc2hvdWxkIGJlICJyYXN0ZXJpemVkIiBkZXBlbmluZyBvbiB0aGUgZGlzdGFuY2UKKyAqIHRvIHRoZSBoYW5kbGUuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5yb3RhdGlvblJhc3RlciA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHJvdGF0aW9uQ3Vyc29yCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgY3Vyc29yIGZvciB0aGUgcm90YXRpb24gaGFuZGxlLiBEZWZhdWx0IGlzICdjcm9zc2hhaXInLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLnJvdGF0aW9uQ3Vyc29yID0gJ2Nyb3NzaGFpcic7CisKKy8qKgorICogVmFyaWFibGU6IGxpdmVQcmV2aWV3CisgKiAKKyAqIFNwZWNpZmllcyBpZiByZXNpemUgc2hvdWxkIGNoYW5nZSB0aGUgY2VsbCBpbi1wbGFjZS4gVGhpcyBpcyBhbiBleHBlcmltZW50YWwKKyAqIGZlYXR1cmUgZm9yIG5vbi10b3VjaCBkZXZpY2VzLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLmxpdmVQcmV2aWV3ID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IG1hbmFnZVNpemVycworICogCisgKiBTcGVjaWZpZXMgaWYgc2l6ZXJzIHNob3VsZCBiZSBoaWRkZW4gYW5kIHNwYWNlZCBpZiB0aGUgdmVydGV4IGlzIHNtYWxsLgorICogRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5tYW5hZ2VTaXplcnMgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogY29uc3RyYWluR3JvdXBCeUNoaWxkcmVuCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgc2l6ZSBvZiBncm91cHMgc2hvdWxkIGJlIGNvbnN0cmFpbmVkIGJ5IHRoZSBjaGlsZHJlbi4KKyAqIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUuY29uc3RyYWluR3JvdXBCeUNoaWxkcmVuID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHJvdGF0aW9uSGFuZGxlVlNwYWNpbmcKKyAqIAorICogVmVydGljYWwgc3BhY2luZyBmb3Igcm90YXRpb24gaWNvbi4gRGVmYXVsdCBpcyAtMTYuCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUucm90YXRpb25IYW5kbGVWU3BhY2luZyA9IC0xNjsKKworLyoqCisgKiBWYXJpYWJsZTogaG9yaXpvbnRhbE9mZnNldAorICogCisgKiBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgZm9yIHRoZSBoYW5kbGVzLiBUaGlzIGlzIHVwZGF0ZWQgaW4gPHJlZHJhd0hhbmRsZXM+CisgKiBpZiA8bWFuYWdlU2l6ZXJzPiBpcyB0cnVlIGFuZCB0aGUgc2l6ZXJzIGFyZSBvZmZzZXQgaG9yaXpvbnRhbGx5LgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLmhvcml6b250YWxPZmZzZXQgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiB2ZXJ0aWNhbE9mZnNldAorICogCisgKiBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgZm9yIHRoZSBoYW5kbGVzLiBUaGlzIGlzIHVwZGF0ZWQgaW4gPHJlZHJhd0hhbmRsZXM+CisgKiBpZiA8bWFuYWdlU2l6ZXJzPiBpcyB0cnVlIGFuZCB0aGUgc2l6ZXJzIGFyZSBvZmZzZXQgdmVydGljYWxseS4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS52ZXJ0aWNhbE9mZnNldCA9IDA7CisKKy8qKgorICogRnVuY3Rpb246IGluaXQKKyAqIAorICogSW5pdGlhbGl6ZXMgdGhlIHNoYXBlcyByZXF1aXJlZCBmb3IgdGhpcyB2ZXJ0ZXggaGFuZGxlci4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKQoreworCXRoaXMuZ3JhcGggPSB0aGlzLnN0YXRlLnZpZXcuZ3JhcGg7CisJdGhpcy5zZWxlY3Rpb25Cb3VuZHMgPSB0aGlzLmdldFNlbGVjdGlvbkJvdW5kcyh0aGlzLnN0YXRlKTsKKwl0aGlzLmJvdW5kcyA9IG5ldyBteFJlY3RhbmdsZSh0aGlzLnNlbGVjdGlvbkJvdW5kcy54LCB0aGlzLnNlbGVjdGlvbkJvdW5kcy55LCB0aGlzLnNlbGVjdGlvbkJvdW5kcy53aWR0aCwgdGhpcy5zZWxlY3Rpb25Cb3VuZHMuaGVpZ2h0KTsKKwl0aGlzLnNlbGVjdGlvbkJvcmRlciA9IHRoaXMuY3JlYXRlU2VsZWN0aW9uU2hhcGUodGhpcy5ib3VuZHMpOworCS8vIFZNTCBkaWFsZWN0IHJlcXVpcmVkIGhlcmUgZm9yIGV2ZW50IHRyYW5zcGFyZW5jeSBpbiBJRQorCXRoaXMuc2VsZWN0aW9uQm9yZGVyLmRpYWxlY3QgPSAodGhpcy5ncmFwaC5kaWFsZWN0ICE9IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHKSA/IG14Q29uc3RhbnRzLkRJQUxFQ1RfVk1MIDogbXhDb25zdGFudHMuRElBTEVDVF9TVkc7CisJdGhpcy5zZWxlY3Rpb25Cb3JkZXIucG9pbnRlckV2ZW50cyA9IGZhbHNlOworCXRoaXMuc2VsZWN0aW9uQm9yZGVyLnJvdGF0aW9uID0gTnVtYmVyKHRoaXMuc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfUk9UQVRJT05dIHx8ICcwJyk7CisJdGhpcy5zZWxlY3Rpb25Cb3JkZXIuaW5pdCh0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXRPdmVybGF5UGFuZSgpKTsKKwlteEV2ZW50LnJlZGlyZWN0TW91c2VFdmVudHModGhpcy5zZWxlY3Rpb25Cb3JkZXIubm9kZSwgdGhpcy5ncmFwaCwgdGhpcy5zdGF0ZSk7CisJCisJaWYgKHRoaXMuZ3JhcGguaXNDZWxsTW92YWJsZSh0aGlzLnN0YXRlLmNlbGwpKQorCXsKKwkJdGhpcy5zZWxlY3Rpb25Cb3JkZXIuc2V0Q3Vyc29yKG14Q29uc3RhbnRzLkNVUlNPUl9NT1ZBQkxFX1ZFUlRFWCk7CisJfQorCisJLy8gQWRkcyB0aGUgc2l6ZXIgaGFuZGxlcworCWlmIChteEdyYXBoSGFuZGxlci5wcm90b3R5cGUubWF4Q2VsbHMgPD0gMCB8fCB0aGlzLmdyYXBoLmdldFNlbGVjdGlvbkNvdW50KCkgPCBteEdyYXBoSGFuZGxlci5wcm90b3R5cGUubWF4Q2VsbHMpCisJeworCQl2YXIgcmVzaXphYmxlID0gdGhpcy5ncmFwaC5pc0NlbGxSZXNpemFibGUodGhpcy5zdGF0ZS5jZWxsKTsKKwkJdGhpcy5zaXplcnMgPSBbXTsKKworCQlpZiAocmVzaXphYmxlIHx8ICh0aGlzLmdyYXBoLmlzTGFiZWxNb3ZhYmxlKHRoaXMuc3RhdGUuY2VsbCkgJiYKKwkJCXRoaXMuc3RhdGUud2lkdGggPj0gMiAmJiB0aGlzLnN0YXRlLmhlaWdodCA+PSAyKSkKKwkJeworCQkJdmFyIGkgPSAwOworCisJCQlpZiAocmVzaXphYmxlKQorCQkJeworCQkJCWlmICghdGhpcy5zaW5nbGVTaXplcikKKwkJCQl7CisJCQkJCXRoaXMuc2l6ZXJzLnB1c2godGhpcy5jcmVhdGVTaXplcignbnctcmVzaXplJywgaSsrKSk7CisJCQkJCXRoaXMuc2l6ZXJzLnB1c2godGhpcy5jcmVhdGVTaXplcignbi1yZXNpemUnLCBpKyspKTsKKwkJCQkJdGhpcy5zaXplcnMucHVzaCh0aGlzLmNyZWF0ZVNpemVyKCduZS1yZXNpemUnLCBpKyspKTsKKwkJCQkJdGhpcy5zaXplcnMucHVzaCh0aGlzLmNyZWF0ZVNpemVyKCd3LXJlc2l6ZScsIGkrKykpOworCQkJCQl0aGlzLnNpemVycy5wdXNoKHRoaXMuY3JlYXRlU2l6ZXIoJ2UtcmVzaXplJywgaSsrKSk7CisJCQkJCXRoaXMuc2l6ZXJzLnB1c2godGhpcy5jcmVhdGVTaXplcignc3ctcmVzaXplJywgaSsrKSk7CisJCQkJCXRoaXMuc2l6ZXJzLnB1c2godGhpcy5jcmVhdGVTaXplcigncy1yZXNpemUnLCBpKyspKTsKKwkJCQl9CisJCQkJCisJCQkJdGhpcy5zaXplcnMucHVzaCh0aGlzLmNyZWF0ZVNpemVyKCdzZS1yZXNpemUnLCBpKyspKTsKKwkJCX0KKwkJCQorCQkJdmFyIGdlbyA9IHRoaXMuZ3JhcGgubW9kZWwuZ2V0R2VvbWV0cnkodGhpcy5zdGF0ZS5jZWxsKTsKKwkJCQorCQkJaWYgKGdlbyAhPSBudWxsICYmICFnZW8ucmVsYXRpdmUgJiYgIXRoaXMuZ3JhcGguaXNTd2ltbGFuZSh0aGlzLnN0YXRlLmNlbGwpICYmCisJCQkJdGhpcy5ncmFwaC5pc0xhYmVsTW92YWJsZSh0aGlzLnN0YXRlLmNlbGwpKQorCQkJeworCQkJCS8vIE1hcmtzIHRoaXMgYXMgdGhlIGxhYmVsIGhhbmRsZSBmb3IgZ2V0SGFuZGxlRm9yRXZlbnQKKwkJCQl0aGlzLmxhYmVsU2hhcGUgPSB0aGlzLmNyZWF0ZVNpemVyKG14Q29uc3RhbnRzLkNVUlNPUl9MQUJFTF9IQU5ETEUsIG14RXZlbnQuTEFCRUxfSEFORExFLCBteENvbnN0YW50cy5MQUJFTF9IQU5ETEVfU0laRSwgbXhDb25zdGFudHMuTEFCRUxfSEFORExFX0ZJTExDT0xPUik7CisJCQkJdGhpcy5zaXplcnMucHVzaCh0aGlzLmxhYmVsU2hhcGUpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKHRoaXMuZ3JhcGguaXNDZWxsTW92YWJsZSh0aGlzLnN0YXRlLmNlbGwpICYmICF0aGlzLmdyYXBoLmlzQ2VsbFJlc2l6YWJsZSh0aGlzLnN0YXRlLmNlbGwpICYmCisJCQl0aGlzLnN0YXRlLndpZHRoIDwgMiAmJiB0aGlzLnN0YXRlLmhlaWdodCA8IDIpCisJCXsKKwkJCXRoaXMubGFiZWxTaGFwZSA9IHRoaXMuY3JlYXRlU2l6ZXIobXhDb25zdGFudHMuQ1VSU09SX01PVkFCTEVfVkVSVEVYLAorCQkJCW14RXZlbnQuTEFCRUxfSEFORExFLCBudWxsLCBteENvbnN0YW50cy5MQUJFTF9IQU5ETEVfRklMTENPTE9SKTsKKwkJCXRoaXMuc2l6ZXJzLnB1c2godGhpcy5sYWJlbFNoYXBlKTsKKwkJfQorCX0KKwkKKwkvLyBBZGRzIHRoZSByb3RhdGlvbiBoYW5kbGVyCisJaWYgKHRoaXMuaXNSb3RhdGlvbkhhbmRsZVZpc2libGUoKSkKKwl7CisJCXRoaXMucm90YXRpb25TaGFwZSA9IHRoaXMuY3JlYXRlU2l6ZXIodGhpcy5yb3RhdGlvbkN1cnNvciwgbXhFdmVudC5ST1RBVElPTl9IQU5ETEUsCisJCQlteENvbnN0YW50cy5IQU5ETEVfU0laRSArIDMsIG14Q29uc3RhbnRzLkhBTkRMRV9GSUxMQ09MT1IpOworCQl0aGlzLnNpemVycy5wdXNoKHRoaXMucm90YXRpb25TaGFwZSk7CisJfQorCisJdGhpcy5jdXN0b21IYW5kbGVzID0gdGhpcy5jcmVhdGVDdXN0b21IYW5kbGVzKCk7CisJdGhpcy5yZWRyYXcoKTsKKwkKKwlpZiAodGhpcy5jb25zdHJhaW5Hcm91cEJ5Q2hpbGRyZW4pCisJeworCQl0aGlzLnVwZGF0ZU1pbkJvdW5kcygpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGlzUm90YXRpb25IYW5kbGVWaXNpYmxlCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm90YXRpb24gaGFuZGxlIHNob3VsZCBiZSBzaG93aW5nLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLmlzUm90YXRpb25IYW5kbGVWaXNpYmxlID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmdyYXBoLmlzRW5hYmxlZCgpICYmIHRoaXMucm90YXRpb25FbmFibGVkICYmIHRoaXMuZ3JhcGguaXNDZWxsUm90YXRhYmxlKHRoaXMuc3RhdGUuY2VsbCkgJiYKKwkJKG14R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5tYXhDZWxscyA8PSAwIHx8IHRoaXMuZ3JhcGguZ2V0U2VsZWN0aW9uQ291bnQoKSA8IG14R3JhcGhIYW5kbGVyLnByb3RvdHlwZS5tYXhDZWxscykgJiYKKwkJdGhpcy5zdGF0ZS53aWR0aCA+PSAyICYmIHRoaXMuc3RhdGUuaGVpZ2h0ID49IDI7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NvbnN0cmFpbmVkRXZlbnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBhc3BlY3QgcmF0aW8gaWYgdGhlIGNlbGwgc2hvdWxkIGJlIG1haW50YWluZWQuCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUuaXNDb25zdHJhaW5lZEV2ZW50ID0gZnVuY3Rpb24obWUpCit7CisJcmV0dXJuIG14RXZlbnQuaXNTaGlmdERvd24obWUuZ2V0RXZlbnQoKSkgfHwgdGhpcy5zdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9BU1BFQ1RdID09ICdmaXhlZCc7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NlbnRlcmVkRXZlbnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBjZW50ZXIgb2YgdGhlIHZlcnRleCBzaG91bGQgYmUgbWFpbnRhaW5lZCBkdXJpbmcgdGhlIHJlc2l6ZS4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5pc0NlbnRlcmVkRXZlbnQgPSBmdW5jdGlvbihzdGF0ZSwgbWUpCit7CisJcmV0dXJuIGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlQ3VzdG9tSGFuZGxlcworICogCisgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGN1c3RvbSBoYW5kbGVzLiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5jcmVhdGVDdXN0b21IYW5kbGVzID0gZnVuY3Rpb24oKQoreworCXJldHVybiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlTWluQm91bmRzCisgKiAKKyAqIEluaXRpYWxpemVzIHRoZSBzaGFwZXMgcmVxdWlyZWQgZm9yIHRoaXMgdmVydGV4IGhhbmRsZXIuCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUudXBkYXRlTWluQm91bmRzID0gZnVuY3Rpb24oKQoreworCXZhciBjaGlsZHJlbiA9IHRoaXMuZ3JhcGguZ2V0Q2hpbGRDZWxscyh0aGlzLnN0YXRlLmNlbGwpOworCQorCWlmIChjaGlsZHJlbi5sZW5ndGggPiAwKQorCXsKKwkJdGhpcy5taW5Cb3VuZHMgPSB0aGlzLmdyYXBoLnZpZXcuZ2V0Qm91bmRzKGNoaWxkcmVuKTsKKwkJCisJCWlmICh0aGlzLm1pbkJvdW5kcyAhPSBudWxsKQorCQl7CisJCQl2YXIgcyA9IHRoaXMuc3RhdGUudmlldy5zY2FsZTsKKwkJCXZhciB0ID0gdGhpcy5zdGF0ZS52aWV3LnRyYW5zbGF0ZTsKKworCQkJdGhpcy5taW5Cb3VuZHMueCAtPSB0aGlzLnN0YXRlLng7CisJCQl0aGlzLm1pbkJvdW5kcy55IC09IHRoaXMuc3RhdGUueTsKKwkJCXRoaXMubWluQm91bmRzLnggLz0gczsKKwkJCXRoaXMubWluQm91bmRzLnkgLz0gczsKKwkJCXRoaXMubWluQm91bmRzLndpZHRoIC89IHM7CisJCQl0aGlzLm1pbkJvdW5kcy5oZWlnaHQgLz0gczsKKwkJCXRoaXMueDAgPSB0aGlzLnN0YXRlLnggLyBzIC0gdC54OworCQkJdGhpcy55MCA9IHRoaXMuc3RhdGUueSAvIHMgLSB0Lnk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTZWxlY3Rpb25Cb3VuZHMKKyAqIAorICogUmV0dXJucyB0aGUgbXhSZWN0YW5nbGUgdGhhdCBkZWZpbmVzIHRoZSBib3VuZHMgb2YgdGhlIHNlbGVjdGlvbgorICogYm9yZGVyLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLmdldFNlbGVjdGlvbkJvdW5kcyA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXJldHVybiBuZXcgbXhSZWN0YW5nbGUoTWF0aC5yb3VuZChzdGF0ZS54KSwgTWF0aC5yb3VuZChzdGF0ZS55KSwgTWF0aC5yb3VuZChzdGF0ZS53aWR0aCksIE1hdGgucm91bmQoc3RhdGUuaGVpZ2h0KSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVQYXJlbnRIaWdobGlnaHRTaGFwZQorICogCisgKiBDcmVhdGVzIHRoZSBzaGFwZSB1c2VkIHRvIGRyYXcgdGhlIHNlbGVjdGlvbiBib3JkZXIuCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUuY3JlYXRlUGFyZW50SGlnaGxpZ2h0U2hhcGUgPSBmdW5jdGlvbihib3VuZHMpCit7CisJcmV0dXJuIHRoaXMuY3JlYXRlU2VsZWN0aW9uU2hhcGUoYm91bmRzKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVNlbGVjdGlvblNoYXBlCisgKiAKKyAqIENyZWF0ZXMgdGhlIHNoYXBlIHVzZWQgdG8gZHJhdyB0aGUgc2VsZWN0aW9uIGJvcmRlci4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5jcmVhdGVTZWxlY3Rpb25TaGFwZSA9IGZ1bmN0aW9uKGJvdW5kcykKK3sKKwl2YXIgc2hhcGUgPSBuZXcgbXhSZWN0YW5nbGVTaGFwZShib3VuZHMsIG51bGwsIHRoaXMuZ2V0U2VsZWN0aW9uQ29sb3IoKSk7CisJc2hhcGUuc3Ryb2tld2lkdGggPSB0aGlzLmdldFNlbGVjdGlvblN0cm9rZVdpZHRoKCk7CisJc2hhcGUuaXNEYXNoZWQgPSB0aGlzLmlzU2VsZWN0aW9uRGFzaGVkKCk7CisJCisJcmV0dXJuIHNoYXBlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0U2VsZWN0aW9uQ29sb3IKKyAqIAorICogUmV0dXJucyA8bXhDb25zdGFudHMuVkVSVEVYX1NFTEVDVElPTl9DT0xPUj4uCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uQ29sb3IgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIG14Q29uc3RhbnRzLlZFUlRFWF9TRUxFQ1RJT05fQ09MT1I7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTZWxlY3Rpb25TdHJva2VXaWR0aAorICogCisgKiBSZXR1cm5zIDxteENvbnN0YW50cy5WRVJURVhfU0VMRUNUSU9OX1NUUk9LRVdJRFRIPi4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5nZXRTZWxlY3Rpb25TdHJva2VXaWR0aCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gbXhDb25zdGFudHMuVkVSVEVYX1NFTEVDVElPTl9TVFJPS0VXSURUSDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzU2VsZWN0aW9uRGFzaGVkCisgKiAKKyAqIFJldHVybnMgPG14Q29uc3RhbnRzLlZFUlRFWF9TRUxFQ1RJT05fREFTSEVEPi4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5pc1NlbGVjdGlvbkRhc2hlZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gbXhDb25zdGFudHMuVkVSVEVYX1NFTEVDVElPTl9EQVNIRUQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVTaXplcgorICogCisgKiBDcmVhdGVzIGEgc2l6ZXIgaGFuZGxlIGZvciB0aGUgc3BlY2lmaWVkIGN1cnNvciBhbmQgaW5kZXggYW5kIHJldHVybnMKKyAqIHRoZSBuZXcgPG14UmVjdGFuZ2xlU2hhcGU+IHRoYXQgcmVwcmVzZW50cyB0aGUgaGFuZGxlLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLmNyZWF0ZVNpemVyID0gZnVuY3Rpb24oY3Vyc29yLCBpbmRleCwgc2l6ZSwgZmlsbENvbG9yKQoreworCXNpemUgPSBzaXplIHx8IG14Q29uc3RhbnRzLkhBTkRMRV9TSVpFOworCQorCXZhciBib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUoMCwgMCwgc2l6ZSwgc2l6ZSk7CisJdmFyIHNpemVyID0gdGhpcy5jcmVhdGVTaXplclNoYXBlKGJvdW5kcywgaW5kZXgsIGZpbGxDb2xvcik7CisKKwlpZiAoc2l6ZXIuaXNIdG1sQWxsb3dlZCgpICYmIHRoaXMuc3RhdGUudGV4dCAhPSBudWxsICYmIHRoaXMuc3RhdGUudGV4dC5ub2RlLnBhcmVudE5vZGUgPT0gdGhpcy5ncmFwaC5jb250YWluZXIpCisJeworCQlzaXplci5ib3VuZHMuaGVpZ2h0IC09IDE7CisJCXNpemVyLmJvdW5kcy53aWR0aCAtPSAxOworCQlzaXplci5kaWFsZWN0ID0gbXhDb25zdGFudHMuRElBTEVDVF9TVFJJQ1RIVE1MOworCQlzaXplci5pbml0KHRoaXMuZ3JhcGguY29udGFpbmVyKTsKKwl9CisJZWxzZQorCXsKKwkJc2l6ZXIuZGlhbGVjdCA9ICh0aGlzLmdyYXBoLmRpYWxlY3QgIT0gbXhDb25zdGFudHMuRElBTEVDVF9TVkcpID8KKwkJCQlteENvbnN0YW50cy5ESUFMRUNUX01JWEVESFRNTCA6IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHOworCQlzaXplci5pbml0KHRoaXMuZ3JhcGguZ2V0VmlldygpLmdldE92ZXJsYXlQYW5lKCkpOworCX0KKworCW14RXZlbnQucmVkaXJlY3RNb3VzZUV2ZW50cyhzaXplci5ub2RlLCB0aGlzLmdyYXBoLCB0aGlzLnN0YXRlKTsKKwkKKwlpZiAodGhpcy5ncmFwaC5pc0VuYWJsZWQoKSkKKwl7CisJCXNpemVyLnNldEN1cnNvcihjdXJzb3IpOworCX0KKwkKKwlpZiAoIXRoaXMuaXNTaXplclZpc2libGUoaW5kZXgpKQorCXsKKwkJc2l6ZXIudmlzaWJsZSA9IGZhbHNlOworCX0KKwkKKwlyZXR1cm4gc2l6ZXI7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1NpemVyVmlzaWJsZQorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNpemVyIGZvciB0aGUgZ2l2ZW4gaW5kZXggaXMgdmlzaWJsZS4KKyAqIFRoaXMgcmV0dXJucyB0cnVlIGZvciBhbGwgZ2l2ZW4gaW5kaWNlcy4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5pc1NpemVyVmlzaWJsZSA9IGZ1bmN0aW9uKGluZGV4KQoreworCXJldHVybiB0cnVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlU2l6ZXJTaGFwZQorICogCisgKiBDcmVhdGVzIHRoZSBzaGFwZSB1c2VkIGZvciB0aGUgc2l6ZXIgaGFuZGxlIGZvciB0aGUgc3BlY2lmaWVkIGJvdW5kcyBhbgorICogaW5kZXguIE9ubHkgaW1hZ2VzIGFuZCByZWN0YW5nbGVzIHNob3VsZCBiZSByZXR1cm5lZCBpZiBzdXBwb3J0IGZvciBIVE1MCisgKiBsYWJlbHMgd2l0aCBub3QgZm9yZWlnbiBvYmplY3RzIGlzIHJlcXVpcmVkLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLmNyZWF0ZVNpemVyU2hhcGUgPSBmdW5jdGlvbihib3VuZHMsIGluZGV4LCBmaWxsQ29sb3IpCit7CisJaWYgKHRoaXMuaGFuZGxlSW1hZ2UgIT0gbnVsbCkKKwl7CisJCWJvdW5kcyA9IG5ldyBteFJlY3RhbmdsZShib3VuZHMueCwgYm91bmRzLnksIHRoaXMuaGFuZGxlSW1hZ2Uud2lkdGgsIHRoaXMuaGFuZGxlSW1hZ2UuaGVpZ2h0KTsKKwkJdmFyIHNoYXBlID0gbmV3IG14SW1hZ2VTaGFwZShib3VuZHMsIHRoaXMuaGFuZGxlSW1hZ2Uuc3JjKTsKKwkJCisJCS8vIEFsbG93cyBIVE1MIHJlbmRlcmluZyBvZiB0aGUgaW1hZ2VzCisJCXNoYXBlLnByZXNlcnZlSW1hZ2VBc3BlY3QgPSBmYWxzZTsKKworCQlyZXR1cm4gc2hhcGU7CisJfQorCWVsc2UgaWYgKGluZGV4ID09IG14RXZlbnQuUk9UQVRJT05fSEFORExFKQorCXsKKwkJcmV0dXJuIG5ldyBteEVsbGlwc2UoYm91bmRzLCBmaWxsQ29sb3IgfHwgbXhDb25zdGFudHMuSEFORExFX0ZJTExDT0xPUiwgbXhDb25zdGFudHMuSEFORExFX1NUUk9LRUNPTE9SKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIG5ldyBteFJlY3RhbmdsZVNoYXBlKGJvdW5kcywgZmlsbENvbG9yIHx8IG14Q29uc3RhbnRzLkhBTkRMRV9GSUxMQ09MT1IsIG14Q29uc3RhbnRzLkhBTkRMRV9TVFJPS0VDT0xPUik7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlQm91bmRzCisgKiAKKyAqIEhlbHBlciBtZXRob2QgdG8gY3JlYXRlIGFuIDxteFJlY3RhbmdsZT4gYXJvdW5kIHRoZSBnaXZlbiBjZW50ZXJwb2ludAorICogd2l0aCBhIHdpZHRoIGFuZCBoZWlnaHQgb2YgMipzIG9yIDYsIGlmIG5vIHMgaXMgZ2l2ZW4uCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUubW92ZVNpemVyVG8gPSBmdW5jdGlvbihzaGFwZSwgeCwgeSkKK3sKKwlpZiAoc2hhcGUgIT0gbnVsbCkKKwl7CisJCXNoYXBlLmJvdW5kcy54ID0gTWF0aC5mbG9vcih4IC0gc2hhcGUuYm91bmRzLndpZHRoIC8gMik7CisJCXNoYXBlLmJvdW5kcy55ID0gTWF0aC5mbG9vcih5IC0gc2hhcGUuYm91bmRzLmhlaWdodCAvIDIpOworCQkKKwkJLy8gRml4ZXMgdmlzaWJsZSBpbmFjdGl2ZSBoYW5kbGVzIGluIFZNTAorCQlpZiAoc2hhcGUubm9kZSAhPSBudWxsICYmIHNoYXBlLm5vZGUuc3R5bGUuZGlzcGxheSAhPSAnbm9uZScpCisJCXsKKwkJCXNoYXBlLnJlZHJhdygpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0SGFuZGxlRm9yRXZlbnQKKyAqIAorICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGhhbmRsZSBmb3IgdGhlIGdpdmVuIGV2ZW50LiBUaGlzIHJldHVybnMgdGhlIGluZGV4CisgKiBvZiB0aGUgc2l6ZXIgZnJvbSB3aGVyZSB0aGUgZXZlbnQgb3JpZ2luYXRlZCBvciA8bXhFdmVudC5MQUJFTF9JTkRFWD4uCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUuZ2V0SGFuZGxlRm9yRXZlbnQgPSBmdW5jdGlvbihtZSkKK3sKKwkvLyBDb25uZWN0aW9uIGhpZ2hsaWdodCBtYXkgY29uc3VtZSBldmVudHMgYmVmb3JlIHRoZXkgcmVhY2ggc2l6ZXIgaGFuZGxlCisJdmFyIHRvbCA9ICghbXhFdmVudC5pc01vdXNlRXZlbnQobWUuZ2V0RXZlbnQoKSkpID8gdGhpcy50b2xlcmFuY2UgOiAxOworCXZhciBoaXQgPSAodGhpcy5hbGxvd0hhbmRsZUJvdW5kc0NoZWNrICYmIChteENsaWVudC5JU19JRSB8fCB0b2wgPiAwKSkgPworCQluZXcgbXhSZWN0YW5nbGUobWUuZ2V0R3JhcGhYKCkgLSB0b2wsIG1lLmdldEdyYXBoWSgpIC0gdG9sLCAyICogdG9sLCAyICogdG9sKSA6IG51bGw7CisJCisJZnVuY3Rpb24gY2hlY2tTaGFwZShzaGFwZSkKKwl7CisJCXJldHVybiBzaGFwZSAhPSBudWxsICYmIChtZS5pc1NvdXJjZShzaGFwZSkgfHwgKGhpdCAhPSBudWxsICYmIG14VXRpbHMuaW50ZXJzZWN0cyhzaGFwZS5ib3VuZHMsIGhpdCkgJiYKKwkJCXNoYXBlLm5vZGUuc3R5bGUuZGlzcGxheSAhPSAnbm9uZScgJiYgc2hhcGUubm9kZS5zdHlsZS52aXNpYmlsaXR5ICE9ICdoaWRkZW4nKSk7CisJfQorCisJaWYgKHRoaXMuY3VzdG9tSGFuZGxlcyAhPSBudWxsICYmIHRoaXMuaXNDdXN0b21IYW5kbGVFdmVudChtZSkpCisJeworCQkvLyBJbnZlcnNlIGxvb3Agb3JkZXIgdG8gbWF0Y2ggZGlzcGxheSBvcmRlcgorCQlmb3IgKHZhciBpID0gdGhpcy5jdXN0b21IYW5kbGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQorCQl7CisJCQlpZiAoY2hlY2tTaGFwZSh0aGlzLmN1c3RvbUhhbmRsZXNbaV0uc2hhcGUpKQorCQkJeworCQkJCS8vIExBVEVSOiBSZXR1cm4gcmVmZXJlbmNlIHRvIGFjdGl2ZSBzaGFwZQorCQkJCXJldHVybiBteEV2ZW50LkNVU1RPTV9IQU5ETEUgLSBpOworCQkJfQorCQl9CisJfQorCisJaWYgKGNoZWNrU2hhcGUodGhpcy5yb3RhdGlvblNoYXBlKSkKKwl7CisJCXJldHVybiBteEV2ZW50LlJPVEFUSU9OX0hBTkRMRTsKKwl9CisJZWxzZSBpZiAoY2hlY2tTaGFwZSh0aGlzLmxhYmVsU2hhcGUpKQorCXsKKwkJcmV0dXJuIG14RXZlbnQuTEFCRUxfSEFORExFOworCX0KKwkKKwlpZiAodGhpcy5zaXplcnMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zaXplcnMubGVuZ3RoOyBpKyspCisJCXsKKwkJCWlmIChjaGVja1NoYXBlKHRoaXMuc2l6ZXJzW2ldKSkKKwkJCXsKKwkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDdXN0b21IYW5kbGVFdmVudAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGV2ZW50IGFsbG93cyBjdXN0b20gaGFuZGxlcyB0byBiZSBjaGFuZ2VkLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUuCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUuaXNDdXN0b21IYW5kbGVFdmVudCA9IGZ1bmN0aW9uKG1lKQoreworCXJldHVybiB0cnVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogbW91c2VEb3duCisgKiAKKyAqIEhhbmRsZXMgdGhlIGV2ZW50IGlmIGEgaGFuZGxlIGhhcyBiZWVuIGNsaWNrZWQuIEJ5IGNvbnN1bWluZyB0aGUKKyAqIGV2ZW50IGFsbCBzdWJzZXF1ZW50IGV2ZW50cyBvZiB0aGUgZ2VzdHVyZSBhcmUgcmVkaXJlY3RlZCB0byB0aGlzCisgKiBoYW5kbGVyLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLm1vdXNlRG93biA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJdmFyIHRvbCA9ICghbXhFdmVudC5pc01vdXNlRXZlbnQobWUuZ2V0RXZlbnQoKSkpID8gdGhpcy50b2xlcmFuY2UgOiAwOworCQorCWlmICghbWUuaXNDb25zdW1lZCgpICYmIHRoaXMuZ3JhcGguaXNFbmFibGVkKCkgJiYgKHRvbCA+IDAgfHwgbWUuZ2V0U3RhdGUoKSA9PSB0aGlzLnN0YXRlKSkKKwl7CisJCXZhciBoYW5kbGUgPSB0aGlzLmdldEhhbmRsZUZvckV2ZW50KG1lKTsKKworCQlpZiAoaGFuZGxlICE9IG51bGwpCisJCXsKKwkJCXRoaXMuc3RhcnQobWUuZ2V0R3JhcGhYKCksIG1lLmdldEdyYXBoWSgpLCBoYW5kbGUpOworCQkJbWUuY29uc3VtZSgpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNMaXZlUHJldmlld0JvcmRlcgorICogCisgKiBDYWxsZWQgaWYgPGxpdmVQcmV2aWV3PiBpcyBlbmFibGVkIHRvIGNoZWNrIGlmIGEgYm9yZGVyIHNob3VsZCBiZSBwYWludGVkLgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIHNoYXBlIGlzIHRyYW5zcGFyZW50LgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLmlzTGl2ZVByZXZpZXdCb3JkZXIgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuc3RhdGUuc2hhcGUgIT0gbnVsbCAmJiB0aGlzLnN0YXRlLnNoYXBlLmZpbGwgPT0gbnVsbCAmJiB0aGlzLnN0YXRlLnNoYXBlLnN0cm9rZSA9PSBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc3RhcnQKKyAqIAorICogU3RhcnRzIHRoZSBoYW5kbGluZyBvZiB0aGUgbW91c2UgZ2VzdHVyZS4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKHgsIHksIGluZGV4KQoreworCXRoaXMuaW5Ub2xlcmFuY2UgPSB0cnVlOworCXRoaXMuY2hpbGRPZmZzZXRYID0gMDsKKwl0aGlzLmNoaWxkT2Zmc2V0WSA9IDA7CisJdGhpcy5pbmRleCA9IGluZGV4OworCXRoaXMuc3RhcnRYID0geDsKKwl0aGlzLnN0YXJ0WSA9IHk7CisJCisJLy8gU2F2ZXMgcmVmZXJlbmNlIHRvIHBhcmVudCBzdGF0ZQorCXZhciBtb2RlbCA9IHRoaXMuc3RhdGUudmlldy5ncmFwaC5tb2RlbDsKKwl2YXIgcGFyZW50ID0gbW9kZWwuZ2V0UGFyZW50KHRoaXMuc3RhdGUuY2VsbCk7CisJCisJaWYgKHRoaXMuc3RhdGUudmlldy5jdXJyZW50Um9vdCAhPSBwYXJlbnQgJiYgKG1vZGVsLmlzVmVydGV4KHBhcmVudCkgfHwgbW9kZWwuaXNFZGdlKHBhcmVudCkpKQorCXsKKwkJdGhpcy5wYXJlbnRTdGF0ZSA9IHRoaXMuc3RhdGUudmlldy5ncmFwaC52aWV3LmdldFN0YXRlKHBhcmVudCk7CisJfQorCQorCS8vIENyZWF0ZXMgYSBwcmV2aWV3IHRoYXQgY2FuIGJlIG9uIHRvcCBvZiBhbnkgSFRNTCBsYWJlbAorCXRoaXMuc2VsZWN0aW9uQm9yZGVyLm5vZGUuc3R5bGUuZGlzcGxheSA9IChpbmRleCA9PSBteEV2ZW50LlJPVEFUSU9OX0hBTkRMRSkgPyAnaW5saW5lJyA6ICdub25lJzsKKwkKKwkvLyBDcmVhdGVzIHRoZSBib3JkZXIgdGhhdCByZXByZXNlbnRzIHRoZSBuZXcgYm91bmRzCisJaWYgKCF0aGlzLmxpdmVQcmV2aWV3IHx8IHRoaXMuaXNMaXZlUHJldmlld0JvcmRlcigpKQorCXsKKwkJdGhpcy5wcmV2aWV3ID0gdGhpcy5jcmVhdGVTZWxlY3Rpb25TaGFwZSh0aGlzLmJvdW5kcyk7CisJCQorCQlpZiAoIShteENsaWVudC5JU19TVkcgJiYgTnVtYmVyKHRoaXMuc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfUk9UQVRJT05dIHx8ICcwJykgIT0gMCkgJiYKKwkJCXRoaXMuc3RhdGUudGV4dCAhPSBudWxsICYmIHRoaXMuc3RhdGUudGV4dC5ub2RlLnBhcmVudE5vZGUgPT0gdGhpcy5ncmFwaC5jb250YWluZXIpCisJCXsKKwkJCXRoaXMucHJldmlldy5kaWFsZWN0ID0gbXhDb25zdGFudHMuRElBTEVDVF9TVFJJQ1RIVE1MOworCQkJdGhpcy5wcmV2aWV3LmluaXQodGhpcy5ncmFwaC5jb250YWluZXIpOworCQl9CisJCWVsc2UKKwkJeworCQkJdGhpcy5wcmV2aWV3LmRpYWxlY3QgPSAodGhpcy5ncmFwaC5kaWFsZWN0ICE9IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHKSA/CisJCQkJCW14Q29uc3RhbnRzLkRJQUxFQ1RfVk1MIDogbXhDb25zdGFudHMuRElBTEVDVF9TVkc7CisJCQl0aGlzLnByZXZpZXcuaW5pdCh0aGlzLmdyYXBoLnZpZXcuZ2V0T3ZlcmxheVBhbmUoKSk7CisJCX0KKwl9CisJCisJLy8gUHJlcGFyZXMgdGhlIGhhbmRsZXMgZm9yIGxpdmUgcHJldmlldworCWlmICh0aGlzLmxpdmVQcmV2aWV3KQorCXsKKwkJdGhpcy5oaWRlU2l6ZXJzKCk7CisJCQorCQlpZiAoaW5kZXggPT0gbXhFdmVudC5ST1RBVElPTl9IQU5ETEUpCisJCXsKKwkJCXRoaXMucm90YXRpb25TaGFwZS5ub2RlLnN0eWxlLmRpc3BsYXkgPSAnJzsKKwkJfQorCQllbHNlIGlmIChpbmRleCA9PSBteEV2ZW50LkxBQkVMX0hBTkRMRSkKKwkJeworCQkJdGhpcy5sYWJlbFNoYXBlLm5vZGUuc3R5bGUuZGlzcGxheSA9ICcnOworCQl9CisJCWVsc2UgaWYgKHRoaXMuc2l6ZXJzICE9IG51bGwgJiYgdGhpcy5zaXplcnNbaW5kZXhdICE9IG51bGwpCisJCXsKKwkJCXRoaXMuc2l6ZXJzW2luZGV4XS5ub2RlLnN0eWxlLmRpc3BsYXkgPSAnJzsKKwkJfQorCQllbHNlIGlmIChpbmRleCA8PSBteEV2ZW50LkNVU1RPTV9IQU5ETEUgJiYgdGhpcy5jdXN0b21IYW5kbGVzICE9IG51bGwpCisJCXsKKwkJCXRoaXMuY3VzdG9tSGFuZGxlc1tteEV2ZW50LkNVU1RPTV9IQU5ETEUgLSBpbmRleF0uc2V0VmlzaWJsZSh0cnVlKTsKKwkJfQorCQkKKwkJLy8gR2V0cyB0aGUgYXJyYXkgb2YgY29ubmVjdGVkIGVkZ2UgaGFuZGxlcnMgZm9yIHJlZHJhd2luZworCQl2YXIgZWRnZXMgPSB0aGlzLmdyYXBoLmdldEVkZ2VzKHRoaXMuc3RhdGUuY2VsbCk7CisJCXRoaXMuZWRnZUhhbmRsZXJzID0gW107CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKQorCQl7CisJCQl2YXIgaGFuZGxlciA9IHRoaXMuZ3JhcGguc2VsZWN0aW9uQ2VsbHNIYW5kbGVyLmdldEhhbmRsZXIoZWRnZXNbaV0pOworCQkJCisJCQlpZiAoaGFuZGxlciAhPSBudWxsKQorCQkJeworCQkJCXRoaXMuZWRnZUhhbmRsZXJzLnB1c2goaGFuZGxlcik7CisJCQl9CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBoaWRlSGFuZGxlcworICogCisgKiBTaG9ydGN1dCB0byA8aGlkZVNpemVycz4uCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUuc2V0SGFuZGxlc1Zpc2libGUgPSBmdW5jdGlvbih2aXNpYmxlKQoreworCWlmICh0aGlzLnNpemVycyAhPSBudWxsKQorCXsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNpemVycy5sZW5ndGg7IGkrKykKKwkJeworCQkJdGhpcy5zaXplcnNbaV0ubm9kZS5zdHlsZS5kaXNwbGF5ID0gKHZpc2libGUpID8gJycgOiAnbm9uZSc7CisJCX0KKwl9CisKKwlpZiAodGhpcy5jdXN0b21IYW5kbGVzICE9IG51bGwpCisJeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY3VzdG9tSGFuZGxlcy5sZW5ndGg7IGkrKykKKwkJeworCQkJdGhpcy5jdXN0b21IYW5kbGVzW2ldLnNldFZpc2libGUodmlzaWJsZSk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBoaWRlU2l6ZXJzCisgKiAKKyAqIEhpZGVzIGFsbCBzaXplcnMgZXhjZXB0LgorICogCisgKiBTdGFydHMgdGhlIGhhbmRsaW5nIG9mIHRoZSBtb3VzZSBnZXN0dXJlLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLmhpZGVTaXplcnMgPSBmdW5jdGlvbigpCit7CisJdGhpcy5zZXRIYW5kbGVzVmlzaWJsZShmYWxzZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjaGVja1RvbGVyYW5jZQorICogCisgKiBDaGVja3MgaWYgdGhlIGNvb3JkaW5hdGVzIGZvciB0aGUgZ2l2ZW4gZXZlbnQgYXJlIHdpdGhpbiB0aGUKKyAqIDxteEdyYXBoLnRvbGVyYW5jZT4uIElmIHRoZSBldmVudCBpcyBhIG1vdXNlIGV2ZW50IHRoZW4gdGhlIHRvbGVyYW5jZSBpcworICogaWdub3JlZC4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5jaGVja1RvbGVyYW5jZSA9IGZ1bmN0aW9uKG1lKQoreworCWlmICh0aGlzLmluVG9sZXJhbmNlICYmIHRoaXMuc3RhcnRYICE9IG51bGwgJiYgdGhpcy5zdGFydFkgIT0gbnVsbCkKKwl7CisJCWlmIChteEV2ZW50LmlzTW91c2VFdmVudChtZS5nZXRFdmVudCgpKSB8fAorCQkJTWF0aC5hYnMobWUuZ2V0R3JhcGhYKCkgLSB0aGlzLnN0YXJ0WCkgPiB0aGlzLmdyYXBoLnRvbGVyYW5jZSB8fAorCQkJTWF0aC5hYnMobWUuZ2V0R3JhcGhZKCkgLSB0aGlzLnN0YXJ0WSkgPiB0aGlzLmdyYXBoLnRvbGVyYW5jZSkKKwkJeworCQkJdGhpcy5pblRvbGVyYW5jZSA9IGZhbHNlOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlSGludAorICogCisgKiBIb29rIGZvciBzdWJjbGFzc2VycyBkbyBzaG93IGRldGFpbHMgd2hpbGUgdGhlIGhhbmRsZXIgaXMgYWN0aXZlLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLnVwZGF0ZUhpbnQgPSBmdW5jdGlvbihtZSkgeyB9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZW1vdmVIaW50CisgKiAKKyAqIEhvb2tzIGZvciBzdWJjbGFzc2VycyB0byBoaWRlIGRldGFpbHMgd2hlbiB0aGUgaGFuZGxlciBnZXRzIGluYWN0aXZlLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLnJlbW92ZUhpbnQgPSBmdW5jdGlvbigpIHsgfTsKKworLyoqCisgKiBGdW5jdGlvbjogcm91bmRBbmdsZQorICogCisgKiBIb29rIGZvciByb3VuZGluZyB0aGUgYW5nbGUuIFRoaXMgdXNlcyBNYXRoLnJvdW5kLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLnJvdW5kQW5nbGUgPSBmdW5jdGlvbihhbmdsZSkKK3sKKwlyZXR1cm4gTWF0aC5yb3VuZChhbmdsZSAqIDEwKSAvIDEwOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcm91bmRMZW5ndGgKKyAqIAorICogSG9vayBmb3Igcm91bmRpbmcgdGhlIHVuc2NhbGVkIHdpZHRoIG9yIGhlaWdodC4gVGhpcyB1c2VzIE1hdGgucm91bmQuCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUucm91bmRMZW5ndGggPSBmdW5jdGlvbihsZW5ndGgpCit7CisJcmV0dXJuIE1hdGgucm91bmQobGVuZ3RoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdXNlTW92ZQorICogCisgKiBIYW5kbGVzIHRoZSBldmVudCBieSB1cGRhdGluZyB0aGUgcHJldmlldy4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5tb3VzZU1vdmUgPSBmdW5jdGlvbihzZW5kZXIsIG1lKQoreworCWlmICghbWUuaXNDb25zdW1lZCgpICYmIHRoaXMuaW5kZXggIT0gbnVsbCkKKwl7CisJCS8vIENoZWNrcyB0b2xlcmFuY2UgZm9yIGlnbm9yaW5nIHNpbmdsZSBjbGlja3MKKwkJdGhpcy5jaGVja1RvbGVyYW5jZShtZSk7CisKKwkJaWYgKCF0aGlzLmluVG9sZXJhbmNlKQorCQl7CisJCQlpZiAodGhpcy5pbmRleCA8PSBteEV2ZW50LkNVU1RPTV9IQU5ETEUpCisJCQl7CisJCQkJaWYgKHRoaXMuY3VzdG9tSGFuZGxlcyAhPSBudWxsKQorCQkJCXsKKwkJCQkJdGhpcy5jdXN0b21IYW5kbGVzW214RXZlbnQuQ1VTVE9NX0hBTkRMRSAtIHRoaXMuaW5kZXhdLnByb2Nlc3NFdmVudChtZSk7CisJCQkJCXRoaXMuY3VzdG9tSGFuZGxlc1tteEV2ZW50LkNVU1RPTV9IQU5ETEUgLSB0aGlzLmluZGV4XS5hY3RpdmUgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKHRoaXMuaW5kZXggPT0gbXhFdmVudC5MQUJFTF9IQU5ETEUpCisJCQl7CisJCQkJdGhpcy5tb3ZlTGFiZWwobWUpOworCQkJfQorCQkJZWxzZSBpZiAodGhpcy5pbmRleCA9PSBteEV2ZW50LlJPVEFUSU9OX0hBTkRMRSkKKwkJCXsKKwkJCQl0aGlzLnJvdGF0ZVZlcnRleChtZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdGhpcy5yZXNpemVWZXJ0ZXgobWUpOworCQkJfQorCisJCQl0aGlzLnVwZGF0ZUhpbnQobWUpOworCQl9CisJCQorCQltZS5jb25zdW1lKCk7CisJfQorCS8vIFdvcmthcm91bmQgZm9yIGRpc2FibGluZyB0aGUgY29ubmVjdCBoaWdobGlnaHQgd2hlbiBvdmVyIGhhbmRsZQorCWVsc2UgaWYgKCF0aGlzLmdyYXBoLmlzTW91c2VEb3duICYmIHRoaXMuZ2V0SGFuZGxlRm9yRXZlbnQobWUpICE9IG51bGwpCisJeworCQltZS5jb25zdW1lKGZhbHNlKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByb3RhdGVWZXJ0ZXgKKyAqIAorICogUm90YXRlcyB0aGUgdmVydGV4LgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLm1vdmVMYWJlbCA9IGZ1bmN0aW9uKG1lKQoreworCXZhciBwb2ludCA9IG5ldyBteFBvaW50KG1lLmdldEdyYXBoWCgpLCBtZS5nZXRHcmFwaFkoKSk7CisJdmFyIHRyID0gdGhpcy5ncmFwaC52aWV3LnRyYW5zbGF0ZTsKKwl2YXIgc2NhbGUgPSB0aGlzLmdyYXBoLnZpZXcuc2NhbGU7CisJCisJaWYgKHRoaXMuZ3JhcGguaXNHcmlkRW5hYmxlZEV2ZW50KG1lLmdldEV2ZW50KCkpKQorCXsKKwkJcG9pbnQueCA9ICh0aGlzLmdyYXBoLnNuYXAocG9pbnQueCAvIHNjYWxlIC0gdHIueCkgKyB0ci54KSAqIHNjYWxlOworCQlwb2ludC55ID0gKHRoaXMuZ3JhcGguc25hcChwb2ludC55IC8gc2NhbGUgLSB0ci55KSArIHRyLnkpICogc2NhbGU7CisJfQorCisJdmFyIGluZGV4ID0gKHRoaXMucm90YXRpb25TaGFwZSAhPSBudWxsKSA/IHRoaXMuc2l6ZXJzLmxlbmd0aCAtIDIgOiB0aGlzLnNpemVycy5sZW5ndGggLSAxOworCXRoaXMubW92ZVNpemVyVG8odGhpcy5zaXplcnNbaW5kZXhdLCBwb2ludC54LCBwb2ludC55KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJvdGF0ZVZlcnRleAorICogCisgKiBSb3RhdGVzIHRoZSB2ZXJ0ZXguCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUucm90YXRlVmVydGV4ID0gZnVuY3Rpb24obWUpCit7CisJdmFyIHBvaW50ID0gbmV3IG14UG9pbnQobWUuZ2V0R3JhcGhYKCksIG1lLmdldEdyYXBoWSgpKTsKKwl2YXIgZHggPSB0aGlzLnN0YXRlLnggKyB0aGlzLnN0YXRlLndpZHRoIC8gMiAtIHBvaW50Lng7CisJdmFyIGR5ID0gdGhpcy5zdGF0ZS55ICsgdGhpcy5zdGF0ZS5oZWlnaHQgLyAyIC0gcG9pbnQueTsKKwl0aGlzLmN1cnJlbnRBbHBoYSA9IChkeCAhPSAwKSA/IE1hdGguYXRhbihkeSAvIGR4KSAqIDE4MCAvIE1hdGguUEkgKyA5MCA6ICgoZHkgPCAwKSA/IDE4MCA6IDApOworCQorCWlmIChkeCA+IDApCisJeworCQl0aGlzLmN1cnJlbnRBbHBoYSAtPSAxODA7CisJfQorCisJLy8gUm90YXRpb24gcmFzdGVyCisJaWYgKHRoaXMucm90YXRpb25SYXN0ZXIgJiYgdGhpcy5ncmFwaC5pc0dyaWRFbmFibGVkRXZlbnQobWUuZ2V0RXZlbnQoKSkpCisJeworCQl2YXIgZHggPSBwb2ludC54IC0gdGhpcy5zdGF0ZS5nZXRDZW50ZXJYKCk7CisJCXZhciBkeSA9IHBvaW50LnkgLSB0aGlzLnN0YXRlLmdldENlbnRlclkoKTsKKwkJdmFyIGRpc3QgPSBNYXRoLmFicyhNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpIC0gMjApICogMzsKKwkJdmFyIHJhc3RlciA9IE1hdGgubWF4KDEsIDUgKiBNYXRoLm1pbigzLCBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKDgwIC8gTWF0aC5hYnMoZGlzdCkpKSkpOworCQkKKwkJdGhpcy5jdXJyZW50QWxwaGEgPSBNYXRoLnJvdW5kKHRoaXMuY3VycmVudEFscGhhIC8gcmFzdGVyKSAqIHJhc3RlcjsKKwl9CisJZWxzZQorCXsKKwkJdGhpcy5jdXJyZW50QWxwaGEgPSB0aGlzLnJvdW5kQW5nbGUodGhpcy5jdXJyZW50QWxwaGEpOworCX0KKworCXRoaXMuc2VsZWN0aW9uQm9yZGVyLnJvdGF0aW9uID0gdGhpcy5jdXJyZW50QWxwaGE7CisJdGhpcy5zZWxlY3Rpb25Cb3JkZXIucmVkcmF3KCk7CisJCQkJCQorCWlmICh0aGlzLmxpdmVQcmV2aWV3KQorCXsKKwkJdGhpcy5yZWRyYXdIYW5kbGVzKCk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcm90YXRlVmVydGV4CisgKiAKKyAqIFJvdGF0ZXMgdGhlIHZlcnRleC4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5yZXNpemVWZXJ0ZXggPSBmdW5jdGlvbihtZSkKK3sKKwl2YXIgY3QgPSBuZXcgbXhQb2ludCh0aGlzLnN0YXRlLmdldENlbnRlclgoKSwgdGhpcy5zdGF0ZS5nZXRDZW50ZXJZKCkpOworCXZhciBhbHBoYSA9IG14VXRpbHMudG9SYWRpYW5zKHRoaXMuc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfUk9UQVRJT05dIHx8ICcwJyk7CisJdmFyIHBvaW50ID0gbmV3IG14UG9pbnQobWUuZ2V0R3JhcGhYKCksIG1lLmdldEdyYXBoWSgpKTsKKwl2YXIgdHIgPSB0aGlzLmdyYXBoLnZpZXcudHJhbnNsYXRlOworCXZhciBzY2FsZSA9IHRoaXMuZ3JhcGgudmlldy5zY2FsZTsKKwl2YXIgY29zID0gTWF0aC5jb3MoLWFscGhhKTsKKwl2YXIgc2luID0gTWF0aC5zaW4oLWFscGhhKTsKKwkKKwl2YXIgZHggPSBwb2ludC54IC0gdGhpcy5zdGFydFg7CisJdmFyIGR5ID0gcG9pbnQueSAtIHRoaXMuc3RhcnRZOworCisJLy8gUm90YXRlcyB2ZWN0b3IgZm9yIG1vdXNlIGdlc3R1cmUKKwl2YXIgdHggPSBjb3MgKiBkeCAtIHNpbiAqIGR5OworCXZhciB0eSA9IHNpbiAqIGR4ICsgY29zICogZHk7CisJCisJZHggPSB0eDsKKwlkeSA9IHR5OworCisJdmFyIGdlbyA9IHRoaXMuZ3JhcGguZ2V0Q2VsbEdlb21ldHJ5KHRoaXMuc3RhdGUuY2VsbCk7CisJdGhpcy51bnNjYWxlZEJvdW5kcyA9IHRoaXMudW5pb24oZ2VvLCBkeCAvIHNjYWxlLCBkeSAvIHNjYWxlLCB0aGlzLmluZGV4LAorCQl0aGlzLmdyYXBoLmlzR3JpZEVuYWJsZWRFdmVudChtZS5nZXRFdmVudCgpKSwgMSwKKwkJbmV3IG14UG9pbnQoMCwgMCksIHRoaXMuaXNDb25zdHJhaW5lZEV2ZW50KG1lKSwKKwkJdGhpcy5pc0NlbnRlcmVkRXZlbnQodGhpcy5zdGF0ZSwgbWUpKTsKKwkKKwkvLyBLZWVwcyB2ZXJ0ZXggd2l0aGluIG1heGltdW0gZ3JhcGggb3IgcGFyZW50IGJvdW5kcworCWlmICghZ2VvLnJlbGF0aXZlKQorCXsKKwkJdmFyIG1heCA9IHRoaXMuZ3JhcGguZ2V0TWF4aW11bUdyYXBoQm91bmRzKCk7CisJCQorCQkvLyBIYW5kbGVzIGNoaWxkIGNlbGxzCisJCWlmIChtYXggIT0gbnVsbCAmJiB0aGlzLnBhcmVudFN0YXRlICE9IG51bGwpCisJCXsKKwkJCW1heCA9IG14UmVjdGFuZ2xlLmZyb21SZWN0YW5nbGUobWF4KTsKKwkJCQorCQkJbWF4LnggLT0gKHRoaXMucGFyZW50U3RhdGUueCAtIHRyLnggKiBzY2FsZSkgLyBzY2FsZTsKKwkJCW1heC55IC09ICh0aGlzLnBhcmVudFN0YXRlLnkgLSB0ci55ICogc2NhbGUpIC8gc2NhbGU7CisJCX0KKwkJCisJCWlmICh0aGlzLmdyYXBoLmlzQ29uc3RyYWluQ2hpbGQodGhpcy5zdGF0ZS5jZWxsKSkKKwkJeworCQkJdmFyIHRtcCA9IHRoaXMuZ3JhcGguZ2V0Q2VsbENvbnRhaW5tZW50QXJlYSh0aGlzLnN0YXRlLmNlbGwpOworCQkJCisJCQlpZiAodG1wICE9IG51bGwpCisJCQl7CisJCQkJdmFyIG92ZXJsYXAgPSB0aGlzLmdyYXBoLmdldE92ZXJsYXAodGhpcy5zdGF0ZS5jZWxsKTsKKwkJCQkKKwkJCQlpZiAob3ZlcmxhcCA+IDApCisJCQkJeworCQkJCQl0bXAgPSBteFJlY3RhbmdsZS5mcm9tUmVjdGFuZ2xlKHRtcCk7CisJCQkJCQorCQkJCQl0bXAueCAtPSB0bXAud2lkdGggKiBvdmVybGFwOworCQkJCQl0bXAueSAtPSB0bXAuaGVpZ2h0ICogb3ZlcmxhcDsKKwkJCQkJdG1wLndpZHRoICs9IDIgKiB0bXAud2lkdGggKiBvdmVybGFwOworCQkJCQl0bXAuaGVpZ2h0ICs9IDIgKiB0bXAuaGVpZ2h0ICogb3ZlcmxhcDsKKwkJCQl9CisJCQkJCisJCQkJaWYgKG1heCA9PSBudWxsKQorCQkJCXsKKwkJCQkJbWF4ID0gdG1wOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltYXggPSBteFJlY3RhbmdsZS5mcm9tUmVjdGFuZ2xlKG1heCk7CisJCQkJCW1heC5pbnRlcnNlY3QodG1wKTsKKwkJCQl9CisJCQl9CisJCX0KKwkKKwkJaWYgKG1heCAhPSBudWxsKQorCQl7CisJCQlpZiAodGhpcy51bnNjYWxlZEJvdW5kcy54IDwgbWF4LngpCisJCQl7CisJCQkJdGhpcy51bnNjYWxlZEJvdW5kcy53aWR0aCAtPSBtYXgueCAtIHRoaXMudW5zY2FsZWRCb3VuZHMueDsKKwkJCQl0aGlzLnVuc2NhbGVkQm91bmRzLnggPSBtYXgueDsKKwkJCX0KKwkJCQorCQkJaWYgKHRoaXMudW5zY2FsZWRCb3VuZHMueSA8IG1heC55KQorCQkJeworCQkJCXRoaXMudW5zY2FsZWRCb3VuZHMuaGVpZ2h0IC09IG1heC55IC0gdGhpcy51bnNjYWxlZEJvdW5kcy55OworCQkJCXRoaXMudW5zY2FsZWRCb3VuZHMueSA9IG1heC55OworCQkJfQorCQkJCisJCQlpZiAodGhpcy51bnNjYWxlZEJvdW5kcy54ICsgdGhpcy51bnNjYWxlZEJvdW5kcy53aWR0aCA+IG1heC54ICsgbWF4LndpZHRoKQorCQkJeworCQkJCXRoaXMudW5zY2FsZWRCb3VuZHMud2lkdGggLT0gdGhpcy51bnNjYWxlZEJvdW5kcy54ICsKKwkJCQkJdGhpcy51bnNjYWxlZEJvdW5kcy53aWR0aCAtIG1heC54IC0gbWF4LndpZHRoOworCQkJfQorCQkJCisJCQlpZiAodGhpcy51bnNjYWxlZEJvdW5kcy55ICsgdGhpcy51bnNjYWxlZEJvdW5kcy5oZWlnaHQgPiBtYXgueSArIG1heC5oZWlnaHQpCisJCQl7CisJCQkJdGhpcy51bnNjYWxlZEJvdW5kcy5oZWlnaHQgLT0gdGhpcy51bnNjYWxlZEJvdW5kcy55ICsKKwkJCQkJdGhpcy51bnNjYWxlZEJvdW5kcy5oZWlnaHQgLSBtYXgueSAtIG1heC5oZWlnaHQ7CisJCQl9CisJCX0KKwl9CisJCisJdGhpcy5ib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUoKCh0aGlzLnBhcmVudFN0YXRlICE9IG51bGwpID8gdGhpcy5wYXJlbnRTdGF0ZS54IDogdHIueCAqIHNjYWxlKSArCisJCSh0aGlzLnVuc2NhbGVkQm91bmRzLngpICogc2NhbGUsICgodGhpcy5wYXJlbnRTdGF0ZSAhPSBudWxsKSA/IHRoaXMucGFyZW50U3RhdGUueSA6IHRyLnkgKiBzY2FsZSkgKworCQkodGhpcy51bnNjYWxlZEJvdW5kcy55KSAqIHNjYWxlLCB0aGlzLnVuc2NhbGVkQm91bmRzLndpZHRoICogc2NhbGUsIHRoaXMudW5zY2FsZWRCb3VuZHMuaGVpZ2h0ICogc2NhbGUpOworCisJaWYgKGdlby5yZWxhdGl2ZSAmJiB0aGlzLnBhcmVudFN0YXRlICE9IG51bGwpCisJeworCQl0aGlzLmJvdW5kcy54ICs9IHRoaXMuc3RhdGUueCAtIHRoaXMucGFyZW50U3RhdGUueDsKKwkJdGhpcy5ib3VuZHMueSArPSB0aGlzLnN0YXRlLnkgLSB0aGlzLnBhcmVudFN0YXRlLnk7CisJfQorCisJY29zID0gTWF0aC5jb3MoYWxwaGEpOworCXNpbiA9IE1hdGguc2luKGFscGhhKTsKKwkKKwl2YXIgYzIgPSBuZXcgbXhQb2ludCh0aGlzLmJvdW5kcy5nZXRDZW50ZXJYKCksIHRoaXMuYm91bmRzLmdldENlbnRlclkoKSk7CisKKwl2YXIgZHggPSBjMi54IC0gY3QueDsKKwl2YXIgZHkgPSBjMi55IC0gY3QueTsKKwkKKwl2YXIgZHgyID0gY29zICogZHggLSBzaW4gKiBkeTsKKwl2YXIgZHkyID0gc2luICogZHggKyBjb3MgKiBkeTsKKwkKKwl2YXIgZHgzID0gZHgyIC0gZHg7CisJdmFyIGR5MyA9IGR5MiAtIGR5OworCQorCXZhciBkeDQgPSB0aGlzLmJvdW5kcy54IC0gdGhpcy5zdGF0ZS54OworCXZhciBkeTQgPSB0aGlzLmJvdW5kcy55IC0gdGhpcy5zdGF0ZS55OworCQorCXZhciBkeDUgPSBjb3MgKiBkeDQgLSBzaW4gKiBkeTQ7CisJdmFyIGR5NSA9IHNpbiAqIGR4NCArIGNvcyAqIGR5NDsKKwkKKwl0aGlzLmJvdW5kcy54ICs9IGR4MzsKKwl0aGlzLmJvdW5kcy55ICs9IGR5MzsKKwkKKwkvLyBSb3VuZHMgdW5zY2FsZWQgYm91bmRzIHRvIGludAorCXRoaXMudW5zY2FsZWRCb3VuZHMueCA9IHRoaXMucm91bmRMZW5ndGgodGhpcy51bnNjYWxlZEJvdW5kcy54ICsgZHgzIC8gc2NhbGUpOworCXRoaXMudW5zY2FsZWRCb3VuZHMueSA9IHRoaXMucm91bmRMZW5ndGgodGhpcy51bnNjYWxlZEJvdW5kcy55ICsgZHkzIC8gc2NhbGUpOworCXRoaXMudW5zY2FsZWRCb3VuZHMud2lkdGggPSB0aGlzLnJvdW5kTGVuZ3RoKHRoaXMudW5zY2FsZWRCb3VuZHMud2lkdGgpOworCXRoaXMudW5zY2FsZWRCb3VuZHMuaGVpZ2h0ID0gdGhpcy5yb3VuZExlbmd0aCh0aGlzLnVuc2NhbGVkQm91bmRzLmhlaWdodCk7CisJCisJLy8gU2hpZnRzIHRoZSBjaGlsZHJlbiBhY2NvcmRpbmcgdG8gcGFyZW50IG9mZnNldAorCWlmICghdGhpcy5ncmFwaC5pc0NlbGxDb2xsYXBzZWQodGhpcy5zdGF0ZS5jZWxsKSAmJiAoZHgzICE9IDAgfHwgZHkzICE9IDApKQorCXsKKwkJdGhpcy5jaGlsZE9mZnNldFggPSB0aGlzLnN0YXRlLnggLSB0aGlzLmJvdW5kcy54ICsgZHg1OworCQl0aGlzLmNoaWxkT2Zmc2V0WSA9IHRoaXMuc3RhdGUueSAtIHRoaXMuYm91bmRzLnkgKyBkeTU7CisJfQorCWVsc2UKKwl7CisJCXRoaXMuY2hpbGRPZmZzZXRYID0gMDsKKwkJdGhpcy5jaGlsZE9mZnNldFkgPSAwOworCX0KKwkKKwlpZiAodGhpcy5saXZlUHJldmlldykKKwl7CisJCXRoaXMudXBkYXRlTGl2ZVByZXZpZXcobWUpOworCX0KKwkKKwlpZiAodGhpcy5wcmV2aWV3ICE9IG51bGwpCisJeworCQl0aGlzLmRyYXdQcmV2aWV3KCk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlTGl2ZVByZXZpZXcKKyAqIAorICogUmVwYWludHMgdGhlIGxpdmUgcHJldmlldy4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS51cGRhdGVMaXZlUHJldmlldyA9IGZ1bmN0aW9uKG1lKQoreworCS8vIFRPRE86IEFwcGx5IGNoaWxkIG9mZnNldCB0byBjaGlsZHJlbiBpbiBsaXZlIHByZXZpZXcKKwl2YXIgc2NhbGUgPSB0aGlzLmdyYXBoLnZpZXcuc2NhbGU7CisJdmFyIHRyID0gdGhpcy5ncmFwaC52aWV3LnRyYW5zbGF0ZTsKKwkKKwkvLyBTYXZlcyBjdXJyZW50IHN0YXRlCisJdmFyIHRlbXBTdGF0ZSA9IHRoaXMuc3RhdGUuY2xvbmUoKTsKKworCS8vIFRlbXBvcmFyaWx5IGNoYW5nZXMgc2l6ZSBhbmQgb3JpZ2luCisJdGhpcy5zdGF0ZS54ID0gdGhpcy5ib3VuZHMueDsKKwl0aGlzLnN0YXRlLnkgPSB0aGlzLmJvdW5kcy55OworCXRoaXMuc3RhdGUub3JpZ2luID0gbmV3IG14UG9pbnQodGhpcy5zdGF0ZS54IC8gc2NhbGUgLSB0ci54LCB0aGlzLnN0YXRlLnkgLyBzY2FsZSAtIHRyLnkpOworCXRoaXMuc3RhdGUud2lkdGggPSB0aGlzLmJvdW5kcy53aWR0aDsKKwl0aGlzLnN0YXRlLmhlaWdodCA9IHRoaXMuYm91bmRzLmhlaWdodDsKKwkKKwkvLyBOZWVkZWQgdG8gZm9yY2UgdXBkYXRlIG9mIHRleHQgYm91bmRzCisJdGhpcy5zdGF0ZS51bnNjYWxlZFdpZHRoID0gbnVsbDsKKwkKKwkvLyBSZWRyYXdzIGNlbGwgYW5kIGhhbmRsZXMKKwl2YXIgb2ZmID0gdGhpcy5zdGF0ZS5hYnNvbHV0ZU9mZnNldDsKKwlvZmYgPSBuZXcgbXhQb2ludChvZmYueCwgb2ZmLnkpOworCisJLy8gUmVxdWlyZWQgdG8gc3RvcmUgYW5kIHJlc2V0IGFic29sdXRlIG9mZnNldCBmb3IgdXBkYXRpbmcgbGFiZWwgcG9zaXRpb24KKwl0aGlzLnN0YXRlLmFic29sdXRlT2Zmc2V0LnggPSAwOworCXRoaXMuc3RhdGUuYWJzb2x1dGVPZmZzZXQueSA9IDA7CisJdmFyIGdlbyA9IHRoaXMuZ3JhcGguZ2V0Q2VsbEdlb21ldHJ5KHRoaXMuc3RhdGUuY2VsbCk7CQkJCQorCisJaWYgKGdlbyAhPSBudWxsKQorCXsKKwkJdmFyIG9mZnNldCA9IGdlby5vZmZzZXQgfHwgdGhpcy5FTVBUWV9QT0lOVDsKKworCQlpZiAob2Zmc2V0ICE9IG51bGwgJiYgIWdlby5yZWxhdGl2ZSkKKwkJeworCQkJdGhpcy5zdGF0ZS5hYnNvbHV0ZU9mZnNldC54ID0gdGhpcy5zdGF0ZS52aWV3LnNjYWxlICogb2Zmc2V0Lng7CisJCQl0aGlzLnN0YXRlLmFic29sdXRlT2Zmc2V0LnkgPSB0aGlzLnN0YXRlLnZpZXcuc2NhbGUgKiBvZmZzZXQueTsKKwkJfQorCQkKKwkJdGhpcy5zdGF0ZS52aWV3LnVwZGF0ZVZlcnRleExhYmVsT2Zmc2V0KHRoaXMuc3RhdGUpOworCX0KKwkKKwkvLyBEcmF3cyB0aGUgbGl2ZSBwcmV2aWV3CisJdGhpcy5zdGF0ZS52aWV3LmdyYXBoLmNlbGxSZW5kZXJlci5yZWRyYXcodGhpcy5zdGF0ZSwgdHJ1ZSk7CisJCisJLy8gUmVkcmF3cyBjb25uZWN0ZWQgZWRnZXMgVE9ETzogSW5jbHVkZSBjaGlsZCBlZGdlcworCXRoaXMuc3RhdGUudmlldy5pbnZhbGlkYXRlKHRoaXMuc3RhdGUuY2VsbCk7CisJdGhpcy5zdGF0ZS5pbnZhbGlkID0gZmFsc2U7CisJdGhpcy5zdGF0ZS52aWV3LnZhbGlkYXRlKCk7CisJdGhpcy5yZWRyYXdIYW5kbGVzKCk7CisJCisJLy8gUmVzdG9yZXMgY3VycmVudCBzdGF0ZQorCXRoaXMuc3RhdGUuc2V0U3RhdGUodGVtcFN0YXRlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdXNlVXAKKyAqIAorICogSGFuZGxlcyB0aGUgZXZlbnQgYnkgYXBwbHlpbmcgdGhlIGNoYW5nZXMgdG8gdGhlIGdlb21ldHJ5LgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLm1vdXNlVXAgPSBmdW5jdGlvbihzZW5kZXIsIG1lKQoreworCWlmICh0aGlzLmluZGV4ICE9IG51bGwgJiYgdGhpcy5zdGF0ZSAhPSBudWxsKQorCXsKKwkJdmFyIHBvaW50ID0gbmV3IG14UG9pbnQobWUuZ2V0R3JhcGhYKCksIG1lLmdldEdyYXBoWSgpKTsKKworCQl0aGlzLmdyYXBoLmdldE1vZGVsKCkuYmVnaW5VcGRhdGUoKTsKKwkJdHJ5CisJCXsKKwkJCWlmICh0aGlzLmluZGV4IDw9IG14RXZlbnQuQ1VTVE9NX0hBTkRMRSkKKwkJCXsKKwkJCQlpZiAodGhpcy5jdXN0b21IYW5kbGVzICE9IG51bGwpCisJCQkJeworCQkJCQl0aGlzLmN1c3RvbUhhbmRsZXNbbXhFdmVudC5DVVNUT01fSEFORExFIC0gdGhpcy5pbmRleF0uYWN0aXZlID0gZmFsc2U7CisJCQkJCXRoaXMuY3VzdG9tSGFuZGxlc1tteEV2ZW50LkNVU1RPTV9IQU5ETEUgLSB0aGlzLmluZGV4XS5leGVjdXRlKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAodGhpcy5pbmRleCA9PSBteEV2ZW50LlJPVEFUSU9OX0hBTkRMRSkKKwkJCXsKKwkJCQlpZiAodGhpcy5jdXJyZW50QWxwaGEgIT0gbnVsbCkKKwkJCQl7CisJCQkJCXZhciBkZWx0YSA9IHRoaXMuY3VycmVudEFscGhhIC0gKHRoaXMuc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfUk9UQVRJT05dIHx8IDApOworCQkJCQkKKwkJCQkJaWYgKGRlbHRhICE9IDApCisJCQkJCXsKKwkJCQkJCXRoaXMucm90YXRlQ2VsbCh0aGlzLnN0YXRlLmNlbGwsIGRlbHRhKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl0aGlzLnJvdGF0ZUNsaWNrKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXZhciBncmlkRW5hYmxlZCA9IHRoaXMuZ3JhcGguaXNHcmlkRW5hYmxlZEV2ZW50KG1lLmdldEV2ZW50KCkpOworCQkJCXZhciBhbHBoYSA9IG14VXRpbHMudG9SYWRpYW5zKHRoaXMuc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfUk9UQVRJT05dIHx8ICcwJyk7CisJCQkJdmFyIGNvcyA9IE1hdGguY29zKC1hbHBoYSk7CisJCQkJdmFyIHNpbiA9IE1hdGguc2luKC1hbHBoYSk7CisJCQkJCisJCQkJdmFyIGR4ID0gcG9pbnQueCAtIHRoaXMuc3RhcnRYOworCQkJCXZhciBkeSA9IHBvaW50LnkgLSB0aGlzLnN0YXJ0WTsKKwkJCQkKKwkJCQkvLyBSb3RhdGVzIHZlY3RvciBmb3IgbW91c2UgZ2VzdHVyZQorCQkJCXZhciB0eCA9IGNvcyAqIGR4IC0gc2luICogZHk7CisJCQkJdmFyIHR5ID0gc2luICogZHggKyBjb3MgKiBkeTsKKwkJCQkKKwkJCQlkeCA9IHR4OworCQkJCWR5ID0gdHk7CisJCQkJCisJCQkJdmFyIHMgPSB0aGlzLmdyYXBoLnZpZXcuc2NhbGU7CisJCQkJdmFyIHJlY3Vyc2UgPSB0aGlzLmlzUmVjdXJzaXZlUmVzaXplKHRoaXMuc3RhdGUsIG1lKTsKKwkJCQl0aGlzLnJlc2l6ZUNlbGwodGhpcy5zdGF0ZS5jZWxsLCB0aGlzLnJvdW5kTGVuZ3RoKGR4IC8gcyksIHRoaXMucm91bmRMZW5ndGgoZHkgLyBzKSwKKwkJCQkJdGhpcy5pbmRleCwgZ3JpZEVuYWJsZWQsIHRoaXMuaXNDb25zdHJhaW5lZEV2ZW50KG1lKSwgcmVjdXJzZSk7CisJCQl9CisJCX0KKwkJZmluYWxseQorCQl7CisJCQl0aGlzLmdyYXBoLmdldE1vZGVsKCkuZW5kVXBkYXRlKCk7CisJCX0KKworCQltZS5jb25zdW1lKCk7CisJCXRoaXMucmVzZXQoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByb3RhdGVDZWxsCisgKiAKKyAqIFJvdGF0ZXMgdGhlIGdpdmVuIGNlbGwgdG8gdGhlIGdpdmVuIHJvdGF0aW9uLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLmlzUmVjdXJzaXZlUmVzaXplID0gZnVuY3Rpb24oc3RhdGUsIG1lKQoreworCXJldHVybiB0aGlzLmdyYXBoLmlzUmVjdXJzaXZlUmVzaXplKHRoaXMuc3RhdGUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcm90YXRlQ2xpY2sKKyAqIAorICogSG9vayBmb3Igc3ViY2xhc3NlcnMgdG8gaW1wbGVtZW50IGEgc2luZ2xlIGNsaWNrIG9uIHRoZSByb3RhdGlvbiBoYW5kbGUuCisgKiBUaGlzIGNvZGUgaXMgZXhlY3V0ZWQgYXMgcGFydCBvZiB0aGUgbW9kZWwgdHJhbnNhY3Rpb24uIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIGlzIGVtcHR5LgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLnJvdGF0ZUNsaWNrID0gZnVuY3Rpb24oKSB7IH07CisKKy8qKgorICogRnVuY3Rpb246IHJvdGF0ZUNlbGwKKyAqIAorICogUm90YXRlcyB0aGUgZ2l2ZW4gY2VsbCBhbmQgaXRzIGNoaWxkcmVuIGJ5IHRoZSBnaXZlbiBhbmdsZSBpbiBkZWdyZWVzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdG8gYmUgcm90YXRlZC4KKyAqIGFuZ2xlIC0gQW5nbGUgaW4gZGVncmVlcy4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5yb3RhdGVDZWxsID0gZnVuY3Rpb24oY2VsbCwgYW5nbGUsIHBhcmVudCkKK3sKKwlpZiAoYW5nbGUgIT0gMCkKKwl7CisJCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKworCQlpZiAobW9kZWwuaXNWZXJ0ZXgoY2VsbCkgfHwgbW9kZWwuaXNFZGdlKGNlbGwpKQorCQl7CisJCQlpZiAoIW1vZGVsLmlzRWRnZShjZWxsKSkKKwkJCXsKKwkJCQl2YXIgc3RhdGUgPSB0aGlzLmdyYXBoLnZpZXcuZ2V0U3RhdGUoY2VsbCk7CisJCQkJdmFyIHN0eWxlID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuc3R5bGUgOiB0aGlzLmdyYXBoLmdldENlbGxTdHlsZShjZWxsKTsKKwkJCisJCQkJaWYgKHN0eWxlICE9IG51bGwpCisJCQkJeworCQkJCQl2YXIgdG90YWwgPSAoc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfUk9UQVRJT05dIHx8IDApICsgYW5nbGU7CisJCQkJCXRoaXMuZ3JhcGguc2V0Q2VsbFN0eWxlcyhteENvbnN0YW50cy5TVFlMRV9ST1RBVElPTiwgdG90YWwsIFtjZWxsXSk7CisJCQkJfQorCQkJfQorCQkJCisJCQl2YXIgZ2VvID0gdGhpcy5ncmFwaC5nZXRDZWxsR2VvbWV0cnkoY2VsbCk7CisJCQkKKwkJCWlmIChnZW8gIT0gbnVsbCkKKwkJCXsKKwkJCQl2YXIgcGdlbyA9IHRoaXMuZ3JhcGguZ2V0Q2VsbEdlb21ldHJ5KHBhcmVudCk7CisJCQkJCisJCQkJaWYgKHBnZW8gIT0gbnVsbCAmJiAhbW9kZWwuaXNFZGdlKHBhcmVudCkpCisJCQkJeworCQkJCQlnZW8gPSBnZW8uY2xvbmUoKTsKKwkJCQkJZ2VvLnJvdGF0ZShhbmdsZSwgbmV3IG14UG9pbnQocGdlby53aWR0aCAvIDIsIHBnZW8uaGVpZ2h0IC8gMikpOworCQkJCQltb2RlbC5zZXRHZW9tZXRyeShjZWxsLCBnZW8pOworCQkJCX0KKwkJCQkKKwkJCQlpZiAoKG1vZGVsLmlzVmVydGV4KGNlbGwpICYmICFnZW8ucmVsYXRpdmUpIHx8IG1vZGVsLmlzRWRnZShjZWxsKSkKKwkJCQl7CisJCQkJCS8vIFJlY3Vyc2l2ZSByb3RhdGlvbgorCQkJCQl2YXIgY2hpbGRDb3VudCA9IG1vZGVsLmdldENoaWxkQ291bnQoY2VsbCk7CisJCQkJCQorCQkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykKKwkJCQkJeworCQkJCQkJdGhpcy5yb3RhdGVDZWxsKG1vZGVsLmdldENoaWxkQXQoY2VsbCwgaSksIGFuZ2xlLCBjZWxsKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJlc2V0CisgKiAKKyAqIFJlc2V0cyB0aGUgc3RhdGUgb2YgdGhpcyBoYW5kbGVyLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLnNpemVycyAhPSBudWxsICYmIHRoaXMuaW5kZXggIT0gbnVsbCAmJiB0aGlzLnNpemVyc1t0aGlzLmluZGV4XSAhPSBudWxsICYmCisJCXRoaXMuc2l6ZXJzW3RoaXMuaW5kZXhdLm5vZGUuc3R5bGUuZGlzcGxheSA9PSAnbm9uZScpCisJeworCQl0aGlzLnNpemVyc1t0aGlzLmluZGV4XS5ub2RlLnN0eWxlLmRpc3BsYXkgPSAnJzsKKwl9CisKKwl0aGlzLmN1cnJlbnRBbHBoYSA9IG51bGw7CisJdGhpcy5pblRvbGVyYW5jZSA9IG51bGw7CisJdGhpcy5pbmRleCA9IG51bGw7CisKKwkvLyBUT0RPOiBSZXNldCBhbmQgcmVkcmF3IGNlbGwgc3RhdGVzIGZvciBsaXZlIHByZXZpZXcKKwlpZiAodGhpcy5wcmV2aWV3ICE9IG51bGwpCisJeworCQl0aGlzLnByZXZpZXcuZGVzdHJveSgpOworCQl0aGlzLnByZXZpZXcgPSBudWxsOworCX0KKworCWlmICh0aGlzLmxpdmVQcmV2aWV3ICYmIHRoaXMuc2l6ZXJzICE9IG51bGwpCisJeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2l6ZXJzLmxlbmd0aDsgaSsrKQorCQl7CisJCQlpZiAodGhpcy5zaXplcnNbaV0gIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLnNpemVyc1tpXS5ub2RlLnN0eWxlLmRpc3BsYXkgPSAnJzsKKwkJCX0KKwkJfQorCX0KKworCWlmICh0aGlzLmN1c3RvbUhhbmRsZXMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jdXN0b21IYW5kbGVzLmxlbmd0aDsgaSsrKQorCQl7CisJCQlpZiAodGhpcy5jdXN0b21IYW5kbGVzW2ldLmFjdGl2ZSkKKwkJCXsKKwkJCQl0aGlzLmN1c3RvbUhhbmRsZXNbaV0uYWN0aXZlID0gZmFsc2U7CisJCQkJdGhpcy5jdXN0b21IYW5kbGVzW2ldLnJlc2V0KCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdGhpcy5jdXN0b21IYW5kbGVzW2ldLnNldFZpc2libGUodHJ1ZSk7CisJCQl9CisJCX0KKwl9CisJCisJLy8gQ2hlY2tzIGlmIGhhbmRsZXIgaGFzIGJlZW4gZGVzdHJveWVkCisJaWYgKHRoaXMuc2VsZWN0aW9uQm9yZGVyICE9IG51bGwpCisJeworCQl0aGlzLnNlbGVjdGlvbkJvcmRlci5ub2RlLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJzsKKwkJdGhpcy5zZWxlY3Rpb25Cb3VuZHMgPSB0aGlzLmdldFNlbGVjdGlvbkJvdW5kcyh0aGlzLnN0YXRlKTsKKwkJdGhpcy5ib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUodGhpcy5zZWxlY3Rpb25Cb3VuZHMueCwgdGhpcy5zZWxlY3Rpb25Cb3VuZHMueSwKKwkJCXRoaXMuc2VsZWN0aW9uQm91bmRzLndpZHRoLCB0aGlzLnNlbGVjdGlvbkJvdW5kcy5oZWlnaHQpOworCQl0aGlzLmRyYXdQcmV2aWV3KCk7CisJfQorCisJdGhpcy5yZW1vdmVIaW50KCk7CisJdGhpcy5yZWRyYXdIYW5kbGVzKCk7CisJdGhpcy5lZGdlSGFuZGxlcnMgPSBudWxsOworCXRoaXMudW5zY2FsZWRCb3VuZHMgPSBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVzaXplQ2VsbAorICogCisgKiBVc2VzIHRoZSBnaXZlbiB2ZWN0b3IgdG8gY2hhbmdlIHRoZSBib3VuZHMgb2YgdGhlIGdpdmVuIGNlbGwKKyAqIGluIHRoZSBncmFwaCB1c2luZyA8bXhHcmFwaC5yZXNpemVDZWxsPi4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5yZXNpemVDZWxsID0gZnVuY3Rpb24oY2VsbCwgZHgsIGR5LCBpbmRleCwgZ3JpZEVuYWJsZWQsIGNvbnN0cmFpbmVkLCByZWN1cnNlKQoreworCXZhciBnZW8gPSB0aGlzLmdyYXBoLm1vZGVsLmdldEdlb21ldHJ5KGNlbGwpOworCQorCWlmIChnZW8gIT0gbnVsbCkKKwl7CisJCWlmIChpbmRleCA9PSBteEV2ZW50LkxBQkVMX0hBTkRMRSkKKwkJeworCQkJdmFyIHNjYWxlID0gdGhpcy5ncmFwaC52aWV3LnNjYWxlOworCQkJZHggPSBNYXRoLnJvdW5kKCh0aGlzLmxhYmVsU2hhcGUuYm91bmRzLmdldENlbnRlclgoKSAtIHRoaXMuc3RhcnRYKSAvIHNjYWxlKTsKKwkJCWR5ID0gTWF0aC5yb3VuZCgodGhpcy5sYWJlbFNoYXBlLmJvdW5kcy5nZXRDZW50ZXJZKCkgLSB0aGlzLnN0YXJ0WSkgLyBzY2FsZSk7CisJCQkKKwkJCWdlbyA9IGdlby5jbG9uZSgpOworCQkJCisJCQlpZiAoZ2VvLm9mZnNldCA9PSBudWxsKQorCQkJeworCQkJCWdlby5vZmZzZXQgPSBuZXcgbXhQb2ludChkeCwgZHkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWdlby5vZmZzZXQueCArPSBkeDsKKwkJCQlnZW8ub2Zmc2V0LnkgKz0gZHk7CisJCQl9CisJCQkKKwkJCXRoaXMuZ3JhcGgubW9kZWwuc2V0R2VvbWV0cnkoY2VsbCwgZ2VvKTsKKwkJfQorCQllbHNlIGlmICh0aGlzLnVuc2NhbGVkQm91bmRzICE9IG51bGwpCisJCXsKKwkJCXZhciBzY2FsZSA9IHRoaXMuZ3JhcGgudmlldy5zY2FsZTsKKworCQkJaWYgKHRoaXMuY2hpbGRPZmZzZXRYICE9IDAgfHwgdGhpcy5jaGlsZE9mZnNldFkgIT0gMCkKKwkJCXsKKwkJCQl0aGlzLm1vdmVDaGlsZHJlbihjZWxsLCBNYXRoLnJvdW5kKHRoaXMuY2hpbGRPZmZzZXRYIC8gc2NhbGUpLCBNYXRoLnJvdW5kKHRoaXMuY2hpbGRPZmZzZXRZIC8gc2NhbGUpKTsKKwkJCX0KKworCQkJdGhpcy5ncmFwaC5yZXNpemVDZWxsKGNlbGwsIHRoaXMudW5zY2FsZWRCb3VuZHMsIHJlY3Vyc2UpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogbW92ZUNoaWxkcmVuCisgKiAKKyAqIE1vdmVzIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gY2VsbCBieSB0aGUgZ2l2ZW4gdmVjdG9yLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLm1vdmVDaGlsZHJlbiA9IGZ1bmN0aW9uKGNlbGwsIGR4LCBkeSkKK3sKKwl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCk7CisJdmFyIGNoaWxkQ291bnQgPSBtb2RlbC5nZXRDaGlsZENvdW50KGNlbGwpOworCQorCWZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKQorCXsKKwkJdmFyIGNoaWxkID0gbW9kZWwuZ2V0Q2hpbGRBdChjZWxsLCBpKTsKKwkJdmFyIGdlbyA9IHRoaXMuZ3JhcGguZ2V0Q2VsbEdlb21ldHJ5KGNoaWxkKTsKKwkJCisJCWlmIChnZW8gIT0gbnVsbCkKKwkJeworCQkJZ2VvID0gZ2VvLmNsb25lKCk7CisJCQlnZW8udHJhbnNsYXRlKGR4LCBkeSk7CisJCQltb2RlbC5zZXRHZW9tZXRyeShjaGlsZCwgZ2VvKTsKKwkJfQorCX0KK307CisvKioKKyAqIEZ1bmN0aW9uOiB1bmlvbgorICogCisgKiBSZXR1cm5zIHRoZSB1bmlvbiBvZiB0aGUgZ2l2ZW4gYm91bmRzIGFuZCBsb2NhdGlvbiBmb3IgdGhlIHNwZWNpZmllZAorICogaGFuZGxlIGluZGV4LgorICogCisgKiBUbyBvdmVycmlkZSB0aGlzIHRvIGxpbWl0IHRoZSBzaXplIG9mIHZlcnRleCB2aWEgYSBtaW5XaWR0aC8tSGVpZ2h0IHN0eWxlLAorICogdGhlIGZvbGxvd2luZyBjb2RlIGNhbiBiZSB1c2VkLgorICogCisgKiAoY29kZSkKKyAqIHZhciB2ZXJ0ZXhIYW5kbGVyVW5pb24gPSBteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLnVuaW9uOworICogbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS51bmlvbiA9IGZ1bmN0aW9uKGJvdW5kcywgZHgsIGR5LCBpbmRleCwgZ3JpZEVuYWJsZWQsIHNjYWxlLCB0ciwgY29uc3RyYWluZWQpCisgKiB7CisgKiAgIHZhciByZXN1bHQgPSB2ZXJ0ZXhIYW5kbGVyVW5pb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAqICAgCisgKiAgIHJlc3VsdC53aWR0aCA9IE1hdGgubWF4KHJlc3VsdC53aWR0aCwgbXhVdGlscy5nZXROdW1iZXIodGhpcy5zdGF0ZS5zdHlsZSwgJ21pbldpZHRoJywgMCkpOworICogICByZXN1bHQuaGVpZ2h0ID0gTWF0aC5tYXgocmVzdWx0LmhlaWdodCwgbXhVdGlscy5nZXROdW1iZXIodGhpcy5zdGF0ZS5zdHlsZSwgJ21pbkhlaWdodCcsIDApKTsKKyAqICAgCisgKiAgIHJldHVybiByZXN1bHQ7CisgKiB9OworICogKGVuZCkKKyAqIAorICogVGhlIG1pbldpZHRoLy1IZWlnaHQgc3R5bGUgY2FuIHRoZW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorICogCisgKiAoY29kZSkKKyAqIGdyYXBoLmluc2VydFZlcnRleChwYXJlbnQsIG51bGwsICdIZWxsbywnLCAyMCwgMjAsIDgwLCAzMCwgJ21pbldpZHRoPTEwMDttaW5IZWlnaHQ9MTAwOycpOworICogKGVuZCkKKyAqIAorICogVG8gb3ZlcnJpZGUgdGhpcyB0byB1cGRhdGUgdGhlIGhlaWdodCBmb3IgYSB3cmFwcGVkIHRleHQgaWYgdGhlIHdpZHRoIG9mIGEgdmVydGV4IGlzCisgKiBjaGFuZ2VkLCB0aGUgZm9sbG93aW5nIGNhbiBiZSB1c2VkLgorICogCisgKiAoY29kZSkKKyAqIHZhciBteFZlcnRleEhhbmRsZXJVbmlvbiA9IG14VmVydGV4SGFuZGxlci5wcm90b3R5cGUudW5pb247CisgKiBteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLnVuaW9uID0gZnVuY3Rpb24oYm91bmRzLCBkeCwgZHksIGluZGV4LCBncmlkRW5hYmxlZCwgc2NhbGUsIHRyLCBjb25zdHJhaW5lZCkKKyAqIHsKKyAqICAgdmFyIHJlc3VsdCA9IG14VmVydGV4SGFuZGxlclVuaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgKiAgIHZhciBzID0gdGhpcy5zdGF0ZTsKKyAqICAgCisgKiAgIGlmICh0aGlzLmdyYXBoLmlzSHRtbExhYmVsKHMuY2VsbCkgJiYgKGluZGV4ID09IDMgfHwgaW5kZXggPT0gNCkgJiYKKyAqICAgICAgIHMudGV4dCAhPSBudWxsICYmIHMuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfV0hJVEVfU1BBQ0VdID09ICd3cmFwJykKKyAqICAgeworICogICAgIHZhciBsYWJlbCA9IHRoaXMuZ3JhcGguZ2V0TGFiZWwocy5jZWxsKTsKKyAqICAgICB2YXIgZm9udFNpemUgPSBteFV0aWxzLmdldE51bWJlcihzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9GT05UU0laRSwgbXhDb25zdGFudHMuREVGQVVMVF9GT05UU0laRSk7CisgKiAgICAgdmFyIHd3ID0gcmVzdWx0LndpZHRoIC8gcy52aWV3LnNjYWxlIC0gcy50ZXh0LnNwYWNpbmdSaWdodCAtIHMudGV4dC5zcGFjaW5nTGVmdAorICogICAgIAorICogICAgIHJlc3VsdC5oZWlnaHQgPSBteFV0aWxzLmdldFNpemVGb3JTdHJpbmcobGFiZWwsIGZvbnRTaXplLCBzLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0ZPTlRGQU1JTFldLCB3dykuaGVpZ2h0OworICogICB9CisgKiAgIAorICogICByZXR1cm4gcmVzdWx0OworICogfTsKKyAqIChlbmQpCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUudW5pb24gPSBmdW5jdGlvbihib3VuZHMsIGR4LCBkeSwgaW5kZXgsIGdyaWRFbmFibGVkLCBzY2FsZSwgdHIsIGNvbnN0cmFpbmVkLCBjZW50ZXJlZCkKK3sKKwlpZiAodGhpcy5zaW5nbGVTaXplcikKKwl7CisJCXZhciB4ID0gYm91bmRzLnggKyBib3VuZHMud2lkdGggKyBkeDsKKwkJdmFyIHkgPSBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgKyBkeTsKKwkJCisJCWlmIChncmlkRW5hYmxlZCkKKwkJeworCQkJeCA9IHRoaXMuZ3JhcGguc25hcCh4IC8gc2NhbGUpICogc2NhbGU7CisJCQl5ID0gdGhpcy5ncmFwaC5zbmFwKHkgLyBzY2FsZSkgKiBzY2FsZTsKKwkJfQorCQkKKwkJdmFyIHJlY3QgPSBuZXcgbXhSZWN0YW5nbGUoYm91bmRzLngsIGJvdW5kcy55LCAwLCAwKTsKKwkJcmVjdC5hZGQobmV3IG14UmVjdGFuZ2xlKHgsIHksIDAsIDApKTsKKwkJCisJCXJldHVybiByZWN0OworCX0KKwllbHNlCisJeworCQl2YXIgdzAgPSBib3VuZHMud2lkdGg7CisJCXZhciBoMCA9IGJvdW5kcy5oZWlnaHQ7CisJCXZhciBsZWZ0ID0gYm91bmRzLnggLSB0ci54ICogc2NhbGU7CisJCXZhciByaWdodCA9IGxlZnQgKyB3MDsKKwkJdmFyIHRvcCA9IGJvdW5kcy55IC0gdHIueSAqIHNjYWxlOworCQl2YXIgYm90dG9tID0gdG9wICsgaDA7CisJCQorCQl2YXIgY3ggPSBsZWZ0ICsgdzAgLyAyOworCQl2YXIgY3kgPSB0b3AgKyBoMCAvIDI7CisJCQorCQlpZiAoaW5kZXggPiA0IC8qIEJvdHRvbSBSb3cgKi8pCisJCXsKKwkJCWJvdHRvbSA9IGJvdHRvbSArIGR5OworCQkJCisJCQlpZiAoZ3JpZEVuYWJsZWQpCisJCQl7CisJCQkJYm90dG9tID0gdGhpcy5ncmFwaC5zbmFwKGJvdHRvbSAvIHNjYWxlKSAqIHNjYWxlOworCQkJfQorCQl9CisJCWVsc2UgaWYgKGluZGV4IDwgMyAvKiBUb3AgUm93ICovKQorCQl7CisJCQl0b3AgPSB0b3AgKyBkeTsKKwkJCQorCQkJaWYgKGdyaWRFbmFibGVkKQorCQkJeworCQkJCXRvcCA9IHRoaXMuZ3JhcGguc25hcCh0b3AgLyBzY2FsZSkgKiBzY2FsZTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKGluZGV4ID09IDAgfHwgaW5kZXggPT0gMyB8fCBpbmRleCA9PSA1IC8qIExlZnQgKi8pCisJCXsKKwkJCWxlZnQgKz0gZHg7CisJCQkKKwkJCWlmIChncmlkRW5hYmxlZCkKKwkJCXsKKwkJCQlsZWZ0ID0gdGhpcy5ncmFwaC5zbmFwKGxlZnQgLyBzY2FsZSkgKiBzY2FsZTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChpbmRleCA9PSAyIHx8IGluZGV4ID09IDQgfHwgaW5kZXggPT0gNyAvKiBSaWdodCAqLykKKwkJeworCQkJcmlnaHQgKz0gZHg7CisJCQkKKwkJCWlmIChncmlkRW5hYmxlZCkKKwkJCXsKKwkJCQlyaWdodCA9IHRoaXMuZ3JhcGguc25hcChyaWdodCAvIHNjYWxlKSAqIHNjYWxlOworCQkJfQorCQl9CisJCQorCQl2YXIgd2lkdGggPSByaWdodCAtIGxlZnQ7CisJCXZhciBoZWlnaHQgPSBib3R0b20gLSB0b3A7CisKKwkJaWYgKGNvbnN0cmFpbmVkKQorCQl7CisJCQl2YXIgZ2VvID0gdGhpcy5ncmFwaC5nZXRDZWxsR2VvbWV0cnkodGhpcy5zdGF0ZS5jZWxsKTsKKworCQkJaWYgKGdlbyAhPSBudWxsKQorCQkJeworCQkJCXZhciBhc3BlY3QgPSBnZW8ud2lkdGggLyBnZW8uaGVpZ2h0OworCQkJCQorCQkJCWlmIChpbmRleD09IDEgfHwgaW5kZXg9PSAyIHx8IGluZGV4ID09IDcgfHwgaW5kZXggPT0gNikKKwkJCQl7CisJCQkJCXdpZHRoID0gaGVpZ2h0ICogYXNwZWN0OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQloZWlnaHQgPSB3aWR0aCAvIGFzcGVjdDsKKwkJCQl9CisJCQkJCisJCQkJaWYgKGluZGV4ID09IDApCisJCQkJeworCQkJCQlsZWZ0ID0gcmlnaHQgLSB3aWR0aDsKKwkJCQkJdG9wID0gYm90dG9tIC0gaGVpZ2h0OworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChjZW50ZXJlZCkKKwkJeworCQkJd2lkdGggKz0gKHdpZHRoIC0gdzApOworCQkJaGVpZ2h0ICs9IChoZWlnaHQgLSBoMCk7CisJCQkKKwkJCXZhciBjZHggPSBjeCAtIChsZWZ0ICsgd2lkdGggLyAyKTsKKwkJCXZhciBjZHkgPSBjeSAtICh0b3AgKyBoZWlnaHQgLyAyKTsKKworCQkJbGVmdCArPSBjZHg7CisJCQl0b3AgKz0gY2R5OworCQkJcmlnaHQgKz0gY2R4OworCQkJYm90dG9tICs9IGNkeTsKKwkJfQorCisJCS8vIEZsaXBzIG92ZXIgbGVmdCBzaWRlCisJCWlmICh3aWR0aCA8IDApCisJCXsKKwkJCWxlZnQgKz0gd2lkdGg7CisJCQl3aWR0aCA9IE1hdGguYWJzKHdpZHRoKTsKKwkJfQorCQkKKwkJLy8gRmxpcHMgb3ZlciB0b3Agc2lkZQorCQlpZiAoaGVpZ2h0IDwgMCkKKwkJeworCQkJdG9wICs9IGhlaWdodDsKKwkJCWhlaWdodCA9IE1hdGguYWJzKGhlaWdodCk7CisJCX0KKworCQl2YXIgcmVzdWx0ID0gbmV3IG14UmVjdGFuZ2xlKGxlZnQgKyB0ci54ICogc2NhbGUsIHRvcCArIHRyLnkgKiBzY2FsZSwgd2lkdGgsIGhlaWdodCk7CisJCQorCQlpZiAodGhpcy5taW5Cb3VuZHMgIT0gbnVsbCkKKwkJeworCQkJcmVzdWx0LndpZHRoID0gTWF0aC5tYXgocmVzdWx0LndpZHRoLCB0aGlzLm1pbkJvdW5kcy54ICogc2NhbGUgKyB0aGlzLm1pbkJvdW5kcy53aWR0aCAqIHNjYWxlICsKKwkJCQlNYXRoLm1heCgwLCB0aGlzLngwICogc2NhbGUgLSByZXN1bHQueCkpOworCQkJcmVzdWx0LmhlaWdodCA9IE1hdGgubWF4KHJlc3VsdC5oZWlnaHQsIHRoaXMubWluQm91bmRzLnkgKiBzY2FsZSArIHRoaXMubWluQm91bmRzLmhlaWdodCAqIHNjYWxlICsKKwkJCQlNYXRoLm1heCgwLCB0aGlzLnkwICogc2NhbGUgLSByZXN1bHQueSkpOworCQl9CisJCQorCQlyZXR1cm4gcmVzdWx0OworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJlZHJhdworICogCisgKiBSZWRyYXdzIHRoZSBoYW5kbGVzIGFuZCB0aGUgcHJldmlldy4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5yZWRyYXcgPSBmdW5jdGlvbigpCit7CisJdGhpcy5zZWxlY3Rpb25Cb3VuZHMgPSB0aGlzLmdldFNlbGVjdGlvbkJvdW5kcyh0aGlzLnN0YXRlKTsKKwl0aGlzLmJvdW5kcyA9IG5ldyBteFJlY3RhbmdsZSh0aGlzLnNlbGVjdGlvbkJvdW5kcy54LCB0aGlzLnNlbGVjdGlvbkJvdW5kcy55LCB0aGlzLnNlbGVjdGlvbkJvdW5kcy53aWR0aCwgdGhpcy5zZWxlY3Rpb25Cb3VuZHMuaGVpZ2h0KTsKKwkKKwl0aGlzLnJlZHJhd0hhbmRsZXMoKTsKKwl0aGlzLmRyYXdQcmV2aWV3KCk7Cit9OworCisvKioKKyAqIFJldHVybnMgdGhlIHBhZGRpbmcgdG8gYmUgdXNlZCBmb3IgZHJhd2luZyBoYW5kbGVzIGZvciB0aGUgY3VycmVudCA8Ym91bmRzPi4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS5nZXRIYW5kbGVQYWRkaW5nID0gZnVuY3Rpb24oKQoreworCS8vIEtOT1dOOiBUb2xlcmFuY2UgZGVwZW5kcyBvbiBldmVudCB0eXBlIChlZy4gMCBmb3IgbW91c2UgZXZlbnRzKQorCXZhciByZXN1bHQgPSBuZXcgbXhQb2ludCgwLCAwKTsKKwl2YXIgdG9sID0gdGhpcy50b2xlcmFuY2U7CisKKwlpZiAodGhpcy5zaXplcnMgIT0gbnVsbCAmJiB0aGlzLnNpemVycy5sZW5ndGggPiAwICYmIHRoaXMuc2l6ZXJzWzBdICE9IG51bGwgJiYKKwkJKHRoaXMuYm91bmRzLndpZHRoIDwgMiAqIHRoaXMuc2l6ZXJzWzBdLmJvdW5kcy53aWR0aCArIDIgKiB0b2wgfHwKKwkJdGhpcy5ib3VuZHMuaGVpZ2h0IDwgMiAqIHRoaXMuc2l6ZXJzWzBdLmJvdW5kcy5oZWlnaHQgKyAyICogdG9sKSkKKwl7CisJCXRvbCAvPSAyOworCQkKKwkJcmVzdWx0LnggPSB0aGlzLnNpemVyc1swXS5ib3VuZHMud2lkdGggKyB0b2w7CisJCXJlc3VsdC55ID0gdGhpcy5zaXplcnNbMF0uYm91bmRzLmhlaWdodCArIHRvbDsKKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlZHJhd0hhbmRsZXMKKyAqIAorICogUmVkcmF3cyB0aGUgaGFuZGxlcy4gVG8gaGlkZSBjZXJ0YWluIGhhbmRsZXMgdGhlIGZvbGxvd2luZyBjb2RlIGNhbiBiZSB1c2VkLgorICogCisgKiAoY29kZSkKKyAqIG14VmVydGV4SGFuZGxlci5wcm90b3R5cGUucmVkcmF3SGFuZGxlcyA9IGZ1bmN0aW9uKCkKKyAqIHsKKyAqICAgbXhWZXJ0ZXhIYW5kbGVyUmVkcmF3SGFuZGxlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICogICAKKyAqICAgaWYgKHRoaXMuc2l6ZXJzICE9IG51bGwgJiYgdGhpcy5zaXplcnMubGVuZ3RoID4gNykKKyAqICAgeworICogICAgIHRoaXMuc2l6ZXJzWzFdLm5vZGUuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKKyAqICAgICB0aGlzLnNpemVyc1s2XS5ub2RlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisgKiAgIH0KKyAqIH07CisgKiAoZW5kKQorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLnJlZHJhd0hhbmRsZXMgPSBmdW5jdGlvbigpCit7CisJdmFyIHRvbCA9IHRoaXMudG9sZXJhbmNlOworCXRoaXMuaG9yaXpvbnRhbE9mZnNldCA9IDA7CisJdGhpcy52ZXJ0aWNhbE9mZnNldCA9IDA7CisJdmFyIHMgPSB0aGlzLmJvdW5kczsKKworCWlmICh0aGlzLnNpemVycyAhPSBudWxsICYmIHRoaXMuc2l6ZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy5zaXplcnNbMF0gIT0gbnVsbCkKKwl7CisJCWlmICh0aGlzLmluZGV4ID09IG51bGwgJiYgdGhpcy5tYW5hZ2VTaXplcnMgJiYgdGhpcy5zaXplcnMubGVuZ3RoID49IDgpCisJCXsKKwkJCS8vIEtOT1dOOiBUb2xlcmFuY2UgZGVwZW5kcyBvbiBldmVudCB0eXBlIChlZy4gMCBmb3IgbW91c2UgZXZlbnRzKQorCQkJdmFyIHBhZGRpbmcgPSB0aGlzLmdldEhhbmRsZVBhZGRpbmcoKTsKKwkJCXRoaXMuaG9yaXpvbnRhbE9mZnNldCA9IHBhZGRpbmcueDsKKwkJCXRoaXMudmVydGljYWxPZmZzZXQgPSBwYWRkaW5nLnk7CisJCQkKKwkJCWlmICh0aGlzLmhvcml6b250YWxPZmZzZXQgIT0gMCB8fCB0aGlzLnZlcnRpY2FsT2Zmc2V0ICE9IDApCisJCQl7CisJCQkJcyA9IG5ldyBteFJlY3RhbmdsZShzLngsIHMueSwgcy53aWR0aCwgcy5oZWlnaHQpOworCisJCQkJcy54IC09IHRoaXMuaG9yaXpvbnRhbE9mZnNldCAvIDI7CisJCQkJcy53aWR0aCArPSB0aGlzLmhvcml6b250YWxPZmZzZXQ7CisJCQkJcy55IC09IHRoaXMudmVydGljYWxPZmZzZXQgLyAyOworCQkJCXMuaGVpZ2h0ICs9IHRoaXMudmVydGljYWxPZmZzZXQ7CisJCQl9CisJCQkKKwkJCWlmICh0aGlzLnNpemVycy5sZW5ndGggPj0gOCkKKwkJCXsKKwkJCQlpZiAoKHMud2lkdGggPCAyICogdGhpcy5zaXplcnNbMF0uYm91bmRzLndpZHRoICsgMiAqIHRvbCkgfHwKKwkJCQkJKHMuaGVpZ2h0IDwgMiAqIHRoaXMuc2l6ZXJzWzBdLmJvdW5kcy5oZWlnaHQgKyAyICogdG9sKSkKKwkJCQl7CisJCQkJCXRoaXMuc2l6ZXJzWzBdLm5vZGUuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKKwkJCQkJdGhpcy5zaXplcnNbMl0ubm9kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworCQkJCQl0aGlzLnNpemVyc1s1XS5ub2RlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisJCQkJCXRoaXMuc2l6ZXJzWzddLm5vZGUuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdGhpcy5zaXplcnNbMF0ubm9kZS5zdHlsZS5kaXNwbGF5ID0gJyc7CisJCQkJCXRoaXMuc2l6ZXJzWzJdLm5vZGUuc3R5bGUuZGlzcGxheSA9ICcnOworCQkJCQl0aGlzLnNpemVyc1s1XS5ub2RlLnN0eWxlLmRpc3BsYXkgPSAnJzsKKwkJCQkJdGhpcy5zaXplcnNbN10ubm9kZS5zdHlsZS5kaXNwbGF5ID0gJyc7CisJCQkJfQorCQkJfQorCQl9CisKKwkJdmFyIHIgPSBzLnggKyBzLndpZHRoOworCQl2YXIgYiA9IHMueSArIHMuaGVpZ2h0OworCQkKKwkJaWYgKHRoaXMuc2luZ2xlU2l6ZXIpCisJCXsKKwkJCXRoaXMubW92ZVNpemVyVG8odGhpcy5zaXplcnNbMF0sIHIsIGIpOworCQl9CisJCWVsc2UKKwkJeworCQkJdmFyIGN4ID0gcy54ICsgcy53aWR0aCAvIDI7CisJCQl2YXIgY3kgPSBzLnkgKyBzLmhlaWdodCAvIDI7CisJCQkKKwkJCWlmICh0aGlzLnNpemVycy5sZW5ndGggPj0gOCkKKwkJCXsKKwkJCQl2YXIgY3JzID0gWydudy1yZXNpemUnLCAnbi1yZXNpemUnLCAnbmUtcmVzaXplJywgJ2UtcmVzaXplJywgJ3NlLXJlc2l6ZScsICdzLXJlc2l6ZScsICdzdy1yZXNpemUnLCAndy1yZXNpemUnXTsKKwkJCQkKKwkJCQl2YXIgYWxwaGEgPSBteFV0aWxzLnRvUmFkaWFucyh0aGlzLnN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1JPVEFUSU9OXSB8fCAnMCcpOworCQkJCXZhciBjb3MgPSBNYXRoLmNvcyhhbHBoYSk7CisJCQkJdmFyIHNpbiA9IE1hdGguc2luKGFscGhhKTsKKwkJCQkKKwkJCQl2YXIgZGEgPSBNYXRoLnJvdW5kKGFscGhhICogNCAvIE1hdGguUEkpOworCQkJCQorCQkJCXZhciBjdCA9IG5ldyBteFBvaW50KHMuZ2V0Q2VudGVyWCgpLCBzLmdldENlbnRlclkoKSk7CisJCQkJdmFyIHB0ID0gbXhVdGlscy5nZXRSb3RhdGVkUG9pbnQobmV3IG14UG9pbnQocy54LCBzLnkpLCBjb3MsIHNpbiwgY3QpOworCQkJCQorCQkJCXRoaXMubW92ZVNpemVyVG8odGhpcy5zaXplcnNbMF0sIHB0LngsIHB0LnkpOworCQkJCXRoaXMuc2l6ZXJzWzBdLnNldEN1cnNvcihjcnNbbXhVdGlscy5tb2QoMCArIGRhLCBjcnMubGVuZ3RoKV0pOworCQkJCQorCQkJCXB0LnggPSBjeDsKKwkJCQlwdC55ID0gcy55OworCQkJCXB0ID0gbXhVdGlscy5nZXRSb3RhdGVkUG9pbnQocHQsIGNvcywgc2luLCBjdCk7CisJCQkJCisJCQkJdGhpcy5tb3ZlU2l6ZXJUbyh0aGlzLnNpemVyc1sxXSwgcHQueCwgcHQueSk7CisJCQkJdGhpcy5zaXplcnNbMV0uc2V0Q3Vyc29yKGNyc1tteFV0aWxzLm1vZCgxICsgZGEsIGNycy5sZW5ndGgpXSk7CisJCQkJCisJCQkJcHQueCA9IHI7CisJCQkJcHQueSA9IHMueTsKKwkJCQlwdCA9IG14VXRpbHMuZ2V0Um90YXRlZFBvaW50KHB0LCBjb3MsIHNpbiwgY3QpOworCQkJCQorCQkJCXRoaXMubW92ZVNpemVyVG8odGhpcy5zaXplcnNbMl0sIHB0LngsIHB0LnkpOworCQkJCXRoaXMuc2l6ZXJzWzJdLnNldEN1cnNvcihjcnNbbXhVdGlscy5tb2QoMiArIGRhLCBjcnMubGVuZ3RoKV0pOworCQkJCQorCQkJCXB0LnggPSBzLng7CisJCQkJcHQueSA9IGN5OworCQkJCXB0ID0gbXhVdGlscy5nZXRSb3RhdGVkUG9pbnQocHQsIGNvcywgc2luLCBjdCk7CisJCQkJCisJCQkJdGhpcy5tb3ZlU2l6ZXJUbyh0aGlzLnNpemVyc1szXSwgcHQueCwgcHQueSk7CisJCQkJdGhpcy5zaXplcnNbM10uc2V0Q3Vyc29yKGNyc1tteFV0aWxzLm1vZCg3ICsgZGEsIGNycy5sZW5ndGgpXSk7CisKKwkJCQlwdC54ID0gcjsKKwkJCQlwdC55ID0gY3k7CisJCQkJcHQgPSBteFV0aWxzLmdldFJvdGF0ZWRQb2ludChwdCwgY29zLCBzaW4sIGN0KTsKKwkJCQkKKwkJCQl0aGlzLm1vdmVTaXplclRvKHRoaXMuc2l6ZXJzWzRdLCBwdC54LCBwdC55KTsKKwkJCQl0aGlzLnNpemVyc1s0XS5zZXRDdXJzb3IoY3JzW214VXRpbHMubW9kKDMgKyBkYSwgY3JzLmxlbmd0aCldKTsKKworCQkJCXB0LnggPSBzLng7CisJCQkJcHQueSA9IGI7CisJCQkJcHQgPSBteFV0aWxzLmdldFJvdGF0ZWRQb2ludChwdCwgY29zLCBzaW4sIGN0KTsKKwkJCQkKKwkJCQl0aGlzLm1vdmVTaXplclRvKHRoaXMuc2l6ZXJzWzVdLCBwdC54LCBwdC55KTsKKwkJCQl0aGlzLnNpemVyc1s1XS5zZXRDdXJzb3IoY3JzW214VXRpbHMubW9kKDYgKyBkYSwgY3JzLmxlbmd0aCldKTsKKworCQkJCXB0LnggPSBjeDsKKwkJCQlwdC55ID0gYjsKKwkJCQlwdCA9IG14VXRpbHMuZ2V0Um90YXRlZFBvaW50KHB0LCBjb3MsIHNpbiwgY3QpOworCQkJCQorCQkJCXRoaXMubW92ZVNpemVyVG8odGhpcy5zaXplcnNbNl0sIHB0LngsIHB0LnkpOworCQkJCXRoaXMuc2l6ZXJzWzZdLnNldEN1cnNvcihjcnNbbXhVdGlscy5tb2QoNSArIGRhLCBjcnMubGVuZ3RoKV0pOworCisJCQkJcHQueCA9IHI7CisJCQkJcHQueSA9IGI7CisJCQkJcHQgPSBteFV0aWxzLmdldFJvdGF0ZWRQb2ludChwdCwgY29zLCBzaW4sIGN0KTsKKwkJCQkKKwkJCQl0aGlzLm1vdmVTaXplclRvKHRoaXMuc2l6ZXJzWzddLCBwdC54LCBwdC55KTsKKwkJCQl0aGlzLnNpemVyc1s3XS5zZXRDdXJzb3IoY3JzW214VXRpbHMubW9kKDQgKyBkYSwgY3JzLmxlbmd0aCldKTsKKwkJCQkKKwkJCQl0aGlzLm1vdmVTaXplclRvKHRoaXMuc2l6ZXJzWzhdLCBjeCArIHRoaXMuc3RhdGUuYWJzb2x1dGVPZmZzZXQueCwgY3kgKyB0aGlzLnN0YXRlLmFic29sdXRlT2Zmc2V0LnkpOworCQkJfQorCQkJZWxzZSBpZiAodGhpcy5zdGF0ZS53aWR0aCA+PSAyICYmIHRoaXMuc3RhdGUuaGVpZ2h0ID49IDIpCisJCQl7CisJCQkJdGhpcy5tb3ZlU2l6ZXJUbyh0aGlzLnNpemVyc1swXSwgY3ggKyB0aGlzLnN0YXRlLmFic29sdXRlT2Zmc2V0LngsIGN5ICsgdGhpcy5zdGF0ZS5hYnNvbHV0ZU9mZnNldC55KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl0aGlzLm1vdmVTaXplclRvKHRoaXMuc2l6ZXJzWzBdLCB0aGlzLnN0YXRlLngsIHRoaXMuc3RhdGUueSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAodGhpcy5yb3RhdGlvblNoYXBlICE9IG51bGwpCisJeworCQl2YXIgYWxwaGEgPSBteFV0aWxzLnRvUmFkaWFucygodGhpcy5jdXJyZW50QWxwaGEgIT0gbnVsbCkgPyB0aGlzLmN1cnJlbnRBbHBoYSA6IHRoaXMuc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfUk9UQVRJT05dIHx8ICcwJyk7CisJCXZhciBjb3MgPSBNYXRoLmNvcyhhbHBoYSk7CisJCXZhciBzaW4gPSBNYXRoLnNpbihhbHBoYSk7CisJCQorCQl2YXIgY3QgPSBuZXcgbXhQb2ludCh0aGlzLnN0YXRlLmdldENlbnRlclgoKSwgdGhpcy5zdGF0ZS5nZXRDZW50ZXJZKCkpOworCQl2YXIgcHQgPSBteFV0aWxzLmdldFJvdGF0ZWRQb2ludChuZXcgbXhQb2ludChzLnggKyBzLndpZHRoIC8gMiwgcy55ICsgdGhpcy5yb3RhdGlvbkhhbmRsZVZTcGFjaW5nKSwgY29zLCBzaW4sIGN0KTsKKworCQlpZiAodGhpcy5yb3RhdGlvblNoYXBlLm5vZGUgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5tb3ZlU2l6ZXJUbyh0aGlzLnJvdGF0aW9uU2hhcGUsIHB0LngsIHB0LnkpOworCQl9CisJfQorCQorCWlmICh0aGlzLnNlbGVjdGlvbkJvcmRlciAhPSBudWxsKQorCXsKKwkJdGhpcy5zZWxlY3Rpb25Cb3JkZXIucm90YXRpb24gPSBOdW1iZXIodGhpcy5zdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9ST1RBVElPTl0gfHwgJzAnKTsKKwl9CisJCisJaWYgKHRoaXMuZWRnZUhhbmRsZXJzICE9IG51bGwpCisJewkJCisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lZGdlSGFuZGxlcnMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXRoaXMuZWRnZUhhbmRsZXJzW2ldLnJlZHJhdygpOworCQl9CisJfQorCisJaWYgKHRoaXMuY3VzdG9tSGFuZGxlcyAhPSBudWxsKQorCXsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmN1c3RvbUhhbmRsZXMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciB0ZW1wID0gdGhpcy5jdXN0b21IYW5kbGVzW2ldLnNoYXBlLm5vZGUuc3R5bGUuZGlzcGxheTsKKwkJCXRoaXMuY3VzdG9tSGFuZGxlc1tpXS5yZWRyYXcoKTsKKwkJCXRoaXMuY3VzdG9tSGFuZGxlc1tpXS5zaGFwZS5ub2RlLnN0eWxlLmRpc3BsYXkgPSB0ZW1wOworCQl9CisJfQorCisJdGhpcy51cGRhdGVQYXJlbnRIaWdobGlnaHQoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZVBhcmVudEhpZ2hsaWdodAorICogCisgKiBVcGRhdGVzIHRoZSBoaWdobGlnaHQgb2YgdGhlIHBhcmVudCBpZiA8cGFyZW50SGlnaGxpZ2h0RW5hYmxlZD4gaXMgdHJ1ZS4KKyAqLworbXhWZXJ0ZXhIYW5kbGVyLnByb3RvdHlwZS51cGRhdGVQYXJlbnRIaWdobGlnaHQgPSBmdW5jdGlvbigpCit7CisJLy8gSWYgbm90IGRlc3Ryb3llZAorCWlmICh0aGlzLnNlbGVjdGlvbkJvcmRlciAhPSBudWxsKQorCXsKKwkJaWYgKHRoaXMucGFyZW50SGlnaGxpZ2h0ICE9IG51bGwpCisJCXsKKwkJCXZhciBwYXJlbnQgPSB0aGlzLmdyYXBoLm1vZGVsLmdldFBhcmVudCh0aGlzLnN0YXRlLmNlbGwpOworCQorCQkJaWYgKHRoaXMuZ3JhcGgubW9kZWwuaXNWZXJ0ZXgocGFyZW50KSkKKwkJCXsKKwkJCQl2YXIgcHN0YXRlID0gdGhpcy5ncmFwaC52aWV3LmdldFN0YXRlKHBhcmVudCk7CisJCQkJdmFyIGIgPSB0aGlzLnBhcmVudEhpZ2hsaWdodC5ib3VuZHM7CisJCQkJCisJCQkJaWYgKHBzdGF0ZSAhPSBudWxsICYmIChiLnggIT0gcHN0YXRlLnggfHwgYi55ICE9IHBzdGF0ZS55IHx8CisJCQkJCWIud2lkdGggIT0gcHN0YXRlLndpZHRoIHx8IGIuaGVpZ2h0ICE9IHBzdGF0ZS5oZWlnaHQpKQorCQkJCXsKKwkJCQkJdGhpcy5wYXJlbnRIaWdobGlnaHQuYm91bmRzID0gcHN0YXRlOworCQkJCQl0aGlzLnBhcmVudEhpZ2hsaWdodC5yZWRyYXcoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdGhpcy5wYXJlbnRIaWdobGlnaHQuZGVzdHJveSgpOworCQkJCXRoaXMucGFyZW50SGlnaGxpZ2h0ID0gbnVsbDsKKwkJCX0KKwkJfQorCQllbHNlIGlmICh0aGlzLnBhcmVudEhpZ2hsaWdodEVuYWJsZWQpCisJCXsKKwkJCXZhciBwYXJlbnQgPSB0aGlzLmdyYXBoLm1vZGVsLmdldFBhcmVudCh0aGlzLnN0YXRlLmNlbGwpOworCQkJCisJCQlpZiAodGhpcy5ncmFwaC5tb2RlbC5pc1ZlcnRleChwYXJlbnQpKQorCQkJeworCQkJCXZhciBwc3RhdGUgPSB0aGlzLmdyYXBoLnZpZXcuZ2V0U3RhdGUocGFyZW50KTsKKwkJCQkKKwkJCQlpZiAocHN0YXRlICE9IG51bGwpCisJCQkJeworCQkJCQl0aGlzLnBhcmVudEhpZ2hsaWdodCA9IHRoaXMuY3JlYXRlUGFyZW50SGlnaGxpZ2h0U2hhcGUocHN0YXRlKTsKKwkJCQkJLy8gVk1MIGRpYWxlY3QgcmVxdWlyZWQgaGVyZSBmb3IgZXZlbnQgdHJhbnNwYXJlbmN5IGluIElFCisJCQkJCXRoaXMucGFyZW50SGlnaGxpZ2h0LmRpYWxlY3QgPSAodGhpcy5ncmFwaC5kaWFsZWN0ICE9IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHKSA/IG14Q29uc3RhbnRzLkRJQUxFQ1RfVk1MIDogbXhDb25zdGFudHMuRElBTEVDVF9TVkc7CisJCQkJCXRoaXMucGFyZW50SGlnaGxpZ2h0LnBvaW50ZXJFdmVudHMgPSBmYWxzZTsKKwkJCQkJdGhpcy5wYXJlbnRIaWdobGlnaHQucm90YXRpb24gPSBOdW1iZXIocHN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1JPVEFUSU9OXSB8fCAnMCcpOworCQkJCQl0aGlzLnBhcmVudEhpZ2hsaWdodC5pbml0KHRoaXMuZ3JhcGguZ2V0VmlldygpLmdldE92ZXJsYXlQYW5lKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGRyYXdQcmV2aWV3CisgKiAKKyAqIFJlZHJhd3MgdGhlIHByZXZpZXcuCisgKi8KK214VmVydGV4SGFuZGxlci5wcm90b3R5cGUuZHJhd1ByZXZpZXcgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMucHJldmlldyAhPSBudWxsKQorCXsKKwkJdGhpcy5wcmV2aWV3LmJvdW5kcyA9IHRoaXMuYm91bmRzOworCQkKKwkJaWYgKHRoaXMucHJldmlldy5ub2RlLnBhcmVudE5vZGUgPT0gdGhpcy5ncmFwaC5jb250YWluZXIpCisJCXsKKwkJCXRoaXMucHJldmlldy5ib3VuZHMud2lkdGggPSBNYXRoLm1heCgwLCB0aGlzLnByZXZpZXcuYm91bmRzLndpZHRoIC0gMSk7CisJCQl0aGlzLnByZXZpZXcuYm91bmRzLmhlaWdodCA9IE1hdGgubWF4KDAsIHRoaXMucHJldmlldy5ib3VuZHMuaGVpZ2h0IC0gMSk7CisJCX0KKwkKKwkJdGhpcy5wcmV2aWV3LnJvdGF0aW9uID0gTnVtYmVyKHRoaXMuc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfUk9UQVRJT05dIHx8ICcwJyk7CisJCXRoaXMucHJldmlldy5yZWRyYXcoKTsKKwl9CisJCisJdGhpcy5zZWxlY3Rpb25Cb3JkZXIuYm91bmRzID0gdGhpcy5ib3VuZHM7CisJdGhpcy5zZWxlY3Rpb25Cb3JkZXIucmVkcmF3KCk7CisJCisJaWYgKHRoaXMucGFyZW50SGlnaGxpZ2h0ICE9IG51bGwpCisJeworCQl0aGlzLnBhcmVudEhpZ2hsaWdodC5yZWRyYXcoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZXN0cm95CisgKiAKKyAqIERlc3Ryb3lzIHRoZSBoYW5kbGVyIGFuZCBhbGwgaXRzIHJlc291cmNlcyBhbmQgRE9NIG5vZGVzLgorICovCitteFZlcnRleEhhbmRsZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMuZXNjYXBlSGFuZGxlciAhPSBudWxsKQorCXsKKwkJdGhpcy5zdGF0ZS52aWV3LmdyYXBoLnJlbW92ZUxpc3RlbmVyKHRoaXMuZXNjYXBlSGFuZGxlcik7CisJCXRoaXMuZXNjYXBlSGFuZGxlciA9IG51bGw7CisJfQorCQorCWlmICh0aGlzLnByZXZpZXcgIT0gbnVsbCkKKwl7CisJCXRoaXMucHJldmlldy5kZXN0cm95KCk7CisJCXRoaXMucHJldmlldyA9IG51bGw7CisJfQorCQorCWlmICh0aGlzLnBhcmVudEhpZ2hsaWdodCAhPSBudWxsKQorCXsKKwkJdGhpcy5wYXJlbnRIaWdobGlnaHQuZGVzdHJveSgpOworCQl0aGlzLnBhcmVudEhpZ2hsaWdodCA9IG51bGw7CisJfQorCQorCWlmICh0aGlzLnNlbGVjdGlvbkJvcmRlciAhPSBudWxsKQorCXsKKwkJdGhpcy5zZWxlY3Rpb25Cb3JkZXIuZGVzdHJveSgpOworCQl0aGlzLnNlbGVjdGlvbkJvcmRlciA9IG51bGw7CisJfQorCQorCXRoaXMubGFiZWxTaGFwZSA9IG51bGw7CisJdGhpcy5yZW1vdmVIaW50KCk7CisKKwlpZiAodGhpcy5zaXplcnMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zaXplcnMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXRoaXMuc2l6ZXJzW2ldLmRlc3Ryb3koKTsKKwkJfQorCQkKKwkJdGhpcy5zaXplcnMgPSBudWxsOworCX0KKworCWlmICh0aGlzLmN1c3RvbUhhbmRsZXMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jdXN0b21IYW5kbGVzLmxlbmd0aDsgaSsrKQorCQl7CisJCQl0aGlzLmN1c3RvbUhhbmRsZXNbaV0uZGVzdHJveSgpOworCQl9CisJCQorCQl0aGlzLmN1c3RvbUhhbmRsZXMgPSBudWxsOworCX0KK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaW5kZXgudHh0IGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2luZGV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODRmYmI4Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2luZGV4LnR4dApAQCAtMCwwICsxLDMxNiBAQAorRG9jdW1lbnQ6IEFQSSBTcGVjaWZpY2F0aW9uCisKK092ZXJ2aWV3OgorCisgIFRoaXMgSmF2YVNjcmlwdCBsaWJyYXJ5IGlzIGRpdmlkZWQgaW50byA4IHBhY2thZ2VzLiBUaGUgdG9wLWxldmVsIDxteENsaWVudD4KKyAgY2xhc3MgaW5jbHVkZXMgKG9yIGR5bmFtaWNhbGx5IGltcG9ydHMpIGV2ZXJ5dGhpbmcgZWxzZS4gVGhlIGN1cnJlbnQgdmVyc2lvbgorICBpcyBzdG9yZWQgaW4gPG14Q2xpZW50LlZFUlNJT04+LgorCisgIFRoZSAqZWRpdG9yKiBwYWNrYWdlIHByb3ZpZGVzIHRoZSBjbGFzc2VzIHJlcXVpcmVkIHRvIGltcGxlbWVudCBhIGRpYWdyYW0KKyAgZWRpdG9yLiBUaGUgbWFpbiBjbGFzcyBpbiB0aGlzIHBhY2thZ2UgaXMgPG14RWRpdG9yPi4KKworICBUaGUgKnZpZXcqIGFuZCAqbW9kZWwqIHBhY2thZ2VzIGltcGxlbWVudCB0aGUgZ3JhcGggY29tcG9uZW50LCByZXByZXNlbnRlZAorICBieSA8bXhHcmFwaD4uIEl0IHJlZmVycyB0byBhIDxteEdyYXBoTW9kZWw+IHdoaWNoIGNvbnRhaW5zIDxteENlbGw+cyBhbmQKKyAgY2FjaGVzIHRoZSBzdGF0ZSBvZiB0aGUgY2VsbHMgaW4gYSA8bXhHcmFwaFZpZXc+LiBUaGUgY2VsbHMgYXJlIHBhaW50ZWQKKyAgdXNpbmcgYSA8bXhDZWxsUmVuZGVyZXI+IGJhc2VkIG9uIHRoZSBhcHBlYXJhbmNlIGRlZmluZWQgaW4gPG14U3R5bGVzaGVldD4uCisgIFVuZG8gaGlzdG9yeSBpcyBpbXBsZW1lbnRlZCBpbiA8bXhVbmRvTWFuYWdlcj4uIFRvIGRpc3BsYXkgYW4gaWNvbiBvbiB0aGUKKyAgZ3JhcGgsIDxteENlbGxPdmVybGF5PiBtYXkgYmUgdXNlZC4gVmFsaWRhdGlvbiBydWxlcyBhcmUgZGVmaW5lZCB3aXRoCisgIDxteE11bHRpcGxpY2l0eT4uCisKKyAgVGhlICpoYW5kbGVyKiwgKmxheW91dCogYW5kICpzaGFwZSogcGFja2FnZXMgY29udGFpbiBldmVudCBsaXN0ZW5lcnMsCisgIGxheW91dCBhbGdvcml0aG1zIGFuZCBzaGFwZXMsIHJlc3BlY3RpdmVseS4gVGhlIGdyYXBoIGV2ZW50IGxpc3RlbmVycworICBpbmNsdWRlIDxteFJ1YmJlcmJhbmQ+IGZvciBydWJiZXJiYW5kIHNlbGVjdGlvbiwgPG14VG9vbHRpcEhhbmRsZXI+CisgIGZvciB0b29sdGlwcyBhbmQgPG14R3JhcGhIYW5kbGVyPiBmb3IgIGJhc2ljIGNlbGwgbW9kaWZpY2F0aW9ucy4KKyAgPG14Q29tcGFjdFRyZWVMYXlvdXQ+IGltcGxlbWVudHMgYSB0cmVlIGxheW91dCBhbGdvcml0aG0sIGFuZCB0aGUKKyAgc2hhcGUgcGFja2FnZSBwcm92aWRlcyB2YXJpb3VzIHNoYXBlcywgd2hpY2ggYXJlIHN1YmNsYXNzZXMgb2YKKyAgPG14U2hhcGU+LgorCisgIFRoZSAqdXRpbCogcGFja2FnZSBwcm92aWRlcyB1dGlsaXR5IGNsYXNzZXMgaW5jbHVkaW5nIDxteENsaXBib2FyZD4gZm9yCisgIGNvcHktcGFzdGUsIDxteERhdGF0cmFuc2Zlcj4gZm9yIGRyYWctYW5kLWRyb3AsIDxteENvbnN0YW50cz4gZm9yIGtleXMgYW5kCisgIHZhbHVlcyBvZiBzdHlsZXNoZWV0cywgPG14RXZlbnQ+IGFuZCA8bXhVdGlscz4gZm9yIGNyb3NzLWJyb3dzZXIKKyAgZXZlbnQtaGFuZGxpbmcgYW5kIGdlbmVyYWwgcHVycG9zZSBmdW5jdGlvbnMsIDxteFJlc291cmNlcz4gZm9yCisgIGludGVybmF0aW9uYWxpemF0aW9uIGFuZCA8bXhMb2c+IGZvciBjb25zb2xlIG91dHB1dC4KKworICBUaGUgKmlvKiBwYWNrYWdlIGltcGxlbWVudHMgYSBnZW5lcmljIDxteE9iamVjdENvZGVjPiBmb3IgdHVybmluZworICBKYXZhU2NyaXB0IG9iamVjdHMgaW50byBYTUwuIFRoZSBtYWluIGNsYXNzIGlzIDxteENvZGVjPi4KKyAgPG14Q29kZWNSZWdpc3RyeT4gaXMgdGhlIGdsb2JhbCByZWdpc3RyeSBmb3IgY3VzdG9tIGNvZGVjcy4KKworRXZlbnRzOgorCisgIFRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgdHlwZXMgb2YgZXZlbnRzLCBuYW1lbHkgbmF0aXZlIERPTSBldmVudHMsCisgIDxteEV2ZW50T2JqZWN0cz4gd2hpY2ggYXJlIGZpcmVkIGluIGFuIDxteEV2ZW50U291cmNlPiwgYW5kIDxteE1vdXNlRXZlbnRzPgorICB3aGljaCBhcmUgZmlyZWQgaW4gPG14R3JhcGg+LgorCisgIFNvbWUgaGVscGVyIG1ldGhvZHMgZm9yIGhhbmRsaW5nIG5hdGl2ZSBldmVudHMgYXJlIHByb3ZpZGVkIGluIDxteEV2ZW50Pi4gSXQKKyAgYWxzbyB0YWtlcyBjYXJlIG9mIHJlc29sdmluZyBjeWNsZXMgYmV0d2VlbiBET00gbm9kZXMgYW5kIEphdmFTY3JpcHQgZXZlbnQKKyAgaGFuZGxlcnMsIHdoaWNoIGNhbiBsZWFkIHRvIG1lbW9yeSBsZWFrcyBpbiBJRTYuCisKKyAgTW9zdCBjdXN0b20gZXZlbnRzIGluIG14R3JhcGggYXJlIGltcGxlbWVudGVkIHVzaW5nIDxteEV2ZW50U291cmNlPi4gSXRzCisgIGxpc3RlbmVycyBhcmUgZnVuY3Rpb25zIHRoYXQgdGFrZSBhIHNlbmRlciBhbmQgPG14RXZlbnRPYmplY3Q+LiBBZGRpdGlvbmFsbHksCisgIHRoZSA8bXhHcmFwaD4gY2xhc3MgZmlyZXMgc3BlY2lhbCA8bXhNb3VzZUV2ZW50cz4gd2hpY2ggYXJlIGhhbmRsZWQgdXNpbmcKKyAgbW91c2UgbGlzdGVuZXJzLCB3aGljaCBhcmUgb2JqZWN0cyB0aGF0IHByb3ZpZGUgYSBtb3VzZWRvd24sIG1vdXNlbW92ZSBhbmQKKyAgbW91c2V1cCBtZXRob2QuCisKKyAgRXZlbnRzIGluIDxteEV2ZW50U291cmNlPiBhcmUgZmlyZWQgdXNpbmcgPG14RXZlbnRTb3VyY2UuZmlyZUV2ZW50Pi4KKyAgTGlzdGVuZXJzIGFyZSBhZGRlZCBhbmQgcmVtb3ZlZCB1c2luZyA8bXhFdmVudFNvdXJjZS5hZGRMaXN0ZW5lcj4gYW5kCisgIDxteEV2ZW50U291cmNlLnJlbW92ZUxpc3RlbmVyPi4gPG14TW91c2VFdmVudHM+IGluIDxteEdyYXBoPiBhcmUgZmlyZWQgdXNpbmcKKyAgPG14R3JhcGguZmlyZU1vdXNlRXZlbnQ+LiBMaXN0ZW5lcnMgYXJlIGFkZGVkIGFuZCByZW1vdmVkIHVzaW5nCisgIDxteEdyYXBoLmFkZE1vdXNlTGlzdGVuZXI+IGFuZCA8bXhHcmFwaC5yZW1vdmVNb3VzZUxpc3RlbmVyPiwgcmVzcGVjdGl2ZWx5LgorCitLZXkgYmluZGluZ3M6CisKKyAgVGhlIGZvbGxvd2luZyBrZXkgYmluZGluZ3MgYXJlIGRlZmluZWQgZm9yIG1vdXNlIGV2ZW50cyBpbiB0aGUgY2xpZW50IGFjcm9zcworICBhbGwgYnJvd3NlcnMgYW5kIHBsYXRmb3JtczoKKworICAtIENvbnRyb2wtRHJhZzogRHVwbGljYXRlcyAoY2xvbmVzKSBzZWxlY3RlZCBjZWxscworICAtIFNoaWZ0LVJpZ2h0bGljazogU2hvd3MgdGhlIGNvbnRleHQgbWVudQorICAtIEFsdC1DbGljazogRm9yY2VzIHJ1YmJlcmJhbmQgKGFrYS4gbWFycXVlZSkKKyAgLSBDb250cm9sLVNlbGVjdDogVG9nZ2xlcyB0aGUgc2VsZWN0aW9uIHN0YXRlCisgIC0gU2hpZnQtRHJhZzogQ29uc3RyYWlucyB0aGUgb2Zmc2V0IHRvIG9uZSBkaXJlY3Rpb24KKyAgLSBTaGlmdC1Db250cm9sLURyYWc6IFBhbm5pbmcgKGFsc28gU2hpZnQtUmlnaHRkcmFnKQorCitDb25maWd1cmF0aW9uOgorCisgIFRoZSBmb2xsb3dpbmcgZ2xvYmFsIHZhcmlhYmxlcyBtYXkgYmUgZGVmaW5lZCBiZWZvcmUgdGhlIGNsaWVudCBpcyBsb2FkZWQgdG8KKyAgc3BlY2lmeSBpdHMgbGFuZ3VhZ2Ugb3IgYmFzZSBwYXRoLCByZXNwZWN0aXZlbHkuCisKKyAgLSBteEJhc2VQYXRoOiBTcGVjaWZpZXMgdGhlIHBhdGggaW4gPG14Q2xpZW50LmJhc2VQYXRoPi4KKyAgLSBteEltYWdlQmFzZVBhdGg6IFNwZWNpZmllcyB0aGUgcGF0aCBpbiA8bXhDbGllbnQuaW1hZ2VCYXNlUGF0aD4uCisgIC0gbXhMYW5ndWFnZTogU3BlY2lmaWVzIHRoZSBsYW5ndWFnZSBmb3IgcmVzb3VyY2VzIGluIDxteENsaWVudC5sYW5ndWFnZT4uCisgIC0gbXhEZWZhdWx0TGFuZ3VhZ2U6IFNwZWNpZmllcyB0aGUgZGVmYXVsdCBsYW5ndWFnZSBpbiA8bXhDbGllbnQuZGVmYXVsdExhbmd1YWdlPi4KKyAgLSBteExvYWRSZXNvdXJjZXM6IFNwZWNpZmllcyBpZiBhbnkgcmVzb3VyY2VzIHNob3VsZCBiZSBsb2FkZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAgLSBteExvYWRTdHlsZXNoZWV0czogU3BlY2lmaWVzIGlmIGFueSBzdHlsZXNoZWV0cyBzaG91bGQgYmUgbG9hZGVkLiBEZWZhdWx0IGlzIHRydWUuCisKK1Jlc2VydmVkIFdvcmRzOgorCisgIFRoZSBteCBwcmVmaXggaXMgdXNlZCBmb3IgYWxsIGNsYXNzZXMgYW5kIG9iamVjdHMgaW4gbXhHcmFwaC4gVGhlIG14IHByZWZpeAorICBjYW4gYmUgc2VlbiBhcyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSBmb3IgYWxsIEphdmFTY3JpcHQgY29kZSBpbiBteEdyYXBoLiBUaGUKKyAgZm9sbG93aW5nIGZpZWxkbmFtZXMgc2hvdWxkIG5vdCBiZSB1c2VkIGluIG9iamVjdHMuCisKKyAgLSAqbXhPYmplY3RJZCo6IElmIHRoZSBvYmplY3QgaXMgdXNlZCB3aXRoIG14T2JqZWN0SWRlbnRpdHkKKyAgLSAqYXMqOiBJZiB0aGUgb2JqZWN0IGlzIGEgZmllbGQgb2YgYW5vdGhlciBvYmplY3QKKyAgLSAqaWQqOiBJZiB0aGUgb2JqZWN0IGlzIGFuIGlkcmVmIGluIGEgY29kZWMKKyAgLSAqbXhMaXN0ZW5lckxpc3QqOiBBZGRlZCB0byBET00gbm9kZXMgd2hlbiB1c2VkIHdpdGggPG14RXZlbnQ+CisgIC0gKndpbmRvdy5fbXhEeW5hbWljQ29kZSo6IFRlbXBvcmFyaWx5IHVzZWQgdG8gbG9hZCBjb2RlIGluIFNhZmFyaSBhbmQgQ2hyb21lCisgIChzZWUgPG14Q2xpZW50LmluY2x1ZGU+KS4KKyAgLSAqX214SmF2YVNjcmlwdEV4cHJlc3Npb24qOiBHbG9iYWwgdmFyaWFibGUgdGhhdCBpcyB0ZW1wb3JhcmlseSB1c2VkIHRvCisgIGV2YWx1YXRlIGNvZGUgaW4gU2FmYXJpLCBPcGVyYSwgRmlyZWZveCAzIGFuZCBJRSAoc2VlIDxteFV0aWxzLmV2YWw+KS4KKworRmlsZXM6CisKKyAgVGhlIGxpYnJhcnkgY29udGFpbnMgdGhlc2UgcmVsYXRpdmUgZmlsZW5hbWVzLiBBbGwgZmlsZW5hbWVzIGFyZSByZWxhdGl2ZQorICB0byA8bXhDbGllbnQuYmFzZVBhdGg+LgorCitCdWlsdC1pbiBJbWFnZXM6CisKKyAgQWxsIGltYWdlcyBhcmUgbG9hZGVkIGZyb20gdGhlIDxteENsaWVudC5pbWFnZUJhc2VQYXRoPiwKKyAgd2hpY2ggeW91IGNhbiBjaGFuZ2UgdG8gcmVmbGVjdCB5b3VyIGVudmlyb25tZW50LiBUaGUgaW1hZ2UgdmFyaWFibGVzIGNhbgorICBhbHNvIGJlIGNoYW5nZWQgaW5kaXZpZHVhbGx5LgorCisgIC0gbXhHcmFwaC5wcm90b3R5cGUuY29sbGFwc2VkSW1hZ2UKKyAgLSBteEdyYXBoLnByb3RvdHlwZS5leHBhbmRlZEltYWdlCisgIC0gbXhHcmFwaC5wcm90b3R5cGUud2FybmluZ0ltYWdlCisgIC0gbXhXaW5kb3cucHJvdG90eXBlLmNsb3NlSW1hZ2UKKyAgLSBteFdpbmRvdy5wcm90b3R5cGUubWluaW1pemVJbWFnZQorICAtIG14V2luZG93LnByb3RvdHlwZS5ub3JtYWxpemVJbWFnZQorICAtIG14V2luZG93LnByb3RvdHlwZS5tYXhpbWl6ZUltYWdlCisgIC0gbXhXaW5kb3cucHJvdG90eXBlLnJlc2l6ZUltYWdlCisgIC0gbXhQb3B1cE1lbnUucHJvdG90eXBlLnN1Ym1lbnVJbWFnZQorICAtIG14VXRpbHMuZXJyb3JJbWFnZQorICAtIG14Q29uc3RyYWludEhhbmRsZXIucHJvdG90eXBlLnBvaW50SW1hZ2UKKworICBUaGUgYmFzZW5hbWUgb2YgdGhlIHdhcm5pbmcgaW1hZ2UgKGltYWdlcy93YXJuaW5nIHdpdGhvdXQgZXh0ZW5zaW9uKSB1c2VkIGluCisgIDxteEdyYXBoLnNldENlbGxXYXJuaW5nPiBpcyBkZWZpbmVkIGluIDxteEdyYXBoLndhcm5pbmdJbWFnZT4uCisKK1Jlc291cmNlczoKKworICBUaGUgPG14RWRpdG9yPiBhbmQgPG14R3JhcGg+IGNsYXNzZXMgYWRkIHRoZSBmb2xsb3dpbmcgcmVzb3VyY2VzIHRvCisgIDxteFJlc291cmNlcz4gYXQgY2xhc3MgbG9hZGluZyB0aW1lOgorCisgIC0gcmVzb3VyY2VzL2VkaXRvcioucHJvcGVydGllcworICAtIHJlc291cmNlcy9ncmFwaCoucHJvcGVydGllcworCisgIEJ5IGRlZmF1bHQsIHRoZSBsaWJyYXJ5IHNoaXBzIHdpdGggRW5nbGlzaCBhbmQgR2VybWFuIHJlc291cmNlIGZpbGVzLgorCitJbWFnZXM6CisKKyAgUmVjb21tZW5kYXRpb25zIGZvciB1c2luZyBpbWFnZXMuIFVzZSBHSUYgaW1hZ2VzICgyNTYgY29sb3IgcGFsZXR0ZSkgaW4gSFRNTAorICBlbGVtZW50cyAoc3VjaCBhcyB0aGUgdG9vbGJhciBhbmQgY29udGV4dCBtZW51KSwgYW5kIFBORyBpbWFnZXMgKDI0IGJpdCkgZm9yCisgIGFsbCBpbWFnZXMgd2hpY2ggYXBwZWFyIGluc2lkZSB0aGUgZ3JhcGggY29tcG9uZW50LgorCisgIC0gRm9yIFBORyBpbWFnZXMgaW5zaWRlIEhUTUwgZWxlbWVudHMsIEludGVybmV0IEV4cGxvcmVyIHdpbGwgaWdub3JlIGFueQorICAgIHRyYW5zcGFyZW5jeSBpbmZvcm1hdGlvbi4KKyAgLSBGb3IgR0lGIGltYWdlcyBpbnNpZGUgdGhlIGdyYXBoLCBGaXJlZm94IG9uIHRoZSBNYWMgd2lsbCBkaXNwbGF5IHN0cmFuZ2UKKyAgICBjb2xvcnMuIEZ1cnRoZXJtb3JlLCBvbmx5IHRoZSBmaXJzdCBpbWFnZSBmb3IgYW5pbWF0ZWQgR0lGcyBpcyBkaXNwbGF5ZWQKKyAgICBvbiB0aGUgTWFjLgorCisgIEZvciBmYXN0ZXIgaW1hZ2UgcmVuZGVyaW5nIGR1cmluZyBhcHBsaWNhdGlvbiBydW50aW1lLCBpbWFnZXMgY2FuIGJlCisgIHByZWZldGNoZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb2RlOgorCisgIChjb2RlKQorICB2YXIgaW1hZ2UgPSBuZXcgSW1hZ2UoKTsKKyAgaW1hZ2Uuc3JjID0gdXJsX3RvX2ltYWdlOworICAoZW5kKQorCitEZXBsb3ltZW50OgorCisgIFRoZSBjbGllbnQgaXMgYWRkZWQgdG8gdGhlIHBhZ2UgdXNpbmcgdGhlIGZvbGxvd2luZyBzY3JpcHQgdGFnIGluc2lkZSB0aGUKKyAgaGVhZCBvZiBhIGRvY3VtZW50OgorCisgIChjb2RlKQorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqcy9teENsaWVudC5qcyI+PC9zY3JpcHQ+CisgIChlbmQpCisKKyAgVGhlIGRlcGxveW1lbnQgdmVyc2lvbiBvZiB0aGUgbXhDbGllbnQuanMgZmlsZSBjb250YWlucyBhbGwgcmVxdWlyZWQgY29kZQorICBpbiBhIHNpbmdsZSBmaWxlLiBGb3IgZGVwbG95bWVudCwgdGhlIGNvbXBsZXRlIGphdmFzY3JpcHQvc3JjIGRpcmVjdG9yeSBpcworICByZXF1aXJlZC4KKworU291cmNlIENvZGU6CisKKyAgSWYgeW91IGFyZSBhIHNvdXJjZSBjb2RlIGN1c3RvbWVyIGFuZCB5b3Ugd2lzaCB0byBkZXZlbG9wIHVzaW5nIHRoZQorICBmdWxsIHNvdXJjZSBjb2RlLCB0aGUgY29tbWVudGVkIHNvdXJjZSBjb2RlIGlzIHNoaXBwZWQgaW4gdGhlCisgIGphdmFzY3JpcHQvZGV2ZWwvc291cmNlLnppcCBmaWxlLiBJdCBjb250YWlucyBvbmUgZmlsZSBmb3IgZWFjaCBjbGFzcworICBpbiBteEdyYXBoLiBUbyB1c2UgdGhlIHNvdXJjZSBjb2RlIHRoZSBzb3VyY2UuemlwIGZpbGUgbXVzdCBiZQorICB1bmNvbXByZXNzZWQgYW5kIHRoZSBteENsaWVudC5qcyBVUkwgaW4gdGhlIEhUTUwgIHBhZ2UgbXVzdCBiZSBjaGFuZ2VkCisgIHRvIHJlZmVyZW5jZSB0aGUgdW5jb21wcmVzc2VkIG14Q2xpZW50LmpzIGZyb20gdGhlIHNvdXJjZS56aXAgZmlsZS4KKworQ29tcHJlc3Npb246CisKKyAgV2hlbiB1c2luZyBBcGFjaGUyIHdpdGggbW9kX2RlZmxhdGUsIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlCisgIGluIHNyYy9qcy8uaHRhY2Nlc3MgdG8gc3BlZWR1cCB0aGUgbG9hZGluZyBvZiB0aGUgSmF2YVNjcmlwdCBzb3VyY2VzOgorCisgIChjb2RlKQorICBTZXRPdXRwdXRGaWx0ZXIgREVGTEFURQorICAoZW5kKQorCitDbGFzc2VzOgorCisgIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgImNsYXNzZXMiIGluIG14R3JhcGg6IGNsYXNzZXMgYW5kIHNpbmdsZXRvbnMgKHdoZXJlCisgIG9ubHkgb25lIGluc3RhbmNlIGV4aXN0cykuIFNpbmdsZXRvbnMgYXJlIG1hcHBlZCB0byBnbG9iYWwgb2JqZWN0cyB3aGVyZSB0aGUKKyAgdmFyaWFibGUgbmFtZSBlcXVhbHMgdGhlIGNsYXNzbmFtZS4gRm9yIGV4YW1wbGUgbXhDb25zdGFudHMgaXMgYW4gb2JqZWN0IHdpdGgKKyAgYWxsIHRoZSBjb25zdGFudHMgZGVmaW5lZCBhcyBvYmplY3QgZmllbGRzLiBOb3JtYWwgY2xhc3NlcyBhcmUgbWFwcGVkIHRvIGEKKyAgY29uc3RydWN0b3IgZnVuY3Rpb24gYW5kIGEgcHJvdG90eXBlIHdoaWNoIGRlZmluZXMgdGhlIGluc3RhbmNlIGZpZWxkcyBhbmQKKyAgbWV0aG9kcy4gRm9yIGV4YW1wbGUsIDxteEVkaXRvcj4gaXMgYSBmdW5jdGlvbiBhbmQgbXhFZGl0b3IucHJvdG90eXBlIGlzIHRoZQorICBwcm90b3R5cGUgZm9yIHRoZSBvYmplY3QgdGhhdCB0aGUgbXhFZGl0b3IgZnVuY3Rpb24gY3JlYXRlcy4gVGhlIG14IHByZWZpeCBpcworICBhIGNvbnZlbnRpb24gdGhhdCBpcyB1c2VkIGZvciBhbGwgY2xhc3NlcyBpbiB0aGUgbXhHcmFwaCBwYWNrYWdlIHRvIGF2b2lkCisgIGNvbmZsaWN0cyB3aXRoIG90aGVyIG9iamVjdHMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCisKK1N1YmNsYXNzaW5nOgorCisgIEZvciBzdWJjbGFzc2luZywgdGhlIHN1cGVyY2xhc3MgbXVzdCBwcm92aWRlIGEgY29uc3RydWN0b3IgdGhhdCBpcyBlaXRoZXIKKyAgcGFyYW1ldGVybGVzcyBvciBoYW5kbGVzIGFuIGludm9jYXRpb24gd2l0aCBubyBhcmd1bWVudHMuIEZ1cnRoZXJtb3JlLCB0aGUKKyAgc3BlY2lhbCBjb25zdHJ1Y3RvciBmaWVsZCBtdXN0IGJlIHJlZGVmaW5lZCBhZnRlciBleHRlbmRpbmcgdGhlIHByb3RvdHlwZS4KKyAgRm9yIGV4YW1wbGUsIHRoZSBzdXBlcmNsYXNzIG9mIG14RWRpdG9yIGlzIDxteEV2ZW50U291cmNlPi4gVGhpcyBpcworICByZXByZXNlbnRlZCBpbiBKYXZhU2NyaXB0IGJ5IGZpcnN0ICJpbmhlcml0aW5nIiBhbGwgZmllbGRzIGFuZCBtZXRob2RzIGZyb20KKyAgdGhlIHN1cGVyY2xhc3MgYnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgdG8gYW4gaW5zdGFuY2Ugb2YgdGhlIHN1cGVyY2xhc3MsCisgIGVnLiBteEVkaXRvci5wcm90b3R5cGUgPSBuZXcgbXhFdmVudFNvdXJjZSgpIGFuZCByZWRlZmluaW5nIHRoZSBjb25zdHJ1Y3RvcgorICBmaWVsZCB1c2luZyBteEVkaXRvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBteEVkaXRvci4gVGhlIGxhdHRlciBydWxlIGlzCisgIGFwcGxpZWQgc28gdGhhdCB0aGUgdHlwZSBvZiBhbiBvYmplY3QgY2FuIGJlIHJldHJpZXZlZCB2aWEgdGhlIG5hbWUgb2YgaXTvv71zCisgIGNvbnN0cnVjdG9yIHVzaW5nIG14VXRpbHMuZ2V0RnVuY3Rpb25OYW1lKG9iai5jb25zdHJ1Y3RvcikuCisKK0NvbnN0cnVjdG9yOgorCisgIEZvciBzdWJjbGFzc2luZyBpbiBteEdyYXBoLCB0aGUgc2FtZSBzY2hlbWUgc2hvdWxkIGJlIGFwcGxpZWQuIEZvciBleGFtcGxlLAorICBmb3Igc3ViY2xhc3NpbmcgdGhlIDxteEdyYXBoPiBjbGFzcywgZmlyc3QgYSBjb25zdHJ1Y3RvciBtdXN0IGJlIGRlZmluZWQgZm9yCisgIHRoZSBuZXcgY2xhc3MuIFRoZSBjb25zdHJ1Y3RvciBjYWxscyB0aGUgc3VwZXIgY29uc3RydWN0b3Igd2l0aCBhbnkgYXJndW1lbnRzCisgIHRoYXQgaXQgbWF5IGhhdmUgdXNpbmcgdGhlIGNhbGwgZnVuY3Rpb24gb24gdGhlIG14R3JhcGggZnVuY3Rpb24gb2JqZWN0LAorICBwYXNzaW5nIGFsb25nIGV4cGxpdGVseSBlYWNoIGFyZ3VtZW50OgorCisgIChjb2RlKQorICBmdW5jdGlvbiBNeUdyYXBoKGNvbnRhaW5lcikKKyAgeworICAgIG14R3JhcGguY2FsbCh0aGlzLCBjb250YWluZXIpOworICB9CisgIChlbmQpCisKKyAgVGhlIHByb3RvdHlwZSBvZiBNeUdyYXBoIGluaGVyaXRzIGZyb20gbXhHcmFwaCBhcyBmb2xsb3dzLiBBcyB1c3VhbCwgdGhlCisgIGNvbnN0cnVjdG9yIGlzIHJlZGVmaW5lZCBhZnRlciBleHRlbmRpbmcgdGhlIHN1cGVyY2xhc3M6CisKKyAgKGNvZGUpCisgIE15R3JhcGgucHJvdG90eXBlID0gbmV3IG14R3JhcGgoKTsKKyAgTXlHcmFwaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNeUdyYXBoOworICAoZW5kKQorCisgIFlvdSBtYXkgd2FudCB0byBkZWZpbmUgdGhlIGNvZGVjIGFzc29jaWF0ZWQgZm9yIHRoZSBjbGFzcyBhZnRlciB0aGUgYWJvdmUKKyAgY29kZS4gVGhpcyBjb2RlIHdpbGwgYmUgZXhlY3V0ZWQgYXQgY2xhc3MgbG9hZGluZyB0aW1lIGFuZCBtYWtlcyBzdXJlIHRoZQorICBzYW1lIGNvZGVjIGlzIHVzZWQgdG8gZW5jb2RlIGluc3RhbmNlcyBvZiBteEdyYXBoIGFuZCBNeUdyYXBoLgorCisgIChjb2RlKQorICB2YXIgY29kZWMgPSBteENvZGVjUmVnaXN0cnkuZ2V0Q29kZWMobXhHcmFwaCk7CisgIGNvZGVjLnRlbXBsYXRlID0gbmV3IE15R3JhcGgoKTsKKyAgbXhDb2RlY1JlZ2lzdHJ5LnJlZ2lzdGVyKGNvZGVjKTsKKyAgKGVuZCkKKworRnVuY3Rpb25zOgorCisgIEluIHRoZSBwcm90b3R5cGUgZm9yIE15R3JhcGgsIGZ1bmN0aW9ucyBvZiBteEdyYXBoIGNhbiB0aGVuIGJlIGV4dGVuZGVkIGFzCisgIGZvbGxvd3MuCisKKyAgKGNvZGUpCisgIE15R3JhcGgucHJvdG90eXBlLmlzQ2VsbFNlbGVjdGFibGUgPSBmdW5jdGlvbihjZWxsKQorICB7CisgICAgdmFyIHNlbGVjdGFibGUgPSBteEdyYXBoLnByb3RvdHlwZS5pc1NlbGVjdGFibGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKworICAgIHZhciBnZW8gPSB0aGlzLm1vZGVsLmdldEdlb21ldHJ5KGNlbGwpOworICAgIHJldHVybiBzZWxlY3RhYmxlICYmIChnZW8gPT0gbnVsbCB8fCAhZ2VvLnJlbGF0aXZlKTsKKyAgfQorICAoZW5kKQorCisgIFRoZSBzdXBlcmNhbGwgaW4gdGhlIGZpcnN0IGxpbmUgaXMgb3B0aW9uYWwuIEl0IGlzIGRvbmUgdXNpbmcgdGhlIGFwcGx5CisgIGZ1bmN0aW9uIG9uIHRoZSBpc1NlbGVjdGFibGUgZnVuY3Rpb24gb2JqZWN0IG9mIHRoZSBteEdyYXBoIHByb3RvdHlwZSwgdXNpbmcKKyAgdGhlIHNwZWNpYWwgdGhpcyBhbmQgYXJndW1lbnRzIHZhcmlhYmxlcyBhcyBwYXJhbWV0ZXJzLiBDYWxscyB0byB0aGUKKyAgc3VwZXJjbGFzcyBmdW5jdGlvbiBhcmUgb25seSBwb3NzaWJsZSBpZiB0aGUgZnVuY3Rpb24gaXMgbm90IHJlcGxhY2VkIGluIHRoZQorICBzdXBlcmNsYXNzIGFzIGZvbGxvd3MsIHdoaWNoIGlzIGFub3RoZXIgd2F5IG9mIO+/vXN1YmNsYXNzaW5n77+9IGluIEphdmFTY3JpcHQuCisKKyAgKGNvZGUpCisgIG14R3JhcGgucHJvdG90eXBlLmlzQ2VsbFNlbGVjdGFibGUgPSBmdW5jdGlvbihjZWxsKQorICB7CisgICAgdmFyIGdlbyA9IHRoaXMubW9kZWwuZ2V0R2VvbWV0cnkoY2VsbCk7CisgICAgcmV0dXJuIHNlbGVjdGFibGUgJiYKKyAgICAgICAgKGdlbyA9PSBudWxsIHx8CisgICAgICAgICFnZW8ucmVsYXRpdmUpOworICB9CisgIChlbmQpCisKKyAgVGhlIGFib3ZlIHNjaGVtZSBpcyB1c2VmdWwgaWYgYSBmdW5jdGlvbiBkZWZpbml0aW9uIG5lZWRzIHRvIGJlIHJlcGxhY2VkCisgIGNvbXBsZXRlbHkuCisKKyAgSW4gcmVmZXJlbmNlSWQgdG8gYWRkIG5ldyBmdW5jdGlvbnMgYW5kIGZpZWxkcyB0byB0aGUgc3ViY2xhc3MsIHRoZSBmb2xsb3dpbmcgY29kZQorICBpcyB1c2VkLiBUaGUgZXhhbXBsZSBiZWxvdyBhZGRzIGEgbmV3IGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgWE1MCisgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBncmFwaCBtb2RlbDoKKworICAoY29kZSkKKyAgTXlHcmFwaC5wcm90b3R5cGUuZ2V0WG1sID0gZnVuY3Rpb24oKQorICB7CisgICAgdmFyIGVuYyA9IG5ldyBteENvZGVjKCk7CisgICAgcmV0dXJuIGVuYy5lbmNvZGUodGhpcy5nZXRNb2RlbCgpKTsKKyAgfQorICAoZW5kKQorCitWYXJpYWJsZXM6CisKKyAgTGlrZXdpc2UsIGEgbmV3IGZpZWxkIGlzIGRlY2xhcmVkIGFuZCBkZWZpbmVkIGFzIGZvbGxvd3MuCisKKyAgKGNvZGUpCisgIE15R3JhcGgucHJvdG90eXBlLm15RmllbGQgPSAnSGVsbG8sIFdvcmxkISc7CisgIChlbmQpCisKKyAgTm90ZSB0aGF0IHRoZSB2YWx1ZSBhc3NpZ25lZCB0byBteUZpZWxkIGlzIGNyZWF0ZWQgb25seSBvbmNlLCB0aGF0IGlzLCBhbGwKKyAgaW5zdGFuY2VzIG9mIE15R3JhcGggc2hhcmUgdGhlIHNhbWUgdmFsdWUuIElmIHlvdSByZXF1aXJlIGluc3RhbmNlLXNwZWNpZmljCisgIHZhbHVlcywgdGhlbiB0aGUgZmllbGQgbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLgorCisgIChjb2RlKQorICBmdW5jdGlvbiBNeUdyYXBoKGNvbnRhaW5lcikKKyAgeworICAgIG14R3JhcGguY2FsbCh0aGlzLCBjb250YWluZXIpOworCisgICAgdGhpcy5teUZpZWxkID0gbmV3IEFycmF5KCk7CisgIH0KKyAgKGVuZCkKKworICBGaW5hbGx5LCBhIG5ldyBpbnN0YW5jZSBvZiBNeUdyYXBoIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb2RlLCB3aGVyZQorICBjb250YWluZXIgaXMgYSBET00gbm9kZSB0aGF0IGFjdHMgYXMgYSBjb250YWluZXIgZm9yIHRoZSBncmFwaCB2aWV3OgorCisgIChjb2RlKQorICB2YXIgZ3JhcGggPSBuZXcgTXlHcmFwaChjb250YWluZXIpOworICAoZW5kKQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214Q2VsbENvZGVjLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214Q2VsbENvZGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1M2M5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaW8vbXhDZWxsQ29kZWMuanMKQEAgLTAsMCArMSwxODkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KK214Q29kZWNSZWdpc3RyeS5yZWdpc3RlcihmdW5jdGlvbigpCit7CisJLyoqCisJICogQ2xhc3M6IG14Q2VsbENvZGVjCisJICoKKwkgKiBDb2RlYyBmb3IgPG14Q2VsbD5zLiBUaGlzIGNsYXNzIGlzIGNyZWF0ZWQgYW5kIHJlZ2lzdGVyZWQKKwkgKiBkeW5hbWljYWxseSBhdCBsb2FkIHRpbWUgYW5kIHVzZWQgaW1wbGljaXRlbHkgdmlhIDxteENvZGVjPgorCSAqIGFuZCB0aGUgPG14Q29kZWNSZWdpc3RyeT4uCisJICoKKwkgKiBUcmFuc2llbnQgRmllbGRzOgorCSAqCisJICogLSBjaGlsZHJlbgorCSAqIC0gZWRnZXMKKwkgKiAtIG92ZXJsYXlzCisJICogLSBteFRyYW5zaWVudAorCSAqCisJICogUmVmZXJlbmNlIEZpZWxkczoKKwkgKgorCSAqIC0gcGFyZW50CisJICogLSBzb3VyY2UKKwkgKiAtIHRhcmdldAorCSAqIAorCSAqIFRyYW5zaWVudCBmaWVsZHMgY2FuIGJlIGFkZGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29kZToKKwkgKiAKKwkgKiBteENvZGVjUmVnaXN0cnkuZ2V0Q29kZWMobXhDZWxsKS5leGNsdWRlLnB1c2goJ25hbWVfb2ZfZmllbGQnKTsKKwkgKiAKKwkgKiBUbyBzdWJjbGFzcyA8bXhDZWxsPiwgcmVwbGFjZSB0aGUgdGVtcGxhdGUgYW5kIGFkZCBhbiBhbGlhcyBhcworCSAqIGZvbGxvd3MuCisJICogCisJICogKGNvZGUpCisJICogZnVuY3Rpb24gQ3VzdG9tQ2VsbCh2YWx1ZSwgZ2VvbWV0cnksIHN0eWxlKQorCSAqIHsKKwkgKiAgIG14Q2VsbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCSAqIH0KKwkgKiAKKwkgKiBteFV0aWxzLmV4dGVuZChDdXN0b21DZWxsLCBteENlbGwpOworCSAqIAorCSAqIG14Q29kZWNSZWdpc3RyeS5nZXRDb2RlYyhteENlbGwpLnRlbXBsYXRlID0gbmV3IEN1c3RvbUNlbGwoKTsKKwkgKiBteENvZGVjUmVnaXN0cnkuYWRkQWxpYXMoJ0N1c3RvbUNlbGwnLCAnbXhDZWxsJyk7CisJICogKGVuZCkKKwkgKi8KKwl2YXIgY29kZWMgPSBuZXcgbXhPYmplY3RDb2RlYyhuZXcgbXhDZWxsKCksCisJCVsnY2hpbGRyZW4nLCAnZWRnZXMnLCAnb3ZlcmxheXMnLCAnbXhUcmFuc2llbnQnXSwKKwkJWydwYXJlbnQnLCAnc291cmNlJywgJ3RhcmdldCddKTsKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBpc0NlbGxDb2RlYworCSAqCisJICogUmV0dXJucyB0cnVlIHNpbmNlIHRoaXMgaXMgYSBjZWxsIGNvZGVjLgorCSAqLworCWNvZGVjLmlzQ2VsbENvZGVjID0gZnVuY3Rpb24oKQorCXsKKwkJcmV0dXJuIHRydWU7CisJfTsKKworCS8qKgorCSAqIE92ZXJpZGRlbiB0byBkaXNhYmxlIGNvbnZlcnNpb24gb2YgdmFsdWUgdG8gbnVtYmVyLgorCSAqLworCWNvZGVjLmlzTnVtZXJpY0F0dHJpYnV0ZSA9IGZ1bmN0aW9uKGRlYywgYXR0ciwgb2JqKQorCXsKKwkJcmV0dXJuIGF0dHIubm9kZU5hbWUgIT09ICd2YWx1ZScgJiYgbXhPYmplY3RDb2RlYy5wcm90b3R5cGUuaXNOdW1lcmljQXR0cmlidXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfTsKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogaXNFeGNsdWRlZAorCSAqCisJICogRXhjbHVkZXMgdXNlciBvYmplY3RzIHRoYXQgYXJlIFhNTCBub2Rlcy4KKwkgKi8gCisJY29kZWMuaXNFeGNsdWRlZCA9IGZ1bmN0aW9uKG9iaiwgYXR0ciwgdmFsdWUsIGlzV3JpdGUpCisJeworCQlyZXR1cm4gbXhPYmplY3RDb2RlYy5wcm90b3R5cGUuaXNFeGNsdWRlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8CisJCQkoaXNXcml0ZSAmJiBhdHRyID09ICd2YWx1ZScgJiYKKwkJCXZhbHVlLm5vZGVUeXBlID09IG14Q29uc3RhbnRzLk5PREVUWVBFX0VMRU1FTlQpOworCX07CisJCisJLyoqCisJICogRnVuY3Rpb246IGFmdGVyRW5jb2RlCisJICoKKwkgKiBFbmNvZGVzIGFuIDxteENlbGw+IGFuZCB3cmFwcyB0aGUgWE1MIHVwIGluc2lkZSB0aGUKKwkgKiBYTUwgb2YgdGhlIHVzZXIgb2JqZWN0IChpbnZlcnNpb24pLgorCSAqLworCWNvZGVjLmFmdGVyRW5jb2RlID0gZnVuY3Rpb24oZW5jLCBvYmosIG5vZGUpCisJeworCQlpZiAob2JqLnZhbHVlICE9IG51bGwgJiYgb2JqLnZhbHVlLm5vZGVUeXBlID09IG14Q29uc3RhbnRzLk5PREVUWVBFX0VMRU1FTlQpCisJCXsKKwkJCS8vIFdyYXBzIHRoZSBncmFwaGljYWwgYW5ub3RhdGlvbiB1cCBpbiB0aGUgdXNlciBvYmplY3QgKGludmVyc2lvbikKKwkJCS8vIGJ5IHB1dHRpbmcgdGhlIHJlc3VsdCBvZiB0aGUgZGVmYXVsdCBlbmNvZGluZyBpbnRvIGEgY2xvbmUgb2YgdGhlCisJCQkvLyB1c2VyIG9iamVjdCAobm9kZSB0eXBlIDEpIGFuZCByZXR1cm5pbmcgdGhpcyBjbG9uZWQgdXNlciBvYmplY3QuCisJCQl2YXIgdG1wID0gbm9kZTsKKwkJCW5vZGUgPSBteFV0aWxzLmltcG9ydE5vZGUoZW5jLmRvY3VtZW50LCBvYmoudmFsdWUsIHRydWUpOworCQkJbm9kZS5hcHBlbmRDaGlsZCh0bXApOworCQkJCisJCQkvLyBNb3ZlcyB0aGUgaWQgYXR0cmlidXRlIHRvIHRoZSBvdXRlcm1vc3QgWE1MIG5vZGUsIG5hbWVseSB0aGUKKwkJCS8vIG5vZGUgd2hpY2ggZGVub3RlcyB0aGUgb2JqZWN0IGJvdW5kYXJpZXMgaW4gdGhlIGZpbGUuCisJCQl2YXIgaWQgPSB0bXAuZ2V0QXR0cmlidXRlKCdpZCcpOworCQkJbm9kZS5zZXRBdHRyaWJ1dGUoJ2lkJywgaWQpOworCQkJdG1wLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsKKwkJfQorCisJCXJldHVybiBub2RlOworCX07CisKKwkvKioKKwkgKiBGdW5jdGlvbjogYmVmb3JlRGVjb2RlCisJICoKKwkgKiBEZWNvZGVzIGFuIDxteENlbGw+IGFuZCB1c2VzIHRoZSBlbmNsb3NpbmcgWE1MIG5vZGUgYXMKKwkgKiB0aGUgdXNlciBvYmplY3QgZm9yIHRoZSBjZWxsIChpbnZlcnNpb24pLgorCSAqLworCWNvZGVjLmJlZm9yZURlY29kZSA9IGZ1bmN0aW9uKGRlYywgbm9kZSwgb2JqKQorCXsKKwkJdmFyIGlubmVyID0gbm9kZS5jbG9uZU5vZGUodHJ1ZSk7CisJCXZhciBjbGFzc25hbWUgPSB0aGlzLmdldE5hbWUoKTsKKwkJCisJCWlmIChub2RlLm5vZGVOYW1lICE9IGNsYXNzbmFtZSkKKwkJeworCQkJLy8gUGFzc2VzIHRoZSBpbm5lciBncmFwaGljYWwgYW5ub3RhdGlvbiBub2RlIHRvIHRoZQorCQkJLy8gb2JqZWN0IGNvZGVjIGZvciBmdXJ0aGVyIHByb2Nlc3Npbmcgb2YgdGhlIGNlbGwuCisJCQl2YXIgdG1wID0gbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZShjbGFzc25hbWUpWzBdOworCQkJCisJCQlpZiAodG1wICE9IG51bGwgJiYgdG1wLnBhcmVudE5vZGUgPT0gbm9kZSkKKwkJCXsKKwkJCQlteFV0aWxzLnJlbW92ZVdoaXRlc3BhY2UodG1wLCB0cnVlKTsKKwkJCQlteFV0aWxzLnJlbW92ZVdoaXRlc3BhY2UodG1wLCBmYWxzZSk7CisJCQkJdG1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodG1wKTsKKwkJCQlpbm5lciA9IHRtcDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpbm5lciA9IG51bGw7CisJCQl9CisJCQkKKwkJCS8vIENyZWF0ZXMgdGhlIHVzZXIgb2JqZWN0IG91dCBvZiB0aGUgWE1MIG5vZGUKKwkJCW9iai52YWx1ZSA9IG5vZGUuY2xvbmVOb2RlKHRydWUpOworCQkJdmFyIGlkID0gb2JqLnZhbHVlLmdldEF0dHJpYnV0ZSgnaWQnKTsKKwkJCQorCQkJaWYgKGlkICE9IG51bGwpCisJCQl7CisJCQkJb2JqLnNldElkKGlkKTsKKwkJCQlvYmoudmFsdWUucmVtb3ZlQXR0cmlidXRlKCdpZCcpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVXNlcyBJRCBmcm9tIFhNTCBmaWxlIGFzIElEIGZvciBjZWxsIGluIG1vZGVsCisJCQlvYmouc2V0SWQobm9kZS5nZXRBdHRyaWJ1dGUoJ2lkJykpOworCQl9CisJCQkKKwkJLy8gUHJlcHJvY2Vzc2VzIGFuZCByZW1vdmVzIGFsbCBJZC1yZWZlcmVuY2VzIGluIG9yZGVyIHRvIHVzZSB0aGUKKwkJLy8gY29ycmVjdCBlbmNvZGVyICh0aGlzKSBmb3IgdGhlIGtub3duIHJlZmVyZW5jZXMgdG8gY2VsbHMgKGFsbCkuCisJCWlmIChpbm5lciAhPSBudWxsKQorCQl7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaWRyZWZzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCXZhciBhdHRyID0gdGhpcy5pZHJlZnNbaV07CisJCQkJdmFyIHJlZiA9IGlubmVyLmdldEF0dHJpYnV0ZShhdHRyKTsKKwkJCQkKKwkJCQlpZiAocmVmICE9IG51bGwpCisJCQkJeworCQkJCQlpbm5lci5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7CisJCQkJCXZhciBvYmplY3QgPSBkZWMub2JqZWN0c1tyZWZdIHx8IGRlYy5sb29rdXAocmVmKTsKKwkJCQkJCisJCQkJCWlmIChvYmplY3QgPT0gbnVsbCkKKwkJCQkJeworCQkJCQkJLy8gTmVlZHMgdG8gZGVjb2RlIGZvcndhcmQgcmVmZXJlbmNlCisJCQkJCQl2YXIgZWxlbWVudCA9IGRlYy5nZXRFbGVtZW50QnlJZChyZWYpOworCQkJCQkJCisJCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKQorCQkJCQkJeworCQkJCQkJCXZhciBkZWNvZGVyID0gbXhDb2RlY1JlZ2lzdHJ5LmNvZGVjc1tlbGVtZW50Lm5vZGVOYW1lXSB8fCB0aGlzOworCQkJCQkJCW9iamVjdCA9IGRlY29kZXIuZGVjb2RlKGRlYywgZWxlbWVudCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJCisJCQkJCW9ialthdHRyXSA9IG9iamVjdDsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBpbm5lcjsKKwl9OworCisJLy8gUmV0dXJucyB0aGUgY29kZWMgaW50byB0aGUgcmVnaXN0cnkKKwlyZXR1cm4gY29kZWM7CisKK30oKSk7CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaW8vbXhDaGlsZENoYW5nZUNvZGVjLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214Q2hpbGRDaGFuZ2VDb2RlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmQwYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214Q2hpbGRDaGFuZ2VDb2RlYy5qcwpAQCAtMCwwICsxLDE0OSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworbXhDb2RlY1JlZ2lzdHJ5LnJlZ2lzdGVyKGZ1bmN0aW9uKCkKK3sKKwkvKioKKwkgKiBDbGFzczogbXhDaGlsZENoYW5nZUNvZGVjCisJICoKKwkgKiBDb2RlYyBmb3IgPG14Q2hpbGRDaGFuZ2U+cy4gVGhpcyBjbGFzcyBpcyBjcmVhdGVkIGFuZCByZWdpc3RlcmVkCisJICogZHluYW1pY2FsbHkgYXQgbG9hZCB0aW1lIGFuZCB1c2VkIGltcGxpY2l0ZWx5IHZpYSA8bXhDb2RlYz4gYW5kCisJICogdGhlIDxteENvZGVjUmVnaXN0cnk+LgorCSAqCisJICogVHJhbnNpZW50IEZpZWxkczoKKwkgKgorCSAqIC0gbW9kZWwKKwkgKiAtIHByZXZpb3VzCisJICogLSBwcmV2aW91c0luZGV4CisJICogLSBjaGlsZAorCSAqCisJICogUmVmZXJlbmNlIEZpZWxkczoKKwkgKgorCSAqIC0gcGFyZW50CisJICovCisJdmFyIGNvZGVjID0gbmV3IG14T2JqZWN0Q29kZWMobmV3IG14Q2hpbGRDaGFuZ2UoKSwKKwkJWydtb2RlbCcsICdjaGlsZCcsICdwcmV2aW91c0luZGV4J10sCisJCVsncGFyZW50JywgJ3ByZXZpb3VzJ10pOworCisJLyoqCisJICogRnVuY3Rpb246IGlzUmVmZXJlbmNlCisJICoKKwkgKiBSZXR1cm5zIHRydWUgZm9yIHRoZSBjaGlsZCBhdHRyaWJ1dGUgaWYgdGhlIGNoaWxkCisJICogY2VsbCBoYWQgYSBwcmV2aW91cyBwYXJlbnQgb3IgaWYgd2UncmUgcmVhZGluZyB0aGUKKwkgKiBjaGlsZCBhcyBhbiBhdHRyaWJ1dGUgcmF0aGVyIHRoYW4gYSBjaGlsZCBub2RlLCBpbgorCSAqIHdoaWNoIGNhc2UgaXQncyBhbHdheXMgYSByZWZlcmVuY2UuCisJICovCisJY29kZWMuaXNSZWZlcmVuY2UgPSBmdW5jdGlvbihvYmosIGF0dHIsIHZhbHVlLCBpc1dyaXRlKQorCXsKKwkJaWYgKGF0dHIgPT0gJ2NoaWxkJyAmJgorCQkJKG9iai5wcmV2aW91cyAhPSBudWxsIHx8CisJCQkhaXNXcml0ZSkpCisJCXsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCQorCQlyZXR1cm4gbXhVdGlscy5pbmRleE9mKHRoaXMuaWRyZWZzLCBhdHRyKSA+PSAwOworCX07CisKKwkvKioKKwkgKiBGdW5jdGlvbjogYWZ0ZXJFbmNvZGUKKwkgKgorCSAqIEVuY29kZXMgdGhlIGNoaWxkIHJlY3VzaXZlbHkgYW5kIGFkZHMgdGhlIHJlc3VsdAorCSAqIHRvIHRoZSBnaXZlbiBub2RlLgorCSAqLworCWNvZGVjLmFmdGVyRW5jb2RlID0gZnVuY3Rpb24oZW5jLCBvYmosIG5vZGUpCisJeworCQlpZiAodGhpcy5pc1JlZmVyZW5jZShvYmosICdjaGlsZCcsICBvYmouY2hpbGQsIHRydWUpKQorCQl7CisJCQkvLyBFbmNvZGVzIGFzIHJlZmVyZW5jZSAoaWQpCisJCQlub2RlLnNldEF0dHJpYnV0ZSgnY2hpbGQnLCBlbmMuZ2V0SWQob2JqLmNoaWxkKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBBdCB0aGlzIHBvaW50LCB0aGUgZW5jb2RlciBpcyBubyBsb25nZXIgYWJsZSB0byBrbm93IHdoaWNoIGNlbGxzCisJCQkvLyBhcmUgbmV3LCBzbyB3ZSBoYXZlIHRvIGVuY29kZSB0aGUgY29tcGxldGUgY2VsbCBoaWVyYXJjaHkgYW5kCisJCQkvLyBpZ25vcmUgdGhlIG9uZXMgdGhhdCBhcmUgYWxyZWFkeSB0aGVyZSBhdCBkZWNvZGluZyB0aW1lLiBOb3RlOgorCQkJLy8gVGhpcyBjYW4gb25seSBiZSByZXNvbHZlZCBieSBtb3ZpbmcgdGhlIG5vdGlmeSBldmVudCBpbnRvIHRoZQorCQkJLy8gZXhlY3V0ZSBvZiB0aGUgZWRpdC4KKwkJCWVuYy5lbmNvZGVDZWxsKG9iai5jaGlsZCwgbm9kZSk7CisJCX0KKwkJCisJCXJldHVybiBub2RlOworCX07CisKKwkvKioKKwkgKiBGdW5jdGlvbjogYmVmb3JlRGVjb2RlCisJICoKKwkgKiBEZWNvZGVzIHRoZSBhbnkgY2hpbGQgbm9kZXMgYXMgdXNpbmcgdGhlIHJlc3BlY3RpdmUKKwkgKiBjb2RlYyBmcm9tIHRoZSByZWdpc3RyeS4KKwkgKi8KKwljb2RlYy5iZWZvcmVEZWNvZGUgPSBmdW5jdGlvbihkZWMsIG5vZGUsIG9iaikKKwl7CisJCWlmIChub2RlLmZpcnN0Q2hpbGQgIT0gbnVsbCAmJgorCQkJbm9kZS5maXJzdENoaWxkLm5vZGVUeXBlID09IG14Q29uc3RhbnRzLk5PREVUWVBFX0VMRU1FTlQpCisJCXsKKwkJCS8vIE1ha2VzIHN1cmUgdGhlIG9yaWdpbmFsIG5vZGUgaXNuJ3QgbW9kaWZpZWQKKwkJCW5vZGUgPSBub2RlLmNsb25lTm9kZSh0cnVlKTsKKwkJCQorCQkJdmFyIHRtcCA9IG5vZGUuZmlyc3RDaGlsZDsKKwkJCW9iai5jaGlsZCA9IGRlYy5kZWNvZGVDZWxsKHRtcCwgZmFsc2UpOworCisJCQl2YXIgdG1wMiA9IHRtcC5uZXh0U2libGluZzsKKwkJCXRtcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRtcCk7CisJCQl0bXAgPSB0bXAyOworCQkJCisJCQl3aGlsZSAodG1wICE9IG51bGwpCisJCQl7CisJCQkJdG1wMiA9IHRtcC5uZXh0U2libGluZzsKKwkJCQkKKwkJCQlpZiAodG1wLm5vZGVUeXBlID09IG14Q29uc3RhbnRzLk5PREVUWVBFX0VMRU1FTlQpCisJCQkJeworCQkJCQkvLyBJZ25vcmVzIGFsbCBleGlzdGluZyBjZWxscyBiZWNhdXNlIHRob3NlIGRvIG5vdCBuZWVkIHRvCisJCQkJCS8vIGJlIHJlLWluc2VydGVkIGludG8gdGhlIG1vZGVsLiBTaW5jZSB0aGUgZW5jb2RlZCB2ZXJzaW9uCisJCQkJCS8vIG9mIHRoZXNlIGNlbGxzIGNvbnRhaW5zIHRoZSBuZXcgcGFyZW50LCB0aGlzIHdvdWxkIGxlYXZlCisJCQkJCS8vIHRvIGFuIGluY29uc2lzdGVudCBzdGF0ZSBvbiB0aGUgbW9kZWwgKGllLiBhIHBhcmVudAorCQkJCQkvLyBjaGFuZ2Ugd2l0aG91dCBhIGNhbGwgdG8gcGFyZW50Rm9yQ2VsbENoYW5nZWQpLgorCQkJCQl2YXIgaWQgPSB0bXAuZ2V0QXR0cmlidXRlKCdpZCcpOworCQkJCQkKKwkJCQkJaWYgKGRlYy5sb29rdXAoaWQpID09IG51bGwpCisJCQkJCXsKKwkJCQkJCWRlYy5kZWNvZGVDZWxsKHRtcCk7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJdG1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodG1wKTsKKwkJCQl0bXAgPSB0bXAyOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJdmFyIGNoaWxkUmVmID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2NoaWxkJyk7CisJCQlvYmouY2hpbGQgPSBkZWMuZ2V0T2JqZWN0KGNoaWxkUmVmKTsKKwkJfQorCQkKKwkJcmV0dXJuIG5vZGU7CisJfTsKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogYWZ0ZXJEZWNvZGUKKwkgKgorCSAqIFJlc3RvcmVzIG9iamVjdCBzdGF0ZSBpbiB0aGUgY2hpbGQgY2hhbmdlLgorCSAqLworCWNvZGVjLmFmdGVyRGVjb2RlID0gZnVuY3Rpb24oZGVjLCBub2RlLCBvYmopCisJeworCQkvLyBDZWxscyBhcmUgZW5jb2RlZCBoZXJlIGFmdGVyIGEgY29tcGxldGUgdHJhbnNhY3Rpb24gc28gdGhlIHByZXZpb3VzCisJCS8vIHBhcmVudCBtdXN0IGJlIHJlc3RvcmVkIG9uIHRoZSBjZWxsIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgY2VsbCB3YXMKKwkJLy8gYWRkZWQuIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgbG9jYWwgbW9kZWwgdG8gaWRlbnRpZnkgdGhlIGNlbGwgYXMgYQorCQkvLyBuZXcgY2VsbCBhbmQgcmVnaXN0ZXIgdGhlIElELgorCQlvYmouY2hpbGQucGFyZW50ID0gb2JqLnByZXZpb3VzOworCQlvYmoucHJldmlvdXMgPSBvYmoucGFyZW50OworCQlvYmoucHJldmlvdXNJbmRleCA9IG9iai5pbmRleDsKKworCQlyZXR1cm4gb2JqOworCX07CisKKwkvLyBSZXR1cm5zIHRoZSBjb2RlYyBpbnRvIHRoZSByZWdpc3RyeQorCXJldHVybiBjb2RlYzsKKworfSgpKTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teENvZGVjLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214Q29kZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwODM4NwotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teENvZGVjLmpzCkBAIC0wLDAgKzEsNTk2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteENvZGVjCisgKgorICogWE1MIGNvZGVjIGZvciBKYXZhU2NyaXB0IG9iamVjdCBncmFwaHMuIFNlZSA8bXhPYmplY3RDb2RlYz4gZm9yIGEKKyAqIGRlc2NyaXB0aW9uIG9mIHRoZSBnZW5lcmFsIGVuY29kaW5nL2RlY29kaW5nIHNjaGVtZS4gVGhpcyBjbGFzcyB1c2VzIHRoZQorICogY29kZWNzIHJlZ2lzdGVyZWQgaW4gPG14Q29kZWNSZWdpc3RyeT4gZm9yIGVuY29kaW5nL2RlY29kaW5nIGVhY2ggb2JqZWN0LgorICogCisgKiBSZWZlcmVuY2VzOgorICogCisgKiBJbiBvcmRlciB0byByZXNvbHZlIHJlZmVyZW5jZXMsIGVzcGVjaWFsbHkgZm9yd2FyZCByZWZlcmVuY2VzLCB0aGUgbXhDb2RlYworICogY29uc3RydWN0b3IgbXVzdCBiZSBnaXZlbiB0aGUgZG9jdW1lbnQgdGhhdCBjb250YWlucyB0aGUgcmVmZXJlbmNlZAorICogZWxlbWVudHMuCisgKgorICogRXhhbXBsZXM6CisgKgorICogVGhlIGZvbGxvd2luZyBjb2RlIGlzIHVzZWQgdG8gZW5jb2RlIGEgZ3JhcGggbW9kZWwuCisgKgorICogKGNvZGUpCisgKiB2YXIgZW5jb2RlciA9IG5ldyBteENvZGVjKCk7CisgKiB2YXIgcmVzdWx0ID0gZW5jb2Rlci5lbmNvZGUoZ3JhcGguZ2V0TW9kZWwoKSk7CisgKiB2YXIgeG1sID0gbXhVdGlscy5nZXRYbWwocmVzdWx0KTsKKyAqIChlbmQpCisgKiAKKyAqIEV4YW1wbGU6CisgKiAKKyAqIFVzaW5nIHRoZSBjb2RlIGJlbG93LCBhbiBYTUwgZG9jdW1lbnQgaXMgZGVjb2RlZCBpbnRvIGFuIGV4aXN0aW5nIG1vZGVsLiBUaGUKKyAqIGRvY3VtZW50IG1heSBiZSBvYnRhaW5lZCB1c2luZyBvbmUgb2YgdGhlIGZ1bmN0aW9ucyBpbiBteFV0aWxzIGZvciBsb2FkaW5nCisgKiBhbiBYTUwgZmlsZSwgZWcuIDxteFV0aWxzLmdldD4sIG9yIHVzaW5nIDxteFV0aWxzLnBhcnNlWG1sPiBmb3IgcGFyc2luZyBhbgorICogWE1MIHN0cmluZy4KKyAqIAorICogKGNvZGUpCisgKiB2YXIgZG9jID0gbXhVdGlscy5wYXJzZVhtbCh4bWxTdHJpbmcpOworICogdmFyIGNvZGVjID0gbmV3IG14Q29kZWMoZG9jKTsKKyAqIGNvZGVjLmRlY29kZShkb2MuZG9jdW1lbnRFbGVtZW50LCBncmFwaC5nZXRNb2RlbCgpKTsKKyAqIChlbmQpCisgKiAKKyAqIEV4YW1wbGU6CisgKiAKKyAqIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgcGFyc2luZyBhIGxpc3Qgb2YgaXNvbGF0ZWQgY2VsbHMgaW50byBhbiBleGlzdGluZworICogZ3JhcGggbW9kZWwuIE5vdGUgdGhhdCB0aGUgY2VsbHMgZG8gbm90IGhhdmUgYSBwYXJlbnQgcmVmZXJlbmNlIHNvIHRoZXkgY2FuCisgKiBiZSBhZGRlZCBhbnl3aGVyZSBpbiB0aGUgY2VsbCBoaWVyYXJjaHkgYWZ0ZXIgcGFyc2luZy4KKyAqIAorICogKGNvZGUpCisgKiB2YXIgeG1sID0gJzxyb290PjxteENlbGwgaWQ9IjIiIHZhbHVlPSJIZWxsbywiIHZlcnRleD0iMSI+PG14R2VvbWV0cnkgeD0iMjAiIHk9IjIwIiB3aWR0aD0iODAiIGhlaWdodD0iMzAiIGFzPSJnZW9tZXRyeSIvPjwvbXhDZWxsPjxteENlbGwgaWQ9IjMiIHZhbHVlPSJXb3JsZCEiIHZlcnRleD0iMSI+PG14R2VvbWV0cnkgeD0iMjAwIiB5PSIxNTAiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMCIgYXM9Imdlb21ldHJ5Ii8+PC9teENlbGw+PG14Q2VsbCBpZD0iNCIgdmFsdWU9IiIgZWRnZT0iMSIgc291cmNlPSIyIiB0YXJnZXQ9IjMiPjxteEdlb21ldHJ5IHJlbGF0aXZlPSIxIiBhcz0iZ2VvbWV0cnkiLz48L214Q2VsbD48L3Jvb3Q+JzsKKyAqIHZhciBkb2MgPSBteFV0aWxzLnBhcnNlWG1sKHhtbCk7CisgKiB2YXIgY29kZWMgPSBuZXcgbXhDb2RlYyhkb2MpOworICogdmFyIGVsdCA9IGRvYy5kb2N1bWVudEVsZW1lbnQuZmlyc3RDaGlsZDsKKyAqIHZhciBjZWxscyA9IFtdOworICogCisgKiB3aGlsZSAoZWx0ICE9IG51bGwpCisgKiB7CisgKiAgIGNlbGxzLnB1c2goY29kZWMuZGVjb2RlKGVsdCkpOworICogICBlbHQgPSBlbHQubmV4dFNpYmxpbmc7CisgKiB9CisgKiAKKyAqIGdyYXBoLmFkZENlbGxzKGNlbGxzKTsKKyAqIChlbmQpCisgKiAKKyAqIEV4YW1wbGU6CisgKiAKKyAqIFVzaW5nIHRoZSBmb2xsb3dpbmcgY29kZSwgdGhlIHNlbGVjdGlvbiBjZWxscyBvZiBhIGdyYXBoIGFyZSBlbmNvZGVkIGFuZCB0aGUKKyAqIG91dHB1dCBpcyBkaXNwbGF5ZWQgaW4gYSBkaWFsb2cgYm94LgorICogCisgKiAoY29kZSkKKyAqIHZhciBlbmMgPSBuZXcgbXhDb2RlYygpOworICogdmFyIGNlbGxzID0gZ3JhcGguZ2V0U2VsZWN0aW9uQ2VsbHMoKTsKKyAqIG14VXRpbHMuYWxlcnQobXhVdGlscy5nZXRQcmV0dHlYbWwoZW5jLmVuY29kZShjZWxscykpKTsKKyAqIChlbmQpCisgKiAKKyAqIE5ld2xpbmVzIGluIHRoZSBYTUwgY2FuIGJlIGNvbnZlcnRlZCB0byA8YnI+LCBpbiB3aGljaCBjYXNlIGEgJzxicj4nIGFyZ3VtZW50CisgKiBtdXN0IGJlIHBhc3NlZCB0byA8bXhVdGlscy5nZXRYbWw+IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuCisgKiAKKyAqIERlYnVnZ2luZzoKKyAqIAorICogRm9yIGRlYnVnZ2luZyBJL08geW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBjb2RlIHRvIGdldCB0aGUgc2VxdWVuY2Ugb2YKKyAqIGVuY29kZWQgb2JqZWN0czoKKyAqIAorICogKGNvZGUpCisgKiB2YXIgb2xkRW5jb2RlID0gbXhDb2RlYy5wcm90b3R5cGUuZW5jb2RlOworICogbXhDb2RlYy5wcm90b3R5cGUuZW5jb2RlID0gZnVuY3Rpb24ob2JqKQorICogeworICogICBteExvZy5zaG93KCk7CisgKiAgIG14TG9nLmRlYnVnKCdteENvZGVjLmVuY29kZTogb2JqPScrbXhVdGlscy5nZXRGdW5jdGlvbk5hbWUob2JqLmNvbnN0cnVjdG9yKSk7CisgKiAgIAorICogICByZXR1cm4gb2xkRW5jb2RlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgKiB9OworICogKGVuZCkKKyAqIAorICogTm90ZSB0aGF0IHRoZSBJL08gc3lzdGVtIGFkZHMgb2JqZWN0IGNvZGVjcyBmb3IgbmV3IG9iamVjdCBhdXRvbWF0aWNhbGx5LiBGb3IKKyAqIGRlY29kaW5nIHRob3NlIG9iamVjdHMsIHRoZSBjb25zdHJ1Y3RvciBzaG91bGQgYmUgd3JpdHRlbiBhcyBmb2xsb3dzOgorICogCisgKiAoY29kZSkKKyAqIHZhciBNeU9iaiA9IGZ1bmN0aW9uKG5hbWUpCisgKiB7CisgKiAgIC8vIC4uLgorICogfTsKKyAqIChlbmQpCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteENvZGVjCisgKgorICogQ29uc3RydWN0cyBhbiBYTUwgZW5jb2Rlci9kZWNvZGVyIGZvciB0aGUgc3BlY2lmaWVkCisgKiBvd25lciBkb2N1bWVudC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGRvY3VtZW50IC0gT3B0aW9uYWwgWE1MIGRvY3VtZW50IHRoYXQgY29udGFpbnMgdGhlIGRhdGEuCisgKiBJZiBubyBkb2N1bWVudCBpcyBzcGVjaWZpZWQgdGhlbiBhIG5ldyBkb2N1bWVudCBpcyBjcmVhdGVkCisgKiB1c2luZyA8bXhVdGlscy5jcmVhdGVYbWxEb2N1bWVudD4uCisgKi8KK2Z1bmN0aW9uIG14Q29kZWMoZG9jdW1lbnQpCit7CisJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50IHx8IG14VXRpbHMuY3JlYXRlWG1sRG9jdW1lbnQoKTsKKwl0aGlzLm9iamVjdHMgPSBbXTsKK307CisKKy8qKgorICogVmFyaWFibGU6IGRvY3VtZW50CisgKgorICogVGhlIG93bmVyIGRvY3VtZW50IG9mIHRoZSBjb2RlYy4KKyAqLworbXhDb2RlYy5wcm90b3R5cGUuZG9jdW1lbnQgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBvYmplY3RzCisgKgorICogTWFwcyBmcm9tIElEcyB0byBvYmplY3RzLgorICovCitteENvZGVjLnByb3RvdHlwZS5vYmplY3RzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZWxlbWVudHMKKyAqIAorICogTG9va3VwIHRhYmxlIGZvciByZXNvbHZpbmcgSURzIHRvIGVsZW1lbnRzLgorICovCitteENvZGVjLnByb3RvdHlwZS5lbGVtZW50cyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGVuY29kZURlZmF1bHRzCisgKgorICogU3BlY2lmaWVzIGlmIGRlZmF1bHQgdmFsdWVzIHNob3VsZCBiZSBlbmNvZGVkLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteENvZGVjLnByb3RvdHlwZS5lbmNvZGVEZWZhdWx0cyA9IGZhbHNlOworCisKKy8qKgorICogRnVuY3Rpb246IHB1dE9iamVjdAorICogCisgKiBBc3NvaWF0ZXMgdGhlIGdpdmVuIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBJRCBhbmQgcmV0dXJucyB0aGUgZ2l2ZW4gb2JqZWN0LgorICogCisgKiBQYXJhbWV0ZXJzCisgKiAKKyAqIGlkIC0gSUQgZm9yIHRoZSBvYmplY3QgdG8gYmUgYXNzb2NpYXRlZCB3aXRoLgorICogb2JqIC0gT2JqZWN0IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgSUQuCisgKi8KK214Q29kZWMucHJvdG90eXBlLnB1dE9iamVjdCA9IGZ1bmN0aW9uKGlkLCBvYmopCit7CisJdGhpcy5vYmplY3RzW2lkXSA9IG9iajsKKwkKKwlyZXR1cm4gb2JqOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0T2JqZWN0CisgKgorICogUmV0dXJucyB0aGUgZGVjb2RlZCBvYmplY3QgZm9yIHRoZSBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBJRCBpbgorICogPGRvY3VtZW50Pi4gSWYgdGhlIG9iamVjdCBpcyBub3Qga25vd24gdGhlbiA8bG9va3VwPiBpcyB1c2VkIHRvIGZpbmQgYW4KKyAqIG9iamVjdC4gSWYgbm8gb2JqZWN0IGlzIGZvdW5kLCB0aGVuIHRoZSBlbGVtZW50IHdpdGggdGhlIHJlc3BlY3RpdmUgSUQKKyAqIGZyb20gdGhlIGRvY3VtZW50IGlzIHBhcnNlZCB1c2luZyA8ZGVjb2RlPi4KKyAqLworbXhDb2RlYy5wcm90b3R5cGUuZ2V0T2JqZWN0ID0gZnVuY3Rpb24oaWQpCit7CisJdmFyIG9iaiA9IG51bGw7CisKKwlpZiAoaWQgIT0gbnVsbCkKKwl7CisJCW9iaiA9IHRoaXMub2JqZWN0c1tpZF07CisJCQorCQlpZiAob2JqID09IG51bGwpCisJCXsKKwkJCW9iaiA9IHRoaXMubG9va3VwKGlkKTsKKwkJCQorCQkJaWYgKG9iaiA9PSBudWxsKQorCQkJeworCQkJCXZhciBub2RlID0gdGhpcy5nZXRFbGVtZW50QnlJZChpZCk7CisJCQkJCisJCQkJaWYgKG5vZGUgIT0gbnVsbCkKKwkJCQl7CisJCQkJCW9iaiA9IHRoaXMuZGVjb2RlKG5vZGUpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gb2JqOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogbG9va3VwCisgKgorICogSG9vayBmb3Igc3ViY2xhc3NlcnMgdG8gaW1wbGVtZW50IGEgY3VzdG9tIGxvb2t1cCBtZWNoYW5pc20gZm9yIGNlbGwgSURzLgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyBudWxsLgorICoKKyAqIEV4YW1wbGU6CisgKgorICogKGNvZGUpCisgKiB2YXIgY29kZWMgPSBuZXcgbXhDb2RlYygpOworICogY29kZWMubG9va3VwID0gZnVuY3Rpb24oaWQpCisgKiB7CisgKiAgIHJldHVybiBtb2RlbC5nZXRDZWxsKGlkKTsKKyAqIH07CisgKiAoZW5kKQorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogaWQgLSBJRCBvZiB0aGUgb2JqZWN0IHRvIGJlIHJldHVybmVkLgorICovCitteENvZGVjLnByb3RvdHlwZS5sb29rdXAgPSBmdW5jdGlvbihpZCkKK3sKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEVsZW1lbnRCeUlkCisgKgorICogUmV0dXJucyB0aGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIDxkb2N1bWVudD4uCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBpZCAtIFN0cmluZyB0aGF0IGNvbnRhaW5zIHRoZSBJRC4KKyAqLworbXhDb2RlYy5wcm90b3R5cGUuZ2V0RWxlbWVudEJ5SWQgPSBmdW5jdGlvbihpZCkKK3sKKwlpZiAodGhpcy5lbGVtZW50cyA9PSBudWxsKQorCXsKKwkJLy8gVGhyb3dzIGN1c3RvbSBlcnJvciBmb3IgY2FzZXMgd2hlcmUgYSByZWZlcmVuY2Ugc2hvdWxkIGJlIHJlc29sdmVkCisJCS8vIGluIGFuIGVtcHR5IGRvY3VtZW50LiBUaGlzIGhhcHBlbnMgaWYgYW4gWE1MIG5vZGUgaXMgZGVjb2RlZCB3aXRob3V0CisJCS8vIHBhc3NpbmcgdGhlIG93bmVyIGRvY3VtZW50IHRvIHRoZSBjb2RlYyBjb25zdHJ1Y3Rvci4KKwkJaWYgKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ID09IG51bGwpCisJCXsKKwkJCXRocm93IG5ldyBFcnJvcignbXhDb2RlYyBjb25zdHJ1Y3RvciBuZWVkcyBkb2N1bWVudCBwYXJhbWV0ZXInKTsKKwkJfQorCQkKKwkJdGhpcy5lbGVtZW50cyA9IG5ldyBPYmplY3QoKTsKKwkJdGhpcy5hZGRFbGVtZW50KHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTsKKwl9CisJCisJcmV0dXJuIHRoaXMuZWxlbWVudHNbaWRdOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYWRkRWxlbWVudAorICoKKyAqIEFkZHMgdGhlIGdpdmVuIGVsZW1lbnQgdG8gPGVsZW1lbnRzPiBpZiBpdCBoYXMgYW4gSUQuCisgKi8KK214Q29kZWMucHJvdG90eXBlLmFkZEVsZW1lbnQgPSBmdW5jdGlvbihub2RlKQoreworCWlmIChub2RlLm5vZGVUeXBlID09IG14Q29uc3RhbnRzLk5PREVUWVBFX0VMRU1FTlQpCisJeworCQl2YXIgaWQgPSBub2RlLmdldEF0dHJpYnV0ZSgnaWQnKTsKKwkJCisJCWlmIChpZCAhPSBudWxsICYmIHRoaXMuZWxlbWVudHNbaWRdID09IG51bGwpCisJCXsKKwkJCXRoaXMuZWxlbWVudHNbaWRdID0gbm9kZTsKKwkJfQorCX0KKwkKKwlub2RlID0gbm9kZS5maXJzdENoaWxkOworCQorCXdoaWxlIChub2RlICE9IG51bGwpCisJeworCQl0aGlzLmFkZEVsZW1lbnQobm9kZSk7CisJCW5vZGUgPSBub2RlLm5leHRTaWJsaW5nOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldElkCisgKgorICogUmV0dXJucyB0aGUgSUQgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIGNhbGxzIDxyZWZlcmVuY2U+IGZpcnN0IGFuZCBpZiB0aGF0IHJldHVybnMgbnVsbCBoYW5kbGVzCisgKiB0aGUgb2JqZWN0IGFzIGFuIDxteENlbGw+IGJ5IHJldHVybmluZyB0aGVpciBJRHMgdXNpbmcKKyAqIDxteENlbGwuZ2V0SWQ+LiBJZiBubyBJRCBleGlzdHMgZm9yIHRoZSBnaXZlbiBjZWxsLCB0aGVuCisgKiBhbiBvbi10aGUtZmx5IElEIGlzIGdlbmVyYXRlZCB1c2luZyA8bXhDZWxsUGF0aC5jcmVhdGU+LgorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogb2JqIC0gT2JqZWN0IHRvIHJldHVybiB0aGUgSUQgZm9yLgorICovCitteENvZGVjLnByb3RvdHlwZS5nZXRJZCA9IGZ1bmN0aW9uKG9iaikKK3sKKwl2YXIgaWQgPSBudWxsOworCQorCWlmIChvYmogIT0gbnVsbCkKKwl7CisJCWlkID0gdGhpcy5yZWZlcmVuY2Uob2JqKTsKKwkJCisJCWlmIChpZCA9PSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIG14Q2VsbCkKKwkJeworCQkJaWQgPSBvYmouZ2V0SWQoKTsKKwkJCQorCQkJaWYgKGlkID09IG51bGwpCisJCQl7CisJCQkJLy8gVXNlcyBhbiBvbi10aGUtZmx5IElkCisJCQkJaWQgPSBteENlbGxQYXRoLmNyZWF0ZShvYmopOworCQkJCQorCQkJCWlmIChpZC5sZW5ndGggPT0gMCkKKwkJCQl7CisJCQkJCWlkID0gJ3Jvb3QnOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gaWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWZlcmVuY2UKKyAqCisgKiBIb29rIGZvciBzdWJjbGFzc2VycyB0byBpbXBsZW1lbnQgYSBjdXN0b20gbWV0aG9kCisgKiBmb3IgcmV0cmlldmluZyBJRHMgZnJvbSBvYmplY3RzLiBUaGlzIGltcGxlbWVudGF0aW9uCisgKiBhbHdheXMgcmV0dXJucyBudWxsLgorICoKKyAqIEV4YW1wbGU6CisgKgorICogKGNvZGUpCisgKiB2YXIgY29kZWMgPSBuZXcgbXhDb2RlYygpOworICogY29kZWMucmVmZXJlbmNlID0gZnVuY3Rpb24ob2JqKQorICogeworICogICByZXR1cm4gb2JqLmdldEN1c3RvbUlkKCk7CisgKiB9OworICogKGVuZCkKKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIG9iaiAtIE9iamVjdCB3aG9zZSBJRCBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214Q29kZWMucHJvdG90eXBlLnJlZmVyZW5jZSA9IGZ1bmN0aW9uKG9iaikKK3sKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGVuY29kZQorICoKKyAqIEVuY29kZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZworICogWE1MIG5vZGUuCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBvYmogLSBPYmplY3QgdG8gYmUgZW5jb2RlZC4gCisgKi8KK214Q29kZWMucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uKG9iaikKK3sKKwl2YXIgbm9kZSA9IG51bGw7CisJCisJaWYgKG9iaiAhPSBudWxsICYmIG9iai5jb25zdHJ1Y3RvciAhPSBudWxsKQorCXsKKwkJdmFyIGVuYyA9IG14Q29kZWNSZWdpc3RyeS5nZXRDb2RlYyhvYmouY29uc3RydWN0b3IpOworCQkKKwkJaWYgKGVuYyAhPSBudWxsKQorCQl7CisJCQlub2RlID0gZW5jLmVuY29kZSh0aGlzLCBvYmopOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKG14VXRpbHMuaXNOb2RlKG9iaikpCisJCQl7CisJCQkJbm9kZSA9IG14VXRpbHMuaW1wb3J0Tm9kZSh0aGlzLmRvY3VtZW50LCBvYmosIHRydWUpOworCQkJfQorCQkJZWxzZQorCQkJeworCSAgICAJCW14TG9nLndhcm4oJ214Q29kZWMuZW5jb2RlOiBObyBjb2RlYyBmb3IgJyArIG14VXRpbHMuZ2V0RnVuY3Rpb25OYW1lKG9iai5jb25zdHJ1Y3RvcikpOworCQkJfQorCQl9CisJfQorCQorCXJldHVybiBub2RlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZGVjb2RlCisgKgorICogRGVjb2RlcyB0aGUgZ2l2ZW4gWE1MIG5vZGUuIFRoZSBvcHRpb25hbCAiaW50byIKKyAqIGFyZ3VtZW50IHNwZWNpZmllcyBhbiBleGlzdGluZyBvYmplY3QgdG8gYmUKKyAqIHVzZWQuIElmIG5vIG9iamVjdCBpcyBnaXZlbiwgdGhlbiBhIG5ldyBpbnN0YW5jZQorICogaXMgY3JlYXRlZCB1c2luZyB0aGUgY29uc3RydWN0b3IgZnJvbSB0aGUgY29kZWMuCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBhc3NlZCBpbiBvYmplY3Qgb3IKKyAqIHRoZSBuZXcgaW5zdGFuY2UgaWYgbm8gb2JqZWN0IHdhcyBnaXZlbi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIG5vZGUgLSBYTUwgbm9kZSB0byBiZSBkZWNvZGVkLgorICogaW50byAtIE9wdGlvbmFsIG9iamVjdCB0byBiZSBkZWNvZGVjIGludG8uCisgKi8KK214Q29kZWMucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uKG5vZGUsIGludG8pCit7CisJdmFyIG9iaiA9IG51bGw7CisJCisJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLm5vZGVUeXBlID09IG14Q29uc3RhbnRzLk5PREVUWVBFX0VMRU1FTlQpCisJeworCQl2YXIgY3RvciA9IG51bGw7CisJCQorCQl0cnkKKwkJeworCQkJY3RvciA9IHdpbmRvd1tub2RlLm5vZGVOYW1lXTsKKwkJfQorCQljYXRjaCAoZXJyKQorCQl7CisJCQkvLyBpZ25vcmUKKwkJfQorCQkKKwkJdmFyIGRlYyA9IG14Q29kZWNSZWdpc3RyeS5nZXRDb2RlYyhjdG9yKTsKKwkJCisJCWlmIChkZWMgIT0gbnVsbCkKKwkJeworCQkJb2JqID0gZGVjLmRlY29kZSh0aGlzLCBub2RlLCBpbnRvKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW9iaiA9IG5vZGUuY2xvbmVOb2RlKHRydWUpOworCQkJb2JqLnJlbW92ZUF0dHJpYnV0ZSgnYXMnKTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gb2JqOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZW5jb2RlQ2VsbAorICoKKyAqIEVuY29kaW5nIG9mIGNlbGwgaGllcmFyY2hpZXMgaXMgYnVpbHQtaW50byB0aGUgY29yZSwgYnV0CisgKiBpcyBhIGhpZ2hlci1sZXZlbCBmdW5jdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGV4cGxpY2l0ZWx5CisgKiB1c2VkIGJ5IHRoZSByZXNwZWN0aXZlIG9iamVjdCBlbmNvZGVycyAoZWcuIDxteE1vZGVsQ29kZWM+LAorICogPG14Q2hpbGRDaGFuZ2VDb2RlYz4gYW5kIDxteFJvb3RDaGFuZ2VDb2RlYz4pLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiB3cml0ZXMgdGhlIGdpdmVuIGNlbGwgYW5kIGl0cyBjaGlsZHJlbiBhcyBhCisgKiAoZmxhdCkgc2VxdWVuY2UgaW50byB0aGUgZ2l2ZW4gbm9kZS4gVGhlIGNoaWxkcmVuIGFyZSBub3QKKyAqIGVuY29kZWQgaWYgdGhlIG9wdGlvbmFsIGluY2x1ZGVDaGlsZHJlbiBpcyBmYWxzZS4gVGhlCisgKiBmdW5jdGlvbiBpcyBpbiBjaGFyZ2Ugb2YgYWRkaW5nIHRoZSByZXN1bHQgaW50byB0aGUKKyAqIGdpdmVuIG5vZGUgYW5kIGhhcyBubyByZXR1cm4gdmFsdWUuCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBjZWxsIC0gPG14Q2VsbD4gdG8gYmUgZW5jb2RlZC4KKyAqIG5vZGUgLSBQYXJlbnQgWE1MIG5vZGUgdG8gYWRkIHRoZSBlbmNvZGVkIGNlbGwgaW50by4KKyAqIGluY2x1ZGVDaGlsZHJlbiAtIE9wdGlvbmFsIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUKKyAqIGZ1bmN0aW9uIHNob3VsZCBpbmNsdWRlIGFsbCBkZXNjZW5kZW50cy4gRGVmYXVsdCBpcyB0cnVlLiAKKyAqLworbXhDb2RlYy5wcm90b3R5cGUuZW5jb2RlQ2VsbCA9IGZ1bmN0aW9uKGNlbGwsIG5vZGUsIGluY2x1ZGVDaGlsZHJlbikKK3sKKwlub2RlLmFwcGVuZENoaWxkKHRoaXMuZW5jb2RlKGNlbGwpKTsKKwkKKwlpZiAoaW5jbHVkZUNoaWxkcmVuID09IG51bGwgfHwgaW5jbHVkZUNoaWxkcmVuKQorCXsKKwkJdmFyIGNoaWxkQ291bnQgPSBjZWxsLmdldENoaWxkQ291bnQoKTsKKwkJCisJCWZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKQorCQl7CisJCQl0aGlzLmVuY29kZUNlbGwoY2VsbC5nZXRDaGlsZEF0KGkpLCBub2RlKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQ2VsbENvZGVjCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29kZWMgaXMgYSBjZWxsIGNvZGVjLiBUaGlzIHVzZXMKKyAqIDxteENlbGxDb2RlYy5pc0NlbGxDb2RlYz4gdG8gY2hlY2sgaWYgdGhlIGNvZGVjIGlzIG9mIHRoZQorICogZ2l2ZW4gdHlwZS4KKyAqLworbXhDb2RlYy5wcm90b3R5cGUuaXNDZWxsQ29kZWMgPSBmdW5jdGlvbihjb2RlYykKK3sKKwlpZiAoY29kZWMgIT0gbnVsbCAmJiB0eXBlb2YoY29kZWMuaXNDZWxsQ29kZWMpID09ICdmdW5jdGlvbicpCisJeworCQlyZXR1cm4gY29kZWMuaXNDZWxsQ29kZWMoKTsKKwl9CisJCisJcmV0dXJuIGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZGVjb2RlQ2VsbAorICoKKyAqIERlY29kZXMgY2VsbHMgdGhhdCBoYXZlIGJlZW4gZW5jb2RlZCB1c2luZyBpbnZlcnNpb24sIGllLgorICogd2hlcmUgdGhlIHVzZXIgb2JqZWN0IGlzIHRoZSBlbmNsb3Npbmcgbm9kZSBpbiB0aGUgWE1MLAorICogYW5kIHJlc3RvcmVzIHRoZSBncm91cCBhbmQgZ3JhcGggc3RydWN0dXJlIGluIHRoZSBjZWxscy4KKyAqIFJldHVybnMgYSBuZXcgPG14Q2VsbD4gaW5zdGFuY2UgdGhhdCByZXByZXNlbnRzIHRoZQorICogZ2l2ZW4gbm9kZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIG5vZGUgLSBYTUwgbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBjZWxsIGRhdGEuCisgKiByZXN0b3JlU3RydWN0dXJlcyAtIE9wdGlvbmFsIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyCisgKiB0aGUgZ3JhcGggc3RydWN0dXJlIHNob3VsZCBiZSByZXN0b3JlZCBieSBjYWxsaW5nIGluc2VydAorICogYW5kIGluc2VydEVkZ2Ugb24gdGhlIHBhcmVudCBhbmQgdGVybWluYWxzLCByZXNwZWN0aXZlbHkuCisgKiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214Q29kZWMucHJvdG90eXBlLmRlY29kZUNlbGwgPSBmdW5jdGlvbihub2RlLCByZXN0b3JlU3RydWN0dXJlcykKK3sKKwlyZXN0b3JlU3RydWN0dXJlcyA9IChyZXN0b3JlU3RydWN0dXJlcyAhPSBudWxsKSA/IHJlc3RvcmVTdHJ1Y3R1cmVzIDogdHJ1ZTsKKwl2YXIgY2VsbCA9IG51bGw7CisJCisJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLm5vZGVUeXBlID09IG14Q29uc3RhbnRzLk5PREVUWVBFX0VMRU1FTlQpCisJeworCQkvLyBUcmllcyB0byBmaW5kIGEgY29kZWMgZm9yIHRoZSBnaXZlbiBub2RlIG5hbWUuIElmIHRoYXQgZG9lcworCQkvLyBub3QgcmV0dXJuIGEgY29kZWMgdGhlbiB0aGUgbm9kZSBpcyB0aGUgdXNlciBvYmplY3QgKGFuIFhNTCBub2RlCisJCS8vIHRoYXQgY29udGFpbnMgdGhlIG14Q2VsbCwgYWthIGludmVyc2lvbikuCisJCXZhciBkZWNvZGVyID0gbXhDb2RlY1JlZ2lzdHJ5LmdldENvZGVjKG5vZGUubm9kZU5hbWUpOworCQkKKwkJLy8gVHJpZXMgdG8gZmluZCB0aGUgY29kZWMgZm9yIHRoZSBjZWxsIGluc2lkZSB0aGUgdXNlciBvYmplY3QuCisJCS8vIFRoaXMgYXNzdW1lcyBhbGwgbm9kZSBuYW1lcyBpbnNpZGUgdGhlIHVzZXIgb2JqZWN0IGFyZSBlaXRoZXIKKwkJLy8gbm90IHJlZ2lzdGVyZWQgb3IgdGhleSBjb3JyZXNwb25kIHRvIGEgY2xhc3MgZm9yIGNlbGxzLgorCQlpZiAoIXRoaXMuaXNDZWxsQ29kZWMoZGVjb2RlcikpCisJCXsKKwkJCXZhciBjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDsKKwkJCQorCQkJd2hpbGUgKGNoaWxkICE9IG51bGwgJiYgIXRoaXMuaXNDZWxsQ29kZWMoZGVjb2RlcikpCisJCQl7CisJCQkJZGVjb2RlciA9IG14Q29kZWNSZWdpc3RyeS5nZXRDb2RlYyhjaGlsZC5ub2RlTmFtZSk7CisJCQkJY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZzsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKCF0aGlzLmlzQ2VsbENvZGVjKGRlY29kZXIpKQorCQl7CisJCQlkZWNvZGVyID0gbXhDb2RlY1JlZ2lzdHJ5LmdldENvZGVjKG14Q2VsbCk7CisJCX0KKworCQljZWxsID0gZGVjb2Rlci5kZWNvZGUodGhpcywgbm9kZSk7CisJCQorCQlpZiAocmVzdG9yZVN0cnVjdHVyZXMpCisJCXsKKwkJCXRoaXMuaW5zZXJ0SW50b0dyYXBoKGNlbGwpOworCQl9CisJfQorCQorCXJldHVybiBjZWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaW5zZXJ0SW50b0dyYXBoCisgKgorICogSW5zZXJ0cyB0aGUgZ2l2ZW4gY2VsbCBpbnRvIGl0cyBwYXJlbnQgYW5kIHRlcm1pbmFsIGNlbGxzLgorICovCitteENvZGVjLnByb3RvdHlwZS5pbnNlcnRJbnRvR3JhcGggPSBmdW5jdGlvbihjZWxsKQoreworCXZhciBwYXJlbnQgPSBjZWxsLnBhcmVudDsKKwl2YXIgc291cmNlID0gY2VsbC5nZXRUZXJtaW5hbCh0cnVlKTsKKwl2YXIgdGFyZ2V0ID0gY2VsbC5nZXRUZXJtaW5hbChmYWxzZSk7CisKKwkvLyBGaXhlcyBwb3NzaWJsZSBpbmNvbnNpc3RlbmNpZXMgZHVyaW5nIGluc2VydCBpbnRvIGdyYXBoCisJY2VsbC5zZXRUZXJtaW5hbChudWxsLCBmYWxzZSk7CisJY2VsbC5zZXRUZXJtaW5hbChudWxsLCB0cnVlKTsKKwljZWxsLnBhcmVudCA9IG51bGw7CisJCisJaWYgKHBhcmVudCAhPSBudWxsKQorCXsKKwkJcGFyZW50Lmluc2VydChjZWxsKTsKKwl9CisKKwlpZiAoc291cmNlICE9IG51bGwpCisJeworCQlzb3VyY2UuaW5zZXJ0RWRnZShjZWxsLCB0cnVlKTsKKwl9CisKKwlpZiAodGFyZ2V0ICE9IG51bGwpCisJeworCQl0YXJnZXQuaW5zZXJ0RWRnZShjZWxsLCBmYWxzZSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0QXR0cmlidXRlCisgKgorICogU2V0cyB0aGUgYXR0cmlidXRlIG9uIHRoZSBzcGVjaWZpZWQgbm9kZSB0byB2YWx1ZS4gVGhpcyBpcyBhCisgKiBoZWxwZXIgbWV0aG9kIHRoYXQgbWFrZXMgc3VyZSB0aGUgYXR0cmlidXRlIGFuZCB2YWx1ZSBhcmd1bWVudHMKKyAqIGFyZSBub3QgbnVsbC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIG5vZGUgLSBYTUwgbm9kZSB0byBzZXQgdGhlIGF0dHJpYnV0ZSBmb3IuCisgKiBhdHRyaWJ1dGVzIC0gQXR0cmlidXRlbmFtZSB0byBiZSBzZXQuCisgKiB2YWx1ZSAtIE5ldyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgorICovCitteENvZGVjLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbihub2RlLCBhdHRyaWJ1dGUsIHZhbHVlKQoreworCWlmIChhdHRyaWJ1dGUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKQorCXsKKwkJbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSk7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teENvZGVjUmVnaXN0cnkuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaW8vbXhDb2RlY1JlZ2lzdHJ5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZWJjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaW8vbXhDb2RlY1JlZ2lzdHJ5LmpzCkBAIC0wLDAgKzEsMTM3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCit2YXIgbXhDb2RlY1JlZ2lzdHJ5ID0KK3sKKwkvKioKKwkgKiBDbGFzczogbXhDb2RlY1JlZ2lzdHJ5CisJICoKKwkgKiBTaW5nbGV0b24gY2xhc3MgdGhhdCBhY3RzIGFzIGEgZ2xvYmFsIHJlZ2lzdHJ5IGZvciBjb2RlY3MuCisJICoKKwkgKiBBZGRpbmcgYW4gPG14Q29kZWM+OgorCSAqCisJICogMS4gRGVmaW5lIGEgZGVmYXVsdCBjb2RlYyB3aXRoIGEgbmV3IGluc3RhbmNlIG9mIHRoZSAKKwkgKiBvYmplY3QgdG8gYmUgaGFuZGxlZC4KKwkgKgorCSAqIChjb2RlKQorCSAqIHZhciBjb2RlYyA9IG5ldyBteE9iamVjdENvZGVjKG5ldyBteEdyYXBoTW9kZWwoKSk7CisJICogKGVuZCkKKwkgKgorCSAqIDIuIERlZmluZSB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcKKwkgKiBvYmplY3RzLgorCSAqCisJICogKGNvZGUpCisJICogY29kZWMuZW5jb2RlID0gZnVuY3Rpb24oZW5jLCBvYmopIHsgLi4uIH0KKwkgKiBjb2RlYy5kZWNvZGUgPSBmdW5jdGlvbihkZWMsIG5vZGUsIGludG8pIHsgLi4uIH0KKwkgKiAoZW5kKQorCSAqCisJICogMy4gUmVnaXN0ZXIgdGhlIGNvZGVjIGluIHRoZSA8bXhDb2RlY1JlZ2lzdHJ5Pi4KKwkgKgorCSAqIChjb2RlKQorCSAqIG14Q29kZWNSZWdpc3RyeS5yZWdpc3Rlcihjb2RlYyk7CisJICogKGVuZCkKKwkgKgorCSAqIDxteE9iamVjdENvZGVjLmRlY29kZT4gbWF5IGJlIHVzZWQgdG8gZWl0aGVyIGNyZWF0ZSBhIG5ldyAKKwkgKiBpbnN0YW5jZSBvZiBhbiBvYmplY3Qgb3IgdG8gY29uZmlndXJlIGFuIGV4aXN0aW5nIGluc3RhbmNlLCAKKwkgKiBpbiB3aGljaCBjYXNlIHRoZSBpbnRvIGFyZ3VtZW50IHBvaW50cyB0byB0aGUgZXhpc3RpbmcKKwkgKiBvYmplY3QuIEluIHRoaXMgY2FzZSwgd2Ugc2F5IHRoZSBjb2RlYyAiY29uZmlndXJlcyIgdGhlCisJICogb2JqZWN0LgorCSAqIAorCSAqIFZhcmlhYmxlOiBjb2RlY3MKKwkgKgorCSAqIE1hcHMgZnJvbSBjb25zdHJ1Y3RvciBuYW1lcyB0byBjb2RlY3MuCisJICovCisJY29kZWNzOiBbXSwKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogYWxpYXNlcworCSAqCisJICogTWFwcyBmcm9tIGNsYXNzbmFtZXMgdG8gY29kZWNuYW1lcy4KKwkgKi8KKwlhbGlhc2VzOiBbXSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiByZWdpc3RlcgorCSAqCisJICogUmVnaXN0ZXJzIGEgbmV3IGNvZGVjIGFuZCBhc3NvY2lhdGVzIHRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZQorCSAqIGNvbnN0cnVjdG9yIGluIHRoZSBjb2RlYyB3aXRoIHRoZSBjb2RlYyBvYmplY3QuCisJICoKKwkgKiBQYXJhbWV0ZXJzOgorCSAqCisJICogY29kZWMgLSA8bXhPYmplY3RDb2RlYz4gdG8gYmUgcmVnaXN0ZXJlZC4KKwkgKi8KKwlyZWdpc3RlcjogZnVuY3Rpb24oY29kZWMpCisJeworCQlpZiAoY29kZWMgIT0gbnVsbCkKKwkJeworCQkJdmFyIG5hbWUgPSBjb2RlYy5nZXROYW1lKCk7CisJCQlteENvZGVjUmVnaXN0cnkuY29kZWNzW25hbWVdID0gY29kZWM7CisJCQkKKwkJCXZhciBjbGFzc25hbWUgPSBteFV0aWxzLmdldEZ1bmN0aW9uTmFtZShjb2RlYy50ZW1wbGF0ZS5jb25zdHJ1Y3Rvcik7CisKKwkJCWlmIChjbGFzc25hbWUgIT0gbmFtZSkKKwkJCXsKKwkJCQlteENvZGVjUmVnaXN0cnkuYWRkQWxpYXMoY2xhc3NuYW1lLCBuYW1lKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBjb2RlYzsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGFkZEFsaWFzCisJICoKKwkgKiBBZGRzIGFuIGFsaWFzIGZvciBtYXBwaW5nIGEgY2xhc3NuYW1lIHRvIGEgY29kZWNuYW1lLgorCSAqLworCWFkZEFsaWFzOiBmdW5jdGlvbihjbGFzc25hbWUsIGNvZGVjbmFtZSkKKwl7CisJCW14Q29kZWNSZWdpc3RyeS5hbGlhc2VzW2NsYXNzbmFtZV0gPSBjb2RlY25hbWU7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBnZXRDb2RlYworCSAqCisJICogUmV0dXJucyBhIGNvZGVjIHRoYXQgaGFuZGxlcyBvYmplY3RzIHRoYXQgYXJlIGNvbnN0cnVjdGVkCisJICogdXNpbmcgdGhlIGdpdmVuIGNvbnN0cnVjdG9yLgorCSAqCisJICogUGFyYW1ldGVyczoKKwkgKgorCSAqIGN0b3IgLSBKYXZhU2NyaXB0IGNvbnN0cnVjdG9yIGZ1bmN0aW9uLiAKKwkgKi8KKwlnZXRDb2RlYzogZnVuY3Rpb24oY3RvcikKKwl7CisJCXZhciBjb2RlYyA9IG51bGw7CisJCQorCQlpZiAoY3RvciAhPSBudWxsKQorCQl7CisJCQl2YXIgbmFtZSA9IG14VXRpbHMuZ2V0RnVuY3Rpb25OYW1lKGN0b3IpOworCQkJdmFyIHRtcCA9IG14Q29kZWNSZWdpc3RyeS5hbGlhc2VzW25hbWVdOworCQkJCisJCQlpZiAodG1wICE9IG51bGwpCisJCQl7CisJCQkJbmFtZSA9IHRtcDsKKwkJCX0KKwkJCQorCQkJY29kZWMgPSBteENvZGVjUmVnaXN0cnkuY29kZWNzW25hbWVdOworCQkJCisJCQkvLyBSZWdpc3RlcnMgYSBuZXcgZGVmYXVsdCBjb2RlYyBmb3IgdGhlIGdpdmVuIGNvbnN0cnVjdG9yCisJCQkvLyBpZiBubyBjb2RlYyBoYXMgYmVlbiBwcmV2aW91c2x5IGRlZmluZWQuCisJCQlpZiAoY29kZWMgPT0gbnVsbCkKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCWNvZGVjID0gbmV3IG14T2JqZWN0Q29kZWMobmV3IGN0b3IoKSk7CisJCQkJCW14Q29kZWNSZWdpc3RyeS5yZWdpc3Rlcihjb2RlYyk7CisJCQkJfQorCQkJCWNhdGNoIChlKQorCQkJCXsKKwkJCQkJLy8gaWdub3JlCisJCQkJfQorCQkJfQorCQl9CisJCQorCQlyZXR1cm4gY29kZWM7CisJfQorCit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214RGVmYXVsdEtleUhhbmRsZXJDb2RlYy5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teERlZmF1bHRLZXlIYW5kbGVyQ29kZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExODU3OQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teERlZmF1bHRLZXlIYW5kbGVyQ29kZWMuanMKQEAgLTAsMCArMSw4OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworbXhDb2RlY1JlZ2lzdHJ5LnJlZ2lzdGVyKGZ1bmN0aW9uKCkKK3sKKwkvKioKKwkgKiBDbGFzczogbXhEZWZhdWx0S2V5SGFuZGxlckNvZGVjCisJICoKKwkgKiBDdXN0b20gY29kZWMgZm9yIGNvbmZpZ3VyaW5nIDxteERlZmF1bHRLZXlIYW5kbGVyPnMuIFRoaXMgY2xhc3MgaXMgY3JlYXRlZAorCSAqIGFuZCByZWdpc3RlcmVkIGR5bmFtaWNhbGx5IGF0IGxvYWQgdGltZSBhbmQgdXNlZCBpbXBsaWNpdGVseSB2aWEKKwkgKiA8bXhDb2RlYz4gYW5kIHRoZSA8bXhDb2RlY1JlZ2lzdHJ5Pi4gVGhpcyBjb2RlYyBvbmx5IHJlYWRzIGNvbmZpZ3VyYXRpb24KKwkgKiBkYXRhIGZvciBleGlzdGluZyBrZXkgaGFuZGxlcnMsIGl0IGRvZXMgbm90IGVuY29kZSBvciBjcmVhdGUga2V5IGhhbmRsZXJzLgorCSAqLworCXZhciBjb2RlYyA9IG5ldyBteE9iamVjdENvZGVjKG5ldyBteERlZmF1bHRLZXlIYW5kbGVyKCkpOworCisJLyoqCisJICogRnVuY3Rpb246IGVuY29kZQorCSAqCisJICogUmV0dXJucyBudWxsLgorCSAqLworCWNvZGVjLmVuY29kZSA9IGZ1bmN0aW9uKGVuYywgb2JqKQorCXsKKwkJcmV0dXJuIG51bGw7CisJfTsKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogZGVjb2RlCisJICoKKwkgKiBSZWFkcyBhIHNlcXVlbmNlIG9mIHRoZSBmb2xsb3dpbmcgY2hpbGQgbm9kZXMKKwkgKiBhbmQgYXR0cmlidXRlczoKKwkgKgorCSAqIENoaWxkIE5vZGVzOgorCSAqCisJICogYWRkIC0gQmluZHMgYSBrZXlzdHJva2UgdG8gYW4gYWN0aW9ubmFtZS4KKwkgKgorCSAqIEF0dHJpYnV0ZXM6CisJICoKKwkgKiBhcyAtIEtleWNvZGUuCisJICogYWN0aW9uIC0gQWN0aW9ubmFtZSB0byBleGVjdXRlIGluIGVkaXRvci4KKwkgKiBjb250cm9sIC0gT3B0aW9uYWwgYm9vbGVhbiBpbmRpY2F0aW5nIGlmCisJICogCQl0aGUgY29udHJvbCBrZXkgbXVzdCBiZSBwcmVzc2VkLgorCSAqCisJICogRXhhbXBsZToKKwkgKgorCSAqIChjb2RlKQorCSAqIDxteERlZmF1bHRLZXlIYW5kbGVyIGFzPSJrZXlIYW5kbGVyIj4KKwkgKiAgIDxhZGQgYXM9Ijg4IiBjb250cm9sPSJ0cnVlIiBhY3Rpb249ImN1dCIvPgorCSAqICAgPGFkZCBhcz0iNjciIGNvbnRyb2w9InRydWUiIGFjdGlvbj0iY29weSIvPgorCSAqICAgPGFkZCBhcz0iODYiIGNvbnRyb2w9InRydWUiIGFjdGlvbj0icGFzdGUiLz4KKwkgKiA8L214RGVmYXVsdEtleUhhbmRsZXI+CisJICogKGVuZCkKKwkgKgorCSAqIFRoZSBrZXljb2RlcyBhcmUgZm9yIHRoZSB4LCBjIGFuZCB2IGtleXMuCisJICoKKwkgKiBTZWUgYWxzbzogPG14RGVmYXVsdEtleUhhbmRsZXIuYmluZEFjdGlvbj4sCisJICogaHR0cDovL3d3dy5qcy1leGFtcGxlcy5jb20vcGFnZS90dXRvcmlhbHNfX2tleV9jb2Rlcy5odG1sCisJICovCisJY29kZWMuZGVjb2RlID0gZnVuY3Rpb24oZGVjLCBub2RlLCBpbnRvKQorCXsKKwkJaWYgKGludG8gIT0gbnVsbCkKKwkJeworCQkJdmFyIGVkaXRvciA9IGludG8uZWRpdG9yOworCQkJbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDsKKwkJCQorCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkKKwkJCXsKKwkJCQlpZiAoIXRoaXMucHJvY2Vzc0luY2x1ZGUoZGVjLCBub2RlLCBpbnRvKSAmJgorCQkJCQlub2RlLm5vZGVOYW1lID09ICdhZGQnKQorCQkJCXsKKwkJCQkJdmFyIGFzID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2FzJyk7CisJCQkJCXZhciBhY3Rpb24gPSBub2RlLmdldEF0dHJpYnV0ZSgnYWN0aW9uJyk7CisJCQkJCXZhciBjb250cm9sID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2NvbnRyb2wnKTsKKwkJCQkJCisJCQkJCWludG8uYmluZEFjdGlvbihhcywgYWN0aW9uLCBjb250cm9sKTsKKwkJCQl9CisJCQkJCisJCQkJbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBpbnRvOworCX07CisKKwkvLyBSZXR1cm5zIHRoZSBjb2RlYyBpbnRvIHRoZSByZWdpc3RyeQorCXJldHVybiBjb2RlYzsKKworfSgpKTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teERlZmF1bHRQb3B1cE1lbnVDb2RlYy5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teERlZmF1bHRQb3B1cE1lbnVDb2RlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTYyYWMyCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214RGVmYXVsdFBvcHVwTWVudUNvZGVjLmpzCkBAIC0wLDAgKzEsNTQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KK214Q29kZWNSZWdpc3RyeS5yZWdpc3RlcihmdW5jdGlvbigpCit7CisJLyoqCisJICogQ2xhc3M6IG14RGVmYXVsdFBvcHVwTWVudUNvZGVjCisJICoKKwkgKiBDdXN0b20gY29kZWMgZm9yIGNvbmZpZ3VyaW5nIDxteERlZmF1bHRQb3B1cE1lbnU+cy4gVGhpcyBjbGFzcyBpcyBjcmVhdGVkCisJICogYW5kIHJlZ2lzdGVyZWQgZHluYW1pY2FsbHkgYXQgbG9hZCB0aW1lIGFuZCB1c2VkIGltcGxpY2l0ZWx5IHZpYQorCSAqIDxteENvZGVjPiBhbmQgdGhlIDxteENvZGVjUmVnaXN0cnk+LiBUaGlzIGNvZGVjIG9ubHkgcmVhZHMgY29uZmlndXJhdGlvbgorCSAqIGRhdGEgZm9yIGV4aXN0aW5nIHBvcHVwIG1lbnVzLCBpdCBkb2VzIG5vdCBlbmNvZGUgb3IgY3JlYXRlIG1lbnVzLiBOb3RlCisJICogdGhhdCB0aGlzIGNvZGVjIG9ubHkgcGFzc2VzIHRoZSBjb25maWd1cmF0aW9uIG5vZGUgdG8gdGhlIHBvcHVwIG1lbnUsCisJICogd2hpY2ggdXNlcyB0aGUgY29uZmlnIHRvIGR5bmFtaWNhbGx5IGNyZWF0ZSBtZW51cy4gU2VlCisJICogPG14RGVmYXVsdFBvcHVwTWVudS5jcmVhdGVNZW51Pi4KKwkgKi8KKwl2YXIgY29kZWMgPSBuZXcgbXhPYmplY3RDb2RlYyhuZXcgbXhEZWZhdWx0UG9wdXBNZW51KCkpOworCisJLyoqCisJICogRnVuY3Rpb246IGVuY29kZQorCSAqCisJICogUmV0dXJucyBudWxsLgorCSAqLworCWNvZGVjLmVuY29kZSA9IGZ1bmN0aW9uKGVuYywgb2JqKQorCXsKKwkJcmV0dXJuIG51bGw7CisJfTsKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogZGVjb2RlCisJICoKKwkgKiBVc2VzIHRoZSBnaXZlbiBub2RlIGFzIHRoZSBjb25maWcgZm9yIDxteERlZmF1bHRQb3B1cE1lbnU+LgorCSAqLworCWNvZGVjLmRlY29kZSA9IGZ1bmN0aW9uKGRlYywgbm9kZSwgaW50bykKKwl7CisJCXZhciBpbmMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbmNsdWRlJylbMF07CisJCQorCQlpZiAoaW5jICE9IG51bGwpCisJCXsKKwkJCXRoaXMucHJvY2Vzc0luY2x1ZGUoZGVjLCBpbmMsIGludG8pOworCQl9CisJCWVsc2UgaWYgKGludG8gIT0gbnVsbCkKKwkJeworCQkJaW50by5jb25maWcgPSBub2RlOworCQl9CisJCQorCQlyZXR1cm4gaW50bzsKKwl9OworCQorCS8vIFJldHVybnMgdGhlIGNvZGVjIGludG8gdGhlIHJlZ2lzdHJ5CisJcmV0dXJuIGNvZGVjOworCit9KCkpOwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214RGVmYXVsdFRvb2xiYXJDb2RlYy5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teERlZmF1bHRUb29sYmFyQ29kZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1N2ZkMwotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teERlZmF1bHRUb29sYmFyQ29kZWMuanMKQEAgLTAsMCArMSwzMTIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14RGVmYXVsdFRvb2xiYXJDb2RlYworICoKKyAqIEN1c3RvbSBjb2RlYyBmb3IgY29uZmlndXJpbmcgPG14RGVmYXVsdFRvb2xiYXI+cy4gVGhpcyBjbGFzcyBpcyBjcmVhdGVkCisgKiBhbmQgcmVnaXN0ZXJlZCBkeW5hbWljYWxseSBhdCBsb2FkIHRpbWUgYW5kIHVzZWQgaW1wbGljaXRlbHkgdmlhCisgKiA8bXhDb2RlYz4gYW5kIHRoZSA8bXhDb2RlY1JlZ2lzdHJ5Pi4gVGhpcyBjb2RlYyBvbmx5IHJlYWRzIGNvbmZpZ3VyYXRpb24KKyAqIGRhdGEgZm9yIGV4aXN0aW5nIHRvb2xiYXJzIGhhbmRsZXJzLCBpdCBkb2VzIG5vdCBlbmNvZGUgb3IgY3JlYXRlIHRvb2xiYXJzLgorICovCit2YXIgbXhEZWZhdWx0VG9vbGJhckNvZGVjID0gbXhDb2RlY1JlZ2lzdHJ5LnJlZ2lzdGVyKGZ1bmN0aW9uKCkKK3sKKwl2YXIgY29kZWMgPSBuZXcgbXhPYmplY3RDb2RlYyhuZXcgbXhEZWZhdWx0VG9vbGJhcigpKTsKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBlbmNvZGUKKwkgKgorCSAqIFJldHVybnMgbnVsbC4KKwkgKi8KKwljb2RlYy5lbmNvZGUgPSBmdW5jdGlvbihlbmMsIG9iaikKKwl7CisJCXJldHVybiBudWxsOworCX07CisJCisJLyoqCisJICogRnVuY3Rpb246IGRlY29kZQorCSAqCisJICogUmVhZHMgYSBzZXF1ZW5jZSBvZiB0aGUgZm9sbG93aW5nIGNoaWxkIG5vZGVzCisJICogYW5kIGF0dHJpYnV0ZXM6CisJICoKKwkgKiBDaGlsZCBOb2RlczoKKwkgKgorCSAqIGFkZCAtIEFkZHMgYSBuZXcgaXRlbSB0byB0aGUgdG9vbGJhci4gU2VlIGJlbG93IGZvciBhdHRyaWJ1dGVzLgorCSAqIHNlcGFyYXRvciAtIEFkZHMgYSB2ZXJ0aWNhbCBzZXBhcmF0b3IuIE5vIGF0dHJpYnV0ZXMuCisJICogaHIgLSBBZGRzIGEgaG9yaXpvbnRhbCBzZXBhcmF0b3IuIE5vIGF0dHJpYnV0ZXMuCisJICogYnIgLSBBZGRzIGEgbGluZWZlZWQuIE5vIGF0dHJpYnV0ZXMuIAorCSAqCisJICogQXR0cmlidXRlczoKKwkgKgorCSAqIGFzIC0gUmVzb3VyY2Uga2V5IGZvciB0aGUgbGFiZWwuCisJICogYWN0aW9uIC0gTmFtZSBvZiB0aGUgYWN0aW9uIHRvIGV4ZWN1dGUgaW4gZW5jbG9zaW5nIGVkaXRvci4KKwkgKiBtb2RlIC0gTW9kZW5hbWUgKHNlZSBiZWxvdykuCisJICogdGVtcGxhdGUgLSBUZW1wbGF0ZSBuYW1lIGZvciBjZWxsIGluc2VydGlvbi4KKwkgKiBzdHlsZSAtIE9wdGlvbmFsIHN0eWxlIHRvIG92ZXJyaWRlIHRoZSB0ZW1wbGF0ZSBzdHlsZS4KKwkgKiBpY29uIC0gSWNvbiAocmVsYXRpdmUvYWJzb2x1dGUgVVJMKS4KKwkgKiBwcmVzc2VkSWNvbiAtIE9wdGlvbmFsIGljb24gZm9yIHByZXNzZWQgc3RhdGUgKHJlbGF0aXZlL2Fic29sdXRlIFVSTCkuCisJICogaWQgLSBPcHRpb25hbCBJRCB0byBiZSB1c2VkIGZvciB0aGUgY3JlYXRlZCBET00gZWxlbWVudC4KKwkgKiB0b2dnbGUgLSBPcHRpb25hbCAwIG9yIDEgdG8gZGlzYWJsZSB0b2dnbGluZyBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdCBpcworCSAqIDEgKHRydWUpLgorCSAqCisJICogVGhlIGFjdGlvbiwgbW9kZSBhbmQgdGVtcGxhdGUgYXR0cmlidXRlcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBUaGUKKwkgKiBzdHlsZSBjYW4gb25seSBiZSB1c2VkIHdpdGggdGhlIHRlbXBsYXRlIGF0dHJpYnV0ZS4gVGhlIGFkZCBub2RlIG1heQorCSAqIGNvbnRhaW4gYW5vdGhlciBzZXF1ZW5jZSBvZiBhZGQgbm9kZXMgd2l0aCBhcyBhbmQgYWN0aW9uIGF0dHJpYnV0ZXMKKwkgKiB0byBjcmVhdGUgYSBjb21ibyBib3ggaW4gdGhlIHRvb2xiYXIuIElmIHRoZSBpY29uIGlzIHNwZWNpZmllZCB0aGVuCisJICogYSBsaXN0IG9mIHRoZSBjaGlsZCBub2RlIGlzIGV4cGVjdGVkIHRvIGhhdmUgaXRzIHRlbXBsYXRlIGF0dHJpYnV0ZQorCSAqIHNldCBhbmQgdGhlIGFjdGlvbiBpcyBpZ25vcmVkIGluc3RlYWQuCisJICogCisJICogTm9kZXMgd2l0aCBhIHNwZWNpZmllZCB0ZW1wbGF0ZSBtYXkgZGVmaW5lIGEgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IKKwkgKiBpbnNlcnRpbmcgdGhlIGNsb25lZCB0ZW1wbGF0ZSBpbnRvIHRoZSBncmFwaC4gSGVyZSBpcyBhbiBleGFtcGxlIG9mIHN1Y2gKKwkgKiBhIG5vZGU6CisJICogCisJICogKGNvZGUpCisJICogPGFkZCBhcz0iU3dpbWxhbmUiIHRlbXBsYXRlPSJzd2ltbGFuZSIgaWNvbj0iaW1hZ2VzL3N3aW1sYW5lLmdpZiI+PCFbQ0RBVEFbCisJICogICBmdW5jdGlvbiAoZWRpdG9yLCBjZWxsLCBldnQsIHRhcmdldENlbGwpCisJICogICB7CisJICogICAgIHZhciBwdCA9IG14VXRpbHMuY29udmVydFBvaW50KAorCSAqICAgICAgIGVkaXRvci5ncmFwaC5jb250YWluZXIsIG14RXZlbnQuZ2V0Q2xpZW50WChldnQpLAorCSAqICAgICAgICAgbXhFdmVudC5nZXRDbGllbnRZKGV2dCkpOworCSAqICAgICByZXR1cm4gZWRpdG9yLmFkZFZlcnRleCh0YXJnZXRDZWxsLCBjZWxsLCBwdC54LCBwdC55KTsKKwkgKiAgIH0KKwkgKiBdXT48L2FkZD4KKwkgKiAoZW5kKQorCSAqIAorCSAqIEluIHRoZSBhYm92ZSBmdW5jdGlvbiwgZWRpdG9yIGlzIHRoZSBlbmNsb3NpbmcgPG14RWRpdG9yPiBpbnN0YW5jZSwgY2VsbAorCSAqIGlzIHRoZSBjbG9uZSBvZiB0aGUgdGVtcGxhdGUsIGV2dCBpcyB0aGUgbW91c2UgZXZlbnQgdGhhdCByZXByZXNlbnRzIHRoZQorCSAqIGRyb3AgYW5kIHRhcmdldENlbGwgaXMgdGhlIGNlbGwgdW5kZXIgdGhlIG1vdXNlcG9pbnRlciB3aGVyZSB0aGUgZHJvcAorCSAqIG9jY3VycmVkLiBUaGUgdGFyZ2V0Q2VsbCBpcyByZXRyaWV2ZWQgdXNpbmcgPG14R3JhcGguZ2V0Q2VsbEF0Pi4KKwkgKgorCSAqIEZ1dGhlcm1vcmUsIG5vZGVzIHdpdGggdGhlIG1vZGUgYXR0cmlidXRlIG1heSBkZWZpbmUgYSBmdW5jdGlvbiB0bworCSAqIGJlIGV4ZWN1dGVkIHVwb24gc2VsZWN0aW9uIG9mIHRoZSByZXNwZWN0aXZlIHRvb2xiYXIgaWNvbi4gSW4gdGhlCisJICogZXhhbXBsZSBiZWxvdywgdGhlIGRlZmF1bHQgZWRnZSBzdHlsZSBpcyBzZXQgd2hlbiB0aGlzIHNwZWNpZmljCisJICogY29ubmVjdC1tb2RlIGlzIGFjdGl2YXRlZDoKKwkgKgorCSAqIChjb2RlKQorCSAqIDxhZGQgYXM9ImNvbm5lY3QiIG1vZGU9ImNvbm5lY3QiPjwhW0NEQVRBWworCSAqICAgZnVuY3Rpb24gKGVkaXRvcikKKwkgKiAgIHsKKwkgKiAgICAgaWYgKGVkaXRvci5kZWZhdWx0RWRnZSAhPSBudWxsKQorCSAqICAgICB7CisJICogICAgICAgZWRpdG9yLmRlZmF1bHRFZGdlLnN0eWxlID0gJ3N0cmFpZ2h0RWRnZSc7CisJICogICAgIH0KKwkgKiAgIH0KKwkgKiBdXT48L2FkZD4KKwkgKiAoZW5kKQorCSAqIAorCSAqIEJvdGggZnVuY3Rpb25zIHJlcXVpcmUgPG14RGVmYXVsdFRvb2xiYXJDb2RlYy5hbGxvd0V2YWw+IHRvIGJlIHNldCB0byB0cnVlLgorCSAqCisJICogTW9kZXM6CisJICoKKwkgKiBzZWxlY3QgLSBMZWZ0IG1vdXNlIGJ1dHRvbiB1c2VkIGZvciBydWJiZXJiYW5kLSAmIGNlbGwtc2VsZWN0aW9uLgorCSAqIGNvbm5lY3QgLSBBbGxvd3MgY29ubmVjdGluZyB2ZXJ0aWNlcyBieSBpbnNlcnRpbmcgbmV3IGVkZ2VzLgorCSAqIHBhbiAtIERpc2FibGVzIHNlbGVjdGlvbiBhbmQgc3dpdGNoZXMgdG8gcGFubmluZyBvbiB0aGUgbGVmdCBidXR0b24uCisJICoKKwkgKiBFeGFtcGxlOgorCSAqCisJICogVG8gYWRkIGl0ZW1zIHRvIHRoZSB0b29sYmFyOgorCSAqIAorCSAqIChjb2RlKQorCSAqIDxteERlZmF1bHRUb29sYmFyIGFzPSJ0b29sYmFyIj4KKwkgKiAgIDxhZGQgYXM9InNhdmUiIGFjdGlvbj0ic2F2ZSIgaWNvbj0iaW1hZ2VzL3NhdmUuZ2lmIi8+CisJICogICA8YnIvPjxoci8+CisJICogICA8YWRkIGFzPSJzZWxlY3QiIG1vZGU9InNlbGVjdCIgaWNvbj0iaW1hZ2VzL3NlbGVjdC5naWYiLz4KKwkgKiAgIDxhZGQgYXM9ImNvbm5lY3QiIG1vZGU9ImNvbm5lY3QiIGljb249ImltYWdlcy9jb25uZWN0LmdpZiIvPgorCSAqIDwvbXhEZWZhdWx0VG9vbGJhcj4KKwkgKiAoZW5kKQorCSAqLworCWNvZGVjLmRlY29kZSA9IGZ1bmN0aW9uKGRlYywgbm9kZSwgaW50bykKKwl7CisJCWlmIChpbnRvICE9IG51bGwpCisJCXsKKwkJCXZhciBlZGl0b3IgPSBpbnRvLmVkaXRvcjsKKwkJCW5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7CisJCQkKKwkJCXdoaWxlIChub2RlICE9IG51bGwpCisJCQl7CisJCQkJaWYgKG5vZGUubm9kZVR5cGUgPT0gbXhDb25zdGFudHMuTk9ERVRZUEVfRUxFTUVOVCkKKwkJCQl7CisJCQkJCWlmICghdGhpcy5wcm9jZXNzSW5jbHVkZShkZWMsIG5vZGUsIGludG8pKQorCQkJCQl7CisJCQkJCQlpZiAobm9kZS5ub2RlTmFtZSA9PSAnc2VwYXJhdG9yJykKKwkJCQkJCXsKKwkJCQkJCQlpbnRvLmFkZFNlcGFyYXRvcigpOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAobm9kZS5ub2RlTmFtZSA9PSAnYnInKQorCQkJCQkJeworCQkJCQkJCWludG8udG9vbGJhci5hZGRCcmVhaygpOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAobm9kZS5ub2RlTmFtZSA9PSAnaHInKQorCQkJCQkJeworCQkJCQkJCWludG8udG9vbGJhci5hZGRMaW5lKCk7CisJCQkJCQl9CisJCQkJCQllbHNlIGlmIChub2RlLm5vZGVOYW1lID09ICdhZGQnKQorCQkJCQkJeworCQkJCQkJCXZhciBhcyA9IG5vZGUuZ2V0QXR0cmlidXRlKCdhcycpOworCQkJCQkJCWFzID0gbXhSZXNvdXJjZXMuZ2V0KGFzKSB8fCBhczsKKwkJCQkJCQl2YXIgaWNvbiA9IG5vZGUuZ2V0QXR0cmlidXRlKCdpY29uJyk7CisJCQkJCQkJdmFyIHByZXNzZWRJY29uID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ3ByZXNzZWRJY29uJyk7CisJCQkJCQkJdmFyIGFjdGlvbiA9IG5vZGUuZ2V0QXR0cmlidXRlKCdhY3Rpb24nKTsKKwkJCQkJCQl2YXIgbW9kZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCdtb2RlJyk7CisJCQkJCQkJdmFyIHRlbXBsYXRlID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ3RlbXBsYXRlJyk7CisJCQkJCQkJdmFyIHRvZ2dsZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCd0b2dnbGUnKSAhPSAnMCc7CisJCQkJCQkJdmFyIHRleHQgPSBteFV0aWxzLmdldFRleHRDb250ZW50KG5vZGUpOworCQkJCQkJCXZhciBlbHQgPSBudWxsOworCisJCQkJCQkJaWYgKGFjdGlvbiAhPSBudWxsKQorCQkJCQkJCXsKKwkJCQkJCQkJZWx0ID0gaW50by5hZGRJdGVtKGFzLCBpY29uLCBhY3Rpb24sIHByZXNzZWRJY29uKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSBpZiAobW9kZSAhPSBudWxsKQorCQkJCQkJCXsKKwkJCQkJCQkJdmFyIGZ1bmN0ID0gKG14RGVmYXVsdFRvb2xiYXJDb2RlYy5hbGxvd0V2YWwpID8gbXhVdGlscy5ldmFsKHRleHQpIDogbnVsbDsKKwkJCQkJCQkJZWx0ID0gaW50by5hZGRNb2RlKGFzLCBpY29uLCBtb2RlLCBwcmVzc2VkSWNvbiwgZnVuY3QpOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmICh0ZW1wbGF0ZSAhPSBudWxsIHx8ICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGggPiAwKSkKKwkJCQkJCQl7CisJCQkJCQkJCXZhciBjZWxsID0gZWRpdG9yLnRlbXBsYXRlc1t0ZW1wbGF0ZV07CisJCQkJCQkJCXZhciBzdHlsZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCdzdHlsZScpOworCQkJCQkJCQkKKwkJCQkJCQkJaWYgKGNlbGwgIT0gbnVsbCAmJiBzdHlsZSAhPSBudWxsKQorCQkJCQkJCQl7CisJCQkJCQkJCQljZWxsID0gZWRpdG9yLmdyYXBoLmNsb25lQ2VsbHMoW2NlbGxdKVswXTsKKwkJCQkJCQkJCWNlbGwuc2V0U3R5bGUoc3R5bGUpOworCQkJCQkJCQl9CisJCQkJCQkJCQorCQkJCQkJCQl2YXIgaW5zZXJ0RnVuY3Rpb24gPSBudWxsOworCQkJCQkJCQkKKwkJCQkJCQkJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCA+IDAgJiYgbXhEZWZhdWx0VG9vbGJhckNvZGVjLmFsbG93RXZhbCkKKwkJCQkJCQkJeworCQkJCQkJCQkJaW5zZXJ0RnVuY3Rpb24gPSBteFV0aWxzLmV2YWwodGV4dCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJCisJCQkJCQkJCWVsdCA9IGludG8uYWRkUHJvdG90eXBlKGFzLCBpY29uLCBjZWxsLCBwcmVzc2VkSWNvbiwgaW5zZXJ0RnVuY3Rpb24sIHRvZ2dsZSk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCXZhciBjaGlsZHJlbiA9IG14VXRpbHMuZ2V0Q2hpbGROb2Rlcyhub2RlKTsKKwkJCQkJCQkJCisJCQkJCQkJCWlmIChjaGlsZHJlbi5sZW5ndGggPiAwKQorCQkJCQkJCQl7CisJCQkJCQkJCQlpZiAoaWNvbiA9PSBudWxsKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCXZhciBjb21ibyA9IGludG8uYWRkQWN0aW9uQ29tYm8oYXMpOworCQkJCQkJCQkJCQorCQkJCQkJCQkJCWZvciAodmFyIGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCXZhciBjaGlsZCA9IGNoaWxkcmVuW2ldOworCQkJCQkJCQkJCQkKKwkJCQkJCQkJCQkJaWYgKGNoaWxkLm5vZGVOYW1lID09ICdzZXBhcmF0b3InKQorCQkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCQlpbnRvLmFkZE9wdGlvbihjb21ibywgJy0tLScpOworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCWVsc2UgaWYgKGNoaWxkLm5vZGVOYW1lID09ICdhZGQnKQorCQkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCQl2YXIgbGFiID0gY2hpbGQuZ2V0QXR0cmlidXRlKCdhcycpOworCQkJCQkJCQkJCQkJdmFyIGFjdCA9IGNoaWxkLmdldEF0dHJpYnV0ZSgnYWN0aW9uJyk7CisJCQkJCQkJCQkJCQlpbnRvLmFkZEFjdGlvbk9wdGlvbihjb21ibywgbGFiLCBhY3QpOworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQkJZWxzZQorCQkJCQkJCQkJeworCQkJCQkJCQkJCXZhciBzZWxlY3QgPSBudWxsOworCQkJCQkJCQkJCXZhciBjcmVhdGUgPSBmdW5jdGlvbigpCisJCQkJCQkJCQkJeworCQkJCQkJCQkJCQl2YXIgdGVtcGxhdGUgPSBlZGl0b3IudGVtcGxhdGVzW3NlbGVjdC52YWx1ZV07CisJCQkJCQkJCQkJCQorCQkJCQkJCQkJCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKKwkJCQkJCQkJCQkJeworCQkJCQkJCQkJCQkJdmFyIGNsb25lID0gdGVtcGxhdGUuY2xvbmUoKTsKKwkJCQkJCQkJCQkJCXZhciBzdHlsZSA9IHNlbGVjdC5vcHRpb25zW3NlbGVjdC5zZWxlY3RlZEluZGV4XS5jZWxsU3R5bGU7CisJCQkJCQkJCQkJCQkKKwkJCQkJCQkJCQkJCWlmIChzdHlsZSAhPSBudWxsKQorCQkJCQkJCQkJCQkJeworCQkJCQkJCQkJCQkJCWNsb25lLnNldFN0eWxlKHN0eWxlKTsKKwkJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCQorCQkJCQkJCQkJCQkJcmV0dXJuIGNsb25lOworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCWVsc2UKKwkJCQkJCQkJCQkJeworCQkJCQkJCQkJCQkJbXhMb2cud2FybignVGVtcGxhdGUgJyt0ZW1wbGF0ZSsnIG5vdCBmb3VuZCcpOworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCQorCQkJCQkJCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQkJCQkJCQl9OworCQkJCQkJCQkJCQorCQkJCQkJCQkJCXZhciBpbWcgPSBpbnRvLmFkZFByb3RvdHlwZShhcywgaWNvbiwgY3JlYXRlLCBudWxsLCBudWxsLCB0b2dnbGUpOworCQkJCQkJCQkJCXNlbGVjdCA9IGludG8uYWRkQ29tYm8oKTsKKwkJCQkJCQkJCQkKKwkJCQkJCQkJCQkvLyBTZWxlY3RzIHRoZSB0b29sYmFyIGljb24gaWYgYSBzZWxlY3Rpb24gY2hhbmdlCisJCQkJCQkJCQkJLy8gaXMgbWFkZSBpbiB0aGUgY29ycmVzcG9uZGluZyBjb21ib2JveC4KKwkJCQkJCQkJCQlteEV2ZW50LmFkZExpc3RlbmVyKHNlbGVjdCwgJ2NoYW5nZScsIGZ1bmN0aW9uKCkKKwkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCWludG8udG9vbGJhci5zZWxlY3RNb2RlKGltZywgZnVuY3Rpb24oZXZ0KQorCQkJCQkJCQkJCQl7CisJCQkJCQkJCQkJCQl2YXIgcHQgPSBteFV0aWxzLmNvbnZlcnRQb2ludChlZGl0b3IuZ3JhcGguY29udGFpbmVyLAorCQkJCQkJCQkJCQkJCW14RXZlbnQuZ2V0Q2xpZW50WChldnQpLCBteEV2ZW50LmdldENsaWVudFkoZXZ0KSk7CisJCQkJCQkJCQkJCQkKKwkJCQkJCQkJCQkJCXJldHVybiBlZGl0b3IuYWRkVmVydGV4KG51bGwsIGZ1bmN0KCksIHB0LngsIHB0LnkpOworCQkJCQkJCQkJCQl9KTsKKwkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCWludG8udG9vbGJhci5ub1Jlc2V0ID0gZmFsc2U7CisJCQkJCQkJCQkJfSk7CisJCQkJCQkJCQkJCisJCQkJCQkJCQkJLy8gQWRkcyB0aGUgZW50cmllcyB0byB0aGUgY29tYm9ib3gKKwkJCQkJCQkJCQlmb3IgKHZhciBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspCisJCQkJCQkJCQkJeworCQkJCQkJCQkJCQl2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTsKKwkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCWlmIChjaGlsZC5ub2RlTmFtZSA9PSAnc2VwYXJhdG9yJykKKwkJCQkJCQkJCQkJeworCQkJCQkJCQkJCQkJaW50by5hZGRPcHRpb24oc2VsZWN0LCAnLS0tJyk7CisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJZWxzZSBpZiAoY2hpbGQubm9kZU5hbWUgPT0gJ2FkZCcpCisJCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJCXZhciBsYWIgPSBjaGlsZC5nZXRBdHRyaWJ1dGUoJ2FzJyk7CisJCQkJCQkJCQkJCQl2YXIgdG1wID0gY2hpbGQuZ2V0QXR0cmlidXRlKCd0ZW1wbGF0ZScpOworCQkJCQkJCQkJCQkJdmFyIG9wdGlvbiA9IGludG8uYWRkT3B0aW9uKHNlbGVjdCwgbGFiLCB0bXAgfHwgdGVtcGxhdGUpOworCQkJCQkJCQkJCQkJb3B0aW9uLmNlbGxTdHlsZSA9IGNoaWxkLmdldEF0dHJpYnV0ZSgnc3R5bGUnKTsKKwkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQkKKwkJCQkJCQkvLyBBc3NpZ25zIGFuIElEIHRvIHRoZSBjcmVhdGVkIGVsZW1lbnQgdG8gYWNjZXNzIGl0IGxhdGVyLgorCQkJCQkJCWlmIChlbHQgIT0gbnVsbCkKKwkJCQkJCQl7CisJCQkJCQkJCXZhciBpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKCdpZCcpOworCQkJCQkJCQkKKwkJCQkJCQkJaWYgKGlkICE9IG51bGwgJiYgaWQubGVuZ3RoID4gMCkKKwkJCQkJCQkJeworCQkJCQkJCQkJZWx0LnNldEF0dHJpYnV0ZSgnaWQnLCBpZCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBpbnRvOworCX07CisJCisJLy8gUmV0dXJucyB0aGUgY29kZWMgaW50byB0aGUgcmVnaXN0cnkKKwlyZXR1cm4gY29kZWM7CisKK30oKSk7CisKKy8qKgorICogVmFyaWFibGU6IGFsbG93RXZhbAorICogCisgKiBTdGF0aWMgZ2xvYmFsIHN3aXRjaCB0aGF0IHNwZWNpZmllcyBpZiB0aGUgdXNlIG9mIGV2YWwgaXMgYWxsb3dlZCBmb3IKKyAqIGV2YWx1YXRpbmcgdGV4dCBjb250ZW50LiBEZWZhdWx0IGlzIHRydWUuIFNldCB0aGlzIHRvIGZhbHNlIGlmIHN0eWxlc2hlZXRzCisgKiBtYXkgY29udGFpbiB1c2VyIGlucHV0CisgKi8KK214RGVmYXVsdFRvb2xiYXJDb2RlYy5hbGxvd0V2YWwgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214RWRpdG9yQ29kZWMuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaW8vbXhFZGl0b3JDb2RlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2NlNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214RWRpdG9yQ29kZWMuanMKQEAgLTAsMCArMSwyNDUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KK214Q29kZWNSZWdpc3RyeS5yZWdpc3RlcihmdW5jdGlvbigpCit7CisJLyoqCisJICogQ2xhc3M6IG14RWRpdG9yQ29kZWMKKwkgKgorCSAqIENvZGVjIGZvciA8bXhFZGl0b3I+cy4gVGhpcyBjbGFzcyBpcyBjcmVhdGVkIGFuZCByZWdpc3RlcmVkCisJICogZHluYW1pY2FsbHkgYXQgbG9hZCB0aW1lIGFuZCB1c2VkIGltcGxpY2l0ZWx5IHZpYSA8bXhDb2RlYz4KKwkgKiBhbmQgdGhlIDxteENvZGVjUmVnaXN0cnk+LgorCSAqCisJICogVHJhbnNpZW50IEZpZWxkczoKKwkgKgorCSAqIC0gbW9kaWZpZWQKKwkgKiAtIGxhc3RTbmFwc2hvdAorCSAqIC0gaWdub3JlZENoYW5nZXMKKwkgKiAtIHVuZG9NYW5hZ2VyCisJICogLSBncmFwaENvbnRhaW5lcgorCSAqIC0gdG9vbGJhckNvbnRhaW5lcgorCSAqLworCXZhciBjb2RlYyA9IG5ldyBteE9iamVjdENvZGVjKG5ldyBteEVkaXRvcigpLAorCQlbJ21vZGlmaWVkJywgJ2xhc3RTbmFwc2hvdCcsICdpZ25vcmVkQ2hhbmdlcycsCisJCSd1bmRvTWFuYWdlcicsICdncmFwaENvbnRhaW5lcicsICd0b29sYmFyQ29udGFpbmVyJ10pOworCisJLyoqCisJICogRnVuY3Rpb246IGJlZm9yZURlY29kZQorCSAqCisJICogRGVjb2RlcyB0aGUgdWktcGFydCBvZiB0aGUgY29uZmlndXJhdGlvbiBub2RlIGJ5IHJlYWRpbmcKKwkgKiBhIHNlcXVlbmNlIG9mIHRoZSBmb2xsb3dpbmcgY2hpbGQgbm9kZXMgYW5kIGF0dHJpYnV0ZXMKKwkgKiBhbmQgcGFzc2VzIHRoZSBjb250cm9sIHRvIHRoZSBkZWZhdWx0IGRlY29kaW5nIG1lY2hhbmlzbToKKwkgKgorCSAqIENoaWxkIE5vZGVzOgorCSAqCisJICogc3R5bGVzaGVldCAtIEFkZHMgYSBDU1Mgc3R5bGVzaGVldCB0byB0aGUgZG9jdW1lbnQuCisJICogcmVzb3VyY2UgLSBBZGRzIHRoZSBiYXNlbmFtZSBvZiBhIHJlc291cmNlIGJ1bmRsZS4KKwkgKiBhZGQgLSBDcmVhdGVzIG9yIGNvbmZpZ3VyZXMgYSBrbm93biBVSSBlbGVtZW50LgorCSAqCisJICogVGhlc2UgZWxlbWVudHMgbWF5IGFwcGVhciBpbiBhbnkgb3JkZXIgZ2l2ZW4gdGhhdCB0aGUKKwkgKiBncmFwaCBVSSBlbGVtZW50IGlzIGFkZGVkIGJlZm9yZSB0aGUgdG9vbGJhciBlbGVtZW50CisJICogKHNlZSBLbm93biBLZXlzKS4KKwkgKgorCSAqIEF0dHJpYnV0ZXM6CisJICoKKwkgKiBhcyAtIEtleSBmb3IgdGhlIFVJIGVsZW1lbnQgKHNlZSBiZWxvdykuCisJICogZWxlbWVudCAtIElEIGZvciB0aGUgZWxlbWVudCBpbiB0aGUgZG9jdW1lbnQuCisJICogc3R5bGUgLSBDU1Mgc3R5bGUgdG8gYmUgdXNlZCBmb3IgdGhlIGVsZW1lbnQgb3Igd2luZG93LgorCSAqIHggLSBYIGNvb3JkaW5hdGUgZm9yIHRoZSBuZXcgd2luZG93LgorCSAqIHkgLSBZIGNvb3JkaW5hdGUgZm9yIHRoZSBuZXcgd2luZG93LgorCSAqIHdpZHRoIC0gV2lkdGggZm9yIHRoZSBuZXcgd2luZG93LgorCSAqIGhlaWdodCAtIE9wdGlvbmFsIGhlaWdodCBmb3IgdGhlIG5ldyB3aW5kb3cuCisJICogbmFtZSAtIE5hbWUgb2YgdGhlIHN0eWxlc2hlZXQgKGFic29sdXRlL3JlbGF0aXZlIFVSTCkuCisJICogYmFzZW5hbWUgLSBCYXNlbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIChzZWUgPG14UmVzb3VyY2VzPikuCisJICoKKwkgKiBUaGUgeCwgeSwgd2lkdGggYW5kIGhlaWdodCBhdHRyaWJ1dGVzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldworCSAqIDxteFdpbmRvdz4gaWYgdGhlIGVsZW1lbnQgYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQgaW4gYW4gYWRkCisJICogbm9kZS4gVGhlIG5hbWUgYW5kIGJhc2VuYW1lIGFyZSBvbmx5IHVzZWQgaW4gdGhlIHN0eWxlc2hlZXQgYW5kCisJICogcmVzb3VyY2Ugbm9kZXMsIHJlc3BlY3RpdmVseS4KKwkgKgorCSAqIEtub3duIEtleXM6CisJICoKKwkgKiBncmFwaCAtIE1haW4gZ3JhcGggZWxlbWVudCAoc2VlIDxteEVkaXRvci5zZXRHcmFwaENvbnRhaW5lcj4pLgorCSAqIHRpdGxlIC0gVGl0bGUgZWxlbWVudCAoc2VlIDxteEVkaXRvci5zZXRUaXRsZUNvbnRhaW5lcj4pLgorCSAqIHRvb2xiYXIgLSBUb29sYmFyIGVsZW1lbnQgKHNlZSA8bXhFZGl0b3Iuc2V0VG9vbGJhckNvbnRhaW5lcj4pLgorCSAqIHN0YXR1cyAtIFN0YXR1cyBiYXIgZWxlbWVudCAoc2VlIDxteEVkaXRvci5zZXRTdGF0dXNDb250YWluZXI+KS4KKwkgKgorCSAqIEV4YW1wbGU6CisJICoKKwkgKiAoY29kZSkKKwkgKiA8dWk+CisJICogICA8c3R5bGVzaGVldCBuYW1lPSJjc3MvcHJvY2Vzcy5jc3MiLz4KKwkgKiAgIDxyZXNvdXJjZSBiYXNlbmFtZT0icmVzb3VyY2VzL2FwcCIvPgorCSAqICAgPGFkZCBhcz0iZ3JhcGgiIGVsZW1lbnQ9ImdyYXBoIgorCSAqICAgICBzdHlsZT0ibGVmdDo3MHB4O3JpZ2h0OjIwcHg7dG9wOjIwcHg7Ym90dG9tOjQwcHgiLz4KKwkgKiAgIDxhZGQgYXM9InN0YXR1cyIgZWxlbWVudD0ic3RhdHVzIi8+CisJICogICA8YWRkIGFzPSJ0b29sYmFyIiB4PSIxMCIgeT0iMjAiIHdpZHRoPSI1NCIvPgorCSAqIDwvdWk+CisJICogKGVuZCkKKwkgKi8KKwljb2RlYy5hZnRlckRlY29kZSA9IGZ1bmN0aW9uKGRlYywgbm9kZSwgb2JqKQorCXsKKwkJLy8gQXNzaWducyB0aGUgc3BlY2lmaWVkIHRlbXBsYXRlcyBmb3IgZWRnZXMKKwkJdmFyIGRlZmF1bHRFZGdlID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2RlZmF1bHRFZGdlJyk7CisJCQorCQlpZiAoZGVmYXVsdEVkZ2UgIT0gbnVsbCkKKwkJeworCQkJbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ2RlZmF1bHRFZGdlJyk7CisJCQlvYmouZGVmYXVsdEVkZ2UgPSBvYmoudGVtcGxhdGVzW2RlZmF1bHRFZGdlXTsKKwkJfQorCisJCS8vIEFzc2lnbnMgdGhlIHNwZWNpZmllZCB0ZW1wbGF0ZXMgZm9yIGdyb3VwcworCQl2YXIgZGVmYXVsdEdyb3VwID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2RlZmF1bHRHcm91cCcpOworCQkKKwkJaWYgKGRlZmF1bHRHcm91cCAhPSBudWxsKQorCQl7CisJCQlub2RlLnJlbW92ZUF0dHJpYnV0ZSgnZGVmYXVsdEdyb3VwJyk7CisJCQlvYmouZGVmYXVsdEdyb3VwID0gb2JqLnRlbXBsYXRlc1tkZWZhdWx0R3JvdXBdOworCQl9CisKKwkJcmV0dXJuIG9iajsKKwl9OworCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBkZWNvZGVDaGlsZAorCSAqIAorCSAqIE92ZXJyaWRlcyBkZWNvZGUgY2hpbGQgdG8gaGFuZGxlIHNwZWNpYWwgY2hpbGQgbm9kZXMuCisJICovCQorCWNvZGVjLmRlY29kZUNoaWxkID0gZnVuY3Rpb24oZGVjLCBjaGlsZCwgb2JqKQorCXsKKwkJaWYgKGNoaWxkLm5vZGVOYW1lID09ICdBcnJheScpCisJCXsKKwkJCXZhciByb2xlID0gY2hpbGQuZ2V0QXR0cmlidXRlKCdhcycpOworCQkJCisJCQlpZiAocm9sZSA9PSAndGVtcGxhdGVzJykKKwkJCXsKKwkJCQl0aGlzLmRlY29kZVRlbXBsYXRlcyhkZWMsIGNoaWxkLCBvYmopOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChjaGlsZC5ub2RlTmFtZSA9PSAndWknKQorCQl7CisJCQl0aGlzLmRlY29kZVVpKGRlYywgY2hpbGQsIG9iaik7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCW14T2JqZWN0Q29kZWMucHJvdG90eXBlLmRlY29kZUNoaWxkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfTsKKwkJCisJLyoqCisJICogRnVuY3Rpb246IGRlY29kZVRlbXBsYXRlcworCSAqCisJICogRGVjb2RlcyB0aGUgY2VsbHMgZnJvbSB0aGUgZ2l2ZW4gbm9kZSBhcyB0ZW1wbGF0ZXMuCisJICovCisJY29kZWMuZGVjb2RlVWkgPSBmdW5jdGlvbihkZWMsIG5vZGUsIGVkaXRvcikKKwl7CisJCXZhciB0bXAgPSBub2RlLmZpcnN0Q2hpbGQ7CisJCXdoaWxlICh0bXAgIT0gbnVsbCkKKwkJeworCQkJaWYgKHRtcC5ub2RlTmFtZSA9PSAnYWRkJykKKwkJCXsKKwkJCQl2YXIgYXMgPSB0bXAuZ2V0QXR0cmlidXRlKCdhcycpOworCQkJCXZhciBlbHQgPSB0bXAuZ2V0QXR0cmlidXRlKCdlbGVtZW50Jyk7CisJCQkJdmFyIHN0eWxlID0gdG1wLmdldEF0dHJpYnV0ZSgnc3R5bGUnKTsKKwkJCQl2YXIgZWxlbWVudCA9IG51bGw7CisKKwkJCQlpZiAoZWx0ICE9IG51bGwpCisJCQkJeworCQkJCQllbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWx0KTsKKwkJCQkJCisJCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgc3R5bGUgIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJZWxlbWVudC5zdHlsZS5jc3NUZXh0ICs9ICc7JyArIHN0eWxlOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXZhciB4ID0gcGFyc2VJbnQodG1wLmdldEF0dHJpYnV0ZSgneCcpKTsKKwkJCQkJdmFyIHkgPSBwYXJzZUludCh0bXAuZ2V0QXR0cmlidXRlKCd5JykpOworCQkJCQl2YXIgd2lkdGggPSB0bXAuZ2V0QXR0cmlidXRlKCd3aWR0aCcpOworCQkJCQl2YXIgaGVpZ2h0ID0gdG1wLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7CisKKwkJCQkJLy8gQ3JlYXRlcyBhIG5ldyB3aW5kb3cgYXJvdW5kIHRoZSBlbGVtZW50CisJCQkJCWVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKwkJCQkJZWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gc3R5bGU7CisJCQkJCQorCQkJCQl2YXIgd25kID0gbmV3IG14V2luZG93KG14UmVzb3VyY2VzLmdldChhcykgfHwgYXMsCisJCQkJCQllbGVtZW50LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmYWxzZSwgdHJ1ZSk7CisJCQkJCXduZC5zZXRWaXNpYmxlKHRydWUpOworCQkJCX0KKwkJCQkKKwkJCQkvLyBUT0RPOiBNYWtlIG1vcmUgZ2VuZXJpYworCQkJCWlmIChhcyA9PSAnZ3JhcGgnKQorCQkJCXsKKwkJCQkJZWRpdG9yLnNldEdyYXBoQ29udGFpbmVyKGVsZW1lbnQpOworCQkJCX0KKwkJCQllbHNlIGlmIChhcyA9PSAndG9vbGJhcicpCisJCQkJeworCQkJCQllZGl0b3Iuc2V0VG9vbGJhckNvbnRhaW5lcihlbGVtZW50KTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoYXMgPT0gJ3RpdGxlJykKKwkJCQl7CisJCQkJCWVkaXRvci5zZXRUaXRsZUNvbnRhaW5lcihlbGVtZW50KTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoYXMgPT0gJ3N0YXR1cycpCisJCQkJeworCQkJCQllZGl0b3Iuc2V0U3RhdHVzQ29udGFpbmVyKGVsZW1lbnQpOworCQkJCX0KKwkJCQllbHNlIGlmIChhcyA9PSAnbWFwJykKKwkJCQl7CisJCQkJCWVkaXRvci5zZXRNYXBDb250YWluZXIoZWxlbWVudCk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAodG1wLm5vZGVOYW1lID09ICdyZXNvdXJjZScpCisJCQl7CisJCQkJbXhSZXNvdXJjZXMuYWRkKHRtcC5nZXRBdHRyaWJ1dGUoJ2Jhc2VuYW1lJykpOworCQkJfQorCQkJZWxzZSBpZiAodG1wLm5vZGVOYW1lID09ICdzdHlsZXNoZWV0JykKKwkJCXsKKwkJCQlteENsaWVudC5saW5rKCdzdHlsZXNoZWV0JywgdG1wLmdldEF0dHJpYnV0ZSgnbmFtZScpKTsKKwkJCX0KKwkJCQorCQkJdG1wID0gdG1wLm5leHRTaWJsaW5nOworCQl9CQorCX07CisJCisJLyoqCisJICogRnVuY3Rpb246IGRlY29kZVRlbXBsYXRlcworCSAqCisJICogRGVjb2RlcyB0aGUgY2VsbHMgZnJvbSB0aGUgZ2l2ZW4gbm9kZSBhcyB0ZW1wbGF0ZXMuCisJICovCisJY29kZWMuZGVjb2RlVGVtcGxhdGVzID0gZnVuY3Rpb24oZGVjLCBub2RlLCBlZGl0b3IpCisJeworCQlpZiAoZWRpdG9yLnRlbXBsYXRlcyA9PSBudWxsKQorCQl7CisJCQllZGl0b3IudGVtcGxhdGVzID0gW107CisJCX0KKwkJCisJCXZhciBjaGlsZHJlbiA9IG14VXRpbHMuZ2V0Q2hpbGROb2Rlcyhub2RlKTsKKwkJZm9yICh2YXIgaj0wOyBqPGNoaWxkcmVuLmxlbmd0aDsgaisrKQorCQl7CisJCQl2YXIgbmFtZSA9IGNoaWxkcmVuW2pdLmdldEF0dHJpYnV0ZSgnYXMnKTsKKwkJCXZhciBjaGlsZCA9IGNoaWxkcmVuW2pdLmZpcnN0Q2hpbGQ7CisJCQkKKwkJCXdoaWxlIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLm5vZGVUeXBlICE9IDEpCisJCQl7CisJCQkJY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZzsKKwkJCX0KKwkJCQorCQkJaWYgKGNoaWxkICE9IG51bGwpCisJCQl7CisJCQkJLy8gTEFURVI6IE9ubHkgc2luZ2xlIGNlbGxzIG1lYW5zIHlvdSBuZWVkCisJCQkJLy8gdG8gZ3JvdXAgbXVsdGlwbGUgY2VsbHMgd2l0aGluIGFub3RoZXIKKwkJCQkvLyBjZWxsLiBUaGlzIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHN1cHBvcnQKKwkJCQkvLyBhcnJheXMgb2YgY2VsbHMsIG9yIHRoZSB3cmFwcGVyIG11c3QKKwkJCQkvLyBiZSBhdXRvbWF0aWNhbGx5IGhhbmRsZWQgaW4gdGhpcyBjbGFzcy4KKwkJCQllZGl0b3IudGVtcGxhdGVzW25hbWVdID0gZGVjLmRlY29kZUNlbGwoY2hpbGQpOworCQkJfQorCQl9CisJfTsKKwkKKwkvLyBSZXR1cm5zIHRoZSBjb2RlYyBpbnRvIHRoZSByZWdpc3RyeQorCXJldHVybiBjb2RlYzsKKworfSgpKTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teEdlbmVyaWNDaGFuZ2VDb2RlYy5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teEdlbmVyaWNDaGFuZ2VDb2RlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNjODJhCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214R2VuZXJpY0NoYW5nZUNvZGVjLmpzCkBAIC0wLDAgKzEsNjQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14R2VuZXJpY0NoYW5nZUNvZGVjCisgKgorICogQ29kZWMgZm9yIDxteFZhbHVlQ2hhbmdlPnMsIDxteFN0eWxlQ2hhbmdlPnMsIDxteEdlb21ldHJ5Q2hhbmdlPnMsCisgKiA8bXhDb2xsYXBzZUNoYW5nZT5zIGFuZCA8bXhWaXNpYmxlQ2hhbmdlPnMuIFRoaXMgY2xhc3MgaXMgY3JlYXRlZAorICogYW5kIHJlZ2lzdGVyZWQgZHluYW1pY2FsbHkgYXQgbG9hZCB0aW1lIGFuZCB1c2VkIGltcGxpY2l0ZWx5CisgKiB2aWEgPG14Q29kZWM+IGFuZCB0aGUgPG14Q29kZWNSZWdpc3RyeT4uCisgKgorICogVHJhbnNpZW50IEZpZWxkczoKKyAqCisgKiAtIG1vZGVsCisgKiAtIHByZXZpb3VzCisgKgorICogUmVmZXJlbmNlIEZpZWxkczoKKyAqCisgKiAtIGNlbGwKKyAqIAorICogQ29uc3RydWN0b3I6IG14R2VuZXJpY0NoYW5nZUNvZGVjCisgKgorICogRmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSA8bXhPYmplY3RDb2RlYz4gZm9yCisgKiB0aGUgc3BlY2lmaWVkIGNoYW5nZSBhbmQgZmllbGRuYW1lLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogb2JqIC0gQW4gaW5zdGFuY2Ugb2YgdGhlIGNoYW5nZSBvYmplY3QuCisgKiB2YXJpYWJsZSAtIFRoZSBmaWVsZG5hbWUgZm9yIHRoZSBjaGFuZ2UgZGF0YS4KKyAqLwordmFyIG14R2VuZXJpY0NoYW5nZUNvZGVjID0gZnVuY3Rpb24ob2JqLCB2YXJpYWJsZSkKK3sKKwl2YXIgY29kZWMgPSBuZXcgbXhPYmplY3RDb2RlYyhvYmosICBbJ21vZGVsJywgJ3ByZXZpb3VzJ10sIFsnY2VsbCddKTsKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBhZnRlckRlY29kZQorCSAqCisJICogUmVzdG9yZXMgdGhlIHN0YXRlIGJ5IGFzc2lnbmluZyB0aGUgcHJldmlvdXMgdmFsdWUuCisJICovCisJY29kZWMuYWZ0ZXJEZWNvZGUgPSBmdW5jdGlvbihkZWMsIG5vZGUsIG9iaikKKwl7CisJCS8vIEFsbG93cyBmb3J3YXJkIHJlZmVyZW5jZXMgaW4gc2Vzc2lvbnMuIFRoaXMgaXMgYSB3b3JrYXJvdW5kCisJCS8vIGZvciB0aGUgc2VxdWVuY2Ugb2YgZWRpdHMgaW4gbXhHcmFwaC5tb3ZlQ2VsbHMgYW5kIGNlbGxzQWRkZWQuCisJCWlmIChteFV0aWxzLmlzTm9kZShvYmouY2VsbCkpCisJCXsKKwkJCW9iai5jZWxsID0gZGVjLmRlY29kZUNlbGwob2JqLmNlbGwsIGZhbHNlKTsKKwkJfQorCisJCW9iai5wcmV2aW91cyA9IG9ialt2YXJpYWJsZV07CisKKwkJcmV0dXJuIG9iajsKKwl9OworCQorCXJldHVybiBjb2RlYzsKK307CisKKy8vIFJlZ2lzdGVycyB0aGUgY29kZWNzCitteENvZGVjUmVnaXN0cnkucmVnaXN0ZXIobXhHZW5lcmljQ2hhbmdlQ29kZWMobmV3IG14VmFsdWVDaGFuZ2UoKSwgJ3ZhbHVlJykpOworbXhDb2RlY1JlZ2lzdHJ5LnJlZ2lzdGVyKG14R2VuZXJpY0NoYW5nZUNvZGVjKG5ldyBteFN0eWxlQ2hhbmdlKCksICdzdHlsZScpKTsKK214Q29kZWNSZWdpc3RyeS5yZWdpc3RlcihteEdlbmVyaWNDaGFuZ2VDb2RlYyhuZXcgbXhHZW9tZXRyeUNoYW5nZSgpLCAnZ2VvbWV0cnknKSk7CitteENvZGVjUmVnaXN0cnkucmVnaXN0ZXIobXhHZW5lcmljQ2hhbmdlQ29kZWMobmV3IG14Q29sbGFwc2VDaGFuZ2UoKSwgJ2NvbGxhcHNlZCcpKTsKK214Q29kZWNSZWdpc3RyeS5yZWdpc3RlcihteEdlbmVyaWNDaGFuZ2VDb2RlYyhuZXcgbXhWaXNpYmxlQ2hhbmdlKCksICd2aXNpYmxlJykpOworbXhDb2RlY1JlZ2lzdHJ5LnJlZ2lzdGVyKG14R2VuZXJpY0NoYW5nZUNvZGVjKG5ldyBteENlbGxBdHRyaWJ1dGVDaGFuZ2UoKSwgJ3ZhbHVlJykpOwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214R3JhcGhDb2RlYy5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teEdyYXBoQ29kZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNlN2E1NgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teEdyYXBoQ29kZWMuanMKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworbXhDb2RlY1JlZ2lzdHJ5LnJlZ2lzdGVyKGZ1bmN0aW9uKCkKK3sKKwkvKioKKwkgKiBDbGFzczogbXhHcmFwaENvZGVjCisJICoKKwkgKiBDb2RlYyBmb3IgPG14R3JhcGg+cy4gVGhpcyBjbGFzcyBpcyBjcmVhdGVkIGFuZCByZWdpc3RlcmVkCisJICogZHluYW1pY2FsbHkgYXQgbG9hZCB0aW1lIGFuZCB1c2VkIGltcGxpY2l0ZWx5IHZpYSA8bXhDb2RlYz4KKwkgKiBhbmQgdGhlIDxteENvZGVjUmVnaXN0cnk+LgorCSAqCisJICogVHJhbnNpZW50IEZpZWxkczoKKwkgKgorCSAqIC0gZ3JhcGhMaXN0ZW5lcnMKKwkgKiAtIGV2ZW50TGlzdGVuZXJzCisJICogLSB2aWV3CisJICogLSBjb250YWluZXIKKwkgKiAtIGNlbGxSZW5kZXJlcgorCSAqIC0gZWRpdG9yCisJICogLSBzZWxlY3Rpb24KKwkgKi8KKwlyZXR1cm4gbmV3IG14T2JqZWN0Q29kZWMobmV3IG14R3JhcGgoKSwKKwkJWydncmFwaExpc3RlbmVycycsICdldmVudExpc3RlbmVycycsICd2aWV3JywgJ2NvbnRhaW5lcicsCisJCSdjZWxsUmVuZGVyZXInLCAnZWRpdG9yJywgJ3NlbGVjdGlvbiddKTsKKworfSgpKTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teEdyYXBoVmlld0NvZGVjLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214R3JhcGhWaWV3Q29kZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwMjNkZQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teEdyYXBoVmlld0NvZGVjLmpzCkBAIC0wLDAgKzEsMTk3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCitteENvZGVjUmVnaXN0cnkucmVnaXN0ZXIoZnVuY3Rpb24oKQoreworCS8qKgorCSAqIENsYXNzOiBteEdyYXBoVmlld0NvZGVjCisJICoKKwkgKiBDdXN0b20gZW5jb2RlciBmb3IgPG14R3JhcGhWaWV3PnMuIFRoaXMgY2xhc3MgaXMgY3JlYXRlZAorCSAqIGFuZCByZWdpc3RlcmVkIGR5bmFtaWNhbGx5IGF0IGxvYWQgdGltZSBhbmQgdXNlZCBpbXBsaWNpdGVseSB2aWEKKwkgKiA8bXhDb2RlYz4gYW5kIHRoZSA8bXhDb2RlY1JlZ2lzdHJ5Pi4gVGhpcyBjb2RlYyBvbmx5IHdyaXRlcyB2aWV3cworCSAqIGludG8gYSBYTUwgZm9ybWF0IHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGltYWdlIGZvcgorCSAqIHRoZSBncmFwaCwgdGhhdCBpcywgaXQgY29udGFpbnMgYWJzb2x1dGUgY29vcmRpbmF0ZXMgd2l0aAorCSAqIGNvbXB1dGVkIHBlcmltZXRlcnMsIGVkZ2Ugc3R5bGVzIGFuZCBjZWxsIHN0eWxlcy4KKwkgKi8KKwl2YXIgY29kZWMgPSBuZXcgbXhPYmplY3RDb2RlYyhuZXcgbXhHcmFwaFZpZXcoKSk7CisKKwkvKioKKwkgKiBGdW5jdGlvbjogZW5jb2RlCisJICoKKwkgKiBFbmNvZGVzIHRoZSBnaXZlbiA8bXhHcmFwaFZpZXc+IHVzaW5nIDxlbmNvZGVDZWxsPgorCSAqIHN0YXJ0aW5nIGF0IHRoZSBtb2RlbCdzIHJvb3QuIFRoaXMgcmV0dXJucyB0aGUKKwkgKiB0b3AtbGV2ZWwgZ3JhcGggbm9kZSBvZiB0aGUgcmVjdXJzaXZlIGVuY29kaW5nLgorCSAqLworCWNvZGVjLmVuY29kZSA9IGZ1bmN0aW9uKGVuYywgdmlldykKKwl7CisJCXJldHVybiB0aGlzLmVuY29kZUNlbGwoZW5jLCB2aWV3LAorCQkJdmlldy5ncmFwaC5nZXRNb2RlbCgpLmdldFJvb3QoKSk7CisJfTsKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBlbmNvZGVDZWxsCisJICoKKwkgKiBSZWN1cnNpdmVseSBlbmNvZGVzIHRoZSBzcGVjaWZlZCBjZWxsLiBVc2VzIGxheWVyCisJICogYXMgdGhlIGRlZmF1bHQgbm9kZW5hbWUuIElmIHRoZSBjZWxsJ3MgcGFyZW50IGlzCisJICogbnVsbCwgdGhlbiBncmFwaCBpcyB1c2VkIGZvciB0aGUgbm9kZW5hbWUuIElmCisJICogPG14R3JhcGhNb2RlbC5pc0VkZ2U+IHJldHVybnMgdHJ1ZSBmb3IgdGhlIGNlbGwsCisJICogdGhlbiBlZGdlIGlzIHVzZWQgZm9yIHRoZSBub2RlbmFtZSwgZWxzZSBpZgorCSAqIDxteEdyYXBoTW9kZWwuaXNWZXJ0ZXg+IHJldHVybnMgdHJ1ZSBmb3IgdGhlIGNlbGwsCisJICogdGhlbiB2ZXJ0ZXggaXMgdXNlZCBmb3IgdGhlIG5vZGVuYW1lLgorCSAqCisJICogPG14R3JhcGguZ2V0TGFiZWw+IGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBsYWJlbAorCSAqIGF0dHJpYnV0ZSBmb3IgdGhlIGNlbGwuIEZvciBncmFwaCBub2RlcyBhbmQgdmVydGljZXMKKwkgKiB0aGUgYm91bmRzIGFyZSBlbmNvZGVkIGludG8geCwgeSwgd2lkdGggYW5kIGhlaWdodC4KKwkgKiBGb3IgZWRnZXMgdGhlIHBvaW50cyBhcmUgZW5jb2RlZCBpbnRvIGEgcG9pbnRzCisJICogYXR0cmlidXRlIGFzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgY29tbWEtc2VwYXJhdGVkCisJICogY29vcmRpbmF0ZSBwYWlycyAoZWcuIHgwLHkwIHgxLHkxIC4uLiB4bix5bikuIEFsbAorCSAqIHZhbHVlcyBmcm9tIHRoZSBjZWxsIHN0eWxlIGFyZSBhZGRlZCBhcyBhdHRyaWJ1dGUKKwkgKiB2YWx1ZXMgdG8gdGhlIG5vZGUuIAorCSAqLworCWNvZGVjLmVuY29kZUNlbGwgPSBmdW5jdGlvbihlbmMsIHZpZXcsIGNlbGwpCisJeworCQl2YXIgbW9kZWwgPSB2aWV3LmdyYXBoLmdldE1vZGVsKCk7CisJCXZhciBzdGF0ZSA9IHZpZXcuZ2V0U3RhdGUoY2VsbCk7CisJCXZhciBwYXJlbnQgPSBtb2RlbC5nZXRQYXJlbnQoY2VsbCk7CisJCQorCQlpZiAocGFyZW50ID09IG51bGwgfHwgc3RhdGUgIT0gbnVsbCkKKwkJeworCQkJdmFyIGNoaWxkQ291bnQgPSBtb2RlbC5nZXRDaGlsZENvdW50KGNlbGwpOworCQkJdmFyIGdlbyA9IHZpZXcuZ3JhcGguZ2V0Q2VsbEdlb21ldHJ5KGNlbGwpOworCQkJdmFyIG5hbWUgPSBudWxsOworCQkJCisJCQlpZiAocGFyZW50ID09IG1vZGVsLmdldFJvb3QoKSkKKwkJCXsKKwkJCQluYW1lID0gJ2xheWVyJzsKKwkJCX0KKwkJCWVsc2UgaWYgKHBhcmVudCA9PSBudWxsKQorCQkJeworCQkJCW5hbWUgPSAnZ3JhcGgnOworCQkJfQorCQkJZWxzZSBpZiAobW9kZWwuaXNFZGdlKGNlbGwpKQorCQkJeworCQkJCW5hbWUgPSAnZWRnZSc7CisJCQl9CisJCQllbHNlIGlmIChjaGlsZENvdW50ID4gMCAmJiBnZW8gIT0gbnVsbCkKKwkJCXsKKwkJCQluYW1lID0gJ2dyb3VwJzsKKwkJCX0KKwkJCWVsc2UgaWYgKG1vZGVsLmlzVmVydGV4KGNlbGwpKQorCQkJeworCQkJCW5hbWUgPSAndmVydGV4JzsKKwkJCX0KKwkJCQorCQkJaWYgKG5hbWUgIT0gbnVsbCkKKwkJCXsKKwkJCQl2YXIgbm9kZSA9IGVuYy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpOworCQkJCXZhciBsYWIgPSB2aWV3LmdyYXBoLmdldExhYmVsKGNlbGwpOworCQkJCQorCQkJCWlmIChsYWIgIT0gbnVsbCkKKwkJCQl7CisJCQkJCW5vZGUuc2V0QXR0cmlidXRlKCdsYWJlbCcsIHZpZXcuZ3JhcGguZ2V0TGFiZWwoY2VsbCkpOworCQkJCQkKKwkJCQkJaWYgKHZpZXcuZ3JhcGguaXNIdG1sTGFiZWwoY2VsbCkpCisJCQkJCXsKKwkJCQkJCW5vZGUuc2V0QXR0cmlidXRlKCdodG1sJywgdHJ1ZSk7CisJCQkJCX0KKwkJCQl9CisJCQorCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkKKwkJCQl7CisJCQkJCXZhciBib3VuZHMgPSB2aWV3LmdldEdyYXBoQm91bmRzKCk7CisJCQkJCQorCQkJCQlpZiAoYm91bmRzICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCW5vZGUuc2V0QXR0cmlidXRlKCd4JywgTWF0aC5yb3VuZChib3VuZHMueCkpOworCQkJCQkJbm9kZS5zZXRBdHRyaWJ1dGUoJ3knLCBNYXRoLnJvdW5kKGJvdW5kcy55KSk7CisJCQkJCQlub2RlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBNYXRoLnJvdW5kKGJvdW5kcy53aWR0aCkpOworCQkJCQkJbm9kZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIE1hdGgucm91bmQoYm91bmRzLmhlaWdodCkpOworCQkJCQl9CisJCQkJCQorCQkJCQlub2RlLnNldEF0dHJpYnV0ZSgnc2NhbGUnLCB2aWV3LnNjYWxlKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoc3RhdGUgIT0gbnVsbCAmJiBnZW8gIT0gbnVsbCkKKwkJCQl7CisJCQkJCS8vIFdyaXRlcyBlYWNoIGtleSwgdmFsdWUgaW4gdGhlIHN0eWxlIHBhaXIgdG8gYW4gYXR0cmlidXRlCisJCQkJICAgIGZvciAodmFyIGkgaW4gc3RhdGUuc3R5bGUpCisJCQkJICAgIHsKKwkJCQkgICAgCXZhciB2YWx1ZSA9IHN0YXRlLnN0eWxlW2ldOworCQkKKwkJCQkgICAgCS8vIFRyaWVzIHRvIHR1cm4gb2JqZWN0cyBhbmQgZnVuY3Rpb25zIGludG8gc3RyaW5ncworCQkJCQkgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gJ2Z1bmN0aW9uJyAmJgorCQkJCQkJCXR5cGVvZih2YWx1ZSkgPT0gJ29iamVjdCcpCisJCQkJCQl7CisJCQkJCSAgICAJdmFsdWUgPSBteFN0eWxlUmVnaXN0cnkuZ2V0TmFtZSh2YWx1ZSk7CisJCQkJICAgICAgICB9CisJCQkJICAgIAkKKwkJCQkgICAgCWlmICh2YWx1ZSAhPSBudWxsICYmCisJCQkJICAgIAkJdHlwZW9mKHZhbHVlKSAhPSAnZnVuY3Rpb24nICYmCisJCQkJCQkJdHlwZW9mKHZhbHVlKSAhPSAnb2JqZWN0JykKKwkJCQkJCXsKKwkJCQkJCQlub2RlLnNldEF0dHJpYnV0ZShpLCB2YWx1ZSk7CisJCQkJICAgICAgICB9CisJCQkJICAgIH0KKwkJCQkgICAgCisJCQkJCXZhciBhYnMgPSBzdGF0ZS5hYnNvbHV0ZVBvaW50czsKKwkJCQkJCisJCQkJCS8vIFdyaXRlcyB0aGUgbGlzdCBvZiBwb2ludHMgaW50byBvbmUgYXR0cmlidXRlCisJCQkJCWlmIChhYnMgIT0gbnVsbCAmJiBhYnMubGVuZ3RoID4gMCkKKwkJCQkJeworCQkJCQkJdmFyIHB0cyA9IE1hdGgucm91bmQoYWJzWzBdLngpICsgJywnICsgTWF0aC5yb3VuZChhYnNbMF0ueSk7CisJCQorCQkJCQkJZm9yICh2YXIgaT0xOyBpPGFicy5sZW5ndGg7IGkrKykKKwkJCQkJCXsKKwkJCQkJCQlwdHMgKz0gJyAnICsgTWF0aC5yb3VuZChhYnNbaV0ueCkgKyAnLCcgKworCQkJCQkJCQlNYXRoLnJvdW5kKGFic1tpXS55KTsKKwkJCQkJCX0KKwkJCisJCQkJCQlub2RlLnNldEF0dHJpYnV0ZSgncG9pbnRzJywgcHRzKTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJLy8gV3JpdGVzIHRoZSBib3VuZHMgaW50byA0IGF0dHJpYnV0ZXMKKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlub2RlLnNldEF0dHJpYnV0ZSgneCcsIE1hdGgucm91bmQoc3RhdGUueCkpOworCQkJCQkJbm9kZS5zZXRBdHRyaWJ1dGUoJ3knLCBNYXRoLnJvdW5kKHN0YXRlLnkpKTsKKwkJCQkJCW5vZGUuc2V0QXR0cmlidXRlKCd3aWR0aCcsIE1hdGgucm91bmQoc3RhdGUud2lkdGgpKTsKKwkJCQkJCW5vZGUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBNYXRoLnJvdW5kKHN0YXRlLmhlaWdodCkpOwkJCQkKKwkJCQkJfQorCQkKKwkJCQkJdmFyIG9mZnNldCA9IHN0YXRlLmFic29sdXRlT2Zmc2V0OworCQkJCQkKKwkJCQkJLy8gV3JpdGVzIHRoZSBvZmZzZXQgaW50byAyIGF0dHJpYnV0ZXMKKwkJCQkJaWYgKG9mZnNldCAhPSBudWxsKQorCQkJCQl7CisJCQkJCQlpZiAob2Zmc2V0LnggIT0gMCkKKwkJCQkJCXsKKwkJCQkJCQlub2RlLnNldEF0dHJpYnV0ZSgnZHgnLCBNYXRoLnJvdW5kKG9mZnNldC54KSk7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWlmIChvZmZzZXQueSAhPSAwKQorCQkJCQkJeworCQkJCQkJCW5vZGUuc2V0QXR0cmlidXRlKCdkeScsIE1hdGgucm91bmQob2Zmc2V0LnkpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCisJCQkJZm9yICh2YXIgaT0wOyBpPGNoaWxkQ291bnQ7IGkrKykKKwkJCQl7CisJCQkJCXZhciBjaGlsZE5vZGUgPSB0aGlzLmVuY29kZUNlbGwoZW5jLAorCQkJCQkJCXZpZXcsIG1vZGVsLmdldENoaWxkQXQoY2VsbCwgaSkpOworCQkJCQkKKwkJCQkJaWYgKGNoaWxkTm9kZSAhPSBudWxsKQorCQkJCQl7CisJCQkJCQlub2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBub2RlOworCX07CisKKwkvLyBSZXR1cm5zIHRoZSBjb2RlYyBpbnRvIHRoZSByZWdpc3RyeQorCXJldHVybiBjb2RlYzsKKworfSgpKTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teE1vZGVsQ29kZWMuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaW8vbXhNb2RlbENvZGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZWM0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaW8vbXhNb2RlbENvZGVjLmpzCkBAIC0wLDAgKzEsODAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KK214Q29kZWNSZWdpc3RyeS5yZWdpc3RlcihmdW5jdGlvbigpCit7CisJLyoqCisJICogQ2xhc3M6IG14TW9kZWxDb2RlYworCSAqCisJICogQ29kZWMgZm9yIDxteEdyYXBoTW9kZWw+cy4gVGhpcyBjbGFzcyBpcyBjcmVhdGVkIGFuZCByZWdpc3RlcmVkCisJICogZHluYW1pY2FsbHkgYXQgbG9hZCB0aW1lIGFuZCB1c2VkIGltcGxpY2l0ZWx5IHZpYSA8bXhDb2RlYz4KKwkgKiBhbmQgdGhlIDxteENvZGVjUmVnaXN0cnk+LgorCSAqLworCXZhciBjb2RlYyA9IG5ldyBteE9iamVjdENvZGVjKG5ldyBteEdyYXBoTW9kZWwoKSk7CisKKwkvKioKKwkgKiBGdW5jdGlvbjogZW5jb2RlT2JqZWN0CisJICoKKwkgKiBFbmNvZGVzIHRoZSBnaXZlbiA8bXhHcmFwaE1vZGVsPiBieSB3cml0aW5nIGEgKGZsYXQpIFhNTCBzZXF1ZW5jZSBvZgorCSAqIGNlbGwgbm9kZXMgYXMgcHJvZHVjZWQgYnkgdGhlIDxteENlbGxDb2RlYz4uIFRoZSBzZXF1ZW5jZSBpcworCSAqIHdyYXBwZWQtdXAgaW4gYSBub2RlIHdpdGggdGhlIG5hbWUgcm9vdC4KKwkgKi8KKwljb2RlYy5lbmNvZGVPYmplY3QgPSBmdW5jdGlvbihlbmMsIG9iaiwgbm9kZSkKKwl7CisJCXZhciByb290Tm9kZSA9IGVuYy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdyb290Jyk7CisJCWVuYy5lbmNvZGVDZWxsKG9iai5nZXRSb290KCksIHJvb3ROb2RlKTsKKwkJbm9kZS5hcHBlbmRDaGlsZChyb290Tm9kZSk7CisJfTsKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBkZWNvZGVDaGlsZAorCSAqIAorCSAqIE92ZXJyaWRlcyBkZWNvZGUgY2hpbGQgdG8gaGFuZGxlIHNwZWNpYWwgY2hpbGQgbm9kZXMuCisJICovCQorCWNvZGVjLmRlY29kZUNoaWxkID0gZnVuY3Rpb24oZGVjLCBjaGlsZCwgb2JqKQorCXsKKwkJaWYgKGNoaWxkLm5vZGVOYW1lID09ICdyb290JykKKwkJeworCQkJdGhpcy5kZWNvZGVSb290KGRlYywgY2hpbGQsIG9iaik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlteE9iamVjdENvZGVjLnByb3RvdHlwZS5kZWNvZGVDaGlsZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQl9CisJfTsKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBkZWNvZGVSb290CisJICoKKwkgKiBSZWFkcyB0aGUgY2VsbHMgaW50byB0aGUgZ3JhcGggbW9kZWwuIEFsbCBjZWxscworCSAqIGFyZSBjaGlsZHJlbiBvZiB0aGUgcm9vdCBlbGVtZW50IGluIHRoZSBub2RlLgorCSAqLworCWNvZGVjLmRlY29kZVJvb3QgPSBmdW5jdGlvbihkZWMsIHJvb3QsIG1vZGVsKQorCXsKKwkJdmFyIHJvb3RDZWxsID0gbnVsbDsKKwkJdmFyIHRtcCA9IHJvb3QuZmlyc3RDaGlsZDsKKwkJCisJCXdoaWxlICh0bXAgIT0gbnVsbCkKKwkJeworCQkJdmFyIGNlbGwgPSBkZWMuZGVjb2RlQ2VsbCh0bXApOworCQkJCisJCQlpZiAoY2VsbCAhPSBudWxsICYmIGNlbGwuZ2V0UGFyZW50KCkgPT0gbnVsbCkKKwkJCXsKKwkJCQlyb290Q2VsbCA9IGNlbGw7CisJCQl9CisJCQkKKwkJCXRtcCA9IHRtcC5uZXh0U2libGluZzsKKwkJfQorCisJCS8vIFNldHMgdGhlIHJvb3Qgb24gdGhlIG1vZGVsIGlmIG9uZSBoYXMgYmVlbiBkZWNvZGVkCisJCWlmIChyb290Q2VsbCAhPSBudWxsKQorCQl7CisJCQltb2RlbC5zZXRSb290KHJvb3RDZWxsKTsKKwkJfQorCX07CisKKwkvLyBSZXR1cm5zIHRoZSBjb2RlYyBpbnRvIHRoZSByZWdpc3RyeQorCXJldHVybiBjb2RlYzsKKworfSgpKTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teE9iamVjdENvZGVjLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214T2JqZWN0Q29kZWMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2OTMxOAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teE9iamVjdENvZGVjLmpzCkBAIC0wLDAgKzEsMTA3NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhPYmplY3RDb2RlYworICoKKyAqIEdlbmVyaWMgY29kZWMgZm9yIEphdmFTY3JpcHQgb2JqZWN0cyB0aGF0IGltcGxlbWVudHMgYSBtYXBwaW5nIGJldHdlZW4KKyAqIEphdmFTY3JpcHQgb2JqZWN0cyBhbmQgWE1MIG5vZGVzIHRoYXQgbWFwcyBlYWNoIGZpZWxkIG9yIGVsZW1lbnQgdG8gYW4KKyAqIGF0dHJpYnV0ZSBvciBjaGlsZCBub2RlLCBhbmQgdmljZSB2ZXJzYS4KKyAqIAorICogQXRvbWljIFZhbHVlczoKKyAqIAorICogQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlLgorICogCisgKiAoY29kZSkKKyAqIHZhciBvYmogPSBuZXcgT2JqZWN0KCk7CisgKiBvYmouZm9vID0gIkZvbyI7CisgKiBvYmouYmFyID0gIkJhciI7CisgKiAoZW5kKQorICogCisgKiBUaGlzIG9iamVjdCBpcyBlbmNvZGVkIGludG8gYW4gWE1MIG5vZGUgdXNpbmcgdGhlIGZvbGxvd2luZy4KKyAqIAorICogKGNvZGUpCisgKiB2YXIgZW5jID0gbmV3IG14Q29kZWMoKTsKKyAqIHZhciBub2RlID0gZW5jLmVuY29kZShvYmopOworICogKGVuZCkKKyAqIAorICogVGhlIG91dHB1dCBvZiB0aGUgZW5jb2RpbmcgbWF5IGJlIHZpZXdlZCB1c2luZyA8bXhMb2c+IGFzIGZvbGxvd3MuCisgKiAKKyAqIChjb2RlKQorICogbXhMb2cuc2hvdygpOworICogbXhMb2cuZGVidWcobXhVdGlscy5nZXRQcmV0dHlYbWwobm9kZSkpOworICogKGVuZCkKKyAqIAorICogRmluYWxseSwgdGhlIHJlc3VsdCBvZiB0aGUgZW5jb2RpbmcgbG9va3MgYXMgZm9sbG93cy4KKyAqIAorICogKGNvZGUpCisgKiA8T2JqZWN0IGZvbz0iRm9vIiBiYXI9IkJhciIvPgorICogKGVuZCkKKyAqIAorICogSW4gdGhlIGFib3ZlIG91dHB1dCwgdGhlIGZvbyBhbmQgYmFyIGZpZWxkcyBoYXZlIGJlZW4gbWFwcGVkIHRvIGF0dHJpYnV0ZXMKKyAqIHdpdGggdGhlIHNhbWUgbmFtZXMsIGFuZCB0aGUgbmFtZSBvZiB0aGUgY29uc3RydWN0b3Igd2FzIHVzZWQgZm9yIHRoZQorICogbm9kZW5hbWUuCisgKiAKKyAqIEJvb2xlYW5zOgorICoKKyAqIFNpbmNlIGJvb2xlYW5zIGFyZSBudW1iZXJzIGluIEphdmFTY3JpcHQsIGFsbCBib29sZWFuIHZhbHVlcyBhcmUgZW5jb2RlZAorICogaW50byAxIGZvciB0cnVlIGFuZCAwIGZvciBmYWxzZS4gVGhlIGRlY29kZXIgYWxzbyBhY2NlcHRzIHRoZSBzdHJpbmcgdHJ1ZQorICogYW5kIGZhbHNlIGZvciBib29sZWFuIHZhbHVlcy4KKyAqIAorICogT2JqZWN0czoKKyAqIAorICogVGhlIGFib3ZlIHNjaGVtZSBpcyBhcHBsaWVkIHRvIGFsbCBhdG9taWMgZmllbGRzLCB0aGF0IGlzLCB0byBhbGwgbm9uLW9iamVjdAorICogZmllbGRzIG9mIGFuIG9iamVjdC4gRm9yIG9iamVjdCBmaWVsZHMsIGEgY2hpbGQgbm9kZSBpcyBjcmVhdGVkIHdpdGggYQorICogc3BlY2lhbCBhdHRyaWJ1dGUgdGhhdCBjb250YWlucyB0aGUgZmllbGRuYW1lLiBUaGlzIHNwZWNpYWwgYXR0cmlidXRlIGlzCisgKiBjYWxsZWQgImFzIiBhbmQgaGVuY2UsIGFzIGlzIGEgcmVzZXJ2ZWQgd29yZCB0aGF0IHNob3VsZCBub3QgYmUgdXNlZCBmb3IgYQorICogZmllbGRuYW1lLgorICogCisgKiBDb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGUgd2hlcmUgZm9vIGlzIGFuIG9iamVjdCBhbmQgYmFyIGlzIGFuIGF0b21pYworICogcHJvcGVydHkgb2YgZm9vLgorICogCisgKiAoY29kZSkKKyAqIHZhciBvYmogPSB7Zm9vOiB7YmFyOiAiQmFyIn19OworICogKGVuZCkKKyAqIAorICogVGhpcyB3aWxsIGJlIG1hcHBlZCB0byB0aGUgZm9sbG93aW5nIFhNTCBzdHJ1Y3R1cmUgYnkgbXhPYmplY3RDb2RlYy4KKyAqIAorICogKGNvZGUpCisgKiA8T2JqZWN0PgorICogICA8T2JqZWN0IGJhcj0iQmFyIiBhcz0iZm9vIi8+CisgKiA8L09iamVjdD4KKyAqIChlbmQpCisgKiAKKyAqIEluIHRoZSBhYm92ZSBvdXRwdXQsIHRoZSBpbm5lciBPYmplY3Qgbm9kZSBjb250YWlucyB0aGUgYXMtYXR0cmlidXRlIHRoYXQKKyAqIHNwZWNpZmllcyB0aGUgZmllbGRuYW1lIGluIHRoZSBlbmNsb3Npbmcgb2JqZWN0LiBUaGF0IGlzLCB0aGUgZmllbGQgZm9vIHdhcworICogbWFwcGVkIHRvIGEgY2hpbGQgbm9kZSB3aXRoIGFuIGFzLWF0dHJpYnV0ZSB0aGF0IGhhcyB0aGUgdmFsdWUgZm9vLgorICogCisgKiBBcnJheXM6CisgKiAKKyAqIEFycmF5cyBhcmUgc3BlY2lhbCBvYmplY3RzIHRoYXQgYXJlIGVpdGhlciBhc3NvY2lhdGl2ZSwgaW4gd2hpY2ggY2FzZSBlYWNoCisgKiBrZXksIHZhbHVlIHBhaXIgaXMgdHJlYXRlZCBsaWtlIGEgZmllbGQgd2hlcmUgdGhlIGtleSBpcyB0aGUgZmllbGRuYW1lLCBvcgorICogdGhleSBhcmUgYSBzZXF1ZW5jZSBvZiBhdG9taWMgdmFsdWVzIGFuZCBvYmplY3RzLCB3aGljaCBpcyBtYXBwZWQgdG8gYQorICogc2VxdWVuY2Ugb2YgY2hpbGQgbm9kZXMuIEZvciBvYmplY3QgZWxlbWVudHMsIHRoZSBhYm92ZSBzY2hlbWUgaXMgYXBwbGllZAorICogd2l0aG91dCB0aGUgdXNlIG9mIHRoZSBzcGVjaWFsIGFzLWF0dHJpYnV0ZSBmb3IgY3JlYXRpbmcgZWFjaCBjaGlsZC4gRm9yCisgKiBhdG9taWMgZWxlbWVudHMsIGEgc3BlY2lhbCBhZGQtbm9kZSBpcyBjcmVhdGVkIHdpdGggdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUKKyAqIHZhbHVlLWF0dHJpYnV0ZS4KKyAqIAorICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgYXJyYXkgY29udGFpbnMgb25lIGF0b21pYyB2YWx1ZSBhbmQgb25lIG9iamVjdAorICogd2l0aCBhIGZpZWxkIGNhbGxlZCBiYXIuIEZ1cnRoZXJtb3JlIGl0IGNvbnRhaW5zIHR3byBhc3NvY2lhdGl2ZSBlbnRyaWVzCisgKiBjYWxsZWQgYmFyIHdpdGggYW4gYXRvbWljIHZhbHVlLCBhbmQgZm9vIHdpdGggYW4gb2JqZWN0IHZhbHVlLgorICogCisgKiAoY29kZSkKKyAqIHZhciBvYmogPSBbIkJhciIsIHtiYXI6ICJCYXIifV07CisgKiBvYmpbImJhciJdID0gIkJhciI7CisgKiBvYmpbImZvbyJdID0ge2JhcjogIkJhciJ9OworICogKGVuZCkKKyAqIAorICogVGhpcyBhcnJheSBpcyByZXByZXNlbnRlZCBieSB0aGUgZm9sbG93aW5nIFhNTCBub2Rlcy4KKyAqIAorICogKGNvZGUpCisgKiA8QXJyYXkgYmFyPSJCYXIiPgorICogICA8YWRkIHZhbHVlPSJCYXIiLz4KKyAqICAgPE9iamVjdCBiYXI9IkJhciIvPgorICogICA8T2JqZWN0IGJhcj0iQmFyIiBhcz0iZm9vIi8+CisgKiA8L0FycmF5PgorICogKGVuZCkKKyAqIAorICogVGhlIEFycmF5IG5vZGUgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgY29uc3RydWN0b3IuIFRoZSBhZGRpdGlvbmFsCisgKiBhcy1hdHRyaWJ1dGUgaW4gdGhlIGxhc3QgY2hpbGQgY29udGFpbnMgdGhlIGtleSBvZiB0aGUgYXNzb2NpYXRpdmUgZW50cnksCisgKiB3aGVyZWFzIHRoZSBzZWNvbmQgbGFzdCBjaGlsZCBpcyBwYXJ0IG9mIHRoZSBhcnJheSBzZXF1ZW5jZSBhbmQgZG9lcyBub3QKKyAqIGhhdmUgYW4gYXMtYXR0cmlidXRlLgorICogCisgKiBSZWZlcmVuY2VzOgorICogCisgKiBPYmplY3RzIG1heSBiZSByZXByZXNlbnRlZCBhcyBjaGlsZCBub2RlcyBvciBhdHRyaWJ1dGVzIHdpdGggSUQgdmFsdWVzLAorICogd2hpY2ggYXJlIHVzZWQgdG8gbG9va3VwIHRoZSBvYmplY3QgaW4gYSB0YWJsZSB3aXRoaW4gPG14Q29kZWM+LiBUaGUKKyAqIDxpc1JlZmVyZW5jZT4gZnVuY3Rpb24gaXMgaW4gY2hhcmdlIG9mIGRlY2lkaW5nIGlmIGEgc3BlY2lmaWMgZmllbGQgc2hvdWxkCisgKiBiZSBlbmNvZGVkIGFzIGEgcmVmZXJlbmNlIG9yIG5vdC4gSXRzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmCisgKiB0aGUgZmllbGRuYW1lIGlzIGluIDxpZHJlZnM+LCBhbiBhcnJheSBvZiBzdHJpbmdzIHRoYXQgaXMgdXNlZCB0byBjb25maWd1cmUKKyAqIHRoZSA8bXhPYmplY3RDb2RlYz4uCisgKiAKKyAqIFVzaW5nIHRoaXMgYXBwcm9hY2gsIHRoZSBtYXBwaW5nIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHRoZSByZWZlcmVuY2VkCisgKiBvYmplY3QgaXRzZWxmIGV4aXN0cyBpbiB0aGUgZG9jdW1lbnQuIFRoZSBmaWVsZHMgdGhhdCBhcmUgZW5jb2RlZCBhcworICogcmVmZXJlbmNlcyBtdXN0IGJlIGNhcmVmdWxseSBjaG9zZW4gdG8gbWFrZSBzdXJlIGFsbCByZWZlcmVuY2VkIG9iamVjdHMKKyAqIGV4aXN0IGluIHRoZSBkb2N1bWVudCwgb3IgbWF5IGJlIHJlc29sdmVkIGJ5IHNvbWUgb3RoZXIgbWVhbnMgaWYgbmVjZXNzYXJ5LgorICogCisgKiBGb3IgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgdGhlIGdyYXBoIG1vZGVsIGFsbCBjZWxscyBhcmUgc3RvcmVkIGluIGEgdHJlZQorICogd2hvc2Ugcm9vdCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBtb2RlbCdzIHJvb3QgZmllbGQuIEEgdHJlZSBpcyBhIHN0cnVjdHVyZQorICogdGhhdCBpcyB3ZWxsIHN1aXRlZCBmb3IgYW4gWE1MIHJlcHJlc2VudGF0aW9uLCBob3dldmVyLCB0aGUgYWRkaXRpb25hbCBlZGdlcworICogaW4gdGhlIGdyYXBoIG1vZGVsIGhhdmUgYSByZWZlcmVuY2UgdG8gYSBzb3VyY2UgYW5kIHRhcmdldCBjZWxsLCB3aGljaCBhcmUKKyAqIGFsc28gY29udGFpbmVkIGluIHRoZSB0cmVlLiBUbyBoYW5kbGUgdGhpcyBjYXNlLCB0aGUgc291cmNlIGFuZCB0YXJnZXQgY2VsbAorICogb2YgYW4gZWRnZSBhcmUgdHJlYXRlZCBhcyByZWZlcmVuY2VzLCB3aGVyZWFzIHRoZSBjaGlsZHJlbiBhcmUgdHJlYXRlZCBhcworICogb2JqZWN0cy4gU2luY2UgYWxsIGNlbGxzIGFyZSBjb250YWluZWQgaW4gdGhlIHRyZWUgYW5kIG5vIGVkZ2UgcmVmZXJlbmNlcyBhCisgKiBzb3VyY2Ugb3IgdGFyZ2V0IG91dHNpZGUgdGhlIHRyZWUsIHRoaXMgc2V0dXAgbWFrZXMgc3VyZSBhbGwgcmVmZXJlbmNlZAorICogb2JqZWN0cyBhcmUgY29udGFpbmVkIGluIHRoZSBkb2N1bWVudC4KKyAqIAorICogSW4gdGhlIGNhc2Ugb2YgYSB0cmVlIHN0cnVjdHVyZSB3ZSBtdXN0IGZ1cnRoZXIgYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uIGJ5CisgKiBpZ25vcmluZyB0aGUgcGFyZW50IHJlZmVyZW5jZSBvZiBlYWNoIGNoaWxkLiBUaGlzIGlzIGRvbmUgYnkgcmV0dXJuaW5nIHRydWUKKyAqIGluIDxpc0V4Y2x1ZGVkPiwgd2hvc2UgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBhcnJheSBvZiBleGNsdWRlZAorICogZmllbGRuYW1lcyBwYXNzZWQgdG8gdGhlIG14T2JqZWN0Q29kZWMgY29uc3RydWN0b3IuCisgKiAKKyAqIFJlZmVyZW5jZXMgYXJlIG9ubHkgdXNlZCBmb3IgY2VsbHMgaW4gbXhHcmFwaC4gRm9yIGRlZmluaW5nIG90aGVyCisgKiByZWZlcmVuY2FibGUgb2JqZWN0IHR5cGVzLCB0aGUgY29kZWMgbXVzdCBiZSBhYmxlIHRvIHdvcmsgb3V0IHRoZSBJRCBvZiBhbgorICogb2JqZWN0LiBUaGlzIGlzIGRvbmUgYnkgaW1wbGVtZW50aW5nIDxteENvZGVjLnJlZmVyZW5jZT4uIEZvciBkZWNvZGluZyBhCisgKiByZWZlcmVuY2UsIHRoZSBYTUwgbm9kZSB3aXRoIHRoZSByZXNwZWN0aXZlIGlkLWF0dHJpYnV0ZSBpcyBmZXRjaGVkIGZyb20gdGhlCisgKiBkb2N1bWVudCwgZGVjb2RlZCwgYW5kIHN0b3JlZCBpbiBhIGxvb2t1cCB0YWJsZSBmb3IgbGF0ZXIgcmVmZXJlbmNlLiBGb3IKKyAqIGxvb2tpbmcgdXAgZXh0ZXJuYWwgb2JqZWN0cywgPG14Q29kZWMubG9va3VwPiBtYXkgYmUgaW1wbGVtZW50ZWQuCisgKiAKKyAqIEV4cHJlc3Npb25zOgorICogCisgKiBGb3IgZGVjb2RpbmcgSmF2YVNjcmlwdCBleHByZXNzaW9ucywgdGhlIGFkZC1ub2RlIG1heSBiZSB1c2VkIHdpdGggYSB0ZXh0CisgKiBjb250ZW50IHRoYXQgY29udGFpbnMgdGhlIEphdmFTY3JpcHQgZXhwcmVzc2lvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcKKyAqIGNyZWF0ZXMgYSBmaWVsZCBjYWxsZWQgZm9vIGluIHRoZSBlbmNsb3Npbmcgb2JqZWN0IGFuZCBhc3NpZ25zIGl0IHRoZSB2YWx1ZQorICogb2YgPG14Q29uc3RhbnRzLkFMSUdOX0xFRlQ+LgorICogCisgKiAoY29kZSkKKyAqIDxPYmplY3Q+CisgKiAgIDxhZGQgYXM9ImZvbyI+bXhDb25zdGFudHMuQUxJR05fTEVGVDwvYWRkPgorICogPC9PYmplY3Q+CisgKiAoZW5kKQorICogCisgKiBUaGUgcmVzdWx0aW5nIG9iamVjdCBoYXMgYSBmaWVsZCBjYWxsZWQgZm9vIHdpdGggdGhlIHZhbHVlICJsZWZ0Ii4gSXRzIFhNTAorICogcmVwcmVzZW50YXRpb24gbG9va3MgYXMgZm9sbG93cy4KKyAqIAorICogKGNvZGUpCisgKiA8T2JqZWN0IGZvbz0ibGVmdCIvPgorICogKGVuZCkKKyAqIAorICogVGhpcyBtZWFucyB0aGUgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXQgZGVjb2RpbmcgdGltZSBhbmQgdGhlIHJlc3VsdCBvZgorICogdGhlIGV2YWx1YXRpb24gaXMgc3RvcmVkIGluIHRoZSByZXNwZWN0aXZlIGZpZWxkLiBWYWxpZCBleHByZXNzaW9ucyBhcmUgYWxsCisgKiBKYXZhU2NyaXB0IGV4cHJlc3Npb25zLCBpbmNsdWRpbmcgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIHdoaWNoIGFyZSBtYXBwZWQgdG8KKyAqIGZ1bmN0aW9ucyBvbiB0aGUgcmVzdWx0aW5nIG9iamVjdC4KKyAqIAorICogRXhwcmVzc2lvbnMgYXJlIG9ubHkgZXZhbHVhdGVkIGlmIDxhbGxvd0V2YWw+IGlzIHRydWUuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteE9iamVjdENvZGVjCisgKgorICogQ29uc3RydWN0cyBhIG5ldyBjb2RlYyBmb3IgdGhlIHNwZWNpZmllZCB0ZW1wbGF0ZSBvYmplY3QuCisgKiBUaGUgdmFyaWFibGVzIGluIHRoZSBvcHRpb25hbCBleGNsdWRlIGFycmF5IGFyZSBpZ25vcmVkIGJ5CisgKiB0aGUgY29kZWMuIFZhcmlhYmxlcyBpbiB0aGUgb3B0aW9uYWwgaWRyZWZzIGFycmF5IGFyZQorICogdHVybmVkIGludG8gcmVmZXJlbmNlcyBpbiB0aGUgWE1MLiBUaGUgb3B0aW9uYWwgbWFwcGluZworICogbWF5IGJlIHVzZWQgdG8gbWFwIGZyb20gdmFyaWFibGUgbmFtZXMgdG8gWE1MIGF0dHJpYnV0ZXMuCisgKiBUaGUgYXJndW1lbnQgaXMgY3JlYXRlZCBhcyBmb2xsb3dzOgorICoKKyAqIChjb2RlKQorICogdmFyIG1hcHBpbmcgPSBuZXcgT2JqZWN0KCk7CisgKiBtYXBwaW5nWyd2YXJpYWJsZU5hbWUnXSA9ICdhdHRyaWJ1dGUtbmFtZSc7CisgKiAoZW5kKQorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogdGVtcGxhdGUgLSBQcm90b3R5cGljYWwgaW5zdGFuY2Ugb2YgdGhlIG9iamVjdCB0byBiZQorICogZW5jb2RlZC9kZWNvZGVkLgorICogZXhjbHVkZSAtIE9wdGlvbmFsIGFycmF5IG9mIGZpZWxkbmFtZXMgdG8gYmUgaWdub3JlZC4KKyAqIGlkcmVmcyAtIE9wdGlvbmFsIGFycmF5IG9mIGZpZWxkbmFtZXMgdG8gYmUgY29udmVydGVkIHRvL2Zyb20KKyAqIHJlZmVyZW5jZXMuCisgKiBtYXBwaW5nIC0gT3B0aW9uYWwgbWFwcGluZyBmcm9tIGZpZWxkLSB0byBhdHRyaWJ1dGVuYW1lcy4KKyAqLworZnVuY3Rpb24gbXhPYmplY3RDb2RlYyh0ZW1wbGF0ZSwgZXhjbHVkZSwgaWRyZWZzLCBtYXBwaW5nKQoreworCXRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTsKKwkKKwl0aGlzLmV4Y2x1ZGUgPSAoZXhjbHVkZSAhPSBudWxsKSA/IGV4Y2x1ZGUgOiBbXTsKKwl0aGlzLmlkcmVmcyA9IChpZHJlZnMgIT0gbnVsbCkgPyBpZHJlZnMgOiBbXTsKKwl0aGlzLm1hcHBpbmcgPSAobWFwcGluZyAhPSBudWxsKSA/IG1hcHBpbmcgOiBbXTsKKwkKKwl0aGlzLnJldmVyc2UgPSBuZXcgT2JqZWN0KCk7CisJCisJZm9yICh2YXIgaSBpbiB0aGlzLm1hcHBpbmcpCisJeworCQl0aGlzLnJldmVyc2VbdGhpcy5tYXBwaW5nW2ldXSA9IGk7CisJfQorfTsKKworLyoqCisgKiBWYXJpYWJsZTogYWxsb3dFdmFsCisgKgorICogU3RhdGljIGdsb2JhbCBzd2l0Y2ggdGhhdCBzcGVjaWZpZXMgaWYgZXhwcmVzc2lvbnMgaW4gYXJyYXlzIGFyZSBhbGxvd2VkLgorICogRGVmYXVsdCBpcyBmYWxzZS4gTk9URTogRW5hYmxpbmcgdGhpcyBjYXJyaWVzIGEgcG9zc2libGUgc2VjdXJpdHkgcmlzay4KKyAqLworbXhPYmplY3RDb2RlYy5hbGxvd0V2YWwgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogdGVtcGxhdGUKKyAqCisgKiBIb2xkcyB0aGUgdGVtcGxhdGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvZGVjLgorICovCitteE9iamVjdENvZGVjLnByb3RvdHlwZS50ZW1wbGF0ZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGV4Y2x1ZGUKKyAqCisgKiBBcnJheSBjb250YWluaW5nIHRoZSB2YXJpYWJsZSBuYW1lcyB0aGF0IHNob3VsZCBiZQorICogaWdub3JlZCBieSB0aGUgY29kZWMuCisgKi8KK214T2JqZWN0Q29kZWMucHJvdG90eXBlLmV4Y2x1ZGUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBpZHJlZnMKKyAqCisgKiBBcnJheSBjb250YWluaW5nIHRoZSB2YXJpYWJsZSBuYW1lcyB0aGF0IHNob3VsZCBiZQorICogdHVybmVkIGludG8gb3IgY29udmVydGVkIGZyb20gcmVmZXJlbmNlcy4gU2VlCisgKiA8bXhDb2RlYy5nZXRJZD4gYW5kIDxteENvZGVjLmdldE9iamVjdD4uCisgKi8KK214T2JqZWN0Q29kZWMucHJvdG90eXBlLmlkcmVmcyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IG1hcHBpbmcKKyAqCisgKiBNYXBzIGZyb20gZnJvbSBmaWVsZG5hbWVzIHRvIFhNTCBhdHRyaWJ1dGUgbmFtZXMuCisgKi8KK214T2JqZWN0Q29kZWMucHJvdG90eXBlLm1hcHBpbmcgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiByZXZlcnNlCisgKgorICogTWFwcyBmcm9tIGZyb20gWE1MIGF0dHJpYnV0ZSBuYW1lcyB0byBmaWVsZG5hbWVzLgorICovCitteE9iamVjdENvZGVjLnByb3RvdHlwZS5yZXZlcnNlID0gbnVsbDsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0TmFtZQorICogCisgKiBSZXR1cm5zIHRoZSBuYW1lIHVzZWQgZm9yIHRoZSBub2RlbmFtZXMgYW5kIGxvb2t1cCBvZiB0aGUgY29kZWMgd2hlbgorICogY2xhc3NlcyBhcmUgZW5jb2RlZCBhbmQgbm9kZXMgYXJlIGRlY29kZWQuIEZvciBjbGFzc2VzIHRvIHdvcmsgd2l0aAorICogdGhpcyB0aGUgY29kZWMgcmVnaXN0cnkgYXV0b21hdGljYWxseSBhZGRzIGFuIGFsaWFzIGZvciB0aGUgY2xhc3NuYW1lCisgKiBpZiB0aGF0IGlzIGRpZmZlcmVudCB0aGFuIHdoYXQgdGhpcyByZXR1cm5zLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICogcmV0dXJucyB0aGUgY2xhc3NuYW1lIG9mIHRoZSB0ZW1wbGF0ZSBjbGFzcy4KKyAqLworbXhPYmplY3RDb2RlYy5wcm90b3R5cGUuZ2V0TmFtZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gbXhVdGlscy5nZXRGdW5jdGlvbk5hbWUodGhpcy50ZW1wbGF0ZS5jb25zdHJ1Y3Rvcik7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjbG9uZVRlbXBsYXRlCisgKiAKKyAqIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGNvZGVjLgorICovCitteE9iamVjdENvZGVjLnByb3RvdHlwZS5jbG9uZVRlbXBsYXRlID0gZnVuY3Rpb24oKQoreworCXJldHVybiBuZXcgdGhpcy50ZW1wbGF0ZS5jb25zdHJ1Y3RvcigpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0RmllbGROYW1lCisgKiAKKyAqIFJldHVybnMgdGhlIGZpZWxkbmFtZSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZW5hbWUuCisgKiBMb29rcyB1cCB0aGUgdmFsdWUgaW4gdGhlIDxyZXZlcnNlPiBtYXBwaW5nIG9yIHJldHVybnMKKyAqIHRoZSBpbnB1dCBpZiB0aGVyZSBpcyBubyByZXZlcnNlIG1hcHBpbmcgZm9yIHRoZQorICogZ2l2ZW4gbmFtZS4KKyAqLworbXhPYmplY3RDb2RlYy5wcm90b3R5cGUuZ2V0RmllbGROYW1lID0gZnVuY3Rpb24oYXR0cmlidXRlbmFtZSkKK3sKKwlpZiAoYXR0cmlidXRlbmFtZSAhPSBudWxsKQorCXsKKwkJdmFyIG1hcHBlZCA9IHRoaXMucmV2ZXJzZVthdHRyaWJ1dGVuYW1lXTsKKwkJCisJCWlmIChtYXBwZWQgIT0gbnVsbCkKKwkJeworCQkJYXR0cmlidXRlbmFtZSA9IG1hcHBlZDsKKwkJfQorCX0KKwkKKwlyZXR1cm4gYXR0cmlidXRlbmFtZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEF0dHJpYnV0ZU5hbWUKKyAqIAorICogUmV0dXJucyB0aGUgYXR0cmlidXRlbmFtZSBmb3IgdGhlIGdpdmVuIGZpZWxkbmFtZS4KKyAqIExvb2tzIHVwIHRoZSB2YWx1ZSBpbiB0aGUgPG1hcHBpbmc+IG9yIHJldHVybnMKKyAqIHRoZSBpbnB1dCBpZiB0aGVyZSBpcyBubyBtYXBwaW5nIGZvciB0aGUKKyAqIGdpdmVuIG5hbWUuCisgKi8KK214T2JqZWN0Q29kZWMucHJvdG90eXBlLmdldEF0dHJpYnV0ZU5hbWUgPSBmdW5jdGlvbihmaWVsZG5hbWUpCit7CisJaWYgKGZpZWxkbmFtZSAhPSBudWxsKQorCXsKKwkJdmFyIG1hcHBlZCA9IHRoaXMubWFwcGluZ1tmaWVsZG5hbWVdOworCQkKKwkJaWYgKG1hcHBlZCAhPSBudWxsKQorCQl7CisJCQlmaWVsZG5hbWUgPSBtYXBwZWQ7CisJCX0KKwl9CisJCisJcmV0dXJuIGZpZWxkbmFtZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzRXhjbHVkZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGF0dHJpYnV0ZSBpcyB0byBiZSBpZ25vcmVkIGJ5IHRoZSBjb2RlYy4gVGhpcworICogaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBmaWVsZG5hbWUgaXMgaW4gPGV4Y2x1ZGU+IG9yCisgKiBpZiB0aGUgZmllbGRuYW1lIGVxdWFscyA8bXhPYmplY3RJZGVudGl0eS5GSUVMRF9OQU1FPi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIG9iaiAtIE9iamVjdCBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBmaWVsZC4KKyAqIGF0dHIgLSBGaWVsZG5hbWUgb2YgdGhlIGZpZWxkLgorICogdmFsdWUgLSBWYWx1ZSBvZiB0aGUgZmllbGQuCisgKiB3cml0ZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgZmllbGQgaXMgYmVpbmcgZW5jb2RlZCBvciBkZWNvZGVkLgorICogV3JpdGUgaXMgdHJ1ZSBpZiB0aGUgZmllbGQgaXMgYmVpbmcgZW5jb2RlZCwgZWxzZSBpdCBpcyBiZWluZyBkZWNvZGVkLgorICovCitteE9iamVjdENvZGVjLnByb3RvdHlwZS5pc0V4Y2x1ZGVkID0gZnVuY3Rpb24ob2JqLCBhdHRyLCB2YWx1ZSwgd3JpdGUpCit7CisJcmV0dXJuIGF0dHIgPT0gbXhPYmplY3RJZGVudGl0eS5GSUVMRF9OQU1FIHx8CisJCW14VXRpbHMuaW5kZXhPZih0aGlzLmV4Y2x1ZGUsIGF0dHIpID49IDA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1JlZmVyZW5jZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZmllbGRuYW1lIGlzIHRvIGJlIHRyZWF0ZWQKKyAqIGFzIGEgdGV4dHVhbCByZWZlcmVuY2UgKElEKS4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zCisgKiB0cnVlIGlmIHRoZSBnaXZlbiBmaWVsZG5hbWUgaXMgaW4gPGlkcmVmcz4uCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBvYmogLSBPYmplY3QgaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgZmllbGQuCisgKiBhdHRyIC0gRmllbGRuYW1lIG9mIHRoZSBmaWVsZC4KKyAqIHZhbHVlIC0gVmFsdWUgb2YgdGhlIGZpZWxkLiAKKyAqIHdyaXRlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBmaWVsZCBpcyBiZWluZyBlbmNvZGVkIG9yIGRlY29kZWQuCisgKiBXcml0ZSBpcyB0cnVlIGlmIHRoZSBmaWVsZCBpcyBiZWluZyBlbmNvZGVkLCBlbHNlIGl0IGlzIGJlaW5nIGRlY29kZWQuCisgKi8KK214T2JqZWN0Q29kZWMucHJvdG90eXBlLmlzUmVmZXJlbmNlID0gZnVuY3Rpb24ob2JqLCBhdHRyLCB2YWx1ZSwgd3JpdGUpCit7CisJcmV0dXJuIG14VXRpbHMuaW5kZXhPZih0aGlzLmlkcmVmcywgYXR0cikgPj0gMDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGVuY29kZQorICoKKyAqIEVuY29kZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHJldHVybnMgYSBub2RlCisgKiByZXByZXNlbnRpbmcgdGhlbiBnaXZlbiBvYmplY3QuIENhbGxzIDxiZWZvcmVFbmNvZGU+CisgKiBhZnRlciBjcmVhdGluZyB0aGUgbm9kZSBhbmQgPGFmdGVyRW5jb2RlPiB3aXRoIHRoZSAKKyAqIHJlc3VsdGluZyBub2RlIGFmdGVyIHByb2Nlc3NpbmcuCisgKgorICogRW5jIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBjYWxsaW5nIGVuY29kZXIuIEl0IGlzIHVzZWQKKyAqIHRvIGVuY29kZSBjb21wbGV4IG9iamVjdHMgYW5kIGNyZWF0ZSByZWZlcmVuY2VzLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gZW5jb2RlcyBhbGwgdmFyaWFibGVzIG9mIGFuCisgKiBvYmplY3QgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcnVsZXM6CisgKgorICogLSBJZiB0aGUgdmFyaWFibGUgbmFtZSBpcyBpbiA8ZXhjbHVkZT4gdGhlbiBpdCBpcyBpZ25vcmVkLgorICogLSBJZiB0aGUgdmFyaWFibGUgbmFtZSBpcyBpbiA8aWRyZWZzPiB0aGVuIDxteENvZGVjLmdldElkPgorICogaXMgdXNlZCB0byByZXBsYWNlIHRoZSBvYmplY3Qgd2l0aCBpdHMgSUQuCisgKiAtIFRoZSB2YXJpYWJsZSBuYW1lIGlzIG1hcHBlZCB1c2luZyA8bWFwcGluZz4uCisgKiAtIElmIG9iaiBpcyBhbiBhcnJheSBhbmQgdGhlIHZhcmlhYmxlIG5hbWUgaXMgbnVtZXJpYworICogKGllLiBhbiBpbmRleCkgdGhlbiBpdCBpcyBub3QgZW5jb2RlZC4KKyAqIC0gSWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCwgdGhlbiB0aGUgY29kZWMgaXMgdXNlZCB0bworICogY3JlYXRlIGEgY2hpbGQgbm9kZSB3aXRoIHRoZSB2YXJpYWJsZSBuYW1lIGVuY29kZWQgaW50bworICogdGhlICJhcyIgYXR0cmlidXRlLgorICogLSBFbHNlLCBpZiA8ZW5jb2RlRGVmYXVsdHM+IGlzIHRydWUgb3IgdGhlIHZhbHVlIGRpZmZlcnMKKyAqIGZyb20gdGhlIHRlbXBsYXRlIHZhbHVlLCB0aGVuIC4uLgorICogLSAuLi4gaWYgb2JqIGlzIG5vdCBhbiBhcnJheSwgdGhlbiB0aGUgdmFsdWUgaXMgbWFwcGVkIHRvCisgKiBhbiBhdHRyaWJ1dGUuCisgKiAtIC4uLiBlbHNlIGlmIG9iaiBpcyBhbiBhcnJheSwgdGhlIHZhbHVlIGlzIG1hcHBlZCB0byBhbgorICogYWRkIGNoaWxkIHdpdGggYSB2YWx1ZSBhdHRyaWJ1dGUgb3IgYSB0ZXh0IGNoaWxkIG5vZGUsCisgKiBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvbi4KKyAqCisgKiBJZiBubyBJRCBleGlzdHMgZm9yIGEgdmFyaWFibGUgaW4gPGlkcmVmcz4gb3IgaWYgYW4gb2JqZWN0CisgKiBjYW5ub3QgYmUgZW5jb2RlZCwgYSB3YXJuaW5nIGlzIGlzc3VlZCB1c2luZyA8bXhMb2cud2Fybj4uCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0aW5nIFhNTCBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4KKyAqIG9iamVjdC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGVuYyAtIDxteENvZGVjPiB0aGF0IGNvbnRyb2xzIHRoZSBlbmNvZGluZyBwcm9jZXNzLgorICogb2JqIC0gT2JqZWN0IHRvIGJlIGVuY29kZWQuCisgKi8KK214T2JqZWN0Q29kZWMucHJvdG90eXBlLmVuY29kZSA9IGZ1bmN0aW9uKGVuYywgb2JqKQoreworCXZhciBub2RlID0gZW5jLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5nZXROYW1lKCkpOworCQorCW9iaiA9IHRoaXMuYmVmb3JlRW5jb2RlKGVuYywgb2JqLCBub2RlKTsKKwl0aGlzLmVuY29kZU9iamVjdChlbmMsIG9iaiwgbm9kZSk7CisJCisJcmV0dXJuIHRoaXMuYWZ0ZXJFbmNvZGUoZW5jLCBvYmosIG5vZGUpOworfTsKKwkKKy8qKgorICogRnVuY3Rpb246IGVuY29kZU9iamVjdAorICoKKyAqIEVuY29kZXMgdGhlIHZhbHVlIG9mIGVhY2ggbWVtYmVyIGluIHRoZW4gZ2l2ZW4gb2JqIGludG8gdGhlIGdpdmVuIG5vZGUgdXNpbmcKKyAqIDxlbmNvZGVWYWx1ZT4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKgorICogZW5jIC0gPG14Q29kZWM+IHRoYXQgY29udHJvbHMgdGhlIGVuY29kaW5nIHByb2Nlc3MuCisgKiBvYmogLSBPYmplY3QgdG8gYmUgZW5jb2RlZC4KKyAqIG5vZGUgLSBYTUwgbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBlbmNvZGVkIG9iamVjdC4KKyAqLworbXhPYmplY3RDb2RlYy5wcm90b3R5cGUuZW5jb2RlT2JqZWN0ID0gZnVuY3Rpb24oZW5jLCBvYmosIG5vZGUpCit7CisJZW5jLnNldEF0dHJpYnV0ZShub2RlLCAnaWQnLCBlbmMuZ2V0SWQob2JqKSk7CisJCisgICAgZm9yICh2YXIgaSBpbiBvYmopCisgICAgeworCQl2YXIgbmFtZSA9IGk7CisJCXZhciB2YWx1ZSA9IG9ialtuYW1lXTsKKwkJCisgICAgCWlmICh2YWx1ZSAhPSBudWxsICYmICF0aGlzLmlzRXhjbHVkZWQob2JqLCBuYW1lLCB2YWx1ZSwgdHJ1ZSkpCisgICAgCXsKKyAgICAJCWlmIChteFV0aWxzLmlzSW50ZWdlcihuYW1lKSkKKyAgICAJCXsKKyAgICAJCQluYW1lID0gbnVsbDsKKyAgICAJCX0KKyAgICAJCQorICAgIAkJdGhpcy5lbmNvZGVWYWx1ZShlbmMsIG9iaiwgbmFtZSwgdmFsdWUsIG5vZGUpOworICAgIAl9CisgICAgfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZW5jb2RlVmFsdWUKKyAqIAorICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIGFjY29yZGluZyB0byB0aGUgbWFwcGluZ3MKKyAqIGFuZCBpZC1yZWZzIGluIHRoaXMgY29kZWMgYW5kIHVzZXMgPHdyaXRlQXR0cmlidXRlPgorICogdG8gd3JpdGUgdGhlIGF0dHJpYnV0ZSBpbnRvIHRoZSBnaXZlbiBub2RlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGVuYyAtIDxteENvZGVjPiB0aGF0IGNvbnRyb2xzIHRoZSBlbmNvZGluZyBwcm9jZXNzLgorICogb2JqIC0gT2JqZWN0IHdob3NlIHByb3BlcnR5IGlzIGdvaW5nIHRvIGJlIGVuY29kZWQuCisgKiBuYW1lIC0gWE1MIG5vZGUgdGhhdCBjb250YWlucyB0aGUgZW5jb2RlZCBvYmplY3QuCisgKiB2YWx1ZSAtIFZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBlbmNvZGVkLgorICogbm9kZSAtIFhNTCBub2RlIHRoYXQgY29udGFpbnMgdGhlIGVuY29kZWQgb2JqZWN0LgorICovCitteE9iamVjdENvZGVjLnByb3RvdHlwZS5lbmNvZGVWYWx1ZSA9IGZ1bmN0aW9uKGVuYywgb2JqLCBuYW1lLCB2YWx1ZSwgbm9kZSkKK3sKKwlpZiAodmFsdWUgIT0gbnVsbCkKKwl7CisJCWlmICh0aGlzLmlzUmVmZXJlbmNlKG9iaiwgbmFtZSwgdmFsdWUsIHRydWUpKQorCQl7CisJCQl2YXIgdG1wID0gZW5jLmdldElkKHZhbHVlKTsKKwkJCQorCQkJaWYgKHRtcCA9PSBudWxsKQorCQkJeworCQkgICAgCW14TG9nLndhcm4oJ214T2JqZWN0Q29kZWMuZW5jb2RlOiBObyBJRCBmb3IgJyArCisJCSAgICAJCXRoaXMuZ2V0TmFtZSgpICsgJy4nICsgbmFtZSArICc9JyArIHZhbHVlKTsKKwkJICAgIAlyZXR1cm47IC8vIGV4aXQKKwkJICAgIH0KKwkJICAgIAorCQkgICAgdmFsdWUgPSB0bXA7CisJCX0KKworCQl2YXIgZGVmYXVsdFZhbHVlID0gdGhpcy50ZW1wbGF0ZVtuYW1lXTsKKwkJCisJCS8vIENoZWNrcyBpZiB0aGUgdmFsdWUgaXMgYSBkZWZhdWx0IHZhbHVlIGFuZAorCQkvLyB0aGUgbmFtZSBpcyBjb3JyZWN0CisJCWlmIChuYW1lID09IG51bGwgfHwgZW5jLmVuY29kZURlZmF1bHRzIHx8IGRlZmF1bHRWYWx1ZSAhPSB2YWx1ZSkKKwkJeworCQkJbmFtZSA9IHRoaXMuZ2V0QXR0cmlidXRlTmFtZShuYW1lKTsKKwkJCXRoaXMud3JpdGVBdHRyaWJ1dGUoZW5jLCBvYmosIG5hbWUsIHZhbHVlLCBub2RlKTsJCisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB3cml0ZUF0dHJpYnV0ZQorICogCisgKiBXcml0ZXMgdGhlIGdpdmVuIHZhbHVlIGludG8gbm9kZSB1c2luZyA8d3JpdGVQcmltaXRpdmVBdHRyaWJ1dGU+CisgKiBvciA8d3JpdGVDb21wbGV4QXR0cmlidXRlPiBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlIHZhbHVlLgorICovCitteE9iamVjdENvZGVjLnByb3RvdHlwZS53cml0ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uKGVuYywgb2JqLCBuYW1lLCB2YWx1ZSwgbm9kZSkKK3sKKwlpZiAodHlwZW9mKHZhbHVlKSAhPSAnb2JqZWN0JyAvKiBwcmltaXRpdmUgdHlwZSAqLykKKwl7CisJCXRoaXMud3JpdGVQcmltaXRpdmVBdHRyaWJ1dGUoZW5jLCBvYmosIG5hbWUsIHZhbHVlLCBub2RlKTsKKwl9CisJZWxzZSAvKiBjb21wbGV4IHR5cGUgKi8KKwl7CisJCXRoaXMud3JpdGVDb21wbGV4QXR0cmlidXRlKGVuYywgb2JqLCBuYW1lLCB2YWx1ZSwgbm9kZSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogd3JpdGVQcmltaXRpdmVBdHRyaWJ1dGUKKyAqIAorICogV3JpdGVzIHRoZSBnaXZlbiB2YWx1ZSBhcyBhbiBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIG5vZGUuCisgKi8KK214T2JqZWN0Q29kZWMucHJvdG90eXBlLndyaXRlUHJpbWl0aXZlQXR0cmlidXRlID0gZnVuY3Rpb24oZW5jLCBvYmosIG5hbWUsIHZhbHVlLCBub2RlKQoreworCXZhbHVlID0gdGhpcy5jb252ZXJ0QXR0cmlidXRlVG9YbWwoZW5jLCBvYmosIG5hbWUsIHZhbHVlLCBub2RlKTsKKwkKKwlpZiAobmFtZSA9PSBudWxsKQorCXsKKwkJdmFyIGNoaWxkID0gZW5jLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2FkZCcpOworCQkKKwkJaWYgKHR5cGVvZih2YWx1ZSkgPT0gJ2Z1bmN0aW9uJykKKwkJeworICAgIAkJY2hpbGQuYXBwZW5kQ2hpbGQoZW5jLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKSk7CisgICAgCX0KKyAgICAJZWxzZQorICAgIAl7CisgICAgCQllbmMuc2V0QXR0cmlidXRlKGNoaWxkLCAndmFsdWUnLCB2YWx1ZSk7CisgICAgCX0KKyAgICAJCisJCW5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpOworCX0KKwllbHNlIGlmICh0eXBlb2YodmFsdWUpICE9ICdmdW5jdGlvbicpCisJeworICAgIAllbmMuc2V0QXR0cmlidXRlKG5vZGUsIG5hbWUsIHZhbHVlKTsKKwl9CQkKK307CisJCisvKioKKyAqIEZ1bmN0aW9uOiB3cml0ZUNvbXBsZXhBdHRyaWJ1dGUKKyAqIAorICogV3JpdGVzIHRoZSBnaXZlbiB2YWx1ZSBhcyBhIGNoaWxkIG5vZGUgb2YgdGhlIGdpdmVuIG5vZGUuCisgKi8KK214T2JqZWN0Q29kZWMucHJvdG90eXBlLndyaXRlQ29tcGxleEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKGVuYywgb2JqLCBuYW1lLCB2YWx1ZSwgbm9kZSkKK3sKKwl2YXIgY2hpbGQgPSBlbmMuZW5jb2RlKHZhbHVlKTsKKwkKKwlpZiAoY2hpbGQgIT0gbnVsbCkKKwl7CisJCWlmIChuYW1lICE9IG51bGwpCisJCXsKKyAgICAJCWNoaWxkLnNldEF0dHJpYnV0ZSgnYXMnLCBuYW1lKTsKKyAgICAJfQorICAgIAkKKyAgICAJbm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7CisJfQorCWVsc2UKKwl7CisJCW14TG9nLndhcm4oJ214T2JqZWN0Q29kZWMuZW5jb2RlOiBObyBub2RlIGZvciAnICsgdGhpcy5nZXROYW1lKCkgKyAnLicgKyBuYW1lICsgJzogJyArIHZhbHVlKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjb252ZXJ0QXR0cmlidXRlVG9YbWwKKyAqIAorICogQ29udmVydHMgdHJ1ZSB0byAiMSIgYW5kIGZhbHNlIHRvICIwIiBpcyA8aXNCb29sZWFuQXR0cmlidXRlPiByZXR1cm5zIHRydWUuCisgKiBBbGwgb3RoZXIgdmFsdWVzIGFyZSBub3QgY29udmVydGVkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGVuYyAtIDxteENvZGVjPiB0aGF0IGNvbnRyb2xzIHRoZSBlbmNvZGluZyBwcm9jZXNzLgorICogb2JqIC0gT2JqZWMgdG8gY29udmVydCB0aGUgYXR0cmlidXRlIGZvci4KKyAqIG5hbWUgLSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gYmUgY29udmVydGVkLgorICogdmFsdWUgLSBWYWx1ZSB0byBiZSBjb252ZXJ0ZWQuCisgKi8KK214T2JqZWN0Q29kZWMucHJvdG90eXBlLmNvbnZlcnRBdHRyaWJ1dGVUb1htbCA9IGZ1bmN0aW9uKGVuYywgb2JqLCBuYW1lLCB2YWx1ZSkKK3sKKwkvLyBNYWtlcyBzdXJlIHRvIGVuY29kZSBib29sZWFuIHZhbHVlcyBhcyBudW1lcmljIHZhbHVlcworCWlmICh0aGlzLmlzQm9vbGVhbkF0dHJpYnV0ZShlbmMsIG9iaiwgbmFtZSwgdmFsdWUpKQorCXsJCisJCS8vIENoZWNrcyBpZiB0aGUgdmFsdWUgaXMgdHJ1ZSAoZG8gbm90IHVzZSB0aGUgdmFsdWUgYXMgaXMsIGJlY2F1c2UKKwkJLy8gdGhpcyB3b3VsZCBjaGVjayBpZiB0aGUgdmFsdWUgaXMgbm90IG51bGwsIHNvIDAgd291bGQgYmUgdHJ1ZSkKKwkJdmFsdWUgPSAodmFsdWUgPT0gdHJ1ZSkgPyAnMScgOiAnMCc7CisJfQorCQorCXJldHVybiB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQm9vbGVhbkF0dHJpYnV0ZQorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG9iamVjdCBhdHRyaWJ1dGUgaXMgYSBib29sZWFuIHZhbHVlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGVuYyAtIDxteENvZGVjPiB0aGF0IGNvbnRyb2xzIHRoZSBlbmNvZGluZyBwcm9jZXNzLgorICogb2JqIC0gT2JqZWMgdG8gY29udmVydCB0aGUgYXR0cmlidXRlIGZvci4KKyAqIG5hbWUgLSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gYmUgY29udmVydGVkLgorICogdmFsdWUgLSBWYWx1ZSBvZiB0aGUgYXR0cmlidXRlIHRvIGJlIGNvbnZlcnRlZC4KKyAqLworbXhPYmplY3RDb2RlYy5wcm90b3R5cGUuaXNCb29sZWFuQXR0cmlidXRlID0gZnVuY3Rpb24oZW5jLCBvYmosIG5hbWUsIHZhbHVlKQoreworCXJldHVybiAodHlwZW9mKHZhbHVlLmxlbmd0aCkgPT0gJ3VuZGVmaW5lZCcgJiYgKHZhbHVlID09IHRydWUgfHwgdmFsdWUgPT0gZmFsc2UpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNvbnZlcnRBdHRyaWJ1dGVGcm9tWG1sCisgKiAKKyAqIENvbnZlcnRzIGJvb2xlYW5zIGFuZCBudW1lcmljIHZhbHVlcyB0byB0aGUgcmVzcGVjdGl2ZSB0eXBlcy4gVmFsdWVzIGFyZQorICogbnVtZXJpYyBpZiA8aXNOdW1lcmljQXR0cmlidXRlPiByZXR1cm5zIHRydWUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKgorICogZGVjIC0gPG14Q29kZWM+IHRoYXQgY29udHJvbHMgdGhlIGRlY29kaW5nIHByb2Nlc3MuCisgKiBhdHRyIC0gWE1MIGF0dHJpYnV0ZSB0byBiZSBjb252ZXJ0ZWQuCisgKiBvYmogLSBPYmplYyB0byBjb252ZXJ0IHRoZSBhdHRyaWJ1dGUgZm9yLgorICovCitteE9iamVjdENvZGVjLnByb3RvdHlwZS5jb252ZXJ0QXR0cmlidXRlRnJvbVhtbCA9IGZ1bmN0aW9uKGRlYywgYXR0ciwgb2JqKQoreworCXZhciB2YWx1ZSA9IGF0dHIudmFsdWU7CisJCisJaWYgKHRoaXMuaXNOdW1lcmljQXR0cmlidXRlKGRlYywgYXR0ciwgb2JqKSkKKwl7CisJCXZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7CisJfQorCQorCXJldHVybiB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzTnVtZXJpY0F0dHJpYnV0ZQorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIFhNTCBhdHRyaWJ1dGUgaXMgYSBudW1lcmljIHZhbHVlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGRlYyAtIDxteENvZGVjPiB0aGF0IGNvbnRyb2xzIHRoZSBkZWNvZGluZyBwcm9jZXNzLgorICogYXR0ciAtIFhNTCBhdHRyaWJ1dGUgdG8gYmUgY29udmVydGVkLgorICogb2JqIC0gT2JqZWMgdG8gY29udmVydCB0aGUgYXR0cmlidXRlIGZvci4KKyAqLworbXhPYmplY3RDb2RlYy5wcm90b3R5cGUuaXNOdW1lcmljQXR0cmlidXRlID0gZnVuY3Rpb24oZGVjLCBhdHRyLCBvYmopCit7CisJcmV0dXJuIG14VXRpbHMuaXNOdW1lcmljKGF0dHIudmFsdWUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYmVmb3JlRW5jb2RlCisgKgorICogSG9vayBmb3Igc3ViY2xhc3NlcnMgdG8gcHJlLXByb2Nlc3MgdGhlIG9iamVjdCBiZWZvcmUKKyAqIGVuY29kaW5nLiBUaGlzIHJldHVybnMgdGhlIGlucHV0IG9iamVjdC4gVGhlIHJldHVybgorICogdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIDxlbmNvZGU+IHRvIHBlcmZvcm0KKyAqIHRoZSBkZWZhdWx0IGVuY29kaW5nIGludG8gdGhlIGdpdmVuIG5vZGUuCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBlbmMgLSA8bXhDb2RlYz4gdGhhdCBjb250cm9scyB0aGUgZW5jb2RpbmcgcHJvY2Vzcy4KKyAqIG9iaiAtIE9iamVjdCB0byBiZSBlbmNvZGVkLgorICogbm9kZSAtIFhNTCBub2RlIHRvIGVuY29kZSB0aGUgb2JqZWN0IGludG8uCisgKi8KK214T2JqZWN0Q29kZWMucHJvdG90eXBlLmJlZm9yZUVuY29kZSA9IGZ1bmN0aW9uKGVuYywgb2JqLCBub2RlKQoreworCXJldHVybiBvYmo7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZnRlckVuY29kZQorICoKKyAqIEhvb2sgZm9yIHN1YmNsYXNzZXJzIHRvIHBvc3QtcHJvY2VzcyB0aGUgbm9kZQorICogZm9yIHRoZSBnaXZlbiBvYmplY3QgYWZ0ZXIgZW5jb2RpbmcgYW5kIHJldHVybiB0aGUKKyAqIHBvc3QtcHJvY2Vzc2VkIG5vZGUuIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyAKKyAqIHRoZSBpbnB1dCBub2RlLiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgbWV0aG9kCisgKiBpcyByZXR1cm5lZCB0byB0aGUgZW5jb2RlciBmcm9tIDxlbmNvZGU+LgorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogZW5jIC0gPG14Q29kZWM+IHRoYXQgY29udHJvbHMgdGhlIGVuY29kaW5nIHByb2Nlc3MuCisgKiBvYmogLSBPYmplY3QgdG8gYmUgZW5jb2RlZC4KKyAqIG5vZGUgLSBYTUwgbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRlZmF1bHQgZW5jb2RpbmcuCisgKi8KK214T2JqZWN0Q29kZWMucHJvdG90eXBlLmFmdGVyRW5jb2RlID0gZnVuY3Rpb24oZW5jLCBvYmosIG5vZGUpCit7CisJcmV0dXJuIG5vZGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZWNvZGUKKyAqCisgKiBQYXJzZXMgdGhlIGdpdmVuIG5vZGUgaW50byB0aGUgb2JqZWN0IG9yIHJldHVybnMgYSBuZXcgb2JqZWN0CisgKiByZXByZXNlbnRpbmcgdGhlIGdpdmVuIG5vZGUuCisgKgorICogRGVjIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBjYWxsaW5nIGRlY29kZXIuIEl0IGlzIHVzZWQgdG8gZGVjb2RlCisgKiBjb21wbGV4IG9iamVjdHMgYW5kIHJlc29sdmUgcmVmZXJlbmNlcy4KKyAqCisgKiBJZiBhIG5vZGUgaGFzIGFuIGlkIGF0dHJpYnV0ZSB0aGVuIHRoZSBvYmplY3QgY2FjaGUgaXMgY2hlY2tlZCBmb3IgdGhlCisgKiBvYmplY3QuIElmIHRoZSBvYmplY3QgaXMgbm90IHlldCBpbiB0aGUgY2FjaGUgdGhlbiBpdCBpcyBjb25zdHJ1Y3RlZAorICogdXNpbmcgdGhlIGNvbnN0cnVjdG9yIG9mIDx0ZW1wbGF0ZT4gYW5kIGNhY2hlZCBpbiA8bXhDb2RlYy5vYmplY3RzPi4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGRlY29kZXMgYWxsIGF0dHJpYnV0ZXMgYW5kIGNoaWxkcyBvZiBhIG5vZGUKKyAqIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHJ1bGVzOgorICoKKyAqIC0gSWYgdGhlIHZhcmlhYmxlIG5hbWUgaXMgaW4gPGV4Y2x1ZGU+IG9yIGlmIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyAiaWQiCisgKiBvciAiYXMiIHRoZW4gaXQgaXMgaWdub3JlZC4KKyAqIC0gSWYgdGhlIHZhcmlhYmxlIG5hbWUgaXMgaW4gPGlkcmVmcz4gdGhlbiA8bXhDb2RlYy5nZXRPYmplY3Q+IGlzIHVzZWQKKyAqIHRvIHJlcGxhY2UgdGhlIHJlZmVyZW5jZSB3aXRoIGFuIG9iamVjdC4KKyAqIC0gVGhlIHZhcmlhYmxlIG5hbWUgaXMgbWFwcGVkIHVzaW5nIGEgcmV2ZXJzZSA8bWFwcGluZz4uCisgKiAtIElmIHRoZSB2YWx1ZSBoYXMgYSBjaGlsZCBub2RlLCB0aGVuIHRoZSBjb2RlYyBpcyB1c2VkIHRvIGNyZWF0ZSBhCisgKiBjaGlsZCBvYmplY3Qgd2l0aCB0aGUgdmFyaWFibGUgbmFtZSB0YWtlbiBmcm9tIHRoZSAiYXMiIGF0dHJpYnV0ZS4KKyAqIC0gSWYgdGhlIG9iamVjdCBpcyBhbiBhcnJheSBhbmQgdGhlIHZhcmlhYmxlIG5hbWUgaXMgZW1wdHkgdGhlbiB0aGUKKyAqIHZhbHVlIG9yIGNoaWxkIG9iamVjdCBpcyBhcHBlbmRlZCB0byB0aGUgYXJyYXkuCisgKiAtIElmIGFuIGFkZCBjaGlsZCBoYXMgbm8gdmFsdWUgb3IgdGhlIG9iamVjdCBpcyBub3QgYW4gYXJyYXkgdGhlbgorICogdGhlIGNoaWxkIHRleHQgY29udGVudCBpcyBldmFsdWF0ZWQgdXNpbmcgPG14VXRpbHMuZXZhbD4uCisgKgorICogRm9yIGFkZCBub2RlcyB3aGVyZSB0aGUgb2JqZWN0IGlzIG5vdCBhbiBhcnJheSBhbmQgdGhlIHZhcmlhYmxlIG5hbWUKKyAqIGlzIGRlZmluZWQsIHRoZSBkZWZhdWx0IG1lY2hhbmlzbSBpcyB1c2VkLCBhbGxvd2luZyB0byBvdmVycmlkZS9hZGQKKyAqIG1ldGhvZHMgYXMgZm9sbG93czoKKyAqCisgKiAoY29kZSkKKyAqIDxPYmplY3Q+CisgKiAgIDxhZGQgYXM9ImhlbGxvIj48IVtDREFUQVsKKyAqICAgICBmdW5jdGlvbihhcmcxKSB7CisgKiAgICAgICBteFV0aWxzLmFsZXJ0KCdIZWxsbyAnK2FyZzEpOworICogICAgIH0KKyAqICAgXV0+PC9hZGQ+CisgKiA8L09iamVjdD4KKyAqIChlbmQpIAorICoKKyAqIElmIG5vIG9iamVjdCBleGlzdHMgZm9yIGFuIElEIGluIDxpZHJlZnM+IGEgd2FybmluZyBpcyBpc3N1ZWQKKyAqIHVzaW5nIDxteExvZy53YXJuPi4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHRpbmcgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gWE1MIG5vZGUKKyAqIG9yIHRoZSBvYmplY3QgZ2l2ZW4gdG8gdGhlIG1ldGhvZCBhcyB0aGUgaW50byBwYXJhbWV0ZXIuCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBkZWMgLSA8bXhDb2RlYz4gdGhhdCBjb250cm9scyB0aGUgZGVjb2RpbmcgcHJvY2Vzcy4KKyAqIG5vZGUgLSBYTUwgbm9kZSB0byBiZSBkZWNvZGVkLgorICogaW50byAtIE9wdGlvbmFsIG9iamVjIHRvIGVuY29kZSB0aGUgbm9kZSBpbnRvLgorICovCitteE9iamVjdENvZGVjLnByb3RvdHlwZS5kZWNvZGUgPSBmdW5jdGlvbihkZWMsIG5vZGUsIGludG8pCit7CisJdmFyIGlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2lkJyk7CisJdmFyIG9iaiA9IGRlYy5vYmplY3RzW2lkXTsKKwkKKwlpZiAob2JqID09IG51bGwpCisJeworCQlvYmogPSBpbnRvIHx8IHRoaXMuY2xvbmVUZW1wbGF0ZSgpOworCQkKKwkJaWYgKGlkICE9IG51bGwpCisJCXsKKwkJCWRlYy5wdXRPYmplY3QoaWQsIG9iaik7CisJCX0KKwl9CisJCisJbm9kZSA9IHRoaXMuYmVmb3JlRGVjb2RlKGRlYywgbm9kZSwgb2JqKTsKKwl0aGlzLmRlY29kZU5vZGUoZGVjLCBub2RlLCBvYmopOworCQorICAgIHJldHVybiB0aGlzLmFmdGVyRGVjb2RlKGRlYywgbm9kZSwgb2JqKTsKK307CQorCisvKioKKyAqIEZ1bmN0aW9uOiBkZWNvZGVOb2RlCisgKiAKKyAqIENhbGxzIDxkZWNvZGVBdHRyaWJ1dGVzPiBhbmQgPGRlY29kZUNoaWxkcmVuPiBmb3IgdGhlIGdpdmVuIG5vZGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKgorICogZGVjIC0gPG14Q29kZWM+IHRoYXQgY29udHJvbHMgdGhlIGRlY29kaW5nIHByb2Nlc3MuCisgKiBub2RlIC0gWE1MIG5vZGUgdG8gYmUgZGVjb2RlZC4KKyAqIG9iaiAtIE9iamVjIHRvIGVuY29kZSB0aGUgbm9kZSBpbnRvLgorICovCQorbXhPYmplY3RDb2RlYy5wcm90b3R5cGUuZGVjb2RlTm9kZSA9IGZ1bmN0aW9uKGRlYywgbm9kZSwgb2JqKQoreworCWlmIChub2RlICE9IG51bGwpCisJeworCQl0aGlzLmRlY29kZUF0dHJpYnV0ZXMoZGVjLCBub2RlLCBvYmopOworCQl0aGlzLmRlY29kZUNoaWxkcmVuKGRlYywgbm9kZSwgb2JqKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZWNvZGVBdHRyaWJ1dGVzCisgKiAKKyAqIERlY29kZXMgYWxsIGF0dHJpYnV0ZXMgb2YgdGhlIGdpdmVuIG5vZGUgdXNpbmcgPGRlY29kZUF0dHJpYnV0ZT4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKgorICogZGVjIC0gPG14Q29kZWM+IHRoYXQgY29udHJvbHMgdGhlIGRlY29kaW5nIHByb2Nlc3MuCisgKiBub2RlIC0gWE1MIG5vZGUgdG8gYmUgZGVjb2RlZC4KKyAqIG9iaiAtIE9iamVjIHRvIGVuY29kZSB0aGUgbm9kZSBpbnRvLgorICovCQorbXhPYmplY3RDb2RlYy5wcm90b3R5cGUuZGVjb2RlQXR0cmlidXRlcyA9IGZ1bmN0aW9uKGRlYywgbm9kZSwgb2JqKQoreworCXZhciBhdHRycyA9IG5vZGUuYXR0cmlidXRlczsKKwkKKwlpZiAoYXR0cnMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXRoaXMuZGVjb2RlQXR0cmlidXRlKGRlYywgYXR0cnNbaV0sIG9iaik7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0lnbm9yZWRBdHRyaWJ1dGUKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgc2hvdWxkIGJlIGlnbm9yZWQuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIG5hbWUgaXMgImFzIiBvciAiaWQiLgorICogCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGRlYyAtIDxteENvZGVjPiB0aGF0IGNvbnRyb2xzIHRoZSBkZWNvZGluZyBwcm9jZXNzLgorICogYXR0ciAtIFhNTCBhdHRyaWJ1dGUgdG8gYmUgZGVjb2RlZC4KKyAqIG9iaiAtIE9iamVjIHRvIGVuY29kZSB0aGUgYXR0cmlidXRlIGludG8uCisgKi8JCitteE9iamVjdENvZGVjLnByb3RvdHlwZS5pc0lnbm9yZWRBdHRyaWJ1dGUgPSBmdW5jdGlvbihkZWMsIGF0dHIsIG9iaikKK3sKKwlyZXR1cm4gYXR0ci5ub2RlTmFtZSA9PSAnYXMnIHx8IGF0dHIubm9kZU5hbWUgPT0gJ2lkJzsKK307CisKKy8qKgorICogRnVuY3Rpb246IGRlY29kZUF0dHJpYnV0ZQorICogCisgKiBSZWFkcyB0aGUgZ2l2ZW4gYXR0cmlidXRlIGludG8gdGhlIHNwZWNpZmllZCBvYmplY3QuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKgorICogZGVjIC0gPG14Q29kZWM+IHRoYXQgY29udHJvbHMgdGhlIGRlY29kaW5nIHByb2Nlc3MuCisgKiBhdHRyIC0gWE1MIGF0dHJpYnV0ZSB0byBiZSBkZWNvZGVkLgorICogb2JqIC0gT2JqZWMgdG8gZW5jb2RlIHRoZSBhdHRyaWJ1dGUgaW50by4KKyAqLwkKK214T2JqZWN0Q29kZWMucHJvdG90eXBlLmRlY29kZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uKGRlYywgYXR0ciwgb2JqKQoreworCWlmICghdGhpcy5pc0lnbm9yZWRBdHRyaWJ1dGUoZGVjLCBhdHRyLCBvYmopKQorCXsKKwkJdmFyIG5hbWUgPSBhdHRyLm5vZGVOYW1lOworCQkKKwkJLy8gQ29udmVydHMgdGhlIHN0cmluZyB0cnVlIGFuZCBmYWxzZSB0byB0aGVpciBib29sZWFuIHZhbHVlcy4KKwkJLy8gVGhpcyBtYXkgcmVxdWlyZSBhbiBhZGRpdGlvbmFsIGNoZWNrIG9uIHRoZSBvYmogdG8gc2VlIGlmCisJCS8vIHRoZSBleGlzdGluZyBmaWVsZCBpcyBhIGJvb2xlYW4gdmFsdWUgb3IgdW5pbml0aWFsaXplZCwgaW4KKwkJLy8gd2hpY2ggY2FzZSB3ZSBtYXkgd2FudCB0byBjb252ZXJ0IHRydWUgYW5kIGZhbHNlIHRvIGEgc3RyaW5nLgorCQl2YXIgdmFsdWUgPSB0aGlzLmNvbnZlcnRBdHRyaWJ1dGVGcm9tWG1sKGRlYywgYXR0ciwgb2JqKTsKKwkJdmFyIGZpZWxkbmFtZSA9IHRoaXMuZ2V0RmllbGROYW1lKG5hbWUpOworCQkKKwkJaWYgKHRoaXMuaXNSZWZlcmVuY2Uob2JqLCBmaWVsZG5hbWUsIHZhbHVlLCBmYWxzZSkpCisJCXsKKwkJCXZhciB0bXAgPSBkZWMuZ2V0T2JqZWN0KHZhbHVlKTsKKwkJCQorCQkJaWYgKHRtcCA9PSBudWxsKQorCQkJeworCQkgICAgCW14TG9nLndhcm4oJ214T2JqZWN0Q29kZWMuZGVjb2RlOiBObyBvYmplY3QgZm9yICcgKworCQkgICAgCQl0aGlzLmdldE5hbWUoKSArICcuJyArIG5hbWUgKyAnPScgKyB2YWx1ZSk7CisJCSAgICAJcmV0dXJuOyAvLyBleGl0CisJCSAgICB9CisJCSAgICAKKwkJICAgIHZhbHVlID0gdG1wOworCQl9CisKKwkJaWYgKCF0aGlzLmlzRXhjbHVkZWQob2JqLCBuYW1lLCB2YWx1ZSwgZmFsc2UpKQorCQl7CisJCQkvL214TG9nLmRlYnVnKG14VXRpbHMuZ2V0RnVuY3Rpb25OYW1lKG9iai5jb25zdHJ1Y3RvcikrJy4nK25hbWUrJz0nK3ZhbHVlKTsKKwkJCW9ialtuYW1lXSA9IHZhbHVlOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZGVjb2RlQ2hpbGRyZW4KKyAqIAorICogRGVjb2RlcyBhbGwgY2hpbGRyZW4gb2YgdGhlIGdpdmVuIG5vZGUgdXNpbmcgPGRlY29kZUNoaWxkPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqCisgKiBkZWMgLSA8bXhDb2RlYz4gdGhhdCBjb250cm9scyB0aGUgZGVjb2RpbmcgcHJvY2Vzcy4KKyAqIG5vZGUgLSBYTUwgbm9kZSB0byBiZSBkZWNvZGVkLgorICogb2JqIC0gT2JqZWMgdG8gZW5jb2RlIHRoZSBub2RlIGludG8uCisgKi8JCitteE9iamVjdENvZGVjLnByb3RvdHlwZS5kZWNvZGVDaGlsZHJlbiA9IGZ1bmN0aW9uKGRlYywgbm9kZSwgb2JqKQoreworCXZhciBjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDsKKwkKKwl3aGlsZSAoY2hpbGQgIT0gbnVsbCkKKwl7CisJCXZhciB0bXAgPSBjaGlsZC5uZXh0U2libGluZzsKKwkJCisJCWlmIChjaGlsZC5ub2RlVHlwZSA9PSBteENvbnN0YW50cy5OT0RFVFlQRV9FTEVNRU5UICYmCisJCQkhdGhpcy5wcm9jZXNzSW5jbHVkZShkZWMsIGNoaWxkLCBvYmopKQorCQl7CisJCQl0aGlzLmRlY29kZUNoaWxkKGRlYywgY2hpbGQsIG9iaik7CisJCX0KKwkJCisJCWNoaWxkID0gdG1wOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGRlY29kZUNoaWxkCisgKiAKKyAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgY2hpbGQgaW50byB0aGUgZ2l2ZW4gb2JqZWN0LgorICogCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGRlYyAtIDxteENvZGVjPiB0aGF0IGNvbnRyb2xzIHRoZSBkZWNvZGluZyBwcm9jZXNzLgorICogY2hpbGQgLSBYTUwgY2hpbGQgZWxlbWVudCB0byBiZSBkZWNvZGVkLgorICogb2JqIC0gT2JqZWMgdG8gZW5jb2RlIHRoZSBub2RlIGludG8uCisgKi8JCitteE9iamVjdENvZGVjLnByb3RvdHlwZS5kZWNvZGVDaGlsZCA9IGZ1bmN0aW9uKGRlYywgY2hpbGQsIG9iaikKK3sKKwl2YXIgZmllbGRuYW1lID0gdGhpcy5nZXRGaWVsZE5hbWUoY2hpbGQuZ2V0QXR0cmlidXRlKCdhcycpKTsKKwkKKwlpZiAoZmllbGRuYW1lID09IG51bGwgfHwgIXRoaXMuaXNFeGNsdWRlZChvYmosIGZpZWxkbmFtZSwgY2hpbGQsIGZhbHNlKSkKKwl7CisJCXZhciB0ZW1wbGF0ZSA9IHRoaXMuZ2V0RmllbGRUZW1wbGF0ZShvYmosIGZpZWxkbmFtZSwgY2hpbGQpOworCQl2YXIgdmFsdWUgPSBudWxsOworCQkKKwkJaWYgKGNoaWxkLm5vZGVOYW1lID09ICdhZGQnKQorCQl7CisJCQl2YWx1ZSA9IGNoaWxkLmdldEF0dHJpYnV0ZSgndmFsdWUnKTsKKwkJCQorCQkJaWYgKHZhbHVlID09IG51bGwgJiYgbXhPYmplY3RDb2RlYy5hbGxvd0V2YWwpCisJCQl7CisJCQkJdmFsdWUgPSBteFV0aWxzLmV2YWwobXhVdGlscy5nZXRUZXh0Q29udGVudChjaGlsZCkpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJdmFsdWUgPSBkZWMuZGVjb2RlKGNoaWxkLCB0ZW1wbGF0ZSk7CisJCX0KKworCQl0aGlzLmFkZE9iamVjdFZhbHVlKG9iaiwgZmllbGRuYW1lLCB2YWx1ZSwgdGVtcGxhdGUpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEZpZWxkVGVtcGxhdGUKKyAqIAorICogUmV0dXJucyB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBmaWVsZC4gVGhpcyByZXR1cm5zIHRoZQorICogdmFsdWUgb2YgdGhlIGZpZWxkLCBudWxsIGlmIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSBvciBhbiBlbXB0eSBjb2xsZWN0aW9uCisgKiBpZiB0aGUgdmFsdWUgaXMgYSBjb2xsZWN0aW9uLiBUaGUgdmFsdWUgaXMgdGhlbiB1c2VkIHRvIHBvcHVsYXRlIHRoZQorICogZmllbGQgZm9yIGEgbmV3IGluc3RhbmNlLiBGb3Igc3Ryb25nbHkgdHlwZWQgbGFuZ3VhZ2VzIGl0IG1heSBiZQorICogcmVxdWlyZWQgdG8gb3ZlcnJpZGUgdGhpcyB0byByZXR1cm4gdGhlIGNvcnJlY3QgY29sbGVjdGlvbiBpbnN0YW5jZQorICogYmFzZWQgb24gdGhlIGVuY29kZWQgY2hpbGQuCisgKi8JCitteE9iamVjdENvZGVjLnByb3RvdHlwZS5nZXRGaWVsZFRlbXBsYXRlID0gZnVuY3Rpb24ob2JqLCBmaWVsZG5hbWUsIGNoaWxkKQoreworCXZhciB0ZW1wbGF0ZSA9IG9ialtmaWVsZG5hbWVdOworCQorCS8vIE5vbi1lbXB0eSBhcnJheXMgYXJlIHJlcGxhY2VkIGNvbXBsZXRlbHkKKyAgICBpZiAodGVtcGxhdGUgaW5zdGFuY2VvZiBBcnJheSAmJiB0ZW1wbGF0ZS5sZW5ndGggPiAwKQorICAgIHsKKyAgICAgICAgdGVtcGxhdGUgPSBudWxsOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gdGVtcGxhdGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRPYmplY3RWYWx1ZQorICogCisgKiBTZXRzIHRoZSBkZWNvZGVkIGNoaWxkIG5vZGUgYXMgYSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LiBJZiB0aGUKKyAqIG9iamVjdCBpcyBhIG1hcCwgdGhlbiB0aGUgdmFsdWUgaXMgYWRkZWQgd2l0aCB0aGUgZ2l2ZW4gZmllbGRuYW1lIGFzIGEKKyAqIGtleS4gSWYgdGhlIGZpZWxkbmFtZSBpcyBub3QgZW1wdHksIHRoZW4gc2V0RmllbGRWYWx1ZSBpcyBjYWxsZWQgb3IKKyAqIGVsc2UsIGlmIHRoZSBvYmplY3QgaXMgYSBjb2xsZWN0aW9uLCB0aGUgdmFsdWUgaXMgYWRkZWQgdG8gdGhlCisgKiBjb2xsZWN0aW9uLiBGb3Igc3Ryb25nbHkgdHlwZWQgbGFuZ3VhZ2VzIGl0IG1heSBiZSByZXF1aXJlZCB0bworICogb3ZlcnJpZGUgdGhpcyB3aXRoIHRoZSBjb3JyZWN0IGNvZGUgdG8gYWRkIGFuIGVudHJ5IHRvIGFuIG9iamVjdC4KKyAqLwkKK214T2JqZWN0Q29kZWMucHJvdG90eXBlLmFkZE9iamVjdFZhbHVlID0gZnVuY3Rpb24ob2JqLCBmaWVsZG5hbWUsIHZhbHVlLCB0ZW1wbGF0ZSkKK3sKKwlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSB0ZW1wbGF0ZSkKKwl7CisJCWlmIChmaWVsZG5hbWUgIT0gbnVsbCAmJiBmaWVsZG5hbWUubGVuZ3RoID4gMCkKKwkJeworCQkJb2JqW2ZpZWxkbmFtZV0gPSB2YWx1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW9iai5wdXNoKHZhbHVlKTsKKwkJfQorCQkvL214TG9nLmRlYnVnKCdEZWNvZGVkICcrbXhVdGlscy5nZXRGdW5jdGlvbk5hbWUob2JqLmNvbnN0cnVjdG9yKSsnLicrZmllbGRuYW1lKyc6ICcrdmFsdWUpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHByb2Nlc3NJbmNsdWRlCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBub2RlIGlzIGFuIGluY2x1ZGUgZGlyZWN0aXZlIGFuZAorICogZXhlY3V0ZXMgdGhlIGluY2x1ZGUgYnkgZGVjb2RpbmcgdGhlIFhNTCBkb2N1bWVudC4gUmV0dXJucworICogZmFsc2UgaWYgdGhlIGdpdmVuIG5vZGUgaXMgbm90IGFuIGluY2x1ZGUgZGlyZWN0aXZlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogZGVjIC0gPG14Q29kZWM+IHRoYXQgY29udHJvbHMgdGhlIGVuY29kaW5nL2RlY29kaW5nIHByb2Nlc3MuCisgKiBub2RlIC0gWE1MIG5vZGUgdG8gYmUgY2hlY2tlZC4KKyAqIGludG8gLSBPcHRpb25hbCBvYmplY3QgdG8gcGFzcy10aHJ1IHRvIHRoZSBjb2RlYy4KKyAqLworbXhPYmplY3RDb2RlYy5wcm90b3R5cGUucHJvY2Vzc0luY2x1ZGUgPSBmdW5jdGlvbihkZWMsIG5vZGUsIGludG8pCit7CisJaWYgKG5vZGUubm9kZU5hbWUgPT0gJ2luY2x1ZGUnKQorCXsKKwkJdmFyIG5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZSgnbmFtZScpOworCQkKKwkJaWYgKG5hbWUgIT0gbnVsbCkKKwkJeworCQkJdHJ5CisJCQl7CisJCQkJdmFyIHhtbCA9IG14VXRpbHMubG9hZChuYW1lKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKKwkJCQkKKwkJCQlpZiAoeG1sICE9IG51bGwpCisJCQkJeworCQkJCQlkZWMuZGVjb2RlKHhtbCwgaW50byk7CisJCQkJfQorCQkJfQorCQkJY2F0Y2ggKGUpCisJCQl7CisJCQkJLy8gaWdub3JlCisJCQl9CisJCX0KKwkJCisJCXJldHVybiB0cnVlOworCX0KKwkKKwlyZXR1cm4gZmFsc2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBiZWZvcmVEZWNvZGUKKyAqCisgKiBIb29rIGZvciBzdWJjbGFzc2VycyB0byBwcmUtcHJvY2VzcyB0aGUgbm9kZSBmb3IKKyAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIG5vZGUgdG8gYmUKKyAqIHVzZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBieSA8ZGVjb2RlPi4KKyAqIFRoZSBvYmplY3QgaXMgY3JlYXRlZCBiYXNlZCBvbiB0aGUgdGVtcGxhdGUgaW4gdGhlIAorICogY2FsbGluZyBtZXRob2QgYW5kIGlzIG5ldmVyIG51bGwuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIHJldHVybnMgdGhlIGlucHV0IG5vZGUuIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcworICogZnVuY3Rpb24gaXMgdXNlZCBpbiA8ZGVjb2RlPiB0byBwZXJmb3JtCisgKiB0aGUgZGVmYXVsdCBkZWNvZGluZyBpbnRvIHRoZSBnaXZlbiBvYmplY3QuCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBkZWMgLSA8bXhDb2RlYz4gdGhhdCBjb250cm9scyB0aGUgZGVjb2RpbmcgcHJvY2Vzcy4KKyAqIG5vZGUgLSBYTUwgbm9kZSB0byBiZSBkZWNvZGVkLgorICogb2JqIC0gT2JqZWN0IHRvIGVuY29kZSB0aGUgbm9kZSBpbnRvLgorICovCitteE9iamVjdENvZGVjLnByb3RvdHlwZS5iZWZvcmVEZWNvZGUgPSBmdW5jdGlvbihkZWMsIG5vZGUsIG9iaikKK3sKKwlyZXR1cm4gbm9kZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFmdGVyRGVjb2RlCisgKgorICogSG9vayBmb3Igc3ViY2xhc3NlcnMgdG8gcG9zdC1wcm9jZXNzIHRoZSBvYmplY3QgYWZ0ZXIKKyAqIGRlY29kaW5nLiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIGdpdmVuIG9iamVjdAorICogd2l0aG91dCBhbnkgY2hhbmdlcy4gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZAorICogaXMgcmV0dXJuZWQgdG8gdGhlIGRlY29kZXIgZnJvbSA8ZGVjb2RlPi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGVuYyAtIDxteENvZGVjPiB0aGF0IGNvbnRyb2xzIHRoZSBlbmNvZGluZyBwcm9jZXNzLgorICogbm9kZSAtIFhNTCBub2RlIHRvIGJlIGRlY29kZWQuCisgKiBvYmogLSBPYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBkZWZhdWx0IGRlY29kaW5nLgorICovCitteE9iamVjdENvZGVjLnByb3RvdHlwZS5hZnRlckRlY29kZSA9IGZ1bmN0aW9uKGRlYywgbm9kZSwgb2JqKQoreworCXJldHVybiBvYmo7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214Um9vdENoYW5nZUNvZGVjLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214Um9vdENoYW5nZUNvZGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmOGM0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaW8vbXhSb290Q2hhbmdlQ29kZWMuanMKQEAgLTAsMCArMSw4MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworbXhDb2RlY1JlZ2lzdHJ5LnJlZ2lzdGVyKGZ1bmN0aW9uKCkKK3sKKwkvKioKKwkgKiBDbGFzczogbXhSb290Q2hhbmdlQ29kZWMKKwkgKgorCSAqIENvZGVjIGZvciA8bXhSb290Q2hhbmdlPnMuIFRoaXMgY2xhc3MgaXMgY3JlYXRlZCBhbmQgcmVnaXN0ZXJlZAorCSAqIGR5bmFtaWNhbGx5IGF0IGxvYWQgdGltZSBhbmQgdXNlZCBpbXBsaWNpdGVseSB2aWEgPG14Q29kZWM+IGFuZAorCSAqIHRoZSA8bXhDb2RlY1JlZ2lzdHJ5Pi4KKwkgKgorCSAqIFRyYW5zaWVudCBGaWVsZHM6CisJICoKKwkgKiAtIG1vZGVsCisJICogLSBwcmV2aW91cworCSAqIC0gcm9vdAorCSAqLworCXZhciBjb2RlYyA9IG5ldyBteE9iamVjdENvZGVjKG5ldyBteFJvb3RDaGFuZ2UoKSwKKwkJWydtb2RlbCcsICdwcmV2aW91cycsICdyb290J10pOworCisJLyoqCisJICogRnVuY3Rpb246IG9uRW5jb2RlCisJICoKKwkgKiBFbmNvZGVzIHRoZSBjaGlsZCByZWN1cnNpdmVseS4KKwkgKi8KKwljb2RlYy5hZnRlckVuY29kZSA9IGZ1bmN0aW9uKGVuYywgb2JqLCBub2RlKQorCXsKKwkJZW5jLmVuY29kZUNlbGwob2JqLnJvb3QsIG5vZGUpOworCQkKKwkJcmV0dXJuIG5vZGU7CisJfTsKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBiZWZvcmVEZWNvZGUKKwkgKgorCSAqIERlY29kZXMgdGhlIG9wdGlvbmFsIGNoaWxkcmVuIGFzIGNlbGxzCisJICogdXNpbmcgdGhlIHJlc3BlY3RpdmUgZGVjb2Rlci4KKwkgKi8KKwljb2RlYy5iZWZvcmVEZWNvZGUgPSBmdW5jdGlvbihkZWMsIG5vZGUsIG9iaikKKwl7CisJCWlmIChub2RlLmZpcnN0Q2hpbGQgIT0gbnVsbCAmJgorCQkJbm9kZS5maXJzdENoaWxkLm5vZGVUeXBlID09IG14Q29uc3RhbnRzLk5PREVUWVBFX0VMRU1FTlQpCisJCXsKKwkJCS8vIE1ha2VzIHN1cmUgdGhlIG9yaWdpbmFsIG5vZGUgaXNuJ3QgbW9kaWZpZWQKKwkJCW5vZGUgPSBub2RlLmNsb25lTm9kZSh0cnVlKTsKKwkJCQorCQkJdmFyIHRtcCA9IG5vZGUuZmlyc3RDaGlsZDsKKwkJCW9iai5yb290ID0gZGVjLmRlY29kZUNlbGwodG1wLCBmYWxzZSk7CisKKwkJCXZhciB0bXAyID0gdG1wLm5leHRTaWJsaW5nOworCQkJdG1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodG1wKTsKKwkJCXRtcCA9IHRtcDI7CisJCQorCQkJd2hpbGUgKHRtcCAhPSBudWxsKQorCQkJeworCQkJCXRtcDIgPSB0bXAubmV4dFNpYmxpbmc7CisJCQkJZGVjLmRlY29kZUNlbGwodG1wKTsKKwkJCQl0bXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0bXApOworCQkJCXRtcCA9IHRtcDI7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBub2RlOworCX07CisJCisJLyoqCisJICogRnVuY3Rpb246IGFmdGVyRGVjb2RlCisJICoKKwkgKiBSZXN0b3JlcyB0aGUgc3RhdGUgYnkgYXNzaWduaW5nIHRoZSBwcmV2aW91cyB2YWx1ZS4KKwkgKi8KKwljb2RlYy5hZnRlckRlY29kZSA9IGZ1bmN0aW9uKGRlYywgbm9kZSwgb2JqKQorCXsKKwkJb2JqLnByZXZpb3VzID0gb2JqLnJvb3Q7CisJCQorCQlyZXR1cm4gb2JqOworCX07CisKKwkvLyBSZXR1cm5zIHRoZSBjb2RlYyBpbnRvIHRoZSByZWdpc3RyeQorCXJldHVybiBjb2RlYzsKKworfSgpKTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teFN0eWxlc2hlZXRDb2RlYy5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teFN0eWxlc2hlZXRDb2RlYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODk5MTE2Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2lvL214U3R5bGVzaGVldENvZGVjLmpzCkBAIC0wLDAgKzEsMjE3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFN0eWxlc2hlZXRDb2RlYworICoKKyAqIENvZGVjIGZvciA8bXhTdHlsZXNoZWV0PnMuIFRoaXMgY2xhc3MgaXMgY3JlYXRlZCBhbmQgcmVnaXN0ZXJlZAorICogZHluYW1pY2FsbHkgYXQgbG9hZCB0aW1lIGFuZCB1c2VkIGltcGxpY2l0ZWx5IHZpYSA8bXhDb2RlYz4KKyAqIGFuZCB0aGUgPG14Q29kZWNSZWdpc3RyeT4uCisgKi8KK3ZhciBteFN0eWxlc2hlZXRDb2RlYyA9IG14Q29kZWNSZWdpc3RyeS5yZWdpc3RlcihmdW5jdGlvbigpCit7CisJdmFyIGNvZGVjID0gbmV3IG14T2JqZWN0Q29kZWMobmV3IG14U3R5bGVzaGVldCgpKTsKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBlbmNvZGUKKwkgKgorCSAqIEVuY29kZXMgYSBzdHlsZXNoZWV0LiBTZWUgPGRlY29kZT4gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlCisJICogZm9ybWF0LgorCSAqLworCWNvZGVjLmVuY29kZSA9IGZ1bmN0aW9uKGVuYywgb2JqKQorCXsKKwkJdmFyIG5vZGUgPSBlbmMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLmdldE5hbWUoKSk7CisJCQorCQlmb3IgKHZhciBpIGluIG9iai5zdHlsZXMpCisJCXsKKwkJCXZhciBzdHlsZSA9IG9iai5zdHlsZXNbaV07CisJCQl2YXIgc3R5bGVOb2RlID0gZW5jLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2FkZCcpOworCQkJCisJCQlpZiAoaSAhPSBudWxsKQorCQkJeworCQkJCXN0eWxlTm9kZS5zZXRBdHRyaWJ1dGUoJ2FzJywgaSk7CisJCQkJCisJCQkJZm9yICh2YXIgaiBpbiBzdHlsZSkKKwkJCQl7CisJCQkJCXZhciB2YWx1ZSA9IHRoaXMuZ2V0U3RyaW5nVmFsdWUoaiwgc3R5bGVbal0pOworCQkJCQkKKwkJCQkJaWYgKHZhbHVlICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCXZhciBlbnRyeSA9IGVuYy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhZGQnKTsKKwkJCQkJCWVudHJ5LnNldEF0dHJpYnV0ZSgndmFsdWUnLCB2YWx1ZSk7CisJCQkJCQllbnRyeS5zZXRBdHRyaWJ1dGUoJ2FzJywgaik7CisJCQkJCQlzdHlsZU5vZGUuYXBwZW5kQ2hpbGQoZW50cnkpOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCWlmIChzdHlsZU5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPiAwKQorCQkJCXsKKwkJCQkJbm9kZS5hcHBlbmRDaGlsZChzdHlsZU5vZGUpOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkgICAgcmV0dXJuIG5vZGU7CisJfTsKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBnZXRTdHJpbmdWYWx1ZQorCSAqCisJICogUmV0dXJucyB0aGUgc3RyaW5nIGZvciBlbmNvZGluZyB0aGUgZ2l2ZW4gdmFsdWUuCisJICovCisJY29kZWMuZ2V0U3RyaW5nVmFsdWUgPSBmdW5jdGlvbihrZXksIHZhbHVlKQorCXsKKwkJdmFyIHR5cGUgPSB0eXBlb2YodmFsdWUpOworCQkKKwkJaWYgKHR5cGUgPT0gJ2Z1bmN0aW9uJykKKwkJeworCQkJdmFsdWUgPSBteFN0eWxlUmVnaXN0cnkuZ2V0TmFtZShzdHlsZVtqXSk7CisJCX0KKwkJZWxzZSBpZiAodHlwZSA9PSAnb2JqZWN0JykKKwkJeworCQkJdmFsdWUgPSBudWxsOworCQl9CisJCQorCQlyZXR1cm4gdmFsdWU7CisJfTsKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogZGVjb2RlCisJICoKKwkgKiBSZWFkcyBhIHNlcXVlbmNlIG9mIHRoZSBmb2xsb3dpbmcgY2hpbGQgbm9kZXMKKwkgKiBhbmQgYXR0cmlidXRlczoKKwkgKgorCSAqIENoaWxkIE5vZGVzOgorCSAqCisJICogYWRkIC0gQWRkcyBhIG5ldyBzdHlsZS4KKwkgKgorCSAqIEF0dHJpYnV0ZXM6CisJICoKKwkgKiBhcyAtIE5hbWUgb2YgdGhlIHN0eWxlLgorCSAqIGV4dGVuZCAtIE5hbWUgb2YgdGhlIHN0eWxlIHRvIGluaGVyaXQgZnJvbS4KKwkgKgorCSAqIEVhY2ggbm9kZSBjb250YWlucyBhbm90aGVyIHNlcXVlbmNlIG9mIGFkZCBhbmQgcmVtb3ZlIG5vZGVzIHdpdGggdGhlIGZvbGxvd2luZworCSAqIGF0dHJpYnV0ZXM6CisJICoKKwkgKiBhcyAtIE5hbWUgb2YgdGhlIHN0eWxlIChzZWUgPG14Q29uc3RhbnRzPikuCisJICogdmFsdWUgLSBWYWx1ZSBmb3IgdGhlIHN0eWxlLgorCSAqCisJICogSW5zdGVhZCBvZiB0aGUgdmFsdWUtYXR0cmlidXRlLCBvbmUgY2FuIHB1dCBKYXZhc2NyaXB0IGV4cHJlc3Npb25zIGludG8KKwkgKiB0aGUgbm9kZSBhcyBmb2xsb3dzIGlmIDxteFN0eWxlc2hlZXRDb2RlYy5hbGxvd0V2YWw+IGlzIHRydWU6CisJICogPGFkZCBhcz0icGVyaW1ldGVyIj5teFBlcmltZXRlci5SZWN0YW5nbGVQZXJpbWV0ZXI8L2FkZD4KKwkgKgorCSAqIEEgcmVtb3ZlIG5vZGUgd2lsbCByZW1vdmUgdGhlIGVudHJ5IHdpdGggdGhlIG5hbWUgZ2l2ZW4gaW4gdGhlIGFzLWF0dHJpYnV0ZQorCSAqIGZyb20gdGhlIHN0eWxlLgorCSAqIAorCSAqIEV4YW1wbGU6CisJICoKKwkgKiAoY29kZSkKKwkgKiA8bXhTdHlsZXNoZWV0IGFzPSJzdHlsZXNoZWV0Ij4KKwkgKiAgIDxhZGQgYXM9InRleHQiPgorCSAqICAgICA8YWRkIGFzPSJmb250U2l6ZSIgdmFsdWU9IjEyIi8+CisJICogICA8L2FkZD4KKwkgKiAgIDxhZGQgYXM9ImRlZmF1bHRWZXJ0ZXgiIGV4dGVuZD0idGV4dCI+CisJICogICAgIDxhZGQgYXM9InNoYXBlIiB2YWx1ZT0icmVjdGFuZ2xlIi8+CisJICogICA8L2FkZD4KKwkgKiA8L214U3R5bGVzaGVldD4KKwkgKiAoZW5kKQorCSAqLworCWNvZGVjLmRlY29kZSA9IGZ1bmN0aW9uKGRlYywgbm9kZSwgaW50bykKKwl7CisJCXZhciBvYmogPSBpbnRvIHx8IG5ldyB0aGlzLnRlbXBsYXRlLmNvbnN0cnVjdG9yKCk7CisJCXZhciBpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKCdpZCcpOworCQkKKwkJaWYgKGlkICE9IG51bGwpCisJCXsKKwkJCWRlYy5vYmplY3RzW2lkXSA9IG9iajsKKwkJfQorCQkKKwkJbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDsKKwkJCisJCXdoaWxlIChub2RlICE9IG51bGwpCisJCXsKKwkJCWlmICghdGhpcy5wcm9jZXNzSW5jbHVkZShkZWMsIG5vZGUsIG9iaikgJiYgbm9kZS5ub2RlTmFtZSA9PSAnYWRkJykKKwkJCXsKKwkJCQl2YXIgYXMgPSBub2RlLmdldEF0dHJpYnV0ZSgnYXMnKTsKKwkJCQkKKwkJCQlpZiAoYXMgIT0gbnVsbCkKKwkJCQl7CisJCQkJCXZhciBleHRlbmQgPSBub2RlLmdldEF0dHJpYnV0ZSgnZXh0ZW5kJyk7CisJCQkJCXZhciBzdHlsZSA9IChleHRlbmQgIT0gbnVsbCkgPyBteFV0aWxzLmNsb25lKG9iai5zdHlsZXNbZXh0ZW5kXSkgOiBudWxsOworCQkJCQkKKwkJCQkJaWYgKHN0eWxlID09IG51bGwpCisJCQkJCXsKKwkJCQkJCWlmIChleHRlbmQgIT0gbnVsbCkKKwkJCQkJCXsKKwkJCQkJCQlteExvZy53YXJuKCdteFN0eWxlc2hlZXRDb2RlYy5kZWNvZGU6IHN0eWxlc2hlZXQgJyArCisJCQkJCQkJCWV4dGVuZCArICcgbm90IGZvdW5kIHRvIGV4dGVuZCcpOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlzdHlsZSA9IG5ldyBPYmplY3QoKTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJdmFyIGVudHJ5ID0gbm9kZS5maXJzdENoaWxkOworCQkJCQkKKwkJCQkJd2hpbGUgKGVudHJ5ICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCWlmIChlbnRyeS5ub2RlVHlwZSA9PSBteENvbnN0YW50cy5OT0RFVFlQRV9FTEVNRU5UKQorCQkJCQkJeworCQkJCQkJIAl2YXIga2V5ID0gZW50cnkuZ2V0QXR0cmlidXRlKCdhcycpOworCQkJCQkJIAkKKwkJCQkJCSAJaWYgKGVudHJ5Lm5vZGVOYW1lID09ICdhZGQnKQorCQkJCQkJIAl7CisJCQkJCQkJIAl2YXIgdGV4dCA9IG14VXRpbHMuZ2V0VGV4dENvbnRlbnQoZW50cnkpOworCQkJCQkJCSAJdmFyIHZhbHVlID0gbnVsbDsKKwkJCQkJCQkgCQorCQkJCQkJCSAJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCA+IDAgJiYgbXhTdHlsZXNoZWV0Q29kZWMuYWxsb3dFdmFsKQorCQkJCQkJCSAJeworCQkJCQkJCSAJCXZhbHVlID0gbXhVdGlscy5ldmFsKHRleHQpOworCQkJCQkJCSAJfQorCQkJCQkJCSAJZWxzZQorCQkJCQkJCSAJeworCQkJCQkJCSAJCXZhbHVlID0gZW50cnkuZ2V0QXR0cmlidXRlKCd2YWx1ZScpOworCQkJCQkJCSAJCQorCQkJCQkJCSAJCWlmIChteFV0aWxzLmlzTnVtZXJpYyh2YWx1ZSkpCisJCQkJCQkJIAkJeworCQkJCQkJCQkJCXZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7CisJCQkJCQkJCQl9CisJCQkJCQkJIAl9CisKKwkJCQkJCQkgCWlmICh2YWx1ZSAhPSBudWxsKQorCQkJCQkJCSAJeworCQkJCQkJCSAJCXN0eWxlW2tleV0gPSB2YWx1ZTsKKwkJCQkJCQkgCX0KKwkJCQkJCSAJfQorCQkJCQkJIAllbHNlIGlmIChlbnRyeS5ub2RlTmFtZSA9PSAncmVtb3ZlJykKKwkJCQkJCSAJeworCQkJCQkJIAkJZGVsZXRlIHN0eWxlW2tleV07CisJCQkJCQkgCX0KKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJZW50cnkgPSBlbnRyeS5uZXh0U2libGluZzsKKwkJCQkJfQorCQkJCQkKKwkJCQkJb2JqLnB1dENlbGxTdHlsZShhcywgc3R5bGUpOworCQkJCX0KKwkJCX0KKwkJCQorCQkJbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CisJCX0KKwkJCisJCXJldHVybiBvYmo7CisJfTsKKworCS8vIFJldHVybnMgdGhlIGNvZGVjIGludG8gdGhlIHJlZ2lzdHJ5CisJcmV0dXJuIGNvZGVjOworCit9KCkpOworCisvKioKKyAqIFZhcmlhYmxlOiBhbGxvd0V2YWwKKyAqIAorICogU3RhdGljIGdsb2JhbCBzd2l0Y2ggdGhhdCBzcGVjaWZpZXMgaWYgdGhlIHVzZSBvZiBldmFsIGlzIGFsbG93ZWQgZm9yCisgKiBldmFsdWF0aW5nIHRleHQgY29udGVudC4gRGVmYXVsdCBpcyB0cnVlLiBTZXQgdGhpcyB0byBmYWxzZSBpZiBzdHlsZXNoZWV0cworICogbWF5IGNvbnRhaW4gdXNlciBpbnB1dC4KKyAqLworbXhTdHlsZXNoZWV0Q29kZWMuYWxsb3dFdmFsID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9pby9teFRlcm1pbmFsQ2hhbmdlQ29kZWMuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaW8vbXhUZXJtaW5hbENoYW5nZUNvZGVjLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NWY0N2YKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvaW8vbXhUZXJtaW5hbENoYW5nZUNvZGVjLmpzCkBAIC0wLDAgKzEsNDIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KK214Q29kZWNSZWdpc3RyeS5yZWdpc3RlcihmdW5jdGlvbigpCit7CisJLyoqCisJICogQ2xhc3M6IG14VGVybWluYWxDaGFuZ2VDb2RlYworCSAqCisJICogQ29kZWMgZm9yIDxteFRlcm1pbmFsQ2hhbmdlPnMuIFRoaXMgY2xhc3MgaXMgY3JlYXRlZCBhbmQgcmVnaXN0ZXJlZAorCSAqIGR5bmFtaWNhbGx5IGF0IGxvYWQgdGltZSBhbmQgdXNlZCBpbXBsaWNpdGVseSB2aWEgPG14Q29kZWM+IGFuZAorCSAqIHRoZSA8bXhDb2RlY1JlZ2lzdHJ5Pi4KKwkgKgorCSAqIFRyYW5zaWVudCBGaWVsZHM6CisJICoKKwkgKiAtIG1vZGVsCisJICogLSBwcmV2aW91cworCSAqCisJICogUmVmZXJlbmNlIEZpZWxkczoKKwkgKgorCSAqIC0gY2VsbAorCSAqIC0gdGVybWluYWwKKwkgKi8KKwl2YXIgY29kZWMgPSBuZXcgbXhPYmplY3RDb2RlYyhuZXcgbXhUZXJtaW5hbENoYW5nZSgpLAorCQlbJ21vZGVsJywgJ3ByZXZpb3VzJ10sIFsnY2VsbCcsICd0ZXJtaW5hbCddKTsKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBhZnRlckRlY29kZQorCSAqCisJICogUmVzdG9yZXMgdGhlIHN0YXRlIGJ5IGFzc2lnbmluZyB0aGUgcHJldmlvdXMgdmFsdWUuCisJICovCisJY29kZWMuYWZ0ZXJEZWNvZGUgPSBmdW5jdGlvbihkZWMsIG5vZGUsIG9iaikKKwl7CisJCW9iai5wcmV2aW91cyA9IG9iai50ZXJtaW5hbDsKKwkJCisJCXJldHVybiBvYmo7CisJfTsKKworCS8vIFJldHVybnMgdGhlIGNvZGVjIGludG8gdGhlIHJlZ2lzdHJ5CisJcmV0dXJuIGNvZGVjOworCit9KCkpOwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9oaWVyYXJjaGljYWwvbW9kZWwvbXhHcmFwaEFic3RyYWN0SGllcmFyY2h5Q2VsbC5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL21vZGVsL214R3JhcGhBYnN0cmFjdEhpZXJhcmNoeUNlbGwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4MWIwYgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL21vZGVsL214R3JhcGhBYnN0cmFjdEhpZXJhcmNoeUNlbGwuanMKQEAgLTAsMCArMSwyMDYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14R3JhcGhBYnN0cmFjdEhpZXJhcmNoeUNlbGwKKyAqIAorICogQW4gYWJzdHJhY3Rpb24gb2YgYW4gaW50ZXJuYWwgaGllcmFyY2h5IG5vZGUgb3IgZWRnZQorICogCisgKiBDb25zdHJ1Y3RvcjogbXhHcmFwaEFic3RyYWN0SGllcmFyY2h5Q2VsbAorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgaGllcmFyY2hpY2FsIGxheW91dCBhbGdvcml0aG0uCisgKgorICogQXJndW1lbnRzOgorICogCisgKiBncmFwaCAtIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEdyYXBoPi4KKyAqIGRldGVybWluaXN0aWMgLSBPcHRpb25hbCBib29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIHRoaXMgbGF5b3V0IHNob3VsZCBiZQorICogZGV0ZXJtaW5pc3RpYy4gRGVmYXVsdCBpcyB0cnVlLgorICovCitmdW5jdGlvbiBteEdyYXBoQWJzdHJhY3RIaWVyYXJjaHlDZWxsKCkKK3sKKwl0aGlzLnggPSBbXTsKKwl0aGlzLnkgPSBbXTsKKwl0aGlzLnRlbXAgPSBbXTsKK307CisKKy8qKgorICogVmFyaWFibGU6IG1heFJhbmsKKyAqIAorICogVGhlIG1heGltdW0gcmFuayB0aGlzIGNlbGwgb2NjdXBpZXMuIERlZmF1bHQgaXMgLTEuCisgKi8KK214R3JhcGhBYnN0cmFjdEhpZXJhcmNoeUNlbGwucHJvdG90eXBlLm1heFJhbmsgPSAtMTsKKworLyoqCisgKiBWYXJpYWJsZTogbWluUmFuaworICogCisgKiBUaGUgbWluaW11bSByYW5rIHRoaXMgY2VsbCBvY2N1cGllcy4gRGVmYXVsdCBpcyAtMS4KKyAqLworbXhHcmFwaEFic3RyYWN0SGllcmFyY2h5Q2VsbC5wcm90b3R5cGUubWluUmFuayA9IC0xOworCisvKioKKyAqIFZhcmlhYmxlOiB4CisgKiAKKyAqIFRoZSB4IHBvc2l0aW9uIG9mIHRoaXMgY2VsbCBmb3IgZWFjaCBsYXllciBpdCBvY2N1cGllcworICovCitteEdyYXBoQWJzdHJhY3RIaWVyYXJjaHlDZWxsLnByb3RvdHlwZS54ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogeQorICogCisgKiBUaGUgeSBwb3NpdGlvbiBvZiB0aGlzIGNlbGwgZm9yIGVhY2ggbGF5ZXIgaXQgb2NjdXBpZXMKKyAqLworbXhHcmFwaEFic3RyYWN0SGllcmFyY2h5Q2VsbC5wcm90b3R5cGUueSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHdpZHRoCisgKiAKKyAqIFRoZSB3aWR0aCBvZiB0aGlzIGNlbGwKKyAqLworbXhHcmFwaEFic3RyYWN0SGllcmFyY2h5Q2VsbC5wcm90b3R5cGUud2lkdGggPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBoZWlnaHQKKyAqIAorICogVGhlIGhlaWdodCBvZiB0aGlzIGNlbGwKKyAqLworbXhHcmFwaEFic3RyYWN0SGllcmFyY2h5Q2VsbC5wcm90b3R5cGUuaGVpZ2h0ID0gMDsKKworLyoqCisgKiBWYXJpYWJsZTogbmV4dExheWVyQ29ubmVjdGVkQ2VsbHMKKyAqIAorICogQSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgY2VsbHMgdGhpcyBjZWxsIGNvbm5lY3RzIHRvIG9uIHRoZSBuZXh0IGxheWVyIHVwCisgKi8KK214R3JhcGhBYnN0cmFjdEhpZXJhcmNoeUNlbGwucHJvdG90eXBlLm5leHRMYXllckNvbm5lY3RlZENlbGxzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogcHJldmlvdXNMYXllckNvbm5lY3RlZENlbGxzCisgKiAKKyAqIEEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIGNlbGxzIHRoaXMgY2VsbCBjb25uZWN0cyB0byBvbiB0aGUgbmV4dCBsYXllciBkb3duCisgKi8KK214R3JhcGhBYnN0cmFjdEhpZXJhcmNoeUNlbGwucHJvdG90eXBlLnByZXZpb3VzTGF5ZXJDb25uZWN0ZWRDZWxscyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHRlbXAKKyAqIAorICogVGVtcG9yYXJ5IHZhcmlhYmxlIGZvciBnZW5lcmFsIHVzZS4gR2VuZXJhbGx5LCB0cnkgdG8gYXZvaWQKKyAqIGNhcnJ5aW5nIGluZm9ybWF0aW9uIGJldHdlZW4gc3RhZ2VzLiBDdXJyZW50bHksIHRoZSBsb25nZXN0CisgKiBwYXRoIGxheWVyaW5nIHNldHMgdGVtcCB0byB0aGUgcmFuayBwb3NpdGlvbiBpbiBmaXhSYW5rcygpCisgKiBhbmQgdGhlIGNyb3NzaW5nIHJlZHVjdGlvbiB1c2VzIHRoaXMuIFRoaXMgbWVhbnQgdGVtcCBjb3VsZG4ndAorICogYmUgdXNlZCBmb3IgaGFzaGluZyB0aGUgbm9kZXMgaW4gdGhlIG1vZGVsIGRmcyBhbmQgc28gaGFzaENvZGUKKyAqIHdhcyBjcmVhdGVkCisgKi8KK214R3JhcGhBYnN0cmFjdEhpZXJhcmNoeUNlbGwucHJvdG90eXBlLnRlbXAgPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXROZXh0TGF5ZXJDb25uZWN0ZWRDZWxscworICogCisgKiBSZXR1cm5zIHRoZSBjZWxscyB0aGlzIGNlbGwgY29ubmVjdHMgdG8gb24gdGhlIG5leHQgbGF5ZXIgdXAKKyAqLworbXhHcmFwaEFic3RyYWN0SGllcmFyY2h5Q2VsbC5wcm90b3R5cGUuZ2V0TmV4dExheWVyQ29ubmVjdGVkQ2VsbHMgPSBmdW5jdGlvbihsYXllcikKK3sKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFByZXZpb3VzTGF5ZXJDb25uZWN0ZWRDZWxscworICogCisgKiBSZXR1cm5zIHRoZSBjZWxscyB0aGlzIGNlbGwgY29ubmVjdHMgdG8gb24gdGhlIG5leHQgbGF5ZXIgZG93bgorICovCitteEdyYXBoQWJzdHJhY3RIaWVyYXJjaHlDZWxsLnByb3RvdHlwZS5nZXRQcmV2aW91c0xheWVyQ29ubmVjdGVkQ2VsbHMgPSBmdW5jdGlvbihsYXllcikKK3sKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzRWRnZQorICogCisgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoaXMgY2VsbCBpcyBhbiBlZGdlCisgKi8KK214R3JhcGhBYnN0cmFjdEhpZXJhcmNoeUNlbGwucHJvdG90eXBlLmlzRWRnZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1ZlcnRleAorICogCisgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoaXMgY2VsbCBpcyBhIG5vZGUKKyAqLworbXhHcmFwaEFic3RyYWN0SGllcmFyY2h5Q2VsbC5wcm90b3R5cGUuaXNWZXJ0ZXggPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZQorICogCisgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0ZW1wIGZvciB0aGUgc3BlY2lmaWVkIGxheWVyCisgKi8KK214R3JhcGhBYnN0cmFjdEhpZXJhcmNoeUNlbGwucHJvdG90eXBlLmdldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUgPSBmdW5jdGlvbihsYXllcikKK3sKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUKKyAqIAorICogU2V0IHRoZSB2YWx1ZSBvZiB0ZW1wIGZvciB0aGUgc3BlY2lmaWVkIGxheWVyCisgKi8KK214R3JhcGhBYnN0cmFjdEhpZXJhcmNoeUNlbGwucHJvdG90eXBlLnNldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUgPSBmdW5jdGlvbihsYXllciwgdmFsdWUpCit7CisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRYCisgKiAKKyAqIFNldCB0aGUgdmFsdWUgb2YgeCBmb3IgdGhlIHNwZWNpZmllZCBsYXllcgorICovCitteEdyYXBoQWJzdHJhY3RIaWVyYXJjaHlDZWxsLnByb3RvdHlwZS5zZXRYID0gZnVuY3Rpb24obGF5ZXIsIHZhbHVlKQoreworCWlmICh0aGlzLmlzVmVydGV4KCkpCisJeworCQl0aGlzLnhbMF0gPSB2YWx1ZTsKKwl9CisJZWxzZSBpZiAodGhpcy5pc0VkZ2UoKSkKKwl7CisJCXRoaXMueFtsYXllciAtIHRoaXMubWluUmFuayAtIDFdID0gdmFsdWU7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0WAorICogCisgKiBHZXRzIHRoZSB2YWx1ZSBvZiB4IG9uIHRoZSBzcGVjaWZpZWQgbGF5ZXIKKyAqLworbXhHcmFwaEFic3RyYWN0SGllcmFyY2h5Q2VsbC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uKGxheWVyKQoreworCWlmICh0aGlzLmlzVmVydGV4KCkpCisJeworCQlyZXR1cm4gdGhpcy54WzBdOworCX0KKwllbHNlIGlmICh0aGlzLmlzRWRnZSgpKQorCXsKKwkJcmV0dXJuIHRoaXMueFtsYXllciAtIHRoaXMubWluUmFuayAtIDFdOworCX0KKworCXJldHVybiAwLjA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRZCisgKiAKKyAqIFNldCB0aGUgdmFsdWUgb2YgeSBmb3IgdGhlIHNwZWNpZmllZCBsYXllcgorICovCitteEdyYXBoQWJzdHJhY3RIaWVyYXJjaHlDZWxsLnByb3RvdHlwZS5zZXRZID0gZnVuY3Rpb24obGF5ZXIsIHZhbHVlKQoreworCWlmICh0aGlzLmlzVmVydGV4KCkpCisJeworCQl0aGlzLnlbMF0gPSB2YWx1ZTsKKwl9CisJZWxzZSBpZiAodGhpcy5pc0VkZ2UoKSkKKwl7CisJCXRoaXMueVtsYXllciAtdGhpcy4gbWluUmFuayAtIDFdID0gdmFsdWU7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL21vZGVsL214R3JhcGhIaWVyYXJjaHlFZGdlLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9oaWVyYXJjaGljYWwvbW9kZWwvbXhHcmFwaEhpZXJhcmNoeUVkZ2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY4MWNiYgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL21vZGVsL214R3JhcGhIaWVyYXJjaHlFZGdlLmpzCkBAIC0wLDAgKzEsMTg3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteEdyYXBoSGllcmFyY2h5RWRnZQorICogCisgKiBBbiBhYnN0cmFjdGlvbiBvZiBhIGhpZXJhcmNoaWNhbCBlZGdlIGZvciB0aGUgaGllcmFyY2h5IGxheW91dAorICogCisgKiBDb25zdHJ1Y3RvcjogbXhHcmFwaEhpZXJhcmNoeUVkZ2UKKyAqCisgKiBDb25zdHJ1Y3RzIGEgaGllcmFyY2h5IGVkZ2UKKyAqCisgKiBBcmd1bWVudHM6CisgKiAKKyAqIGVkZ2VzIC0gYSBsaXN0IG9mIHJlYWwgZ3JhcGggZWRnZXMgdGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzCisgKi8KK2Z1bmN0aW9uIG14R3JhcGhIaWVyYXJjaHlFZGdlKGVkZ2VzKQoreworCW14R3JhcGhBYnN0cmFjdEhpZXJhcmNoeUNlbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl0aGlzLmVkZ2VzID0gZWRnZXM7CisJdGhpcy5pZHMgPSBbXTsKKwkKKwlmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKQorCXsKKwkJdGhpcy5pZHMucHVzaChteE9iamVjdElkZW50aXR5LmdldChlZGdlc1tpXSkpOworCX0KK307CisKKy8qKgorICogRXh0ZW5kcyBteEdyYXBoQWJzdHJhY3RIaWVyYXJjaHlDZWxsLgorICovCitteEdyYXBoSGllcmFyY2h5RWRnZS5wcm90b3R5cGUgPSBuZXcgbXhHcmFwaEFic3RyYWN0SGllcmFyY2h5Q2VsbCgpOworbXhHcmFwaEhpZXJhcmNoeUVkZ2UucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhHcmFwaEhpZXJhcmNoeUVkZ2U7CisKKy8qKgorICogVmFyaWFibGU6IGVkZ2VzCisgKiAKKyAqIFRoZSBncmFwaCBlZGdlKHMpIHRoaXMgb2JqZWN0IHJlcHJlc2VudHMuIFBhcmFsbGVsIGVkZ2VzIGFyZSBhbGwgZ3JvdXBlZAorICogdG9nZXRoZXIgd2l0aGluIG9uZSBoaWVyYXJjaHkgZWRnZS4KKyAqLworbXhHcmFwaEhpZXJhcmNoeUVkZ2UucHJvdG90eXBlLmVkZ2VzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogaWRzCisgKiAKKyAqIFRoZSBvYmplY3QgaWRlbnRpdGllcyBvZiB0aGUgd3JhcHBlZCBjZWxscworICovCitteEdyYXBoSGllcmFyY2h5RWRnZS5wcm90b3R5cGUuaWRzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogc291cmNlCisgKiAKKyAqIFRoZSBub2RlIHRoaXMgZWRnZSBpcyBzb3VyY2VkIGF0CisgKi8KK214R3JhcGhIaWVyYXJjaHlFZGdlLnByb3RvdHlwZS5zb3VyY2UgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB0YXJnZXQKKyAqIAorICogVGhlIG5vZGUgdGhpcyBlZGdlIHRhcmdldHMKKyAqLworbXhHcmFwaEhpZXJhcmNoeUVkZ2UucHJvdG90eXBlLnRhcmdldCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGlzUmV2ZXJzZWQKKyAqIAorICogV2hldGhlciBvciBub3QgdGhlIGRpcmVjdGlvbiBvZiB0aGlzIGVkZ2UgaGFzIGJlZW4gcmV2ZXJzZWQKKyAqIGludGVybmFsbHkgdG8gY3JlYXRlIGEgREFHIGZvciB0aGUgaGllcmFyY2hpY2FsIGxheW91dAorICovCitteEdyYXBoSGllcmFyY2h5RWRnZS5wcm90b3R5cGUuaXNSZXZlcnNlZCA9IGZhbHNlOworCisvKioKKyAqIEZ1bmN0aW9uOiBpbnZlcnQKKyAqIAorICogSW52ZXJ0cyB0aGUgZGlyZWN0aW9uIG9mIHRoaXMgaW50ZXJuYWwgZWRnZShzKQorICovCitteEdyYXBoSGllcmFyY2h5RWRnZS5wcm90b3R5cGUuaW52ZXJ0ID0gZnVuY3Rpb24obGF5ZXIpCit7CisJdmFyIHRlbXAgPSB0aGlzLnNvdXJjZTsKKwl0aGlzLnNvdXJjZSA9IHRoaXMudGFyZ2V0OworCXRoaXMudGFyZ2V0ID0gdGVtcDsKKwl0aGlzLmlzUmV2ZXJzZWQgPSAhdGhpcy5pc1JldmVyc2VkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0TmV4dExheWVyQ29ubmVjdGVkQ2VsbHMKKyAqIAorICogUmV0dXJucyB0aGUgY2VsbHMgdGhpcyBjZWxsIGNvbm5lY3RzIHRvIG9uIHRoZSBuZXh0IGxheWVyIHVwCisgKi8KK214R3JhcGhIaWVyYXJjaHlFZGdlLnByb3RvdHlwZS5nZXROZXh0TGF5ZXJDb25uZWN0ZWRDZWxscyA9IGZ1bmN0aW9uKGxheWVyKQoreworCWlmICh0aGlzLm5leHRMYXllckNvbm5lY3RlZENlbGxzID09IG51bGwpCisJeworCQl0aGlzLm5leHRMYXllckNvbm5lY3RlZENlbGxzID0gW107CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudGVtcC5sZW5ndGg7IGkrKykKKwkJeworCQkJdGhpcy5uZXh0TGF5ZXJDb25uZWN0ZWRDZWxsc1tpXSA9IFtdOworCQkJCisJCQlpZiAoaSA9PSB0aGlzLnRlbXAubGVuZ3RoIC0gMSkKKwkJCXsKKwkJCQl0aGlzLm5leHRMYXllckNvbm5lY3RlZENlbGxzW2ldLnB1c2godGhpcy5zb3VyY2UpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRoaXMubmV4dExheWVyQ29ubmVjdGVkQ2VsbHNbaV0ucHVzaCh0aGlzKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gdGhpcy5uZXh0TGF5ZXJDb25uZWN0ZWRDZWxsc1tsYXllciAtIHRoaXMubWluUmFuayAtIDFdOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0UHJldmlvdXNMYXllckNvbm5lY3RlZENlbGxzCisgKiAKKyAqIFJldHVybnMgdGhlIGNlbGxzIHRoaXMgY2VsbCBjb25uZWN0cyB0byBvbiB0aGUgbmV4dCBsYXllciBkb3duCisgKi8KK214R3JhcGhIaWVyYXJjaHlFZGdlLnByb3RvdHlwZS5nZXRQcmV2aW91c0xheWVyQ29ubmVjdGVkQ2VsbHMgPSBmdW5jdGlvbihsYXllcikKK3sKKwlpZiAodGhpcy5wcmV2aW91c0xheWVyQ29ubmVjdGVkQ2VsbHMgPT0gbnVsbCkKKwl7CisJCXRoaXMucHJldmlvdXNMYXllckNvbm5lY3RlZENlbGxzID0gW107CisKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRlbXAubGVuZ3RoOyBpKyspCisJCXsKKwkJCXRoaXMucHJldmlvdXNMYXllckNvbm5lY3RlZENlbGxzW2ldID0gW107CisJCQkKKwkJCWlmIChpID09IDApCisJCQl7CisJCQkJdGhpcy5wcmV2aW91c0xheWVyQ29ubmVjdGVkQ2VsbHNbaV0ucHVzaCh0aGlzLnRhcmdldCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdGhpcy5wcmV2aW91c0xheWVyQ29ubmVjdGVkQ2VsbHNbaV0ucHVzaCh0aGlzKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiB0aGlzLnByZXZpb3VzTGF5ZXJDb25uZWN0ZWRDZWxsc1tsYXllciAtIHRoaXMubWluUmFuayAtIDFdOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFZGdlCisgKiAKKyAqIFJldHVybnMgdHJ1ZS4KKyAqLworbXhHcmFwaEhpZXJhcmNoeUVkZ2UucHJvdG90eXBlLmlzRWRnZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUKKyAqIAorICogR2V0cyB0aGUgdmFsdWUgb2YgdGVtcCBmb3IgdGhlIHNwZWNpZmllZCBsYXllcgorICovCitteEdyYXBoSGllcmFyY2h5RWRnZS5wcm90b3R5cGUuZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZSA9IGZ1bmN0aW9uKGxheWVyKQoreworCXJldHVybiB0aGlzLnRlbXBbbGF5ZXIgLSB0aGlzLm1pblJhbmsgLSAxXTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUKKyAqIAorICogU2V0IHRoZSB2YWx1ZSBvZiB0ZW1wIGZvciB0aGUgc3BlY2lmaWVkIGxheWVyCisgKi8KK214R3JhcGhIaWVyYXJjaHlFZGdlLnByb3RvdHlwZS5zZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlID0gZnVuY3Rpb24obGF5ZXIsIHZhbHVlKQoreworCXRoaXMudGVtcFtsYXllciAtIHRoaXMubWluUmFuayAtIDFdID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDb3JlQ2VsbAorICogCisgKiBHZXRzIHRoZSBmaXJzdCBjb3JlIGVkZ2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd3JhcHBlcgorICovCitteEdyYXBoSGllcmFyY2h5RWRnZS5wcm90b3R5cGUuZ2V0Q29yZUNlbGwgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMuZWRnZXMgIT0gbnVsbCAmJiB0aGlzLmVkZ2VzLmxlbmd0aCA+IDApCisJeworCQlyZXR1cm4gdGhpcy5lZGdlc1swXTsKKwl9CisJCisJcmV0dXJuIG51bGw7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9oaWVyYXJjaGljYWwvbW9kZWwvbXhHcmFwaEhpZXJhcmNoeU1vZGVsLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9oaWVyYXJjaGljYWwvbW9kZWwvbXhHcmFwaEhpZXJhcmNoeU1vZGVsLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMzdlMDkKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L2hpZXJhcmNoaWNhbC9tb2RlbC9teEdyYXBoSGllcmFyY2h5TW9kZWwuanMKQEAgLTAsMCArMSw2ODEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14R3JhcGhIaWVyYXJjaHlNb2RlbAorICoKKyAqIEludGVybmFsIG1vZGVsIG9mIGEgaGllcmFyY2hpY2FsIGdyYXBoLiBUaGlzIG1vZGVsIHN0b3JlcyBub2RlcyBhbmQgZWRnZXMKKyAqIGVxdWl2YWxlbnQgdG8gdGhlIHJlYWwgZ3JhcGggbm9kZXMgYW5kIGVkZ2VzLCBidXQgYWxzbyBzdG9yZXMgdGhlIHJhbmsgb2YgdGhlCisgKiBjZWxscywgdGhlIG9yZGVyIHdpdGhpbiB0aGUgcmFua3MgYW5kIHRoZSBuZXcgY2FuZGlkYXRlIGxvY2F0aW9ucyBvZiBjZWxscy4KKyAqIFRoZSBpbnRlcm5hbCBtb2RlbCBhbHNvIHJldmVyc2VzIGVkZ2UgZGlyZWN0aW9uIHdlcmUgYXBwcm9wcmlhdGUgLCBpZ25vcmVzCisgKiBzZWxmLWxvb3AgYW5kIGdyb3VwcyBwYXJhbGxlbHMgdG9nZXRoZXIgdW5kZXIgb25lIGVkZ2Ugb2JqZWN0LgorICoKKyAqIENvbnN0cnVjdG9yOiBteEdyYXBoSGllcmFyY2h5TW9kZWwKKyAqCisgKiBDcmVhdGVzIGFuIGludGVybmFsIG9yZGVyZWQgZ3JhcGggbW9kZWwgdXNpbmcgdGhlIHZlcnRpY2VzIHBhc3NlZCBpbi4gSWYKKyAqIHRoZXJlIGFyZSBhbnksIGxlZnR3YXJkIGVkZ2UgbmVlZCB0byBiZSBpbnZlcnRlZCBpbiB0aGUgaW50ZXJuYWwgbW9kZWwKKyAqCisgKiBBcmd1bWVudHM6CisgKgorICogZ3JhcGggLSB0aGUgZmFjYWRlIGRlc2NyaWJpbmcgdGhlIGdyYXBoIHRvIGJlIG9wZXJhdGVkIG9uCisgKiB2ZXJ0aWNlcyAtIHRoZSB2ZXJ0aWNlcyBmb3IgdGhpcyBoaWVyYXJjaHkKKyAqIG9yZGVyZWQgLSB3aGV0aGVyIG9yIG5vdCB0aGUgdmVydGljZXMgYXJlIGFscmVhZHkgb3JkZXJlZAorICogZGV0ZXJtaW5pc3RpYyAtIHdoZXRoZXIgb3Igbm90IHRoaXMgbGF5b3V0IHNob3VsZCBiZSBkZXRlcm1pbmlzdGljIG9uIGVhY2gKKyAqIHRpZ2h0ZW5Ub1NvdXJjZSAtIHdoZXRoZXIgb3Igbm90IHRvIHRpZ2h0ZW4gdmVydGljZXMgdG93YXJkcyB0aGUgc291cmNlcworICogc2NhblJhbmtzRnJvbVNpbmtzIC0gV2hldGhlciByYW5rIGFzc2lnbm1lbnQgaXMgZnJvbSB0aGUgc2lua3Mgb3Igc291cmNlcy4KKyAqIHVzYWdlCisgKi8KK2Z1bmN0aW9uIG14R3JhcGhIaWVyYXJjaHlNb2RlbChsYXlvdXQsIHZlcnRpY2VzLCByb290cywgcGFyZW50LCB0aWdodGVuVG9Tb3VyY2UpCit7CisJdmFyIGdyYXBoID0gbGF5b3V0LmdldEdyYXBoKCk7CisJdGhpcy50aWdodGVuVG9Tb3VyY2UgPSB0aWdodGVuVG9Tb3VyY2U7CisJdGhpcy5yb290cyA9IHJvb3RzOworCXRoaXMucGFyZW50ID0gcGFyZW50OworCisJLy8gbWFwIG9mIGNlbGxzIHRvIGludGVybmFsIGNlbGwgbmVlZGVkIGZvciBzZWNvbmQgcnVuIHRocm91Z2gKKwkvLyB0byBzZXR1cCB0aGUgc2luayBvZiBlZGdlcyBjb3JyZWN0bHkKKwl0aGlzLnZlcnRleE1hcHBlciA9IG5ldyBteERpY3Rpb25hcnkoKTsKKwl0aGlzLmVkZ2VNYXBwZXIgPSBuZXcgbXhEaWN0aW9uYXJ5KCk7CisJdGhpcy5tYXhSYW5rID0gMDsKKwl2YXIgaW50ZXJuYWxWZXJ0aWNlcyA9IFtdOworCisJaWYgKHZlcnRpY2VzID09IG51bGwpCisJeworCQl2ZXJ0aWNlcyA9IHRoaXMuZ3JhcGguZ2V0Q2hpbGRWZXJ0aWNlcyhwYXJlbnQpOworCX0KKworCXRoaXMubWF4UmFuayA9IHRoaXMuU09VUkNFU0NBTlNUQVJUUkFOSzsKKwkvLyBtYXAgb2YgY2VsbHMgdG8gaW50ZXJuYWwgY2VsbCBuZWVkZWQgZm9yIHNlY29uZCBydW4gdGhyb3VnaAorCS8vIHRvIHNldHVwIHRoZSBzaW5rIG9mIGVkZ2VzIGNvcnJlY3RseS4gR3Vlc3Mgc2l6ZSBieSBudW1iZXIKKwkvLyBvZiBlZGdlcyBpcyByb3VnaGx5IHNhbWUgYXMgbnVtYmVyIG9mIHZlcnRpY2VzLgorCXRoaXMuY3JlYXRlSW50ZXJuYWxDZWxscyhsYXlvdXQsIHZlcnRpY2VzLCBpbnRlcm5hbFZlcnRpY2VzKTsKKworCS8vIEdvIHRocm91Z2ggZWRnZXMgc2V0IHRoZWlyIHNpbmsgdmFsdWVzLiBBbHNvIGNoZWNrIHRoZQorCS8vIG9yZGVyaW5nIGlmIGFuZCBpbnZlcnQgZWRnZXMgaWYgbmVjZXNzYXJ5CisJZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykKKwl7CisJCXZhciBlZGdlcyA9IGludGVybmFsVmVydGljZXNbaV0uY29ubmVjdHNBc1NvdXJjZTsKKworCQlmb3IgKHZhciBqID0gMDsgaiA8IGVkZ2VzLmxlbmd0aDsgaisrKQorCQl7CisJCQl2YXIgaW50ZXJuYWxFZGdlID0gZWRnZXNbal07CisJCQl2YXIgcmVhbEVkZ2VzID0gaW50ZXJuYWxFZGdlLmVkZ2VzOworCisJCQkvLyBPbmx5IG5lZWQgdG8gcHJvY2VzcyB0aGUgZmlyc3QgcmVhbCBlZGdlLCBzaW5jZQorCQkJLy8gYWxsIHRoZSBlZGdlcyBjb25uZWN0IHRvIHRoZSBzYW1lIG90aGVyIHZlcnRleAorCQkJaWYgKHJlYWxFZGdlcyAhPSBudWxsICYmIHJlYWxFZGdlcy5sZW5ndGggPiAwKQorCQkJeworCQkJCXZhciByZWFsRWRnZSA9IHJlYWxFZGdlc1swXTsKKwkJCQl2YXIgdGFyZ2V0Q2VsbCA9IGxheW91dC5nZXRWaXNpYmxlVGVybWluYWwoCisJCQkJCQlyZWFsRWRnZSwgZmFsc2UpOworCQkJCXZhciBpbnRlcm5hbFRhcmdldENlbGwgPSB0aGlzLnZlcnRleE1hcHBlci5nZXQodGFyZ2V0Q2VsbCk7CisKKwkJCQlpZiAoaW50ZXJuYWxWZXJ0aWNlc1tpXSA9PSBpbnRlcm5hbFRhcmdldENlbGwpCisJCQkJeworCQkJCQkvLyBJZiB0aGVyZSBhcmUgcGFyYWxsZWwgZWRnZXMgZ29pbmcgYmV0d2VlbiB0d28gdmVydGljZXMgYW5kIG5vdCBhbGwgYXJlIGluIHRoZSBzYW1lIGRpcmVjdGlvbgorCQkJCQkvLyB5b3UgY2FuIGhhdmUgbmF2aWdhdGVkIGFjcm9zcyBvbmUgZGlyZWN0aW9uIHdoZW4gZG9pbmcgdGhlIGN5Y2xlIHJldmVyc2FsIHRoYXQgaXNuJ3QgdGhlIHNhbWUKKwkJCQkJLy8gZGlyZWN0aW9uIGFzIHRoZSBmaXJzdCByZWFsIGVkZ2UgaW4gdGhlIGFycmF5IGFib3ZlLiBXaGVuIHRoYXQgaGFwcGVucyB0aGUgaWYgYWJvdmUgY2F0Y2hlcworCQkJCQkvLyB0aGF0IGFuZCB3ZSBjb3JyZWN0IHRoZSB0YXJnZXQgY2VsbCBiZWZvcmUgY29udGludWluZy4KKwkJCQkJLy8gVGhpcyBicmFuY2ggb25seSBkZXRlY3RzIHRoaXMgc2luZ2xlIGNhc2UKKwkJCQkJdGFyZ2V0Q2VsbCA9IGxheW91dC5nZXRWaXNpYmxlVGVybWluYWwoCisJCQkJCQkJcmVhbEVkZ2UsIHRydWUpOworCQkJCQlpbnRlcm5hbFRhcmdldENlbGwgPSB0aGlzLnZlcnRleE1hcHBlci5nZXQodGFyZ2V0Q2VsbCk7CisJCQkJfQorCQkJCQorCQkJCWlmIChpbnRlcm5hbFRhcmdldENlbGwgIT0gbnVsbAorCQkJCQkJJiYgaW50ZXJuYWxWZXJ0aWNlc1tpXSAhPSBpbnRlcm5hbFRhcmdldENlbGwpCisJCQkJeworCQkJCQlpbnRlcm5hbEVkZ2UudGFyZ2V0ID0gaW50ZXJuYWxUYXJnZXRDZWxsOworCisJCQkJCWlmIChpbnRlcm5hbFRhcmdldENlbGwuY29ubmVjdHNBc1RhcmdldC5sZW5ndGggPT0gMCkKKwkJCQkJeworCQkJCQkJaW50ZXJuYWxUYXJnZXRDZWxsLmNvbm5lY3RzQXNUYXJnZXQgPSBbXTsKKwkJCQkJfQorCisJCQkJCWlmIChteFV0aWxzLmluZGV4T2YoaW50ZXJuYWxUYXJnZXRDZWxsLmNvbm5lY3RzQXNUYXJnZXQsIGludGVybmFsRWRnZSkgPCAwKQorCQkJCQl7CisJCQkJCQlpbnRlcm5hbFRhcmdldENlbGwuY29ubmVjdHNBc1RhcmdldC5wdXNoKGludGVybmFsRWRnZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBVc2UgdGhlIHRlbXAgdmFyaWFibGUgaW4gdGhlIGludGVybmFsIG5vZGVzIHRvIG1hcmsgdGhpcworCQkvLyBpbnRlcm5hbCB2ZXJ0ZXggYXMgaGF2aW5nIGJlZW4gdmlzaXRlZC4KKwkJaW50ZXJuYWxWZXJ0aWNlc1tpXS50ZW1wWzBdID0gMTsKKwl9Cit9OworCisvKioKKyAqIFZhcmlhYmxlOiBtYXhSYW5rCisgKgorICogU3RvcmVzIHRoZSBsYXJnZXN0IHJhbmsgbnVtYmVyIGFsbG9jYXRlZAorICovCitteEdyYXBoSGllcmFyY2h5TW9kZWwucHJvdG90eXBlLm1heFJhbmsgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB2ZXJ0ZXhNYXBwZXIKKyAqCisgKiBNYXAgZnJvbSBncmFwaCB2ZXJ0aWNlcyB0byBpbnRlcm5hbCBtb2RlbCBub2Rlcy4KKyAqLworbXhHcmFwaEhpZXJhcmNoeU1vZGVsLnByb3RvdHlwZS52ZXJ0ZXhNYXBwZXIgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBlZGdlTWFwcGVyCisgKgorICogTWFwIGZyb20gZ3JhcGggZWRnZXMgdG8gaW50ZXJuYWwgbW9kZWwgZWRnZXMKKyAqLworbXhHcmFwaEhpZXJhcmNoeU1vZGVsLnByb3RvdHlwZS5lZGdlTWFwcGVyID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogcmFua3MKKyAqCisgKiBNYXBwaW5nIGZyb20gcmFuayBudW1iZXIgdG8gYWN0dWFsIHJhbmsKKyAqLworbXhHcmFwaEhpZXJhcmNoeU1vZGVsLnByb3RvdHlwZS5yYW5rcyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHJvb3RzCisgKgorICogU3RvcmUgb2Ygcm9vdHMgb2YgdGhpcyBoaWVyYXJjaHkgbW9kZWwsIHRoZXNlIGFyZSByZWFsIGdyYXBoIGNlbGxzLCBub3QKKyAqIGludGVybmFsIGNlbGxzCisgKi8KK214R3JhcGhIaWVyYXJjaHlNb2RlbC5wcm90b3R5cGUucm9vdHMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBwYXJlbnQKKyAqCisgKiBUaGUgcGFyZW50IGNlbGwgd2hvc2UgY2hpbGRyZW4gYXJlIGJlaW5nIGxhaWQgb3V0CisgKi8KK214R3JhcGhIaWVyYXJjaHlNb2RlbC5wcm90b3R5cGUucGFyZW50ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZGZzQ291bnQKKyAqCisgKiBDb3VudCBvZiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhbmNlc3RvciBkZnMgaGFzIGJlZW4gdXNlZC4KKyAqLworbXhHcmFwaEhpZXJhcmNoeU1vZGVsLnByb3RvdHlwZS5kZnNDb3VudCA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IFNPVVJDRVNDQU5TVEFSVFJBTksKKyAqCisgKiBIaWdoIHZhbHVlIHRvIHN0YXJ0IHNvdXJjZSBsYXllcmluZyBzY2FuIHJhbmsgdmFsdWUgZnJvbS4KKyAqLworbXhHcmFwaEhpZXJhcmNoeU1vZGVsLnByb3RvdHlwZS5TT1VSQ0VTQ0FOU1RBUlRSQU5LID0gMTAwMDAwMDAwOworCisvKioKKyAqIFZhcmlhYmxlOiB0aWdodGVuVG9Tb3VyY2UKKyAqCisgKiBXaGV0aGVyIG9yIG5vdCB0byB0aWdodGVuIHRoZSBhc3NpZ25lZCByYW5rcyBvZiB2ZXJ0aWNlcyB1cCB0b3dhcmRzCisgKiB0aGUgc291cmNlIGNlbGxzLgorICovCitteEdyYXBoSGllcmFyY2h5TW9kZWwucHJvdG90eXBlLnRpZ2h0ZW5Ub1NvdXJjZSA9IGZhbHNlOworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVJbnRlcm5hbENlbGxzCisgKgorICogQ3JlYXRlcyBhbGwgZWRnZXMgaW4gdGhlIGludGVybmFsIG1vZGVsCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBsYXlvdXQgLSBSZWZlcmVuY2UgdG8gdGhlIDxteEhpZXJhcmNoaWNhbExheW91dD4gYWxnb3JpdGhtLgorICogdmVydGljZXMgLSBBcnJheSBvZiA8bXhDZWxscz4gdGhhdCByZXByZXNlbnQgdGhlIHZlcnRpY2VzIHdob20gYXJlIHRvCisgKiBoYXZlIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGNyZWF0ZWQuCisgKiBpbnRlcm5hbFZlcnRpY2VzIC0gVGhlIGFycmF5IG9mIDxteEdyYXBoSGllcmFyY2h5Tm9kZXM+IHRvIGhhdmUgdGhlaXIKKyAqIGluZm9ybWF0aW9uIGZpbGxlZCBpbiB1c2luZyB0aGUgcmVhbCB2ZXJ0aWNlcy4KKyAqLworbXhHcmFwaEhpZXJhcmNoeU1vZGVsLnByb3RvdHlwZS5jcmVhdGVJbnRlcm5hbENlbGxzID0gZnVuY3Rpb24obGF5b3V0LCB2ZXJ0aWNlcywgaW50ZXJuYWxWZXJ0aWNlcykKK3sKKwl2YXIgZ3JhcGggPSBsYXlvdXQuZ2V0R3JhcGgoKTsKKworCS8vIENyZWF0ZSBpbnRlcm5hbCBlZGdlcworCWZvciAodmFyIGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpKyspCisJeworCQlpbnRlcm5hbFZlcnRpY2VzW2ldID0gbmV3IG14R3JhcGhIaWVyYXJjaHlOb2RlKHZlcnRpY2VzW2ldKTsKKwkJdGhpcy52ZXJ0ZXhNYXBwZXIucHV0KHZlcnRpY2VzW2ldLCBpbnRlcm5hbFZlcnRpY2VzW2ldKTsKKworCQkvLyBJZiB0aGUgbGF5b3V0IGlzIGRldGVybWluaXN0aWMsIG9yZGVyIHRoZSBjZWxscworCQkvL0xpc3Qgb3V0Z29pbmdDZWxscyA9IGdyYXBoLmdldE5laWdoYm91cnModmVydGljZXNbaV0sIGRldGVybWluaXN0aWMpOworCQl2YXIgY29ubnMgPSBsYXlvdXQuZ2V0RWRnZXModmVydGljZXNbaV0pOworCQlpbnRlcm5hbFZlcnRpY2VzW2ldLmNvbm5lY3RzQXNTb3VyY2UgPSBbXTsKKworCQkvLyBDcmVhdGUgaW50ZXJuYWwgZWRnZXMsIGJ1dCBkb24ndCBkbyBhbnkgcmFuayBhc3NpZ25tZW50IHlldAorCQkvLyBGaXJzdCB1c2UgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGdyZWVkeSBjeWNsZSByZW1vdmVyIHRvCisJCS8vIGludmVydCB0aGUgbGVmdHdhcmQgZWRnZXMgaW50ZXJuYWxseQorCQlmb3IgKHZhciBqID0gMDsgaiA8IGNvbm5zLmxlbmd0aDsgaisrKQorCQl7CisJCQl2YXIgY2VsbCA9IGxheW91dC5nZXRWaXNpYmxlVGVybWluYWwoY29ubnNbal0sIGZhbHNlKTsKKworCQkJLy8gTG9va2luZyBmb3Igb3V0Z29pbmcgZWRnZXMgb25seQorCQkJaWYgKGNlbGwgIT0gdmVydGljZXNbaV0gJiYgbGF5b3V0LmdyYXBoLm1vZGVsLmlzVmVydGV4KGNlbGwpICYmCisJCQkJCSFsYXlvdXQuaXNWZXJ0ZXhJZ25vcmVkKGNlbGwpKQorCQkJeworCQkJCS8vIFdlIHByb2Nlc3MgYWxsIGVkZ2UgYmV0d2VlbiB0aGlzIHNvdXJjZSBhbmQgaXRzIHRhcmdldHMKKwkJCQkvLyBJZiB0aGVyZSBhcmUgZWRnZXMgZ29pbmcgYm90aCB3YXlzLCB3ZSBuZWVkIHRvIGNvbGxlY3QKKwkJCQkvLyB0aGVtIGFsbCBpbnRvIG9uZSBpbnRlcm5hbCBlZGdlcyB0byBhdm9pZCBsb29waW5nIHByb2JsZW1zCisJCQkJLy8gbGF0ZXIuIFdlIGFzc3VtZSB0aGlzIGRpcmVjdGlvbiAoc291cmNlIC0+IHRhcmdldCkgaXMgdGhlIAorCQkJCS8vIG5hdHVyYWwgZGlyZWN0aW9uIGlmIGF0IGxlYXN0IGhhbGYgdGhlIGVkZ2VzIGFyZSBnb2luZyBpbgorCQkJCS8vIHRoYXQgZGlyZWN0aW9uLgorCisJCQkJLy8gVGhlIGNoZWNrIGJlbG93IGZvciBlZGdlc1swXSBiZWluZyBpbiB0aGUgdmVydGV4IG1hcHBlciBpcworCQkJCS8vIGluIGNhc2Ugd2UndmUgcHJvY2Vzc2VkIHRoaXMgdGhlIG90aGVyIHdheSBhcm91bmQKKwkJCQkvLyAodGFyZ2V0IC0+IHNvdXJjZSkgYW5kIHRoZSBudW1iZXIgb2YgZWRnZXMgaW4gZWFjaCBkaXJlY3Rpb24KKwkJCQkvLyBhcmUgdGhlIHNhbWUuIEFsbCB0aGUgZ3JhcGggZWRnZXMgd2lsbCBoYXZlIGJlZW4gYXNzaWduZWQgdG8KKwkJCQkvLyBhbiBpbnRlcm5hbCBlZGdlIGdvaW5nIHRoZSBvdGhlciB3YXksIHNvIHdlIGRvbid0IHdhbnQgdG8gCisJCQkJLy8gcHJvY2VzcyB0aGVtIGFnYWluCisJCQkJdmFyIHVuZGlyZWN0ZWRFZGdlcyA9IGxheW91dC5nZXRFZGdlc0JldHdlZW4odmVydGljZXNbaV0sCisJCQkJCQljZWxsLCBmYWxzZSk7CisJCQkJdmFyIGRpcmVjdGVkRWRnZXMgPSBsYXlvdXQuZ2V0RWRnZXNCZXR3ZWVuKHZlcnRpY2VzW2ldLAorCQkJCQkJY2VsbCwgdHJ1ZSk7CisJCQkJCisJCQkJaWYgKHVuZGlyZWN0ZWRFZGdlcyAhPSBudWxsICYmCisJCQkJCQl1bmRpcmVjdGVkRWRnZXMubGVuZ3RoID4gMCAmJgorCQkJCQkJdGhpcy5lZGdlTWFwcGVyLmdldCh1bmRpcmVjdGVkRWRnZXNbMF0pID09IG51bGwgJiYKKwkJCQkJCWRpcmVjdGVkRWRnZXMubGVuZ3RoICogMiA+PSB1bmRpcmVjdGVkRWRnZXMubGVuZ3RoKQorCQkJCXsKKwkJCQkJdmFyIGludGVybmFsRWRnZSA9IG5ldyBteEdyYXBoSGllcmFyY2h5RWRnZSh1bmRpcmVjdGVkRWRnZXMpOworCisJCQkJCWZvciAodmFyIGsgPSAwOyBrIDwgdW5kaXJlY3RlZEVkZ2VzLmxlbmd0aDsgaysrKQorCQkJCQl7CisJCQkJCQl2YXIgZWRnZSA9IHVuZGlyZWN0ZWRFZGdlc1trXTsKKwkJCQkJCXRoaXMuZWRnZU1hcHBlci5wdXQoZWRnZSwgaW50ZXJuYWxFZGdlKTsKKworCQkJCQkJLy8gUmVzZXRzIGFsbCBwb2ludCBvbiB0aGUgZWRnZSBhbmQgZGlzYWJsZXMgdGhlIGVkZ2Ugc3R5bGUKKwkJCQkJCS8vIHdpdGhvdXQgZGVsZXRpbmcgaXQgZnJvbSB0aGUgY2VsbCBzdHlsZQorCQkJCQkJZ3JhcGgucmVzZXRFZGdlKGVkZ2UpOworCisJCQkJCSAgICBpZiAobGF5b3V0LmRpc2FibGVFZGdlU3R5bGUpCisJCQkJCSAgICB7CisJCQkJCSAgICAJbGF5b3V0LnNldEVkZ2VTdHlsZUVuYWJsZWQoZWRnZSwgZmFsc2UpOworCQkJCQkgICAgCWxheW91dC5zZXRPcnRob2dvbmFsRWRnZShlZGdlLHRydWUpOworCQkJCQkgICAgfQorCQkJCQl9CisKKwkJCQkJaW50ZXJuYWxFZGdlLnNvdXJjZSA9IGludGVybmFsVmVydGljZXNbaV07CisKKwkJCQkJaWYgKG14VXRpbHMuaW5kZXhPZihpbnRlcm5hbFZlcnRpY2VzW2ldLmNvbm5lY3RzQXNTb3VyY2UsIGludGVybmFsRWRnZSkgPCAwKQorCQkJCQl7CisJCQkJCQlpbnRlcm5hbFZlcnRpY2VzW2ldLmNvbm5lY3RzQXNTb3VyY2UucHVzaChpbnRlcm5hbEVkZ2UpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gRW5zdXJlIHRlbXAgdmFyaWFibGUgaXMgY2xlYXJlZCBmcm9tIGFueSBwcmV2aW91cyB1c2UKKwkJaW50ZXJuYWxWZXJ0aWNlc1tpXS50ZW1wWzBdID0gMDsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbml0aWFsUmFuaworICoKKyAqIEJhc2ljIGRldGVybWluYXRpb24gb2YgbWluaW11bSBsYXllciByYW5raW5nIGJ5IHdvcmtpbmcgZnJvbSBmcm9tIHNvdXJjZXMKKyAqIG9yIHNpbmtzIGFuZCB3b3JraW5nIHRocm91Z2ggZWFjaCBub2RlIGluIHRoZSByZWxldmFudCBlZGdlIGRpcmVjdGlvbi4KKyAqIFN0YXJ0aW5nIGF0IHRoZSBzaW5rcyBpcyBiYXNpY2FsbHkgYSBsb25nZXN0IHBhdGggbGF5ZXJpbmcgYWxnb3JpdGhtLgorKi8KK214R3JhcGhIaWVyYXJjaHlNb2RlbC5wcm90b3R5cGUuaW5pdGlhbFJhbmsgPSBmdW5jdGlvbigpCit7CisJdmFyIHN0YXJ0Tm9kZXMgPSBbXTsKKworCWlmICh0aGlzLnJvb3RzICE9IG51bGwpCisJeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm9vdHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBpbnRlcm5hbE5vZGUgPSB0aGlzLnZlcnRleE1hcHBlci5nZXQodGhpcy5yb290c1tpXSk7CisKKwkJCWlmIChpbnRlcm5hbE5vZGUgIT0gbnVsbCkKKwkJCXsKKwkJCQlzdGFydE5vZGVzLnB1c2goaW50ZXJuYWxOb2RlKTsKKwkJCX0KKwkJfQorCX0KKworCXZhciBpbnRlcm5hbE5vZGVzID0gdGhpcy52ZXJ0ZXhNYXBwZXIuZ2V0VmFsdWVzKCk7CisJCisJZm9yICh2YXIgaT0wOyBpIDwgaW50ZXJuYWxOb2Rlcy5sZW5ndGg7IGkrKykKKwl7CisJCS8vIE1hcmsgdGhlIG5vZGUgYXMgbm90IGhhdmluZyBoYWQgYSBsYXllciBhc3NpZ25lZAorCQlpbnRlcm5hbE5vZGVzW2ldLnRlbXBbMF0gPSAtMTsKKwl9CisKKwl2YXIgc3RhcnROb2Rlc0NvcHkgPSBzdGFydE5vZGVzLnNsaWNlKCk7CisKKwl3aGlsZSAoc3RhcnROb2Rlcy5sZW5ndGggPiAwKQorCXsKKwkJdmFyIGludGVybmFsTm9kZSA9IHN0YXJ0Tm9kZXNbMF07CisJCXZhciBsYXllckRldGVybWluaW5nRWRnZXM7CisJCXZhciBlZGdlc1RvQmVNYXJrZWQ7CisKKwkJbGF5ZXJEZXRlcm1pbmluZ0VkZ2VzID0gaW50ZXJuYWxOb2RlLmNvbm5lY3RzQXNUYXJnZXQ7CisJCWVkZ2VzVG9CZU1hcmtlZCA9IGludGVybmFsTm9kZS5jb25uZWN0c0FzU291cmNlOworCisJCS8vIGZsYWcgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCBhbGwgbGF5ZXIgZGV0ZXJtaW5pbmcKKwkJLy8gZWRnZXMgaGF2ZSBiZWVuIHNjYW5uZWQKKwkJdmFyIGFsbEVkZ2VzU2Nhbm5lZCA9IHRydWU7CisKKwkJLy8gV29yayBvdXQgdGhlIGxheWVyIG9mIHRoaXMgbm9kZSBmcm9tIHRoZSBsYXllciBkZXRlcm1pbmluZworCQkvLyBlZGdlcy4gVGhlIG1pbmltdW0gbGF5ZXIgbnVtYmVyIG9mIGFueSBub2RlIGNvbm5lY3RlZCBieSBvbmUgb2YKKwkJLy8gdGhlIGxheWVyIGRldGVybWluaW5nIGVkZ2VzIHZhcmlhYmxlCisJCXZhciBtaW5pbXVtTGF5ZXIgPSB0aGlzLlNPVVJDRVNDQU5TVEFSVFJBTks7CisKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBsYXllckRldGVybWluaW5nRWRnZXMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBpbnRlcm5hbEVkZ2UgPSBsYXllckRldGVybWluaW5nRWRnZXNbaV07CisKKwkJCWlmIChpbnRlcm5hbEVkZ2UudGVtcFswXSA9PSA1MjcwNjIwKQorCQkJeworCQkJCS8vIFRoaXMgZWRnZSBoYXMgYmVlbiBzY2FubmVkLCBnZXQgdGhlIGxheWVyIG9mIHRoZQorCQkJCS8vIG5vZGUgb24gdGhlIG90aGVyIGVuZAorCQkJCXZhciBvdGhlck5vZGUgPSBpbnRlcm5hbEVkZ2Uuc291cmNlOworCQkJCW1pbmltdW1MYXllciA9IE1hdGgubWluKG1pbmltdW1MYXllciwgb3RoZXJOb2RlLnRlbXBbMF0gLSAxKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlhbGxFZGdlc1NjYW5uZWQgPSBmYWxzZTsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLy8gSWYgYWxsIGVkZ2UgaGF2ZSBiZWVuIHNjYW5uZWQsIGFzc2lnbiB0aGUgbGF5ZXIsIG1hcmsgYWxsCisJCS8vIGVkZ2VzIGluIHRoZSBvdGhlciBkaXJlY3Rpb24gYW5kIHJlbW92ZSBmcm9tIHRoZSBub2RlcyBsaXN0CisJCWlmIChhbGxFZGdlc1NjYW5uZWQpCisJCXsKKwkJCWludGVybmFsTm9kZS50ZW1wWzBdID0gbWluaW11bUxheWVyOworCQkJdGhpcy5tYXhSYW5rID0gTWF0aC5taW4odGhpcy5tYXhSYW5rLCBtaW5pbXVtTGF5ZXIpOworCisJCQlpZiAoZWRnZXNUb0JlTWFya2VkICE9IG51bGwpCisJCQl7CisJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlc1RvQmVNYXJrZWQubGVuZ3RoOyBpKyspCisJCQkJeworCQkJCQl2YXIgaW50ZXJuYWxFZGdlID0gZWRnZXNUb0JlTWFya2VkW2ldOworCisJCQkJCS8vIEFzc2lnbiB1bmlxdWUgc3RhbXAgKCB5L20vZC9oICkKKwkJCQkJaW50ZXJuYWxFZGdlLnRlbXBbMF0gPSA1MjcwNjIwOworCisJCQkJCS8vIEFkZCBub2RlIG9uIG90aGVyIGVuZCBvZiBlZGdlIHRvIExpbmtlZExpc3Qgb2YKKwkJCQkJLy8gbm9kZXMgdG8gYmUgYW5hbHlzZWQKKwkJCQkJdmFyIG90aGVyTm9kZSA9IGludGVybmFsRWRnZS50YXJnZXQ7CisKKwkJCQkJLy8gT25seSBhZGQgbm9kZSBpZiBpdCBoYXNuJ3QgYmVlbiBhc3NpZ25lZCBhIGxheWVyCisJCQkJCWlmIChvdGhlck5vZGUudGVtcFswXSA9PSAtMSkKKwkJCQkJeworCQkJCQkJc3RhcnROb2Rlcy5wdXNoKG90aGVyTm9kZSk7CisKKwkJCQkJCS8vIE1hcmsgdGhpcyBvdGhlciBub2RlIGFzIG5laXRoZXIgYmVpbmcKKwkJCQkJCS8vIHVuYXNzaWduZWQgbm9yIGFzc2lnbmVkIHNvIGl0IGlzbid0CisJCQkJCQkvLyBhZGRlZCB0byB0aGlzIGxpc3QgYWdhaW4sIGJ1dCBpdCdzCisJCQkJCQkvLyBsYXllciBpc24ndCB1c2VkIGluIGFueSBjYWxjdWxhdGlvbi4KKwkJCQkJCW90aGVyTm9kZS50ZW1wWzBdID0gLTI7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXN0YXJ0Tm9kZXMuc2hpZnQoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIE5vdCBhbGwgdGhlIGVkZ2VzIGhhdmUgYmVlbiBzY2FubmVkLCBnZXQgdG8gdGhlIGJhY2sgb2YKKwkJCS8vIHRoZSBjbGFzcyBhbmQgcHV0IHRoZSBkdW5jZXMgY2FwIG9uCisJCQl2YXIgcmVtb3ZlZENlbGwgPSBzdGFydE5vZGVzLnNoaWZ0KCk7CisJCQlzdGFydE5vZGVzLnB1c2goaW50ZXJuYWxOb2RlKTsKKworCQkJaWYgKHJlbW92ZWRDZWxsID09IGludGVybmFsTm9kZSAmJiBzdGFydE5vZGVzLmxlbmd0aCA9PSAxKQorCQkJeworCQkJCS8vIFRoaXMgaXMgYW4gZXJyb3IgY29uZGl0aW9uLCB3ZSBjYW4ndCBnZXQgb3V0IG9mCisJCQkJLy8gdGhpcyBsb29wLiBJdCBjb3VsZCBoYXBwZW4gZm9yIG1vcmUgdGhhbiBvbmUgbm9kZQorCQkJCS8vIGJ1dCB0aGF0J3MgYSBsb3QgaGFyZGVyIHRvIGRldGVjdC4gTG9nIHRoZSBlcnJvcgorCQkJCS8vIFRPRE8gbWFrZSBsb2cgY29tbWVudAorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLy8gTm9ybWFsaXplIHRoZSByYW5rcyBkb3duIGZyb20gdGhlaXIgbGFyZ2Ugc3RhcnRpbmcgdmFsdWUgdG8gcGxhY2UKKwkvLyBhdCBsZWFzdCAxIHNpbmsgb24gbGF5ZXIgMAorCWZvciAodmFyIGk9MDsgaSA8IGludGVybmFsTm9kZXMubGVuZ3RoOyBpKyspCisJeworCQkvLyBNYXJrIHRoZSBub2RlIGFzIG5vdCBoYXZpbmcgaGFkIGEgbGF5ZXIgYXNzaWduZWQKKwkJaW50ZXJuYWxOb2Rlc1tpXS50ZW1wWzBdIC09IHRoaXMubWF4UmFuazsKKwl9CisJCisJLy8gVGlnaHRlbiB0aGUgcmFuayAwIG5vZGVzIGFzIGZhciBhcyBwb3NzaWJsZQorCWZvciAoIHZhciBpID0gMDsgaSA8IHN0YXJ0Tm9kZXNDb3B5Lmxlbmd0aDsgaSsrKQorCXsKKwkJdmFyIGludGVybmFsTm9kZSA9IHN0YXJ0Tm9kZXNDb3B5W2ldOworCQl2YXIgY3VycmVudE1heExheWVyID0gMDsKKwkJdmFyIGxheWVyRGV0ZXJtaW5pbmdFZGdlcyA9IGludGVybmFsTm9kZS5jb25uZWN0c0FzU291cmNlOworCisJCWZvciAoIHZhciBqID0gMDsgaiA8IGxheWVyRGV0ZXJtaW5pbmdFZGdlcy5sZW5ndGg7IGorKykKKwkJeworCQkJdmFyIGludGVybmFsRWRnZSA9IGxheWVyRGV0ZXJtaW5pbmdFZGdlc1tqXTsKKwkJCXZhciBvdGhlck5vZGUgPSBpbnRlcm5hbEVkZ2UudGFyZ2V0OworCQkJaW50ZXJuYWxOb2RlLnRlbXBbMF0gPSBNYXRoLm1heChjdXJyZW50TWF4TGF5ZXIsCisJCQkJCW90aGVyTm9kZS50ZW1wWzBdICsgMSk7CisJCQljdXJyZW50TWF4TGF5ZXIgPSBpbnRlcm5hbE5vZGUudGVtcFswXTsKKwkJfQorCX0KKwkKKwkvLyBSZXNldCB0aGUgbWF4UmFuayB0byB0aGF0IHdoaWNoIHdvdWxkIGJlIGV4cGVjdGVkIGZvciBhIGZyb20tc2luaworCS8vIHNjYW4KKwl0aGlzLm1heFJhbmsgPSB0aGlzLlNPVVJDRVNDQU5TVEFSVFJBTksgLSB0aGlzLm1heFJhbms7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBmaXhSYW5rcworICoKKyAqIEZpeGVzIHRoZSBsYXllciBhc3NpZ25tZW50cyB0byB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgbm9kZXMuIEFsc28gbmVlZHMKKyAqIHRvIGNyZWF0ZSBkdW1teSBub2RlcyBmb3IgZWRnZXMgdGhhdCBjcm9zcyBsYXllcnMuCisgKi8KK214R3JhcGhIaWVyYXJjaHlNb2RlbC5wcm90b3R5cGUuZml4UmFua3MgPSBmdW5jdGlvbigpCit7CisJdmFyIHJhbmtMaXN0ID0gW107CisJdGhpcy5yYW5rcyA9IFtdOworCisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1heFJhbmsgKyAxOyBpKyspCisJeworCQlyYW5rTGlzdFtpXSA9IFtdOworCQl0aGlzLnJhbmtzW2ldID0gcmFua0xpc3RbaV07CisJfQorCisJLy8gUGVyZm9ybSBhIERGUyB0byBvYnRhaW4gYW4gaW5pdGlhbCBvcmRlcmluZyBmb3IgZWFjaCByYW5rLgorCS8vIFdpdGhvdXQgZG9pbmcgdGhpcyB5b3Ugd291bGQgZW5kIHVwIGhhdmluZyB0byBwcm9jZXNzCisJLy8gY3Jvc3NpbmdzIGZvciBhIHN0YW5kYXJkIHRyZWUuCisJdmFyIHJvb3RzQXJyYXkgPSBudWxsOworCisJaWYgKHRoaXMucm9vdHMgIT0gbnVsbCkKKwl7CisJCXZhciBvbGRSb290c0FycmF5ID0gdGhpcy5yb290czsKKwkJcm9vdHNBcnJheSA9IFtdOworCisJCWZvciAodmFyIGkgPSAwOyBpIDwgb2xkUm9vdHNBcnJheS5sZW5ndGg7IGkrKykKKwkJeworCQkJdmFyIGNlbGwgPSBvbGRSb290c0FycmF5W2ldOworCQkJdmFyIGludGVybmFsTm9kZSA9IHRoaXMudmVydGV4TWFwcGVyLmdldChjZWxsKTsKKwkJCXJvb3RzQXJyYXlbaV0gPSBpbnRlcm5hbE5vZGU7CisJCX0KKwl9CisKKwl0aGlzLnZpc2l0KGZ1bmN0aW9uKHBhcmVudCwgbm9kZSwgZWRnZSwgbGF5ZXIsIHNlZW4pCisJeworCQlpZiAoc2VlbiA9PSAwICYmIG5vZGUubWF4UmFuayA8IDAgJiYgbm9kZS5taW5SYW5rIDwgMCkKKwkJeworCQkJcmFua0xpc3Rbbm9kZS50ZW1wWzBdXS5wdXNoKG5vZGUpOworCQkJbm9kZS5tYXhSYW5rID0gbm9kZS50ZW1wWzBdOworCQkJbm9kZS5taW5SYW5rID0gbm9kZS50ZW1wWzBdOworCisJCQkvLyBTZXQgdGVtcFswXSB0byB0aGUgbm9kZXMgcG9zaXRpb24gaW4gdGhlIHJhbmsKKwkJCW5vZGUudGVtcFswXSA9IHJhbmtMaXN0W25vZGUubWF4UmFua10ubGVuZ3RoIC0gMTsKKwkJfQorCisJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBlZGdlICE9IG51bGwpCisJCXsKKwkJCXZhciBwYXJlbnRUb0NlbGxSYW5rRGlmZmVyZW5jZSA9IHBhcmVudC5tYXhSYW5rIC0gbm9kZS5tYXhSYW5rOworCisJCQlpZiAocGFyZW50VG9DZWxsUmFua0RpZmZlcmVuY2UgPiAxKQorCQkJeworCQkJCS8vIFRoZXJlIGFyZSByYW5rcyBpbiBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIGN1cnJlbnQgY2VsbAorCQkJCWVkZ2UubWF4UmFuayA9IHBhcmVudC5tYXhSYW5rOworCQkJCWVkZ2UubWluUmFuayA9IG5vZGUubWF4UmFuazsKKwkJCQllZGdlLnRlbXAgPSBbXTsKKwkJCQllZGdlLnggPSBbXTsKKwkJCQllZGdlLnkgPSBbXTsKKworCQkJCWZvciAodmFyIGkgPSBlZGdlLm1pblJhbmsgKyAxOyBpIDwgZWRnZS5tYXhSYW5rOyBpKyspCisJCQkJeworCQkJCQkvLyBUaGUgY29ubmVjdGluZyBlZGdlIG11c3QgYmUgYWRkZWQgdG8gdGhlCisJCQkJCS8vIGFwcHJvcHJpYXRlIHJhbmtzCisJCQkJCXJhbmtMaXN0W2ldLnB1c2goZWRnZSk7CisJCQkJCWVkZ2Uuc2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShpLCByYW5rTGlzdFtpXQorCQkJCQkJCS5sZW5ndGggLSAxKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9LCByb290c0FycmF5LCBmYWxzZSwgbnVsbCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB2aXNpdAorICoKKyAqIEEgZGVwdGggZmlyc3Qgc2VhcmNoIHRocm91Z2ggdGhlIGludGVybmFsIGhlaXJhcmNoeSBtb2RlbC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIHZpc2l0b3IgLSBUaGUgdmlzaXRvciBmdW5jdGlvbiBwYXR0ZXJuIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCBub2RlLgorICogdHJhY2tBbmNlc3RvcnMgLSBXaGV0aGVyIG9yIG5vdCB0aGUgc2VhcmNoIGlzIHRvIGtlZXAgdHJhY2sgYWxsIG5vZGVzCisgKiBkaXJlY3RseSBhYm92ZSB0aGlzIG9uZSBpbiB0aGUgc2VhcmNoIHBhdGguCisgKi8KK214R3JhcGhIaWVyYXJjaHlNb2RlbC5wcm90b3R5cGUudmlzaXQgPSBmdW5jdGlvbih2aXNpdG9yLCBkZnNSb290cywgdHJhY2tBbmNlc3RvcnMsIHNlZW5Ob2RlcykKK3sKKwkvLyBSdW4gZGZzIHRocm91Z2ggb24gYWxsIHJvb3RzCisJaWYgKGRmc1Jvb3RzICE9IG51bGwpCisJeworCQlmb3IgKHZhciBpID0gMDsgaSA8IGRmc1Jvb3RzLmxlbmd0aDsgaSsrKQorCQl7CisJCQl2YXIgaW50ZXJuYWxOb2RlID0gZGZzUm9vdHNbaV07CisKKwkJCWlmIChpbnRlcm5hbE5vZGUgIT0gbnVsbCkKKwkJCXsKKwkJCQlpZiAoc2Vlbk5vZGVzID09IG51bGwpCisJCQkJeworCQkJCQlzZWVuTm9kZXMgPSBuZXcgT2JqZWN0KCk7CisJCQkJfQorCisJCQkJaWYgKHRyYWNrQW5jZXN0b3JzKQorCQkJCXsKKwkJCQkJLy8gU2V0IHVwIGhhc2ggY29kZSBmb3Igcm9vdAorCQkJCQlpbnRlcm5hbE5vZGUuaGFzaENvZGUgPSBbXTsKKwkJCQkJaW50ZXJuYWxOb2RlLmhhc2hDb2RlWzBdID0gdGhpcy5kZnNDb3VudDsKKwkJCQkJaW50ZXJuYWxOb2RlLmhhc2hDb2RlWzFdID0gaTsKKwkJCQkJdGhpcy5leHRlbmRlZERmcyhudWxsLCBpbnRlcm5hbE5vZGUsIG51bGwsIHZpc2l0b3IsIHNlZW5Ob2RlcywKKwkJCQkJCQlpbnRlcm5hbE5vZGUuaGFzaENvZGUsIGksIDApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl0aGlzLmRmcyhudWxsLCBpbnRlcm5hbE5vZGUsIG51bGwsIHZpc2l0b3IsIHNlZW5Ob2RlcywgMCk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJdGhpcy5kZnNDb3VudCsrOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGRmcworICoKKyAqIFBlcmZvcm1zIGEgZGVwdGggZmlyc3Qgc2VhcmNoIG9uIHRoZSBpbnRlcm5hbCBoaWVyYXJjaHkgbW9kZWwKKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIHBhcmVudCAtIHRoZSBwYXJlbnQgaW50ZXJuYWwgbm9kZSBvZiB0aGUgY3VycmVudCBpbnRlcm5hbCBub2RlCisgKiByb290IC0gdGhlIGN1cnJlbnQgaW50ZXJuYWwgbm9kZQorICogY29ubmVjdGluZ0VkZ2UgLSB0aGUgaW50ZXJuYWwgZWRnZSBjb25uZWN0aW5nIHRoZSBpbnRlcm5hbCBub2RlIGFuZCB0aGUgcGFyZW50CisgKiBpbnRlcm5hbCBub2RlLCBpZiBhbnkKKyAqIHZpc2l0b3IgLSB0aGUgdmlzaXRvciBwYXR0ZXJuIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCBub2RlCisgKiBzZWVuIC0gYSBzZXQgb2YgYWxsIG5vZGVzIHNlZW4gYnkgdGhpcyBkZnMgYSBzZXQgb2YgYWxsIG9mIHRoZQorICogYW5jZXN0b3Igbm9kZSBvZiB0aGUgY3VycmVudCBub2RlCisgKiBsYXllciAtIHRoZSBsYXllciBvbiB0aGUgZGZzIHRyZWUgKCBub3QgdGhlIHNhbWUgYXMgdGhlIG1vZGVsIHJhbmtzICkKKyAqLworbXhHcmFwaEhpZXJhcmNoeU1vZGVsLnByb3RvdHlwZS5kZnMgPSBmdW5jdGlvbihwYXJlbnQsIHJvb3QsIGNvbm5lY3RpbmdFZGdlLCB2aXNpdG9yLCBzZWVuLCBsYXllcikKK3sKKwlpZiAocm9vdCAhPSBudWxsKQorCXsKKwkJdmFyIHJvb3RJZCA9IHJvb3QuaWQ7CisKKwkJaWYgKHNlZW5bcm9vdElkXSA9PSBudWxsKQorCQl7CisJCQlzZWVuW3Jvb3RJZF0gPSByb290OworCQkJdmlzaXRvcihwYXJlbnQsIHJvb3QsIGNvbm5lY3RpbmdFZGdlLCBsYXllciwgMCk7CisKKwkJCS8vIENvcHkgdGhlIGNvbm5lY3RzIGFzIHNvdXJjZSBsaXN0IHNvIHRoYXQgdmlzaXRvcnMKKwkJCS8vIGNhbiBjaGFuZ2UgdGhlIG9yaWdpbmFsIGZvciBlZGdlIGRpcmVjdGlvbiBpbnZlcnNpb25zCisJCQl2YXIgb3V0Z29pbmdFZGdlcyA9IHJvb3QuY29ubmVjdHNBc1NvdXJjZS5zbGljZSgpOworCQkJCisJCQlmb3IgKHZhciBpID0gMDsgaTwgb3V0Z29pbmdFZGdlcy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQl2YXIgaW50ZXJuYWxFZGdlID0gb3V0Z29pbmdFZGdlc1tpXTsKKwkJCQl2YXIgdGFyZ2V0Tm9kZSA9IGludGVybmFsRWRnZS50YXJnZXQ7CisKKwkJCQkvLyBSb290IGNoZWNrIGlzIE8ofHJvb3RzfCkKKwkJCQl0aGlzLmRmcyhyb290LCB0YXJnZXROb2RlLCBpbnRlcm5hbEVkZ2UsIHZpc2l0b3IsIHNlZW4sCisJCQkJCQlsYXllciArIDEpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVXNlIHRoZSBpbnQgZmllbGQgdG8gaW5kaWNhdGUgdGhpcyBub2RlIGhhcyBiZWVuIHNlZW4KKwkJCXZpc2l0b3IocGFyZW50LCByb290LCBjb25uZWN0aW5nRWRnZSwgbGF5ZXIsIDEpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZXh0ZW5kZWREZnMKKyAqCisgKiBQZXJmb3JtcyBhIGRlcHRoIGZpcnN0IHNlYXJjaCBvbiB0aGUgaW50ZXJuYWwgaGllcmFyY2h5IG1vZGVsLiBUaGlzIGRmcworICogZXh0ZW5kcyB0aGUgZGVmYXVsdCB2ZXJzaW9uIGJ5IGtlZXBpbmcgdHJhY2sgb2YgY2VsbHMgYW5jZXN0b3JzLCBidXQgaXQKKyAqIHNob3VsZCBiZSBvbmx5IHVzZWQgd2hlbiBuZWNlc3NhcnkgYmVjYXVzZSBvZiBpdCBjYW4gYmUgY29tcHV0YXRpb25hbGx5CisgKiBpbnRlbnNpdmUgZm9yIGRlZXAgc2VhcmNoZXMuCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBwYXJlbnQgLSB0aGUgcGFyZW50IGludGVybmFsIG5vZGUgb2YgdGhlIGN1cnJlbnQgaW50ZXJuYWwgbm9kZQorICogcm9vdCAtIHRoZSBjdXJyZW50IGludGVybmFsIG5vZGUKKyAqIGNvbm5lY3RpbmdFZGdlIC0gdGhlIGludGVybmFsIGVkZ2UgY29ubmVjdGluZyB0aGUgaW50ZXJuYWwgbm9kZSBhbmQgdGhlIHBhcmVudAorICogaW50ZXJuYWwgbm9kZSwgaWYgYW55CisgKiB2aXNpdG9yIC0gdGhlIHZpc2l0b3IgcGF0dGVybiB0byBiZSBjYWxsZWQgZm9yIGVhY2ggbm9kZQorICogc2VlbiAtIGEgc2V0IG9mIGFsbCBub2RlcyBzZWVuIGJ5IHRoaXMgZGZzCisgKiBhbmNlc3RvcnMgLSB0aGUgcGFyZW50IGhhc2ggY29kZQorICogY2hpbGRIYXNoIC0gdGhlIG5ldyBoYXNoIGNvZGUgZm9yIHRoaXMgbm9kZQorICogbGF5ZXIgLSB0aGUgbGF5ZXIgb24gdGhlIGRmcyB0cmVlICggbm90IHRoZSBzYW1lIGFzIHRoZSBtb2RlbCByYW5rcyApCisgKi8KK214R3JhcGhIaWVyYXJjaHlNb2RlbC5wcm90b3R5cGUuZXh0ZW5kZWREZnMgPSBmdW5jdGlvbihwYXJlbnQsIHJvb3QsIGNvbm5lY3RpbmdFZGdlLCB2aXNpdG9yLCBzZWVuLCBhbmNlc3RvcnMsIGNoaWxkSGFzaCwgbGF5ZXIpCit7CisJLy8gRXhwbGFuYXRpb24gb2YgY3VzdG9tIGhhc2ggc2V0LiBQcmV2aW91c2x5LCB0aGUgYW5jZXN0b3JzIHZhcmlhYmxlCisJLy8gd2FzIHBhc3NlZCB0aHJvdWdoIHRoZSBkZnMgYXMgYSBIYXNoU2V0LiBUaGUgYW5jZXN0b3JzIHdlcmUgY29waWVkCisJLy8gaW50byBhIG5ldyBIYXNoU2V0IGFuZCB3aGVuIHRoZSBuZXcgY2hpbGQgd2FzIHByb2Nlc3NlZCBpdCB3YXMgYWxzbworCS8vIGFkZGVkIHRvIHRoZSBzZXQuIElmIHRoZSBjdXJyZW50IG5vZGUgd2FzIGluIGl0cyBhbmNlc3RvciBsaXN0IGl0CisJLy8gbWVhbnQgdGhlcmUgaXMgYSBjeWNsZSBpbiB0aGUgZ3JhcGggYW5kIHRoaXMgaW5mb3JtYXRpb24gaXMgcGFzc2VkCisJLy8gdG8gdGhlIHZpc2l0b3IudmlzaXQoKSBpbiB0aGUgc2VlbiBwYXJhbWV0ZXIuIFRoZSBIYXNoU2V0IGNsb25lIHdhcworCS8vIHZlcnkgZXhwZW5zaXZlIG9uIENQVSBzbyBhIGN1c3RvbSBoYXNoIHdhcyBkZXZlbG9wZWQgdXNpbmcgcHJpbWl0aXZlCisJLy8gdHlwZXMuIHRlbXBbXSBjb3VsZG4ndCBiZSB1c2VkIHNvIGhhc2hDb2RlW10gd2FzIGFkZGVkIHRvIGVhY2ggbm9kZS4KKwkvLyBFYWNoIG5ldyBjaGlsZCBhZGRzIGFub3RoZXIgaW50IHRvIHRoZSBhcnJheSwgY29weWluZyB0aGUgcHJlZml4CisJLy8gZnJvbSBpdHMgcGFyZW50LiBDaGlsZCBvZiB0aGUgc2FtZSBwYXJlbnQgYWRkIGRpZmZlcmVudCBpbnRzICh0aGUKKwkvLyBsaW1pdCBpcyB0aGVyZWZvcmUgMl4zMiBjaGlsZHJlbiBwZXIgcGFyZW50Li4uKS4gSWYgYSBub2RlIGhhcyBhCisJLy8gY2hpbGQgd2l0aCB0aGUgaGFzaENvZGUgYWxyZWFkeSBzZXQgdGhlbiB0aGUgY2hpbGQgY29kZSBpcyBjb21wYXJlZAorCS8vIHRvIHRoZSBzYW1lIHBvcnRpb24gb2YgdGhlIGN1cnJlbnQgbm9kZXMgYXJyYXkuIElmIHRoZXkgbWF0Y2ggdGhlcmUKKwkvLyBpcyBhIGxvb3AuCisJLy8gTm90ZSB0aGF0IHRoZSBiYXNpYyBtZWNoYW5pc20gd291bGQgb25seSBhbGxvdyBmb3IgMSB1c2Ugb2YgdGhpcworCS8vIGZ1bmN0aW9uYWxpdHksIHNvIHRoZSByb290IG5vZGVzIGhhdmUgdHdvIGludHMuIFRoZSBzZWNvbmQgaW50IGlzCisJLy8gaW5jcmVtZW50ZWQgdGhyb3VnaCBlYWNoIG5vZGUgcm9vdCBhbmQgdGhlIGZpcnN0IGlzIGluY3JlbWVudGVkCisJLy8gdGhyb3VnaCBlYWNoIHJ1biBvZiB0aGUgZGZzIGFsZ29yaXRobSAodGhlcmVmb3JlIHRoZSBkZnMgaXMgbm90CisJLy8gdGhyZWFkIHNhZmUpLiBUaGUgaGFzaCBjb2RlIG9mIGVhY2ggbm9kZSBpcyBzZXQgaWYgbm90IGFscmVhZHkgc2V0LAorCS8vIG9yIGlmIHRoZSBmaXJzdCBpbnQgZG9lcyBub3QgbWF0Y2ggdGhhdCBvZiB0aGUgY3VycmVudCBydW4uCisJaWYgKHJvb3QgIT0gbnVsbCkKKwl7CisJCWlmIChwYXJlbnQgIT0gbnVsbCkKKwkJeworCQkJLy8gRm9ybSB0aGlzIG5vZGVzIGhhc2ggY29kZSBpZiBuZWNlc3NhcnksIHRoYXQgaXMsIGlmIHRoZQorCQkJLy8gaGFzaENvZGUgdmFyaWFibGUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIG9yIGlmIHRoZQorCQkJLy8gc3RhcnQgb2YgdGhlIHBhcmVudCBoYXNoIGNvZGUgZG9lcyBub3QgZXF1YWwgdGhlIHN0YXJ0IG9mCisJCQkvLyB0aGlzIG5vZGVzIGhhc2ggY29kZSwgaW5kaWNhdGluZyB0aGUgY29kZSB3YXMgc2V0IG9uIGEKKwkJCS8vIHByZXZpb3VzIHJ1biBvZiB0aGlzIGRmcy4KKwkJCWlmIChyb290Lmhhc2hDb2RlID09IG51bGwgfHwKKwkJCQlyb290Lmhhc2hDb2RlWzBdICE9IHBhcmVudC5oYXNoQ29kZVswXSkKKwkJCXsKKwkJCQl2YXIgaGFzaENvZGVMZW5ndGggPSBwYXJlbnQuaGFzaENvZGUubGVuZ3RoICsgMTsKKwkJCQlyb290Lmhhc2hDb2RlID0gcGFyZW50Lmhhc2hDb2RlLnNsaWNlKCk7CisJCQkJcm9vdC5oYXNoQ29kZVtoYXNoQ29kZUxlbmd0aCAtIDFdID0gY2hpbGRIYXNoOworCQkJfQorCQl9CisKKwkJdmFyIHJvb3RJZCA9IHJvb3QuaWQ7CisKKwkJaWYgKHNlZW5bcm9vdElkXSA9PSBudWxsKQorCQl7CisJCQlzZWVuW3Jvb3RJZF0gPSByb290OworCQkJdmlzaXRvcihwYXJlbnQsIHJvb3QsIGNvbm5lY3RpbmdFZGdlLCBsYXllciwgMCk7CisKKwkJCS8vIENvcHkgdGhlIGNvbm5lY3RzIGFzIHNvdXJjZSBsaXN0IHNvIHRoYXQgdmlzaXRvcnMKKwkJCS8vIGNhbiBjaGFuZ2UgdGhlIG9yaWdpbmFsIGZvciBlZGdlIGRpcmVjdGlvbiBpbnZlcnNpb25zCisJCQl2YXIgb3V0Z29pbmdFZGdlcyA9IHJvb3QuY29ubmVjdHNBc1NvdXJjZS5zbGljZSgpOworCisJCQlmb3IgKHZhciBpID0gMDsgaSA8IG91dGdvaW5nRWRnZXMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJdmFyIGludGVybmFsRWRnZSA9IG91dGdvaW5nRWRnZXNbaV07CisJCQkJdmFyIHRhcmdldE5vZGUgPSBpbnRlcm5hbEVkZ2UudGFyZ2V0OworCisJCQkJLy8gUm9vdCBjaGVjayBpcyBPKHxyb290c3wpCisJCQkJdGhpcy5leHRlbmRlZERmcyhyb290LCB0YXJnZXROb2RlLCBpbnRlcm5hbEVkZ2UsIHZpc2l0b3IsIHNlZW4sCisJCQkJCQlyb290Lmhhc2hDb2RlLCBpLCBsYXllciArIDEpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVXNlIHRoZSBpbnQgZmllbGQgdG8gaW5kaWNhdGUgdGhpcyBub2RlIGhhcyBiZWVuIHNlZW4KKwkJCXZpc2l0b3IocGFyZW50LCByb290LCBjb25uZWN0aW5nRWRnZSwgbGF5ZXIsIDEpOworCQl9CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL21vZGVsL214R3JhcGhIaWVyYXJjaHlOb2RlLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9oaWVyYXJjaGljYWwvbW9kZWwvbXhHcmFwaEhpZXJhcmNoeU5vZGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiYjhiZQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL21vZGVsL214R3JhcGhIaWVyYXJjaHlOb2RlLmpzCkBAIC0wLDAgKzEsMjIwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteEdyYXBoSGllcmFyY2h5Tm9kZQorICogCisgKiBBbiBhYnN0cmFjdGlvbiBvZiBhIGhpZXJhcmNoaWNhbCBlZGdlIGZvciB0aGUgaGllcmFyY2h5IGxheW91dAorICogCisgKiBDb25zdHJ1Y3RvcjogbXhHcmFwaEhpZXJhcmNoeU5vZGUKKyAqCisgKiBDb25zdHJ1Y3RzIGFuIGludGVybmFsIG5vZGUgdG8gcmVwcmVzZW50IHRoZSBzcGVjaWZpZWQgcmVhbCBncmFwaCBjZWxsCisgKgorICogQXJndW1lbnRzOgorICogCisgKiBjZWxsIC0gdGhlIHJlYWwgZ3JhcGggY2VsbCB0aGlzIG5vZGUgcmVwcmVzZW50cworICovCitmdW5jdGlvbiBteEdyYXBoSGllcmFyY2h5Tm9kZShjZWxsKQoreworCW14R3JhcGhBYnN0cmFjdEhpZXJhcmNoeUNlbGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl0aGlzLmNlbGwgPSBjZWxsOworCXRoaXMuaWQgPSBteE9iamVjdElkZW50aXR5LmdldChjZWxsKTsKKwl0aGlzLmNvbm5lY3RzQXNUYXJnZXQgPSBbXTsKKwl0aGlzLmNvbm5lY3RzQXNTb3VyY2UgPSBbXTsKK307CisKKy8qKgorICogRXh0ZW5kcyBteEdyYXBoQWJzdHJhY3RIaWVyYXJjaHlDZWxsLgorICovCitteEdyYXBoSGllcmFyY2h5Tm9kZS5wcm90b3R5cGUgPSBuZXcgbXhHcmFwaEFic3RyYWN0SGllcmFyY2h5Q2VsbCgpOworbXhHcmFwaEhpZXJhcmNoeU5vZGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhHcmFwaEhpZXJhcmNoeU5vZGU7CisKKy8qKgorICogVmFyaWFibGU6IGNlbGwKKyAqIAorICogVGhlIGdyYXBoIGNlbGwgdGhpcyBvYmplY3QgcmVwcmVzZW50cy4KKyAqLworbXhHcmFwaEhpZXJhcmNoeU5vZGUucHJvdG90eXBlLmNlbGwgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBpZAorICogCisgKiBUaGUgb2JqZWN0IGlkZW50aXR5IG9mIHRoZSB3cmFwcGVkIGNlbGwKKyAqLworbXhHcmFwaEhpZXJhcmNoeU5vZGUucHJvdG90eXBlLmlkID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogY29ubmVjdHNBc1RhcmdldAorICogCisgKiBDb2xsZWN0aW9uIG9mIGhpZXJhcmNoeSBlZGdlcyB0aGF0IGhhdmUgdGhpcyBub2RlIGFzIGEgdGFyZ2V0CisgKi8KK214R3JhcGhIaWVyYXJjaHlOb2RlLnByb3RvdHlwZS5jb25uZWN0c0FzVGFyZ2V0ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogY29ubmVjdHNBc1NvdXJjZQorICogCisgKiBDb2xsZWN0aW9uIG9mIGhpZXJhcmNoeSBlZGdlcyB0aGF0IGhhdmUgdGhpcyBub2RlIGFzIGEgc291cmNlCisgKi8KK214R3JhcGhIaWVyYXJjaHlOb2RlLnByb3RvdHlwZS5jb25uZWN0c0FzU291cmNlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogaGFzaENvZGUKKyAqIAorICogQXNzaWducyBhIHVuaXF1ZSBoYXNoY29kZSBmb3IgZWFjaCBub2RlLiBVc2VkIGJ5IHRoZSBtb2RlbCBkZnMgaW5zdGVhZAorICogb2YgY29weWluZyBIYXNoU2V0cworICovCitteEdyYXBoSGllcmFyY2h5Tm9kZS5wcm90b3R5cGUuaGFzaENvZGUgPSBmYWxzZTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0UmFua1ZhbHVlCisgKiAKKyAqIFJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIGxheWVyIHRoYXQgdGhpcyBub2RlIHJlc2lkZXMgaW4KKyAqLworbXhHcmFwaEhpZXJhcmNoeU5vZGUucHJvdG90eXBlLmdldFJhbmtWYWx1ZSA9IGZ1bmN0aW9uKGxheWVyKQoreworCXJldHVybiB0aGlzLm1heFJhbms7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXROZXh0TGF5ZXJDb25uZWN0ZWRDZWxscworICogCisgKiBSZXR1cm5zIHRoZSBjZWxscyB0aGlzIGNlbGwgY29ubmVjdHMgdG8gb24gdGhlIG5leHQgbGF5ZXIgdXAKKyAqLworbXhHcmFwaEhpZXJhcmNoeU5vZGUucHJvdG90eXBlLmdldE5leHRMYXllckNvbm5lY3RlZENlbGxzID0gZnVuY3Rpb24obGF5ZXIpCit7CisJaWYgKHRoaXMubmV4dExheWVyQ29ubmVjdGVkQ2VsbHMgPT0gbnVsbCkKKwl7CisJCXRoaXMubmV4dExheWVyQ29ubmVjdGVkQ2VsbHMgPSBbXTsKKwkJdGhpcy5uZXh0TGF5ZXJDb25uZWN0ZWRDZWxsc1swXSA9IFtdOworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNvbm5lY3RzQXNUYXJnZXQubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBlZGdlID0gdGhpcy5jb25uZWN0c0FzVGFyZ2V0W2ldOworCisJCQlpZiAoZWRnZS5tYXhSYW5rID09IC0xIHx8IGVkZ2UubWF4UmFuayA9PSBsYXllciArIDEpCisJCQl7CisJCQkJLy8gRWl0aGVyIGVkZ2UgaXMgbm90IGluIGFueSByYW5rIG9yCisJCQkJLy8gbm8gZHVtbXkgbm9kZXMgaW4gZWRnZSwgYWRkIG5vZGUgb2Ygb3RoZXIgc2lkZSBvZiBlZGdlCisJCQkJdGhpcy5uZXh0TGF5ZXJDb25uZWN0ZWRDZWxsc1swXS5wdXNoKGVkZ2Uuc291cmNlKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBFZGdlIHNwYW5zIGF0IGxlYXN0IHR3byBsYXllcnMsIGFkZCBlZGdlCisJCQkJdGhpcy5uZXh0TGF5ZXJDb25uZWN0ZWRDZWxsc1swXS5wdXNoKGVkZ2UpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHRoaXMubmV4dExheWVyQ29ubmVjdGVkQ2VsbHNbMF07Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRQcmV2aW91c0xheWVyQ29ubmVjdGVkQ2VsbHMKKyAqIAorICogUmV0dXJucyB0aGUgY2VsbHMgdGhpcyBjZWxsIGNvbm5lY3RzIHRvIG9uIHRoZSBuZXh0IGxheWVyIGRvd24KKyAqLworbXhHcmFwaEhpZXJhcmNoeU5vZGUucHJvdG90eXBlLmdldFByZXZpb3VzTGF5ZXJDb25uZWN0ZWRDZWxscyA9IGZ1bmN0aW9uKGxheWVyKQoreworCWlmICh0aGlzLnByZXZpb3VzTGF5ZXJDb25uZWN0ZWRDZWxscyA9PSBudWxsKQorCXsKKwkJdGhpcy5wcmV2aW91c0xheWVyQ29ubmVjdGVkQ2VsbHMgPSBbXTsKKwkJdGhpcy5wcmV2aW91c0xheWVyQ29ubmVjdGVkQ2VsbHNbMF0gPSBbXTsKKwkJCisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb25uZWN0c0FzU291cmNlLmxlbmd0aDsgaSsrKQorCQl7CisJCQl2YXIgZWRnZSA9IHRoaXMuY29ubmVjdHNBc1NvdXJjZVtpXTsKKworCQkJaWYgKGVkZ2UubWluUmFuayA9PSAtMSB8fCBlZGdlLm1pblJhbmsgPT0gbGF5ZXIgLSAxKQorCQkJeworCQkJCS8vIE5vIGR1bW15IG5vZGVzIGluIGVkZ2UsIGFkZCBub2RlIG9mIG90aGVyIHNpZGUgb2YgZWRnZQorCQkJCXRoaXMucHJldmlvdXNMYXllckNvbm5lY3RlZENlbGxzWzBdLnB1c2goZWRnZS50YXJnZXQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIEVkZ2Ugc3BhbnMgYXQgbGVhc3QgdHdvIGxheWVycywgYWRkIGVkZ2UKKwkJCQl0aGlzLnByZXZpb3VzTGF5ZXJDb25uZWN0ZWRDZWxsc1swXS5wdXNoKGVkZ2UpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHRoaXMucHJldmlvdXNMYXllckNvbm5lY3RlZENlbGxzWzBdOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNWZXJ0ZXgKKyAqIAorICogUmV0dXJucyB0cnVlLgorICovCitteEdyYXBoSGllcmFyY2h5Tm9kZS5wcm90b3R5cGUuaXNWZXJ0ZXggPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRydWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlCisgKiAKKyAqIEdldHMgdGhlIHZhbHVlIG9mIHRlbXAgZm9yIHRoZSBzcGVjaWZpZWQgbGF5ZXIKKyAqLworbXhHcmFwaEhpZXJhcmNoeU5vZGUucHJvdG90eXBlLmdldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUgPSBmdW5jdGlvbihsYXllcikKK3sKKwlyZXR1cm4gdGhpcy50ZW1wWzBdOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZQorICogCisgKiBTZXQgdGhlIHZhbHVlIG9mIHRlbXAgZm9yIHRoZSBzcGVjaWZpZWQgbGF5ZXIKKyAqLworbXhHcmFwaEhpZXJhcmNoeU5vZGUucHJvdG90eXBlLnNldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUgPSBmdW5jdGlvbihsYXllciwgdmFsdWUpCit7CisJdGhpcy50ZW1wWzBdID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0FuY2VzdG9yCisgKi8KK214R3JhcGhIaWVyYXJjaHlOb2RlLnByb3RvdHlwZS5pc0FuY2VzdG9yID0gZnVuY3Rpb24ob3RoZXJOb2RlKQoreworCS8vIEZpcnN0bHksIHRoZSBoYXNoIGNvZGUgb2YgdGhpcyBub2RlIG5lZWRzIHRvIGJlIHNob3J0ZXIgdGhhbiB0aGUKKwkvLyBvdGhlciBub2RlCisJaWYgKG90aGVyTm9kZSAhPSBudWxsICYmIHRoaXMuaGFzaENvZGUgIT0gbnVsbCAmJiBvdGhlck5vZGUuaGFzaENvZGUgIT0gbnVsbAorCQkJJiYgdGhpcy5oYXNoQ29kZS5sZW5ndGggPCBvdGhlck5vZGUuaGFzaENvZGUubGVuZ3RoKQorCXsKKwkJaWYgKHRoaXMuaGFzaENvZGUgPT0gb3RoZXJOb2RlLmhhc2hDb2RlKQorCQl7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJaWYgKHRoaXMuaGFzaENvZGUgPT0gbnVsbCB8fCB0aGlzLmhhc2hDb2RlID09IG51bGwpCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJLy8gU2Vjb25kbHksIHRoaXMgaGFzaCBjb2RlIG11c3QgbWF0Y2ggdGhlIHN0YXJ0IG9mIHRoZSBvdGhlcgorCQkvLyBub2RlJ3MgaGFzaCBjb2RlLiBBcnJheXMuZXF1YWxzIGNhbm5vdCBiZSB1c2VkIGhlcmUgc2luY2UKKwkJLy8gdGhlIGFycmF5cyBhcmUgZGlmZmVyZW50IGxlbmd0aCwgYW5kIHdlIGRvIG5vdCB3YW50IHRvCisJCS8vIHBlcmZvcm0gYW5vdGhlciBhcnJheSBjb3B5LgorCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaGFzaENvZGUubGVuZ3RoOyBpKyspCisJCXsKKwkJCWlmICh0aGlzLmhhc2hDb2RlW2ldICE9IG90aGVyTm9kZS5oYXNoQ29kZVtpXSkKKwkJCXsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDb3JlQ2VsbAorICogCisgKiBHZXRzIHRoZSBjb3JlIHZlcnRleCBhc3NvY2lhdGVkIHdpdGggdGhpcyB3cmFwcGVyCisgKi8KK214R3JhcGhIaWVyYXJjaHlOb2RlLnByb3RvdHlwZS5nZXRDb3JlQ2VsbCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5jZWxsOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL21vZGVsL214U3dpbWxhbmVNb2RlbC5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL21vZGVsL214U3dpbWxhbmVNb2RlbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg3M2M2Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9oaWVyYXJjaGljYWwvbW9kZWwvbXhTd2ltbGFuZU1vZGVsLmpzCkBAIC0wLDAgKzEsODAxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE2LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNiwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFN3aW1sYW5lTW9kZWwKKyAqCisgKiBJbnRlcm5hbCBtb2RlbCBvZiBhIGhpZXJhcmNoaWNhbCBncmFwaC4gVGhpcyBtb2RlbCBzdG9yZXMgbm9kZXMgYW5kIGVkZ2VzCisgKiBlcXVpdmFsZW50IHRvIHRoZSByZWFsIGdyYXBoIG5vZGVzIGFuZCBlZGdlcywgYnV0IGFsc28gc3RvcmVzIHRoZSByYW5rIG9mIHRoZQorICogY2VsbHMsIHRoZSBvcmRlciB3aXRoaW4gdGhlIHJhbmtzIGFuZCB0aGUgbmV3IGNhbmRpZGF0ZSBsb2NhdGlvbnMgb2YgY2VsbHMuCisgKiBUaGUgaW50ZXJuYWwgbW9kZWwgYWxzbyByZXZlcnNlcyBlZGdlIGRpcmVjdGlvbiB3ZXJlIGFwcHJvcHJpYXRlICwgaWdub3JlcworICogc2VsZi1sb29wIGFuZCBncm91cHMgcGFyYWxsZWxzIHRvZ2V0aGVyIHVuZGVyIG9uZSBlZGdlIG9iamVjdC4KKyAqCisgKiBDb25zdHJ1Y3RvcjogbXhTd2ltbGFuZU1vZGVsCisgKgorICogQ3JlYXRlcyBhbiBpbnRlcm5hbCBvcmRlcmVkIGdyYXBoIG1vZGVsIHVzaW5nIHRoZSB2ZXJ0aWNlcyBwYXNzZWQgaW4uIElmCisgKiB0aGVyZSBhcmUgYW55LCBsZWZ0d2FyZCBlZGdlIG5lZWQgdG8gYmUgaW52ZXJ0ZWQgaW4gdGhlIGludGVybmFsIG1vZGVsCisgKgorICogQXJndW1lbnRzOgorICoKKyAqIGdyYXBoIC0gdGhlIGZhY2FkZSBkZXNjcmliaW5nIHRoZSBncmFwaCB0byBiZSBvcGVyYXRlZCBvbgorICogdmVydGljZXMgLSB0aGUgdmVydGljZXMgZm9yIHRoaXMgaGllcmFyY2h5CisgKiBvcmRlcmVkIC0gd2hldGhlciBvciBub3QgdGhlIHZlcnRpY2VzIGFyZSBhbHJlYWR5IG9yZGVyZWQKKyAqIGRldGVybWluaXN0aWMgLSB3aGV0aGVyIG9yIG5vdCB0aGlzIGxheW91dCBzaG91bGQgYmUgZGV0ZXJtaW5pc3RpYyBvbiBlYWNoCisgKiB0aWdodGVuVG9Tb3VyY2UgLSB3aGV0aGVyIG9yIG5vdCB0byB0aWdodGVuIHZlcnRpY2VzIHRvd2FyZHMgdGhlIHNvdXJjZXMKKyAqIHNjYW5SYW5rc0Zyb21TaW5rcyAtIFdoZXRoZXIgcmFuayBhc3NpZ25tZW50IGlzIGZyb20gdGhlIHNpbmtzIG9yIHNvdXJjZXMuCisgKiB1c2FnZQorICovCitmdW5jdGlvbiBteFN3aW1sYW5lTW9kZWwobGF5b3V0LCB2ZXJ0aWNlcywgcm9vdHMsIHBhcmVudCwgdGlnaHRlblRvU291cmNlKQoreworCXZhciBncmFwaCA9IGxheW91dC5nZXRHcmFwaCgpOworCXRoaXMudGlnaHRlblRvU291cmNlID0gdGlnaHRlblRvU291cmNlOworCXRoaXMucm9vdHMgPSByb290czsKKwl0aGlzLnBhcmVudCA9IHBhcmVudDsKKworCS8vIG1hcCBvZiBjZWxscyB0byBpbnRlcm5hbCBjZWxsIG5lZWRlZCBmb3Igc2Vjb25kIHJ1biB0aHJvdWdoCisJLy8gdG8gc2V0dXAgdGhlIHNpbmsgb2YgZWRnZXMgY29ycmVjdGx5CisJdGhpcy52ZXJ0ZXhNYXBwZXIgPSBuZXcgbXhEaWN0aW9uYXJ5KCk7CisJdGhpcy5lZGdlTWFwcGVyID0gbmV3IG14RGljdGlvbmFyeSgpOworCXRoaXMubWF4UmFuayA9IDA7CisJdmFyIGludGVybmFsVmVydGljZXMgPSBbXTsKKworCWlmICh2ZXJ0aWNlcyA9PSBudWxsKQorCXsKKwkJdmVydGljZXMgPSB0aGlzLmdyYXBoLmdldENoaWxkVmVydGljZXMocGFyZW50KTsKKwl9CisKKwl0aGlzLm1heFJhbmsgPSB0aGlzLlNPVVJDRVNDQU5TVEFSVFJBTks7CisJLy8gbWFwIG9mIGNlbGxzIHRvIGludGVybmFsIGNlbGwgbmVlZGVkIGZvciBzZWNvbmQgcnVuIHRocm91Z2gKKwkvLyB0byBzZXR1cCB0aGUgc2luayBvZiBlZGdlcyBjb3JyZWN0bHkuIEd1ZXNzIHNpemUgYnkgbnVtYmVyCisJLy8gb2YgZWRnZXMgaXMgcm91Z2hseSBzYW1lIGFzIG51bWJlciBvZiB2ZXJ0aWNlcy4KKwl0aGlzLmNyZWF0ZUludGVybmFsQ2VsbHMobGF5b3V0LCB2ZXJ0aWNlcywgaW50ZXJuYWxWZXJ0aWNlcyk7CisKKwkvLyBHbyB0aHJvdWdoIGVkZ2VzIHNldCB0aGVpciBzaW5rIHZhbHVlcy4gQWxzbyBjaGVjayB0aGUKKwkvLyBvcmRlcmluZyBpZiBhbmQgaW52ZXJ0IGVkZ2VzIGlmIG5lY2Vzc2FyeQorCWZvciAodmFyIGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpKyspCisJeworCQl2YXIgZWRnZXMgPSBpbnRlcm5hbFZlcnRpY2VzW2ldLmNvbm5lY3RzQXNTb3VyY2U7CisKKwkJZm9yICh2YXIgaiA9IDA7IGogPCBlZGdlcy5sZW5ndGg7IGorKykKKwkJeworCQkJdmFyIGludGVybmFsRWRnZSA9IGVkZ2VzW2pdOworCQkJdmFyIHJlYWxFZGdlcyA9IGludGVybmFsRWRnZS5lZGdlczsKKworCQkJLy8gT25seSBuZWVkIHRvIHByb2Nlc3MgdGhlIGZpcnN0IHJlYWwgZWRnZSwgc2luY2UKKwkJCS8vIGFsbCB0aGUgZWRnZXMgY29ubmVjdCB0byB0aGUgc2FtZSBvdGhlciB2ZXJ0ZXgKKwkJCWlmIChyZWFsRWRnZXMgIT0gbnVsbCAmJiByZWFsRWRnZXMubGVuZ3RoID4gMCkKKwkJCXsKKwkJCQl2YXIgcmVhbEVkZ2UgPSByZWFsRWRnZXNbMF07CisJCQkJdmFyIHRhcmdldENlbGwgPSBsYXlvdXQuZ2V0VmlzaWJsZVRlcm1pbmFsKAorCQkJCQkJcmVhbEVkZ2UsIGZhbHNlKTsKKwkJCQl2YXIgaW50ZXJuYWxUYXJnZXRDZWxsID0gdGhpcy52ZXJ0ZXhNYXBwZXIuZ2V0KHRhcmdldENlbGwpOworCisJCQkJaWYgKGludGVybmFsVmVydGljZXNbaV0gPT0gaW50ZXJuYWxUYXJnZXRDZWxsKQorCQkJCXsKKwkJCQkJLy8gSWYgdGhlcmUgYXJlIHBhcmFsbGVsIGVkZ2VzIGdvaW5nIGJldHdlZW4gdHdvIHZlcnRpY2VzIGFuZCBub3QgYWxsIGFyZSBpbiB0aGUgc2FtZSBkaXJlY3Rpb24KKwkJCQkJLy8geW91IGNhbiBoYXZlIG5hdmlnYXRlZCBhY3Jvc3Mgb25lIGRpcmVjdGlvbiB3aGVuIGRvaW5nIHRoZSBjeWNsZSByZXZlcnNhbCB0aGF0IGlzbid0IHRoZSBzYW1lCisJCQkJCS8vIGRpcmVjdGlvbiBhcyB0aGUgZmlyc3QgcmVhbCBlZGdlIGluIHRoZSBhcnJheSBhYm92ZS4gV2hlbiB0aGF0IGhhcHBlbnMgdGhlIGlmIGFib3ZlIGNhdGNoZXMKKwkJCQkJLy8gdGhhdCBhbmQgd2UgY29ycmVjdCB0aGUgdGFyZ2V0IGNlbGwgYmVmb3JlIGNvbnRpbnVpbmcuCisJCQkJCS8vIFRoaXMgYnJhbmNoIG9ubHkgZGV0ZWN0cyB0aGlzIHNpbmdsZSBjYXNlCisJCQkJCXRhcmdldENlbGwgPSBsYXlvdXQuZ2V0VmlzaWJsZVRlcm1pbmFsKAorCQkJCQkJCXJlYWxFZGdlLCB0cnVlKTsKKwkJCQkJaW50ZXJuYWxUYXJnZXRDZWxsID0gdGhpcy52ZXJ0ZXhNYXBwZXIuZ2V0KHRhcmdldENlbGwpOworCQkJCX0KKworCQkJCWlmIChpbnRlcm5hbFRhcmdldENlbGwgIT0gbnVsbAorCQkJCQkJJiYgaW50ZXJuYWxWZXJ0aWNlc1tpXSAhPSBpbnRlcm5hbFRhcmdldENlbGwpCisJCQkJeworCQkJCQlpbnRlcm5hbEVkZ2UudGFyZ2V0ID0gaW50ZXJuYWxUYXJnZXRDZWxsOworCisJCQkJCWlmIChpbnRlcm5hbFRhcmdldENlbGwuY29ubmVjdHNBc1RhcmdldC5sZW5ndGggPT0gMCkKKwkJCQkJeworCQkJCQkJaW50ZXJuYWxUYXJnZXRDZWxsLmNvbm5lY3RzQXNUYXJnZXQgPSBbXTsKKwkJCQkJfQorCisJCQkJCWlmIChteFV0aWxzLmluZGV4T2YoaW50ZXJuYWxUYXJnZXRDZWxsLmNvbm5lY3RzQXNUYXJnZXQsIGludGVybmFsRWRnZSkgPCAwKQorCQkJCQl7CisJCQkJCQlpbnRlcm5hbFRhcmdldENlbGwuY29ubmVjdHNBc1RhcmdldC5wdXNoKGludGVybmFsRWRnZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBVc2UgdGhlIHRlbXAgdmFyaWFibGUgaW4gdGhlIGludGVybmFsIG5vZGVzIHRvIG1hcmsgdGhpcworCQkvLyBpbnRlcm5hbCB2ZXJ0ZXggYXMgaGF2aW5nIGJlZW4gdmlzaXRlZC4KKwkJaW50ZXJuYWxWZXJ0aWNlc1tpXS50ZW1wWzBdID0gMTsKKwl9Cit9OworCisvKioKKyAqIFZhcmlhYmxlOiBtYXhSYW5rCisgKgorICogU3RvcmVzIHRoZSBsYXJnZXN0IHJhbmsgbnVtYmVyIGFsbG9jYXRlZAorICovCitteFN3aW1sYW5lTW9kZWwucHJvdG90eXBlLm1heFJhbmsgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB2ZXJ0ZXhNYXBwZXIKKyAqCisgKiBNYXAgZnJvbSBncmFwaCB2ZXJ0aWNlcyB0byBpbnRlcm5hbCBtb2RlbCBub2Rlcy4KKyAqLworbXhTd2ltbGFuZU1vZGVsLnByb3RvdHlwZS52ZXJ0ZXhNYXBwZXIgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBlZGdlTWFwcGVyCisgKgorICogTWFwIGZyb20gZ3JhcGggZWRnZXMgdG8gaW50ZXJuYWwgbW9kZWwgZWRnZXMKKyAqLworbXhTd2ltbGFuZU1vZGVsLnByb3RvdHlwZS5lZGdlTWFwcGVyID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogcmFua3MKKyAqCisgKiBNYXBwaW5nIGZyb20gcmFuayBudW1iZXIgdG8gYWN0dWFsIHJhbmsKKyAqLworbXhTd2ltbGFuZU1vZGVsLnByb3RvdHlwZS5yYW5rcyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHJvb3RzCisgKgorICogU3RvcmUgb2Ygcm9vdHMgb2YgdGhpcyBoaWVyYXJjaHkgbW9kZWwsIHRoZXNlIGFyZSByZWFsIGdyYXBoIGNlbGxzLCBub3QKKyAqIGludGVybmFsIGNlbGxzCisgKi8KK214U3dpbWxhbmVNb2RlbC5wcm90b3R5cGUucm9vdHMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBwYXJlbnQKKyAqCisgKiBUaGUgcGFyZW50IGNlbGwgd2hvc2UgY2hpbGRyZW4gYXJlIGJlaW5nIGxhaWQgb3V0CisgKi8KK214U3dpbWxhbmVNb2RlbC5wcm90b3R5cGUucGFyZW50ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZGZzQ291bnQKKyAqCisgKiBDb3VudCBvZiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhbmNlc3RvciBkZnMgaGFzIGJlZW4gdXNlZC4KKyAqLworbXhTd2ltbGFuZU1vZGVsLnByb3RvdHlwZS5kZnNDb3VudCA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IFNPVVJDRVNDQU5TVEFSVFJBTksKKyAqCisgKiBIaWdoIHZhbHVlIHRvIHN0YXJ0IHNvdXJjZSBsYXllcmluZyBzY2FuIHJhbmsgdmFsdWUgZnJvbS4KKyAqLworbXhTd2ltbGFuZU1vZGVsLnByb3RvdHlwZS5TT1VSQ0VTQ0FOU1RBUlRSQU5LID0gMTAwMDAwMDAwOworCisvKioKKyAqIFZhcmlhYmxlOiB0aWdodGVuVG9Tb3VyY2UKKyAqCisgKiBXaGV0aGVyIG9yIG5vdCB0byB0aWdodGVuIHRoZSBhc3NpZ25lZCByYW5rcyBvZiB2ZXJ0aWNlcyB1cCB0b3dhcmRzCisgKiB0aGUgc291cmNlIGNlbGxzLgorICovCitteEdyYXBoSGllcmFyY2h5TW9kZWwucHJvdG90eXBlLnRpZ2h0ZW5Ub1NvdXJjZSA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiByYW5rc1Blckdyb3VwCisgKgorICogQW4gYXJyYXkgb2YgdGhlIG51bWJlciBvZiByYW5rcyB3aXRoaW4gZWFjaCBzd2ltbGFuZQorICovCitteFN3aW1sYW5lTW9kZWwucHJvdG90eXBlLnJhbmtzUGVyR3JvdXAgPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVJbnRlcm5hbENlbGxzCisgKgorICogQ3JlYXRlcyBhbGwgZWRnZXMgaW4gdGhlIGludGVybmFsIG1vZGVsCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBsYXlvdXQgLSBSZWZlcmVuY2UgdG8gdGhlIDxteEhpZXJhcmNoaWNhbExheW91dD4gYWxnb3JpdGhtLgorICogdmVydGljZXMgLSBBcnJheSBvZiA8bXhDZWxscz4gdGhhdCByZXByZXNlbnQgdGhlIHZlcnRpY2VzIHdob20gYXJlIHRvCisgKiBoYXZlIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGNyZWF0ZWQuCisgKiBpbnRlcm5hbFZlcnRpY2VzIC0gVGhlIGFycmF5IG9mIDxteEdyYXBoSGllcmFyY2h5Tm9kZXM+IHRvIGhhdmUgdGhlaXIKKyAqIGluZm9ybWF0aW9uIGZpbGxlZCBpbiB1c2luZyB0aGUgcmVhbCB2ZXJ0aWNlcy4KKyAqLworbXhTd2ltbGFuZU1vZGVsLnByb3RvdHlwZS5jcmVhdGVJbnRlcm5hbENlbGxzID0gZnVuY3Rpb24obGF5b3V0LCB2ZXJ0aWNlcywgaW50ZXJuYWxWZXJ0aWNlcykKK3sKKwl2YXIgZ3JhcGggPSBsYXlvdXQuZ2V0R3JhcGgoKTsKKwl2YXIgc3dpbWxhbmVzID0gbGF5b3V0LnN3aW1sYW5lczsKKworCS8vIENyZWF0ZSBpbnRlcm5hbCBlZGdlcworCWZvciAodmFyIGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpKyspCisJeworCQlpbnRlcm5hbFZlcnRpY2VzW2ldID0gbmV3IG14R3JhcGhIaWVyYXJjaHlOb2RlKHZlcnRpY2VzW2ldKTsKKwkJdGhpcy52ZXJ0ZXhNYXBwZXIucHV0KHZlcnRpY2VzW2ldLCBpbnRlcm5hbFZlcnRpY2VzW2ldKTsKKwkJaW50ZXJuYWxWZXJ0aWNlc1tpXS5zd2ltbGFuZUluZGV4ID0gLTE7CisKKwkJZm9yICh2YXIgaWkgPSAwOyBpaSA8IHN3aW1sYW5lcy5sZW5ndGg7IGlpKyspCisJCXsKKwkJCWlmIChncmFwaC5tb2RlbC5nZXRQYXJlbnQodmVydGljZXNbaV0pID09IHN3aW1sYW5lc1tpaV0pCisJCQl7CisJCQkJaW50ZXJuYWxWZXJ0aWNlc1tpXS5zd2ltbGFuZUluZGV4ID0gaWk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLyBJZiB0aGUgbGF5b3V0IGlzIGRldGVybWluaXN0aWMsIG9yZGVyIHRoZSBjZWxscworCQkvL0xpc3Qgb3V0Z29pbmdDZWxscyA9IGdyYXBoLmdldE5laWdoYm91cnModmVydGljZXNbaV0sIGRldGVybWluaXN0aWMpOworCQl2YXIgY29ubnMgPSBsYXlvdXQuZ2V0RWRnZXModmVydGljZXNbaV0pOworCQlpbnRlcm5hbFZlcnRpY2VzW2ldLmNvbm5lY3RzQXNTb3VyY2UgPSBbXTsKKworCQkvLyBDcmVhdGUgaW50ZXJuYWwgZWRnZXMsIGJ1dCBkb24ndCBkbyBhbnkgcmFuayBhc3NpZ25tZW50IHlldAorCQkvLyBGaXJzdCB1c2UgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGdyZWVkeSBjeWNsZSByZW1vdmVyIHRvCisJCS8vIGludmVydCB0aGUgbGVmdHdhcmQgZWRnZXMgaW50ZXJuYWxseQorCQlmb3IgKHZhciBqID0gMDsgaiA8IGNvbm5zLmxlbmd0aDsgaisrKQorCQl7CisJCQl2YXIgY2VsbCA9IGxheW91dC5nZXRWaXNpYmxlVGVybWluYWwoY29ubnNbal0sIGZhbHNlKTsKKworCQkJLy8gTG9va2luZyBmb3Igb3V0Z29pbmcgZWRnZXMgb25seQorCQkJaWYgKGNlbGwgIT0gdmVydGljZXNbaV0gJiYgbGF5b3V0LmdyYXBoLm1vZGVsLmlzVmVydGV4KGNlbGwpICYmCisJCQkJCSFsYXlvdXQuaXNWZXJ0ZXhJZ25vcmVkKGNlbGwpKQorCQkJeworCQkJCS8vIFdlIHByb2Nlc3MgYWxsIGVkZ2UgYmV0d2VlbiB0aGlzIHNvdXJjZSBhbmQgaXRzIHRhcmdldHMKKwkJCQkvLyBJZiB0aGVyZSBhcmUgZWRnZXMgZ29pbmcgYm90aCB3YXlzLCB3ZSBuZWVkIHRvIGNvbGxlY3QKKwkJCQkvLyB0aGVtIGFsbCBpbnRvIG9uZSBpbnRlcm5hbCBlZGdlcyB0byBhdm9pZCBsb29waW5nIHByb2JsZW1zCisJCQkJLy8gbGF0ZXIuIFdlIGFzc3VtZSB0aGlzIGRpcmVjdGlvbiAoc291cmNlIC0+IHRhcmdldCkgaXMgdGhlIAorCQkJCS8vIG5hdHVyYWwgZGlyZWN0aW9uIGlmIGF0IGxlYXN0IGhhbGYgdGhlIGVkZ2VzIGFyZSBnb2luZyBpbgorCQkJCS8vIHRoYXQgZGlyZWN0aW9uLgorCisJCQkJLy8gVGhlIGNoZWNrIGJlbG93IGZvciBlZGdlc1swXSBiZWluZyBpbiB0aGUgdmVydGV4IG1hcHBlciBpcworCQkJCS8vIGluIGNhc2Ugd2UndmUgcHJvY2Vzc2VkIHRoaXMgdGhlIG90aGVyIHdheSBhcm91bmQKKwkJCQkvLyAodGFyZ2V0IC0+IHNvdXJjZSkgYW5kIHRoZSBudW1iZXIgb2YgZWRnZXMgaW4gZWFjaCBkaXJlY3Rpb24KKwkJCQkvLyBhcmUgdGhlIHNhbWUuIEFsbCB0aGUgZ3JhcGggZWRnZXMgd2lsbCBoYXZlIGJlZW4gYXNzaWduZWQgdG8KKwkJCQkvLyBhbiBpbnRlcm5hbCBlZGdlIGdvaW5nIHRoZSBvdGhlciB3YXksIHNvIHdlIGRvbid0IHdhbnQgdG8gCisJCQkJLy8gcHJvY2VzcyB0aGVtIGFnYWluCisJCQkJdmFyIHVuZGlyZWN0ZWRFZGdlcyA9IGxheW91dC5nZXRFZGdlc0JldHdlZW4odmVydGljZXNbaV0sCisJCQkJCQljZWxsLCBmYWxzZSk7CisJCQkJdmFyIGRpcmVjdGVkRWRnZXMgPSBsYXlvdXQuZ2V0RWRnZXNCZXR3ZWVuKHZlcnRpY2VzW2ldLAorCQkJCQkJY2VsbCwgdHJ1ZSk7CisJCQkJCisJCQkJaWYgKHVuZGlyZWN0ZWRFZGdlcyAhPSBudWxsICYmCisJCQkJCQl1bmRpcmVjdGVkRWRnZXMubGVuZ3RoID4gMCAmJgorCQkJCQkJdGhpcy5lZGdlTWFwcGVyLmdldCh1bmRpcmVjdGVkRWRnZXNbMF0pID09IG51bGwgJiYKKwkJCQkJCWRpcmVjdGVkRWRnZXMubGVuZ3RoICogMiA+PSB1bmRpcmVjdGVkRWRnZXMubGVuZ3RoKQorCQkJCXsKKwkJCQkJdmFyIGludGVybmFsRWRnZSA9IG5ldyBteEdyYXBoSGllcmFyY2h5RWRnZSh1bmRpcmVjdGVkRWRnZXMpOworCisJCQkJCWZvciAodmFyIGsgPSAwOyBrIDwgdW5kaXJlY3RlZEVkZ2VzLmxlbmd0aDsgaysrKQorCQkJCQl7CisJCQkJCQl2YXIgZWRnZSA9IHVuZGlyZWN0ZWRFZGdlc1trXTsKKwkJCQkJCXRoaXMuZWRnZU1hcHBlci5wdXQoZWRnZSwgaW50ZXJuYWxFZGdlKTsKKworCQkJCQkJLy8gUmVzZXRzIGFsbCBwb2ludCBvbiB0aGUgZWRnZSBhbmQgZGlzYWJsZXMgdGhlIGVkZ2Ugc3R5bGUKKwkJCQkJCS8vIHdpdGhvdXQgZGVsZXRpbmcgaXQgZnJvbSB0aGUgY2VsbCBzdHlsZQorCQkJCQkJZ3JhcGgucmVzZXRFZGdlKGVkZ2UpOworCisJCQkJCSAgICBpZiAobGF5b3V0LmRpc2FibGVFZGdlU3R5bGUpCisJCQkJCSAgICB7CisJCQkJCSAgICAJbGF5b3V0LnNldEVkZ2VTdHlsZUVuYWJsZWQoZWRnZSwgZmFsc2UpOworCQkJCQkgICAgCWxheW91dC5zZXRPcnRob2dvbmFsRWRnZShlZGdlLHRydWUpOworCQkJCQkgICAgfQorCQkJCQl9CisKKwkJCQkJaW50ZXJuYWxFZGdlLnNvdXJjZSA9IGludGVybmFsVmVydGljZXNbaV07CisKKwkJCQkJaWYgKG14VXRpbHMuaW5kZXhPZihpbnRlcm5hbFZlcnRpY2VzW2ldLmNvbm5lY3RzQXNTb3VyY2UsIGludGVybmFsRWRnZSkgPCAwKQorCQkJCQl7CisJCQkJCQlpbnRlcm5hbFZlcnRpY2VzW2ldLmNvbm5lY3RzQXNTb3VyY2UucHVzaChpbnRlcm5hbEVkZ2UpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gRW5zdXJlIHRlbXAgdmFyaWFibGUgaXMgY2xlYXJlZCBmcm9tIGFueSBwcmV2aW91cyB1c2UKKwkJaW50ZXJuYWxWZXJ0aWNlc1tpXS50ZW1wWzBdID0gMDsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbml0aWFsUmFuaworICoKKyAqIEJhc2ljIGRldGVybWluYXRpb24gb2YgbWluaW11bSBsYXllciByYW5raW5nIGJ5IHdvcmtpbmcgZnJvbSBmcm9tIHNvdXJjZXMKKyAqIG9yIHNpbmtzIGFuZCB3b3JraW5nIHRocm91Z2ggZWFjaCBub2RlIGluIHRoZSByZWxldmFudCBlZGdlIGRpcmVjdGlvbi4KKyAqIFN0YXJ0aW5nIGF0IHRoZSBzaW5rcyBpcyBiYXNpY2FsbHkgYSBsb25nZXN0IHBhdGggbGF5ZXJpbmcgYWxnb3JpdGhtLgorKi8KK214U3dpbWxhbmVNb2RlbC5wcm90b3R5cGUuaW5pdGlhbFJhbmsgPSBmdW5jdGlvbigpCit7CisJdGhpcy5yYW5rc1Blckdyb3VwID0gW107CisJCisJdmFyIHN0YXJ0Tm9kZXMgPSBbXTsKKwl2YXIgc2VlbiA9IG5ldyBPYmplY3QoKTsKKworCWlmICh0aGlzLnJvb3RzICE9IG51bGwpCisJeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucm9vdHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBpbnRlcm5hbE5vZGUgPSB0aGlzLnZlcnRleE1hcHBlci5nZXQodGhpcy5yb290c1tpXSk7CisJCQl0aGlzLm1heENoYWluRGZzKG51bGwsIGludGVybmFsTm9kZSwgbnVsbCwgc2VlbiwgMCk7CisKKwkJCWlmIChpbnRlcm5hbE5vZGUgIT0gbnVsbCkKKwkJCXsKKwkJCQlzdGFydE5vZGVzLnB1c2goaW50ZXJuYWxOb2RlKTsKKwkJCX0KKwkJfQorCX0KKworCS8vIENhbGN1bGF0ZSB0aGUgbG93ZXIgYW5kIHVwcGVyIHJhbmsgYm91bmRzIG9mIGVhY2ggc3dpbWxhbmUKKwl2YXIgbG93ZXJSYW5rID0gW107CisJdmFyIHVwcGVyUmFuayA9IFtdOworCQorCWZvciAodmFyIGkgPSB0aGlzLnJhbmtzUGVyR3JvdXAubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCisJeworCQlpZiAoaSA9PSB0aGlzLnJhbmtzUGVyR3JvdXAubGVuZ3RoIC0gMSkKKwkJeworCQkJbG93ZXJSYW5rW2ldID0gMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWxvd2VyUmFua1tpXSA9IHVwcGVyUmFua1tpKzFdICsgMTsKKwkJfQorCQkKKwkJdXBwZXJSYW5rW2ldID0gbG93ZXJSYW5rW2ldICsgdGhpcy5yYW5rc1Blckdyb3VwW2ldOworCX0KKwkKKwl0aGlzLm1heFJhbmsgPSB1cHBlclJhbmtbMF07CisKKwl2YXIgaW50ZXJuYWxOb2RlcyA9IHRoaXMudmVydGV4TWFwcGVyLmdldFZhbHVlcygpOworCQorCWZvciAodmFyIGk9MDsgaSA8IGludGVybmFsTm9kZXMubGVuZ3RoOyBpKyspCisJeworCQkvLyBNYXJrIHRoZSBub2RlIGFzIG5vdCBoYXZpbmcgaGFkIGEgbGF5ZXIgYXNzaWduZWQKKwkJaW50ZXJuYWxOb2Rlc1tpXS50ZW1wWzBdID0gLTE7CisJfQorCisJdmFyIHN0YXJ0Tm9kZXNDb3B5ID0gc3RhcnROb2Rlcy5zbGljZSgpOworCQorCXdoaWxlIChzdGFydE5vZGVzLmxlbmd0aCA+IDApCisJeworCQl2YXIgaW50ZXJuYWxOb2RlID0gc3RhcnROb2Rlc1swXTsKKwkJdmFyIGxheWVyRGV0ZXJtaW5pbmdFZGdlczsKKwkJdmFyIGVkZ2VzVG9CZU1hcmtlZDsKKworCQlsYXllckRldGVybWluaW5nRWRnZXMgPSBpbnRlcm5hbE5vZGUuY29ubmVjdHNBc1RhcmdldDsKKwkJZWRnZXNUb0JlTWFya2VkID0gaW50ZXJuYWxOb2RlLmNvbm5lY3RzQXNTb3VyY2U7CisKKwkJLy8gZmxhZyB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IGFsbCBsYXllciBkZXRlcm1pbmluZworCQkvLyBlZGdlcyBoYXZlIGJlZW4gc2Nhbm5lZAorCQl2YXIgYWxsRWRnZXNTY2FubmVkID0gdHJ1ZTsKKworCQkvLyBXb3JrIG91dCB0aGUgbGF5ZXIgb2YgdGhpcyBub2RlIGZyb20gdGhlIGxheWVyIGRldGVybWluaW5nCisJCS8vIGVkZ2VzLiBUaGUgbWluaW11bSBsYXllciBudW1iZXIgb2YgYW55IG5vZGUgY29ubmVjdGVkIGJ5IG9uZSBvZgorCQkvLyB0aGUgbGF5ZXIgZGV0ZXJtaW5pbmcgZWRnZXMgdmFyaWFibGUKKwkJdmFyIG1pbmltdW1MYXllciA9IHVwcGVyUmFua1swXTsKKworCQlmb3IgKHZhciBpID0gMDsgaSA8IGxheWVyRGV0ZXJtaW5pbmdFZGdlcy5sZW5ndGg7IGkrKykKKwkJeworCQkJdmFyIGludGVybmFsRWRnZSA9IGxheWVyRGV0ZXJtaW5pbmdFZGdlc1tpXTsKKworCQkJaWYgKGludGVybmFsRWRnZS50ZW1wWzBdID09IDUyNzA2MjApCisJCQl7CisJCQkJLy8gVGhpcyBlZGdlIGhhcyBiZWVuIHNjYW5uZWQsIGdldCB0aGUgbGF5ZXIgb2YgdGhlCisJCQkJLy8gbm9kZSBvbiB0aGUgb3RoZXIgZW5kCisJCQkJdmFyIG90aGVyTm9kZSA9IGludGVybmFsRWRnZS5zb3VyY2U7CisJCQkJbWluaW11bUxheWVyID0gTWF0aC5taW4obWluaW11bUxheWVyLCBvdGhlck5vZGUudGVtcFswXSAtIDEpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWFsbEVkZ2VzU2Nhbm5lZCA9IGZhbHNlOworCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLyBJZiBhbGwgZWRnZSBoYXZlIGJlZW4gc2Nhbm5lZCwgYXNzaWduIHRoZSBsYXllciwgbWFyayBhbGwKKwkJLy8gZWRnZXMgaW4gdGhlIG90aGVyIGRpcmVjdGlvbiBhbmQgcmVtb3ZlIGZyb20gdGhlIG5vZGVzIGxpc3QKKwkJaWYgKGFsbEVkZ2VzU2Nhbm5lZCkKKwkJeworCQkJaWYgKG1pbmltdW1MYXllciA+IHVwcGVyUmFua1tpbnRlcm5hbE5vZGUuc3dpbWxhbmVJbmRleF0pCisJCQl7CisJCQkJbWluaW11bUxheWVyID0gdXBwZXJSYW5rW2ludGVybmFsTm9kZS5zd2ltbGFuZUluZGV4XTsKKwkJCX0KKworCQkJaW50ZXJuYWxOb2RlLnRlbXBbMF0gPSBtaW5pbXVtTGF5ZXI7CisKKwkJCWlmIChlZGdlc1RvQmVNYXJrZWQgIT0gbnVsbCkKKwkJCXsKKwkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzVG9CZU1hcmtlZC5sZW5ndGg7IGkrKykKKwkJCQl7CisJCQkJCXZhciBpbnRlcm5hbEVkZ2UgPSBlZGdlc1RvQmVNYXJrZWRbaV07CisKKwkJCQkJLy8gQXNzaWduIHVuaXF1ZSBzdGFtcCAoIHkvbS9kL2ggKQorCQkJCQlpbnRlcm5hbEVkZ2UudGVtcFswXSA9IDUyNzA2MjA7CisKKwkJCQkJLy8gQWRkIG5vZGUgb24gb3RoZXIgZW5kIG9mIGVkZ2UgdG8gTGlua2VkTGlzdCBvZgorCQkJCQkvLyBub2RlcyB0byBiZSBhbmFseXNlZAorCQkJCQl2YXIgb3RoZXJOb2RlID0gaW50ZXJuYWxFZGdlLnRhcmdldDsKKworCQkJCQkvLyBPbmx5IGFkZCBub2RlIGlmIGl0IGhhc24ndCBiZWVuIGFzc2lnbmVkIGEgbGF5ZXIKKwkJCQkJaWYgKG90aGVyTm9kZS50ZW1wWzBdID09IC0xKQorCQkJCQl7CisJCQkJCQlzdGFydE5vZGVzLnB1c2gob3RoZXJOb2RlKTsKKworCQkJCQkJLy8gTWFyayB0aGlzIG90aGVyIG5vZGUgYXMgbmVpdGhlciBiZWluZworCQkJCQkJLy8gdW5hc3NpZ25lZCBub3IgYXNzaWduZWQgc28gaXQgaXNuJ3QKKwkJCQkJCS8vIGFkZGVkIHRvIHRoaXMgbGlzdCBhZ2FpbiwgYnV0IGl0J3MKKwkJCQkJCS8vIGxheWVyIGlzbid0IHVzZWQgaW4gYW55IGNhbGN1bGF0aW9uLgorCQkJCQkJb3RoZXJOb2RlLnRlbXBbMF0gPSAtMjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJc3RhcnROb2Rlcy5zaGlmdCgpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gTm90IGFsbCB0aGUgZWRnZXMgaGF2ZSBiZWVuIHNjYW5uZWQsIGdldCB0byB0aGUgYmFjayBvZgorCQkJLy8gdGhlIGNsYXNzIGFuZCBwdXQgdGhlIGR1bmNlcyBjYXAgb24KKwkJCXZhciByZW1vdmVkQ2VsbCA9IHN0YXJ0Tm9kZXMuc2hpZnQoKTsKKwkJCXN0YXJ0Tm9kZXMucHVzaChpbnRlcm5hbE5vZGUpOworCisJCQlpZiAocmVtb3ZlZENlbGwgPT0gaW50ZXJuYWxOb2RlICYmIHN0YXJ0Tm9kZXMubGVuZ3RoID09IDEpCisJCQl7CisJCQkJLy8gVGhpcyBpcyBhbiBlcnJvciBjb25kaXRpb24sIHdlIGNhbid0IGdldCBvdXQgb2YKKwkJCQkvLyB0aGlzIGxvb3AuIEl0IGNvdWxkIGhhcHBlbiBmb3IgbW9yZSB0aGFuIG9uZSBub2RlCisJCQkJLy8gYnV0IHRoYXQncyBhIGxvdCBoYXJkZXIgdG8gZGV0ZWN0LiBMb2cgdGhlIGVycm9yCisJCQkJLy8gVE9ETyBtYWtlIGxvZyBjb21tZW50CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvLyBOb3JtYWxpemUgdGhlIHJhbmtzIGRvd24gZnJvbSB0aGVpciBsYXJnZSBzdGFydGluZyB2YWx1ZSB0byBwbGFjZQorCS8vIGF0IGxlYXN0IDEgc2luayBvbiBsYXllciAwCisvLwlmb3IgKHZhciBrZXkgaW4gdGhpcy52ZXJ0ZXhNYXBwZXIpCisvLwl7CisvLwkJdmFyIGludGVybmFsTm9kZSA9IHRoaXMudmVydGV4TWFwcGVyW2tleV07CisvLwkJLy8gTWFyayB0aGUgbm9kZSBhcyBub3QgaGF2aW5nIGhhZCBhIGxheWVyIGFzc2lnbmVkCisvLwkJaW50ZXJuYWxOb2RlLnRlbXBbMF0gLT0gdGhpcy5tYXhSYW5rOworLy8JfQorCQorCS8vIFRpZ2h0ZW4gdGhlIHJhbmsgMCBub2RlcyBhcyBmYXIgYXMgcG9zc2libGUKKy8vCWZvciAoIHZhciBpID0gMDsgaSA8IHN0YXJ0Tm9kZXNDb3B5Lmxlbmd0aDsgaSsrKQorLy8JeworLy8JCXZhciBpbnRlcm5hbE5vZGUgPSBzdGFydE5vZGVzQ29weVtpXTsKKy8vCQl2YXIgY3VycmVudE1heExheWVyID0gMDsKKy8vCQl2YXIgbGF5ZXJEZXRlcm1pbmluZ0VkZ2VzID0gaW50ZXJuYWxOb2RlLmNvbm5lY3RzQXNTb3VyY2U7CisvLworLy8JCWZvciAoIHZhciBqID0gMDsgaiA8IGxheWVyRGV0ZXJtaW5pbmdFZGdlcy5sZW5ndGg7IGorKykKKy8vCQl7CisvLwkJCXZhciBpbnRlcm5hbEVkZ2UgPSBsYXllckRldGVybWluaW5nRWRnZXNbal07CisvLwkJCXZhciBvdGhlck5vZGUgPSBpbnRlcm5hbEVkZ2UudGFyZ2V0OworLy8JCQlpbnRlcm5hbE5vZGUudGVtcFswXSA9IE1hdGgubWF4KGN1cnJlbnRNYXhMYXllciwKKy8vCQkJCQlvdGhlck5vZGUudGVtcFswXSArIDEpOworLy8JCQljdXJyZW50TWF4TGF5ZXIgPSBpbnRlcm5hbE5vZGUudGVtcFswXTsKKy8vCQl9CisvLwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtYXhDaGFpbkRmcworICoKKyAqIFBlcmZvcm1zIGEgZGVwdGggZmlyc3Qgc2VhcmNoIG9uIHRoZSBpbnRlcm5hbCBoaWVyYXJjaHkgbW9kZWwuIFRoaXMgZGZzCisgKiBleHRlbmRzIHRoZSBkZWZhdWx0IHZlcnNpb24gYnkga2VlcGluZyB0cmFjayBvZiBjaGFpbnMgd2l0aGluIGdyb3Vwcy4KKyAqIEFueSBjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQgcHJpb3IgdG8gcnVubmluZywgYnV0IHByZXZpb3VzbHkgc2VlbiBjZWxscworICogYXJlIGlnbm9yZWQuCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBwYXJlbnQgLSB0aGUgcGFyZW50IGludGVybmFsIG5vZGUgb2YgdGhlIGN1cnJlbnQgaW50ZXJuYWwgbm9kZQorICogcm9vdCAtIHRoZSBjdXJyZW50IGludGVybmFsIG5vZGUKKyAqIGNvbm5lY3RpbmdFZGdlIC0gdGhlIGludGVybmFsIGVkZ2UgY29ubmVjdGluZyB0aGUgaW50ZXJuYWwgbm9kZSBhbmQgdGhlIHBhcmVudAorICogaW50ZXJuYWwgbm9kZSwgaWYgYW55CisgKiBzZWVuIC0gYSBzZXQgb2YgYWxsIG5vZGVzIHNlZW4gYnkgdGhpcyBkZnMKKyAqIGNoYWluQ291bnQgLSB0aGUgbnVtYmVyIG9mIGVkZ2VzIGluIHRoZSBjaGFpbiBvZiB2ZXJ0aWNlcyBnb2luZyB0aHJvdWdoCisgKiB0aGUgY3VycmVudCBzd2ltbGFuZQorICovCitteFN3aW1sYW5lTW9kZWwucHJvdG90eXBlLm1heENoYWluRGZzID0gZnVuY3Rpb24ocGFyZW50LCByb290LCBjb25uZWN0aW5nRWRnZSwgc2VlbiwgY2hhaW5Db3VudCkKK3sKKwlpZiAocm9vdCAhPSBudWxsKQorCXsKKwkJdmFyIHJvb3RJZCA9IG14Q2VsbFBhdGguY3JlYXRlKHJvb3QuY2VsbCk7CisKKwkJaWYgKHNlZW5bcm9vdElkXSA9PSBudWxsKQorCQl7CisJCQlzZWVuW3Jvb3RJZF0gPSByb290OworCQkJdmFyIHNsSW5kZXggPSByb290LnN3aW1sYW5lSW5kZXg7CisJCQkKKwkJCWlmICh0aGlzLnJhbmtzUGVyR3JvdXBbc2xJbmRleF0gPT0gbnVsbCB8fCB0aGlzLnJhbmtzUGVyR3JvdXBbc2xJbmRleF0gPCBjaGFpbkNvdW50KQorCQkJeworCQkJCXRoaXMucmFua3NQZXJHcm91cFtzbEluZGV4XSA9IGNoYWluQ291bnQ7CisJCQl9CisKKwkJCS8vIENvcHkgdGhlIGNvbm5lY3RzIGFzIHNvdXJjZSBsaXN0IHNvIHRoYXQgdmlzaXRvcnMKKwkJCS8vIGNhbiBjaGFuZ2UgdGhlIG9yaWdpbmFsIGZvciBlZGdlIGRpcmVjdGlvbiBpbnZlcnNpb25zCisJCQl2YXIgb3V0Z29pbmdFZGdlcyA9IHJvb3QuY29ubmVjdHNBc1NvdXJjZS5zbGljZSgpOworCisJCQlmb3IgKHZhciBpID0gMDsgaSA8IG91dGdvaW5nRWRnZXMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJdmFyIGludGVybmFsRWRnZSA9IG91dGdvaW5nRWRnZXNbaV07CisJCQkJdmFyIHRhcmdldE5vZGUgPSBpbnRlcm5hbEVkZ2UudGFyZ2V0OworCisJCQkJLy8gT25seSBuYXZpZ2F0ZSBpbiBzb3VyY2UtPnRhcmdldCBkaXJlY3Rpb24gd2l0aGluIHRoZSBzYW1lCisJCQkJLy8gc3dpbWxhbmUsIG9yIGZyb20gYSBsb3dlciBpbmRleCBzd2ltbGFuZSB0byBhIGhpZ2hlciBvbmUKKwkJCQlpZiAocm9vdC5zd2ltbGFuZUluZGV4IDwgdGFyZ2V0Tm9kZS5zd2ltbGFuZUluZGV4KQorCQkJCXsKKwkJCQkJdGhpcy5tYXhDaGFpbkRmcyhyb290LCB0YXJnZXROb2RlLCBpbnRlcm5hbEVkZ2UsIG14VXRpbHMuY2xvbmUoc2VlbiwgbnVsbCAsIHRydWUpLCAwKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAocm9vdC5zd2ltbGFuZUluZGV4ID09IHRhcmdldE5vZGUuc3dpbWxhbmVJbmRleCkKKwkJCQl7CisJCQkJCXRoaXMubWF4Q2hhaW5EZnMocm9vdCwgdGFyZ2V0Tm9kZSwgaW50ZXJuYWxFZGdlLCBteFV0aWxzLmNsb25lKHNlZW4sIG51bGwgLCB0cnVlKSwgY2hhaW5Db3VudCArIDEpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGZpeFJhbmtzCisgKgorICogRml4ZXMgdGhlIGxheWVyIGFzc2lnbm1lbnRzIHRvIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBub2Rlcy4gQWxzbyBuZWVkcworICogdG8gY3JlYXRlIGR1bW15IG5vZGVzIGZvciBlZGdlcyB0aGF0IGNyb3NzIGxheWVycy4KKyAqLworbXhTd2ltbGFuZU1vZGVsLnByb3RvdHlwZS5maXhSYW5rcyA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgcmFua0xpc3QgPSBbXTsKKwl0aGlzLnJhbmtzID0gW107CisKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubWF4UmFuayArIDE7IGkrKykKKwl7CisJCXJhbmtMaXN0W2ldID0gW107CisJCXRoaXMucmFua3NbaV0gPSByYW5rTGlzdFtpXTsKKwl9CisKKwkvLyBQZXJmb3JtIGEgREZTIHRvIG9idGFpbiBhbiBpbml0aWFsIG9yZGVyaW5nIGZvciBlYWNoIHJhbmsuCisJLy8gV2l0aG91dCBkb2luZyB0aGlzIHlvdSB3b3VsZCBlbmQgdXAgaGF2aW5nIHRvIHByb2Nlc3MKKwkvLyBjcm9zc2luZ3MgZm9yIGEgc3RhbmRhcmQgdHJlZS4KKwl2YXIgcm9vdHNBcnJheSA9IG51bGw7CisKKwlpZiAodGhpcy5yb290cyAhPSBudWxsKQorCXsKKwkJdmFyIG9sZFJvb3RzQXJyYXkgPSB0aGlzLnJvb3RzOworCQlyb290c0FycmF5ID0gW107CisKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBvbGRSb290c0FycmF5Lmxlbmd0aDsgaSsrKQorCQl7CisJCQl2YXIgY2VsbCA9IG9sZFJvb3RzQXJyYXlbaV07CisJCQl2YXIgaW50ZXJuYWxOb2RlID0gdGhpcy52ZXJ0ZXhNYXBwZXIuZ2V0KGNlbGwpOworCQkJcm9vdHNBcnJheVtpXSA9IGludGVybmFsTm9kZTsKKwkJfQorCX0KKworCXRoaXMudmlzaXQoZnVuY3Rpb24ocGFyZW50LCBub2RlLCBlZGdlLCBsYXllciwgc2VlbikKKwl7CisJCWlmIChzZWVuID09IDAgJiYgbm9kZS5tYXhSYW5rIDwgMCAmJiBub2RlLm1pblJhbmsgPCAwKQorCQl7CisJCQlyYW5rTGlzdFtub2RlLnRlbXBbMF1dLnB1c2gobm9kZSk7CisJCQlub2RlLm1heFJhbmsgPSBub2RlLnRlbXBbMF07CisJCQlub2RlLm1pblJhbmsgPSBub2RlLnRlbXBbMF07CisKKwkJCS8vIFNldCB0ZW1wWzBdIHRvIHRoZSBub2RlcyBwb3NpdGlvbiBpbiB0aGUgcmFuaworCQkJbm9kZS50ZW1wWzBdID0gcmFua0xpc3Rbbm9kZS5tYXhSYW5rXS5sZW5ndGggLSAxOworCQl9CisKKwkJaWYgKHBhcmVudCAhPSBudWxsICYmIGVkZ2UgIT0gbnVsbCkKKwkJeworCQkJdmFyIHBhcmVudFRvQ2VsbFJhbmtEaWZmZXJlbmNlID0gcGFyZW50Lm1heFJhbmsgLSBub2RlLm1heFJhbms7CisKKwkJCWlmIChwYXJlbnRUb0NlbGxSYW5rRGlmZmVyZW5jZSA+IDEpCisJCQl7CisJCQkJLy8gVGhlcmUgYXJlIHJhbmtzIGluIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgY3VycmVudCBjZWxsCisJCQkJZWRnZS5tYXhSYW5rID0gcGFyZW50Lm1heFJhbms7CisJCQkJZWRnZS5taW5SYW5rID0gbm9kZS5tYXhSYW5rOworCQkJCWVkZ2UudGVtcCA9IFtdOworCQkJCWVkZ2UueCA9IFtdOworCQkJCWVkZ2UueSA9IFtdOworCisJCQkJZm9yICh2YXIgaSA9IGVkZ2UubWluUmFuayArIDE7IGkgPCBlZGdlLm1heFJhbms7IGkrKykKKwkJCQl7CisJCQkJCS8vIFRoZSBjb25uZWN0aW5nIGVkZ2UgbXVzdCBiZSBhZGRlZCB0byB0aGUKKwkJCQkJLy8gYXBwcm9wcmlhdGUgcmFua3MKKwkJCQkJcmFua0xpc3RbaV0ucHVzaChlZGdlKTsKKwkJCQkJZWRnZS5zZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKGksIHJhbmtMaXN0W2ldCisJCQkJCQkJLmxlbmd0aCAtIDEpOworCQkJCX0KKwkJCX0KKwkJfQorCX0sIHJvb3RzQXJyYXksIGZhbHNlLCBudWxsKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHZpc2l0CisgKgorICogQSBkZXB0aCBmaXJzdCBzZWFyY2ggdGhyb3VnaCB0aGUgaW50ZXJuYWwgaGVpcmFyY2h5IG1vZGVsLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogdmlzaXRvciAtIFRoZSB2aXNpdG9yIGZ1bmN0aW9uIHBhdHRlcm4gdG8gYmUgY2FsbGVkIGZvciBlYWNoIG5vZGUuCisgKiB0cmFja0FuY2VzdG9ycyAtIFdoZXRoZXIgb3Igbm90IHRoZSBzZWFyY2ggaXMgdG8ga2VlcCB0cmFjayBhbGwgbm9kZXMKKyAqIGRpcmVjdGx5IGFib3ZlIHRoaXMgb25lIGluIHRoZSBzZWFyY2ggcGF0aC4KKyAqLworbXhTd2ltbGFuZU1vZGVsLnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uKHZpc2l0b3IsIGRmc1Jvb3RzLCB0cmFja0FuY2VzdG9ycywgc2Vlbk5vZGVzKQoreworCS8vIFJ1biBkZnMgdGhyb3VnaCBvbiBhbGwgcm9vdHMKKwlpZiAoZGZzUm9vdHMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZGZzUm9vdHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBpbnRlcm5hbE5vZGUgPSBkZnNSb290c1tpXTsKKworCQkJaWYgKGludGVybmFsTm9kZSAhPSBudWxsKQorCQkJeworCQkJCWlmIChzZWVuTm9kZXMgPT0gbnVsbCkKKwkJCQl7CisJCQkJCXNlZW5Ob2RlcyA9IG5ldyBPYmplY3QoKTsKKwkJCQl9CisKKwkJCQlpZiAodHJhY2tBbmNlc3RvcnMpCisJCQkJeworCQkJCQkvLyBTZXQgdXAgaGFzaCBjb2RlIGZvciByb290CisJCQkJCWludGVybmFsTm9kZS5oYXNoQ29kZSA9IFtdOworCQkJCQlpbnRlcm5hbE5vZGUuaGFzaENvZGVbMF0gPSB0aGlzLmRmc0NvdW50OworCQkJCQlpbnRlcm5hbE5vZGUuaGFzaENvZGVbMV0gPSBpOworCQkJCQl0aGlzLmV4dGVuZGVkRGZzKG51bGwsIGludGVybmFsTm9kZSwgbnVsbCwgdmlzaXRvciwgc2Vlbk5vZGVzLAorCQkJCQkJCWludGVybmFsTm9kZS5oYXNoQ29kZSwgaSwgMCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXRoaXMuZGZzKG51bGwsIGludGVybmFsTm9kZSwgbnVsbCwgdmlzaXRvciwgc2Vlbk5vZGVzLCAwKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQl0aGlzLmRmc0NvdW50Kys7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZGZzCisgKgorICogUGVyZm9ybXMgYSBkZXB0aCBmaXJzdCBzZWFyY2ggb24gdGhlIGludGVybmFsIGhpZXJhcmNoeSBtb2RlbAorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogcGFyZW50IC0gdGhlIHBhcmVudCBpbnRlcm5hbCBub2RlIG9mIHRoZSBjdXJyZW50IGludGVybmFsIG5vZGUKKyAqIHJvb3QgLSB0aGUgY3VycmVudCBpbnRlcm5hbCBub2RlCisgKiBjb25uZWN0aW5nRWRnZSAtIHRoZSBpbnRlcm5hbCBlZGdlIGNvbm5lY3RpbmcgdGhlIGludGVybmFsIG5vZGUgYW5kIHRoZSBwYXJlbnQKKyAqIGludGVybmFsIG5vZGUsIGlmIGFueQorICogdmlzaXRvciAtIHRoZSB2aXNpdG9yIHBhdHRlcm4gdG8gYmUgY2FsbGVkIGZvciBlYWNoIG5vZGUKKyAqIHNlZW4gLSBhIHNldCBvZiBhbGwgbm9kZXMgc2VlbiBieSB0aGlzIGRmcyBhIHNldCBvZiBhbGwgb2YgdGhlCisgKiBhbmNlc3RvciBub2RlIG9mIHRoZSBjdXJyZW50IG5vZGUKKyAqIGxheWVyIC0gdGhlIGxheWVyIG9uIHRoZSBkZnMgdHJlZSAoIG5vdCB0aGUgc2FtZSBhcyB0aGUgbW9kZWwgcmFua3MgKQorICovCitteFN3aW1sYW5lTW9kZWwucHJvdG90eXBlLmRmcyA9IGZ1bmN0aW9uKHBhcmVudCwgcm9vdCwgY29ubmVjdGluZ0VkZ2UsIHZpc2l0b3IsIHNlZW4sIGxheWVyKQoreworCWlmIChyb290ICE9IG51bGwpCisJeworCQl2YXIgcm9vdElkID0gcm9vdC5pZDsKKworCQlpZiAoc2Vlbltyb290SWRdID09IG51bGwpCisJCXsKKwkJCXNlZW5bcm9vdElkXSA9IHJvb3Q7CisJCQl2aXNpdG9yKHBhcmVudCwgcm9vdCwgY29ubmVjdGluZ0VkZ2UsIGxheWVyLCAwKTsKKworCQkJLy8gQ29weSB0aGUgY29ubmVjdHMgYXMgc291cmNlIGxpc3Qgc28gdGhhdCB2aXNpdG9ycworCQkJLy8gY2FuIGNoYW5nZSB0aGUgb3JpZ2luYWwgZm9yIGVkZ2UgZGlyZWN0aW9uIGludmVyc2lvbnMKKwkJCXZhciBvdXRnb2luZ0VkZ2VzID0gcm9vdC5jb25uZWN0c0FzU291cmNlLnNsaWNlKCk7CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpPCBvdXRnb2luZ0VkZ2VzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCXZhciBpbnRlcm5hbEVkZ2UgPSBvdXRnb2luZ0VkZ2VzW2ldOworCQkJCXZhciB0YXJnZXROb2RlID0gaW50ZXJuYWxFZGdlLnRhcmdldDsKKworCQkJCS8vIFJvb3QgY2hlY2sgaXMgTyh8cm9vdHN8KQorCQkJCXRoaXMuZGZzKHJvb3QsIHRhcmdldE5vZGUsIGludGVybmFsRWRnZSwgdmlzaXRvciwgc2VlbiwKKwkJCQkJCWxheWVyICsgMSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBVc2UgdGhlIGludCBmaWVsZCB0byBpbmRpY2F0ZSB0aGlzIG5vZGUgaGFzIGJlZW4gc2VlbgorCQkJdmlzaXRvcihwYXJlbnQsIHJvb3QsIGNvbm5lY3RpbmdFZGdlLCBsYXllciwgMSk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBleHRlbmRlZERmcworICoKKyAqIFBlcmZvcm1zIGEgZGVwdGggZmlyc3Qgc2VhcmNoIG9uIHRoZSBpbnRlcm5hbCBoaWVyYXJjaHkgbW9kZWwuIFRoaXMgZGZzCisgKiBleHRlbmRzIHRoZSBkZWZhdWx0IHZlcnNpb24gYnkga2VlcGluZyB0cmFjayBvZiBjZWxscyBhbmNlc3RvcnMsIGJ1dCBpdAorICogc2hvdWxkIGJlIG9ubHkgdXNlZCB3aGVuIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIGl0IGNhbiBiZSBjb21wdXRhdGlvbmFsbHkKKyAqIGludGVuc2l2ZSBmb3IgZGVlcCBzZWFyY2hlcy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIHBhcmVudCAtIHRoZSBwYXJlbnQgaW50ZXJuYWwgbm9kZSBvZiB0aGUgY3VycmVudCBpbnRlcm5hbCBub2RlCisgKiByb290IC0gdGhlIGN1cnJlbnQgaW50ZXJuYWwgbm9kZQorICogY29ubmVjdGluZ0VkZ2UgLSB0aGUgaW50ZXJuYWwgZWRnZSBjb25uZWN0aW5nIHRoZSBpbnRlcm5hbCBub2RlIGFuZCB0aGUgcGFyZW50CisgKiBpbnRlcm5hbCBub2RlLCBpZiBhbnkKKyAqIHZpc2l0b3IgLSB0aGUgdmlzaXRvciBwYXR0ZXJuIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCBub2RlCisgKiBzZWVuIC0gYSBzZXQgb2YgYWxsIG5vZGVzIHNlZW4gYnkgdGhpcyBkZnMKKyAqIGFuY2VzdG9ycyAtIHRoZSBwYXJlbnQgaGFzaCBjb2RlCisgKiBjaGlsZEhhc2ggLSB0aGUgbmV3IGhhc2ggY29kZSBmb3IgdGhpcyBub2RlCisgKiBsYXllciAtIHRoZSBsYXllciBvbiB0aGUgZGZzIHRyZWUgKCBub3QgdGhlIHNhbWUgYXMgdGhlIG1vZGVsIHJhbmtzICkKKyAqLworbXhTd2ltbGFuZU1vZGVsLnByb3RvdHlwZS5leHRlbmRlZERmcyA9IGZ1bmN0aW9uKHBhcmVudCwgcm9vdCwgY29ubmVjdGluZ0VkZ2UsIHZpc2l0b3IsIHNlZW4sIGFuY2VzdG9ycywgY2hpbGRIYXNoLCBsYXllcikKK3sKKwkvLyBFeHBsYW5hdGlvbiBvZiBjdXN0b20gaGFzaCBzZXQuIFByZXZpb3VzbHksIHRoZSBhbmNlc3RvcnMgdmFyaWFibGUKKwkvLyB3YXMgcGFzc2VkIHRocm91Z2ggdGhlIGRmcyBhcyBhIEhhc2hTZXQuIFRoZSBhbmNlc3RvcnMgd2VyZSBjb3BpZWQKKwkvLyBpbnRvIGEgbmV3IEhhc2hTZXQgYW5kIHdoZW4gdGhlIG5ldyBjaGlsZCB3YXMgcHJvY2Vzc2VkIGl0IHdhcyBhbHNvCisJLy8gYWRkZWQgdG8gdGhlIHNldC4gSWYgdGhlIGN1cnJlbnQgbm9kZSB3YXMgaW4gaXRzIGFuY2VzdG9yIGxpc3QgaXQKKwkvLyBtZWFudCB0aGVyZSBpcyBhIGN5Y2xlIGluIHRoZSBncmFwaCBhbmQgdGhpcyBpbmZvcm1hdGlvbiBpcyBwYXNzZWQKKwkvLyB0byB0aGUgdmlzaXRvci52aXNpdCgpIGluIHRoZSBzZWVuIHBhcmFtZXRlci4gVGhlIEhhc2hTZXQgY2xvbmUgd2FzCisJLy8gdmVyeSBleHBlbnNpdmUgb24gQ1BVIHNvIGEgY3VzdG9tIGhhc2ggd2FzIGRldmVsb3BlZCB1c2luZyBwcmltaXRpdmUKKwkvLyB0eXBlcy4gdGVtcFtdIGNvdWxkbid0IGJlIHVzZWQgc28gaGFzaENvZGVbXSB3YXMgYWRkZWQgdG8gZWFjaCBub2RlLgorCS8vIEVhY2ggbmV3IGNoaWxkIGFkZHMgYW5vdGhlciBpbnQgdG8gdGhlIGFycmF5LCBjb3B5aW5nIHRoZSBwcmVmaXgKKwkvLyBmcm9tIGl0cyBwYXJlbnQuIENoaWxkIG9mIHRoZSBzYW1lIHBhcmVudCBhZGQgZGlmZmVyZW50IGludHMgKHRoZQorCS8vIGxpbWl0IGlzIHRoZXJlZm9yZSAyXjMyIGNoaWxkcmVuIHBlciBwYXJlbnQuLi4pLiBJZiBhIG5vZGUgaGFzIGEKKwkvLyBjaGlsZCB3aXRoIHRoZSBoYXNoQ29kZSBhbHJlYWR5IHNldCB0aGVuIHRoZSBjaGlsZCBjb2RlIGlzIGNvbXBhcmVkCisJLy8gdG8gdGhlIHNhbWUgcG9ydGlvbiBvZiB0aGUgY3VycmVudCBub2RlcyBhcnJheS4gSWYgdGhleSBtYXRjaCB0aGVyZQorCS8vIGlzIGEgbG9vcC4KKwkvLyBOb3RlIHRoYXQgdGhlIGJhc2ljIG1lY2hhbmlzbSB3b3VsZCBvbmx5IGFsbG93IGZvciAxIHVzZSBvZiB0aGlzCisJLy8gZnVuY3Rpb25hbGl0eSwgc28gdGhlIHJvb3Qgbm9kZXMgaGF2ZSB0d28gaW50cy4gVGhlIHNlY29uZCBpbnQgaXMKKwkvLyBpbmNyZW1lbnRlZCB0aHJvdWdoIGVhY2ggbm9kZSByb290IGFuZCB0aGUgZmlyc3QgaXMgaW5jcmVtZW50ZWQKKwkvLyB0aHJvdWdoIGVhY2ggcnVuIG9mIHRoZSBkZnMgYWxnb3JpdGhtICh0aGVyZWZvcmUgdGhlIGRmcyBpcyBub3QKKwkvLyB0aHJlYWQgc2FmZSkuIFRoZSBoYXNoIGNvZGUgb2YgZWFjaCBub2RlIGlzIHNldCBpZiBub3QgYWxyZWFkeSBzZXQsCisJLy8gb3IgaWYgdGhlIGZpcnN0IGludCBkb2VzIG5vdCBtYXRjaCB0aGF0IG9mIHRoZSBjdXJyZW50IHJ1bi4KKwlpZiAocm9vdCAhPSBudWxsKQorCXsKKwkJaWYgKHBhcmVudCAhPSBudWxsKQorCQl7CisJCQkvLyBGb3JtIHRoaXMgbm9kZXMgaGFzaCBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhhdCBpcywgaWYgdGhlCisJCQkvLyBoYXNoQ29kZSB2YXJpYWJsZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgb3IgaWYgdGhlCisJCQkvLyBzdGFydCBvZiB0aGUgcGFyZW50IGhhc2ggY29kZSBkb2VzIG5vdCBlcXVhbCB0aGUgc3RhcnQgb2YKKwkJCS8vIHRoaXMgbm9kZXMgaGFzaCBjb2RlLCBpbmRpY2F0aW5nIHRoZSBjb2RlIHdhcyBzZXQgb24gYQorCQkJLy8gcHJldmlvdXMgcnVuIG9mIHRoaXMgZGZzLgorCQkJaWYgKHJvb3QuaGFzaENvZGUgPT0gbnVsbCB8fAorCQkJCXJvb3QuaGFzaENvZGVbMF0gIT0gcGFyZW50Lmhhc2hDb2RlWzBdKQorCQkJeworCQkJCXZhciBoYXNoQ29kZUxlbmd0aCA9IHBhcmVudC5oYXNoQ29kZS5sZW5ndGggKyAxOworCQkJCXJvb3QuaGFzaENvZGUgPSBwYXJlbnQuaGFzaENvZGUuc2xpY2UoKTsKKwkJCQlyb290Lmhhc2hDb2RlW2hhc2hDb2RlTGVuZ3RoIC0gMV0gPSBjaGlsZEhhc2g7CisJCQl9CisJCX0KKworCQl2YXIgcm9vdElkID0gcm9vdC5pZDsKKworCQlpZiAoc2Vlbltyb290SWRdID09IG51bGwpCisJCXsKKwkJCXNlZW5bcm9vdElkXSA9IHJvb3Q7CisJCQl2aXNpdG9yKHBhcmVudCwgcm9vdCwgY29ubmVjdGluZ0VkZ2UsIGxheWVyLCAwKTsKKworCQkJLy8gQ29weSB0aGUgY29ubmVjdHMgYXMgc291cmNlIGxpc3Qgc28gdGhhdCB2aXNpdG9ycworCQkJLy8gY2FuIGNoYW5nZSB0aGUgb3JpZ2luYWwgZm9yIGVkZ2UgZGlyZWN0aW9uIGludmVyc2lvbnMKKwkJCXZhciBvdXRnb2luZ0VkZ2VzID0gcm9vdC5jb25uZWN0c0FzU291cmNlLnNsaWNlKCk7CisJCQl2YXIgaW5jb21pbmdFZGdlcyA9IHJvb3QuY29ubmVjdHNBc1RhcmdldC5zbGljZSgpOworCisJCQlmb3IgKHZhciBpID0gMDsgaSA8IG91dGdvaW5nRWRnZXMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJdmFyIGludGVybmFsRWRnZSA9IG91dGdvaW5nRWRnZXNbaV07CisJCQkJdmFyIHRhcmdldE5vZGUgPSBpbnRlcm5hbEVkZ2UudGFyZ2V0OworCQkJCQorCQkJCS8vIE9ubHkgbmF2aWdhdGUgaW4gc291cmNlLT50YXJnZXQgZGlyZWN0aW9uIHdpdGhpbiB0aGUgc2FtZQorCQkJCS8vIHN3aW1sYW5lLCBvciBmcm9tIGEgbG93ZXIgaW5kZXggc3dpbWxhbmUgdG8gYSBoaWdoZXIgb25lCisJCQkJaWYgKHJvb3Quc3dpbWxhbmVJbmRleCA8PSB0YXJnZXROb2RlLnN3aW1sYW5lSW5kZXgpCisJCQkJeworCQkJCQl0aGlzLmV4dGVuZGVkRGZzKHJvb3QsIHRhcmdldE5vZGUsIGludGVybmFsRWRnZSwgdmlzaXRvciwgc2VlbiwKKwkJCQkJCQlyb290Lmhhc2hDb2RlLCBpLCBsYXllciArIDEpOworCQkJCX0KKwkJCX0KKwkJCQorCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBpbmNvbWluZ0VkZ2VzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCXZhciBpbnRlcm5hbEVkZ2UgPSBpbmNvbWluZ0VkZ2VzW2ldOworCQkJCXZhciB0YXJnZXROb2RlID0gaW50ZXJuYWxFZGdlLnNvdXJjZTsKKworCQkJCS8vIE9ubHkgbmF2aWdhdGUgaW4gdGFyZ2V0LT5zb3VyY2UgZGlyZWN0aW9uIGZyb20gYSBsb3dlciBpbmRleCAKKwkJCQkvLyBzd2ltbGFuZSB0byBhIGhpZ2hlciBvbmUKKwkJCQlpZiAocm9vdC5zd2ltbGFuZUluZGV4IDwgdGFyZ2V0Tm9kZS5zd2ltbGFuZUluZGV4KQorCQkJCXsKKwkJCQkJdGhpcy5leHRlbmRlZERmcyhyb290LCB0YXJnZXROb2RlLCBpbnRlcm5hbEVkZ2UsIHZpc2l0b3IsIHNlZW4sCisJCQkJCQkJcm9vdC5oYXNoQ29kZSwgaSwgbGF5ZXIgKyAxKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBVc2UgdGhlIGludCBmaWVsZCB0byBpbmRpY2F0ZSB0aGlzIG5vZGUgaGFzIGJlZW4gc2VlbgorCQkJdmlzaXRvcihwYXJlbnQsIHJvb3QsIGNvbm5lY3RpbmdFZGdlLCBsYXllciwgMSk7CisJCX0KKwl9Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9oaWVyYXJjaGljYWwvbXhIaWVyYXJjaGljYWxMYXlvdXQuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L2hpZXJhcmNoaWNhbC9teEhpZXJhcmNoaWNhbExheW91dC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWI2MGI1Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9oaWVyYXJjaGljYWwvbXhIaWVyYXJjaGljYWxMYXlvdXQuanMKQEAgLTAsMCArMSw4NDYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14SGllcmFyY2hpY2FsTGF5b3V0CisgKiAKKyAqIEEgaGllcmFyY2hpY2FsIGxheW91dCBhbGdvcml0aG0uCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteEhpZXJhcmNoaWNhbExheW91dAorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgaGllcmFyY2hpY2FsIGxheW91dCBhbGdvcml0aG0uCisgKgorICogQXJndW1lbnRzOgorICogCisgKiBncmFwaCAtIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEdyYXBoPi4KKyAqIG9yaWVudGF0aW9uIC0gT3B0aW9uYWwgY29uc3RhbnQgdGhhdCBkZWZpbmVzIHRoZSBvcmllbnRhdGlvbiBvZiB0aGlzCisgKiBsYXlvdXQuCisgKiBkZXRlcm1pbmlzdGljIC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGlzIGxheW91dCBzaG91bGQgYmUKKyAqIGRldGVybWluaXN0aWMuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworZnVuY3Rpb24gbXhIaWVyYXJjaGljYWxMYXlvdXQoZ3JhcGgsIG9yaWVudGF0aW9uLCBkZXRlcm1pbmlzdGljKQoreworCW14R3JhcGhMYXlvdXQuY2FsbCh0aGlzLCBncmFwaCk7CisJdGhpcy5vcmllbnRhdGlvbiA9IChvcmllbnRhdGlvbiAhPSBudWxsKSA/IG9yaWVudGF0aW9uIDogbXhDb25zdGFudHMuRElSRUNUSU9OX05PUlRIOworCXRoaXMuZGV0ZXJtaW5pc3RpYyA9IChkZXRlcm1pbmlzdGljICE9IG51bGwpID8gZGV0ZXJtaW5pc3RpYyA6IHRydWU7Cit9OworCit2YXIgbXhIaWVyYXJjaGljYWxFZGdlU3R5bGUgPQoreworCU9SVEhPR09OQUw6IDEsCisJUE9MWUxJTkU6IDIsCisJU1RSQUlHSFQ6IDMsCisJQ1VSVkU6IDQKK307CisKKy8qKgorICogRXh0ZW5kcyBteEdyYXBoTGF5b3V0LgorICovCitteEhpZXJhcmNoaWNhbExheW91dC5wcm90b3R5cGUgPSBuZXcgbXhHcmFwaExheW91dCgpOworbXhIaWVyYXJjaGljYWxMYXlvdXQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhIaWVyYXJjaGljYWxMYXlvdXQ7CisKKy8qKgorICogVmFyaWFibGU6IHJvb3RzCisgKiAKKyAqIEhvbGRzIHRoZSBhcnJheSBvZiA8bXhDZWxsPiB0aGF0IHRoaXMgbGF5b3V0IGNvbnRhaW5zLgorICovCitteEhpZXJhcmNoaWNhbExheW91dC5wcm90b3R5cGUucm9vdHMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiByZXNpemVQYXJlbnQKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBwYXJlbnQgc2hvdWxkIGJlIHJlc2l6ZWQgYWZ0ZXIgdGhlIGxheW91dCBzbyB0aGF0IGl0CisgKiBjb250YWlucyBhbGwgdGhlIGNoaWxkIGNlbGxzLiBEZWZhdWx0IGlzIGZhbHNlLiBTZWUgYWxzbyA8cGFyZW50Qm9yZGVyPi4KKyAqLworbXhIaWVyYXJjaGljYWxMYXlvdXQucHJvdG90eXBlLnJlc2l6ZVBhcmVudCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBtYWludGFpblBhcmVudExvY2F0aW9uCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgcGFyZW50IGxvY2F0aW9uIHNob3VsZCBiZSBtYWludGFpbmVkLCBzbyB0aGF0IHRoZQorICogdG9wLCBsZWZ0IGNvcm5lciBzdGF5cyB0aGUgc2FtZSBiZWZvcmUgYW5kIGFmdGVyIGV4ZWN1dGlvbiBvZgorICogdGhlIGxheW91dC4gRGVmYXVsdCBpcyBmYWxzZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgKi8KK214SGllcmFyY2hpY2FsTGF5b3V0LnByb3RvdHlwZS5tYWludGFpblBhcmVudExvY2F0aW9uID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IG1vdmVQYXJlbnQKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBwYXJlbnQgc2hvdWxkIGJlIG1vdmVkIGlmIDxyZXNpemVQYXJlbnQ+IGlzIGVuYWJsZWQuCisgKiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteEhpZXJhcmNoaWNhbExheW91dC5wcm90b3R5cGUubW92ZVBhcmVudCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBwYXJlbnRCb3JkZXIKKyAqIAorICogVGhlIGJvcmRlciB0byBiZSBhZGRlZCBhcm91bmQgdGhlIGNoaWxkcmVuIGlmIHRoZSBwYXJlbnQgaXMgdG8gYmUKKyAqIHJlc2l6ZWQgdXNpbmcgPHJlc2l6ZVBhcmVudD4uIERlZmF1bHQgaXMgMC4KKyAqLworbXhIaWVyYXJjaGljYWxMYXlvdXQucHJvdG90eXBlLnBhcmVudEJvcmRlciA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IGludHJhQ2VsbFNwYWNpbmcKKyAqIAorICogVGhlIHNwYWNpbmcgYnVmZmVyIGFkZGVkIGJldHdlZW4gY2VsbHMgb24gdGhlIHNhbWUgbGF5ZXIuIERlZmF1bHQgaXMgMzAuCisgKi8KK214SGllcmFyY2hpY2FsTGF5b3V0LnByb3RvdHlwZS5pbnRyYUNlbGxTcGFjaW5nID0gMzA7CisKKy8qKgorICogVmFyaWFibGU6IGludGVyUmFua0NlbGxTcGFjaW5nCisgKiAKKyAqIFRoZSBzcGFjaW5nIGJ1ZmZlciBhZGRlZCBiZXR3ZWVuIGNlbGwgb24gYWRqYWNlbnQgbGF5ZXJzLiBEZWZhdWx0IGlzIDUwLgorICovCitteEhpZXJhcmNoaWNhbExheW91dC5wcm90b3R5cGUuaW50ZXJSYW5rQ2VsbFNwYWNpbmcgPSAxMDA7CisKKy8qKgorICogVmFyaWFibGU6IGludGVySGllcmFyY2h5U3BhY2luZworICogCisgKiBUaGUgc3BhY2luZyBidWZmZXIgYmV0d2VlbiB1bmNvbm5lY3RlZCBoaWVyYXJjaGllcy4gRGVmYXVsdCBpcyA2MC4KKyAqLworbXhIaWVyYXJjaGljYWxMYXlvdXQucHJvdG90eXBlLmludGVySGllcmFyY2h5U3BhY2luZyA9IDYwOworCisvKioKKyAqIFZhcmlhYmxlOiBwYXJhbGxlbEVkZ2VTcGFjaW5nCisgKiAKKyAqIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIGVhY2ggcGFyYWxsZWwgZWRnZSBvbiBlYWNoIHJhbmtzIGZvciBsb25nIGVkZ2VzCisgKi8KK214SGllcmFyY2hpY2FsTGF5b3V0LnByb3RvdHlwZS5wYXJhbGxlbEVkZ2VTcGFjaW5nID0gMTA7CisKKy8qKgorICogVmFyaWFibGU6IG9yaWVudGF0aW9uCisgKiAKKyAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgcm9vdCBub2RlKHMpIHJlbGF0aXZlIHRvIHRoZSBsYWlkIG91dCBncmFwaCBpbi4KKyAqIERlZmF1bHQgaXMgPG14Q29uc3RhbnRzLkRJUkVDVElPTl9OT1JUSD4uCisgKi8KK214SGllcmFyY2hpY2FsTGF5b3V0LnByb3RvdHlwZS5vcmllbnRhdGlvbiA9IG14Q29uc3RhbnRzLkRJUkVDVElPTl9OT1JUSDsKKworLyoqCisgKiBWYXJpYWJsZTogZmluZVR1bmluZworICogCisgKiBXaGV0aGVyIG9yIG5vdCB0byBwZXJmb3JtIGxvY2FsIG9wdGltaXNhdGlvbnMgYW5kIGl0ZXJhdGUgbXVsdGlwbGUgdGltZXMKKyAqIHRocm91Z2ggdGhlIGFsZ29yaXRobS4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEhpZXJhcmNoaWNhbExheW91dC5wcm90b3R5cGUuZmluZVR1bmluZyA9IHRydWU7CisKKy8qKgorICogCisgKiBWYXJpYWJsZTogdGlnaHRlblRvU291cmNlCisgKiAKKyAqIFdoZXRoZXIgb3Igbm90IHRvIHRpZ2h0ZW4gdGhlIGFzc2lnbmVkIHJhbmtzIG9mIHZlcnRpY2VzIHVwIHRvd2FyZHMKKyAqIHRoZSBzb3VyY2UgY2VsbHMuCisgKi8KK214SGllcmFyY2hpY2FsTGF5b3V0LnByb3RvdHlwZS50aWdodGVuVG9Tb3VyY2UgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBkaXNhYmxlRWRnZVN0eWxlCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgU1RZTEVfTk9FREdFU1RZTEUgZmxhZyBzaG91bGQgYmUgc2V0IG9uIGVkZ2VzIHRoYXQgYXJlCisgKiBtb2RpZmllZCBieSB0aGUgcmVzdWx0LiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214SGllcmFyY2hpY2FsTGF5b3V0LnByb3RvdHlwZS5kaXNhYmxlRWRnZVN0eWxlID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogdHJhdmVyc2VBbmNlc3RvcnMKKyAqIAorICogV2hldGhlciBvciBub3QgdG8gZHJpbGwgaW50byBjaGlsZCBjZWxscyBhbmQgbGF5b3V0IGluIHJldmVyc2UKKyAqIGdyb3VwIG9yZGVyLiBUaGlzIGFsc28gY2F1c2UgdGhlIGxheW91dCB0byBuYXZpZ2F0ZSBlZGdlcyB3aG9zZSAKKyAqIHRlcm1pbmFsIHZlcnRpY2VzICAqIGhhdmUgZGlmZmVyZW50IHBhcmVudHMgYnV0IGFyZSBpbiB0aGUgc2FtZSAKKyAqIGFuY2VzdHJ5IGNoYWluCisgKi8KK214SGllcmFyY2hpY2FsTGF5b3V0LnByb3RvdHlwZS50cmF2ZXJzZUFuY2VzdG9ycyA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IG1vZGVsCisgKiAKKyAqIFRoZSBpbnRlcm5hbCA8bXhHcmFwaEhpZXJhcmNoeU1vZGVsPiBmb3JtZWQgb2YgdGhlIGxheW91dC4KKyAqLworbXhIaWVyYXJjaGljYWxMYXlvdXQucHJvdG90eXBlLm1vZGVsID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZWRnZXNTZXQKKyAqIAorICogQSBjYWNoZSBvZiBlZGdlcyB3aG9zZSBzb3VyY2UgdGVybWluYWwgaXMgdGhlIGtleQorICovCitteEhpZXJhcmNoaWNhbExheW91dC5wcm90b3R5cGUuZWRnZXNDYWNoZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGVkZ2VzU2V0CisgKiAKKyAqIEEgY2FjaGUgb2YgZWRnZXMgd2hvc2Ugc291cmNlIHRlcm1pbmFsIGlzIHRoZSBrZXkKKyAqLworbXhIaWVyYXJjaGljYWxMYXlvdXQucHJvdG90eXBlLmVkZ2VTb3VyY2VUZXJtQ2FjaGUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBlZGdlc1NldAorICogCisgKiBBIGNhY2hlIG9mIGVkZ2VzIHdob3NlIHNvdXJjZSB0ZXJtaW5hbCBpcyB0aGUga2V5CisgKi8KK214SGllcmFyY2hpY2FsTGF5b3V0LnByb3RvdHlwZS5lZGdlc1RhcmdldFRlcm1DYWNoZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGVkZ2VTdHlsZQorICogCisgKiBUaGUgc3R5bGUgdG8gYXBwbHkgYmV0d2VlbiBjZWxsIGxheWVycyB0byBlZGdlIHNlZ21lbnRzCisgKi8KK214SGllcmFyY2hpY2FsTGF5b3V0LnByb3RvdHlwZS5lZGdlU3R5bGUgPSBteEhpZXJhcmNoaWNhbEVkZ2VTdHlsZS5QT0xZTElORTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0TW9kZWwKKyAqIAorICogUmV0dXJucyB0aGUgaW50ZXJuYWwgPG14R3JhcGhIaWVyYXJjaHlNb2RlbD4gZm9yIHRoaXMgbGF5b3V0IGFsZ29yaXRobS4KKyAqLworbXhIaWVyYXJjaGljYWxMYXlvdXQucHJvdG90eXBlLmdldE1vZGVsID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLm1vZGVsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZXhlY3V0ZQorICogCisgKiBFeGVjdXRlcyB0aGUgbGF5b3V0IGZvciB0aGUgY2hpbGRyZW4gb2YgdGhlIHNwZWNpZmllZCBwYXJlbnQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHBhcmVudCAtIFBhcmVudCA8bXhDZWxsPiB0aGF0IGNvbnRhaW5zIHRoZSBjaGlsZHJlbiB0byBiZSBsYWlkIG91dC4KKyAqIHJvb3RzIC0gT3B0aW9uYWwgc3RhcnRpbmcgcm9vdHMgb2YgdGhlIGxheW91dC4KKyAqLworbXhIaWVyYXJjaGljYWxMYXlvdXQucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbihwYXJlbnQsIHJvb3RzKQoreworCXRoaXMucGFyZW50ID0gcGFyZW50OworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGgubW9kZWw7CisJdGhpcy5lZGdlc0NhY2hlID0gbmV3IG14RGljdGlvbmFyeSgpOworCXRoaXMuZWRnZVNvdXJjZVRlcm1DYWNoZSA9IG5ldyBteERpY3Rpb25hcnkoKTsKKwl0aGlzLmVkZ2VzVGFyZ2V0VGVybUNhY2hlID0gbmV3IG14RGljdGlvbmFyeSgpOworCisJaWYgKHJvb3RzICE9IG51bGwgJiYgIShyb290cyBpbnN0YW5jZW9mIEFycmF5KSkKKwl7CisJCXJvb3RzID0gW3Jvb3RzXTsKKwl9CisJCisJLy8gSWYgdGhlIHJvb3RzIGFyZSBzZXQgYW5kIHRoZSBwYXJlbnQgaXMgc2V0LCBvbmx5CisJLy8gdXNlIHRoZSByb290cyB0aGF0IGFyZSBzb21lIGRlcGVuZGVudCBvZiB0aGUgdGhhdAorCS8vIHBhcmVudC4KKwkvLyBJZiBqdXN0IHRoZSByb290IGFyZSBzZXQsIHVzZSB0aGVtIGFzLWlzCisJLy8gSWYganVzdCB0aGUgcGFyZW50IGlzIHNldCB1c2UgaXQncyBpbW1lZGlhdGUKKwkvLyBjaGlsZHJlbiBhcyB0aGUgaW5pdGlhbCBzZXQKKworCWlmIChyb290cyA9PSBudWxsICYmIHBhcmVudCA9PSBudWxsKQorCXsKKwkJLy8gVE9ETyBpbmRpY2F0ZSB0aGUgcHJvYmxlbQorCQlyZXR1cm47CisJfQorCQorCS8vICBNYWludGFpbmluZyBwYXJlbnQgbG9jYXRpb24KKwl0aGlzLnBhcmVudFggPSBudWxsOworCXRoaXMucGFyZW50WSA9IG51bGw7CisJCisJaWYgKHBhcmVudCAhPSB0aGlzLnJvb3QgJiYgbW9kZWwuaXNWZXJ0ZXgocGFyZW50KSAhPSBudWxsICYmIHRoaXMubWFpbnRhaW5QYXJlbnRMb2NhdGlvbikKKwl7CisJCXZhciBnZW8gPSB0aGlzLmdyYXBoLmdldENlbGxHZW9tZXRyeShwYXJlbnQpOworCQkKKwkJaWYgKGdlbyAhPSBudWxsKQorCQl7CisJCQl0aGlzLnBhcmVudFggPSBnZW8ueDsKKwkJCXRoaXMucGFyZW50WSA9IGdlby55OworCQl9CisJfQorCQorCWlmIChyb290cyAhPSBudWxsKQorCXsKKwkJdmFyIHJvb3RzQ29weSA9IFtdOworCisJCWZvciAodmFyIGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBhbmNlc3RvciA9IHBhcmVudCAhPSBudWxsID8gbW9kZWwuaXNBbmNlc3RvcihwYXJlbnQsIHJvb3RzW2ldKSA6IHRydWU7CisJCQkKKwkJCWlmIChhbmNlc3RvciAmJiBtb2RlbC5pc1ZlcnRleChyb290c1tpXSkpCisJCQl7CisJCQkJcm9vdHNDb3B5LnB1c2gocm9vdHNbaV0pOworCQkJfQorCQl9CisKKwkJdGhpcy5yb290cyA9IHJvb3RzQ29weTsKKwl9CisJCisJbW9kZWwuYmVnaW5VcGRhdGUoKTsKKwl0cnkKKwl7CisJCXRoaXMucnVuKHBhcmVudCk7CisJCQorCQlpZiAodGhpcy5yZXNpemVQYXJlbnQgJiYgIXRoaXMuZ3JhcGguaXNDZWxsQ29sbGFwc2VkKHBhcmVudCkpCisJCXsKKwkJCXRoaXMuZ3JhcGgudXBkYXRlR3JvdXBCb3VuZHMoW3BhcmVudF0sIHRoaXMucGFyZW50Qm9yZGVyLCB0aGlzLm1vdmVQYXJlbnQpOworCQl9CisJCQorCQkvLyBNYWludGFpbmluZyBwYXJlbnQgbG9jYXRpb24KKwkJaWYgKHRoaXMucGFyZW50WCAhPSBudWxsICYmIHRoaXMucGFyZW50WSAhPSBudWxsKQorCQl7CisJCQl2YXIgZ2VvID0gdGhpcy5ncmFwaC5nZXRDZWxsR2VvbWV0cnkocGFyZW50KTsKKwkJCQorCQkJaWYgKGdlbyAhPSBudWxsKQorCQkJeworCQkJCWdlbyA9IGdlby5jbG9uZSgpOworCQkJCWdlby54ID0gdGhpcy5wYXJlbnRYOworCQkJCWdlby55ID0gdGhpcy5wYXJlbnRZOworCQkJCW1vZGVsLnNldEdlb21ldHJ5KHBhcmVudCwgZ2VvKTsKKwkJCX0KKwkJfQorCX0KKwlmaW5hbGx5CisJeworCQltb2RlbC5lbmRVcGRhdGUoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBmaW5kUm9vdHMKKyAqIAorICogUmV0dXJucyBhbGwgdmlzaWJsZSBjaGlsZHJlbiBpbiB0aGUgZ2l2ZW4gcGFyZW50IHdoaWNoIGRvIG5vdCBoYXZlCisgKiBpbmNvbWluZyBlZGdlcy4gSWYgdGhlIHJlc3VsdCBpcyBlbXB0eSB0aGVuIHRoZSBjaGlsZHJlbiB3aXRoIHRoZQorICogbWF4aW11bSBkaWZmZXJlbmNlIGJldHdlZW4gaW5jb21pbmcgYW5kIG91dGdvaW5nIGVkZ2VzIGFyZSByZXR1cm5lZC4KKyAqIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IGVkZ2VzIHRoYXQgYXJlIGJlaW5nIHByb21vdGVkIHRvIHRoZSBnaXZlbgorICogcm9vdCBkdWUgdG8gaW52aXNpYmxlIGNoaWxkcmVuIG9yIGNvbGxhcHNlZCBjZWxscy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogcGFyZW50IC0gPG14Q2VsbD4gd2hvc2UgY2hpbGRyZW4gc2hvdWxkIGJlIGNoZWNrZWQuCisgKiB2ZXJ0aWNlcyAtIGFycmF5IG9mIHZlcnRpY2VzIHRvIGxpbWl0IHNlYXJjaCB0bworICovCitteEhpZXJhcmNoaWNhbExheW91dC5wcm90b3R5cGUuZmluZFJvb3RzID0gZnVuY3Rpb24ocGFyZW50LCB2ZXJ0aWNlcykKK3sKKwl2YXIgcm9vdHMgPSBbXTsKKwkKKwlpZiAocGFyZW50ICE9IG51bGwgJiYgdmVydGljZXMgIT0gbnVsbCkKKwl7CisJCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGgubW9kZWw7CisJCXZhciBiZXN0ID0gbnVsbDsKKwkJdmFyIG1heERpZmYgPSAtMTAwMDAwOworCQkKKwkJZm9yICh2YXIgaSBpbiB2ZXJ0aWNlcykKKwkJeworCQkJdmFyIGNlbGwgPSB2ZXJ0aWNlc1tpXTsKKworCQkJaWYgKG1vZGVsLmlzVmVydGV4KGNlbGwpICYmIHRoaXMuZ3JhcGguaXNDZWxsVmlzaWJsZShjZWxsKSkKKwkJCXsKKwkJCQl2YXIgY29ubnMgPSB0aGlzLmdldEVkZ2VzKGNlbGwpOworCQkJCXZhciBmYW5PdXQgPSAwOworCQkJCXZhciBmYW5JbiA9IDA7CisKKwkJCQlmb3IgKHZhciBrID0gMDsgayA8IGNvbm5zLmxlbmd0aDsgaysrKQorCQkJCXsKKwkJCQkJdmFyIHNyYyA9IHRoaXMuZ2V0VmlzaWJsZVRlcm1pbmFsKGNvbm5zW2tdLCB0cnVlKTsKKworCQkJCQlpZiAoc3JjID09IGNlbGwpCisJCQkJCXsKKwkJCQkJCWZhbk91dCsrOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJZmFuSW4rKzsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChmYW5JbiA9PSAwICYmIGZhbk91dCA+IDApCisJCQkJeworCQkJCQlyb290cy5wdXNoKGNlbGwpOworCQkJCX0KKworCQkJCXZhciBkaWZmID0gZmFuT3V0IC0gZmFuSW47CisKKwkJCQlpZiAoZGlmZiA+IG1heERpZmYpCisJCQkJeworCQkJCQltYXhEaWZmID0gZGlmZjsKKwkJCQkJYmVzdCA9IGNlbGw7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlpZiAocm9vdHMubGVuZ3RoID09IDAgJiYgYmVzdCAhPSBudWxsKQorCQl7CisJCQlyb290cy5wdXNoKGJlc3QpOworCQl9CisJfQorCQorCXJldHVybiByb290czsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEVkZ2VzCisgKiAKKyAqIFJldHVybnMgdGhlIGNvbm5lY3RlZCBlZGdlcyBmb3IgdGhlIGdpdmVuIGNlbGwuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBlZGdlcyBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214SGllcmFyY2hpY2FsTGF5b3V0LnByb3RvdHlwZS5nZXRFZGdlcyA9IGZ1bmN0aW9uKGNlbGwpCit7CisJdmFyIGNhY2hlZEVkZ2VzID0gdGhpcy5lZGdlc0NhY2hlLmdldChjZWxsKTsKKwkKKwlpZiAoY2FjaGVkRWRnZXMgIT0gbnVsbCkKKwl7CisJCXJldHVybiBjYWNoZWRFZGdlczsKKwl9CisKKwl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLm1vZGVsOworCXZhciBlZGdlcyA9IFtdOworCXZhciBpc0NvbGxhcHNlZCA9IHRoaXMuZ3JhcGguaXNDZWxsQ29sbGFwc2VkKGNlbGwpOworCXZhciBjaGlsZENvdW50ID0gbW9kZWwuZ2V0Q2hpbGRDb3VudChjZWxsKTsKKworCWZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKQorCXsKKwkJdmFyIGNoaWxkID0gbW9kZWwuZ2V0Q2hpbGRBdChjZWxsLCBpKTsKKworCQlpZiAodGhpcy5pc1BvcnQoY2hpbGQpKQorCQl7CisJCQllZGdlcyA9IGVkZ2VzLmNvbmNhdChtb2RlbC5nZXRFZGdlcyhjaGlsZCwgdHJ1ZSwgdHJ1ZSkpOworCQl9CisJCWVsc2UgaWYgKGlzQ29sbGFwc2VkIHx8ICF0aGlzLmdyYXBoLmlzQ2VsbFZpc2libGUoY2hpbGQpKQorCQl7CisJCQllZGdlcyA9IGVkZ2VzLmNvbmNhdChtb2RlbC5nZXRFZGdlcyhjaGlsZCwgdHJ1ZSwgdHJ1ZSkpOworCQl9CisJfQorCisJZWRnZXMgPSBlZGdlcy5jb25jYXQobW9kZWwuZ2V0RWRnZXMoY2VsbCwgdHJ1ZSwgdHJ1ZSkpOworCXZhciByZXN1bHQgPSBbXTsKKwkKKwlmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKQorCXsKKwkJdmFyIHNvdXJjZSA9IHRoaXMuZ2V0VmlzaWJsZVRlcm1pbmFsKGVkZ2VzW2ldLCB0cnVlKTsKKwkJdmFyIHRhcmdldCA9IHRoaXMuZ2V0VmlzaWJsZVRlcm1pbmFsKGVkZ2VzW2ldLCBmYWxzZSk7CisJCQorCQlpZiAoKHNvdXJjZSA9PSB0YXJnZXQpIHx8ICgoc291cmNlICE9IHRhcmdldCkgJiYgKCh0YXJnZXQgPT0gY2VsbCAmJiAodGhpcy5wYXJlbnQgPT0gbnVsbCB8fCB0aGlzLmdyYXBoLmlzVmFsaWRBbmNlc3Rvcihzb3VyY2UsIHRoaXMucGFyZW50LCB0aGlzLnRyYXZlcnNlQW5jZXN0b3JzKSkpIHx8CisJCQkoc291cmNlID09IGNlbGwgJiYgKHRoaXMucGFyZW50ID09IG51bGwgfHwKKwkJCQkJdGhpcy5ncmFwaC5pc1ZhbGlkQW5jZXN0b3IodGFyZ2V0LCB0aGlzLnBhcmVudCwgdGhpcy50cmF2ZXJzZUFuY2VzdG9ycykpKSkpKQorCQl7CisJCQlyZXN1bHQucHVzaChlZGdlc1tpXSk7CisJCX0KKwl9CisKKwl0aGlzLmVkZ2VzQ2FjaGUucHV0KGNlbGwsIHJlc3VsdCk7CisKKwlyZXR1cm4gcmVzdWx0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0VmlzaWJsZVRlcm1pbmFsCisgKiAKKyAqIEhlbHBlciBmdW5jdGlvbiB0byByZXR1cm4gdmlzaWJsZSB0ZXJtaW5hbCBmb3IgZWRnZSBhbGxvd2luZyBmb3IgcG9ydHMKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZWRnZSAtIDxteENlbGw+IHdob3NlIGVkZ2VzIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqIHNvdXJjZSAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgd2hldGhlciB0aGUgc291cmNlIG9yIHRhcmdldCB0ZXJtaW5hbCBpcyB0byBiZSByZXR1cm5lZAorICovCitteEhpZXJhcmNoaWNhbExheW91dC5wcm90b3R5cGUuZ2V0VmlzaWJsZVRlcm1pbmFsID0gZnVuY3Rpb24oZWRnZSwgc291cmNlKQoreworCXZhciB0ZXJtaW5hbENhY2hlID0gdGhpcy5lZGdlc1RhcmdldFRlcm1DYWNoZTsKKwkKKwlpZiAoc291cmNlKQorCXsKKwkJdGVybWluYWxDYWNoZSA9IHRoaXMuZWRnZVNvdXJjZVRlcm1DYWNoZTsKKwl9CisKKwl2YXIgdGVybSA9IHRlcm1pbmFsQ2FjaGUuZ2V0KGVkZ2UpOworCisJaWYgKHRlcm0gIT0gbnVsbCkKKwl7CisJCXJldHVybiB0ZXJtOworCX0KKworCXZhciBzdGF0ZSA9IHRoaXMuZ3JhcGgudmlldy5nZXRTdGF0ZShlZGdlKTsKKwkKKwl2YXIgdGVybWluYWwgPSAoc3RhdGUgIT0gbnVsbCkgPyBzdGF0ZS5nZXRWaXNpYmxlVGVybWluYWwoc291cmNlKSA6IHRoaXMuZ3JhcGgudmlldy5nZXRWaXNpYmxlVGVybWluYWwoZWRnZSwgc291cmNlKTsKKwkKKwlpZiAodGVybWluYWwgPT0gbnVsbCkKKwl7CisJCXRlcm1pbmFsID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsKHNvdXJjZSkgOiB0aGlzLmdyYXBoLnZpZXcuZ2V0VmlzaWJsZVRlcm1pbmFsKGVkZ2UsIHNvdXJjZSk7CisJfQorCisJaWYgKHRlcm1pbmFsICE9IG51bGwpCisJeworCQlpZiAodGhpcy5pc1BvcnQodGVybWluYWwpKQorCQl7CisJCQl0ZXJtaW5hbCA9IHRoaXMuZ3JhcGgubW9kZWwuZ2V0UGFyZW50KHRlcm1pbmFsKTsKKwkJfQorCQkKKwkJdGVybWluYWxDYWNoZS5wdXQoZWRnZSwgdGVybWluYWwpOworCX0KKworCXJldHVybiB0ZXJtaW5hbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJ1bgorICogCisgKiBUaGUgQVBJIG1ldGhvZCB1c2VkIHRvIGV4ZXJjaXNlIHRoZSBsYXlvdXQgdXBvbiB0aGUgZ3JhcGggZGVzY3JpcHRpb24KKyAqIGFuZCBwcm9kdWNlIGEgc2VwYXJhdGUgZGVzY3JpcHRpb24gb2YgdGhlIHZlcnRleCBwb3NpdGlvbiBhbmQgZWRnZQorICogcm91dGluZyBjaGFuZ2VzIG1hZGUuIEl0IHJ1bnMgZWFjaCBzdGFnZSBvZiB0aGUgbGF5b3V0IHRoYXQgaGFzIGJlZW4KKyAqIGNyZWF0ZWQuCisgKi8KK214SGllcmFyY2hpY2FsTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbihwYXJlbnQpCit7CisJLy8gU2VwYXJhdGUgb3V0IHVuY29ubmVjdGVkIGhpZXJhcmNoaWVzCisJdmFyIGhpZXJhcmNoeVZlcnRpY2VzID0gW107CisJdmFyIGFsbFZlcnRleFNldCA9IFtdOworCisJaWYgKHRoaXMucm9vdHMgPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkKKwl7CisJCXZhciBmaWxsZWRWZXJ0ZXhTZXQgPSBPYmplY3QoKTsKKwkJdGhpcy5maWx0ZXJEZXNjZW5kYW50cyhwYXJlbnQsIGZpbGxlZFZlcnRleFNldCk7CisKKwkJdGhpcy5yb290cyA9IFtdOworCQl2YXIgZmlsbGVkVmVydGV4U2V0RW1wdHkgPSB0cnVlOworCisJCS8vIFBvb3IgbWFuJ3MgaXNTZXRFbXB0eQorCQlmb3IgKHZhciBrZXkgaW4gZmlsbGVkVmVydGV4U2V0KQorCQl7CisJCQlpZiAoZmlsbGVkVmVydGV4U2V0W2tleV0gIT0gbnVsbCkKKwkJCXsKKwkJCQlmaWxsZWRWZXJ0ZXhTZXRFbXB0eSA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJd2hpbGUgKCFmaWxsZWRWZXJ0ZXhTZXRFbXB0eSkKKwkJeworCQkJdmFyIGNhbmRpZGF0ZVJvb3RzID0gdGhpcy5maW5kUm9vdHMocGFyZW50LCBmaWxsZWRWZXJ0ZXhTZXQpOworCQkJCisJCQkvLyBJZiB0aGUgY2FuZGlkYXRlIHJvb3QgaXMgYW4gdW5jb25uZWN0ZWQgZ3JvdXAgY2VsbCwgcmVtb3ZlIGl0IGZyb20KKwkJCS8vIHRoZSBsYXlvdXQuIFdlIG1heSBuZWVkIGEgY3VzdG9tIHNldCB0aGF0IGhvbGRzIHN1Y2ggZ3JvdXBzIGFuZCBmb3JjZXMKKwkJCS8vIHRoZW0gdG8gYmUgcHJvY2Vzc2VkIGZvciByZXNpemluZyBhbmQvb3IgbW92aW5nLgorCQkJCisKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2FuZGlkYXRlUm9vdHMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJdmFyIHZlcnRleFNldCA9IE9iamVjdCgpOworCQkJCWhpZXJhcmNoeVZlcnRpY2VzLnB1c2godmVydGV4U2V0KTsKKworCQkJCXRoaXMudHJhdmVyc2UoY2FuZGlkYXRlUm9vdHNbaV0sIHRydWUsIG51bGwsIGFsbFZlcnRleFNldCwgdmVydGV4U2V0LAorCQkJCQkJaGllcmFyY2h5VmVydGljZXMsIGZpbGxlZFZlcnRleFNldCk7CisJCQl9CisKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2FuZGlkYXRlUm9vdHMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJdGhpcy5yb290cy5wdXNoKGNhbmRpZGF0ZVJvb3RzW2ldKTsKKwkJCX0KKwkJCQorCQkJZmlsbGVkVmVydGV4U2V0RW1wdHkgPSB0cnVlOworCQkJCisJCQkvLyBQb29yIG1hbidzIGlzU2V0RW1wdHkKKwkJCWZvciAodmFyIGtleSBpbiBmaWxsZWRWZXJ0ZXhTZXQpCisJCQl7CisJCQkJaWYgKGZpbGxlZFZlcnRleFNldFtrZXldICE9IG51bGwpCisJCQkJeworCQkJCQlmaWxsZWRWZXJ0ZXhTZXRFbXB0eSA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJLy8gRmluZCB2ZXJ0ZXggc2V0IGFzIGRpcmVjdGVkIHRyYXZlcnNhbCBmcm9tIHJvb3RzCisKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvb3RzLmxlbmd0aDsgaSsrKQorCQl7CisJCQl2YXIgdmVydGV4U2V0ID0gT2JqZWN0KCk7CisJCQloaWVyYXJjaHlWZXJ0aWNlcy5wdXNoKHZlcnRleFNldCk7CisKKwkJCXRoaXMudHJhdmVyc2UodGhpcy5yb290c1tpXSwgdHJ1ZSwgbnVsbCwgYWxsVmVydGV4U2V0LCB2ZXJ0ZXhTZXQsCisJCQkJCWhpZXJhcmNoeVZlcnRpY2VzLCBudWxsKTsKKwkJfQorCX0KKworCS8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcmVzdWx0IHJlbW92aW5nIHBhcmVudHMgd2hvIGhhdmUgY2hpbGRyZW4gaW4gdGhpcyBsYXlvdXQKKwkKKwkvLyBQZXJmb3JtIGEgbGF5b3V0IGZvciBlYWNoIHNlcGVyYXRlIGhpZXJhcmNoeQorCS8vIFRyYWNrIGluaXRpYWwgY29vcmRpbmF0ZSB4LXBvc2l0aW9uaW5nCisJdmFyIGluaXRpYWxYID0gMDsKKworCWZvciAodmFyIGkgPSAwOyBpIDwgaGllcmFyY2h5VmVydGljZXMubGVuZ3RoOyBpKyspCisJeworCQl2YXIgdmVydGV4U2V0ID0gaGllcmFyY2h5VmVydGljZXNbaV07CisJCXZhciB0bXAgPSBbXTsKKwkJCisJCWZvciAodmFyIGtleSBpbiB2ZXJ0ZXhTZXQpCisJCXsKKwkJCXRtcC5wdXNoKHZlcnRleFNldFtrZXldKTsKKwkJfQorCQkKKwkJdGhpcy5tb2RlbCA9IG5ldyBteEdyYXBoSGllcmFyY2h5TW9kZWwodGhpcywgdG1wLCB0aGlzLnJvb3RzLAorCQkJcGFyZW50LCB0aGlzLnRpZ2h0ZW5Ub1NvdXJjZSk7CisKKwkJdGhpcy5jeWNsZVN0YWdlKHBhcmVudCk7CisJCXRoaXMubGF5ZXJpbmdTdGFnZSgpOworCQkKKwkJdGhpcy5jcm9zc2luZ1N0YWdlKHBhcmVudCk7CisJCWluaXRpYWxYID0gdGhpcy5wbGFjZW1lbnRTdGFnZShpbml0aWFsWCwgcGFyZW50KTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBmaWx0ZXJEZXNjZW5kYW50cworICogCisgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGRlc2NlbmRhbnQgY2VsbHMKKyAqLworbXhIaWVyYXJjaGljYWxMYXlvdXQucHJvdG90eXBlLmZpbHRlckRlc2NlbmRhbnRzID0gZnVuY3Rpb24oY2VsbCwgcmVzdWx0KQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGgubW9kZWw7CisKKwlpZiAobW9kZWwuaXNWZXJ0ZXgoY2VsbCkgJiYgY2VsbCAhPSB0aGlzLnBhcmVudCAmJiB0aGlzLmdyYXBoLmlzQ2VsbFZpc2libGUoY2VsbCkpCisJeworCQlyZXN1bHRbbXhPYmplY3RJZGVudGl0eS5nZXQoY2VsbCldID0gY2VsbDsKKwl9CisKKwlpZiAodGhpcy50cmF2ZXJzZUFuY2VzdG9ycyB8fCBjZWxsID09IHRoaXMucGFyZW50CisJCQkmJiB0aGlzLmdyYXBoLmlzQ2VsbFZpc2libGUoY2VsbCkpCisJeworCQl2YXIgY2hpbGRDb3VudCA9IG1vZGVsLmdldENoaWxkQ291bnQoY2VsbCk7CisKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspCisJCXsKKwkJCXZhciBjaGlsZCA9IG1vZGVsLmdldENoaWxkQXQoY2VsbCwgaSk7CisJCQkKKwkJCS8vIElnbm9yZSBwb3J0cyBpbiB0aGUgbGF5b3V0IHZlcnRleCBsaXN0LCB0aGV5IGFyZSBkZWFsdCB3aXRoCisJCQkvLyBpbiB0aGUgdHJhdmVyc2FsIG1lY2hhbmlzbXMKKwkJCWlmICghdGhpcy5pc1BvcnQoY2hpbGQpKQorCQkJeworCQkJCXRoaXMuZmlsdGVyRGVzY2VuZGFudHMoY2hpbGQsIHJlc3VsdCk7CisJCQl9CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1BvcnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjZWxsIGlzIGEgInBvcnQiLCB0aGF0IGlzLCB3aGVuIGNvbm5lY3RpbmcgdG8KKyAqIGl0LCBpdHMgcGFyZW50IGlzIHRoZSBjb25uZWN0aW5nIHZlcnRleCBpbiB0ZXJtcyBvZiBncmFwaCB0cmF2ZXJzYWwKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgcG9ydC4KKyAqLworbXhIaWVyYXJjaGljYWxMYXlvdXQucHJvdG90eXBlLmlzUG9ydCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJaWYgKGNlbGwuZ2VvbWV0cnkucmVsYXRpdmUpCisJeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcmV0dXJuIGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0RWRnZXNCZXR3ZWVuCisgKiAKKyAqIFJldHVybnMgdGhlIGVkZ2VzIGJldHdlZW4gdGhlIGdpdmVuIHNvdXJjZSBhbmQgdGFyZ2V0LiBUaGlzIHRha2VzIGludG8KKyAqIGFjY291bnQgY29sbGFwc2VkIGFuZCBpbnZpc2libGUgY2VsbHMgYW5kIHBvcnRzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzb3VyY2UgLQorICogdGFyZ2V0IC0KKyAqIGRpcmVjdGVkIC0KKyAqLworbXhIaWVyYXJjaGljYWxMYXlvdXQucHJvdG90eXBlLmdldEVkZ2VzQmV0d2VlbiA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0LCBkaXJlY3RlZCkKK3sKKwlkaXJlY3RlZCA9IChkaXJlY3RlZCAhPSBudWxsKSA/IGRpcmVjdGVkIDogZmFsc2U7CisJdmFyIGVkZ2VzID0gdGhpcy5nZXRFZGdlcyhzb3VyY2UpOworCXZhciByZXN1bHQgPSBbXTsKKworCS8vIENoZWNrcyBpZiB0aGUgZWRnZSBpcyBjb25uZWN0ZWQgdG8gdGhlIGNvcnJlY3QKKwkvLyBjZWxsIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBtYXRjaAorCWZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspCisJeworCQl2YXIgc3JjID0gdGhpcy5nZXRWaXNpYmxlVGVybWluYWwoZWRnZXNbaV0sIHRydWUpOworCQl2YXIgdHJnID0gdGhpcy5nZXRWaXNpYmxlVGVybWluYWwoZWRnZXNbaV0sIGZhbHNlKTsKKworCQlpZiAoKHNyYyA9PSBzb3VyY2UgJiYgdHJnID09IHRhcmdldCkgfHwgKCFkaXJlY3RlZCAmJiBzcmMgPT0gdGFyZ2V0ICYmIHRyZyA9PSBzb3VyY2UpKQorCQl7CisJCQlyZXN1bHQucHVzaChlZGdlc1tpXSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfTsKKworLyoqCisgKiBUcmF2ZXJzZXMgdGhlIChkaXJlY3RlZCkgZ3JhcGggaW52b2tpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoCisgKiB2aXNpdGVkIHZlcnRleCBhbmQgZWRnZS4gVGhlIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCB0aGUgY3VycmVudCB2ZXJ0ZXgKKyAqIGFuZCB0aGUgaW5jb21pbmcgZWRnZSBhcyBhIHBhcmFtZXRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiBtYWtlcyBzdXJlCisgKiBlYWNoIHZlcnRleCBpcyBvbmx5IHZpc2l0ZWQgb25jZS4gVGhlIGZ1bmN0aW9uIG1heSByZXR1cm4gZmFsc2UgaWYgdGhlCisgKiB0cmF2ZXJzYWwgc2hvdWxkIHN0b3AgYXQgdGhlIGdpdmVuIHZlcnRleC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmVydGV4IC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSB2ZXJ0ZXggd2hlcmUgdGhlIHRyYXZlcnNhbCBzdGFydHMuCisgKiBkaXJlY3RlZCAtIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBlZGdlcyBzaG91bGQgb25seSBiZSB0cmF2ZXJzZWQKKyAqIGZyb20gc291cmNlIHRvIHRhcmdldC4gRGVmYXVsdCBpcyB0cnVlLgorICogZWRnZSAtIE9wdGlvbmFsIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgaW5jb21pbmcgZWRnZS4gVGhpcyBpcworICogbnVsbCBmb3IgdGhlIGZpcnN0IHN0ZXAgb2YgdGhlIHRyYXZlcnNhbC4KKyAqIGFsbFZlcnRpY2VzIC0gQXJyYXkgb2YgY2VsbCBwYXRocyBmb3IgdGhlIHZpc2l0ZWQgY2VsbHMuCisgKi8KK214SGllcmFyY2hpY2FsTGF5b3V0LnByb3RvdHlwZS50cmF2ZXJzZSA9IGZ1bmN0aW9uKHZlcnRleCwgZGlyZWN0ZWQsIGVkZ2UsIGFsbFZlcnRpY2VzLCBjdXJyZW50Q29tcCwKKwkJCQkJCQkJCQkJaGllcmFyY2h5VmVydGljZXMsIGZpbGxlZFZlcnRleFNldCkKK3sKKwlpZiAodmVydGV4ICE9IG51bGwgJiYgYWxsVmVydGljZXMgIT0gbnVsbCkKKwl7CisJCS8vIEhhcyB0aGlzIHZlcnRleCBiZWVuIHNlZW4gYmVmb3JlIGluIGFueSB0cmF2ZXJzYWwKKwkJLy8gQW5kIGlmIHRoZSBmaWxsZWQgdmVydGV4IHNldCBpcyBwb3B1bGF0ZWQsIG9ubHkgCisJCS8vIHByb2Nlc3MgdmVydGljZXMgaW4gdGhhdCBpdCBjb250YWlucworCQl2YXIgdmVydGV4SUQgPSBteE9iamVjdElkZW50aXR5LmdldCh2ZXJ0ZXgpOworCQkKKwkJaWYgKChhbGxWZXJ0aWNlc1t2ZXJ0ZXhJRF0gPT0gbnVsbCkKKwkJCQkmJiAoZmlsbGVkVmVydGV4U2V0ID09IG51bGwgPyB0cnVlIDogZmlsbGVkVmVydGV4U2V0W3ZlcnRleElEXSAhPSBudWxsKSkKKwkJeworCQkJaWYgKGN1cnJlbnRDb21wW3ZlcnRleElEXSA9PSBudWxsKQorCQkJeworCQkJCWN1cnJlbnRDb21wW3ZlcnRleElEXSA9IHZlcnRleDsKKwkJCX0KKwkJCWlmIChhbGxWZXJ0aWNlc1t2ZXJ0ZXhJRF0gPT0gbnVsbCkKKwkJCXsKKwkJCQlhbGxWZXJ0aWNlc1t2ZXJ0ZXhJRF0gPSB2ZXJ0ZXg7CisJCQl9CisKKwkJCWlmIChmaWxsZWRWZXJ0ZXhTZXQgIT09IG51bGwpCisJCQl7CisJCQkJZGVsZXRlIGZpbGxlZFZlcnRleFNldFt2ZXJ0ZXhJRF07CisJCQl9CisKKwkJCXZhciBlZGdlcyA9IHRoaXMuZ2V0RWRnZXModmVydGV4KTsKKwkJCXZhciBlZGdlSXNTb3VyY2UgPSBbXTsKKworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQllZGdlSXNTb3VyY2VbaV0gPSAodGhpcy5nZXRWaXNpYmxlVGVybWluYWwoZWRnZXNbaV0sIHRydWUpID09IHZlcnRleCk7CisJCQl9CisKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJaWYgKCFkaXJlY3RlZCB8fCBlZGdlSXNTb3VyY2VbaV0pCisJCQkJeworCQkJCQl2YXIgbmV4dCA9IHRoaXMuZ2V0VmlzaWJsZVRlcm1pbmFsKGVkZ2VzW2ldLCAhZWRnZUlzU291cmNlW2ldKTsKKwkJCQkJCisJCQkJCS8vIENoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgZWRnZXMgaW5jb21pbmcgZnJvbSB0aGUgdGFyZ2V0IHZlcnRleCB0aGFuIG91dGdvaW5nCisJCQkJCS8vIFRoZSBoaWVyYXJjaGljYWwgbW9kZWwgdHJlYXRzIGJpLWRpcmVjdGlvbmFsIHBhcmFsbGVsIGVkZ2VzIGFzIGJlaW5nIHNvdXJjZWQKKwkJCQkJLy8gZnJvbSB0aGUgbW9yZSAic291cmNlZCIgdGVybWluYWwuIElmIHRoZSBkaXJlY3Rpb25zIGFyZSBlcXVhbCBpbiBudW1iZXIsIHRoZSBkaXJlY3Rpb24KKwkJCQkJLy8gaXMgdGhhdCBvZiB0aGUgbmF0dXJhbCBkaXJlY3Rpb24gZnJvbSB0aGUgcm9vdHMgb2YgdGhlIGxheW91dC4KKwkJCQkJLy8gVGhlIGNoZWNrcyBiZWxvdyBhcmUgc2xpZ2h0bHkgbW9yZSB2ZXJib3NlIHRoYW4gbmVlZCBiZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucworCQkJCQl2YXIgbmV0Q291bnQgPSAxOworCisJCQkJCWZvciAodmFyIGogPSAwOyBqIDwgZWRnZXMubGVuZ3RoOyBqKyspCisJCQkJCXsKKwkJCQkJCWlmIChqID09IGkpCisJCQkJCQl7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJdmFyIGlzU291cmNlMiA9IGVkZ2VJc1NvdXJjZVtqXTsKKwkJCQkJCQl2YXIgb3RoZXJUZXJtID0gdGhpcy5nZXRWaXNpYmxlVGVybWluYWwoZWRnZXNbal0sICFpc1NvdXJjZTIpOworCQkJCQkJCQorCQkJCQkJCWlmIChvdGhlclRlcm0gPT0gbmV4dCkKKwkJCQkJCQl7CisJCQkJCQkJCWlmIChpc1NvdXJjZTIpCisJCQkJCQkJCXsKKwkJCQkJCQkJCW5ldENvdW50Kys7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisJCQkJCQkJCQluZXRDb3VudC0tOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJaWYgKG5ldENvdW50ID49IDApCisJCQkJCXsKKwkJCQkJCWN1cnJlbnRDb21wID0gdGhpcy50cmF2ZXJzZShuZXh0LCBkaXJlY3RlZCwgZWRnZXNbaV0sIGFsbFZlcnRpY2VzLAorCQkJCQkJCWN1cnJlbnRDb21wLCBoaWVyYXJjaHlWZXJ0aWNlcywKKwkJCQkJCQlmaWxsZWRWZXJ0ZXhTZXQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKGN1cnJlbnRDb21wW3ZlcnRleElEXSA9PSBudWxsKQorCQkJeworCQkJCS8vIFdlJ3ZlIHNlZW4gdGhpcyB2ZXJ0ZXggYmVmb3JlLCBidXQgbm90IGluIHRoZSBjdXJyZW50IGNvbXBvbmVudAorCQkJCS8vIFRoaXMgY29tcG9uZW50IGFuZCB0aGUgb25lIGl0J3MgaW4gbmVlZCB0byBiZSBtZXJnZWQKKworCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgaGllcmFyY2h5VmVydGljZXMubGVuZ3RoOyBpKyspCisJCQkJeworCQkJCQl2YXIgY29tcCA9IGhpZXJhcmNoeVZlcnRpY2VzW2ldOworCisJCQkJCWlmIChjb21wW3ZlcnRleElEXSAhPSBudWxsKQorCQkJCQl7CisJCQkJCQlmb3IgKHZhciBrZXkgaW4gY29tcCkKKwkJCQkJCXsKKwkJCQkJCQljdXJyZW50Q29tcFtrZXldID0gY29tcFtrZXldOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQkvLyBSZW1vdmUgdGhlIGN1cnJlbnQgY29tcG9uZW50IGZyb20gdGhlIGhpZXJhcmNoeSBzZXQKKwkJCQkJCWhpZXJhcmNoeVZlcnRpY2VzLnNwbGljZShpLCAxKTsKKwkJCQkJCXJldHVybiBjdXJyZW50Q29tcDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gY3VycmVudENvbXA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjeWNsZVN0YWdlCisgKiAKKyAqIEV4ZWN1dGVzIHRoZSBjeWNsZSBzdGFnZSB1c2luZyBteE1pbmltdW1DeWNsZVJlbW92ZXIuCisgKi8KK214SGllcmFyY2hpY2FsTGF5b3V0LnByb3RvdHlwZS5jeWNsZVN0YWdlID0gZnVuY3Rpb24ocGFyZW50KQoreworCXZhciBjeWNsZVN0YWdlID0gbmV3IG14TWluaW11bUN5Y2xlUmVtb3Zlcih0aGlzKTsKKwljeWNsZVN0YWdlLmV4ZWN1dGUocGFyZW50KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGxheWVyaW5nU3RhZ2UKKyAqIAorICogSW1wbGVtZW50cyBmaXJzdCBzdGFnZSBvZiBhIFN1Z2l5YW1hIGxheW91dC4KKyAqLworbXhIaWVyYXJjaGljYWxMYXlvdXQucHJvdG90eXBlLmxheWVyaW5nU3RhZ2UgPSBmdW5jdGlvbigpCit7CisJdGhpcy5tb2RlbC5pbml0aWFsUmFuaygpOworCXRoaXMubW9kZWwuZml4UmFua3MoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyb3NzaW5nU3RhZ2UKKyAqIAorICogRXhlY3V0ZXMgdGhlIGNyb3NzaW5nIHN0YWdlIHVzaW5nIG14TWVkaWFuSHlicmlkQ3Jvc3NpbmdSZWR1Y3Rpb24uCisgKi8KK214SGllcmFyY2hpY2FsTGF5b3V0LnByb3RvdHlwZS5jcm9zc2luZ1N0YWdlID0gZnVuY3Rpb24ocGFyZW50KQoreworCXZhciBjcm9zc2luZ1N0YWdlID0gbmV3IG14TWVkaWFuSHlicmlkQ3Jvc3NpbmdSZWR1Y3Rpb24odGhpcyk7CisJY3Jvc3NpbmdTdGFnZS5leGVjdXRlKHBhcmVudCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBwbGFjZW1lbnRTdGFnZQorICogCisgKiBFeGVjdXRlcyB0aGUgcGxhY2VtZW50IHN0YWdlIHVzaW5nIG14Q29vcmRpbmF0ZUFzc2lnbm1lbnQuCisgKi8KK214SGllcmFyY2hpY2FsTGF5b3V0LnByb3RvdHlwZS5wbGFjZW1lbnRTdGFnZSA9IGZ1bmN0aW9uKGluaXRpYWxYLCBwYXJlbnQpCit7CisJdmFyIHBsYWNlbWVudFN0YWdlID0gbmV3IG14Q29vcmRpbmF0ZUFzc2lnbm1lbnQodGhpcywgdGhpcy5pbnRyYUNlbGxTcGFjaW5nLAorCQkJdGhpcy5pbnRlclJhbmtDZWxsU3BhY2luZywgdGhpcy5vcmllbnRhdGlvbiwgaW5pdGlhbFgsCisJCQl0aGlzLnBhcmFsbGVsRWRnZVNwYWNpbmcpOworCXBsYWNlbWVudFN0YWdlLmZpbmVUdW5pbmcgPSB0aGlzLmZpbmVUdW5pbmc7CisJcGxhY2VtZW50U3RhZ2UuZXhlY3V0ZShwYXJlbnQpOworCQorCXJldHVybiBwbGFjZW1lbnRTdGFnZS5saW1pdFggKyB0aGlzLmludGVySGllcmFyY2h5U3BhY2luZzsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L2hpZXJhcmNoaWNhbC9teFN3aW1sYW5lTGF5b3V0LmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9oaWVyYXJjaGljYWwvbXhTd2ltbGFuZUxheW91dC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjliZWVmCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9oaWVyYXJjaGljYWwvbXhTd2ltbGFuZUxheW91dC5qcwpAQCAtMCwwICsxLDkzNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhTd2ltbGFuZUxheW91dAorICogCisgKiBBIGhpZXJhcmNoaWNhbCBsYXlvdXQgYWxnb3JpdGhtLgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhTd2ltbGFuZUxheW91dAorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgaGllcmFyY2hpY2FsIGxheW91dCBhbGdvcml0aG0uCisgKgorICogQXJndW1lbnRzOgorICogCisgKiBncmFwaCAtIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEdyYXBoPi4KKyAqIG9yaWVudGF0aW9uIC0gT3B0aW9uYWwgY29uc3RhbnQgdGhhdCBkZWZpbmVzIHRoZSBvcmllbnRhdGlvbiBvZiB0aGlzCisgKiBsYXlvdXQuCisgKiBkZXRlcm1pbmlzdGljIC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGlzIGxheW91dCBzaG91bGQgYmUKKyAqIGRldGVybWluaXN0aWMuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworZnVuY3Rpb24gbXhTd2ltbGFuZUxheW91dChncmFwaCwgb3JpZW50YXRpb24sIGRldGVybWluaXN0aWMpCit7CisJbXhHcmFwaExheW91dC5jYWxsKHRoaXMsIGdyYXBoKTsKKwl0aGlzLm9yaWVudGF0aW9uID0gKG9yaWVudGF0aW9uICE9IG51bGwpID8gb3JpZW50YXRpb24gOiBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEg7CisJdGhpcy5kZXRlcm1pbmlzdGljID0gKGRldGVybWluaXN0aWMgIT0gbnVsbCkgPyBkZXRlcm1pbmlzdGljIDogdHJ1ZTsKK307CisKKy8qKgorICogRXh0ZW5kcyBteEdyYXBoTGF5b3V0LgorICovCitteFN3aW1sYW5lTGF5b3V0LnByb3RvdHlwZSA9IG5ldyBteEdyYXBoTGF5b3V0KCk7CitteFN3aW1sYW5lTGF5b3V0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG14U3dpbWxhbmVMYXlvdXQ7CisKKy8qKgorICogVmFyaWFibGU6IHJvb3RzCisgKiAKKyAqIEhvbGRzIHRoZSBhcnJheSBvZiA8bXhDZWxsPiB0aGF0IHRoaXMgbGF5b3V0IGNvbnRhaW5zLgorICovCitteFN3aW1sYW5lTGF5b3V0LnByb3RvdHlwZS5yb290cyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHN3aW1sYW5lcworICogCisgKiBIb2xkcyB0aGUgYXJyYXkgb2YgPG14Q2VsbD4gb2YgdGhlIG9yZGVyZWQgc3dpbWxhbmVzIHRvIGxheSBvdXQKKyAqLworbXhTd2ltbGFuZUxheW91dC5wcm90b3R5cGUuc3dpbWxhbmVzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZHVtbXlWZXJ0aWNlcworICogCisgKiBIb2xkcyBhbiBhcnJheSBvZiA8bXhDZWxsPiBvZiBkdW1teSB2ZXJ0aWNlcyBpbnNlcnRlZCBkdXJpbmcgdGhlIGxheW91dAorICogdG8gcGFkIG91dCBlbXB0eSBzd2ltbGFuZXMKKyAqLworbXhTd2ltbGFuZUxheW91dC5wcm90b3R5cGUuZHVtbXlWZXJ0aWNlcyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGR1bW15VmVydGV4V2lkdGgKKyAqIAorICogVGhlIGNlbGwgd2lkdGggb2YgYW55IGR1bW15IHZlcnRpY2VzIGluc2VydGVkCisgKi8KK214U3dpbWxhbmVMYXlvdXQucHJvdG90eXBlLmR1bW15VmVydGV4V2lkdGggPSA1MDsKKworLyoqCisgKiBWYXJpYWJsZTogcmVzaXplUGFyZW50CisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgcGFyZW50IHNob3VsZCBiZSByZXNpemVkIGFmdGVyIHRoZSBsYXlvdXQgc28gdGhhdCBpdAorICogY29udGFpbnMgYWxsIHRoZSBjaGlsZCBjZWxscy4gRGVmYXVsdCBpcyBmYWxzZS4gU2VlIGFsc28gPHBhcmVudEJvcmRlcj4uCisgKi8KK214U3dpbWxhbmVMYXlvdXQucHJvdG90eXBlLnJlc2l6ZVBhcmVudCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBtYWludGFpblBhcmVudExvY2F0aW9uCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgcGFyZW50IGxvY2F0aW9uIHNob3VsZCBiZSBtYWludGFpbmVkLCBzbyB0aGF0IHRoZQorICogdG9wLCBsZWZ0IGNvcm5lciBzdGF5cyB0aGUgc2FtZSBiZWZvcmUgYW5kIGFmdGVyIGV4ZWN1dGlvbiBvZgorICogdGhlIGxheW91dC4gRGVmYXVsdCBpcyBmYWxzZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgKi8KK214U3dpbWxhbmVMYXlvdXQucHJvdG90eXBlLm1haW50YWluUGFyZW50TG9jYXRpb24gPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogbW92ZVBhcmVudAorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIHBhcmVudCBzaG91bGQgYmUgbW92ZWQgaWYgPHJlc2l6ZVBhcmVudD4gaXMgZW5hYmxlZC4KKyAqIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214U3dpbWxhbmVMYXlvdXQucHJvdG90eXBlLm1vdmVQYXJlbnQgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogcGFyZW50Qm9yZGVyCisgKiAKKyAqIFRoZSBib3JkZXIgdG8gYmUgYWRkZWQgYXJvdW5kIHRoZSBjaGlsZHJlbiBpZiB0aGUgcGFyZW50IGlzIHRvIGJlCisgKiByZXNpemVkIHVzaW5nIDxyZXNpemVQYXJlbnQ+LiBEZWZhdWx0IGlzIDAuCisgKi8KK214U3dpbWxhbmVMYXlvdXQucHJvdG90eXBlLnBhcmVudEJvcmRlciA9IDMwOworCisvKioKKyAqIFZhcmlhYmxlOiBpbnRyYUNlbGxTcGFjaW5nCisgKiAKKyAqIFRoZSBzcGFjaW5nIGJ1ZmZlciBhZGRlZCBiZXR3ZWVuIGNlbGxzIG9uIHRoZSBzYW1lIGxheWVyLiBEZWZhdWx0IGlzIDMwLgorICovCitteFN3aW1sYW5lTGF5b3V0LnByb3RvdHlwZS5pbnRyYUNlbGxTcGFjaW5nID0gMzA7CisKKy8qKgorICogVmFyaWFibGU6IGludGVyUmFua0NlbGxTcGFjaW5nCisgKiAKKyAqIFRoZSBzcGFjaW5nIGJ1ZmZlciBhZGRlZCBiZXR3ZWVuIGNlbGwgb24gYWRqYWNlbnQgbGF5ZXJzLiBEZWZhdWx0IGlzIDUwLgorICovCitteFN3aW1sYW5lTGF5b3V0LnByb3RvdHlwZS5pbnRlclJhbmtDZWxsU3BhY2luZyA9IDEwMDsKKworLyoqCisgKiBWYXJpYWJsZTogaW50ZXJIaWVyYXJjaHlTcGFjaW5nCisgKiAKKyAqIFRoZSBzcGFjaW5nIGJ1ZmZlciBiZXR3ZWVuIHVuY29ubmVjdGVkIGhpZXJhcmNoaWVzLiBEZWZhdWx0IGlzIDYwLgorICovCitteFN3aW1sYW5lTGF5b3V0LnByb3RvdHlwZS5pbnRlckhpZXJhcmNoeVNwYWNpbmcgPSA2MDsKKworLyoqCisgKiBWYXJpYWJsZTogcGFyYWxsZWxFZGdlU3BhY2luZworICogCisgKiBUaGUgZGlzdGFuY2UgYmV0d2VlbiBlYWNoIHBhcmFsbGVsIGVkZ2Ugb24gZWFjaCByYW5rcyBmb3IgbG9uZyBlZGdlcworICovCitteFN3aW1sYW5lTGF5b3V0LnByb3RvdHlwZS5wYXJhbGxlbEVkZ2VTcGFjaW5nID0gMTA7CisKKy8qKgorICogVmFyaWFibGU6IG9yaWVudGF0aW9uCisgKiAKKyAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgcm9vdCBub2RlKHMpIHJlbGF0aXZlIHRvIHRoZSBsYWlkIG91dCBncmFwaCBpbi4KKyAqIERlZmF1bHQgaXMgPG14Q29uc3RhbnRzLkRJUkVDVElPTl9OT1JUSD4uCisgKi8KK214U3dpbWxhbmVMYXlvdXQucHJvdG90eXBlLm9yaWVudGF0aW9uID0gbXhDb25zdGFudHMuRElSRUNUSU9OX05PUlRIOworCisvKioKKyAqIFZhcmlhYmxlOiBmaW5lVHVuaW5nCisgKiAKKyAqIFdoZXRoZXIgb3Igbm90IHRvIHBlcmZvcm0gbG9jYWwgb3B0aW1pc2F0aW9ucyBhbmQgaXRlcmF0ZSBtdWx0aXBsZSB0aW1lcworICogdGhyb3VnaCB0aGUgYWxnb3JpdGhtLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214U3dpbWxhbmVMYXlvdXQucHJvdG90eXBlLmZpbmVUdW5pbmcgPSB0cnVlOworCisvKioKKyAqIAorICogVmFyaWFibGU6IHRpZ2h0ZW5Ub1NvdXJjZQorICogCisgKiBXaGV0aGVyIG9yIG5vdCB0byB0aWdodGVuIHRoZSBhc3NpZ25lZCByYW5rcyBvZiB2ZXJ0aWNlcyB1cCB0b3dhcmRzCisgKiB0aGUgc291cmNlIGNlbGxzLgorICovCitteFN3aW1sYW5lTGF5b3V0LnByb3RvdHlwZS50aWdodGVuVG9Tb3VyY2UgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBkaXNhYmxlRWRnZVN0eWxlCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgU1RZTEVfTk9FREdFU1RZTEUgZmxhZyBzaG91bGQgYmUgc2V0IG9uIGVkZ2VzIHRoYXQgYXJlCisgKiBtb2RpZmllZCBieSB0aGUgcmVzdWx0LiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214U3dpbWxhbmVMYXlvdXQucHJvdG90eXBlLmRpc2FibGVFZGdlU3R5bGUgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiB0cmF2ZXJzZUFuY2VzdG9ycworICogCisgKiBXaGV0aGVyIG9yIG5vdCB0byBkcmlsbCBpbnRvIGNoaWxkIGNlbGxzIGFuZCBsYXlvdXQgaW4gcmV2ZXJzZQorICogZ3JvdXAgb3JkZXIuIFRoaXMgYWxzbyBjYXVzZSB0aGUgbGF5b3V0IHRvIG5hdmlnYXRlIGVkZ2VzIHdob3NlIAorICogdGVybWluYWwgdmVydGljZXMgICogaGF2ZSBkaWZmZXJlbnQgcGFyZW50cyBidXQgYXJlIGluIHRoZSBzYW1lIAorICogYW5jZXN0cnkgY2hhaW4KKyAqLworbXhTd2ltbGFuZUxheW91dC5wcm90b3R5cGUudHJhdmVyc2VBbmNlc3RvcnMgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBtb2RlbAorICogCisgKiBUaGUgaW50ZXJuYWwgPG14U3dpbWxhbmVNb2RlbD4gZm9ybWVkIG9mIHRoZSBsYXlvdXQuCisgKi8KK214U3dpbWxhbmVMYXlvdXQucHJvdG90eXBlLm1vZGVsID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZWRnZXNTZXQKKyAqIAorICogQSBjYWNoZSBvZiBlZGdlcyB3aG9zZSBzb3VyY2UgdGVybWluYWwgaXMgdGhlIGtleQorICovCitteFN3aW1sYW5lTGF5b3V0LnByb3RvdHlwZS5lZGdlc0NhY2hlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZWRnZXNTZXQKKyAqIAorICogQSBjYWNoZSBvZiBlZGdlcyB3aG9zZSBzb3VyY2UgdGVybWluYWwgaXMgdGhlIGtleQorICovCitteEhpZXJhcmNoaWNhbExheW91dC5wcm90b3R5cGUuZWRnZVNvdXJjZVRlcm1DYWNoZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGVkZ2VzU2V0CisgKiAKKyAqIEEgY2FjaGUgb2YgZWRnZXMgd2hvc2Ugc291cmNlIHRlcm1pbmFsIGlzIHRoZSBrZXkKKyAqLworbXhIaWVyYXJjaGljYWxMYXlvdXQucHJvdG90eXBlLmVkZ2VzVGFyZ2V0VGVybUNhY2hlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZWRnZVN0eWxlCisgKiAKKyAqIFRoZSBzdHlsZSB0byBhcHBseSBiZXR3ZWVuIGNlbGwgbGF5ZXJzIHRvIGVkZ2Ugc2VnbWVudHMKKyAqLworbXhIaWVyYXJjaGljYWxMYXlvdXQucHJvdG90eXBlLmVkZ2VTdHlsZSA9IG14SGllcmFyY2hpY2FsRWRnZVN0eWxlLlBPTFlMSU5FOworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRNb2RlbAorICogCisgKiBSZXR1cm5zIHRoZSBpbnRlcm5hbCA8bXhTd2ltbGFuZU1vZGVsPiBmb3IgdGhpcyBsYXlvdXQgYWxnb3JpdGhtLgorICovCitteFN3aW1sYW5lTGF5b3V0LnByb3RvdHlwZS5nZXRNb2RlbCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5tb2RlbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGV4ZWN1dGUKKyAqIAorICogRXhlY3V0ZXMgdGhlIGxheW91dCBmb3IgdGhlIGNoaWxkcmVuIG9mIHRoZSBzcGVjaWZpZWQgcGFyZW50LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwYXJlbnQgLSBQYXJlbnQgPG14Q2VsbD4gdGhhdCBjb250YWlucyB0aGUgY2hpbGRyZW4gdG8gYmUgbGFpZCBvdXQuCisgKiBzd2ltbGFuZXMgLSBPcmRlcmVkIGFycmF5IG9mIHN3aW1sYW5lcyB0byBiZSBsYWlkIG91dAorICovCitteFN3aW1sYW5lTGF5b3V0LnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24ocGFyZW50LCBzd2ltbGFuZXMpCit7CisJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5tb2RlbDsKKwl0aGlzLmVkZ2VzQ2FjaGUgPSBuZXcgbXhEaWN0aW9uYXJ5KCk7CisJdGhpcy5lZGdlU291cmNlVGVybUNhY2hlID0gbmV3IG14RGljdGlvbmFyeSgpOworCXRoaXMuZWRnZXNUYXJnZXRUZXJtQ2FjaGUgPSBuZXcgbXhEaWN0aW9uYXJ5KCk7CisKKwkvLyBJZiB0aGUgcm9vdHMgYXJlIHNldCBhbmQgdGhlIHBhcmVudCBpcyBzZXQsIG9ubHkKKwkvLyB1c2UgdGhlIHJvb3RzIHRoYXQgYXJlIHNvbWUgZGVwZW5kZW50IG9mIHRoZSB0aGF0CisJLy8gcGFyZW50LgorCS8vIElmIGp1c3QgdGhlIHJvb3QgYXJlIHNldCwgdXNlIHRoZW0gYXMtaXMKKwkvLyBJZiBqdXN0IHRoZSBwYXJlbnQgaXMgc2V0IHVzZSBpdCdzIGltbWVkaWF0ZQorCS8vIGNoaWxkcmVuIGFzIHRoZSBpbml0aWFsIHNldAorCisJaWYgKHN3aW1sYW5lcyA9PSBudWxsIHx8IHN3aW1sYW5lcy5sZW5ndGggPCAxKQorCXsKKwkJLy8gVE9ETyBpbmRpY2F0ZSB0aGUgcHJvYmxlbQorCQlyZXR1cm47CisJfQorCisJaWYgKHBhcmVudCA9PSBudWxsKQorCXsKKwkJcGFyZW50ID0gbW9kZWwuZ2V0UGFyZW50KHN3aW1sYW5lc1swXSk7CisJfQorCisJLy8gIE1haW50YWluaW5nIHBhcmVudCBsb2NhdGlvbgorCXRoaXMucGFyZW50WCA9IG51bGw7CisJdGhpcy5wYXJlbnRZID0gbnVsbDsKKwkKKwlpZiAocGFyZW50ICE9IHRoaXMucm9vdCAmJiBtb2RlbC5pc1ZlcnRleChwYXJlbnQpICE9IG51bGwgJiYgdGhpcy5tYWludGFpblBhcmVudExvY2F0aW9uKQorCXsKKwkJdmFyIGdlbyA9IHRoaXMuZ3JhcGguZ2V0Q2VsbEdlb21ldHJ5KHBhcmVudCk7CisJCQorCQlpZiAoZ2VvICE9IG51bGwpCisJCXsKKwkJCXRoaXMucGFyZW50WCA9IGdlby54OworCQkJdGhpcy5wYXJlbnRZID0gZ2VvLnk7CisJCX0KKwl9CisKKwl0aGlzLnN3aW1sYW5lcyA9IHN3aW1sYW5lczsKKwl0aGlzLmR1bW15VmVydGljZXMgPSBbXTsKKwkvLyBDaGVjayB0aGUgc3dpbWxhbmVzIGFsbCBoYXZlIHZlcnRpY2VzCisJLy8gaW4gdGhlbQorCWZvciAodmFyIGkgPSAwOyBpIDwgc3dpbWxhbmVzLmxlbmd0aDsgaSsrKQorCXsKKwkJdmFyIGNoaWxkcmVuID0gdGhpcy5ncmFwaC5nZXRDaGlsZENlbGxzKHN3aW1sYW5lc1tpXSk7CisJCQorCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCB8fCBjaGlsZHJlbi5sZW5ndGggPT0gMCkKKwkJeworCQkJdmFyIHZlcnRleCA9IHRoaXMuZ3JhcGguaW5zZXJ0VmVydGV4KHN3aW1sYW5lc1tpXSwgbnVsbCwgbnVsbCwgMCwgMCwgdGhpcy5kdW1teVZlcnRleFdpZHRoLCAwKTsKKwkJCXRoaXMuZHVtbXlWZXJ0aWNlcy5wdXNoKHZlcnRleCk7CisJCX0KKwl9CisJCisJbW9kZWwuYmVnaW5VcGRhdGUoKTsKKwl0cnkKKwl7CisJCXRoaXMucnVuKHBhcmVudCk7CisJCQorCQlpZiAodGhpcy5yZXNpemVQYXJlbnQgJiYgIXRoaXMuZ3JhcGguaXNDZWxsQ29sbGFwc2VkKHBhcmVudCkpCisJCXsKKwkJCXRoaXMuZ3JhcGgudXBkYXRlR3JvdXBCb3VuZHMoW3BhcmVudF0sIHRoaXMucGFyZW50Qm9yZGVyLCB0aGlzLm1vdmVQYXJlbnQpOworCQl9CisJCQorCQkvLyBNYWludGFpbmluZyBwYXJlbnQgbG9jYXRpb24KKwkJaWYgKHRoaXMucGFyZW50WCAhPSBudWxsICYmIHRoaXMucGFyZW50WSAhPSBudWxsKQorCQl7CisJCQl2YXIgZ2VvID0gdGhpcy5ncmFwaC5nZXRDZWxsR2VvbWV0cnkocGFyZW50KTsKKwkJCQorCQkJaWYgKGdlbyAhPSBudWxsKQorCQkJeworCQkJCWdlbyA9IGdlby5jbG9uZSgpOworCQkJCWdlby54ID0gdGhpcy5wYXJlbnRYOworCQkJCWdlby55ID0gdGhpcy5wYXJlbnRZOworCQkJCW1vZGVsLnNldEdlb21ldHJ5KHBhcmVudCwgZ2VvKTsKKwkJCX0KKwkJfQorCisJCXRoaXMuZ3JhcGgucmVtb3ZlQ2VsbHModGhpcy5kdW1teVZlcnRpY2VzKTsKKwl9CisJZmluYWxseQorCXsKKwkJbW9kZWwuZW5kVXBkYXRlKCk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlR3JvdXBCb3VuZHMKKyAqIAorICogVXBkYXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBhcnJheSBvZiBncm91cHMgc28gdGhhdCBpdCBpbmNsdWRlcworICogYWxsIGNoaWxkIHZlcnRpY2VzLgorICogCisgKi8KK214U3dpbWxhbmVMYXlvdXQucHJvdG90eXBlLnVwZGF0ZUdyb3VwQm91bmRzID0gZnVuY3Rpb24oKQoreworCS8vIEdldCBhbGwgdmVydGljZXMgYW5kIGVkZ2UgaW4gdGhlIGxheW91dAorCXZhciBjZWxscyA9IFtdOworCXZhciBtb2RlbCA9IHRoaXMubW9kZWw7CisJCisJZm9yICh2YXIga2V5IGluIG1vZGVsLmVkZ2VNYXBwZXIpCisJeworCQl2YXIgZWRnZSA9IG1vZGVsLmVkZ2VNYXBwZXJba2V5XTsKKwkJCisJCWZvciAodmFyIGkgPSAwOyBpIDwgZWRnZS5lZGdlcy5sZW5ndGg7IGkrKykKKwkJeworCQkJY2VsbHMucHVzaChlZGdlLmVkZ2VzW2ldKTsKKwkJfQorCX0KKwkKKwl2YXIgbGF5b3V0Qm91bmRzID0gdGhpcy5ncmFwaC5nZXRCb3VuZGluZ0JveEZyb21HZW9tZXRyeShjZWxscywgdHJ1ZSk7CisJdmFyIGNoaWxkQm91bmRzID0gW107CisKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3dpbWxhbmVzLmxlbmd0aDsgaSsrKQorCXsKKwkJdmFyIGxhbmUgPSB0aGlzLnN3aW1sYW5lc1tpXTsKKwkJdmFyIGdlbyA9IHRoaXMuZ3JhcGguZ2V0Q2VsbEdlb21ldHJ5KGxhbmUpOworCQkKKwkJaWYgKGdlbyAhPSBudWxsKQorCQl7CisJCQl2YXIgY2hpbGRyZW4gPSB0aGlzLmdyYXBoLmdldENoaWxkQ2VsbHMobGFuZSk7CisJCQkKKwkJCXZhciBzaXplID0gKHRoaXMuZ3JhcGguaXNTd2ltbGFuZShsYW5lKSkgPworCQkJCQl0aGlzLmdyYXBoLmdldFN0YXJ0U2l6ZShsYW5lKSA6IG5ldyBteFJlY3RhbmdsZSgpOworCisJCQl2YXIgYm91bmRzID0gdGhpcy5ncmFwaC5nZXRCb3VuZGluZ0JveEZyb21HZW9tZXRyeShjaGlsZHJlbik7CisJCQljaGlsZEJvdW5kc1tpXSA9IGJvdW5kczsKKwkJCXZhciBjaGlsZHJlblkgPSBib3VuZHMueSArIGdlby55IC0gc2l6ZS5oZWlnaHQgLSB0aGlzLnBhcmVudEJvcmRlcjsKKwkJCXZhciBtYXhDaGlsZHJlblkgPSBib3VuZHMueSArIGdlby55ICsgYm91bmRzLmhlaWdodDsKKworCQkJaWYgKGxheW91dEJvdW5kcyA9PSBudWxsKQorCQkJeworCQkJCWxheW91dEJvdW5kcyA9IG5ldyBteFJlY3RhbmdsZSgwLCBjaGlsZHJlblksIDAsIG1heENoaWxkcmVuWSAtIGNoaWxkcmVuWSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbGF5b3V0Qm91bmRzLnkgPSBNYXRoLm1pbihsYXlvdXRCb3VuZHMueSwgY2hpbGRyZW5ZKTsKKwkJCQl2YXIgbWF4WSA9IE1hdGgubWF4KGxheW91dEJvdW5kcy55ICsgbGF5b3V0Qm91bmRzLmhlaWdodCwgbWF4Q2hpbGRyZW5ZKTsKKwkJCQlsYXlvdXRCb3VuZHMuaGVpZ2h0ID0gbWF4WSAtIGxheW91dEJvdW5kcy55OworCQkJfQorCQl9CisJfQorCisJCisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN3aW1sYW5lcy5sZW5ndGg7IGkrKykKKwl7CisJCXZhciBsYW5lID0gdGhpcy5zd2ltbGFuZXNbaV07CisJCXZhciBnZW8gPSB0aGlzLmdyYXBoLmdldENlbGxHZW9tZXRyeShsYW5lKTsKKwkJCisJCWlmIChnZW8gIT0gbnVsbCkKKwkJeworCQkJdmFyIGNoaWxkcmVuID0gdGhpcy5ncmFwaC5nZXRDaGlsZENlbGxzKGxhbmUpOworCQkJCisJCQl2YXIgc2l6ZSA9ICh0aGlzLmdyYXBoLmlzU3dpbWxhbmUobGFuZSkpID8KKwkJCQkJdGhpcy5ncmFwaC5nZXRTdGFydFNpemUobGFuZSkgOiBuZXcgbXhSZWN0YW5nbGUoKTsKKworCQkJdmFyIG5ld0dlbyA9IGdlby5jbG9uZSgpOworCQkJCisJCQl2YXIgbGVmdEdyb3VwQm9yZGVyID0gKGkgPT0gMCkgPyB0aGlzLnBhcmVudEJvcmRlciA6IHRoaXMuaW50ZXJSYW5rQ2VsbFNwYWNpbmcvMjsKKwkJCW5ld0dlby54ICs9IGNoaWxkQm91bmRzW2ldLnggLSBzaXplLndpZHRoIC0gbGVmdEdyb3VwQm9yZGVyOworCQkJbmV3R2VvLnkgPSBuZXdHZW8ueSArIGxheW91dEJvdW5kcy55IC0gZ2VvLnkgLSB0aGlzLnBhcmVudEJvcmRlcjsKKwkJCQorCQkJbmV3R2VvLndpZHRoID0gY2hpbGRCb3VuZHNbaV0ud2lkdGggKyBzaXplLndpZHRoICsgdGhpcy5pbnRlclJhbmtDZWxsU3BhY2luZy8yICsgbGVmdEdyb3VwQm9yZGVyOworCQkJbmV3R2VvLmhlaWdodCA9IGxheW91dEJvdW5kcy5oZWlnaHQgKyBzaXplLmhlaWdodCArIDIgKiB0aGlzLnBhcmVudEJvcmRlcjsKKwkJCQorCQkJdGhpcy5ncmFwaC5tb2RlbC5zZXRHZW9tZXRyeShsYW5lLCBuZXdHZW8pOworCQkJdGhpcy5ncmFwaC5tb3ZlQ2VsbHMoY2hpbGRyZW4sIC1jaGlsZEJvdW5kc1tpXS54ICsgc2l6ZS53aWR0aCArIGxlZnRHcm91cEJvcmRlciwgCisJCQkJCWdlby55IC0gbGF5b3V0Qm91bmRzLnkgKyB0aGlzLnBhcmVudEJvcmRlcik7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBmaW5kUm9vdHMKKyAqIAorICogUmV0dXJucyBhbGwgdmlzaWJsZSBjaGlsZHJlbiBpbiB0aGUgZ2l2ZW4gcGFyZW50IHdoaWNoIGRvIG5vdCBoYXZlCisgKiBpbmNvbWluZyBlZGdlcy4gSWYgdGhlIHJlc3VsdCBpcyBlbXB0eSB0aGVuIHRoZSBjaGlsZHJlbiB3aXRoIHRoZQorICogbWF4aW11bSBkaWZmZXJlbmNlIGJldHdlZW4gaW5jb21pbmcgYW5kIG91dGdvaW5nIGVkZ2VzIGFyZSByZXR1cm5lZC4KKyAqIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IGVkZ2VzIHRoYXQgYXJlIGJlaW5nIHByb21vdGVkIHRvIHRoZSBnaXZlbgorICogcm9vdCBkdWUgdG8gaW52aXNpYmxlIGNoaWxkcmVuIG9yIGNvbGxhcHNlZCBjZWxscy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogcGFyZW50IC0gPG14Q2VsbD4gd2hvc2UgY2hpbGRyZW4gc2hvdWxkIGJlIGNoZWNrZWQuCisgKiB2ZXJ0aWNlcyAtIGFycmF5IG9mIHZlcnRpY2VzIHRvIGxpbWl0IHNlYXJjaCB0bworICovCitteFN3aW1sYW5lTGF5b3V0LnByb3RvdHlwZS5maW5kUm9vdHMgPSBmdW5jdGlvbihwYXJlbnQsIHZlcnRpY2VzKQoreworCXZhciByb290cyA9IFtdOworCQorCWlmIChwYXJlbnQgIT0gbnVsbCAmJiB2ZXJ0aWNlcyAhPSBudWxsKQorCXsKKwkJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5tb2RlbDsKKwkJdmFyIGJlc3QgPSBudWxsOworCQl2YXIgbWF4RGlmZiA9IC0xMDAwMDA7CisJCQorCQlmb3IgKHZhciBpIGluIHZlcnRpY2VzKQorCQl7CisJCQl2YXIgY2VsbCA9IHZlcnRpY2VzW2ldOworCisJCQlpZiAoY2VsbCAhPSBudWxsICYmIG1vZGVsLmlzVmVydGV4KGNlbGwpICYmIHRoaXMuZ3JhcGguaXNDZWxsVmlzaWJsZShjZWxsKSAmJiBtb2RlbC5pc0FuY2VzdG9yKHBhcmVudCwgY2VsbCkpCisJCQl7CisJCQkJdmFyIGNvbm5zID0gdGhpcy5nZXRFZGdlcyhjZWxsKTsKKwkJCQl2YXIgZmFuT3V0ID0gMDsKKwkJCQl2YXIgZmFuSW4gPSAwOworCisJCQkJZm9yICh2YXIgayA9IDA7IGsgPCBjb25ucy5sZW5ndGg7IGsrKykKKwkJCQl7CisJCQkJCXZhciBzcmMgPSB0aGlzLmdldFZpc2libGVUZXJtaW5hbChjb25uc1trXSwgdHJ1ZSk7CisKKwkJCQkJaWYgKHNyYyA9PSBjZWxsKQorCQkJCQl7CisJCQkJCQkvLyBPbmx5IGNvdW50IGNvbm5lY3Rpb24gd2l0aGluIHRoaXMgc3dpbWxhbmUKKwkJCQkJCXZhciBvdGhlciA9IHRoaXMuZ2V0VmlzaWJsZVRlcm1pbmFsKGNvbm5zW2tdLCBmYWxzZSk7CisJCQkJCQkKKwkJCQkJCWlmIChtb2RlbC5pc0FuY2VzdG9yKHBhcmVudCwgb3RoZXIpKQorCQkJCQkJeworCQkJCQkJCWZhbk91dCsrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UgaWYgKG1vZGVsLmlzQW5jZXN0b3IocGFyZW50LCBzcmMpKQorCQkJCQl7CisJCQkJCQlmYW5JbisrOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKGZhbkluID09IDAgJiYgZmFuT3V0ID4gMCkKKwkJCQl7CisJCQkJCXJvb3RzLnB1c2goY2VsbCk7CisJCQkJfQorCisJCQkJdmFyIGRpZmYgPSBmYW5PdXQgLSBmYW5JbjsKKworCQkJCWlmIChkaWZmID4gbWF4RGlmZikKKwkJCQl7CisJCQkJCW1heERpZmYgPSBkaWZmOworCQkJCQliZXN0ID0gY2VsbDsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCWlmIChyb290cy5sZW5ndGggPT0gMCAmJiBiZXN0ICE9IG51bGwpCisJCXsKKwkJCXJvb3RzLnB1c2goYmVzdCk7CisJCX0KKwl9CisJCisJcmV0dXJuIHJvb3RzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0RWRnZXMKKyAqIAorICogUmV0dXJucyB0aGUgY29ubmVjdGVkIGVkZ2VzIGZvciB0aGUgZ2l2ZW4gY2VsbC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdob3NlIGVkZ2VzIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhTd2ltbGFuZUxheW91dC5wcm90b3R5cGUuZ2V0RWRnZXMgPSBmdW5jdGlvbihjZWxsKQoreworCXZhciBjYWNoZWRFZGdlcyA9IHRoaXMuZWRnZXNDYWNoZS5nZXQoY2VsbCk7CisJCisJaWYgKGNhY2hlZEVkZ2VzICE9IG51bGwpCisJeworCQlyZXR1cm4gY2FjaGVkRWRnZXM7CisJfQorCisJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5tb2RlbDsKKwl2YXIgZWRnZXMgPSBbXTsKKwl2YXIgaXNDb2xsYXBzZWQgPSB0aGlzLmdyYXBoLmlzQ2VsbENvbGxhcHNlZChjZWxsKTsKKwl2YXIgY2hpbGRDb3VudCA9IG1vZGVsLmdldENoaWxkQ291bnQoY2VsbCk7CisKKwlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykKKwl7CisJCXZhciBjaGlsZCA9IG1vZGVsLmdldENoaWxkQXQoY2VsbCwgaSk7CisKKwkJaWYgKHRoaXMuaXNQb3J0KGNoaWxkKSkKKwkJeworCQkJZWRnZXMgPSBlZGdlcy5jb25jYXQobW9kZWwuZ2V0RWRnZXMoY2hpbGQsIHRydWUsIHRydWUpKTsKKwkJfQorCQllbHNlIGlmIChpc0NvbGxhcHNlZCB8fCAhdGhpcy5ncmFwaC5pc0NlbGxWaXNpYmxlKGNoaWxkKSkKKwkJeworCQkJZWRnZXMgPSBlZGdlcy5jb25jYXQobW9kZWwuZ2V0RWRnZXMoY2hpbGQsIHRydWUsIHRydWUpKTsKKwkJfQorCX0KKworCWVkZ2VzID0gZWRnZXMuY29uY2F0KG1vZGVsLmdldEVkZ2VzKGNlbGwsIHRydWUsIHRydWUpKTsKKwl2YXIgcmVzdWx0ID0gW107CisJCisJZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykKKwl7CisJCXZhciBzb3VyY2UgPSB0aGlzLmdldFZpc2libGVUZXJtaW5hbChlZGdlc1tpXSwgdHJ1ZSk7CisJCXZhciB0YXJnZXQgPSB0aGlzLmdldFZpc2libGVUZXJtaW5hbChlZGdlc1tpXSwgZmFsc2UpOworCQkKKwkJaWYgKChzb3VyY2UgPT0gdGFyZ2V0KSB8fCAoKHNvdXJjZSAhPSB0YXJnZXQpICYmICgodGFyZ2V0ID09IGNlbGwgJiYgKHRoaXMucGFyZW50ID09IG51bGwgfHwgdGhpcy5ncmFwaC5pc1ZhbGlkQW5jZXN0b3Ioc291cmNlLCB0aGlzLnBhcmVudCwgdGhpcy50cmF2ZXJzZUFuY2VzdG9ycykpKSB8fAorCQkJKHNvdXJjZSA9PSBjZWxsICYmICh0aGlzLnBhcmVudCA9PSBudWxsIHx8CisJCQkJCXRoaXMuZ3JhcGguaXNWYWxpZEFuY2VzdG9yKHRhcmdldCwgdGhpcy5wYXJlbnQsIHRoaXMudHJhdmVyc2VBbmNlc3RvcnMpKSkpKSkKKwkJeworCQkJcmVzdWx0LnB1c2goZWRnZXNbaV0pOworCQl9CisJfQorCisJdGhpcy5lZGdlc0NhY2hlLnB1dChjZWxsLCByZXN1bHQpOworCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFZpc2libGVUZXJtaW5hbAorICogCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmV0dXJuIHZpc2libGUgdGVybWluYWwgZm9yIGVkZ2UgYWxsb3dpbmcgZm9yIHBvcnRzCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGVkZ2UgLSA8bXhDZWxsPiB3aG9zZSBlZGdlcyBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiBzb3VyY2UgLSBCb29sZWFuIHRoYXQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHNvdXJjZSBvciB0YXJnZXQgdGVybWluYWwgaXMgdG8gYmUgcmV0dXJuZWQKKyAqLworbXhTd2ltbGFuZUxheW91dC5wcm90b3R5cGUuZ2V0VmlzaWJsZVRlcm1pbmFsID0gZnVuY3Rpb24oZWRnZSwgc291cmNlKQoreworCXZhciB0ZXJtaW5hbENhY2hlID0gdGhpcy5lZGdlc1RhcmdldFRlcm1DYWNoZTsKKwkKKwlpZiAoc291cmNlKQorCXsKKwkJdGVybWluYWxDYWNoZSA9IHRoaXMuZWRnZVNvdXJjZVRlcm1DYWNoZTsKKwl9CisKKwl2YXIgdGVybSA9IHRlcm1pbmFsQ2FjaGUuZ2V0KGVkZ2UpOworCisJaWYgKHRlcm0gIT0gbnVsbCkKKwl7CisJCXJldHVybiB0ZXJtOworCX0KKworCXZhciBzdGF0ZSA9IHRoaXMuZ3JhcGgudmlldy5nZXRTdGF0ZShlZGdlKTsKKwkKKwl2YXIgdGVybWluYWwgPSAoc3RhdGUgIT0gbnVsbCkgPyBzdGF0ZS5nZXRWaXNpYmxlVGVybWluYWwoc291cmNlKSA6IHRoaXMuZ3JhcGgudmlldy5nZXRWaXNpYmxlVGVybWluYWwoZWRnZSwgc291cmNlKTsKKwkKKwlpZiAodGVybWluYWwgPT0gbnVsbCkKKwl7CisJCXRlcm1pbmFsID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsKHNvdXJjZSkgOiB0aGlzLmdyYXBoLnZpZXcuZ2V0VmlzaWJsZVRlcm1pbmFsKGVkZ2UsIHNvdXJjZSk7CisJfQorCisJaWYgKHRlcm1pbmFsICE9IG51bGwpCisJeworCQlpZiAodGhpcy5pc1BvcnQodGVybWluYWwpKQorCQl7CisJCQl0ZXJtaW5hbCA9IHRoaXMuZ3JhcGgubW9kZWwuZ2V0UGFyZW50KHRlcm1pbmFsKTsKKwkJfQorCQkKKwkJdGVybWluYWxDYWNoZS5wdXQoZWRnZSwgdGVybWluYWwpOworCX0KKworCXJldHVybiB0ZXJtaW5hbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJ1bgorICogCisgKiBUaGUgQVBJIG1ldGhvZCB1c2VkIHRvIGV4ZXJjaXNlIHRoZSBsYXlvdXQgdXBvbiB0aGUgZ3JhcGggZGVzY3JpcHRpb24KKyAqIGFuZCBwcm9kdWNlIGEgc2VwYXJhdGUgZGVzY3JpcHRpb24gb2YgdGhlIHZlcnRleCBwb3NpdGlvbiBhbmQgZWRnZQorICogcm91dGluZyBjaGFuZ2VzIG1hZGUuIEl0IHJ1bnMgZWFjaCBzdGFnZSBvZiB0aGUgbGF5b3V0IHRoYXQgaGFzIGJlZW4KKyAqIGNyZWF0ZWQuCisgKi8KK214U3dpbWxhbmVMYXlvdXQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uKHBhcmVudCkKK3sKKwkvLyBTZXBhcmF0ZSBvdXQgdW5jb25uZWN0ZWQgaGllcmFyY2hpZXMKKwl2YXIgaGllcmFyY2h5VmVydGljZXMgPSBbXTsKKwl2YXIgYWxsVmVydGV4U2V0ID0gW107CisKKwlpZiAodGhpcy5zd2ltbGFuZXMgIT0gbnVsbCAmJiB0aGlzLnN3aW1sYW5lcy5sZW5ndGggPiAwICYmIHBhcmVudCAhPSBudWxsKQorCXsKKwkJdmFyIGZpbGxlZFZlcnRleFNldCA9IE9iamVjdCgpOworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN3aW1sYW5lcy5sZW5ndGg7IGkrKykKKwkJeworCQkJdGhpcy5maWx0ZXJEZXNjZW5kYW50cyh0aGlzLnN3aW1sYW5lc1tpXSwgZmlsbGVkVmVydGV4U2V0KTsKKwkJfQorCisJCXRoaXMucm9vdHMgPSBbXTsKKwkJdmFyIGZpbGxlZFZlcnRleFNldEVtcHR5ID0gdHJ1ZTsKKworCQkvLyBQb29yIG1hbidzIGlzU2V0RW1wdHkKKwkJZm9yICh2YXIga2V5IGluIGZpbGxlZFZlcnRleFNldCkKKwkJeworCQkJaWYgKGZpbGxlZFZlcnRleFNldFtrZXldICE9IG51bGwpCisJCQl7CisJCQkJZmlsbGVkVmVydGV4U2V0RW1wdHkgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8vIE9ubHkgdGVzdCBmb3IgY2FuZGlkYXRlcyBpbiBlYWNoIHN3aW1sYW5lIGluIG9yZGVyCisJCXZhciBsYW5lQ291bnRlciA9IDA7CisKKwkJd2hpbGUgKCFmaWxsZWRWZXJ0ZXhTZXRFbXB0eSAmJiBsYW5lQ291bnRlciA8IHRoaXMuc3dpbWxhbmVzLmxlbmd0aCkKKwkJeworCQkJdmFyIGNhbmRpZGF0ZVJvb3RzID0gdGhpcy5maW5kUm9vdHModGhpcy5zd2ltbGFuZXNbbGFuZUNvdW50ZXJdLCBmaWxsZWRWZXJ0ZXhTZXQpOworCQkJCisJCQlpZiAoY2FuZGlkYXRlUm9vdHMubGVuZ3RoID09IDApCisJCQl7CisJCQkJbGFuZUNvdW50ZXIrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCQorCQkJLy8gSWYgdGhlIGNhbmRpZGF0ZSByb290IGlzIGFuIHVuY29ubmVjdGVkIGdyb3VwIGNlbGwsIHJlbW92ZSBpdCBmcm9tCisJCQkvLyB0aGUgbGF5b3V0LiBXZSBtYXkgbmVlZCBhIGN1c3RvbSBzZXQgdGhhdCBob2xkcyBzdWNoIGdyb3VwcyBhbmQgZm9yY2VzCisJCQkvLyB0aGVtIHRvIGJlIHByb2Nlc3NlZCBmb3IgcmVzaXppbmcgYW5kL29yIG1vdmluZy4KKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2FuZGlkYXRlUm9vdHMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJdmFyIHZlcnRleFNldCA9IE9iamVjdCgpOworCQkJCWhpZXJhcmNoeVZlcnRpY2VzLnB1c2godmVydGV4U2V0KTsKKworCQkJCXRoaXMudHJhdmVyc2UoY2FuZGlkYXRlUm9vdHNbaV0sIHRydWUsIG51bGwsIGFsbFZlcnRleFNldCwgdmVydGV4U2V0LAorCQkJCQkJaGllcmFyY2h5VmVydGljZXMsIGZpbGxlZFZlcnRleFNldCwgbGFuZUNvdW50ZXIpOworCQkJfQorCisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGNhbmRpZGF0ZVJvb3RzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCXRoaXMucm9vdHMucHVzaChjYW5kaWRhdGVSb290c1tpXSk7CisJCQl9CisJCQkKKwkJCWZpbGxlZFZlcnRleFNldEVtcHR5ID0gdHJ1ZTsKKwkJCQorCQkJLy8gUG9vciBtYW4ncyBpc1NldEVtcHR5CisJCQlmb3IgKHZhciBrZXkgaW4gZmlsbGVkVmVydGV4U2V0KQorCQkJeworCQkJCWlmIChmaWxsZWRWZXJ0ZXhTZXRba2V5XSAhPSBudWxsKQorCQkJCXsKKwkJCQkJZmlsbGVkVmVydGV4U2V0RW1wdHkgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIEZpbmQgdmVydGV4IHNldCBhcyBkaXJlY3RlZCB0cmF2ZXJzYWwgZnJvbSByb290cworCisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb290cy5sZW5ndGg7IGkrKykKKwkJeworCQkJdmFyIHZlcnRleFNldCA9IE9iamVjdCgpOworCQkJaGllcmFyY2h5VmVydGljZXMucHVzaCh2ZXJ0ZXhTZXQpOworCisJCQl0aGlzLnRyYXZlcnNlKHRoaXMucm9vdHNbaV0sIHRydWUsIG51bGwsIGFsbFZlcnRleFNldCwgdmVydGV4U2V0LAorCQkJCQloaWVyYXJjaHlWZXJ0aWNlcywgbnVsbCk7CisJCX0KKwl9CisKKwl2YXIgdG1wID0gW107CisJCisJZm9yICh2YXIga2V5IGluIGFsbFZlcnRleFNldCkKKwl7CisJCXRtcC5wdXNoKGFsbFZlcnRleFNldFtrZXldKTsKKwl9CisJCisJdGhpcy5tb2RlbCA9IG5ldyBteFN3aW1sYW5lTW9kZWwodGhpcywgdG1wLCB0aGlzLnJvb3RzLAorCQlwYXJlbnQsIHRoaXMudGlnaHRlblRvU291cmNlKTsKKworCXRoaXMuY3ljbGVTdGFnZShwYXJlbnQpOworCXRoaXMubGF5ZXJpbmdTdGFnZSgpOworCQorCXRoaXMuY3Jvc3NpbmdTdGFnZShwYXJlbnQpOworCWluaXRpYWxYID0gdGhpcy5wbGFjZW1lbnRTdGFnZSgwLCBwYXJlbnQpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZmlsdGVyRGVzY2VuZGFudHMKKyAqIAorICogQ3JlYXRlcyBhbiBhcnJheSBvZiBkZXNjZW5kYW50IGNlbGxzCisgKi8KK214U3dpbWxhbmVMYXlvdXQucHJvdG90eXBlLmZpbHRlckRlc2NlbmRhbnRzID0gZnVuY3Rpb24oY2VsbCwgcmVzdWx0KQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGgubW9kZWw7CisKKwlpZiAobW9kZWwuaXNWZXJ0ZXgoY2VsbCkgJiYgY2VsbCAhPSB0aGlzLnBhcmVudCAmJiBtb2RlbC5nZXRQYXJlbnQoY2VsbCkgIT0gdGhpcy5wYXJlbnQgJiYgdGhpcy5ncmFwaC5pc0NlbGxWaXNpYmxlKGNlbGwpKQorCXsKKwkJcmVzdWx0W214T2JqZWN0SWRlbnRpdHkuZ2V0KGNlbGwpXSA9IGNlbGw7CisJfQorCisJaWYgKHRoaXMudHJhdmVyc2VBbmNlc3RvcnMgfHwgY2VsbCA9PSB0aGlzLnBhcmVudAorCQkJJiYgdGhpcy5ncmFwaC5pc0NlbGxWaXNpYmxlKGNlbGwpKQorCXsKKwkJdmFyIGNoaWxkQ291bnQgPSBtb2RlbC5nZXRDaGlsZENvdW50KGNlbGwpOworCisJCWZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKQorCQl7CisJCQl2YXIgY2hpbGQgPSBtb2RlbC5nZXRDaGlsZEF0KGNlbGwsIGkpOworCQkJCisJCQkvLyBJZ25vcmUgcG9ydHMgaW4gdGhlIGxheW91dCB2ZXJ0ZXggbGlzdCwgdGhleSBhcmUgZGVhbHQgd2l0aAorCQkJLy8gaW4gdGhlIHRyYXZlcnNhbCBtZWNoYW5pc21zCisJCQlpZiAoIXRoaXMuaXNQb3J0KGNoaWxkKSkKKwkJCXsKKwkJCQl0aGlzLmZpbHRlckRlc2NlbmRhbnRzKGNoaWxkLCByZXN1bHQpOworCQkJfQorCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNQb3J0CisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbCBpcyBhICJwb3J0IiwgdGhhdCBpcywgd2hlbiBjb25uZWN0aW5nIHRvCisgKiBpdCwgaXRzIHBhcmVudCBpcyB0aGUgY29ubmVjdGluZyB2ZXJ0ZXggaW4gdGVybXMgb2YgZ3JhcGggdHJhdmVyc2FsCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHBvcnQuCisgKi8KK214U3dpbWxhbmVMYXlvdXQucHJvdG90eXBlLmlzUG9ydCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJaWYgKGNlbGwuZ2VvbWV0cnkucmVsYXRpdmUpCisJeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcmV0dXJuIGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0RWRnZXNCZXR3ZWVuCisgKiAKKyAqIFJldHVybnMgdGhlIGVkZ2VzIGJldHdlZW4gdGhlIGdpdmVuIHNvdXJjZSBhbmQgdGFyZ2V0LiBUaGlzIHRha2VzIGludG8KKyAqIGFjY291bnQgY29sbGFwc2VkIGFuZCBpbnZpc2libGUgY2VsbHMgYW5kIHBvcnRzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzb3VyY2UgLQorICogdGFyZ2V0IC0KKyAqIGRpcmVjdGVkIC0KKyAqLworbXhTd2ltbGFuZUxheW91dC5wcm90b3R5cGUuZ2V0RWRnZXNCZXR3ZWVuID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQsIGRpcmVjdGVkKQoreworCWRpcmVjdGVkID0gKGRpcmVjdGVkICE9IG51bGwpID8gZGlyZWN0ZWQgOiBmYWxzZTsKKwl2YXIgZWRnZXMgPSB0aGlzLmdldEVkZ2VzKHNvdXJjZSk7CisJdmFyIHJlc3VsdCA9IFtdOworCisJLy8gQ2hlY2tzIGlmIHRoZSBlZGdlIGlzIGNvbm5lY3RlZCB0byB0aGUgY29ycmVjdAorCS8vIGNlbGwgYW5kIHJldHVybnMgdGhlIGZpcnN0IG1hdGNoCisJZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykKKwl7CisJCXZhciBzcmMgPSB0aGlzLmdldFZpc2libGVUZXJtaW5hbChlZGdlc1tpXSwgdHJ1ZSk7CisJCXZhciB0cmcgPSB0aGlzLmdldFZpc2libGVUZXJtaW5hbChlZGdlc1tpXSwgZmFsc2UpOworCisJCWlmICgoc3JjID09IHNvdXJjZSAmJiB0cmcgPT0gdGFyZ2V0KSB8fCAoIWRpcmVjdGVkICYmIHNyYyA9PSB0YXJnZXQgJiYgdHJnID09IHNvdXJjZSkpCisJCXsKKwkJCXJlc3VsdC5wdXNoKGVkZ2VzW2ldKTsKKwkJfQorCX0KKworCXJldHVybiByZXN1bHQ7Cit9OworCisvKioKKyAqIFRyYXZlcnNlcyB0aGUgKGRpcmVjdGVkKSBncmFwaCBpbnZva2luZyB0aGUgZ2l2ZW4gZnVuY3Rpb24gZm9yIGVhY2gKKyAqIHZpc2l0ZWQgdmVydGV4IGFuZCBlZGdlLiBUaGUgZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIHRoZSBjdXJyZW50IHZlcnRleAorICogYW5kIHRoZSBpbmNvbWluZyBlZGdlIGFzIGEgcGFyYW1ldGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIG1ha2VzIHN1cmUKKyAqIGVhY2ggdmVydGV4IGlzIG9ubHkgdmlzaXRlZCBvbmNlLiBUaGUgZnVuY3Rpb24gbWF5IHJldHVybiBmYWxzZSBpZiB0aGUKKyAqIHRyYXZlcnNhbCBzaG91bGQgc3RvcCBhdCB0aGUgZ2l2ZW4gdmVydGV4LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2ZXJ0ZXggLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRleCB3aGVyZSB0aGUgdHJhdmVyc2FsIHN0YXJ0cy4KKyAqIGRpcmVjdGVkIC0gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGVkZ2VzIHNob3VsZCBvbmx5IGJlIHRyYXZlcnNlZAorICogZnJvbSBzb3VyY2UgdG8gdGFyZ2V0LiBEZWZhdWx0IGlzIHRydWUuCisgKiBlZGdlIC0gT3B0aW9uYWwgPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBpbmNvbWluZyBlZGdlLiBUaGlzIGlzCisgKiBudWxsIGZvciB0aGUgZmlyc3Qgc3RlcCBvZiB0aGUgdHJhdmVyc2FsLgorICogYWxsVmVydGljZXMgLSBBcnJheSBvZiBjZWxsIHBhdGhzIGZvciB0aGUgdmlzaXRlZCBjZWxscy4KKyAqIHN3aW1sYW5lSW5kZXggLSB0aGUgbGFpZCBvdXQgb3JkZXIgaW5kZXggb2YgdGhlIHN3aW1sYW5lIHZlcnRleCBpcyBjb250YWluZWQgaW4KKyAqLworbXhTd2ltbGFuZUxheW91dC5wcm90b3R5cGUudHJhdmVyc2UgPSBmdW5jdGlvbih2ZXJ0ZXgsIGRpcmVjdGVkLCBlZGdlLCBhbGxWZXJ0aWNlcywgY3VycmVudENvbXAsCisJCQkJCQkJCQkJCWhpZXJhcmNoeVZlcnRpY2VzLCBmaWxsZWRWZXJ0ZXhTZXQsIHN3aW1sYW5lSW5kZXgpCit7CisJaWYgKHZlcnRleCAhPSBudWxsICYmIGFsbFZlcnRpY2VzICE9IG51bGwpCisJeworCQkvLyBIYXMgdGhpcyB2ZXJ0ZXggYmVlbiBzZWVuIGJlZm9yZSBpbiBhbnkgdHJhdmVyc2FsCisJCS8vIEFuZCBpZiB0aGUgZmlsbGVkIHZlcnRleCBzZXQgaXMgcG9wdWxhdGVkLCBvbmx5IAorCQkvLyBwcm9jZXNzIHZlcnRpY2VzIGluIHRoYXQgaXQgY29udGFpbnMKKwkJdmFyIHZlcnRleElEID0gbXhPYmplY3RJZGVudGl0eS5nZXQodmVydGV4KTsKKwkJCisJCWlmICgoYWxsVmVydGljZXNbdmVydGV4SURdID09IG51bGwpCisJCQkJJiYgKGZpbGxlZFZlcnRleFNldCA9PSBudWxsID8gdHJ1ZSA6IGZpbGxlZFZlcnRleFNldFt2ZXJ0ZXhJRF0gIT0gbnVsbCkpCisJCXsKKwkJCWlmIChjdXJyZW50Q29tcFt2ZXJ0ZXhJRF0gPT0gbnVsbCkKKwkJCXsKKwkJCQljdXJyZW50Q29tcFt2ZXJ0ZXhJRF0gPSB2ZXJ0ZXg7CisJCQl9CisJCQlpZiAoYWxsVmVydGljZXNbdmVydGV4SURdID09IG51bGwpCisJCQl7CisJCQkJYWxsVmVydGljZXNbdmVydGV4SURdID0gdmVydGV4OworCQkJfQorCisJCQlpZiAoZmlsbGVkVmVydGV4U2V0ICE9PSBudWxsKQorCQkJeworCQkJCWRlbGV0ZSBmaWxsZWRWZXJ0ZXhTZXRbdmVydGV4SURdOworCQkJfQorCisJCQl2YXIgZWRnZXMgPSB0aGlzLmdldEVkZ2VzKHZlcnRleCk7CisJCQl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLm1vZGVsOworCisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCXZhciBvdGhlclZlcnRleCA9IHRoaXMuZ2V0VmlzaWJsZVRlcm1pbmFsKGVkZ2VzW2ldLCB0cnVlKTsKKwkJCQl2YXIgaXNTb3VyY2UgPSBvdGhlclZlcnRleCA9PSB2ZXJ0ZXg7CisJCQkJCisJCQkJaWYgKGlzU291cmNlKQorCQkJCXsKKwkJCQkJb3RoZXJWZXJ0ZXggPSB0aGlzLmdldFZpc2libGVUZXJtaW5hbChlZGdlc1tpXSwgZmFsc2UpOworCQkJCX0KKworCQkJCXZhciBvdGhlckluZGV4ID0gMDsKKwkJCQkvLyBHZXQgdGhlIHN3aW1sYW5lIGluZGV4IG9mIHRoZSBvdGhlciB0ZXJtaW5hbAorCQkJCWZvciAob3RoZXJJbmRleCA9IDA7IG90aGVySW5kZXggPCB0aGlzLnN3aW1sYW5lcy5sZW5ndGg7IG90aGVySW5kZXgrKykKKwkJCQl7CisJCQkJCWlmIChtb2RlbC5pc0FuY2VzdG9yKHRoaXMuc3dpbWxhbmVzW290aGVySW5kZXhdLCBvdGhlclZlcnRleCkpCisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCWlmIChvdGhlckluZGV4ID49IHRoaXMuc3dpbWxhbmVzLmxlbmd0aCkKKwkJCQl7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCS8vIFRyYXZlcnNlIGlmIHRoZSBvdGhlciB2ZXJ0ZXggaXMgd2l0aGluIHRoZSBzYW1lIHN3aW1sYW5lIGFzCisJCQkJLy8gYXMgdGhlIGN1cnJlbnQgdmVydGV4LCBvciBpZiB0aGUgc3dpbWxhbmUgaW5kZXggb2YgdGhlIG90aGVyCisJCQkJLy8gdmVydGV4IGlzIGdyZWF0ZXIgdGhhbiB0aGF0IG9mIHRoaXMgdmVydGV4CisJCQkJaWYgKChvdGhlckluZGV4ID4gc3dpbWxhbmVJbmRleCkgfHwKKwkJCQkJCSgoIWRpcmVjdGVkIHx8IGlzU291cmNlKSAmJiBvdGhlckluZGV4ID09IHN3aW1sYW5lSW5kZXgpKQorCQkJCXsKKwkJCQkJY3VycmVudENvbXAgPSB0aGlzLnRyYXZlcnNlKG90aGVyVmVydGV4LCBkaXJlY3RlZCwgZWRnZXNbaV0sIGFsbFZlcnRpY2VzLAorCQkJCQkJCWN1cnJlbnRDb21wLCBoaWVyYXJjaHlWZXJ0aWNlcywKKwkJCQkJCQlmaWxsZWRWZXJ0ZXhTZXQsIG90aGVySW5kZXgpOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChjdXJyZW50Q29tcFt2ZXJ0ZXhJRF0gPT0gbnVsbCkKKwkJCXsKKwkJCQkvLyBXZSd2ZSBzZWVuIHRoaXMgdmVydGV4IGJlZm9yZSwgYnV0IG5vdCBpbiB0aGUgY3VycmVudCBjb21wb25lbnQKKwkJCQkvLyBUaGlzIGNvbXBvbmVudCBhbmQgdGhlIG9uZSBpdCdzIGluIG5lZWQgdG8gYmUgbWVyZ2VkCisJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBoaWVyYXJjaHlWZXJ0aWNlcy5sZW5ndGg7IGkrKykKKwkJCQl7CisJCQkJCXZhciBjb21wID0gaGllcmFyY2h5VmVydGljZXNbaV07CisKKwkJCQkJaWYgKGNvbXBbdmVydGV4SURdICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCWZvciAodmFyIGtleSBpbiBjb21wKQorCQkJCQkJeworCQkJCQkJCWN1cnJlbnRDb21wW2tleV0gPSBjb21wW2tleV07CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCS8vIFJlbW92ZSB0aGUgY3VycmVudCBjb21wb25lbnQgZnJvbSB0aGUgaGllcmFyY2h5IHNldAorCQkJCQkJaGllcmFyY2h5VmVydGljZXMuc3BsaWNlKGksIDEpOworCQkJCQkJcmV0dXJuIGN1cnJlbnRDb21wOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXJldHVybiBjdXJyZW50Q29tcDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGN5Y2xlU3RhZ2UKKyAqIAorICogRXhlY3V0ZXMgdGhlIGN5Y2xlIHN0YWdlIHVzaW5nIG14TWluaW11bUN5Y2xlUmVtb3Zlci4KKyAqLworbXhTd2ltbGFuZUxheW91dC5wcm90b3R5cGUuY3ljbGVTdGFnZSA9IGZ1bmN0aW9uKHBhcmVudCkKK3sKKwl2YXIgY3ljbGVTdGFnZSA9IG5ldyBteFN3aW1sYW5lT3JkZXJpbmcodGhpcyk7CisJY3ljbGVTdGFnZS5leGVjdXRlKHBhcmVudCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBsYXllcmluZ1N0YWdlCisgKiAKKyAqIEltcGxlbWVudHMgZmlyc3Qgc3RhZ2Ugb2YgYSBTdWdpeWFtYSBsYXlvdXQuCisgKi8KK214U3dpbWxhbmVMYXlvdXQucHJvdG90eXBlLmxheWVyaW5nU3RhZ2UgPSBmdW5jdGlvbigpCit7CisJdGhpcy5tb2RlbC5pbml0aWFsUmFuaygpOworCXRoaXMubW9kZWwuZml4UmFua3MoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyb3NzaW5nU3RhZ2UKKyAqIAorICogRXhlY3V0ZXMgdGhlIGNyb3NzaW5nIHN0YWdlIHVzaW5nIG14TWVkaWFuSHlicmlkQ3Jvc3NpbmdSZWR1Y3Rpb24uCisgKi8KK214U3dpbWxhbmVMYXlvdXQucHJvdG90eXBlLmNyb3NzaW5nU3RhZ2UgPSBmdW5jdGlvbihwYXJlbnQpCit7CisJdmFyIGNyb3NzaW5nU3RhZ2UgPSBuZXcgbXhNZWRpYW5IeWJyaWRDcm9zc2luZ1JlZHVjdGlvbih0aGlzKTsKKwljcm9zc2luZ1N0YWdlLmV4ZWN1dGUocGFyZW50KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHBsYWNlbWVudFN0YWdlCisgKiAKKyAqIEV4ZWN1dGVzIHRoZSBwbGFjZW1lbnQgc3RhZ2UgdXNpbmcgbXhDb29yZGluYXRlQXNzaWdubWVudC4KKyAqLworbXhTd2ltbGFuZUxheW91dC5wcm90b3R5cGUucGxhY2VtZW50U3RhZ2UgPSBmdW5jdGlvbihpbml0aWFsWCwgcGFyZW50KQoreworCXZhciBwbGFjZW1lbnRTdGFnZSA9IG5ldyBteENvb3JkaW5hdGVBc3NpZ25tZW50KHRoaXMsIHRoaXMuaW50cmFDZWxsU3BhY2luZywKKwkJCXRoaXMuaW50ZXJSYW5rQ2VsbFNwYWNpbmcsIHRoaXMub3JpZW50YXRpb24sIGluaXRpYWxYLAorCQkJdGhpcy5wYXJhbGxlbEVkZ2VTcGFjaW5nKTsKKwlwbGFjZW1lbnRTdGFnZS5maW5lVHVuaW5nID0gdGhpcy5maW5lVHVuaW5nOworCXBsYWNlbWVudFN0YWdlLmV4ZWN1dGUocGFyZW50KTsKKwkKKwlyZXR1cm4gcGxhY2VtZW50U3RhZ2UubGltaXRYICsgdGhpcy5pbnRlckhpZXJhcmNoeVNwYWNpbmc7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9oaWVyYXJjaGljYWwvc3RhZ2UvbXhDb29yZGluYXRlQXNzaWdubWVudC5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL3N0YWdlL214Q29vcmRpbmF0ZUFzc2lnbm1lbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjOWJiZAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL3N0YWdlL214Q29vcmRpbmF0ZUFzc2lnbm1lbnQuanMKQEAgLTAsMCArMSwxODMwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteENvb3JkaW5hdGVBc3NpZ25tZW50CisgKiAKKyAqIFNldHMgdGhlIGhvcml6b250YWwgbG9jYXRpb25zIG9mIG5vZGUgYW5kIGVkZ2UgZHVtbXkgbm9kZXMgb24gZWFjaCBsYXllci4KKyAqIFVzZXMgbWVkaWFuIGRvd24gYW5kIHVwIHdlaWdoaW5ncyBhcyB3ZWxsIGFzIGhldXJpc3RpY3MgdG8gc3RyYWlnaHRlbiBlZGdlcyBhcworICogZmFyIGFzIHBvc3NpYmxlLgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhDb29yZGluYXRlQXNzaWdubWVudAorICoKKyAqIENyZWF0ZXMgYSBjb29yZGluYXRlIGFzc2lnbm1lbnQuCisgKiAKKyAqIEFyZ3VtZW50czoKKyAqIAorICogaW50cmFDZWxsU3BhY2luZyAtIHRoZSBtaW5pbXVtIGJ1ZmZlciBiZXR3ZWVuIGNlbGxzIG9uIHRoZSBzYW1lIHJhbmsKKyAqIGludGVyUmFua0NlbGxTcGFjaW5nIC0gdGhlIG1pbmltdW0gZGlzdGFuY2UgYmV0d2VlbiBjZWxscyBvbiBhZGphY2VudCByYW5rcworICogb3JpZW50YXRpb24gLSB0aGUgcG9zaXRpb24gb2YgdGhlIHJvb3Qgbm9kZShzKSByZWxhdGl2ZSB0byB0aGUgZ3JhcGgKKyAqIGluaXRpYWxYIC0gdGhlIGxlZnRtb3N0IGNvb3JkaW5hdGUgbm9kZSBwbGFjZW1lbnQgc3RhcnRzIGF0CisgKi8KK2Z1bmN0aW9uIG14Q29vcmRpbmF0ZUFzc2lnbm1lbnQobGF5b3V0LCBpbnRyYUNlbGxTcGFjaW5nLCBpbnRlclJhbmtDZWxsU3BhY2luZywKKwlvcmllbnRhdGlvbiwgaW5pdGlhbFgsIHBhcmFsbGVsRWRnZVNwYWNpbmcpCit7CisJdGhpcy5sYXlvdXQgPSBsYXlvdXQ7CisJdGhpcy5pbnRyYUNlbGxTcGFjaW5nID0gaW50cmFDZWxsU3BhY2luZzsKKwl0aGlzLmludGVyUmFua0NlbGxTcGFjaW5nID0gaW50ZXJSYW5rQ2VsbFNwYWNpbmc7CisJdGhpcy5vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uOworCXRoaXMuaW5pdGlhbFggPSBpbml0aWFsWDsKKwl0aGlzLnBhcmFsbGVsRWRnZVNwYWNpbmcgPSBwYXJhbGxlbEVkZ2VTcGFjaW5nOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14SGllcmFyY2hpY2FsTGF5b3V0U3RhZ2UuCisgKi8KK214Q29vcmRpbmF0ZUFzc2lnbm1lbnQucHJvdG90eXBlID0gbmV3IG14SGllcmFyY2hpY2FsTGF5b3V0U3RhZ2UoKTsKK214Q29vcmRpbmF0ZUFzc2lnbm1lbnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhDb29yZGluYXRlQXNzaWdubWVudDsKKworLyoqCisgKiBWYXJpYWJsZTogbGF5b3V0CisgKiAKKyAqIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEhpZXJhcmNoaWNhbExheW91dD4uCisgKi8KK214Q29vcmRpbmF0ZUFzc2lnbm1lbnQucHJvdG90eXBlLmxheW91dCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGludHJhQ2VsbFNwYWNpbmcKKyAqIAorICogVGhlIG1pbmltdW0gYnVmZmVyIGJldHdlZW4gY2VsbHMgb24gdGhlIHNhbWUgcmFuay4gRGVmYXVsdCBpcyAzMC4KKyAqLworbXhDb29yZGluYXRlQXNzaWdubWVudC5wcm90b3R5cGUuaW50cmFDZWxsU3BhY2luZyA9IDMwOworCisvKioKKyAqIFZhcmlhYmxlOiBpbnRlclJhbmtDZWxsU3BhY2luZworICogCisgKiBUaGUgbWluaW11bSBkaXN0YW5jZSBiZXR3ZWVuIGNlbGxzIG9uIGFkamFjZW50IHJhbmtzLiBEZWZhdWx0IGlzIDEwLgorICovCitteENvb3JkaW5hdGVBc3NpZ25tZW50LnByb3RvdHlwZS5pbnRlclJhbmtDZWxsU3BhY2luZyA9IDEwMDsKKworLyoqCisgKiBWYXJpYWJsZTogcGFyYWxsZWxFZGdlU3BhY2luZworICogCisgKiBUaGUgZGlzdGFuY2UgYmV0d2VlbiBlYWNoIHBhcmFsbGVsIGVkZ2Ugb24gZWFjaCByYW5rcyBmb3IgbG9uZyBlZGdlcy4KKyAqIERlZmF1bHQgaXMgMTAuCisgKi8KK214Q29vcmRpbmF0ZUFzc2lnbm1lbnQucHJvdG90eXBlLnBhcmFsbGVsRWRnZVNwYWNpbmcgPSAxMDsKKworLyoqCisgKiBWYXJpYWJsZTogbWF4SXRlcmF0aW9ucworICogCisgKiBUaGUgbnVtYmVyIG9mIGhldXJpc3RpYyBpdGVyYXRpb25zIHRvIHJ1bi4gRGVmYXVsdCBpcyA4LgorICovCitteENvb3JkaW5hdGVBc3NpZ25tZW50LnByb3RvdHlwZS5tYXhJdGVyYXRpb25zID0gODsKKworLyoqCisgKiBWYXJpYWJsZTogcHJlZkhvekVkZ2VTZXAKKyAqIAorICogVGhlIHByZWZlcnJlZCBob3Jpem9udGFsIGRpc3RhbmNlIGJldHdlZW4gZWRnZXMgZXhpdGluZyBhIHZlcnRleAorICovCitteENvb3JkaW5hdGVBc3NpZ25tZW50LnByb3RvdHlwZS5wcmVmSG96RWRnZVNlcCA9IDU7CisKKy8qKgorICogVmFyaWFibGU6IHByZWZWZXJ0RWRnZU9mZgorICogCisgKiBUaGUgcHJlZmVycmVkIHZlcnRpY2FsIG9mZnNldCBiZXR3ZWVuIGVkZ2VzIGV4aXRpbmcgYSB2ZXJ0ZXgKKyAqLworbXhDb29yZGluYXRlQXNzaWdubWVudC5wcm90b3R5cGUucHJlZlZlcnRFZGdlT2ZmID0gMjsKKworLyoqCisgKiBWYXJpYWJsZTogbWluRWRnZUpldHR5CisgKiAKKyAqIFRoZSBtaW5pbXVtIGRpc3RhbmNlIGZvciBhbiBlZGdlIGpldHR5IGZyb20gYSB2ZXJ0ZXgKKyAqLworbXhDb29yZGluYXRlQXNzaWdubWVudC5wcm90b3R5cGUubWluRWRnZUpldHR5ID0gMTI7CisKKy8qKgorICogVmFyaWFibGU6IGNoYW5uZWxCdWZmZXIKKyAqIAorICogVGhlIHNpemUgb2YgdGhlIHZlcnRpY2FsIGJ1ZmZlciBpbiB0aGUgY2VudGVyIG9mIGludGVyLXJhbmsgY2hhbm5lbHMKKyAqIHdoZXJlIGVkZ2UgY29udHJvbCBwb2ludHMgc2hvdWxkIG5vdCBiZSBwbGFjZWQKKyAqLworbXhDb29yZGluYXRlQXNzaWdubWVudC5wcm90b3R5cGUuY2hhbm5lbEJ1ZmZlciA9IDQ7CisKKy8qKgorICogVmFyaWFibGU6IGpldHR5UG9zaXRpb25zCisgKiAKKyAqIE1hcCBvZiBpbnRlcm5hbCBlZGdlcyBhbmQgKHgseSkgcGFpciBvZiBwb3NpdGlvbnMgb2YgdGhlIHN0YXJ0IGFuZCBlbmQgamV0dHkKKyAqIGZvciB0aGF0IGVkZ2Ugd2hlcmUgaXQgY29ubmVjdHMgdG8gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IHZlcnRpY2VzLgorICogTm90ZSB0aGlzIHNob3VsZCB0ZWNobmljYWxseSBiZSBhIFdlYWtIYXNoTWFwLCBidXQgc2luY2UgSlMgZG9lcyBub3QKKyAqIGhhdmUgYW4gZXF1aXZhbGVudCwgaG91c2VrZWVwaW5nIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSB1c2luZy4KKyAqIGkuZS4gY2hlY2sgYWxsIGVkZ2VzIGFyZSBzdGlsbCBpbiB0aGUgbW9kZWwgYW5kIGNsZWFyIHRoZSB2YWx1ZXMuCisgKiBOb3RlIHRoYXQgdGhlIHkgY28tb3JkIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGpldHR5LCBub3QgdGhlCisgKiBhYnNvbHV0ZSBwb2ludAorICovCitteENvb3JkaW5hdGVBc3NpZ25tZW50LnByb3RvdHlwZS5qZXR0eVBvc2l0aW9ucyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IG9yaWVudGF0aW9uCisgKiAKKyAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgcm9vdCAoIHN0YXJ0ICkgbm9kZShzKSByZWxhdGl2ZSB0byB0aGUgcmVzdCBvZiB0aGUKKyAqIGxhaWQgb3V0IGdyYXBoLiBEZWZhdWx0IGlzIDxteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEg+LgorICovCitteENvb3JkaW5hdGVBc3NpZ25tZW50LnByb3RvdHlwZS5vcmllbnRhdGlvbiA9IG14Q29uc3RhbnRzLkRJUkVDVElPTl9OT1JUSDsKKworLyoqCisgKiBWYXJpYWJsZTogaW5pdGlhbFgKKyAqIAorICogVGhlIG1pbmltdW0geCBwb3NpdGlvbiBub2RlIHBsYWNlbWVudCBzdGFydHMgYXQKKyAqLworbXhDb29yZGluYXRlQXNzaWdubWVudC5wcm90b3R5cGUuaW5pdGlhbFggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBsaW1pdFgKKyAqIAorICogVGhlIG1heGltdW0geCB2YWx1ZSB0aGlzIHBvc2l0aW9uaW5nIGxheXMgdXAgdG8KKyAqLworbXhDb29yZGluYXRlQXNzaWdubWVudC5wcm90b3R5cGUubGltaXRYID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogY3VycmVudFhEZWx0YQorICogCisgKiBUaGUgc3VtIG9mIHgtZGlzcGxhY2VtZW50cyBmb3IgdGhlIGN1cnJlbnQgaXRlcmF0aW9uCisgKi8KK214Q29vcmRpbmF0ZUFzc2lnbm1lbnQucHJvdG90eXBlLmN1cnJlbnRYRGVsdGEgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB3aWRlc3RSYW5rCisgKiAKKyAqIFRoZSByYW5rIHRoYXQgaGFzIHRoZSB3aWRlc3QgeCBwb3NpdGlvbgorICovCitteENvb3JkaW5hdGVBc3NpZ25tZW50LnByb3RvdHlwZS53aWRlc3RSYW5rID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogcmFua1RvcFkKKyAqIAorICogSW50ZXJuYWwgY2FjaGUgb2YgdG9wLW1vc3QgdmFsdWVzIG9mIFkgZm9yIGVhY2ggcmFuaworICovCitteENvb3JkaW5hdGVBc3NpZ25tZW50LnByb3RvdHlwZS5yYW5rVG9wWSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHJhbmtCb3R0b21ZCisgKiAKKyAqIEludGVybmFsIGNhY2hlIG9mIGJvdHRvbS1tb3N0IHZhbHVlIG9mIFkgZm9yIGVhY2ggcmFuaworICovCitteENvb3JkaW5hdGVBc3NpZ25tZW50LnByb3RvdHlwZS5yYW5rQm90dG9tWSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHdpZGVzdFJhbmtWYWx1ZQorICogCisgKiBUaGUgWC1jb29yZGluYXRlIG9mIHRoZSBlZGdlIG9mIHRoZSB3aWRlc3QgcmFuaworICovCitteENvb3JkaW5hdGVBc3NpZ25tZW50LnByb3RvdHlwZS53aWRlc3RSYW5rVmFsdWUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiByYW5rV2lkdGhzCisgKiAKKyAqIFRoZSB3aWR0aCBvZiBhbGwgdGhlIHJhbmtzCisgKi8KK214Q29vcmRpbmF0ZUFzc2lnbm1lbnQucHJvdG90eXBlLnJhbmtXaWR0aHMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiByYW5rWQorICogCisgKiBUaGUgWS1jb29yZGluYXRlIG9mIGFsbCB0aGUgcmFua3MKKyAqLworbXhDb29yZGluYXRlQXNzaWdubWVudC5wcm90b3R5cGUucmFua1kgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBmaW5lVHVuaW5nCisgKiAKKyAqIFdoZXRoZXIgb3Igbm90IHRvIHBlcmZvcm0gbG9jYWwgb3B0aW1pc2F0aW9ucyBhbmQgaXRlcmF0ZSBtdWx0aXBsZSB0aW1lcworICogdGhyb3VnaCB0aGUgYWxnb3JpdGhtLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214Q29vcmRpbmF0ZUFzc2lnbm1lbnQucHJvdG90eXBlLmZpbmVUdW5pbmcgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBuZXh0TGF5ZXJDb25uZWN0ZWRDYWNoZQorICogCisgKiBBIHN0b3JlIG9mIGNvbm5lY3Rpb25zIHRvIHRoZSBsYXllciBhYm92ZSBmb3Igc3BlZWQKKyAqLworbXhDb29yZGluYXRlQXNzaWdubWVudC5wcm90b3R5cGUubmV4dExheWVyQ29ubmVjdGVkQ2FjaGUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBwcmV2aW91c0xheWVyQ29ubmVjdGVkQ2FjaGUKKyAqIAorICogQSBzdG9yZSBvZiBjb25uZWN0aW9ucyB0byB0aGUgbGF5ZXIgYmVsb3cgZm9yIHNwZWVkCisgKi8KK214Q29vcmRpbmF0ZUFzc2lnbm1lbnQucHJvdG90eXBlLnByZXZpb3VzTGF5ZXJDb25uZWN0ZWRDYWNoZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGdyb3VwUGFkZGluZworICogCisgKiBQYWRkaW5nIGFkZGVkIHRvIHJlc2l6ZWQgcGFyZW50cworICovCitteENvb3JkaW5hdGVBc3NpZ25tZW50LnByb3RvdHlwZS5ncm91cFBhZGRpbmcgPSAxMDsKKworLyoqCisgKiBVdGlsaXR5IG1ldGhvZCB0byBkaXNwbGF5IGN1cnJlbnQgcG9zaXRpb25zCisgKi8KK214Q29vcmRpbmF0ZUFzc2lnbm1lbnQucHJvdG90eXBlLnByaW50U3RhdHVzID0gZnVuY3Rpb24oKQoreworCXZhciBtb2RlbCA9IHRoaXMubGF5b3V0LmdldE1vZGVsKCk7CisJbXhMb2cuc2hvdygpOworCisJbXhMb2cud3JpdGVsbignPT09PT09Q29vcmQgYXNzaWdubWVudCBkZWJ1Zz09PT09PT0nKTsKKworCWZvciAodmFyIGogPSAwOyBqIDwgbW9kZWwucmFua3MubGVuZ3RoOyBqKyspCisJeworCQlteExvZy53cml0ZSgnUmFuayAnLCBqLCAnIDogJyApOworCQl2YXIgcmFuayA9IG1vZGVsLnJhbmtzW2pdOworCQkKKwkJZm9yICh2YXIgayA9IDA7IGsgPCByYW5rLmxlbmd0aDsgaysrKQorCQl7CisJCQl2YXIgY2VsbCA9IHJhbmtba107CisJCQkKKwkJCW14TG9nLndyaXRlKGNlbGwuZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShqKSwgJyAgJyk7CisJCX0KKwkJbXhMb2cud3JpdGVsbigpOworCX0KKwkKKwlteExvZy53cml0ZWxuKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGV4ZWN1dGUKKyAqIAorICogQSBiYXNpYyBob3Jpem9udGFsIGNvb3JkaW5hdGUgYXNzaWdubWVudCBhbGdvcml0aG0KKyAqLworbXhDb29yZGluYXRlQXNzaWdubWVudC5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uKHBhcmVudCkKK3sKKwl0aGlzLmpldHR5UG9zaXRpb25zID0gT2JqZWN0KCk7CisJdmFyIG1vZGVsID0gdGhpcy5sYXlvdXQuZ2V0TW9kZWwoKTsKKwl0aGlzLmN1cnJlbnRYRGVsdGEgPSAwLjA7CisKKwl0aGlzLmluaXRpYWxDb29yZHModGhpcy5sYXlvdXQuZ2V0R3JhcGgoKSwgbW9kZWwpOworCQorLy8JdGhpcy5wcmludFN0YXR1cygpOworCQorCWlmICh0aGlzLmZpbmVUdW5pbmcpCisJeworCQl0aGlzLm1pbk5vZGUobW9kZWwpOworCX0KKwkKKwl2YXIgYmVzdFhEZWx0YSA9IDEwMDAwMDAwMC4wOworCQorCWlmICh0aGlzLmZpbmVUdW5pbmcpCisJeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubWF4SXRlcmF0aW9uczsgaSsrKQorCQl7CisvLwkJCXRoaXMucHJpbnRTdGF0dXMoKTsKKwkJCisJCQkvLyBNZWRpYW4gSGV1cmlzdGljCisJCQlpZiAoaSAhPSAwKQorCQkJeworCQkJCXRoaXMubWVkaWFuUG9zKGksIG1vZGVsKTsKKwkJCQl0aGlzLm1pbk5vZGUobW9kZWwpOworCQkJfQorCQkJCisJCQkvLyBpZiB0aGUgdG90YWwgb2Zmc2V0IGlzIGxlc3MgZm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uaW5nLAorCQkJLy8gdGhlcmUgYXJlIGxlc3MgaGVhdmlseSBhbmdsZWQgZWRnZXMgYW5kIHNvIHRoZSBjdXJyZW50CisJCQkvLyBwb3NpdGlvbmluZyBpcyB1c2VkCisJCQlpZiAodGhpcy5jdXJyZW50WERlbHRhIDwgYmVzdFhEZWx0YSkKKwkJCXsKKwkJCQlmb3IgKHZhciBqID0gMDsgaiA8IG1vZGVsLnJhbmtzLmxlbmd0aDsgaisrKQorCQkJCXsKKwkJCQkJdmFyIHJhbmsgPSBtb2RlbC5yYW5rc1tqXTsKKwkJCQkJCisJCQkJCWZvciAodmFyIGsgPSAwOyBrIDwgcmFuay5sZW5ndGg7IGsrKykKKwkJCQkJeworCQkJCQkJdmFyIGNlbGwgPSByYW5rW2tdOworCQkJCQkJY2VsbC5zZXRYKGosIGNlbGwuZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShqKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJYmVzdFhEZWx0YSA9IHRoaXMuY3VycmVudFhEZWx0YTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBSZXN0b3JlIHRoZSBiZXN0IHBvc2l0aW9ucworCQkJCWZvciAodmFyIGogPSAwOyBqIDwgbW9kZWwucmFua3MubGVuZ3RoOyBqKyspCisJCQkJeworCQkJCQl2YXIgcmFuayA9IG1vZGVsLnJhbmtzW2pdOworCQkJCQkKKwkJCQkJZm9yICh2YXIgayA9IDA7IGsgPCByYW5rLmxlbmd0aDsgaysrKQorCQkJCQl7CisJCQkJCQl2YXIgY2VsbCA9IHJhbmtba107CisJCQkJCQljZWxsLnNldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUoaiwgY2VsbC5nZXRYKGopKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQorCQkJdGhpcy5taW5QYXRoKHRoaXMubGF5b3V0LmdldEdyYXBoKCksIG1vZGVsKTsKKwkJCQorCQkJdGhpcy5jdXJyZW50WERlbHRhID0gMDsKKwkJfQorCX0KKwkKKwl0aGlzLnNldENlbGxMb2NhdGlvbnModGhpcy5sYXlvdXQuZ2V0R3JhcGgoKSwgbW9kZWwpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogbWluTm9kZQorICogCisgKiBQZXJmb3JtcyBvbmUgbWVkaWFuIHBvc2l0aW9uaW5nIHN3ZWVwIGluIGJvdGggZGlyZWN0aW9ucworICovCitteENvb3JkaW5hdGVBc3NpZ25tZW50LnByb3RvdHlwZS5taW5Ob2RlID0gZnVuY3Rpb24obW9kZWwpCit7CisJLy8gUXVldWUgYWxsIG5vZGVzCisJdmFyIG5vZGVMaXN0ID0gW107CisJCisJLy8gTmVlZCB0byBiZSBhYmxlIHRvIG1hcCBmcm9tIGNlbGwgdG8gY2VsbFdyYXBwZXIKKwl2YXIgbWFwID0gbmV3IG14RGljdGlvbmFyeSgpOworCXZhciByYW5rID0gW107CisJCisJZm9yICh2YXIgaSA9IDA7IGkgPD0gbW9kZWwubWF4UmFuazsgaSsrKQorCXsKKwkJcmFua1tpXSA9IG1vZGVsLnJhbmtzW2ldOworCQkKKwkJZm9yICh2YXIgaiA9IDA7IGogPCByYW5rW2ldLmxlbmd0aDsgaisrKQorCQl7CisJCQkvLyBVc2UgdGhlIHdlaWdodCB0byBzdG9yZSB0aGUgcmFuayBhbmQgdmlzaXRlZCB0byBzdG9yZSB3aGV0aGVyCisJCQkvLyBvciBub3QgdGhlIGNlbGwgaXMgaW4gdGhlIGxpc3QKKwkJCXZhciBub2RlID0gcmFua1tpXVtqXTsKKwkJCXZhciBub2RlV3JhcHBlciA9IG5ldyBXZWlnaHRlZENlbGxTb3J0ZXIobm9kZSwgaSk7CisJCQlub2RlV3JhcHBlci5yYW5rSW5kZXggPSBqOworCQkJbm9kZVdyYXBwZXIudmlzaXRlZCA9IHRydWU7CisJCQlub2RlTGlzdC5wdXNoKG5vZGVXcmFwcGVyKTsKKwkJCQorCQkJbWFwLnB1dChub2RlLCBub2RlV3JhcHBlcik7CisJCX0KKwl9CisJCisJLy8gU2V0IGEgbGltaXQgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHdlIHdpbGwgYWNjZXNzIHRoZSBxdWV1ZQorCS8vIGluIGNhc2UgYSBsb29wIGFwcGVhcnMKKwl2YXIgbWF4VHJpZXMgPSBub2RlTGlzdC5sZW5ndGggKiAxMDsKKwl2YXIgY291bnQgPSAwOworCQorCS8vIERvbid0IG1vdmUgY2VsbCB3aXRoaW4gdGhpcyB2YWx1ZSBvZiB0aGVpciBtZWRpYW4KKwl2YXIgdG9sZXJhbmNlID0gMTsKKwkKKwl3aGlsZSAobm9kZUxpc3QubGVuZ3RoID4gMCAmJiBjb3VudCA8PSBtYXhUcmllcykKKwl7CisJCXZhciBjZWxsV3JhcHBlciA9IG5vZGVMaXN0LnNoaWZ0KCk7CisJCXZhciBjZWxsID0gY2VsbFdyYXBwZXIuY2VsbDsKKwkJCisJCXZhciByYW5rVmFsdWUgPSBjZWxsV3JhcHBlci53ZWlnaHRlZFZhbHVlOworCQl2YXIgcmFua0luZGV4ID0gcGFyc2VJbnQoY2VsbFdyYXBwZXIucmFua0luZGV4KTsKKwkJCisJCXZhciBuZXh0TGF5ZXJDb25uZWN0ZWRDZWxscyA9IGNlbGwuZ2V0TmV4dExheWVyQ29ubmVjdGVkQ2VsbHMocmFua1ZhbHVlKTsKKwkJdmFyIHByZXZpb3VzTGF5ZXJDb25uZWN0ZWRDZWxscyA9IGNlbGwuZ2V0UHJldmlvdXNMYXllckNvbm5lY3RlZENlbGxzKHJhbmtWYWx1ZSk7CisJCQorCQl2YXIgbnVtTmV4dExheWVyQ29ubmVjdGVkID0gbmV4dExheWVyQ29ubmVjdGVkQ2VsbHMubGVuZ3RoOworCQl2YXIgbnVtUHJldmlvdXNMYXllckNvbm5lY3RlZCA9IHByZXZpb3VzTGF5ZXJDb25uZWN0ZWRDZWxscy5sZW5ndGg7CisKKwkJdmFyIG1lZGlhbk5leHRMZXZlbCA9IHRoaXMubWVkaWFuWFZhbHVlKG5leHRMYXllckNvbm5lY3RlZENlbGxzLAorCQkJCXJhbmtWYWx1ZSArIDEpOworCQl2YXIgbWVkaWFuUHJldmlvdXNMZXZlbCA9IHRoaXMubWVkaWFuWFZhbHVlKHByZXZpb3VzTGF5ZXJDb25uZWN0ZWRDZWxscywKKwkJCQlyYW5rVmFsdWUgLSAxKTsKKworCQl2YXIgbnVtQ29ubmVjdGVkTmVpZ2hib3VycyA9IG51bU5leHRMYXllckNvbm5lY3RlZAorCQkJCSsgbnVtUHJldmlvdXNMYXllckNvbm5lY3RlZDsKKwkJdmFyIGN1cnJlbnRQb3NpdGlvbiA9IGNlbGwuZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShyYW5rVmFsdWUpOworCQl2YXIgY2VsbE1lZGlhbiA9IGN1cnJlbnRQb3NpdGlvbjsKKwkJCisJCWlmIChudW1Db25uZWN0ZWROZWlnaGJvdXJzID4gMCkKKwkJeworCQkJY2VsbE1lZGlhbiA9IChtZWRpYW5OZXh0TGV2ZWwgKiBudW1OZXh0TGF5ZXJDb25uZWN0ZWQgKyBtZWRpYW5QcmV2aW91c0xldmVsCisJCQkJCSogbnVtUHJldmlvdXNMYXllckNvbm5lY3RlZCkKKwkJCQkJLyBudW1Db25uZWN0ZWROZWlnaGJvdXJzOworCQl9CisKKwkJLy8gRmxhZyBzdG9yaW5nIHdoZXRoZXIgb3Igbm90IHBvc2l0aW9uIGhhcyBjaGFuZ2VkCisJCXZhciBwb3NpdGlvbkNoYW5nZWQgPSBmYWxzZTsKKwkJCisJCWlmIChjZWxsTWVkaWFuIDwgY3VycmVudFBvc2l0aW9uIC0gdG9sZXJhbmNlKQorCQl7CisJCQlpZiAocmFua0luZGV4ID09IDApCisJCQl7CisJCQkJY2VsbC5zZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKHJhbmtWYWx1ZSwgY2VsbE1lZGlhbik7CisJCQkJcG9zaXRpb25DaGFuZ2VkID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl2YXIgbGVmdENlbGwgPSByYW5rW3JhbmtWYWx1ZV1bcmFua0luZGV4IC0gMV07CisJCQkJdmFyIGxlZnRMaW1pdCA9IGxlZnRDZWxsCisJCQkJCQkuZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShyYW5rVmFsdWUpOworCQkJCWxlZnRMaW1pdCA9IGxlZnRMaW1pdCArIGxlZnRDZWxsLndpZHRoIC8gMgorCQkJCQkJKyB0aGlzLmludHJhQ2VsbFNwYWNpbmcgKyBjZWxsLndpZHRoIC8gMjsKKworCQkJCWlmIChsZWZ0TGltaXQgPCBjZWxsTWVkaWFuKQorCQkJCXsKKwkJCQkJY2VsbC5zZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKHJhbmtWYWx1ZSwgY2VsbE1lZGlhbik7CisJCQkJCXBvc2l0aW9uQ2hhbmdlZCA9IHRydWU7CisJCQkJfQorCQkJCWVsc2UgaWYgKGxlZnRMaW1pdCA8IGNlbGwKKwkJCQkJCS5nZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKHJhbmtWYWx1ZSkKKwkJCQkJCS0gdG9sZXJhbmNlKQorCQkJCXsKKwkJCQkJY2VsbC5zZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKHJhbmtWYWx1ZSwgbGVmdExpbWl0KTsKKwkJCQkJcG9zaXRpb25DaGFuZ2VkID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoY2VsbE1lZGlhbiA+IGN1cnJlbnRQb3NpdGlvbiArIHRvbGVyYW5jZSkKKwkJeworCQkJdmFyIHJhbmtTaXplID0gcmFua1tyYW5rVmFsdWVdLmxlbmd0aDsKKwkJCQorCQkJaWYgKHJhbmtJbmRleCA9PSByYW5rU2l6ZSAtIDEpCisJCQl7CisJCQkJY2VsbC5zZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKHJhbmtWYWx1ZSwgY2VsbE1lZGlhbik7CisJCQkJcG9zaXRpb25DaGFuZ2VkID0gdHJ1ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl2YXIgcmlnaHRDZWxsID0gcmFua1tyYW5rVmFsdWVdW3JhbmtJbmRleCArIDFdOworCQkJCXZhciByaWdodExpbWl0ID0gcmlnaHRDZWxsCisJCQkJCQkuZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShyYW5rVmFsdWUpOworCQkJCXJpZ2h0TGltaXQgPSByaWdodExpbWl0IC0gcmlnaHRDZWxsLndpZHRoIC8gMgorCQkJCQkJLSB0aGlzLmludHJhQ2VsbFNwYWNpbmcgLSBjZWxsLndpZHRoIC8gMjsKKwkJCQkKKwkJCQlpZiAocmlnaHRMaW1pdCA+IGNlbGxNZWRpYW4pCisJCQkJeworCQkJCQljZWxsLnNldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUocmFua1ZhbHVlLCBjZWxsTWVkaWFuKTsKKwkJCQkJcG9zaXRpb25DaGFuZ2VkID0gdHJ1ZTsKKwkJCQl9CisJCQkJZWxzZSBpZiAocmlnaHRMaW1pdCA+IGNlbGwKKwkJCQkJCS5nZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKHJhbmtWYWx1ZSkKKwkJCQkJCSsgdG9sZXJhbmNlKQorCQkJCXsKKwkJCQkJY2VsbC5zZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKHJhbmtWYWx1ZSwgcmlnaHRMaW1pdCk7CisJCQkJCXBvc2l0aW9uQ2hhbmdlZCA9IHRydWU7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlpZiAocG9zaXRpb25DaGFuZ2VkKQorCQl7CisJCQkvLyBBZGQgY29ubmVjdGVkIG5vZGVzIHRvIG1hcCBhbmQgbGlzdAorCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBuZXh0TGF5ZXJDb25uZWN0ZWRDZWxscy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQl2YXIgY29ubmVjdGVkQ2VsbCA9IG5leHRMYXllckNvbm5lY3RlZENlbGxzW2ldOworCQkJCXZhciBjb25uZWN0ZWRDZWxsV3JhcHBlciA9IG1hcC5nZXQoY29ubmVjdGVkQ2VsbCk7CisJCQkJCisJCQkJaWYgKGNvbm5lY3RlZENlbGxXcmFwcGVyICE9IG51bGwpCisJCQkJeworCQkJCQlpZiAoY29ubmVjdGVkQ2VsbFdyYXBwZXIudmlzaXRlZCA9PSBmYWxzZSkKKwkJCQkJeworCQkJCQkJY29ubmVjdGVkQ2VsbFdyYXBwZXIudmlzaXRlZCA9IHRydWU7CisJCQkJCQlub2RlTGlzdC5wdXNoKGNvbm5lY3RlZENlbGxXcmFwcGVyKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLy8gQWRkIGNvbm5lY3RlZCBub2RlcyB0byBtYXAgYW5kIGxpc3QKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgcHJldmlvdXNMYXllckNvbm5lY3RlZENlbGxzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCXZhciBjb25uZWN0ZWRDZWxsID0gcHJldmlvdXNMYXllckNvbm5lY3RlZENlbGxzW2ldOworCQkJCXZhciBjb25uZWN0ZWRDZWxsV3JhcHBlciA9IG1hcC5nZXQoY29ubmVjdGVkQ2VsbCk7CisKKwkJCQlpZiAoY29ubmVjdGVkQ2VsbFdyYXBwZXIgIT0gbnVsbCkKKwkJCQl7CisJCQkJCWlmIChjb25uZWN0ZWRDZWxsV3JhcHBlci52aXNpdGVkID09IGZhbHNlKQorCQkJCQl7CisJCQkJCQljb25uZWN0ZWRDZWxsV3JhcHBlci52aXNpdGVkID0gdHJ1ZTsKKwkJCQkJCW5vZGVMaXN0LnB1c2goY29ubmVjdGVkQ2VsbFdyYXBwZXIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCQorCQljZWxsV3JhcHBlci52aXNpdGVkID0gZmFsc2U7CisJCWNvdW50Kys7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogbWVkaWFuUG9zCisgKiAKKyAqIFBlcmZvcm1zIG9uZSBtZWRpYW4gcG9zaXRpb25pbmcgc3dlZXAgaW4gb25lIGRpcmVjdGlvbgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBpIC0gdGhlIGl0ZXJhdGlvbiBvZiB0aGUgd2hvbGUgcHJvY2VzcworICogbW9kZWwgLSBhbiBpbnRlcm5hbCBtb2RlbCBvZiB0aGUgaGllcmFyY2hpY2FsIGxheW91dAorICovCitteENvb3JkaW5hdGVBc3NpZ25tZW50LnByb3RvdHlwZS5tZWRpYW5Qb3MgPSBmdW5jdGlvbihpLCBtb2RlbCkKK3sKKwkvLyBSZXZlcnNlIHN3ZWVwIGRpcmVjdGlvbiBlYWNoIHRpbWUgdGhyb3VnaCB0aGlzIG1ldGhvZAorCXZhciBkb3dud2FyZFN3ZWVwID0gKGkgJSAyID09IDApOworCQorCWlmIChkb3dud2FyZFN3ZWVwKQorCXsKKwkJZm9yICh2YXIgaiA9IG1vZGVsLm1heFJhbms7IGogPiAwOyBqLS0pCisJCXsKKwkJCXRoaXMucmFua01lZGlhblBvc2l0aW9uKGogLSAxLCBtb2RlbCwgaik7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJZm9yICh2YXIgaiA9IDA7IGogPCBtb2RlbC5tYXhSYW5rIC0gMTsgaisrKQorCQl7CisJCQl0aGlzLnJhbmtNZWRpYW5Qb3NpdGlvbihqICsgMSwgbW9kZWwsIGopOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmFua01lZGlhblBvc2l0aW9uCisgKiAKKyAqIFBlcmZvcm1zIG1lZGlhbiBtaW5pbWlzYXRpb24gb3ZlciBvbmUgcmFuay4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogcmFua1ZhbHVlIC0gdGhlIGxheWVyIG51bWJlciBvZiB0aGlzIHJhbmsKKyAqIG1vZGVsIC0gYW4gaW50ZXJuYWwgbW9kZWwgb2YgdGhlIGhpZXJhcmNoaWNhbCBsYXlvdXQKKyAqIG5leHRSYW5rVmFsdWUgLSB0aGUgbGF5ZXIgbnVtYmVyIHdob3NlIGNvbm5lY3RlZCBjZWxzIGFyZSB0byBiZSBsYWlkIG91dAorICogcmVsYXRpdmUgdG8KKyAqLworbXhDb29yZGluYXRlQXNzaWdubWVudC5wcm90b3R5cGUucmFua01lZGlhblBvc2l0aW9uID0gZnVuY3Rpb24ocmFua1ZhbHVlLCBtb2RlbCwgbmV4dFJhbmtWYWx1ZSkKK3sKKwl2YXIgcmFuayA9IG1vZGVsLnJhbmtzW3JhbmtWYWx1ZV07CisKKwkvLyBGb3JtIGFuIGFycmF5IG9mIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgY2VsbCBhcmUgdG8gYmUgcHJvY2Vzc2VkCisJLy8gLCB0aGUgb3JkZXIgaXMgZ2l2ZW4gYnkgdGhlIHdlaWdodGVkIHN1bSBvZiB0aGUgaW4gb3Igb3V0IGVkZ2VzLAorCS8vIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlJ3JlIHRyYXZlbGluZyB1cCBvciBkb3duIHRoZSBoaWVyYXJjaHkuCisJdmFyIHdlaWdodGVkVmFsdWVzID0gW107CisJdmFyIGNlbGxNYXAgPSBuZXcgT2JqZWN0KCk7CisKKwlmb3IgKHZhciBpID0gMDsgaSA8IHJhbmsubGVuZ3RoOyBpKyspCisJeworCQl2YXIgY3VycmVudENlbGwgPSByYW5rW2ldOworCQl3ZWlnaHRlZFZhbHVlc1tpXSA9IG5ldyBXZWlnaHRlZENlbGxTb3J0ZXIoKTsKKwkJd2VpZ2h0ZWRWYWx1ZXNbaV0uY2VsbCA9IGN1cnJlbnRDZWxsOworCQl3ZWlnaHRlZFZhbHVlc1tpXS5yYW5rSW5kZXggPSBpOworCQljZWxsTWFwW2N1cnJlbnRDZWxsLmlkXSA9IHdlaWdodGVkVmFsdWVzW2ldOworCQl2YXIgbmV4dExheWVyQ29ubmVjdGVkQ2VsbHMgPSBudWxsOworCQkKKwkJaWYgKG5leHRSYW5rVmFsdWUgPCByYW5rVmFsdWUpCisJCXsKKwkJCW5leHRMYXllckNvbm5lY3RlZENlbGxzID0gY3VycmVudENlbGwKKwkJCQkJLmdldFByZXZpb3VzTGF5ZXJDb25uZWN0ZWRDZWxscyhyYW5rVmFsdWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJbmV4dExheWVyQ29ubmVjdGVkQ2VsbHMgPSBjdXJyZW50Q2VsbAorCQkJCQkuZ2V0TmV4dExheWVyQ29ubmVjdGVkQ2VsbHMocmFua1ZhbHVlKTsKKwkJfQorCisJCS8vIENhbGN1bGF0ZSB0aGUgd2VpZ2hpbmcgYmFzZWQgb24gdGhpcyBub2RlIHR5cGUgYW5kIHRob3NlIHRoaXMKKwkJLy8gbm9kZSBpcyBjb25uZWN0ZWQgdG8gb24gdGhlIG5leHQgbGF5ZXIKKwkJd2VpZ2h0ZWRWYWx1ZXNbaV0ud2VpZ2h0ZWRWYWx1ZSA9IHRoaXMuY2FsY3VsYXRlZFdlaWdodGVkVmFsdWUoCisJCQkJY3VycmVudENlbGwsIG5leHRMYXllckNvbm5lY3RlZENlbGxzKTsKKwl9CisKKwl3ZWlnaHRlZFZhbHVlcy5zb3J0KFdlaWdodGVkQ2VsbFNvcnRlci5wcm90b3R5cGUuY29tcGFyZSk7CisKKwkvLyBTZXQgdGhlIG5ldyBwb3NpdGlvbiBvZiBlYWNoIG5vZGUgd2l0aGluIHRoZSByYW5rIHVzaW5nCisJLy8gaXRzIHRlbXAgdmFyaWFibGUKKwkKKwlmb3IgKHZhciBpID0gMDsgaSA8IHdlaWdodGVkVmFsdWVzLmxlbmd0aDsgaSsrKQorCXsKKwkJdmFyIG51bUNvbm5lY3Rpb25zTmV4dExldmVsID0gMDsKKwkJdmFyIGNlbGwgPSB3ZWlnaHRlZFZhbHVlc1tpXS5jZWxsOworCQl2YXIgbmV4dExheWVyQ29ubmVjdGVkQ2VsbHMgPSBudWxsOworCQl2YXIgbWVkaWFuTmV4dExldmVsID0gMDsKKworCQlpZiAobmV4dFJhbmtWYWx1ZSA8IHJhbmtWYWx1ZSkKKwkJeworCQkJbmV4dExheWVyQ29ubmVjdGVkQ2VsbHMgPSBjZWxsLmdldFByZXZpb3VzTGF5ZXJDb25uZWN0ZWRDZWxscygKKwkJCQkJcmFua1ZhbHVlKS5zbGljZSgpOworCQl9CisJCWVsc2UKKwkJeworCQkJbmV4dExheWVyQ29ubmVjdGVkQ2VsbHMgPSBjZWxsLmdldE5leHRMYXllckNvbm5lY3RlZENlbGxzKAorCQkJCQlyYW5rVmFsdWUpLnNsaWNlKCk7CisJCX0KKworCQlpZiAobmV4dExheWVyQ29ubmVjdGVkQ2VsbHMgIT0gbnVsbCkKKwkJeworCQkJbnVtQ29ubmVjdGlvbnNOZXh0TGV2ZWwgPSBuZXh0TGF5ZXJDb25uZWN0ZWRDZWxscy5sZW5ndGg7CisJCQkKKwkJCWlmIChudW1Db25uZWN0aW9uc05leHRMZXZlbCA+IDApCisJCQl7CisJCQkJbWVkaWFuTmV4dExldmVsID0gdGhpcy5tZWRpYW5YVmFsdWUobmV4dExheWVyQ29ubmVjdGVkQ2VsbHMsCisJCQkJCQluZXh0UmFua1ZhbHVlKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBGb3IgY2FzZSBvZiBubyBjb25uZWN0aW9ucyBvbiB0aGUgbmV4dCBsZXZlbCBzZXQgdGhlCisJCQkJLy8gbWVkaWFuIHRvIGJlIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCB0cnkgdG8gYmUKKwkJCQkvLyBwb3NpdGlvbmVkIHRoZXJlCisJCQkJbWVkaWFuTmV4dExldmVsID0gY2VsbC5nZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKHJhbmtWYWx1ZSk7CisJCQl9CisJCX0KKworCQl2YXIgbGVmdEJ1ZmZlciA9IDAuMDsKKwkJdmFyIGxlZnRMaW1pdCA9IC0xMDAwMDAwMDAuMDsKKwkJCisJCWZvciAodmFyIGogPSB3ZWlnaHRlZFZhbHVlc1tpXS5yYW5rSW5kZXggLSAxOyBqID49IDA7KQorCQl7CisJCQl2YXIgd2VpZ2h0ZWRWYWx1ZSA9IGNlbGxNYXBbcmFua1tqXS5pZF07CisJCQkKKwkJCWlmICh3ZWlnaHRlZFZhbHVlICE9IG51bGwpCisJCQl7CisJCQkJdmFyIGxlZnRDZWxsID0gd2VpZ2h0ZWRWYWx1ZS5jZWxsOworCQkJCQorCQkJCWlmICh3ZWlnaHRlZFZhbHVlLnZpc2l0ZWQpCisJCQkJeworCQkJCQkvLyBUaGUgbGVmdCBsaW1pdCBpcyB0aGUgcmlnaHQgaGFuZCBsaW1pdCBvZiB0aGF0CisJCQkJCS8vIGNlbGwgcGx1cyBhbnkgYWxsb3dhbmNlIGZvciB1bmFsbG9jYXRlZCBjZWxscworCQkJCQkvLyBpbi1iZXR3ZWVuCisJCQkJCWxlZnRMaW1pdCA9IGxlZnRDZWxsCisJCQkJCQkJLmdldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUocmFua1ZhbHVlKQorCQkJCQkJCSsgbGVmdENlbGwud2lkdGgKKwkJCQkJCQkvIDIuMAorCQkJCQkJCSsgdGhpcy5pbnRyYUNlbGxTcGFjaW5nCisJCQkJCQkJKyBsZWZ0QnVmZmVyICsgY2VsbC53aWR0aCAvIDIuMDsKKwkJCQkJaiA9IC0xOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlsZWZ0QnVmZmVyICs9IGxlZnRDZWxsLndpZHRoICsgdGhpcy5pbnRyYUNlbGxTcGFjaW5nOworCQkJCQlqLS07CisJCQkJfQorCQkJfQorCQl9CisKKwkJdmFyIHJpZ2h0QnVmZmVyID0gMC4wOworCQl2YXIgcmlnaHRMaW1pdCA9IDEwMDAwMDAwMC4wOworCQkKKwkJZm9yICh2YXIgaiA9IHdlaWdodGVkVmFsdWVzW2ldLnJhbmtJbmRleCArIDE7IGogPCB3ZWlnaHRlZFZhbHVlcy5sZW5ndGg7KQorCQl7CisJCQl2YXIgd2VpZ2h0ZWRWYWx1ZSA9IGNlbGxNYXBbcmFua1tqXS5pZF07CisJCQkKKwkJCWlmICh3ZWlnaHRlZFZhbHVlICE9IG51bGwpCisJCQl7CisJCQkJdmFyIHJpZ2h0Q2VsbCA9IHdlaWdodGVkVmFsdWUuY2VsbDsKKwkJCQkKKwkJCQlpZiAod2VpZ2h0ZWRWYWx1ZS52aXNpdGVkKQorCQkJCXsKKwkJCQkJLy8gVGhlIGxlZnQgbGltaXQgaXMgdGhlIHJpZ2h0IGhhbmQgbGltaXQgb2YgdGhhdAorCQkJCQkvLyBjZWxsIHBsdXMgYW55IGFsbG93YW5jZSBmb3IgdW5hbGxvY2F0ZWQgY2VsbHMKKwkJCQkJLy8gaW4tYmV0d2VlbgorCQkJCQlyaWdodExpbWl0ID0gcmlnaHRDZWxsCisJCQkJCQkJLmdldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUocmFua1ZhbHVlKQorCQkJCQkJCS0gcmlnaHRDZWxsLndpZHRoCisJCQkJCQkJLyAyLjAKKwkJCQkJCQktIHRoaXMuaW50cmFDZWxsU3BhY2luZworCQkJCQkJCS0gcmlnaHRCdWZmZXIgLSBjZWxsLndpZHRoIC8gMi4wOworCQkJCQlqID0gd2VpZ2h0ZWRWYWx1ZXMubGVuZ3RoOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyaWdodEJ1ZmZlciArPSByaWdodENlbGwud2lkdGggKyB0aGlzLmludHJhQ2VsbFNwYWNpbmc7CisJCQkJCWorKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCWlmIChtZWRpYW5OZXh0TGV2ZWwgPj0gbGVmdExpbWl0ICYmIG1lZGlhbk5leHRMZXZlbCA8PSByaWdodExpbWl0KQorCQl7CisJCQljZWxsLnNldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUocmFua1ZhbHVlLCBtZWRpYW5OZXh0TGV2ZWwpOworCQl9CisJCWVsc2UgaWYgKG1lZGlhbk5leHRMZXZlbCA8IGxlZnRMaW1pdCkKKwkJeworCQkJLy8gQ291bGRuJ3QgcGxhY2UgYXQgbWVkaWFuIHZhbHVlLCBwbGFjZSBhcyBjbG9zZSB0byB0aGF0CisJCQkvLyB2YWx1ZSBhcyBwb3NzaWJsZQorCQkJY2VsbC5zZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKHJhbmtWYWx1ZSwgbGVmdExpbWl0KTsKKwkJCXRoaXMuY3VycmVudFhEZWx0YSArPSBsZWZ0TGltaXQgLSBtZWRpYW5OZXh0TGV2ZWw7CisJCX0KKwkJZWxzZSBpZiAobWVkaWFuTmV4dExldmVsID4gcmlnaHRMaW1pdCkKKwkJeworCQkJLy8gQ291bGRuJ3QgcGxhY2UgYXQgbWVkaWFuIHZhbHVlLCBwbGFjZSBhcyBjbG9zZSB0byB0aGF0CisJCQkvLyB2YWx1ZSBhcyBwb3NzaWJsZQorCQkJY2VsbC5zZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKHJhbmtWYWx1ZSwgcmlnaHRMaW1pdCk7CisJCQl0aGlzLmN1cnJlbnRYRGVsdGEgKz0gbWVkaWFuTmV4dExldmVsIC0gcmlnaHRMaW1pdDsKKwkJfQorCisJCXdlaWdodGVkVmFsdWVzW2ldLnZpc2l0ZWQgPSB0cnVlOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGNhbGN1bGF0ZWRXZWlnaHRlZFZhbHVlCisgKiAKKyAqIENhbGN1bGF0ZXMgdGhlIHByaW9yaXR5IHRoZSBzcGVjaWZpZWQgY2VsbCBoYXMgYmFzZWQgb24gdGhlIHR5cGUgb2YgaXRzCisgKiBjZWxsIGFuZCB0aGUgY2VsbHMgaXQgaXMgY29ubmVjdGVkIHRvIG9uIHRoZSBuZXh0IGxheWVyCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGN1cnJlbnRDZWxsIC0gdGhlIGNlbGwgd2hvc2Ugd2VpZ2h0IGlzIHRvIGJlIGNhbGN1bGF0ZWQKKyAqIGNvbGxlY3Rpb24gLSB0aGUgY2VsbHMgdGhlIHNwZWNpZmllZCBjZWxsIGlzIGNvbm5lY3RlZCB0bworICovCitteENvb3JkaW5hdGVBc3NpZ25tZW50LnByb3RvdHlwZS5jYWxjdWxhdGVkV2VpZ2h0ZWRWYWx1ZSA9IGZ1bmN0aW9uKGN1cnJlbnRDZWxsLCBjb2xsZWN0aW9uKQoreworCXZhciB0b3RhbFdlaWdodCA9IDA7CisJCisJZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xsZWN0aW9uLmxlbmd0aDsgaSsrKQorCXsKKwkJdmFyIGNlbGwgPSBjb2xsZWN0aW9uW2ldOworCisJCWlmIChjdXJyZW50Q2VsbC5pc1ZlcnRleCgpICYmIGNlbGwuaXNWZXJ0ZXgoKSkKKwkJeworCQkJdG90YWxXZWlnaHQrKzsKKwkJfQorCQllbHNlIGlmIChjdXJyZW50Q2VsbC5pc0VkZ2UoKSAmJiBjZWxsLmlzRWRnZSgpKQorCQl7CisJCQl0b3RhbFdlaWdodCArPSA4OworCQl9CisJCWVsc2UKKwkJeworCQkJdG90YWxXZWlnaHQgKz0gMjsKKwkJfQorCX0KKworCXJldHVybiB0b3RhbFdlaWdodDsKK307CisKKy8qKgorICogRnVuY3Rpb246IG1lZGlhblhWYWx1ZQorICogCisgKiBDYWxjdWxhdGVzIHRoZSBtZWRpYW4gcG9zaXRpb24gb2YgdGhlIGNvbm5lY3RlZCBjZWxsIG9uIHRoZSBzcGVjaWZpZWQKKyAqIHJhbmsKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY29ubmVjdGVkQ2VsbHMgLSB0aGUgY2VsbHMgdGhlIGNhbmRpZGF0ZSBjb25uZWN0cyB0byBvbiB0aGlzIGxldmVsCisgKiByYW5rVmFsdWUgLSB0aGUgbGF5ZXIgbnVtYmVyIG9mIHRoaXMgcmFuaworICovCitteENvb3JkaW5hdGVBc3NpZ25tZW50LnByb3RvdHlwZS5tZWRpYW5YVmFsdWUgPSBmdW5jdGlvbihjb25uZWN0ZWRDZWxscywgcmFua1ZhbHVlKQoreworCWlmIChjb25uZWN0ZWRDZWxscy5sZW5ndGggPT0gMCkKKwl7CisJCXJldHVybiAwOworCX0KKworCXZhciBtZWRpYW5WYWx1ZXMgPSBbXTsKKworCWZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGVkQ2VsbHMubGVuZ3RoOyBpKyspCisJeworCQltZWRpYW5WYWx1ZXNbaV0gPSBjb25uZWN0ZWRDZWxsc1tpXS5nZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKHJhbmtWYWx1ZSk7CisJfQorCisJbWVkaWFuVmFsdWVzLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSAtIGI7fSk7CisJCisJaWYgKGNvbm5lY3RlZENlbGxzLmxlbmd0aCAlIDIgPT0gMSkKKwl7CisJCS8vIEZvciBvZGQgbnVtYmVycyBvZiBhZGphY2VudCB2ZXJ0aWNlcyByZXR1cm4gdGhlIG1lZGlhbgorCQlyZXR1cm4gbWVkaWFuVmFsdWVzW01hdGguZmxvb3IoY29ubmVjdGVkQ2VsbHMubGVuZ3RoIC8gMildOworCX0KKwllbHNlCisJeworCQl2YXIgbWVkaWFuUG9pbnQgPSBjb25uZWN0ZWRDZWxscy5sZW5ndGggLyAyOworCQl2YXIgbGVmdE1lZGlhbiA9IG1lZGlhblZhbHVlc1ttZWRpYW5Qb2ludCAtIDFdOworCQl2YXIgcmlnaHRNZWRpYW4gPSBtZWRpYW5WYWx1ZXNbbWVkaWFuUG9pbnRdOworCisJCXJldHVybiAoKGxlZnRNZWRpYW4gKyByaWdodE1lZGlhbikgLyAyKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbml0aWFsQ29vcmRzCisgKiAKKyAqIFNldHMgdXAgdGhlIGxheW91dCBpbiBhbiBpbml0aWFsIHBvc2l0aW9uaW5nLiBUaGUgcmFua3MgYXJlIGFsbCBjZW50ZXJlZAorICogYXMgbXVjaCBhcyBwb3NzaWJsZSBhbG9uZyB0aGUgbWlkZGxlIHZlcnRleCBpbiBlYWNoIHJhbmsuIFRoZSBvdGhlciBjZWxscworICogYXJlIHRoZW4gcGxhY2VkIGFzIGNsb3NlIGFzIHBvc3NpYmxlIG9uIGVpdGhlciBzaWRlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBmYWNhZGUgLSB0aGUgZmFjYWRlIGRlc2NyaWJpbmcgdGhlIGlucHV0IGdyYXBoCisgKiBtb2RlbCAtIGFuIGludGVybmFsIG1vZGVsIG9mIHRoZSBoaWVyYXJjaGljYWwgbGF5b3V0CisgKi8KK214Q29vcmRpbmF0ZUFzc2lnbm1lbnQucHJvdG90eXBlLmluaXRpYWxDb29yZHMgPSBmdW5jdGlvbihmYWNhZGUsIG1vZGVsKQoreworCXRoaXMuY2FsY3VsYXRlV2lkZXN0UmFuayhmYWNhZGUsIG1vZGVsKTsKKworCS8vIFN3ZWVwIHVwIGFuZCBkb3duIGZyb20gdGhlIHdpZGVzdCByYW5rCisJZm9yICh2YXIgaSA9IHRoaXMud2lkZXN0UmFuazsgaSA+PSAwOyBpLS0pCisJeworCQlpZiAoaSA8IG1vZGVsLm1heFJhbmspCisJCXsKKwkJCXRoaXMucmFua0Nvb3JkaW5hdGVzKGksIGZhY2FkZSwgbW9kZWwpOworCQl9CisJfQorCisJZm9yICh2YXIgaSA9IHRoaXMud2lkZXN0UmFuaysxOyBpIDw9IG1vZGVsLm1heFJhbms7IGkrKykKKwl7CisJCWlmIChpID4gMCkKKwkJeworCQkJdGhpcy5yYW5rQ29vcmRpbmF0ZXMoaSwgZmFjYWRlLCBtb2RlbCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByYW5rQ29vcmRpbmF0ZXMKKyAqIAorICogU2V0cyB1cCB0aGUgbGF5b3V0IGluIGFuIGluaXRpYWwgcG9zaXRpb25pbmcuIEFsbCB0aGUgZmlyc3QgY2VsbHMgaW4gZWFjaAorICogcmFuayBhcmUgbW92ZWQgdG8gdGhlIGxlZnQgYW5kIHRoZSByZXN0IG9mIHRoZSByYW5rIGluc2VydGVkIGFzIGNsb3NlCisgKiB0b2dldGhlciBhcyB0aGVpciBzaXplIGFuZCBidWZmZXJpbmcgcGVybWl0cy4gVGhpcyBtZXRob2Qgd29ya3Mgb24ganVzdAorICogdGhlIHNwZWNpZmllZCByYW5rLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiByYW5rVmFsdWUgLSB0aGUgY3VycmVudCByYW5rIGJlaW5nIHByb2Nlc3NlZAorICogZ3JhcGggLSB0aGUgZmFjYWRlIGRlc2NyaWJpbmcgdGhlIGlucHV0IGdyYXBoCisgKiBtb2RlbCAtIGFuIGludGVybmFsIG1vZGVsIG9mIHRoZSBoaWVyYXJjaGljYWwgbGF5b3V0CisgKi8KK214Q29vcmRpbmF0ZUFzc2lnbm1lbnQucHJvdG90eXBlLnJhbmtDb29yZGluYXRlcyA9IGZ1bmN0aW9uKHJhbmtWYWx1ZSwgZ3JhcGgsIG1vZGVsKQoreworCXZhciByYW5rID0gbW9kZWwucmFua3NbcmFua1ZhbHVlXTsKKwl2YXIgbWF4WSA9IDAuMDsKKwl2YXIgbG9jYWxYID0gdGhpcy5pbml0aWFsWCArICh0aGlzLndpZGVzdFJhbmtWYWx1ZSAtIHRoaXMucmFua1dpZHRoc1tyYW5rVmFsdWVdKQorCQkJLyAyOworCisJLy8gU3RvcmUgd2hldGhlciBvciBub3QgYW55IG9mIHRoZSBjZWxscycgYm91bmRzIHdlcmUgdW5hdmFpbGFibGUgc28KKwkvLyB0byBvbmx5IGlzc3VlIHRoZSB3YXJuaW5nIG9uY2UgZm9yIGFsbCBjZWxscworCXZhciBib3VuZHNXYXJuaW5nID0gZmFsc2U7CisJCisJZm9yICh2YXIgaSA9IDA7IGkgPCByYW5rLmxlbmd0aDsgaSsrKQorCXsKKwkJdmFyIG5vZGUgPSByYW5rW2ldOworCQkKKwkJaWYgKG5vZGUuaXNWZXJ0ZXgoKSkKKwkJeworCQkJdmFyIGJvdW5kcyA9IHRoaXMubGF5b3V0LmdldFZlcnRleEJvdW5kcyhub2RlLmNlbGwpOworCisJCQlpZiAoYm91bmRzICE9IG51bGwpCisJCQl7CisJCQkJaWYgKHRoaXMub3JpZW50YXRpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX05PUlRIIHx8CisJCQkJCXRoaXMub3JpZW50YXRpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX1NPVVRIKQorCQkJCXsKKwkJCQkJbm9kZS53aWR0aCA9IGJvdW5kcy53aWR0aDsKKwkJCQkJbm9kZS5oZWlnaHQgPSBib3VuZHMuaGVpZ2h0OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlub2RlLndpZHRoID0gYm91bmRzLmhlaWdodDsKKwkJCQkJbm9kZS5oZWlnaHQgPSBib3VuZHMud2lkdGg7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWJvdW5kc1dhcm5pbmcgPSB0cnVlOworCQkJfQorCisJCQltYXhZID0gTWF0aC5tYXgobWF4WSwgbm9kZS5oZWlnaHQpOworCQl9CisJCWVsc2UgaWYgKG5vZGUuaXNFZGdlKCkpCisJCXsKKwkJCS8vIFRoZSB3aWR0aCBpcyB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgcGFyYWxsZWwgZWRnZXMKKwkJCS8vIHRpbWUgdGhlIHBhcmFsbGVsIGVkZ2Ugc3BhY2luZworCQkJdmFyIG51bUVkZ2VzID0gMTsKKworCQkJaWYgKG5vZGUuZWRnZXMgIT0gbnVsbCkKKwkJCXsKKwkJCQludW1FZGdlcyA9IG5vZGUuZWRnZXMubGVuZ3RoOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW14TG9nLndhcm4oJ2VkZ2UuZWRnZXMgaXMgbnVsbCcpOworCQkJfQorCisJCQlub2RlLndpZHRoID0gKG51bUVkZ2VzIC0gMSkgKiB0aGlzLnBhcmFsbGVsRWRnZVNwYWNpbmc7CisJCX0KKworCQkvLyBTZXQgdGhlIGluaXRpYWwgeC12YWx1ZSBhcyBiZWluZyB0aGUgYmVzdCByZXN1bHQgc28gZmFyCisJCWxvY2FsWCArPSBub2RlLndpZHRoIC8gMi4wOworCQlub2RlLnNldFgocmFua1ZhbHVlLCBsb2NhbFgpOworCQlub2RlLnNldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUocmFua1ZhbHVlLCBsb2NhbFgpOworCQlsb2NhbFggKz0gbm9kZS53aWR0aCAvIDIuMDsKKwkJbG9jYWxYICs9IHRoaXMuaW50cmFDZWxsU3BhY2luZzsKKwl9CisKKwlpZiAoYm91bmRzV2FybmluZyA9PSB0cnVlKQorCXsKKwkJbXhMb2cud2FybignQXQgbGVhc3Qgb25lIGNlbGwgaGFzIG5vIGJvdW5kcycpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGNhbGN1bGF0ZVdpZGVzdFJhbmsKKyAqIAorICogQ2FsY3VsYXRlcyB0aGUgd2lkdGggcmFuayBpbiB0aGUgaGllcmFyY2h5LiBBbHNvIHNldCB0aGUgeSB2YWx1ZSBvZiBlYWNoCisgKiByYW5rIHdoaWxzdCBwZXJmb3JtaW5nIHRoZSBjYWxjdWxhdGlvbgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBncmFwaCAtIHRoZSBmYWNhZGUgZGVzY3JpYmluZyB0aGUgaW5wdXQgZ3JhcGgKKyAqIG1vZGVsIC0gYW4gaW50ZXJuYWwgbW9kZWwgb2YgdGhlIGhpZXJhcmNoaWNhbCBsYXlvdXQKKyAqLworbXhDb29yZGluYXRlQXNzaWdubWVudC5wcm90b3R5cGUuY2FsY3VsYXRlV2lkZXN0UmFuayA9IGZ1bmN0aW9uKGdyYXBoLCBtb2RlbCkKK3sKKwkvLyBTdGFydGluZyB5IGNvLW9yZGluYXRlCisJdmFyIHkgPSAtdGhpcy5pbnRlclJhbmtDZWxsU3BhY2luZzsKKwkKKwkvLyBUcmFjayB0aGUgd2lkZXN0IGNlbGwgb24gdGhlIGxhc3QgcmFuayBzaW5jZSB0aGUgeQorCS8vIGRpZmZlcmVuY2UgZGVwZW5kcyBvbiBpdAorCXZhciBsYXN0UmFua01heENlbGxIZWlnaHQgPSAwLjA7CisJdGhpcy5yYW5rV2lkdGhzID0gW107CisJdGhpcy5yYW5rWSA9IFtdOworCisJZm9yICh2YXIgcmFua1ZhbHVlID0gbW9kZWwubWF4UmFuazsgcmFua1ZhbHVlID49IDA7IHJhbmtWYWx1ZS0tKQorCXsKKwkJLy8gS2VlcCB0cmFjayBvZiB0aGUgd2lkZXN0IGNlbGwgb24gdGhpcyByYW5rCisJCXZhciBtYXhDZWxsSGVpZ2h0ID0gMC4wOworCQl2YXIgcmFuayA9IG1vZGVsLnJhbmtzW3JhbmtWYWx1ZV07CisJCXZhciBsb2NhbFggPSB0aGlzLmluaXRpYWxYOworCisJCS8vIFN0b3JlIHdoZXRoZXIgb3Igbm90IGFueSBvZiB0aGUgY2VsbHMnIGJvdW5kcyB3ZXJlIHVuYXZhaWxhYmxlIHNvCisJCS8vIHRvIG9ubHkgaXNzdWUgdGhlIHdhcm5pbmcgb25jZSBmb3IgYWxsIGNlbGxzCisJCXZhciBib3VuZHNXYXJuaW5nID0gZmFsc2U7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IHJhbmsubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBub2RlID0gcmFua1tpXTsKKworCQkJaWYgKG5vZGUuaXNWZXJ0ZXgoKSkKKwkJCXsKKwkJCQl2YXIgYm91bmRzID0gdGhpcy5sYXlvdXQuZ2V0VmVydGV4Qm91bmRzKG5vZGUuY2VsbCk7CisKKwkJCQlpZiAoYm91bmRzICE9IG51bGwpCisJCQkJeworCQkJCQlpZiAodGhpcy5vcmllbnRhdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEggfHwKKwkJCQkJCXRoaXMub3JpZW50YXRpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX1NPVVRIKQorCQkJCQl7CisJCQkJCQlub2RlLndpZHRoID0gYm91bmRzLndpZHRoOworCQkJCQkJbm9kZS5oZWlnaHQgPSBib3VuZHMuaGVpZ2h0OworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJbm9kZS53aWR0aCA9IGJvdW5kcy5oZWlnaHQ7CisJCQkJCQlub2RlLmhlaWdodCA9IGJvdW5kcy53aWR0aDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlib3VuZHNXYXJuaW5nID0gdHJ1ZTsKKwkJCQl9CisKKwkJCQltYXhDZWxsSGVpZ2h0ID0gTWF0aC5tYXgobWF4Q2VsbEhlaWdodCwgbm9kZS5oZWlnaHQpOworCQkJfQorCQkJZWxzZSBpZiAobm9kZS5pc0VkZ2UoKSkKKwkJCXsKKwkJCQkvLyBUaGUgd2lkdGggaXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHBhcmFsbGVsIGVkZ2VzCisJCQkJLy8gdGltZSB0aGUgcGFyYWxsZWwgZWRnZSBzcGFjaW5nCisJCQkJdmFyIG51bUVkZ2VzID0gMTsKKworCQkJCWlmIChub2RlLmVkZ2VzICE9IG51bGwpCisJCQkJeworCQkJCQludW1FZGdlcyA9IG5vZGUuZWRnZXMubGVuZ3RoOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlteExvZy53YXJuKCdlZGdlLmVkZ2VzIGlzIG51bGwnKTsKKwkJCQl9CisKKwkJCQlub2RlLndpZHRoID0gKG51bUVkZ2VzIC0gMSkgKiB0aGlzLnBhcmFsbGVsRWRnZVNwYWNpbmc7CisJCQl9CisKKwkJCS8vIFNldCB0aGUgaW5pdGlhbCB4LXZhbHVlIGFzIGJlaW5nIHRoZSBiZXN0IHJlc3VsdCBzbyBmYXIKKwkJCWxvY2FsWCArPSBub2RlLndpZHRoIC8gMi4wOworCQkJbm9kZS5zZXRYKHJhbmtWYWx1ZSwgbG9jYWxYKTsKKwkJCW5vZGUuc2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShyYW5rVmFsdWUsIGxvY2FsWCk7CisJCQlsb2NhbFggKz0gbm9kZS53aWR0aCAvIDIuMDsKKwkJCWxvY2FsWCArPSB0aGlzLmludHJhQ2VsbFNwYWNpbmc7CisKKwkJCWlmIChsb2NhbFggPiB0aGlzLndpZGVzdFJhbmtWYWx1ZSkKKwkJCXsKKwkJCQl0aGlzLndpZGVzdFJhbmtWYWx1ZSA9IGxvY2FsWDsKKwkJCQl0aGlzLndpZGVzdFJhbmsgPSByYW5rVmFsdWU7CisJCQl9CisKKwkJCXRoaXMucmFua1dpZHRoc1tyYW5rVmFsdWVdID0gbG9jYWxYOworCQl9CisKKwkJaWYgKGJvdW5kc1dhcm5pbmcgPT0gdHJ1ZSkKKwkJeworCQkJbXhMb2cud2FybignQXQgbGVhc3Qgb25lIGNlbGwgaGFzIG5vIGJvdW5kcycpOworCQl9CisKKwkJdGhpcy5yYW5rWVtyYW5rVmFsdWVdID0geTsKKwkJdmFyIGRpc3RhbmNlVG9OZXh0UmFuayA9IG1heENlbGxIZWlnaHQgLyAyLjAKKwkJCQkrIGxhc3RSYW5rTWF4Q2VsbEhlaWdodCAvIDIuMCArIHRoaXMuaW50ZXJSYW5rQ2VsbFNwYWNpbmc7CisJCWxhc3RSYW5rTWF4Q2VsbEhlaWdodCA9IG1heENlbGxIZWlnaHQ7CisKKwkJaWYgKHRoaXMub3JpZW50YXRpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX05PUlRIIHx8CisJCQl0aGlzLm9yaWVudGF0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9XRVNUKQorCQl7CisJCQl5ICs9IGRpc3RhbmNlVG9OZXh0UmFuazsKKwkJfQorCQllbHNlCisJCXsKKwkJCXkgLT0gZGlzdGFuY2VUb05leHRSYW5rOworCQl9CisKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCByYW5rLmxlbmd0aDsgaSsrKQorCQl7CisJCQl2YXIgY2VsbCA9IHJhbmtbaV07CisJCQljZWxsLnNldFkocmFua1ZhbHVlLCB5KTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IG1pblBhdGgKKyAqIAorICogU3RyYWlnaHRlbnMgb3V0IGNoYWlucyBvZiB2aXJ0dWFsIG5vZGVzIHdoZXJlIHBvc3NpYmxlYWNhZGUgdG8gdGhvc2Ugc3RvcmVkIGFmdGVyIHRoaXMgbGF5b3V0CisgKiBwcm9jZXNzaW5nIHN0ZXAgaGFzIGNvbXBsZXRlZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqCisgKiBncmFwaCAtIHRoZSBmYWNhZGUgZGVzY3JpYmluZyB0aGUgaW5wdXQgZ3JhcGgKKyAqIG1vZGVsIC0gYW4gaW50ZXJuYWwgbW9kZWwgb2YgdGhlIGhpZXJhcmNoaWNhbCBsYXlvdXQKKyAqLworbXhDb29yZGluYXRlQXNzaWdubWVudC5wcm90b3R5cGUubWluUGF0aCA9IGZ1bmN0aW9uKGdyYXBoLCBtb2RlbCkKK3sKKwkvLyBXb3JrIGRvd24gYW5kIHVwIGVhY2ggZWRnZSB3aXRoIGF0IGxlYXN0IDIgY29udHJvbCBwb2ludHMKKwkvLyB0cnlpbmcgdG8gc3RyYWlnaHRlbiBlYWNoIG9uZSBvdXQuIElmIHRoZSBzYW1lIG51bWJlciBvZgorCS8vIHN0cmFpZ2h0IHNlZ21lbnRzIGFyZSBmb3JtZWQgaW4gYm90aCBkaXJlY3Rpb25zLCB0aGUgCisJLy8gcHJlZmVycmVkIGRpcmVjdGlvbiB1c2VkIGlzIHRoZSBvbmUgd2hlcmUgdGhlIGZpbmFsCisJLy8gY29udHJvbCBwb2ludHMgaGF2ZSB0aGUgbGVhc3Qgb2Zmc2V0IGZyb20gdGhlIGNvbm5lY3RhYmxlIAorCS8vIHJlZ2lvbiBvZiB0aGUgdGVybWluYXRpbmcgdmVydGljZXMKKwl2YXIgZWRnZXMgPSBtb2RlbC5lZGdlTWFwcGVyLmdldFZhbHVlcygpOworCQorCWZvciAodmFyIGogPSAwOyBqIDwgZWRnZXMubGVuZ3RoOyBqKyspCisJeworCQl2YXIgY2VsbCA9IGVkZ2VzW2pdOworCQkKKwkJaWYgKGNlbGwubWF4UmFuayAtIGNlbGwubWluUmFuayAtIDEgPCAxKQorCQl7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8vIEF0IGxlYXN0IHR3byB2aXJ0dWFsIG5vZGVzIGluIHRoZSBlZGdlCisJCS8vIENoZWNrIGZpcnN0IHdoZXRoZXIgdGhlIGVkZ2UgaXMgYWxyZWFkeSBzdHJhaWdodAorCQl2YXIgcmVmZXJlbmNlWCA9IGNlbGwKKwkJCQkuZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShjZWxsLm1pblJhbmsgKyAxKTsKKwkJdmFyIGVkZ2VTdHJhaWdodCA9IHRydWU7CisJCXZhciByZWZTZWdDb3VudCA9IDA7CisJCQorCQlmb3IgKHZhciBpID0gY2VsbC5taW5SYW5rICsgMjsgaSA8IGNlbGwubWF4UmFuazsgaSsrKQorCQl7CisJCQl2YXIgeCA9IGNlbGwuZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShpKTsKKworCQkJaWYgKHJlZmVyZW5jZVggIT0geCkKKwkJCXsKKwkJCQllZGdlU3RyYWlnaHQgPSBmYWxzZTsKKwkJCQlyZWZlcmVuY2VYID0geDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZWZTZWdDb3VudCsrOworCQkJfQorCQl9CisKKwkJaWYgKCFlZGdlU3RyYWlnaHQpCisJCXsKKwkJCXZhciB1cFNlZ0NvdW50ID0gMDsKKwkJCXZhciBkb3duU2VnQ291bnQgPSAwOworCQkJdmFyIHVwWFBvc2l0aW9ucyA9IFtdOworCQkJdmFyIGRvd25YUG9zaXRpb25zID0gW107CisKKwkJCXZhciBjdXJyZW50WCA9IGNlbGwuZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShjZWxsLm1pblJhbmsgKyAxKTsKKworCQkJZm9yICh2YXIgaSA9IGNlbGwubWluUmFuayArIDE7IGkgPCBjZWxsLm1heFJhbmsgLSAxOyBpKyspCisJCQl7CisJCQkJLy8gQXR0ZW1wdCB0byBzdHJhaWdodCBvdXQgdGhlIGNvbnRyb2wgcG9pbnQgb24gdGhlCisJCQkJLy8gbmV4dCBzZWdtZW50IHVwIHdpdGggdGhlIGN1cnJlbnQgY29udHJvbCBwb2ludC4KKwkJCQl2YXIgbmV4dFggPSBjZWxsLmdldFgoaSArIDEpOworCisJCQkJaWYgKGN1cnJlbnRYID09IG5leHRYKQorCQkJCXsKKwkJCQkJdXBYUG9zaXRpb25zW2kgLSBjZWxsLm1pblJhbmsgLSAxXSA9IGN1cnJlbnRYOworCQkJCQl1cFNlZ0NvdW50Kys7CisJCQkJfQorCQkJCWVsc2UgaWYgKHRoaXMucmVwb3NpdGlvblZhbGlkKG1vZGVsLCBjZWxsLCBpICsgMSwgY3VycmVudFgpKQorCQkJCXsKKwkJCQkJdXBYUG9zaXRpb25zW2kgLSBjZWxsLm1pblJhbmsgLSAxXSA9IGN1cnJlbnRYOworCQkJCQl1cFNlZ0NvdW50Kys7CisJCQkJCS8vIExlYXZlIGN1cnJlbnRYIGF0IHNhbWUgdmFsdWUKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdXBYUG9zaXRpb25zW2kgLSBjZWxsLm1pblJhbmsgLSAxXSA9IG5leHRYOworCQkJCQljdXJyZW50WCA9IG5leHRYOworCQkJCX0JCQkJCisJCQl9CisKKwkJCWN1cnJlbnRYID0gY2VsbC5nZXRYKGkpOworCisJCQlmb3IgKHZhciBpID0gY2VsbC5tYXhSYW5rIC0gMTsgaSA+IGNlbGwubWluUmFuayArIDE7IGktLSkKKwkJCXsKKwkJCQkvLyBBdHRlbXB0IHRvIHN0cmFpZ2h0IG91dCB0aGUgY29udHJvbCBwb2ludCBvbiB0aGUKKwkJCQkvLyBuZXh0IHNlZ21lbnQgZG93biB3aXRoIHRoZSBjdXJyZW50IGNvbnRyb2wgcG9pbnQuCisJCQkJdmFyIG5leHRYID0gY2VsbC5nZXRYKGkgLSAxKTsKKworCQkJCWlmIChjdXJyZW50WCA9PSBuZXh0WCkKKwkJCQl7CisJCQkJCWRvd25YUG9zaXRpb25zW2kgLSBjZWxsLm1pblJhbmsgLSAyXSA9IGN1cnJlbnRYOworCQkJCQlkb3duU2VnQ291bnQrKzsKKwkJCQl9CisJCQkJZWxzZSBpZiAodGhpcy5yZXBvc2l0aW9uVmFsaWQobW9kZWwsIGNlbGwsIGkgLSAxLCBjdXJyZW50WCkpCisJCQkJeworCQkJCQlkb3duWFBvc2l0aW9uc1tpIC0gY2VsbC5taW5SYW5rIC0gMl0gPSBjdXJyZW50WDsKKwkJCQkJZG93blNlZ0NvdW50Kys7CisJCQkJCS8vIExlYXZlIGN1cnJlbnRYIGF0IHNhbWUgdmFsdWUKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZG93blhQb3NpdGlvbnNbaSAtIGNlbGwubWluUmFuayAtIDJdID0gY2VsbC5nZXRYKGktMSk7CisJCQkJCWN1cnJlbnRYID0gbmV4dFg7CisJCQkJfQorCQkJfQorCisJCQlpZiAoZG93blNlZ0NvdW50ID4gcmVmU2VnQ291bnQgfHwgdXBTZWdDb3VudCA+IHJlZlNlZ0NvdW50KQorCQkJeworCQkJCWlmIChkb3duU2VnQ291bnQgPj0gdXBTZWdDb3VudCkKKwkJCQl7CisJCQkJCS8vIEFwcGx5IGRvd24gY2FsY3VsYXRpb24gdmFsdWVzCisJCQkJCWZvciAodmFyIGkgPSBjZWxsLm1heFJhbmsgLSAyOyBpID4gY2VsbC5taW5SYW5rOyBpLS0pCisJCQkJCXsKKwkJCQkJCWNlbGwuc2V0WChpLCBkb3duWFBvc2l0aW9uc1tpIC0gY2VsbC5taW5SYW5rIC0gMV0pOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHVwU2VnQ291bnQgPiBkb3duU2VnQ291bnQpCisJCQkJeworCQkJCQkvLyBBcHBseSB1cCBjYWxjdWxhdGlvbiB2YWx1ZXMKKwkJCQkJZm9yICh2YXIgaSA9IGNlbGwubWluUmFuayArIDI7IGkgPCBjZWxsLm1heFJhbms7IGkrKykKKwkJCQkJeworCQkJCQkJY2VsbC5zZXRYKGksIHVwWFBvc2l0aW9uc1tpIC0gY2VsbC5taW5SYW5rIC0gMl0pOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8vIE5laXRoZXIgZGlyZWN0aW9uIHByb3ZpZGVkIGEgZmF2b3VyYWJsZSByZXN1bHQKKwkJCQkJLy8gQnV0IGJvdGggY2FsY3VsYXRpb25zIGFyZSBiZXR0ZXIgdGhhbiB0aGUKKwkJCQkJLy8gZXhpc3Rpbmcgc29sdXRpb24sIHNvIGFwcGx5IHRoZSBvbmUgd2l0aCBtaW5pbWFsCisJCQkJCS8vIG9mZnNldCB0byBhdHRhY2hlZCB2ZXJ0aWNlcyBhdCBlaXRoZXIgZW5kLgorCQkJCX0KKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJlcG9zaXRpb25WYWxpZAorICogCisgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGEgbm9kZSBtYXkgYmUgbW92ZWQgdG8gdGhlIHNwZWNpZmllZCB4IAorICogcG9zaXRpb24gb24gdGhlIHNwZWNpZmllZCByYW5rCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKgorICogbW9kZWwgLSB0aGUgbGF5b3V0IG1vZGVsCisgKiBjZWxsIC0gdGhlIGNlbGwgYmVpbmcgYW5hbHlzZWQKKyAqIHJhbmsgLSB0aGUgbGF5ZXIgb2YgdGhlIGNlbGwKKyAqIHBvc2l0aW9uIC0gdGhlIHggcG9zaXRpb24gYmVpbmcgc291Z2h0CisgKi8KK214Q29vcmRpbmF0ZUFzc2lnbm1lbnQucHJvdG90eXBlLnJlcG9zaXRpb25WYWxpZCA9IGZ1bmN0aW9uKG1vZGVsLCBjZWxsLCByYW5rLCBwb3NpdGlvbikKK3sKKwl2YXIgcmFua0FycmF5ID0gbW9kZWwucmFua3NbcmFua107CisJdmFyIHJhbmtJbmRleCA9IC0xOworCisJZm9yICh2YXIgaSA9IDA7IGkgPCByYW5rQXJyYXkubGVuZ3RoOyBpKyspCisJeworCQlpZiAoY2VsbCA9PSByYW5rQXJyYXlbaV0pCisJCXsKKwkJCXJhbmtJbmRleCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChyYW5rSW5kZXggPCAwKQorCXsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXZhciBjdXJyZW50WCA9IGNlbGwuZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShyYW5rKTsKKworCWlmIChwb3NpdGlvbiA8IGN1cnJlbnRYKQorCXsKKwkJLy8gVHJ5aW5nIHRvIG1vdmUgbm9kZSB0byB0aGUgbGVmdC4KKwkJaWYgKHJhbmtJbmRleCA9PSAwKQorCQl7CisJCQkvLyBMZWZ0LW1vc3Qgbm9kZSwgY2FuIG1vdmUgYW55d2hlcmUKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJdmFyIGxlZnRDZWxsID0gcmFua0FycmF5W3JhbmtJbmRleCAtIDFdOworCQl2YXIgbGVmdExpbWl0ID0gbGVmdENlbGwuZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShyYW5rKTsKKwkJbGVmdExpbWl0ID0gbGVmdExpbWl0ICsgbGVmdENlbGwud2lkdGggLyAyCisJCQkJKyB0aGlzLmludHJhQ2VsbFNwYWNpbmcgKyBjZWxsLndpZHRoIC8gMjsKKworCQlpZiAobGVmdExpbWl0IDw9IHBvc2l0aW9uKQorCQl7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwllbHNlIGlmIChwb3NpdGlvbiA+IGN1cnJlbnRYKQorCXsKKwkJLy8gVHJ5aW5nIHRvIG1vdmUgbm9kZSB0byB0aGUgcmlnaHQuCisJCWlmIChyYW5rSW5kZXggPT0gcmFua0FycmF5Lmxlbmd0aCAtIDEpCisJCXsKKwkJCS8vIFJpZ2h0LW1vc3Qgbm9kZSwgY2FuIG1vdmUgYW55d2hlcmUKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJdmFyIHJpZ2h0Q2VsbCA9IHJhbmtBcnJheVtyYW5rSW5kZXggKyAxXTsKKwkJdmFyIHJpZ2h0TGltaXQgPSByaWdodENlbGwuZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShyYW5rKTsKKwkJcmlnaHRMaW1pdCA9IHJpZ2h0TGltaXQgLSByaWdodENlbGwud2lkdGggLyAyCisJCQkJLSB0aGlzLmludHJhQ2VsbFNwYWNpbmcgLSBjZWxsLndpZHRoIC8gMjsKKworCQlpZiAocmlnaHRMaW1pdCA+PSBwb3NpdGlvbikKKwkJeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldENlbGxMb2NhdGlvbnMKKyAqIAorICogU2V0cyB0aGUgY2VsbCBsb2NhdGlvbnMgaW4gdGhlIGZhY2FkZSB0byB0aG9zZSBzdG9yZWQgYWZ0ZXIgdGhpcyBsYXlvdXQKKyAqIHByb2Nlc3Npbmcgc3RlcCBoYXMgY29tcGxldGVkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGdyYXBoIC0gdGhlIGlucHV0IGdyYXBoCisgKiBtb2RlbCAtIHRoZSBsYXlvdXQgbW9kZWwKKyAqLworbXhDb29yZGluYXRlQXNzaWdubWVudC5wcm90b3R5cGUuc2V0Q2VsbExvY2F0aW9ucyA9IGZ1bmN0aW9uKGdyYXBoLCBtb2RlbCkKK3sKKwl0aGlzLnJhbmtUb3BZID0gW107CisJdGhpcy5yYW5rQm90dG9tWSA9IFtdOworCisJZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlbC5yYW5rcy5sZW5ndGg7IGkrKykKKwl7CisJCXRoaXMucmFua1RvcFlbaV0gPSBOdW1iZXIuTUFYX1ZBTFVFOworCQl0aGlzLnJhbmtCb3R0b21ZW2ldID0gLU51bWJlci5NQVhfVkFMVUU7CisJfQorCQorCXZhciB2ZXJ0aWNlcyA9IG1vZGVsLnZlcnRleE1hcHBlci5nZXRWYWx1ZXMoKTsKKworCS8vIFByb2Nlc3MgdmVydGljZXMgYWxsIGZpcnN0LCBzaW5jZSB0aGV5IGRlZmluZSB0aGUgbG93ZXIgYW5kIAorCS8vIGxpbWl0cyBvZiBlYWNoIHJhbmsuIEJldHdlZW4gdGhlc2UgbGltaXRzIGxpZSB0aGUgY2hhbm5lbHMKKwkvLyB3aGVyZSB0aGUgZWRnZXMgY2FuIGJlIHJvdXRlZCBhY3Jvc3MgdGhlIGdyYXBoCisKKwlmb3IgKHZhciBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKQorCXsKKwkJdGhpcy5zZXRWZXJ0ZXhMb2NhdGlvbih2ZXJ0aWNlc1tpXSk7CisJfQorCQorCS8vIFBvc3QgcHJvY2VzcyBlZGdlIHN0eWxlcy4gTmVlZHMgdGhlIHZlcnRleCBsb2NhdGlvbnMgc2V0IGZvciBpbml0aWFsCisJLy8gdmFsdWVzIG9mIHRoZSB0b3AgYW5kIGJvdHRvbXMgb2YgZWFjaCByYW5rCisJaWYgKHRoaXMubGF5b3V0LmVkZ2VTdHlsZSA9PSBteEhpZXJhcmNoaWNhbEVkZ2VTdHlsZS5PUlRIT0dPTkFMCisJCQl8fCB0aGlzLmxheW91dC5lZGdlU3R5bGUgPT0gbXhIaWVyYXJjaGljYWxFZGdlU3R5bGUuUE9MWUxJTkUKKwkJCXx8IHRoaXMubGF5b3V0LmVkZ2VTdHlsZSA9PSBteEhpZXJhcmNoaWNhbEVkZ2VTdHlsZS5DVVJWRSkKKwl7CisJCXRoaXMubG9jYWxFZGdlUHJvY2Vzc2luZyhtb2RlbCk7CisJfQorCisJdmFyIGVkZ2VzID0gbW9kZWwuZWRnZU1hcHBlci5nZXRWYWx1ZXMoKTsKKworCWZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspCisJeworCQl0aGlzLnNldEVkZ2VQb3NpdGlvbihlZGdlc1tpXSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogbG9jYWxFZGdlUHJvY2Vzc2luZworICogCisgKiBTZXBhcmF0ZXMgdGhlIHggcG9zaXRpb24gb2YgZWRnZXMgYXMgdGhleSBjb25uZWN0IHRvIHZlcnRpY2VzCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKgorICogbW9kZWwgLSB0aGUgbGF5b3V0IG1vZGVsCisgKi8KK214Q29vcmRpbmF0ZUFzc2lnbm1lbnQucHJvdG90eXBlLmxvY2FsRWRnZVByb2Nlc3NpbmcgPSBmdW5jdGlvbihtb2RlbCkKK3sKKwkvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCB2ZXJ0ZXgsIGxvb2sgYXQgdGhlIGVkZ2VzIGNvbm5lY3RlZCBpbgorCS8vIGJvdGggZGlyZWN0aW9ucy4KKwlmb3IgKHZhciByYW5rSW5kZXggPSAwOyByYW5rSW5kZXggPCBtb2RlbC5yYW5rcy5sZW5ndGg7IHJhbmtJbmRleCsrKQorCXsKKwkJdmFyIHJhbmsgPSBtb2RlbC5yYW5rc1tyYW5rSW5kZXhdOworCisJCWZvciAodmFyIGNlbGxJbmRleCA9IDA7IGNlbGxJbmRleCA8IHJhbmsubGVuZ3RoOyBjZWxsSW5kZXgrKykKKwkJeworCQkJdmFyIGNlbGwgPSByYW5rW2NlbGxJbmRleF07CisKKwkJCWlmIChjZWxsLmlzVmVydGV4KCkpCisJCQl7CisJCQkJdmFyIGN1cnJlbnRDZWxscyA9IGNlbGwuZ2V0UHJldmlvdXNMYXllckNvbm5lY3RlZENlbGxzKHJhbmtJbmRleCk7CisKKwkJCQl2YXIgY3VycmVudFJhbmsgPSByYW5rSW5kZXggLSAxOworCisJCQkJLy8gVHdvIGxvb3BzLCBsYXN0IGNvbm5lY3RlZCBjZWxscywgYW5kIG5leHQKKwkJCQlmb3IgKHZhciBrID0gMDsgayA8IDI7IGsrKykKKwkJCQl7CisJCQkJCWlmIChjdXJyZW50UmFuayA+IC0xCisJCQkJCQkJJiYgY3VycmVudFJhbmsgPCBtb2RlbC5yYW5rcy5sZW5ndGgKKwkJCQkJCQkmJiBjdXJyZW50Q2VsbHMgIT0gbnVsbAorCQkJCQkJCSYmIGN1cnJlbnRDZWxscy5sZW5ndGggPiAwKQorCQkJCQl7CisJCQkJCQl2YXIgc29ydGVkQ2VsbHMgPSBbXTsKKworCQkJCQkJZm9yICh2YXIgaiA9IDA7IGogPCBjdXJyZW50Q2VsbHMubGVuZ3RoOyBqKyspCisJCQkJCQl7CisJCQkJCQkJdmFyIHNvcnRlciA9IG5ldyBXZWlnaHRlZENlbGxTb3J0ZXIoCisJCQkJCQkJCQljdXJyZW50Q2VsbHNbal0sIGN1cnJlbnRDZWxsc1tqXS5nZXRYKGN1cnJlbnRSYW5rKSk7CisJCQkJCQkJc29ydGVkQ2VsbHMucHVzaChzb3J0ZXIpOworCQkJCQkJfQorCisJCQkJCQlzb3J0ZWRDZWxscy5zb3J0KFdlaWdodGVkQ2VsbFNvcnRlci5wcm90b3R5cGUuY29tcGFyZSk7CisKKwkJCQkJCXZhciBsZWZ0TGltaXQgPSBjZWxsLnhbMF0gLSBjZWxsLndpZHRoIC8gMjsKKwkJCQkJCXZhciByaWdodExpbWl0ID0gbGVmdExpbWl0ICsgY2VsbC53aWR0aDsKKworCQkJCQkJLy8gQ29ubmVjdGVkIGVkZ2UgY291bnQgc3RhcnRzIGF0IDEgdG8gYWxsb3cgZm9yIGJ1ZmZlcgorCQkJCQkJLy8gd2l0aCBlZGdlIG9mIHZlcnRleAorCQkJCQkJdmFyIGNvbm5lY3RlZEVkZ2VDb3VudCA9IDA7CisJCQkJCQl2YXIgY29ubmVjdGVkRWRnZUdyb3VwQ291bnQgPSAwOworCQkJCQkJdmFyIGNvbm5lY3RlZEVkZ2VzID0gW107CisJCQkJCQkvLyBDYWxjdWxhdGUgd2lkdGggcmVxdWlyZW1lbnRzIGZvciBhbGwgY29ubmVjdGVkIGVkZ2VzCisJCQkJCQlmb3IgKHZhciBqID0gMDsgaiA8IHNvcnRlZENlbGxzLmxlbmd0aDsgaisrKQorCQkJCQkJeworCQkJCQkJCXZhciBpbm5lckNlbGwgPSBzb3J0ZWRDZWxsc1tqXS5jZWxsOworCQkJCQkJCXZhciBjb25uZWN0aW9uczsKKworCQkJCQkJCWlmIChpbm5lckNlbGwuaXNWZXJ0ZXgoKSkKKwkJCQkJCQl7CisJCQkJCQkJCS8vIEdldCB0aGUgY29ubmVjdGluZyBlZGdlCisJCQkJCQkJCWlmIChrID09IDApCisJCQkJCQkJCXsKKwkJCQkJCQkJCWNvbm5lY3Rpb25zID0gY2VsbC5jb25uZWN0c0FzU291cmNlOworCisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisJCQkJCQkJCQljb25uZWN0aW9ucyA9IGNlbGwuY29ubmVjdHNBc1RhcmdldDsKKwkJCQkJCQkJfQorCisJCQkJCQkJCWZvciAodmFyIGNvbm5JbmRleCA9IDA7IGNvbm5JbmRleCA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgY29ubkluZGV4KyspCisJCQkJCQkJCXsKKwkJCQkJCQkJCWlmIChjb25uZWN0aW9uc1tjb25uSW5kZXhdLnNvdXJjZSA9PSBpbm5lckNlbGwKKwkJCQkJCQkJCQkJfHwgY29ubmVjdGlvbnNbY29ubkluZGV4XS50YXJnZXQgPT0gaW5uZXJDZWxsKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCWNvbm5lY3RlZEVkZ2VDb3VudCArPSBjb25uZWN0aW9uc1tjb25uSW5kZXhdLmVkZ2VzCisJCQkJCQkJCQkJCQkubGVuZ3RoOworCQkJCQkJCQkJCWNvbm5lY3RlZEVkZ2VHcm91cENvdW50Kys7CisKKwkJCQkJCQkJCQljb25uZWN0ZWRFZGdlcy5wdXNoKGNvbm5lY3Rpb25zW2Nvbm5JbmRleF0pOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWNvbm5lY3RlZEVkZ2VDb3VudCArPSBpbm5lckNlbGwuZWRnZXMubGVuZ3RoOworCQkJCQkJCQljb25uZWN0ZWRFZGdlR3JvdXBDb3VudCsrOworCQkJCQkJCQljb25uZWN0ZWRFZGdlcy5wdXNoKGlubmVyQ2VsbCk7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQl2YXIgcmVxdWlyZWRXaWR0aCA9IChjb25uZWN0ZWRFZGdlQ291bnQgKyAxKQorCQkJCQkJCQkqIHRoaXMucHJlZkhvekVkZ2VTZXA7CisKKwkJCQkJCS8vIEFkZCBhIGJ1ZmZlciBvbiB0aGUgZWRnZXMgb2YgdGhlIHZlcnRleCBpZiB0aGUgZWRnZSBjb3VudCBhbGxvd3MKKwkJCQkJCWlmIChjZWxsLndpZHRoID4gcmVxdWlyZWRXaWR0aAorCQkJCQkJCQkrICgyICogdGhpcy5wcmVmSG96RWRnZVNlcCkpCisJCQkJCQl7CisJCQkJCQkJbGVmdExpbWl0ICs9IHRoaXMucHJlZkhvekVkZ2VTZXA7CisJCQkJCQkJcmlnaHRMaW1pdCAtPSB0aGlzLnByZWZIb3pFZGdlU2VwOworCQkJCQkJfQorCisJCQkJCQl2YXIgYXZhaWxhYmxlV2lkdGggPSByaWdodExpbWl0IC0gbGVmdExpbWl0OworCQkJCQkJdmFyIGVkZ2VTcGFjaW5nID0gYXZhaWxhYmxlV2lkdGggLyBjb25uZWN0ZWRFZGdlQ291bnQ7CisKKwkJCQkJCXZhciBjdXJyZW50WCA9IGxlZnRMaW1pdCArIGVkZ2VTcGFjaW5nIC8gMi4wOworCQkJCQkJdmFyIGN1cnJlbnRZT2Zmc2V0ID0gdGhpcy5taW5FZGdlSmV0dHkgLSB0aGlzLnByZWZWZXJ0RWRnZU9mZjsKKwkJCQkJCXZhciBtYXhZT2Zmc2V0ID0gMDsKKworCQkJCQkJZm9yICh2YXIgaiA9IDA7IGogPCBjb25uZWN0ZWRFZGdlcy5sZW5ndGg7IGorKykKKwkJCQkJCXsKKwkJCQkJCQl2YXIgbnVtQWN0dWFsRWRnZXMgPSBjb25uZWN0ZWRFZGdlc1tqXS5lZGdlcworCQkJCQkJCQkJLmxlbmd0aDsKKwkJCQkJCQl2YXIgcG9zID0gdGhpcy5qZXR0eVBvc2l0aW9uc1tjb25uZWN0ZWRFZGdlc1tqXS5pZHNbMF1dOworCQkJCQkJCQorCQkJCQkJCWlmIChwb3MgPT0gbnVsbCkKKwkJCQkJCQl7CisJCQkJCQkJCXBvcyA9IFtdOworCQkJCQkJCQl0aGlzLmpldHR5UG9zaXRpb25zW2Nvbm5lY3RlZEVkZ2VzW2pdLmlkc1swXV0gPSBwb3M7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKGogPCBjb25uZWN0ZWRFZGdlQ291bnQgLyAyKQorCQkJCQkJCXsKKwkJCQkJCQkJY3VycmVudFlPZmZzZXQgKz0gdGhpcy5wcmVmVmVydEVkZ2VPZmY7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYgKGogPiBjb25uZWN0ZWRFZGdlQ291bnQgLyAyKQorCQkJCQkJCXsKKwkJCQkJCQkJY3VycmVudFlPZmZzZXQgLT0gdGhpcy5wcmVmVmVydEVkZ2VPZmY7CisJCQkJCQkJfQorCQkJCQkJCS8vIElnbm9yZSB0aGUgY2FzZSBpZiBlcXVhbHMsIHRoaXMgbWVhbnMgdGhlIHNlY29uZCBvZiAyCisJCQkJCQkJLy8gamV0dHlzIHdpdGggdGhlIHNhbWUgeSAoZXZlbiBudW1iZXIgb2YgZWRnZXMpCisKKwkJCQkJCQlmb3IgKHZhciBtID0gMDsgbSA8IG51bUFjdHVhbEVkZ2VzOyBtKyspCisJCQkJCQkJeworCQkJCQkJCQlwb3NbbSAqIDQgKyBrICogMl0gPSBjdXJyZW50WDsKKwkJCQkJCQkJY3VycmVudFggKz0gZWRnZVNwYWNpbmc7CisJCQkJCQkJCXBvc1ttICogNCArIGsgKiAyICsgMV0gPSBjdXJyZW50WU9mZnNldDsKKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkJbWF4WU9mZnNldCA9IE1hdGgubWF4KG1heFlPZmZzZXQsCisJCQkJCQkJCQljdXJyZW50WU9mZnNldCk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQljdXJyZW50Q2VsbHMgPSBjZWxsLmdldE5leHRMYXllckNvbm5lY3RlZENlbGxzKHJhbmtJbmRleCk7CisKKwkJCQkJY3VycmVudFJhbmsgPSByYW5rSW5kZXggKyAxOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEVkZ2VQb3NpdGlvbgorICogCisgKiBGaXhlcyB0aGUgY29udHJvbCBwb2ludHMKKyAqLworbXhDb29yZGluYXRlQXNzaWdubWVudC5wcm90b3R5cGUuc2V0RWRnZVBvc2l0aW9uID0gZnVuY3Rpb24oY2VsbCkKK3sKKwkvLyBGb3IgcGFyYWxsZWwgZWRnZXMgd2UgbmVlZCB0byBzZXBlcmF0ZSBvdXQgdGhlIHBvaW50cyBhCisJLy8gbGl0dGxlCisJdmFyIG9mZnNldFggPSAwOworCS8vIE9ubHkgc2V0IHRoZSBlZGdlIGNvbnRyb2wgcG9pbnRzIG9uY2UKKworCWlmIChjZWxsLnRlbXBbMF0gIT0gMTAxMjA3KQorCXsKKwkJdmFyIG1heFJhbmsgPSBjZWxsLm1heFJhbms7CisJCXZhciBtaW5SYW5rID0gY2VsbC5taW5SYW5rOworCQkKKwkJaWYgKG1heFJhbmsgPT0gbWluUmFuaykKKwkJeworCQkJbWF4UmFuayA9IGNlbGwuc291cmNlLm1heFJhbms7CisJCQltaW5SYW5rID0gY2VsbC50YXJnZXQubWluUmFuazsKKwkJfQorCQkKKwkJdmFyIHBhcmFsbGVsRWRnZUNvdW50ID0gMDsKKwkJdmFyIGpldHR5cyA9IHRoaXMuamV0dHlQb3NpdGlvbnNbY2VsbC5pZHNbMF1dOworCisJCXZhciBzb3VyY2UgPSBjZWxsLmlzUmV2ZXJzZWQgPyBjZWxsLnRhcmdldC5jZWxsIDogY2VsbC5zb3VyY2UuY2VsbDsKKwkJdmFyIGdyYXBoID0gdGhpcy5sYXlvdXQuZ3JhcGg7CisJCXZhciBsYXlvdXRSZXZlcnNlZCA9IHRoaXMub3JpZW50YXRpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX0VBU1QKKwkJCQl8fCB0aGlzLm9yaWVudGF0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9TT1VUSDsKKworCQlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGwuZWRnZXMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciByZWFsRWRnZSA9IGNlbGwuZWRnZXNbaV07CisJCQl2YXIgcmVhbFNvdXJjZSA9IHRoaXMubGF5b3V0LmdldFZpc2libGVUZXJtaW5hbChyZWFsRWRnZSwgdHJ1ZSk7CisKKwkJCS8vTGlzdCBvbGRQb2ludHMgPSBncmFwaC5nZXRQb2ludHMocmVhbEVkZ2UpOworCQkJdmFyIG5ld1BvaW50cyA9IFtdOworCisJCQkvLyBTaW5nbGUgbGVuZ3RoIHJldmVyc2VkIGVkZ2VzIGVuZCB1cCB3aXRoIHRoZSBqZXR0eXMgaW4gdGhlIHdyb25nCisJCQkvLyBwbGFjZXMuIFNpbmNlIHNpbmdsZSBsZW5ndGggZWRnZXMgb25seSBoYXZlIGpldHR5cywgbm90IHNlZ21lbnQKKwkJCS8vIGNvbnRyb2wgcG9pbnRzLCB3ZSBqdXN0IHNheSB0aGUgZWRnZSBpc24ndCByZXZlcnNlZCBpbiB0aGlzIHNlY3Rpb24KKwkJCXZhciByZXZlcnNlZCA9IGNlbGwuaXNSZXZlcnNlZDsKKwkJCQorCQkJaWYgKHJlYWxTb3VyY2UgIT0gc291cmNlKQorCQkJeworCQkJCS8vIFRoZSByZWFsIGVkZ2VzIGluY2x1ZGUgYWxsIGNvcmUgbW9kZWwgZWRnZXMgYW5kIHRoZXNlIGNhbiBnbworCQkJCS8vIGluIGJvdGggZGlyZWN0aW9ucy4gSWYgdGhlIHNvdXJjZSBvZiB0aGUgaGllcmFyY2hpY2FsIG1vZGVsIGVkZ2UKKwkJCQkvLyBpc24ndCB0aGUgc291cmNlIG9mIHRoZSBzcGVjaWZpYyByZWFsIGVkZ2UgaW4gdGhpcyBpdGVyYXRpb24KKwkJCQkvLyB0cmVhdCBpZiBhcyByZXZlcnNlZAorCQkJCXJldmVyc2VkID0gIXJldmVyc2VkOworCQkJfQorCisJCQkvLyBGaXJzdCBqZXR0eSBvZiBlZGdlCisJCQlpZiAoamV0dHlzICE9IG51bGwpCisJCQl7CisJCQkJdmFyIGFycmF5T2Zmc2V0ID0gcmV2ZXJzZWQgPyAyIDogMDsKKwkJCQl2YXIgeSA9IHJldmVyc2VkID8KKwkJCQkJCShsYXlvdXRSZXZlcnNlZCA/IHRoaXMucmFua0JvdHRvbVlbbWluUmFua10gOiB0aGlzLnJhbmtUb3BZW21pblJhbmtdKSA6CisJCQkJCQkJKGxheW91dFJldmVyc2VkID8gdGhpcy5yYW5rVG9wWVttYXhSYW5rXSA6IHRoaXMucmFua0JvdHRvbVlbbWF4UmFua10pOworCQkJCXZhciBqZXR0eSA9IGpldHR5c1twYXJhbGxlbEVkZ2VDb3VudCAqIDQgKyAxICsgYXJyYXlPZmZzZXRdOworCQkJCQorCQkJCWlmIChyZXZlcnNlZCAhPSBsYXlvdXRSZXZlcnNlZCkKKwkJCQl7CisJCQkJCWpldHR5ID0gLWpldHR5OworCQkJCX0KKwkJCQkKKwkJCQl5ICs9IGpldHR5OworCQkJCXZhciB4ID0gamV0dHlzW3BhcmFsbGVsRWRnZUNvdW50ICogNCArIGFycmF5T2Zmc2V0XTsKKwkJCQkKKwkJCQl2YXIgbW9kZWxTb3VyY2UgPSBncmFwaC5tb2RlbC5nZXRUZXJtaW5hbChyZWFsRWRnZSwgdHJ1ZSk7CisKKwkJCQlpZiAodGhpcy5sYXlvdXQuaXNQb3J0KG1vZGVsU291cmNlKSAmJiBncmFwaC5tb2RlbC5nZXRQYXJlbnQobW9kZWxTb3VyY2UpID09IHJlYWxTb3VyY2UpCisJCQkJeworCQkJCQl2YXIgc3RhdGUgPSBncmFwaC52aWV3LmdldFN0YXRlKG1vZGVsU291cmNlKTsKKwkJCQkJCisJCQkJCWlmIChzdGF0ZSAhPSBudWxsKQorCQkJCQl7CisJCQkJCQl4ID0gc3RhdGUueDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXggPSByZWFsU291cmNlLmdlb21ldHJ5LnggKyBjZWxsLnNvdXJjZS53aWR0aCAqIG1vZGVsU291cmNlLmdlb21ldHJ5Lng7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAodGhpcy5vcmllbnRhdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEgKKwkJCQkJCXx8IHRoaXMub3JpZW50YXRpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX1NPVVRIKQorCQkJCXsKKwkJCQkJbmV3UG9pbnRzLnB1c2gobmV3IG14UG9pbnQoeCwgeSkpOworCQkJCQkKKwkJCQkJaWYgKHRoaXMubGF5b3V0LmVkZ2VTdHlsZSA9PSBteEhpZXJhcmNoaWNhbEVkZ2VTdHlsZS5DVVJWRSkKKwkJCQkJeworCQkJCQkJbmV3UG9pbnRzLnB1c2gobmV3IG14UG9pbnQoeCwgeSArIGpldHR5KSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbmV3UG9pbnRzLnB1c2gobmV3IG14UG9pbnQoeSwgeCkpOworCQkJCQkKKwkJCQkJaWYgKHRoaXMubGF5b3V0LmVkZ2VTdHlsZSA9PSBteEhpZXJhcmNoaWNhbEVkZ2VTdHlsZS5DVVJWRSkKKwkJCQkJeworCQkJCQkJbmV3UG9pbnRzLnB1c2gobmV3IG14UG9pbnQoeSArIGpldHR5LCB4KSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCS8vIERlY2xhcmUgdmFyaWFibGVzIHRvIGRlZmluZSBsb29wIHRocm91Z2ggZWRnZSBwb2ludHMgYW5kIAorCQkJLy8gY2hhbmdlIGRpcmVjdGlvbiBpZiBlZGdlIGlzIHJldmVyc2VkCisKKwkJCXZhciBsb29wU3RhcnQgPSBjZWxsLngubGVuZ3RoIC0gMTsKKwkJCXZhciBsb29wTGltaXQgPSAtMTsKKwkJCXZhciBsb29wRGVsdGEgPSAtMTsKKwkJCXZhciBjdXJyZW50UmFuayA9IGNlbGwubWF4UmFuayAtIDE7CisKKwkJCWlmIChyZXZlcnNlZCkKKwkJCXsKKwkJCQlsb29wU3RhcnQgPSAwOworCQkJCWxvb3BMaW1pdCA9IGNlbGwueC5sZW5ndGg7CisJCQkJbG9vcERlbHRhID0gMTsKKwkJCQljdXJyZW50UmFuayA9IGNlbGwubWluUmFuayArIDE7CisJCQl9CisJCQkvLyBSZXZlcnNlZCBlZGdlcyBuZWVkIHRoZSBwb2ludHMgaW5zZXJ0ZWQgaW4KKwkJCS8vIHJldmVyc2Ugb3JkZXIKKwkJCWZvciAodmFyIGogPSBsb29wU3RhcnQ7IChjZWxsLm1heFJhbmsgIT0gY2VsbC5taW5SYW5rKSAmJiBqICE9IGxvb3BMaW1pdDsgaiArPSBsb29wRGVsdGEpCisJCQl7CisJCQkJLy8gVGhlIGhvcml6b250YWwgcG9zaXRpb24gaW4gYSB2ZXJ0aWNhbCBsYXlvdXQKKwkJCQl2YXIgcG9zaXRpb25YID0gY2VsbC54W2pdICsgb2Zmc2V0WDsKKworCQkJCS8vIFdvcmsgb3V0IHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbnMgaW4gYSB2ZXJ0aWNhbCBsYXlvdXQKKwkJCQkvLyBpbiB0aGUgZWRnZSBidWZmZXIgY2hhbm5lbHMgYWJvdmUgYW5kIGJlbG93IHRoaXMgcmFuaworCQkJCXZhciB0b3BDaGFubmVsWSA9ICh0aGlzLnJhbmtUb3BZW2N1cnJlbnRSYW5rXSArIHRoaXMucmFua0JvdHRvbVlbY3VycmVudFJhbmsgKyAxXSkgLyAyLjA7CisJCQkJdmFyIGJvdHRvbUNoYW5uZWxZID0gKHRoaXMucmFua1RvcFlbY3VycmVudFJhbmsgLSAxXSArIHRoaXMucmFua0JvdHRvbVlbY3VycmVudFJhbmtdKSAvIDIuMDsKKworCQkJCWlmIChyZXZlcnNlZCkKKwkJCQl7CisJCQkJCXZhciB0bXAgPSB0b3BDaGFubmVsWTsKKwkJCQkJdG9wQ2hhbm5lbFkgPSBib3R0b21DaGFubmVsWTsKKwkJCQkJYm90dG9tQ2hhbm5lbFkgPSB0bXA7CisJCQkJfQorCisJCQkJaWYgKHRoaXMub3JpZW50YXRpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX05PUlRIIHx8CisJCQkJCXRoaXMub3JpZW50YXRpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX1NPVVRIKQorCQkJCXsKKwkJCQkJbmV3UG9pbnRzLnB1c2gobmV3IG14UG9pbnQocG9zaXRpb25YLCB0b3BDaGFubmVsWSkpOworCQkJCQluZXdQb2ludHMucHVzaChuZXcgbXhQb2ludChwb3NpdGlvblgsIGJvdHRvbUNoYW5uZWxZKSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW5ld1BvaW50cy5wdXNoKG5ldyBteFBvaW50KHRvcENoYW5uZWxZLCBwb3NpdGlvblgpKTsKKwkJCQkJbmV3UG9pbnRzLnB1c2gobmV3IG14UG9pbnQoYm90dG9tQ2hhbm5lbFksIHBvc2l0aW9uWCkpOworCQkJCX0KKworCQkJCXRoaXMubGltaXRYID0gTWF0aC5tYXgodGhpcy5saW1pdFgsIHBvc2l0aW9uWCk7CisJCQkJY3VycmVudFJhbmsgKz0gbG9vcERlbHRhOworCQkJfQorCisJCQkvLyBTZWNvbmQgamV0dHkgb2YgZWRnZQorCQkJaWYgKGpldHR5cyAhPSBudWxsKQorCQkJeworCQkJCXZhciBhcnJheU9mZnNldCA9IHJldmVyc2VkID8gMiA6IDA7CisJCQkJdmFyIHJhbmtZID0gcmV2ZXJzZWQgPworCQkJCQkJKGxheW91dFJldmVyc2VkID8gdGhpcy5yYW5rVG9wWVttYXhSYW5rXSA6IHRoaXMucmFua0JvdHRvbVlbbWF4UmFua10pIDoKKwkJCQkJCQkobGF5b3V0UmV2ZXJzZWQgPyB0aGlzLnJhbmtCb3R0b21ZW21pblJhbmtdIDogdGhpcy5yYW5rVG9wWVttaW5SYW5rXSk7CisJCQkJdmFyIGpldHR5ID0gamV0dHlzW3BhcmFsbGVsRWRnZUNvdW50ICogNCArIDMgLSBhcnJheU9mZnNldF07CisJCQkJCisJCQkJaWYgKHJldmVyc2VkICE9IGxheW91dFJldmVyc2VkKQorCQkJCXsKKwkJCQkJamV0dHkgPSAtamV0dHk7CisJCQkJfQorCQkJCXZhciB5ID0gcmFua1kgLSBqZXR0eTsKKwkJCQl2YXIgeCA9IGpldHR5c1twYXJhbGxlbEVkZ2VDb3VudCAqIDQgKyAyIC0gYXJyYXlPZmZzZXRdOworCQkJCQorCQkJCXZhciBtb2RlbFRhcmdldCA9IGdyYXBoLm1vZGVsLmdldFRlcm1pbmFsKHJlYWxFZGdlLCBmYWxzZSk7CisJCQkJdmFyIHJlYWxUYXJnZXQgPSB0aGlzLmxheW91dC5nZXRWaXNpYmxlVGVybWluYWwocmVhbEVkZ2UsIGZhbHNlKTsKKworCQkJCWlmICh0aGlzLmxheW91dC5pc1BvcnQobW9kZWxUYXJnZXQpICYmIGdyYXBoLm1vZGVsLmdldFBhcmVudChtb2RlbFRhcmdldCkgPT0gcmVhbFRhcmdldCkKKwkJCQl7CisJCQkJCXZhciBzdGF0ZSA9IGdyYXBoLnZpZXcuZ2V0U3RhdGUobW9kZWxUYXJnZXQpOworCQkJCQkKKwkJCQkJaWYgKHN0YXRlICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCXggPSBzdGF0ZS54OworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJeCA9IHJlYWxUYXJnZXQuZ2VvbWV0cnkueCArIGNlbGwudGFyZ2V0LndpZHRoICogbW9kZWxUYXJnZXQuZ2VvbWV0cnkueDsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICh0aGlzLm9yaWVudGF0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9OT1JUSCB8fAorCQkJCQkJdGhpcy5vcmllbnRhdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fU09VVEgpCisJCQkJeworCQkJCQlpZiAodGhpcy5sYXlvdXQuZWRnZVN0eWxlID09IG14SGllcmFyY2hpY2FsRWRnZVN0eWxlLkNVUlZFKQorCQkJCQl7CisJCQkJCQluZXdQb2ludHMucHVzaChuZXcgbXhQb2ludCh4LCB5IC0gamV0dHkpKTsKKwkJCQkJfQorCisJCQkJCW5ld1BvaW50cy5wdXNoKG5ldyBteFBvaW50KHgsIHkpKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKHRoaXMubGF5b3V0LmVkZ2VTdHlsZSA9PSBteEhpZXJhcmNoaWNhbEVkZ2VTdHlsZS5DVVJWRSkKKwkJCQkJeworCQkJCQkJbmV3UG9pbnRzLnB1c2gobmV3IG14UG9pbnQoeSAtIGpldHR5LCB4KSk7CisJCQkJCX0KKworCQkJCQluZXdQb2ludHMucHVzaChuZXcgbXhQb2ludCh5LCB4KSk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoY2VsbC5pc1JldmVyc2VkKQorCQkJeworCQkJCXRoaXMucHJvY2Vzc1JldmVyc2VkRWRnZShjZWxsLCByZWFsRWRnZSk7CisJCQl9CisKKwkJCXRoaXMubGF5b3V0LnNldEVkZ2VQb2ludHMocmVhbEVkZ2UsIG5ld1BvaW50cyk7CisKKwkJCS8vIEluY3JlYXNlIG9mZnNldCBzbyBuZXh0IGVkZ2UgaXMgZHJhd24gbmV4dCB0bworCQkJLy8gdGhpcyBvbmUKKwkJCWlmIChvZmZzZXRYID09IDAuMCkKKwkJCXsKKwkJCQlvZmZzZXRYID0gdGhpcy5wYXJhbGxlbEVkZ2VTcGFjaW5nOworCQkJfQorCQkJZWxzZSBpZiAob2Zmc2V0WCA+IDApCisJCQl7CisJCQkJb2Zmc2V0WCA9IC1vZmZzZXRYOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW9mZnNldFggPSAtb2Zmc2V0WCArIHRoaXMucGFyYWxsZWxFZGdlU3BhY2luZzsKKwkJCX0KKwkJCQorCQkJcGFyYWxsZWxFZGdlQ291bnQrKzsKKwkJfQorCisJCWNlbGwudGVtcFswXSA9IDEwMTIwNzsKKwl9Cit9OworCisKKy8qKgorICogRnVuY3Rpb246IHNldFZlcnRleExvY2F0aW9uCisgKiAKKyAqIEZpeGVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHZlcnRleC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIHRoZSB2ZXJ0ZXggdG8gcG9zaXRpb24KKyAqLworbXhDb29yZGluYXRlQXNzaWdubWVudC5wcm90b3R5cGUuc2V0VmVydGV4TG9jYXRpb24gPSBmdW5jdGlvbihjZWxsKQoreworCXZhciByZWFsQ2VsbCA9IGNlbGwuY2VsbDsKKwl2YXIgcG9zaXRpb25YID0gY2VsbC54WzBdIC0gY2VsbC53aWR0aCAvIDI7CisJdmFyIHBvc2l0aW9uWSA9IGNlbGwueVswXSAtIGNlbGwuaGVpZ2h0IC8gMjsKKworCXRoaXMucmFua1RvcFlbY2VsbC5taW5SYW5rXSA9IE1hdGgubWluKHRoaXMucmFua1RvcFlbY2VsbC5taW5SYW5rXSwgcG9zaXRpb25ZKTsKKwl0aGlzLnJhbmtCb3R0b21ZW2NlbGwubWluUmFua10gPSBNYXRoLm1heCh0aGlzLnJhbmtCb3R0b21ZW2NlbGwubWluUmFua10sCisJCQlwb3NpdGlvblkgKyBjZWxsLmhlaWdodCk7CisKKwlpZiAodGhpcy5vcmllbnRhdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEggfHwKKwkJdGhpcy5vcmllbnRhdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fU09VVEgpCisJeworCQl0aGlzLmxheW91dC5zZXRWZXJ0ZXhMb2NhdGlvbihyZWFsQ2VsbCwgcG9zaXRpb25YLCBwb3NpdGlvblkpOworCX0KKwllbHNlCisJeworCQl0aGlzLmxheW91dC5zZXRWZXJ0ZXhMb2NhdGlvbihyZWFsQ2VsbCwgcG9zaXRpb25ZLCBwb3NpdGlvblgpOworCX0KKworCXRoaXMubGltaXRYID0gTWF0aC5tYXgodGhpcy5saW1pdFgsIHBvc2l0aW9uWCArIGNlbGwud2lkdGgpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcHJvY2Vzc1JldmVyc2VkRWRnZQorICogCisgKiBIb29rIHRvIGFkZCBhZGRpdGlvbmFsIHByb2Nlc3NpbmcKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZWRnZSAtIHRoZSBoaWVyYXJjaGljYWwgbW9kZWwgZWRnZQorICogcmVhbEVkZ2UgLSB0aGUgcmVhbCBlZGdlIGluIHRoZSBncmFwaAorICovCitteENvb3JkaW5hdGVBc3NpZ25tZW50LnByb3RvdHlwZS5wcm9jZXNzUmV2ZXJzZWRFZGdlID0gZnVuY3Rpb24oZ3JhcGgsIG1vZGVsKQoreworCS8vIGhvb2sgZm9yIHN1YmNsYXNzZXJzCit9OworCisvKioKKyAqIENsYXNzOiBXZWlnaHRlZENlbGxTb3J0ZXIKKyAqIAorICogQSB1dGlsaXR5IGNsYXNzIHVzZWQgdG8gdHJhY2sgY2VsbHMgd2hpbHN0IHNvcnRpbmcgb2NjdXJzIG9uIHRoZSB3ZWlnaHRlZAorICogc3VtIG9mIHRoZWlyIGNvbm5lY3RlZCBlZGdlcy4gRG9lcyBub3QgdmlvbGF0ZSAoeC5jb21wYXJlVG8oeSk9PTApID09CisgKiAoeC5lcXVhbHMoeSkpCisgKgorICogQ29uc3RydWN0b3I6IFdlaWdodGVkQ2VsbFNvcnRlcgorICogCisgKiBDb25zdHJ1Y3RzIGEgbmV3IHdlaWdodGVkIGNlbGwgc29ydGVkIGZvciB0aGUgZ2l2ZW4gY2VsbCBhbmQgd2VpZ2h0LgorICovCitmdW5jdGlvbiBXZWlnaHRlZENlbGxTb3J0ZXIoY2VsbCwgd2VpZ2h0ZWRWYWx1ZSkKK3sKKwl0aGlzLmNlbGwgPSBjZWxsOworCXRoaXMud2VpZ2h0ZWRWYWx1ZSA9IHdlaWdodGVkVmFsdWU7Cit9OworCisvKioKKyAqIFZhcmlhYmxlOiB3ZWlnaHRlZFZhbHVlCisgKiAKKyAqIFRoZSB3ZWlnaHRlZCB2YWx1ZSBvZiB0aGUgY2VsbCBzdG9yZWQuCisgKi8KK1dlaWdodGVkQ2VsbFNvcnRlci5wcm90b3R5cGUud2VpZ2h0ZWRWYWx1ZSA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IG51ZGdlCisgKiAKKyAqIFdoZXRoZXIgb3Igbm90IHRvIGZsaXAgZXF1YWwgd2VpZ2h0IHZhbHVlcy4KKyAqLworV2VpZ2h0ZWRDZWxsU29ydGVyLnByb3RvdHlwZS5udWRnZSA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiB2aXNpdGVkCisgKiAKKyAqIFdoZXRoZXIgb3Igbm90IHRoaXMgY2VsbCBoYXMgYmVlbiB2aXNpdGVkIGluIHRoZSBjdXJyZW50IGFzc2lnbm1lbnQuCisgKi8KK1dlaWdodGVkQ2VsbFNvcnRlci5wcm90b3R5cGUudmlzaXRlZCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiByYW5rSW5kZXgKKyAqIAorICogVGhlIGluZGV4IHRoaXMgY2VsbCBpcyBpbiB0aGUgbW9kZWwgcmFuay4KKyAqLworV2VpZ2h0ZWRDZWxsU29ydGVyLnByb3RvdHlwZS5yYW5rSW5kZXggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjZWxsCisgKiAKKyAqIFRoZSBjZWxsIHdob3NlIG1lZGlhbiB2YWx1ZSBpcyBiZWluZyBjYWxjdWxhdGVkLgorICovCitXZWlnaHRlZENlbGxTb3J0ZXIucHJvdG90eXBlLmNlbGwgPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiBjb21wYXJlCisgKiAKKyAqIENvbXBhcmVzIHR3byBXZWlnaHRlZENlbGxTb3J0ZXJzLgorICovCitXZWlnaHRlZENlbGxTb3J0ZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbihhLCBiKQoreworCWlmIChhICE9IG51bGwgJiYgYiAhPSBudWxsKQorCXsKKwkJaWYgKGIud2VpZ2h0ZWRWYWx1ZSA+IGEud2VpZ2h0ZWRWYWx1ZSkKKwkJeworCQkJcmV0dXJuIC0xOworCQl9CisJCWVsc2UgaWYgKGIud2VpZ2h0ZWRWYWx1ZSA8IGEud2VpZ2h0ZWRWYWx1ZSkKKwkJeworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoYi5udWRnZSkKKwkJCXsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIDA7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL3N0YWdlL214SGllcmFyY2hpY2FsTGF5b3V0U3RhZ2UuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L2hpZXJhcmNoaWNhbC9zdGFnZS9teEhpZXJhcmNoaWNhbExheW91dFN0YWdlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTg0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L2hpZXJhcmNoaWNhbC9zdGFnZS9teEhpZXJhcmNoaWNhbExheW91dFN0YWdlLmpzCkBAIC0wLDAgKzEsMjUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14SGllcmFyY2hpY2FsTGF5b3V0U3RhZ2UKKyAqIAorICogVGhlIHNwZWNpZmljIGxheW91dCBpbnRlcmZhY2UgZm9yIGhpZXJhcmNoaWNhbCBsYXlvdXRzLiBJdCBhZGRzIGEKKyAqIDxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kIHdpdGggYSBwYXJhbWV0ZXIgZm9yIHRoZSBoaWVyYXJjaGljYWwgbGF5b3V0IG1vZGVsCisgKiB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSBsYXlvdXQgc3RhZ2VzLgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhIaWVyYXJjaGljYWxMYXlvdXRTdGFnZQorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgaGllcmFyY2hpY2FsIGxheW91dCBzdGFnZS4KKyAqLworZnVuY3Rpb24gbXhIaWVyYXJjaGljYWxMYXlvdXRTdGFnZSgpIHsgfTsKKworLyoqCisgKiBGdW5jdGlvbjogZXhlY3V0ZQorICogCisgKiBUYWtlcyB0aGUgZ3JhcGggZGV0YWlsIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgZmFjYWRlCisgKiBhbmQgY3JlYXRlcyB0aGUgcmVzdWx0aW5nIGxhaWQgb3V0IGdyYXBoIHdpdGhpbiB0aGF0IGZhY2FkZSBmb3IgZnVydGhlcgorICogdXNlLgorICovCitteEhpZXJhcmNoaWNhbExheW91dFN0YWdlLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24ocGFyZW50KSB7IH07CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L2hpZXJhcmNoaWNhbC9zdGFnZS9teE1lZGlhbkh5YnJpZENyb3NzaW5nUmVkdWN0aW9uLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9oaWVyYXJjaGljYWwvc3RhZ2UvbXhNZWRpYW5IeWJyaWRDcm9zc2luZ1JlZHVjdGlvbi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzkwNzlkCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9oaWVyYXJjaGljYWwvc3RhZ2UvbXhNZWRpYW5IeWJyaWRDcm9zc2luZ1JlZHVjdGlvbi5qcwpAQCAtMCwwICsxLDY3NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhNZWRpYW5IeWJyaWRDcm9zc2luZ1JlZHVjdGlvbgorICogCisgKiBTZXRzIHRoZSBob3Jpem9udGFsIGxvY2F0aW9ucyBvZiBub2RlIGFuZCBlZGdlIGR1bW15IG5vZGVzIG9uIGVhY2ggbGF5ZXIuCisgKiBVc2VzIG1lZGlhbiBkb3duIGFuZCB1cCB3ZWlnaGluZ3MgYXMgd2VsbCBoZXVyaXN0aWMgdG8gc3RyYWlnaHRlbiBlZGdlcyBhcworICogZmFyIGFzIHBvc3NpYmxlLgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhNZWRpYW5IeWJyaWRDcm9zc2luZ1JlZHVjdGlvbgorICoKKyAqIENyZWF0ZXMgYSBjb29yZGluYXRlIGFzc2lnbm1lbnQuCisgKiAKKyAqIEFyZ3VtZW50czoKKyAqIAorICogaW50cmFDZWxsU3BhY2luZyAtIHRoZSBtaW5pbXVtIGJ1ZmZlciBiZXR3ZWVuIGNlbGxzIG9uIHRoZSBzYW1lIHJhbmsKKyAqIGludGVyUmFua0NlbGxTcGFjaW5nIC0gdGhlIG1pbmltdW0gZGlzdGFuY2UgYmV0d2VlbiBjZWxscyBvbiBhZGphY2VudCByYW5rcworICogb3JpZW50YXRpb24gLSB0aGUgcG9zaXRpb24gb2YgdGhlIHJvb3Qgbm9kZShzKSByZWxhdGl2ZSB0byB0aGUgZ3JhcGgKKyAqIGluaXRpYWxYIC0gdGhlIGxlZnRtb3N0IGNvb3JkaW5hdGUgbm9kZSBwbGFjZW1lbnQgc3RhcnRzIGF0CisgKi8KK2Z1bmN0aW9uIG14TWVkaWFuSHlicmlkQ3Jvc3NpbmdSZWR1Y3Rpb24obGF5b3V0KQoreworCXRoaXMubGF5b3V0ID0gbGF5b3V0OworfTsKKworLyoqCisgKiBFeHRlbmRzIG14TWVkaWFuSHlicmlkQ3Jvc3NpbmdSZWR1Y3Rpb24uCisgKi8KK214TWVkaWFuSHlicmlkQ3Jvc3NpbmdSZWR1Y3Rpb24ucHJvdG90eXBlID0gbmV3IG14SGllcmFyY2hpY2FsTGF5b3V0U3RhZ2UoKTsKK214TWVkaWFuSHlicmlkQ3Jvc3NpbmdSZWR1Y3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhNZWRpYW5IeWJyaWRDcm9zc2luZ1JlZHVjdGlvbjsKKworLyoqCisgKiBWYXJpYWJsZTogbGF5b3V0CisgKiAKKyAqIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEhpZXJhcmNoaWNhbExheW91dD4uCisgKi8KK214TWVkaWFuSHlicmlkQ3Jvc3NpbmdSZWR1Y3Rpb24ucHJvdG90eXBlLmxheW91dCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IG1heEl0ZXJhdGlvbnMKKyAqIAorICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcGVyZm9ybSB3aGlsc3QgcmVkdWNpbmcgZWRnZQorICogY3Jvc3NpbmdzLiBEZWZhdWx0IGlzIDI0LgorICovCitteE1lZGlhbkh5YnJpZENyb3NzaW5nUmVkdWN0aW9uLnByb3RvdHlwZS5tYXhJdGVyYXRpb25zID0gMjQ7CisKKy8qKgorICogVmFyaWFibGU6IG5lc3RlZEJlc3RSYW5rcworICogCisgKiBTdG9yZXMgZWFjaCByYW5rIGFzIGEgY29sbGVjdGlvbiBvZiBjZWxscyBpbiB0aGUgYmVzdCBvcmRlciBmb3VuZCBmb3IKKyAqIGVhY2ggbGF5ZXIgc28gZmFyCisgKi8KK214TWVkaWFuSHlicmlkQ3Jvc3NpbmdSZWR1Y3Rpb24ucHJvdG90eXBlLm5lc3RlZEJlc3RSYW5rcyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGN1cnJlbnRCZXN0Q3Jvc3NpbmdzCisgKiAKKyAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3Jvc3NpbmdzIGZvdW5kIGluIHRoZSBiZXN0IGNvbmZpZ3VyYXRpb24gc28gZmFyCisgKi8KK214TWVkaWFuSHlicmlkQ3Jvc3NpbmdSZWR1Y3Rpb24ucHJvdG90eXBlLmN1cnJlbnRCZXN0Q3Jvc3NpbmdzID0gMDsKKworLyoqCisgKiBWYXJpYWJsZTogaXRlcmF0aW9uc1dpdGhvdXRJbXByb3ZlbWVudAorICogCisgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGNyb3NzaW5ncyBmb3VuZCBpbiB0aGUgYmVzdCBjb25maWd1cmF0aW9uIHNvIGZhcgorICovCitteE1lZGlhbkh5YnJpZENyb3NzaW5nUmVkdWN0aW9uLnByb3RvdHlwZS5pdGVyYXRpb25zV2l0aG91dEltcHJvdmVtZW50ID0gMDsKKworLyoqCisgKiBWYXJpYWJsZTogbWF4Tm9JbXByb3ZlbWVudEl0ZXJhdGlvbnMKKyAqIAorICogVGhlIHRvdGFsIG51bWJlciBvZiBjcm9zc2luZ3MgZm91bmQgaW4gdGhlIGJlc3QgY29uZmlndXJhdGlvbiBzbyBmYXIKKyAqLworbXhNZWRpYW5IeWJyaWRDcm9zc2luZ1JlZHVjdGlvbi5wcm90b3R5cGUubWF4Tm9JbXByb3ZlbWVudEl0ZXJhdGlvbnMgPSAyOworCisvKioKKyAqIEZ1bmN0aW9uOiBleGVjdXRlCisgKiAKKyAqIFBlcmZvcm1zIGEgdmVydGV4IG9yZGVyaW5nIHdpdGhpbiByYW5rcyBhcyBkZXNjcmliZWQgYnkgR2Fuc25lciBldCBhbAorICogMTk5MworICovCitteE1lZGlhbkh5YnJpZENyb3NzaW5nUmVkdWN0aW9uLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24ocGFyZW50KQoreworCXZhciBtb2RlbCA9IHRoaXMubGF5b3V0LmdldE1vZGVsKCk7CisKKwkvLyBTdG9yZXMgaW5pdGlhbCBvcmRlcmluZyBhcyBiZWluZyB0aGUgYmVzdCBvbmUgZm91bmQgc28gZmFyCisJdGhpcy5uZXN0ZWRCZXN0UmFua3MgPSBbXTsKKwkKKwlmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsLnJhbmtzLmxlbmd0aDsgaSsrKQorCXsKKwkJdGhpcy5uZXN0ZWRCZXN0UmFua3NbaV0gPSBtb2RlbC5yYW5rc1tpXS5zbGljZSgpOworCX0KKworCXZhciBpdGVyYXRpb25zV2l0aG91dEltcHJvdmVtZW50ID0gMDsKKwl2YXIgY3VycmVudEJlc3RDcm9zc2luZ3MgPSB0aGlzLmNhbGN1bGF0ZUNyb3NzaW5ncyhtb2RlbCk7CisKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubWF4SXRlcmF0aW9ucyAmJgorCQlpdGVyYXRpb25zV2l0aG91dEltcHJvdmVtZW50IDwgdGhpcy5tYXhOb0ltcHJvdmVtZW50SXRlcmF0aW9uczsgaSsrKQorCXsKKwkJdGhpcy53ZWlnaHRlZE1lZGlhbihpLCBtb2RlbCk7CisJCXRoaXMudHJhbnNwb3NlKGksIG1vZGVsKTsKKwkJdmFyIGNhbmRpZGF0ZUNyb3NzaW5ncyA9IHRoaXMuY2FsY3VsYXRlQ3Jvc3NpbmdzKG1vZGVsKTsKKworCQlpZiAoY2FuZGlkYXRlQ3Jvc3NpbmdzIDwgY3VycmVudEJlc3RDcm9zc2luZ3MpCisJCXsKKwkJCWN1cnJlbnRCZXN0Q3Jvc3NpbmdzID0gY2FuZGlkYXRlQ3Jvc3NpbmdzOworCQkJaXRlcmF0aW9uc1dpdGhvdXRJbXByb3ZlbWVudCA9IDA7CisKKwkJCS8vIFN0b3JlIHRoZSBjdXJyZW50IHJhbmtpbmdzIGFzIHRoZSBiZXN0IG9uZXMKKwkJCWZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5uZXN0ZWRCZXN0UmFua3MubGVuZ3RoOyBqKyspCisJCQl7CisJCQkJdmFyIHJhbmsgPSBtb2RlbC5yYW5rc1tqXTsKKworCQkJCWZvciAodmFyIGsgPSAwOyBrIDwgcmFuay5sZW5ndGg7IGsrKykKKwkJCQl7CisJCQkJCXZhciBjZWxsID0gcmFua1trXTsKKwkJCQkJdGhpcy5uZXN0ZWRCZXN0UmFua3Nbal1bY2VsbC5nZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKGopXSA9IGNlbGw7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gSW5jcmVhc2UgY291bnQgb2YgaXRlcmF0aW9ucyB3aGVyZSB3ZSBoYXZlbid0IGltcHJvdmVkIHRoZQorCQkJLy8gbGF5b3V0CisJCQlpdGVyYXRpb25zV2l0aG91dEltcHJvdmVtZW50Kys7CisKKwkJCS8vIFJlc3RvcmUgdGhlIGJlc3QgdmFsdWVzIHRvIHRoZSBjZWxscworCQkJZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLm5lc3RlZEJlc3RSYW5rcy5sZW5ndGg7IGorKykKKwkJCXsKKwkJCQl2YXIgcmFuayA9IG1vZGVsLnJhbmtzW2pdOworCQkJCQorCQkJCWZvciAodmFyIGsgPSAwOyBrIDwgcmFuay5sZW5ndGg7IGsrKykKKwkJCQl7CisJCQkJCXZhciBjZWxsID0gcmFua1trXTsKKwkJCQkJY2VsbC5zZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKGosIGspOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJaWYgKGN1cnJlbnRCZXN0Q3Jvc3NpbmdzID09IDApCisJCXsKKwkJCS8vIERvIG5vdGhpbmcgZnVydGhlcgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvLyBTdG9yZSB0aGUgYmVzdCByYW5raW5ncyBidXQgaW4gdGhlIG1vZGVsCisJdmFyIHJhbmtzID0gW107CisJdmFyIHJhbmtMaXN0ID0gW107CisKKwlmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsLm1heFJhbmsgKyAxOyBpKyspCisJeworCQlyYW5rTGlzdFtpXSA9IFtdOworCQlyYW5rc1tpXSA9IHJhbmtMaXN0W2ldOworCX0KKworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5uZXN0ZWRCZXN0UmFua3MubGVuZ3RoOyBpKyspCisJeworCQlmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMubmVzdGVkQmVzdFJhbmtzW2ldLmxlbmd0aDsgaisrKQorCQl7CisJCQlyYW5rTGlzdFtpXS5wdXNoKHRoaXMubmVzdGVkQmVzdFJhbmtzW2ldW2pdKTsKKwkJfQorCX0KKworCW1vZGVsLnJhbmtzID0gcmFua3M7Cit9OworCisKKy8qKgorICogRnVuY3Rpb246IGNhbGN1bGF0ZUNyb3NzaW5ncworICogCisgKiBDYWxjdWxhdGVzIHRoZSB0b3RhbCBudW1iZXIgb2YgZWRnZSBjcm9zc2luZyBpbiB0aGUgY3VycmVudCBncmFwaC4KKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGVkZ2UgY3Jvc3NpbmdzIGluIHRoZSBoaWVyYXJjaHkgZ3JhcGgKKyAqIG1vZGVsIGluIHRoZSBjdXJyZW50IGNhbmRpZGF0ZSBsYXlvdXQKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogbW9kZWwgLSB0aGUgaW50ZXJuYWwgbW9kZWwgZGVzY3JpYmluZyB0aGUgaGllcmFyY2h5CisgKi8KK214TWVkaWFuSHlicmlkQ3Jvc3NpbmdSZWR1Y3Rpb24ucHJvdG90eXBlLmNhbGN1bGF0ZUNyb3NzaW5ncyA9IGZ1bmN0aW9uKG1vZGVsKQoreworCXZhciBudW1SYW5rcyA9IG1vZGVsLnJhbmtzLmxlbmd0aDsKKwl2YXIgdG90YWxDcm9zc2luZ3MgPSAwOworCisJZm9yICh2YXIgaSA9IDE7IGkgPCBudW1SYW5rczsgaSsrKQorCXsKKwkJdG90YWxDcm9zc2luZ3MgKz0gdGhpcy5jYWxjdWxhdGVSYW5rQ3Jvc3NpbmcoaSwgbW9kZWwpOworCX0KKwkKKwlyZXR1cm4gdG90YWxDcm9zc2luZ3M7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjYWxjdWxhdGVSYW5rQ3Jvc3NpbmcKKyAqIAorICogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIGVkZ2VzIGNyb3NzaW5ncyBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgcmFuayBhbmQKKyAqIHRoZSByYW5rIGJlbG93IGl0LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWRnZXMgY3Jvc3NpbmdzIHdpdGggdGhlIHJhbmsKKyAqIGJlbmVhdGgKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogaSAtICB0aGUgdG9wbW9zdCByYW5rIG9mIHRoZSBwYWlyICggaGlnaGVyIHJhbmsgdmFsdWUgKQorICogbW9kZWwgLSB0aGUgaW50ZXJuYWwgbW9kZWwgZGVzY3JpYmluZyB0aGUgaGllcmFyY2h5CisgKi8KK214TWVkaWFuSHlicmlkQ3Jvc3NpbmdSZWR1Y3Rpb24ucHJvdG90eXBlLmNhbGN1bGF0ZVJhbmtDcm9zc2luZyA9IGZ1bmN0aW9uKGksIG1vZGVsKQoreworCXZhciB0b3RhbENyb3NzaW5ncyA9IDA7CisJdmFyIHJhbmsgPSBtb2RlbC5yYW5rc1tpXTsKKwl2YXIgcHJldmlvdXNSYW5rID0gbW9kZWwucmFua3NbaSAtIDFdOworCisJdmFyIHRtcEluZGljZXMgPSBbXTsKKworCS8vIEl0ZXJhdGUgb3ZlciB0aGUgdG9wIHJhbmsgYW5kIGZpbGwgaW4gdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24KKwlmb3IgKHZhciBqID0gMDsgaiA8IHJhbmsubGVuZ3RoOyBqKyspCisJeworCQl2YXIgbm9kZSA9IHJhbmtbal07CisJCXZhciByYW5rUG9zaXRpb24gPSBub2RlLmdldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUoaSk7CisJCXZhciBjb25uZWN0ZWRDZWxscyA9IG5vZGUuZ2V0UHJldmlvdXNMYXllckNvbm5lY3RlZENlbGxzKGkpOworCQl2YXIgbm9kZUluZGljZXMgPSBbXTsKKworCQlmb3IgKHZhciBrID0gMDsgayA8IGNvbm5lY3RlZENlbGxzLmxlbmd0aDsgaysrKQorCQl7CisJCQl2YXIgY29ubmVjdGVkTm9kZSA9IGNvbm5lY3RlZENlbGxzW2tdOworCQkJdmFyIG90aGVyQ2VsbFJhbmtQb3NpdGlvbiA9IGNvbm5lY3RlZE5vZGUuZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShpIC0gMSk7CisJCQlub2RlSW5kaWNlcy5wdXNoKG90aGVyQ2VsbFJhbmtQb3NpdGlvbik7CisJCX0KKwkJCisJCW5vZGVJbmRpY2VzLnNvcnQoZnVuY3Rpb24oeCwgeSkgeyByZXR1cm4geCAtIHk7IH0pOworCQl0bXBJbmRpY2VzW3JhbmtQb3NpdGlvbl0gPSBub2RlSW5kaWNlczsKKwl9CisJCisJdmFyIGluZGljZXMgPSBbXTsKKworCWZvciAodmFyIGogPSAwOyBqIDwgdG1wSW5kaWNlcy5sZW5ndGg7IGorKykKKwl7CisJCWluZGljZXMgPSBpbmRpY2VzLmNvbmNhdCh0bXBJbmRpY2VzW2pdKTsKKwl9CisKKwl2YXIgZmlyc3RJbmRleCA9IDE7CisJCisJd2hpbGUgKGZpcnN0SW5kZXggPCBwcmV2aW91c1JhbmsubGVuZ3RoKQorCXsKKwkJZmlyc3RJbmRleCA8PD0gMTsKKwl9CisKKwl2YXIgdHJlZVNpemUgPSAyICogZmlyc3RJbmRleCAtIDE7CisJZmlyc3RJbmRleCAtPSAxOworCisJdmFyIHRyZWUgPSBbXTsKKwkKKwlmb3IgKHZhciBqID0gMDsgaiA8IHRyZWVTaXplOyArK2opCisJeworCQl0cmVlW2pdID0gMDsKKwl9CisKKwlmb3IgKHZhciBqID0gMDsgaiA8IGluZGljZXMubGVuZ3RoOyBqKyspCisJeworCQl2YXIgaW5kZXggPSBpbmRpY2VzW2pdOworCSAgICB2YXIgdHJlZUluZGV4ID0gaW5kZXggKyBmaXJzdEluZGV4OworCSAgICArK3RyZWVbdHJlZUluZGV4XTsKKwkgICAgCisJICAgIHdoaWxlICh0cmVlSW5kZXggPiAwKQorCSAgICB7CisJICAgIAlpZiAodHJlZUluZGV4ICUgMikKKwkgICAgCXsKKwkgICAgCQl0b3RhbENyb3NzaW5ncyArPSB0cmVlW3RyZWVJbmRleCArIDFdOworCSAgICAJfQorCSAgICAgIAorCSAgICAJdHJlZUluZGV4ID0gKHRyZWVJbmRleCAtIDEpID4+IDE7CisJICAgIAkrK3RyZWVbdHJlZUluZGV4XTsKKwkgICAgfQorCX0KKworCXJldHVybiB0b3RhbENyb3NzaW5nczsKK307CisKKy8qKgorICogRnVuY3Rpb246IHRyYW5zcG9zZQorICogCisgKiBUYWtlcyBlYWNoIHBvc3NpYmxlIGFkamFjZW50IGNlbGwgcGFpciBvbiBlYWNoIHJhbmsgYW5kIGNoZWNrcyBpZgorICogc3dhcHBpbmcgdGhlbSBhcm91bmQgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNyb3NzaW5nCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIG1haW5Mb29wSXRlcmF0aW9uIC0gdGhlIGl0ZXJhdGlvbiBudW1iZXIgb2YgdGhlIG1haW4gbG9vcAorICogbW9kZWwgLSB0aGUgaW50ZXJuYWwgbW9kZWwgZGVzY3JpYmluZyB0aGUgaGllcmFyY2h5CisgKi8KK214TWVkaWFuSHlicmlkQ3Jvc3NpbmdSZWR1Y3Rpb24ucHJvdG90eXBlLnRyYW5zcG9zZSA9IGZ1bmN0aW9uKG1haW5Mb29wSXRlcmF0aW9uLCBtb2RlbCkKK3sKKwl2YXIgaW1wcm92ZWQgPSB0cnVlOworCisJLy8gVHJhY2sgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIGluIGNhc2Ugb2YgbG9vcGluZworCXZhciBjb3VudCA9IDA7CisJdmFyIG1heENvdW50ID0gMTA7CisJd2hpbGUgKGltcHJvdmVkICYmIGNvdW50KysgPCBtYXhDb3VudCkKKwl7CisJCS8vIE9uIGNlcnRhaW4gaXRlcmF0aW9ucyBhbGxvdyBhbGxvdyBzd2FwcGluZyBvZiBjZWxsIHBhaXJzIHdpdGgKKwkJLy8gZXF1YWwgZWRnZSBjcm9zc2luZ3Mgc3dpdGNoZWQgb3Igbm90IHN3aXRjaGVkLiBUaGlzIGhlbHAgdG8KKwkJLy8gbnVkZ2UgYSBzdHVjayBsYXlvdXQgaW50byBhIGxvd2VyIGNyb3NzaW5nIHRvdGFsLgorCQl2YXIgbnVkZ2UgPSBtYWluTG9vcEl0ZXJhdGlvbiAlIDIgPT0gMSAmJiBjb3VudCAlIDIgPT0gMTsKKwkJaW1wcm92ZWQgPSBmYWxzZTsKKwkJCisJCWZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWwucmFua3MubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciByYW5rID0gbW9kZWwucmFua3NbaV07CisJCQl2YXIgb3JkZXJlZENlbGxzID0gW107CisJCQkKKwkJCWZvciAodmFyIGogPSAwOyBqIDwgcmFuay5sZW5ndGg7IGorKykKKwkJCXsKKwkJCQl2YXIgY2VsbCA9IHJhbmtbal07CisJCQkJdmFyIHRlbXBSYW5rID0gY2VsbC5nZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKGkpOworCQkJCQorCQkJCS8vIEZJWE1FOiBXb3JrYXJvdW5kIHRvIGF2b2lkIG5lZ2F0aXZlIHRlbXBSYW5rcworCQkJCWlmICh0ZW1wUmFuayA8IDApCisJCQkJeworCQkJCQl0ZW1wUmFuayA9IGo7CisJCQkJfQorCQkJCW9yZGVyZWRDZWxsc1t0ZW1wUmFua10gPSBjZWxsOworCQkJfQorCQkJCisJCQl2YXIgbGVmdENlbGxBYm92ZUNvbm5lY3Rpb25zID0gbnVsbDsKKwkJCXZhciBsZWZ0Q2VsbEJlbG93Q29ubmVjdGlvbnMgPSBudWxsOworCQkJdmFyIHJpZ2h0Q2VsbEFib3ZlQ29ubmVjdGlvbnMgPSBudWxsOworCQkJdmFyIHJpZ2h0Q2VsbEJlbG93Q29ubmVjdGlvbnMgPSBudWxsOworCQkJCisJCQl2YXIgbGVmdEFib3ZlUG9zaXRpb25zID0gbnVsbDsKKwkJCXZhciBsZWZ0QmVsb3dQb3NpdGlvbnMgPSBudWxsOworCQkJdmFyIHJpZ2h0QWJvdmVQb3NpdGlvbnMgPSBudWxsOworCQkJdmFyIHJpZ2h0QmVsb3dQb3NpdGlvbnMgPSBudWxsOworCQkJCisJCQl2YXIgbGVmdENlbGwgPSBudWxsOworCQkJdmFyIHJpZ2h0Q2VsbCA9IG51bGw7CisKKwkJCWZvciAodmFyIGogPSAwOyBqIDwgKHJhbmsubGVuZ3RoIC0gMSk7IGorKykKKwkJCXsKKwkJCQkvLyBGb3IgZWFjaCBpbnRyYS1yYW5rIGFkamFjZW50IHBhaXIgb2YgY2VsbHMKKwkJCQkvLyBzZWUgaWYgc3dhcHBpbmcgdGhlbSBhcm91bmQgd291bGQgcmVkdWNlIHRoZQorCQkJCS8vIG51bWJlciBvZiBlZGdlcyBjcm9zc2luZyB0aGV5IGNhdXNlIGluIHRvdGFsCisJCQkJLy8gT24gZXZlcnkgY2VsbCBwYWlyIGV4Y2VwdCB0aGUgZmlyc3Qgb24gZWFjaCByYW5rLCB3ZQorCQkJCS8vIGNhbiBzYXZlIHByb2Nlc3NpbmcgdXNpbmcgdGhlIHByZXZpb3VzIHZhbHVlcyBmb3IgdGhlCisJCQkJLy8gcmlnaHQgY2VsbCBvbiB0aGUgbmV3IGxlZnQgY2VsbAorCQkJCWlmIChqID09IDApCisJCQkJeworCQkJCQlsZWZ0Q2VsbCA9IG9yZGVyZWRDZWxsc1tqXTsKKwkJCQkJbGVmdENlbGxBYm92ZUNvbm5lY3Rpb25zID0gbGVmdENlbGwKKwkJCQkJCQkuZ2V0TmV4dExheWVyQ29ubmVjdGVkQ2VsbHMoaSk7CisJCQkJCWxlZnRDZWxsQmVsb3dDb25uZWN0aW9ucyA9IGxlZnRDZWxsCisJCQkJCQkJLmdldFByZXZpb3VzTGF5ZXJDb25uZWN0ZWRDZWxscyhpKTsKKwkJCQkJbGVmdEFib3ZlUG9zaXRpb25zID0gW107CisJCQkJCWxlZnRCZWxvd1Bvc2l0aW9ucyA9IFtdOworCQkJCQkKKwkJCQkJZm9yICh2YXIgayA9IDA7IGsgPCBsZWZ0Q2VsbEFib3ZlQ29ubmVjdGlvbnMubGVuZ3RoOyBrKyspCisJCQkJCXsKKwkJCQkJCWxlZnRBYm92ZVBvc2l0aW9uc1trXSA9IGxlZnRDZWxsQWJvdmVDb25uZWN0aW9uc1trXS5nZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKGkgKyAxKTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJZm9yICh2YXIgayA9IDA7IGsgPCBsZWZ0Q2VsbEJlbG93Q29ubmVjdGlvbnMubGVuZ3RoOyBrKyspCisJCQkJCXsKKwkJCQkJCWxlZnRCZWxvd1Bvc2l0aW9uc1trXSA9IGxlZnRDZWxsQmVsb3dDb25uZWN0aW9uc1trXS5nZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKGkgLSAxKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlsZWZ0Q2VsbEFib3ZlQ29ubmVjdGlvbnMgPSByaWdodENlbGxBYm92ZUNvbm5lY3Rpb25zOworCQkJCQlsZWZ0Q2VsbEJlbG93Q29ubmVjdGlvbnMgPSByaWdodENlbGxCZWxvd0Nvbm5lY3Rpb25zOworCQkJCQlsZWZ0QWJvdmVQb3NpdGlvbnMgPSByaWdodEFib3ZlUG9zaXRpb25zOworCQkJCQlsZWZ0QmVsb3dQb3NpdGlvbnMgPSByaWdodEJlbG93UG9zaXRpb25zOworCQkJCQlsZWZ0Q2VsbCA9IHJpZ2h0Q2VsbDsKKwkJCQl9CisJCQkJCisJCQkJcmlnaHRDZWxsID0gb3JkZXJlZENlbGxzW2ogKyAxXTsKKwkJCQlyaWdodENlbGxBYm92ZUNvbm5lY3Rpb25zID0gcmlnaHRDZWxsCisJCQkJCQkuZ2V0TmV4dExheWVyQ29ubmVjdGVkQ2VsbHMoaSk7CisJCQkJcmlnaHRDZWxsQmVsb3dDb25uZWN0aW9ucyA9IHJpZ2h0Q2VsbAorCQkJCQkJLmdldFByZXZpb3VzTGF5ZXJDb25uZWN0ZWRDZWxscyhpKTsKKworCQkJCXJpZ2h0QWJvdmVQb3NpdGlvbnMgPSBbXTsKKwkJCQlyaWdodEJlbG93UG9zaXRpb25zID0gW107CisKKwkJCQlmb3IgKHZhciBrID0gMDsgayA8IHJpZ2h0Q2VsbEFib3ZlQ29ubmVjdGlvbnMubGVuZ3RoOyBrKyspCisJCQkJeworCQkJCQlyaWdodEFib3ZlUG9zaXRpb25zW2tdID0gcmlnaHRDZWxsQWJvdmVDb25uZWN0aW9uc1trXS5nZXRHZW5lcmFsUHVycG9zZVZhcmlhYmxlKGkgKyAxKTsKKwkJCQl9CisJCQkJCisJCQkJZm9yICh2YXIgayA9IDA7IGsgPCByaWdodENlbGxCZWxvd0Nvbm5lY3Rpb25zLmxlbmd0aDsgaysrKQorCQkJCXsKKwkJCQkJcmlnaHRCZWxvd1Bvc2l0aW9uc1trXSA9IHJpZ2h0Q2VsbEJlbG93Q29ubmVjdGlvbnNba10uZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShpIC0gMSk7CisJCQkJfQorCisJCQkJdmFyIHRvdGFsQ3VycmVudENyb3NzaW5ncyA9IDA7CisJCQkJdmFyIHRvdGFsU3dpdGNoZWRDcm9zc2luZ3MgPSAwOworCQkJCQorCQkJCWZvciAodmFyIGsgPSAwOyBrIDwgbGVmdEFib3ZlUG9zaXRpb25zLmxlbmd0aDsgaysrKQorCQkJCXsKKwkJCQkJZm9yICh2YXIgaWsgPSAwOyBpayA8IHJpZ2h0QWJvdmVQb3NpdGlvbnMubGVuZ3RoOyBpaysrKQorCQkJCQl7CisJCQkJCQlpZiAobGVmdEFib3ZlUG9zaXRpb25zW2tdID4gcmlnaHRBYm92ZVBvc2l0aW9uc1tpa10pCisJCQkJCQl7CisJCQkJCQkJdG90YWxDdXJyZW50Q3Jvc3NpbmdzKys7CisJCQkJCQl9CisKKwkJCQkJCWlmIChsZWZ0QWJvdmVQb3NpdGlvbnNba10gPCByaWdodEFib3ZlUG9zaXRpb25zW2lrXSkKKwkJCQkJCXsKKwkJCQkJCQl0b3RhbFN3aXRjaGVkQ3Jvc3NpbmdzKys7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJZm9yICh2YXIgayA9IDA7IGsgPCBsZWZ0QmVsb3dQb3NpdGlvbnMubGVuZ3RoOyBrKyspCisJCQkJeworCQkJCQlmb3IgKHZhciBpayA9IDA7IGlrIDwgcmlnaHRCZWxvd1Bvc2l0aW9ucy5sZW5ndGg7IGlrKyspCisJCQkJCXsKKwkJCQkJCWlmIChsZWZ0QmVsb3dQb3NpdGlvbnNba10gPiByaWdodEJlbG93UG9zaXRpb25zW2lrXSkKKwkJCQkJCXsKKwkJCQkJCQl0b3RhbEN1cnJlbnRDcm9zc2luZ3MrKzsKKwkJCQkJCX0KKworCQkJCQkJaWYgKGxlZnRCZWxvd1Bvc2l0aW9uc1trXSA8IHJpZ2h0QmVsb3dQb3NpdGlvbnNbaWtdKQorCQkJCQkJeworCQkJCQkJCXRvdGFsU3dpdGNoZWRDcm9zc2luZ3MrKzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQlpZiAoKHRvdGFsU3dpdGNoZWRDcm9zc2luZ3MgPCB0b3RhbEN1cnJlbnRDcm9zc2luZ3MpIHx8CisJCQkJCSh0b3RhbFN3aXRjaGVkQ3Jvc3NpbmdzID09IHRvdGFsQ3VycmVudENyb3NzaW5ncyAmJgorCQkJCQludWRnZSkpCisJCQkJeworCQkJCQl2YXIgdGVtcCA9IGxlZnRDZWxsLmdldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUoaSk7CisJCQkJCWxlZnRDZWxsLnNldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUoaSwgcmlnaHRDZWxsCisJCQkJCQkJLmdldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUoaSkpOworCQkJCQlyaWdodENlbGwuc2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShpLCB0ZW1wKTsKKworCQkJCQkvLyBXaXRoIHRoaXMgcGFpciBleGNoYW5nZWQgd2UgaGF2ZSB0byBzd2l0Y2ggYWxsIG9mCisJCQkJCS8vIHZhbHVlcyBmb3IgdGhlIGxlZnQgY2VsbCB0byB0aGUgcmlnaHQgY2VsbCBzbyB0aGUKKwkJCQkJLy8gbmV4dCBpdGVyYXRpb24gZm9yIHRoaXMgcmFuayB1c2VzIGl0IGFzIHRoZSBsZWZ0CisJCQkJCS8vIGNlbGwgYWdhaW4KKwkJCQkJcmlnaHRDZWxsQWJvdmVDb25uZWN0aW9ucyA9IGxlZnRDZWxsQWJvdmVDb25uZWN0aW9uczsKKwkJCQkJcmlnaHRDZWxsQmVsb3dDb25uZWN0aW9ucyA9IGxlZnRDZWxsQmVsb3dDb25uZWN0aW9uczsKKwkJCQkJcmlnaHRBYm92ZVBvc2l0aW9ucyA9IGxlZnRBYm92ZVBvc2l0aW9uczsKKwkJCQkJcmlnaHRCZWxvd1Bvc2l0aW9ucyA9IGxlZnRCZWxvd1Bvc2l0aW9uczsKKwkJCQkJcmlnaHRDZWxsID0gbGVmdENlbGw7CisJCQkJCQorCQkJCQlpZiAoIW51ZGdlKQorCQkJCQl7CisJCQkJCQkvLyBEb24ndCBjb3VudCBudWRnZXMgYXMgaW1wcm92ZW1lbnQgb3Igd2UnbGwgZW5kCisJCQkJCQkvLyB1cCBzdHVjayBpbiB0d28gY29tYmluYXRpb25zIGFuZCBub3QgZmluaXNoaW5nCisJCQkJCQkvLyBhcyBlYXJseSBhcyB3ZSBzaG91bGQKKwkJCQkJCWltcHJvdmVkID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHdlaWdodGVkTWVkaWFuCisgKiAKKyAqIFN3ZWVwcyB1cCBvciBkb3duIHRoZSBsYXlvdXQgYXR0ZW1wdGluZyB0byBtaW5pbWlzZSB0aGUgbWVkaWFuIHBsYWNlbWVudAorICogb2YgY29ubmVjdGVkIGNlbGxzIG9uIGFkamFjZW50IHJhbmtzCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGl0ZXJhdGlvbiAtIHRoZSBpdGVyYXRpb24gbnVtYmVyIG9mIHRoZSBtYWluIGxvb3AKKyAqIG1vZGVsIC0gdGhlIGludGVybmFsIG1vZGVsIGRlc2NyaWJpbmcgdGhlIGhpZXJhcmNoeQorICovCitteE1lZGlhbkh5YnJpZENyb3NzaW5nUmVkdWN0aW9uLnByb3RvdHlwZS53ZWlnaHRlZE1lZGlhbiA9IGZ1bmN0aW9uKGl0ZXJhdGlvbiwgbW9kZWwpCit7CisJLy8gUmV2ZXJzZSBzd2VlcCBkaXJlY3Rpb24gZWFjaCB0aW1lIHRocm91Z2ggdGhpcyBtZXRob2QKKwl2YXIgZG93bndhcmRTd2VlcCA9IChpdGVyYXRpb24gJSAyID09IDApOworCWlmIChkb3dud2FyZFN3ZWVwKQorCXsKKwkJZm9yICh2YXIgaiA9IG1vZGVsLm1heFJhbmsgLSAxOyBqID49IDA7IGotLSkKKwkJeworCQkJdGhpcy5tZWRpYW5SYW5rKGosIGRvd253YXJkU3dlZXApOworCQl9CisJfQorCWVsc2UKKwl7CisJCWZvciAodmFyIGogPSAxOyBqIDwgbW9kZWwubWF4UmFuazsgaisrKQorCQl7CisJCQl0aGlzLm1lZGlhblJhbmsoaiwgZG93bndhcmRTd2VlcCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtZWRpYW5SYW5rCisgKiAKKyAqIEF0dGVtcHRzIHRvIG1pbmltaXNlIHRoZSBtZWRpYW4gcGxhY2VtZW50IG9mIGNvbm5lY3RlZCBjZWxscyBvbiB0aGlzIHJhbmsKKyAqIGFuZCBvbmUgb2YgdGhlIGFkamFjZW50IHJhbmtzCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHJhbmtWYWx1ZSAtIHRoZSBsYXllciBudW1iZXIgb2YgdGhpcyByYW5rCisgKiBkb3dud2FyZFN3ZWVwIC0gd2hldGhlciBvciBub3QgdGhpcyBpcyBhIGRvd253YXJkIHN3ZWVwIHRocm91Z2ggdGhlIGdyYXBoCisgKi8KK214TWVkaWFuSHlicmlkQ3Jvc3NpbmdSZWR1Y3Rpb24ucHJvdG90eXBlLm1lZGlhblJhbmsgPSBmdW5jdGlvbihyYW5rVmFsdWUsIGRvd253YXJkU3dlZXApCit7CisJdmFyIG51bUNlbGxzRm9yUmFuayA9IHRoaXMubmVzdGVkQmVzdFJhbmtzW3JhbmtWYWx1ZV0ubGVuZ3RoOworCXZhciBtZWRpYW5WYWx1ZXMgPSBbXTsKKwl2YXIgcmVzZXJ2ZWRQb3NpdGlvbnMgPSBbXTsKKworCWZvciAodmFyIGkgPSAwOyBpIDwgbnVtQ2VsbHNGb3JSYW5rOyBpKyspCisJeworCQl2YXIgY2VsbCA9IHRoaXMubmVzdGVkQmVzdFJhbmtzW3JhbmtWYWx1ZV1baV07CisJCXZhciBzb3J0ZXJFbnRyeSA9IG5ldyBNZWRpYW5DZWxsU29ydGVyKCk7CisJCXNvcnRlckVudHJ5LmNlbGwgPSBjZWxsOworCisJCS8vIEZsaXAgd2hldGhlciBvciBub3QgZXF1YWwgbWVkaWFucyBhcmUgZmxpcHBlZCBvbiB1cCBhbmQgZG93bgorCQkvLyBzd2VlcHMKKwkJLy8gVE9ETyByZS1pbXBsZW1lbnQgc29tZSBraW5kIG9mIG51ZGdlCisJCS8vIG1lZGlhblZhbHVlc1tpXS5udWRnZSA9ICFkb3dud2FyZFN3ZWVwOworCQl2YXIgbmV4dExldmVsQ29ubmVjdGVkQ2VsbHM7CisJCQorCQlpZiAoZG93bndhcmRTd2VlcCkKKwkJeworCQkJbmV4dExldmVsQ29ubmVjdGVkQ2VsbHMgPSBjZWxsCisJCQkJCS5nZXROZXh0TGF5ZXJDb25uZWN0ZWRDZWxscyhyYW5rVmFsdWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJbmV4dExldmVsQ29ubmVjdGVkQ2VsbHMgPSBjZWxsCisJCQkJCS5nZXRQcmV2aW91c0xheWVyQ29ubmVjdGVkQ2VsbHMocmFua1ZhbHVlKTsKKwkJfQorCQkKKwkJdmFyIG5leHRSYW5rVmFsdWU7CisJCQorCQlpZiAoZG93bndhcmRTd2VlcCkKKwkJeworCQkJbmV4dFJhbmtWYWx1ZSA9IHJhbmtWYWx1ZSArIDE7CisJCX0KKwkJZWxzZQorCQl7CisJCQluZXh0UmFua1ZhbHVlID0gcmFua1ZhbHVlIC0gMTsKKwkJfQorCisJCWlmIChuZXh0TGV2ZWxDb25uZWN0ZWRDZWxscyAhPSBudWxsCisJCQkJJiYgbmV4dExldmVsQ29ubmVjdGVkQ2VsbHMubGVuZ3RoICE9IDApCisJCXsKKwkJCXNvcnRlckVudHJ5Lm1lZGlhblZhbHVlID0gdGhpcy5tZWRpYW5WYWx1ZSgKKwkJCQkJbmV4dExldmVsQ29ubmVjdGVkQ2VsbHMsIG5leHRSYW5rVmFsdWUpOworCQkJbWVkaWFuVmFsdWVzLnB1c2goc29ydGVyRW50cnkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gTm9kZXMgd2l0aCBubyBhZGphY2VudCB2ZXJ0aWNlcyBhcmUgZmxhZ2dlZCBpbiB0aGUgcmVzZXJ2ZWQgYXJyYXkKKwkJCS8vIHRvIGluZGljYXRlIHRoZXkgc2hvdWxkIGJlIGxlZnQgaW4gdGhlaXIgY3VycmVudCBwb3NpdGlvbi4KKwkJCXJlc2VydmVkUG9zaXRpb25zW2NlbGwuZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShyYW5rVmFsdWUpXSA9IHRydWU7CisJCX0KKwl9CisJCisJbWVkaWFuVmFsdWVzLnNvcnQoTWVkaWFuQ2VsbFNvcnRlci5wcm90b3R5cGUuY29tcGFyZSk7CisJCisJLy8gU2V0IHRoZSBuZXcgcG9zaXRpb24gb2YgZWFjaCBub2RlIHdpdGhpbiB0aGUgcmFuayB1c2luZworCS8vIGl0cyB0ZW1wIHZhcmlhYmxlCisJZm9yICh2YXIgaSA9IDA7IGkgPCBudW1DZWxsc0ZvclJhbms7IGkrKykKKwl7CisJCWlmIChyZXNlcnZlZFBvc2l0aW9uc1tpXSA9PSBudWxsKQorCQl7CisJCQl2YXIgY2VsbCA9IG1lZGlhblZhbHVlcy5zaGlmdCgpLmNlbGw7CisJCQljZWxsLnNldEdlbmVyYWxQdXJwb3NlVmFyaWFibGUocmFua1ZhbHVlLCBpKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IG1lZGlhblZhbHVlCisgKiAKKyAqIENhbGN1bGF0ZXMgdGhlIG1lZGlhbiByYW5rIG9yZGVyIHBvc2l0aW9uaW5nIGZvciB0aGUgc3BlY2lmaWVkIGNlbGwgdXNpbmcKKyAqIHRoZSBjb25uZWN0ZWQgY2VsbHMgb24gdGhlIHNwZWNpZmllZCByYW5rLiBSZXR1cm5zIHRoZSBtZWRpYW4gcmFuaworICogb3JkZXJpbmcgdmFsdWUgb2YgdGhlIGNvbm5lY3RlZCBjZWxscworICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjb25uZWN0ZWRDZWxscyAtIHRoZSBjZWxscyBvbiB0aGUgc3BlY2lmaWVkIHJhbmsgY29ubmVjdGVkIHRvIHRoZQorICogc3BlY2lmaWVkIGNlbGwKKyAqIHJhbmtWYWx1ZSAtIHRoZSByYW5rIHRoYXQgdGhlIGNvbm5lY3RlZCBjZWxsIGxpZSB1cG9uCisgKi8KK214TWVkaWFuSHlicmlkQ3Jvc3NpbmdSZWR1Y3Rpb24ucHJvdG90eXBlLm1lZGlhblZhbHVlID0gZnVuY3Rpb24oY29ubmVjdGVkQ2VsbHMsIHJhbmtWYWx1ZSkKK3sKKwl2YXIgbWVkaWFuVmFsdWVzID0gW107CisJdmFyIGFycmF5Q291bnQgPSAwOworCQorCWZvciAodmFyIGkgPSAwOyBpIDwgY29ubmVjdGVkQ2VsbHMubGVuZ3RoOyBpKyspCisJeworCQl2YXIgY2VsbCA9IGNvbm5lY3RlZENlbGxzW2ldOworCQltZWRpYW5WYWx1ZXNbYXJyYXlDb3VudCsrXSA9IGNlbGwuZ2V0R2VuZXJhbFB1cnBvc2VWYXJpYWJsZShyYW5rVmFsdWUpOworCX0KKworCS8vIFNvcnQoKSBzb3J0cyBsZXhpY29ncmFwaGljYWxseSBieSBkZWZhdWx0IChpLmUuIDExIGJlZm9yZSA5KSBzbyBmb3JjZQorCS8vIG51bWVyaWNhbCBvcmRlciBzb3J0CisJbWVkaWFuVmFsdWVzLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSAtIGI7fSk7CisJCisJaWYgKGFycmF5Q291bnQgJSAyID09IDEpCisJeworCQkvLyBGb3Igb2RkIG51bWJlcnMgb2YgYWRqYWNlbnQgdmVydGljZXMgcmV0dXJuIHRoZSBtZWRpYW4KKwkJcmV0dXJuIG1lZGlhblZhbHVlc1tNYXRoLmZsb29yKGFycmF5Q291bnQgLyAyKV07CisJfQorCWVsc2UgaWYgKGFycmF5Q291bnQgPT0gMikKKwl7CisJCXJldHVybiAoKG1lZGlhblZhbHVlc1swXSArIG1lZGlhblZhbHVlc1sxXSkgLyAyLjApOworCX0KKwllbHNlCisJeworCQl2YXIgbWVkaWFuUG9pbnQgPSBhcnJheUNvdW50IC8gMjsKKwkJdmFyIGxlZnRNZWRpYW4gPSBtZWRpYW5WYWx1ZXNbbWVkaWFuUG9pbnQgLSAxXSAtIG1lZGlhblZhbHVlc1swXTsKKwkJdmFyIHJpZ2h0TWVkaWFuID0gbWVkaWFuVmFsdWVzW2FycmF5Q291bnQgLSAxXQorCQkJCS0gbWVkaWFuVmFsdWVzW21lZGlhblBvaW50XTsKKworCQlyZXR1cm4gKG1lZGlhblZhbHVlc1ttZWRpYW5Qb2ludCAtIDFdICogcmlnaHRNZWRpYW4gKyBtZWRpYW5WYWx1ZXNbbWVkaWFuUG9pbnRdCisJCQkJKiBsZWZ0TWVkaWFuKQorCQkJCS8gKGxlZnRNZWRpYW4gKyByaWdodE1lZGlhbik7CisJfQorfTsKKworLyoqCisgKiBDbGFzczogTWVkaWFuQ2VsbFNvcnRlcgorICogCisgKiBBIHV0aWxpdHkgY2xhc3MgdXNlZCB0byB0cmFjayBjZWxscyB3aGlsc3Qgc29ydGluZyBvY2N1cnMgb24gdGhlIG1lZGlhbgorICogdmFsdWVzLiBEb2VzIG5vdCB2aW9sYXRlICh4LmNvbXBhcmVUbyh5KT09MCkgPT0gKHguZXF1YWxzKHkpKQorICoKKyAqIENvbnN0cnVjdG9yOiBNZWRpYW5DZWxsU29ydGVyCisgKiAKKyAqIENvbnN0cnVjdHMgYSBuZXcgbWVkaWFuIGNlbGwgc29ydGVyLgorICovCitmdW5jdGlvbiBNZWRpYW5DZWxsU29ydGVyKCkKK3sKKwkvLyBlbXB0eQorfTsKKworLyoqCisgKiBWYXJpYWJsZTogbWVkaWFuVmFsdWUKKyAqIAorICogVGhlIHdlaWdodGVkIHZhbHVlIG9mIHRoZSBjZWxsIHN0b3JlZC4KKyAqLworTWVkaWFuQ2VsbFNvcnRlci5wcm90b3R5cGUubWVkaWFuVmFsdWUgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBjZWxsCisgKiAKKyAqIFRoZSBjZWxsIHdob3NlIG1lZGlhbiB2YWx1ZSBpcyBiZWluZyBjYWxjdWxhdGVkCisgKi8KK01lZGlhbkNlbGxTb3J0ZXIucHJvdG90eXBlLmNlbGwgPSBmYWxzZTsKKworLyoqCisgKiBGdW5jdGlvbjogY29tcGFyZQorICogCisgKiBDb21wYXJlcyB0d28gTWVkaWFuQ2VsbFNvcnRlcnMuCisgKi8KK01lZGlhbkNlbGxTb3J0ZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbihhLCBiKQoreworCWlmIChhICE9IG51bGwgJiYgYiAhPSBudWxsKQorCXsKKwkJaWYgKGIubWVkaWFuVmFsdWUgPiBhLm1lZGlhblZhbHVlKQorCQl7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZWxzZSBpZiAoYi5tZWRpYW5WYWx1ZSA8IGEubWVkaWFuVmFsdWUpCisJCXsKKwkJCXJldHVybiAxOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIDA7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL3N0YWdlL214TWluaW11bUN5Y2xlUmVtb3Zlci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL3N0YWdlL214TWluaW11bUN5Y2xlUmVtb3Zlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQ2NzU1Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9oaWVyYXJjaGljYWwvc3RhZ2UvbXhNaW5pbXVtQ3ljbGVSZW1vdmVyLmpzCkBAIC0wLDAgKzEsMTA4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteE1pbmltdW1DeWNsZVJlbW92ZXIKKyAqIAorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGZpcnN0IHN0YWdlIG9mIHRoZSBTdWdpeWFtYSBsYXlvdXQuIFN0cmFpZ2h0Zm9yd2FyZAorICogbG9uZ2VzdCBwYXRoIGNhbGN1bGF0aW9uIG9mIGxheWVyIGFzc2lnbm1lbnQKKyAqIAorICogQ29uc3RydWN0b3I6IG14TWluaW11bUN5Y2xlUmVtb3ZlcgorICoKKyAqIENyZWF0ZXMgYSBjeWNsZSByZW1vdmVyIGZvciB0aGUgZ2l2ZW4gaW50ZXJuYWwgbW9kZWwuCisgKi8KK2Z1bmN0aW9uIG14TWluaW11bUN5Y2xlUmVtb3ZlcihsYXlvdXQpCit7CisJdGhpcy5sYXlvdXQgPSBsYXlvdXQ7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhIaWVyYXJjaGljYWxMYXlvdXRTdGFnZS4KKyAqLworbXhNaW5pbXVtQ3ljbGVSZW1vdmVyLnByb3RvdHlwZSA9IG5ldyBteEhpZXJhcmNoaWNhbExheW91dFN0YWdlKCk7CitteE1pbmltdW1DeWNsZVJlbW92ZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhNaW5pbXVtQ3ljbGVSZW1vdmVyOworCisvKioKKyAqIFZhcmlhYmxlOiBsYXlvdXQKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgPG14SGllcmFyY2hpY2FsTGF5b3V0Pi4KKyAqLworbXhNaW5pbXVtQ3ljbGVSZW1vdmVyLnByb3RvdHlwZS5sYXlvdXQgPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiBleGVjdXRlCisgKiAKKyAqIFRha2VzIHRoZSBncmFwaCBkZXRhaWwgYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gd2l0aGluIHRoZSBmYWNhZGUKKyAqIGFuZCBjcmVhdGVzIHRoZSByZXN1bHRpbmcgbGFpZCBvdXQgZ3JhcGggd2l0aGluIHRoYXQgZmFjYWRlIGZvciBmdXJ0aGVyCisgKiB1c2UuCisgKi8KK214TWluaW11bUN5Y2xlUmVtb3Zlci5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uKHBhcmVudCkKK3sKKwl2YXIgbW9kZWwgPSB0aGlzLmxheW91dC5nZXRNb2RlbCgpOworCXZhciBzZWVuTm9kZXMgPSBuZXcgT2JqZWN0KCk7CisJdmFyIHVuc2Vlbk5vZGVzQXJyYXkgPSBtb2RlbC52ZXJ0ZXhNYXBwZXIuZ2V0VmFsdWVzKCk7CisJdmFyIHVuc2Vlbk5vZGVzID0gbmV3IE9iamVjdCgpOworCQorCWZvciAodmFyIGkgPSAwOyBpIDwgdW5zZWVuTm9kZXNBcnJheS5sZW5ndGg7IGkrKykKKwl7CisJCXVuc2Vlbk5vZGVzW3Vuc2Vlbk5vZGVzQXJyYXlbaV0uaWRdID0gdW5zZWVuTm9kZXNBcnJheVtpXTsKKwl9CisJCisJLy8gUGVyZm9ybSBhIGRmcyB0aHJvdWdoIHRoZSBpbnRlcm5hbCBtb2RlbC4gSWYgYSBjeWNsZSBpcyBmb3VuZCwKKwkvLyByZXZlcnNlIGl0LgorCXZhciByb290c0FycmF5ID0gbnVsbDsKKwkKKwlpZiAobW9kZWwucm9vdHMgIT0gbnVsbCkKKwl7CisJCXZhciBtb2RlbFJvb3RzID0gbW9kZWwucm9vdHM7CisJCXJvb3RzQXJyYXkgPSBbXTsKKwkJCisJCWZvciAodmFyIGkgPSAwOyBpIDwgbW9kZWxSb290cy5sZW5ndGg7IGkrKykKKwkJeworCQkJcm9vdHNBcnJheVtpXSA9IG1vZGVsLnZlcnRleE1hcHBlci5nZXQobW9kZWxSb290c1tpXSk7CisJCX0KKwl9CisKKwltb2RlbC52aXNpdChmdW5jdGlvbihwYXJlbnQsIG5vZGUsIGNvbm5lY3RpbmdFZGdlLCBsYXllciwgc2VlbikKKwl7CisJCS8vIENoZWNrIGlmIHRoZSBjZWxsIGlzIGluIGl0J3Mgb3duIGFuY2VzdG9yIGxpc3QsIGlmIHNvCisJCS8vIGludmVydCB0aGUgY29ubmVjdGluZyBlZGdlIGFuZCByZXZlcnNlIHRoZSB0YXJnZXQvc291cmNlCisJCS8vIHJlbGF0aW9uc2hpcCB0byB0aGF0IGVkZ2UgaW4gdGhlIHBhcmVudCBhbmQgdGhlIGNlbGwKKwkJaWYgKG5vZGUuaXNBbmNlc3RvcihwYXJlbnQpKQorCQl7CisJCQljb25uZWN0aW5nRWRnZS5pbnZlcnQoKTsKKwkJCW14VXRpbHMucmVtb3ZlKGNvbm5lY3RpbmdFZGdlLCBwYXJlbnQuY29ubmVjdHNBc1NvdXJjZSk7CisJCQlwYXJlbnQuY29ubmVjdHNBc1RhcmdldC5wdXNoKGNvbm5lY3RpbmdFZGdlKTsKKwkJCW14VXRpbHMucmVtb3ZlKGNvbm5lY3RpbmdFZGdlLCBub2RlLmNvbm5lY3RzQXNUYXJnZXQpOworCQkJbm9kZS5jb25uZWN0c0FzU291cmNlLnB1c2goY29ubmVjdGluZ0VkZ2UpOworCQl9CisJCQorCQlzZWVuTm9kZXNbbm9kZS5pZF0gPSBub2RlOworCQlkZWxldGUgdW5zZWVuTm9kZXNbbm9kZS5pZF07CisJfSwgcm9vdHNBcnJheSwgdHJ1ZSwgbnVsbCk7CisKKwkvLyBJZiB0aGVyZSBhcmUgYW55IG5vZGVzIHRoYXQgc2hvdWxkIGJlIG5vZGVzIHRoYXQgdGhlIGRmcyBjYW4gbWlzcworCS8vIHRoZXNlIG5lZWQgdG8gYmUgcHJvY2Vzc2VkIHdpdGggdGhlIGRmcyBhbmQgdGhlIHJvb3RzIGFzc2lnbmVkCisJLy8gY29ycmVjdGx5IHRvIGZvcm0gYSBjb3JyZWN0IGludGVybmFsIG1vZGVsCisJdmFyIHNlZW5Ob2Rlc0NvcHkgPSBteFV0aWxzLmNsb25lKHNlZW5Ob2RlcywgbnVsbCwgdHJ1ZSk7CisKKwkvLyBQaWNrIGEgcmFuZG9tIGNlbGwgYW5kIGRmcyBmcm9tIGl0CisJbW9kZWwudmlzaXQoZnVuY3Rpb24ocGFyZW50LCBub2RlLCBjb25uZWN0aW5nRWRnZSwgbGF5ZXIsIHNlZW4pCisJeworCQkvLyBDaGVjayBpZiB0aGUgY2VsbCBpcyBpbiBpdCdzIG93biBhbmNlc3RvciBsaXN0LCBpZiBzbworCQkvLyBpbnZlcnQgdGhlIGNvbm5lY3RpbmcgZWRnZSBhbmQgcmV2ZXJzZSB0aGUgdGFyZ2V0L3NvdXJjZQorCQkvLyByZWxhdGlvbnNoaXAgdG8gdGhhdCBlZGdlIGluIHRoZSBwYXJlbnQgYW5kIHRoZSBjZWxsCisJCWlmIChub2RlLmlzQW5jZXN0b3IocGFyZW50KSkKKwkJeworCQkJY29ubmVjdGluZ0VkZ2UuaW52ZXJ0KCk7CisJCQlteFV0aWxzLnJlbW92ZShjb25uZWN0aW5nRWRnZSwgcGFyZW50LmNvbm5lY3RzQXNTb3VyY2UpOworCQkJbm9kZS5jb25uZWN0c0FzU291cmNlLnB1c2goY29ubmVjdGluZ0VkZ2UpOworCQkJcGFyZW50LmNvbm5lY3RzQXNUYXJnZXQucHVzaChjb25uZWN0aW5nRWRnZSk7CisJCQlteFV0aWxzLnJlbW92ZShjb25uZWN0aW5nRWRnZSwgbm9kZS5jb25uZWN0c0FzVGFyZ2V0KTsKKwkJfQorCQkKKwkJc2Vlbk5vZGVzW25vZGUuaWRdID0gbm9kZTsKKwkJZGVsZXRlIHVuc2Vlbk5vZGVzW25vZGUuaWRdOworCX0sIHVuc2Vlbk5vZGVzLCB0cnVlLCBzZWVuTm9kZXNDb3B5KTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L2hpZXJhcmNoaWNhbC9zdGFnZS9teFN3aW1sYW5lT3JkZXJpbmcuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L2hpZXJhcmNoaWNhbC9zdGFnZS9teFN3aW1sYW5lT3JkZXJpbmcuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM3MWY0MAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL3N0YWdlL214U3dpbWxhbmVPcmRlcmluZy5qcwpAQCAtMCwwICsxLDk2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFN3aW1sYW5lT3JkZXJpbmcKKyAqIAorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGZpcnN0IHN0YWdlIG9mIHRoZSBTdWdpeWFtYSBsYXlvdXQuIFN0cmFpZ2h0Zm9yd2FyZAorICogbG9uZ2VzdCBwYXRoIGNhbGN1bGF0aW9uIG9mIGxheWVyIGFzc2lnbm1lbnQKKyAqIAorICogQ29uc3RydWN0b3I6IG14U3dpbWxhbmVPcmRlcmluZworICoKKyAqIENyZWF0ZXMgYSBjeWNsZSByZW1vdmVyIGZvciB0aGUgZ2l2ZW4gaW50ZXJuYWwgbW9kZWwuCisgKi8KK2Z1bmN0aW9uIG14U3dpbWxhbmVPcmRlcmluZyhsYXlvdXQpCit7CisJdGhpcy5sYXlvdXQgPSBsYXlvdXQ7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhIaWVyYXJjaGljYWxMYXlvdXRTdGFnZS4KKyAqLworbXhTd2ltbGFuZU9yZGVyaW5nLnByb3RvdHlwZSA9IG5ldyBteEhpZXJhcmNoaWNhbExheW91dFN0YWdlKCk7CitteFN3aW1sYW5lT3JkZXJpbmcucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhTd2ltbGFuZU9yZGVyaW5nOworCisvKioKKyAqIFZhcmlhYmxlOiBsYXlvdXQKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgPG14SGllcmFyY2hpY2FsTGF5b3V0Pi4KKyAqLworbXhTd2ltbGFuZU9yZGVyaW5nLnByb3RvdHlwZS5sYXlvdXQgPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiBleGVjdXRlCisgKiAKKyAqIFRha2VzIHRoZSBncmFwaCBkZXRhaWwgYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gd2l0aGluIHRoZSBmYWNhZGUKKyAqIGFuZCBjcmVhdGVzIHRoZSByZXN1bHRpbmcgbGFpZCBvdXQgZ3JhcGggd2l0aGluIHRoYXQgZmFjYWRlIGZvciBmdXJ0aGVyCisgKiB1c2UuCisgKi8KK214U3dpbWxhbmVPcmRlcmluZy5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uKHBhcmVudCkKK3sKKwl2YXIgbW9kZWwgPSB0aGlzLmxheW91dC5nZXRNb2RlbCgpOworCXZhciBzZWVuTm9kZXMgPSBuZXcgT2JqZWN0KCk7CisJdmFyIHVuc2Vlbk5vZGVzID0gbXhVdGlscy5jbG9uZShtb2RlbC52ZXJ0ZXhNYXBwZXIsIG51bGwsIHRydWUpOworCQorCS8vIFBlcmZvcm0gYSBkZnMgdGhyb3VnaCB0aGUgaW50ZXJuYWwgbW9kZWwuIElmIGEgY3ljbGUgaXMgZm91bmQsCisJLy8gcmV2ZXJzZSBpdC4KKwl2YXIgcm9vdHNBcnJheSA9IG51bGw7CisJCisJaWYgKG1vZGVsLnJvb3RzICE9IG51bGwpCisJeworCQl2YXIgbW9kZWxSb290cyA9IG1vZGVsLnJvb3RzOworCQlyb290c0FycmF5ID0gW107CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsUm9vdHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBub2RlSWQgPSBteENlbGxQYXRoLmNyZWF0ZShtb2RlbFJvb3RzW2ldKTsKKwkJCXJvb3RzQXJyYXlbaV0gPSBtb2RlbC52ZXJ0ZXhNYXBwZXIuZ2V0KG1vZGVsUm9vdHNbaV0pOworCQl9CisJfQorCisJbW9kZWwudmlzaXQoZnVuY3Rpb24ocGFyZW50LCBub2RlLCBjb25uZWN0aW5nRWRnZSwgbGF5ZXIsIHNlZW4pCisJeworCQkvLyBDaGVjayBpZiB0aGUgY2VsbCBpcyBpbiBpdCdzIG93biBhbmNlc3RvciBsaXN0LCBpZiBzbworCQkvLyBpbnZlcnQgdGhlIGNvbm5lY3RpbmcgZWRnZSBhbmQgcmV2ZXJzZSB0aGUgdGFyZ2V0L3NvdXJjZQorCQkvLyByZWxhdGlvbnNoaXAgdG8gdGhhdCBlZGdlIGluIHRoZSBwYXJlbnQgYW5kIHRoZSBjZWxsCisJCS8vIEFuY2VzdG9yIGhhc2hlcyBvbmx5IGxpbmUgdXAgd2l0aGluIGEgc3dpbWxhbmUKKwkJdmFyIGlzQW5jZXN0b3IgPSBwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuc3dpbWxhbmVJbmRleCA9PSBub2RlLnN3aW1sYW5lSW5kZXggJiYgbm9kZS5pc0FuY2VzdG9yKHBhcmVudCk7CisKKwkJLy8gSWYgdGhlIHNvdXJjZS0+dGFyZ2V0IHN3aW1sYW5lIGluZGljZXMgZ28gZnJvbSBoaWdoZXIgdG8KKwkJLy8gbG93ZXIsIHRoZSBlZGdlIGlzIHJldmVyc2UKKwkJdmFyIHJldmVyc2VkT3ZlclN3aW1sYW5lID0gcGFyZW50ICE9IG51bGwgJiYgY29ubmVjdGluZ0VkZ2UgIT0gbnVsbCAmJgorCQkJCQkJcGFyZW50LnN3aW1sYW5lSW5kZXggPCBub2RlLnN3aW1sYW5lSW5kZXggJiYgY29ubmVjdGluZ0VkZ2Uuc291cmNlID09IG5vZGU7CisKKwkJaWYgKGlzQW5jZXN0b3IpCisJCXsKKwkJCWNvbm5lY3RpbmdFZGdlLmludmVydCgpOworCQkJbXhVdGlscy5yZW1vdmUoY29ubmVjdGluZ0VkZ2UsIHBhcmVudC5jb25uZWN0c0FzU291cmNlKTsKKwkJCW5vZGUuY29ubmVjdHNBc1NvdXJjZS5wdXNoKGNvbm5lY3RpbmdFZGdlKTsKKwkJCXBhcmVudC5jb25uZWN0c0FzVGFyZ2V0LnB1c2goY29ubmVjdGluZ0VkZ2UpOworCQkJbXhVdGlscy5yZW1vdmUoY29ubmVjdGluZ0VkZ2UsIG5vZGUuY29ubmVjdHNBc1RhcmdldCk7CisJCX0KKwkJZWxzZSBpZiAocmV2ZXJzZWRPdmVyU3dpbWxhbmUpCisJCXsKKwkJCWNvbm5lY3RpbmdFZGdlLmludmVydCgpOworCQkJbXhVdGlscy5yZW1vdmUoY29ubmVjdGluZ0VkZ2UsIHBhcmVudC5jb25uZWN0c0FzVGFyZ2V0KTsKKwkJCW5vZGUuY29ubmVjdHNBc1RhcmdldC5wdXNoKGNvbm5lY3RpbmdFZGdlKTsKKwkJCXBhcmVudC5jb25uZWN0c0FzU291cmNlLnB1c2goY29ubmVjdGluZ0VkZ2UpOworCQkJbXhVdGlscy5yZW1vdmUoY29ubmVjdGluZ0VkZ2UsIG5vZGUuY29ubmVjdHNBc1NvdXJjZSk7CisJCX0KKwkJCisJCXZhciBjZWxsSWQgPSBteENlbGxQYXRoLmNyZWF0ZShub2RlLmNlbGwpOworCQlzZWVuTm9kZXNbY2VsbElkXSA9IG5vZGU7CisJCWRlbGV0ZSB1bnNlZW5Ob2Rlc1tjZWxsSWRdOworCX0sIHJvb3RzQXJyYXksIHRydWUsIG51bGwpOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvbXhDaXJjbGVMYXlvdXQuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L214Q2lyY2xlTGF5b3V0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlODJjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L214Q2lyY2xlTGF5b3V0LmpzCkBAIC0wLDAgKzEsMjAzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteENpcmNsZUxheW91dAorICogCisgKiBFeHRlbmRzIDxteEdyYXBoTGF5b3V0PiB0byBpbXBsZW1lbnQgYSBjaXJjbHVhciBsYXlvdXQgZm9yIGEgZ2l2ZW4gcmFkaXVzLgorICogVGhlIHZlcnRpY2VzIGRvIG5vdCBuZWVkIHRvIGJlIGNvbm5lY3RlZCBmb3IgdGhpcyBsYXlvdXQgdG8gd29yayBhbmQgYWxsCisgKiBjb25uZWN0aW9ucyBiZXR3ZWVuIHZlcnRpY2VzIGFyZSBub3QgdGFrZW4gaW50byBhY2NvdW50LgorICogCisgKiBFeGFtcGxlOgorICogCisgKiAoY29kZSkKKyAqIHZhciBsYXlvdXQgPSBuZXcgbXhDaXJjbGVMYXlvdXQoZ3JhcGgpOworICogbGF5b3V0LmV4ZWN1dGUoZ3JhcGguZ2V0RGVmYXVsdFBhcmVudCgpKTsKKyAqIChlbmQpCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteENpcmNsZUxheW91dAorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgY2lyY3VsYXIgbGF5b3V0IGZvciB0aGUgc3BlY2lmaWVkIHJhZGl1cy4KKyAqCisgKiBBcmd1bWVudHM6CisgKiAKKyAqIGdyYXBoIC0gPG14R3JhcGg+IHRoYXQgY29udGFpbnMgdGhlIGNlbGxzLgorICogcmFkaXVzIC0gT3B0aW9uYWwgcmFkaXVzIGFzIGFuIGludC4gRGVmYXVsdCBpcyAxMDAuCisgKi8KK2Z1bmN0aW9uIG14Q2lyY2xlTGF5b3V0KGdyYXBoLCByYWRpdXMpCit7CisJbXhHcmFwaExheW91dC5jYWxsKHRoaXMsIGdyYXBoKTsKKwl0aGlzLnJhZGl1cyA9IChyYWRpdXMgIT0gbnVsbCkgPyByYWRpdXMgOiAxMDA7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhHcmFwaExheW91dC4KKyAqLworbXhDaXJjbGVMYXlvdXQucHJvdG90eXBlID0gbmV3IG14R3JhcGhMYXlvdXQoKTsKK214Q2lyY2xlTGF5b3V0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG14Q2lyY2xlTGF5b3V0OworCisvKioKKyAqIFZhcmlhYmxlOiByYWRpdXMKKyAqIAorICogSW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBzaXplIG9mIHRoZSByYWRpdXMuIERlZmF1bHQgaXMgMTAwLgorICovCitteENpcmNsZUxheW91dC5wcm90b3R5cGUucmFkaXVzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbW92ZUNpcmNsZQorICogCisgKiBCb29sZWFuIHNwZWNpZnlpbmcgaWYgdGhlIGNpcmNsZSBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIHRvcCwKKyAqIGxlZnQgY29ybmVyIHNwZWNpZmllZCBieSA8eDA+IGFuZCA8eTA+LiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteENpcmNsZUxheW91dC5wcm90b3R5cGUubW92ZUNpcmNsZSA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiB4MAorICogCisgKiBJbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgY2lyY2xlLgorICogRGVmYXVsdCBpcyAwLgorICovCitteENpcmNsZUxheW91dC5wcm90b3R5cGUueDAgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiB5MAorICogCisgKiBJbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSBjaXJjbGUuCisgKiBEZWZhdWx0IGlzIDAuCisgKi8KK214Q2lyY2xlTGF5b3V0LnByb3RvdHlwZS55MCA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IHJlc2V0RWRnZXMKKyAqIAorICogU3BlY2lmaWVzIGlmIGFsbCBlZGdlIHBvaW50cyBvZiB0cmF2ZXJzZWQgZWRnZXMgc2hvdWxkIGJlIHJlbW92ZWQuCisgKiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214Q2lyY2xlTGF5b3V0LnByb3RvdHlwZS5yZXNldEVkZ2VzID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogZGlzYWJsZUVkZ2VTdHlsZQorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIFNUWUxFX05PRURHRVNUWUxFIGZsYWcgc2hvdWxkIGJlIHNldCBvbiBlZGdlcyB0aGF0IGFyZQorICogbW9kaWZpZWQgYnkgdGhlIHJlc3VsdC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteENpcmNsZUxheW91dC5wcm90b3R5cGUuZGlzYWJsZUVkZ2VTdHlsZSA9IHRydWU7CisKKy8qKgorICogRnVuY3Rpb246IGV4ZWN1dGUKKyAqIAorICogSW1wbGVtZW50cyA8bXhHcmFwaExheW91dC5leGVjdXRlPi4KKyAqLworbXhDaXJjbGVMYXlvdXQucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbihwYXJlbnQpCit7CisJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpOworCisJLy8gTW92ZXMgdGhlIHZlcnRpY2VzIHRvIGJ1aWxkIGEgY2lyY2xlLiBNYWtlcyBzdXJlIHRoZQorCS8vIHJhZGl1cyBpcyBsYXJnZSBlbm91Z2ggZm9yIHRoZSB2ZXJ0aWNlcyB0byBub3QKKwkvLyBvdmVybGFwCisJbW9kZWwuYmVnaW5VcGRhdGUoKTsKKwl0cnkKKwl7CisJCS8vIEdldHMgYWxsIHZlcnRpY2VzIGluc2lkZSB0aGUgcGFyZW50IGFuZCBmaW5kcworCQkvLyB0aGUgbWF4aW11bSBkaW1lbnNpb24gb2YgdGhlIGxhcmdlc3QgdmVydGV4CisJCXZhciBtYXggPSAwOworCQl2YXIgdG9wID0gbnVsbDsKKwkJdmFyIGxlZnQgPSBudWxsOworCQl2YXIgdmVydGljZXMgPSBbXTsKKwkJdmFyIGNoaWxkQ291bnQgPSBtb2RlbC5nZXRDaGlsZENvdW50KHBhcmVudCk7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykKKwkJeworCQkJdmFyIGNlbGwgPSBtb2RlbC5nZXRDaGlsZEF0KHBhcmVudCwgaSk7CisJCQkKKwkJCWlmICghdGhpcy5pc1ZlcnRleElnbm9yZWQoY2VsbCkpCisJCQl7CisJCQkJdmVydGljZXMucHVzaChjZWxsKTsKKwkJCQl2YXIgYm91bmRzID0gdGhpcy5nZXRWZXJ0ZXhCb3VuZHMoY2VsbCk7CisJCQkJCisJCQkJaWYgKHRvcCA9PSBudWxsKQorCQkJCXsKKwkJCQkJdG9wID0gYm91bmRzLnk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXRvcCA9IE1hdGgubWluKHRvcCwgYm91bmRzLnkpOworCQkJCX0KKwkJCQkKKwkJCQlpZiAobGVmdCA9PSBudWxsKQorCQkJCXsKKwkJCQkJbGVmdCA9IGJvdW5kcy54OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlsZWZ0ID0gTWF0aC5taW4obGVmdCwgYm91bmRzLngpOworCQkJCX0KKwkJCQkKKwkJCQltYXggPSBNYXRoLm1heChtYXgsIE1hdGgubWF4KGJvdW5kcy53aWR0aCwgYm91bmRzLmhlaWdodCkpOworCQkJfQorCQkJZWxzZSBpZiAoIXRoaXMuaXNFZGdlSWdub3JlZChjZWxsKSkKKwkJCXsKKwkJCQkvLyBSZXNldHMgdGhlIHBvaW50cyBvbiB0aGUgdHJhdmVyc2VkIGVkZ2UKKwkJCQlpZiAodGhpcy5yZXNldEVkZ2VzKQorCQkJCXsKKwkJCQkJdGhpcy5ncmFwaC5yZXNldEVkZ2UoY2VsbCk7CisJCQkJfQorCisJCQkgICAgaWYgKHRoaXMuZGlzYWJsZUVkZ2VTdHlsZSkKKwkJCSAgICB7CisJCQkgICAgCXRoaXMuc2V0RWRnZVN0eWxlRW5hYmxlZChjZWxsLCBmYWxzZSk7CisJCQkgICAgfQorCQkJfQorCQl9CisJCQorCQl2YXIgciA9IHRoaXMuZ2V0UmFkaXVzKHZlcnRpY2VzLmxlbmd0aCwgbWF4KTsKKworCQkvLyBNb3ZlcyB0aGUgY2lyY2xlIHRvIHRoZSBzcGVjaWZpZWQgb3JpZ2luCisJCWlmICh0aGlzLm1vdmVDaXJjbGUpCisJCXsKKwkJCWxlZnQgPSB0aGlzLngwOworCQkJdG9wID0gdGhpcy55MDsKKwkJfQorCQkKKwkJdGhpcy5jaXJjbGUodmVydGljZXMsIHIsIGxlZnQsIHRvcCk7CisJfQorCWZpbmFsbHkKKwl7CisJCW1vZGVsLmVuZFVwZGF0ZSgpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFJhZGl1cworICogCisgKiBSZXR1cm5zIHRoZSByYWRpdXMgdG8gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIHZlcnRleCBjb3VudC4gTWF4IGlzIHRoZSBtYXhpbXVtCisgKiB3aWR0aCBvciBoZWlnaHQgb2YgYWxsIHZlcnRpY2VzIGluIHRoZSBsYXlvdXQuCisgKi8KK214Q2lyY2xlTGF5b3V0LnByb3RvdHlwZS5nZXRSYWRpdXMgPSBmdW5jdGlvbihjb3VudCwgbWF4KQoreworCXJldHVybiBNYXRoLm1heChjb3VudCAqIG1heCAvIE1hdGguUEksIHRoaXMucmFkaXVzKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNpcmNsZQorICogCisgKiBFeGVjdXRlcyB0aGUgY2lyY3VsYXIgbGF5b3V0IGZvciB0aGUgc3BlY2lmaWVkIGFycmF5CisgKiBvZiB2ZXJ0aWNlcyBhbmQgdGhlIGdpdmVuIHJhZGl1cy4gVGhpcyBpcyBjYWxsZWQgZnJvbQorICogPGV4ZWN1dGU+LgorICovCitteENpcmNsZUxheW91dC5wcm90b3R5cGUuY2lyY2xlID0gZnVuY3Rpb24odmVydGljZXMsIHIsIGxlZnQsIHRvcCkKK3sKKwl2YXIgdmVydGV4Q291bnQgPSB2ZXJ0aWNlcy5sZW5ndGg7CisJdmFyIHBoaSA9IDIgKiBNYXRoLlBJIC8gdmVydGV4Q291bnQ7CisJCisJZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0ZXhDb3VudDsgaSsrKQorCXsKKwkJaWYgKHRoaXMuaXNWZXJ0ZXhNb3ZhYmxlKHZlcnRpY2VzW2ldKSkKKwkJeworCQkJdGhpcy5zZXRWZXJ0ZXhMb2NhdGlvbih2ZXJ0aWNlc1tpXSwKKwkJCQlsZWZ0ICsgciArIHIgKiBNYXRoLnNpbihpKnBoaSksCisJCQkJdG9wICsgciArIHIgKiBNYXRoLmNvcyhpKnBoaSkpOworCQl9CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvbXhDb21wYWN0VHJlZUxheW91dC5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvbXhDb21wYWN0VHJlZUxheW91dC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmRhNmVkCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9teENvbXBhY3RUcmVlTGF5b3V0LmpzCkBAIC0wLDAgKzEsMTIwMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhDb21wYWN0VHJlZUxheW91dAorICogCisgKiBFeHRlbmRzIDxteEdyYXBoTGF5b3V0PiB0byBpbXBsZW1lbnQgYSBjb21wYWN0IHRyZWUgKE1vZW4pIGFsZ29yaXRobS4gVGhpcworICogbGF5b3V0IGlzIHN1aXRhYmxlIGZvciBncmFwaHMgdGhhdCBoYXZlIG5vIGN5Y2xlcyAodHJlZXMpLiBWZXJ0aWNlcyB0aGF0IGFyZQorICogbm90IGNvbm5lY3RlZCB0byB0aGUgdHJlZSB3aWxsIGJlIGlnbm9yZWQgYnkgdGhpcyBsYXlvdXQuCisgKiAKKyAqIEV4YW1wbGU6CisgKiAKKyAqIChjb2RlKQorICogdmFyIGxheW91dCA9IG5ldyBteENvbXBhY3RUcmVlTGF5b3V0KGdyYXBoKTsKKyAqIGxheW91dC5leGVjdXRlKGdyYXBoLmdldERlZmF1bHRQYXJlbnQoKSk7CisgKiAoZW5kKQorICogCisgKiBDb25zdHJ1Y3RvcjogbXhDb21wYWN0VHJlZUxheW91dAorICogCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbXBhY3QgdHJlZSBsYXlvdXQgZm9yIHRoZSBzcGVjaWZpZWQgZ3JhcGgKKyAqIGFuZCBvcmllbnRhdGlvbi4KKyAqLworZnVuY3Rpb24gbXhDb21wYWN0VHJlZUxheW91dChncmFwaCwgaG9yaXpvbnRhbCwgaW52ZXJ0KQoreworCW14R3JhcGhMYXlvdXQuY2FsbCh0aGlzLCBncmFwaCk7CisJdGhpcy5ob3Jpem9udGFsID0gKGhvcml6b250YWwgIT0gbnVsbCkgPyBob3Jpem9udGFsIDogdHJ1ZTsKKwl0aGlzLmludmVydCA9IChpbnZlcnQgIT0gbnVsbCkgPyBpbnZlcnQgOiBmYWxzZTsKK307CisKKy8qKgorICogRXh0ZW5kcyBteEdyYXBoTGF5b3V0LgorICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZSA9IG5ldyBteEdyYXBoTGF5b3V0KCk7CitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG14Q29tcGFjdFRyZWVMYXlvdXQ7CisKKy8qKgorICogVmFyaWFibGU6IGhvcml6b250YWwKKyAqCisgKiBTcGVjaWZpZXMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBsYXlvdXQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhDb21wYWN0VHJlZUxheW91dC5wcm90b3R5cGUuaG9yaXpvbnRhbCA9IG51bGw7CSAKKworLyoqCisgKiBWYXJpYWJsZTogaW52ZXJ0CisgKgorICogU3BlY2lmaWVzIGlmIGVkZ2UgZGlyZWN0aW9ucyBzaG91bGQgYmUgaW52ZXJ0ZWQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLmludmVydCA9IG51bGw7CSAKKworLyoqCisgKiBWYXJpYWJsZTogcmVzaXplUGFyZW50CisgKiAKKyAqIElmIHRoZSBwYXJlbnRzIHNob3VsZCBiZSByZXNpemVkIHRvIG1hdGNoIHRoZSB3aWR0aC9oZWlnaHQgb2YgdGhlCisgKiBjaGlsZHJlbi4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5yZXNpemVQYXJlbnQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBtYWludGFpblBhcmVudExvY2F0aW9uCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgcGFyZW50IGxvY2F0aW9uIHNob3VsZCBiZSBtYWludGFpbmVkLCBzbyB0aGF0IHRoZQorICogdG9wLCBsZWZ0IGNvcm5lciBzdGF5cyB0aGUgc2FtZSBiZWZvcmUgYW5kIGFmdGVyIGV4ZWN1dGlvbiBvZgorICogdGhlIGxheW91dC4gRGVmYXVsdCBpcyBmYWxzZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLm1haW50YWluUGFyZW50TG9jYXRpb24gPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogZ3JvdXBQYWRkaW5nCisgKiAKKyAqIFBhZGRpbmcgYWRkZWQgdG8gcmVzaXplZCBwYXJlbnRzLiBEZWZhdWx0IGlzIDEwLgorICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5ncm91cFBhZGRpbmcgPSAxMDsKKworLyoqCisgKiBWYXJpYWJsZTogZ3JvdXBQYWRkaW5nVG9wCisgKiAKKyAqIFRvcCBwYWRkaW5nIGFkZGVkIHRvIHJlc2l6ZWQgcGFyZW50cy4gRGVmYXVsdCBpcyAwLgorICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5ncm91cFBhZGRpbmdUb3AgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBncm91cFBhZGRpbmdSaWdodAorICogCisgKiBSaWdodCBwYWRkaW5nIGFkZGVkIHRvIHJlc2l6ZWQgcGFyZW50cy4gRGVmYXVsdCBpcyAwLgorICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5ncm91cFBhZGRpbmdSaWdodCA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IGdyb3VwUGFkZGluZ0JvdHRvbQorICogCisgKiBCb3R0b20gcGFkZGluZyBhZGRlZCB0byByZXNpemVkIHBhcmVudHMuIERlZmF1bHQgaXMgMC4KKyAqLworbXhDb21wYWN0VHJlZUxheW91dC5wcm90b3R5cGUuZ3JvdXBQYWRkaW5nQm90dG9tID0gMDsKKworLyoqCisgKiBWYXJpYWJsZTogZ3JvdXBQYWRkaW5nTGVmdAorICogCisgKiBMZWZ0IHBhZGRpbmcgYWRkZWQgdG8gcmVzaXplZCBwYXJlbnRzLiBEZWZhdWx0IGlzIDAuCisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLmdyb3VwUGFkZGluZ0xlZnQgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBwYXJlbnRzQ2hhbmdlZAorICoKKyAqIEEgc2V0IG9mIHRoZSBwYXJlbnRzIHRoYXQgbmVlZCB1cGRhdGluZyBiYXNlZCBvbiBjaGlsZHJlbgorICogcHJvY2VzcyBhcyBwYXJ0IG9mIHRoZSBsYXlvdXQuCisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLnBhcmVudHNDaGFuZ2VkID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbW92ZVRyZWUKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSB0cmVlIHNob3VsZCBiZSBtb3ZlZCB0byB0aGUgdG9wLCBsZWZ0IGNvcm5lcgorICogaWYgaXQgaXMgaW5zaWRlIGEgdG9wLWxldmVsIGxheWVyLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5tb3ZlVHJlZSA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiB2aXNpdGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgdHJlZSBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIHRvcCwgbGVmdCBjb3JuZXIKKyAqIGlmIGl0IGlzIGluc2lkZSBhIHRvcC1sZXZlbCBsYXllci4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhDb21wYWN0VHJlZUxheW91dC5wcm90b3R5cGUudmlzaXRlZCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGxldmVsRGlzdGFuY2UKKyAqCisgKiBIb2xkcyB0aGUgbGV2ZWxEaXN0YW5jZS4gRGVmYXVsdCBpcyAxMC4KKyAqLworbXhDb21wYWN0VHJlZUxheW91dC5wcm90b3R5cGUubGV2ZWxEaXN0YW5jZSA9IDEwOworCisvKioKKyAqIFZhcmlhYmxlOiBub2RlRGlzdGFuY2UKKyAqCisgKiBIb2xkcyB0aGUgbm9kZURpc3RhbmNlLiBEZWZhdWx0IGlzIDIwLgorICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5ub2RlRGlzdGFuY2UgPSAyMDsKKworLyoqCisgKiBWYXJpYWJsZTogcmVzZXRFZGdlcworICogCisgKiBTcGVjaWZpZXMgaWYgYWxsIGVkZ2UgcG9pbnRzIG9mIHRyYXZlcnNlZCBlZGdlcyBzaG91bGQgYmUgcmVtb3ZlZC4KKyAqIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhDb21wYWN0VHJlZUxheW91dC5wcm90b3R5cGUucmVzZXRFZGdlcyA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHByZWZIb3pFZGdlU2VwCisgKiAKKyAqIFRoZSBwcmVmZXJyZWQgaG9yaXpvbnRhbCBkaXN0YW5jZSBiZXR3ZWVuIGVkZ2VzIGV4aXRpbmcgYSB2ZXJ0ZXguCisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLnByZWZIb3pFZGdlU2VwID0gNTsKKworLyoqCisgKiBWYXJpYWJsZTogcHJlZlZlcnRFZGdlT2ZmCisgKiAKKyAqIFRoZSBwcmVmZXJyZWQgdmVydGljYWwgb2Zmc2V0IGJldHdlZW4gZWRnZXMgZXhpdGluZyBhIHZlcnRleC4KKyAqLworbXhDb21wYWN0VHJlZUxheW91dC5wcm90b3R5cGUucHJlZlZlcnRFZGdlT2ZmID0gNDsKKworLyoqCisgKiBWYXJpYWJsZTogbWluRWRnZUpldHR5CisgKiAKKyAqIFRoZSBtaW5pbXVtIGRpc3RhbmNlIGZvciBhbiBlZGdlIGpldHR5IGZyb20gYSB2ZXJ0ZXguCisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLm1pbkVkZ2VKZXR0eSA9IDg7CisKKy8qKgorICogVmFyaWFibGU6IGNoYW5uZWxCdWZmZXIKKyAqIAorICogVGhlIHNpemUgb2YgdGhlIHZlcnRpY2FsIGJ1ZmZlciBpbiB0aGUgY2VudGVyIG9mIGludGVyLXJhbmsgY2hhbm5lbHMKKyAqIHdoZXJlIGVkZ2UgY29udHJvbCBwb2ludHMgc2hvdWxkIG5vdCBiZSBwbGFjZWQuCisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLmNoYW5uZWxCdWZmZXIgPSA0OworCisvKioKKyAqIFZhcmlhYmxlOiBlZGdlUm91dGluZworICogCisgKiBXaGV0aGVyIG9yIG5vdCB0byBhcHBseSB0aGUgaW50ZXJuYWwgdHJlZSBlZGdlIHJvdXRpbmcuCisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLmVkZ2VSb3V0aW5nID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogc29ydEVkZ2VzCisgKiAKKyAqIFNwZWNpZmllcyBpZiBlZGdlcyBzaG91bGQgYmUgc29ydGVkIGFjY29yZGluZyB0byB0aGUgb3JkZXIgb2YgdGhlaXIKKyAqIG9wcG9zaXRlIHRlcm1pbmFsIGNlbGwgaW4gdGhlIG1vZGVsLgorICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5zb3J0RWRnZXMgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogYWxpZ25SYW5rcworICogCisgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdG9wcyBvZiBjZWxscyBpbiBlYWNoIHJhbmsgc2hvdWxkIGJlIGFsaWduZWQKKyAqIGFjcm9zcyB0aGUgcmFuaworICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5hbGlnblJhbmtzID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IG1heFJhbmtIZWlnaHQKKyAqIAorICogQW4gYXJyYXkgb2YgdGhlIG1heGltdW0gaGVpZ2h0IG9mIGNlbGxzIChyZWxhdGl2ZSB0byB0aGUgbGF5b3V0IGRpcmVjdGlvbikKKyAqIHBlciByYW5rCisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLm1heFJhbmtIZWlnaHQgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiByb290CisgKiAKKyAqIFRoZSBjZWxsIHRvIHVzZSBhcyB0aGUgcm9vdCBvZiB0aGUgdHJlZQorICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5yb290ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbm9kZQorICogCisgKiBUaGUgaW50ZXJuYWwgbm9kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcm9vdCBjZWxsLiBEbyBub3Qgc2V0IGRpcmVjdGx5CisgKiAsIHRoaXMgdmFsdWUgaXMgb25seSBleHBvc2VkIHRvIGFzc2lzdCB3aXRoIHBvc3QtcHJvY2Vzc2luZyBmdW5jdGlvbmFsaXR5CisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLm5vZGUgPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1ZlcnRleElnbm9yZWQKKyAqIAorICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgZ2l2ZW4gPG14Q2VsbD4gc2hvdWxkIGJlIGlnbm9yZWQgYXMgYQorICogdmVydGV4LiBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2VsbCBoYXMgbm8gY29ubmVjdGlvbnMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZlcnRleCAtIDxteENlbGw+IHdob3NlIGlnbm9yZWQgc3RhdGUgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5pc1ZlcnRleElnbm9yZWQgPSBmdW5jdGlvbih2ZXJ0ZXgpCit7CisJcmV0dXJuIG14R3JhcGhMYXlvdXQucHJvdG90eXBlLmlzVmVydGV4SWdub3JlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8CisJCXRoaXMuZ3JhcGguZ2V0Q29ubmVjdGlvbnModmVydGV4KS5sZW5ndGggPT0gMDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzSG9yaXpvbnRhbAorICogCisgKiBSZXR1cm5zIDxob3Jpem9udGFsPi4KKyAqLworbXhDb21wYWN0VHJlZUxheW91dC5wcm90b3R5cGUuaXNIb3Jpem9udGFsID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmhvcml6b250YWw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBleGVjdXRlCisgKiAKKyAqIEltcGxlbWVudHMgPG14R3JhcGhMYXlvdXQuZXhlY3V0ZT4uCisgKiAKKyAqIElmIHRoZSBwYXJlbnQgaGFzIGFueSBjb25uZWN0ZWQgZWRnZXMsIHRoZW4gaXQgaXMgdXNlZCBhcyB0aGUgcm9vdCBvZgorICogdGhlIHRyZWUuIEVsc2UsIDxteEdyYXBoLmZpbmRUcmVlUm9vdHM+IHdpbGwgYmUgdXNlZCB0byBmaW5kIGEgc3VpdGFibGUKKyAqIHJvb3Qgbm9kZSB3aXRoaW4gdGhlIHNldCBvZiBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gcGFyZW50LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwYXJlbnQgLSA8bXhDZWxsPiB3aG9zZSBjaGlsZHJlbiBzaG91bGQgYmUgbGFpZCBvdXQuCisgKiByb290IC0gT3B0aW9uYWwgPG14Q2VsbD4gdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUuCisgKiBPdmVycmlkZXMgPHJvb3Q+IGlmIHNwZWNpZmllZC4KKyAqLworbXhDb21wYWN0VHJlZUxheW91dC5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uKHBhcmVudCwgcm9vdCkKK3sKKwl0aGlzLnBhcmVudCA9IHBhcmVudDsKKwl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCk7CisKKwlpZiAocm9vdCA9PSBudWxsKQorCXsKKwkJLy8gVGFrZXMgdGhlIHBhcmVudCBhcyB0aGUgcm9vdCBpZiBpdCBoYXMgb3V0Z29pbmcgZWRnZXMKKwkJaWYgKHRoaXMuZ3JhcGguZ2V0RWRnZXMocGFyZW50LCBtb2RlbC5nZXRQYXJlbnQocGFyZW50KSwKKwkJCXRoaXMuaW52ZXJ0LCAhdGhpcy5pbnZlcnQsIGZhbHNlKS5sZW5ndGggPiAwKQorCQl7CisJCQl0aGlzLnJvb3QgPSBwYXJlbnQ7CisJCX0KKwkJCisJCS8vIFRyaWVzIHRvIGZpbmQgYSBzdWl0YWJsZSByb290IGluIHRoZSBwYXJlbnQncworCQkvLyBjaGlsZHJlbgorCQllbHNlCisJCXsKKwkJCXZhciByb290cyA9IHRoaXMuZ3JhcGguZmluZFRyZWVSb290cyhwYXJlbnQsIHRydWUsIHRoaXMuaW52ZXJ0KTsKKwkJCQorCQkJaWYgKHJvb3RzLmxlbmd0aCA+IDApCisJCQl7CisJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykKKwkJCQl7CisJCQkJCWlmICghdGhpcy5pc1ZlcnRleElnbm9yZWQocm9vdHNbaV0pICYmCisJCQkJCQl0aGlzLmdyYXBoLmdldEVkZ2VzKHJvb3RzW2ldLCBudWxsLAorCQkJCQkJCXRoaXMuaW52ZXJ0LCAhdGhpcy5pbnZlcnQsIGZhbHNlKS5sZW5ndGggPiAwKQorCQkJCQl7CisJCQkJCQl0aGlzLnJvb3QgPSByb290c1tpXTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCXRoaXMucm9vdCA9IHJvb3Q7CisJfQorCQorCWlmICh0aGlzLnJvb3QgIT0gbnVsbCkKKwl7CisJCWlmICh0aGlzLnJlc2l6ZVBhcmVudCkKKwkJeworCQkJdGhpcy5wYXJlbnRzQ2hhbmdlZCA9IG5ldyBPYmplY3QoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRoaXMucGFyZW50c0NoYW5nZWQgPSBudWxsOworCQl9CisKKwkJLy8gIE1haW50YWluaW5nIHBhcmVudCBsb2NhdGlvbgorCQl0aGlzLnBhcmVudFggPSBudWxsOworCQl0aGlzLnBhcmVudFkgPSBudWxsOworCQkKKwkJaWYgKHBhcmVudCAhPSB0aGlzLnJvb3QgJiYgbW9kZWwuaXNWZXJ0ZXgocGFyZW50KSAhPSBudWxsICYmIHRoaXMubWFpbnRhaW5QYXJlbnRMb2NhdGlvbikKKwkJeworCQkJdmFyIGdlbyA9IHRoaXMuZ3JhcGguZ2V0Q2VsbEdlb21ldHJ5KHBhcmVudCk7CisJCQkKKwkJCWlmIChnZW8gIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLnBhcmVudFggPSBnZW8ueDsKKwkJCQl0aGlzLnBhcmVudFkgPSBnZW8ueTsKKwkJCX0KKwkJfQorCQkKKwkJbW9kZWwuYmVnaW5VcGRhdGUoKTsKKwkJCisJCXRyeQorCQl7CisJCQl0aGlzLnZpc2l0ZWQgPSBuZXcgT2JqZWN0KCk7CisJCQl0aGlzLm5vZGUgPSB0aGlzLmRmcyh0aGlzLnJvb3QsIHBhcmVudCk7CisJCQkKKwkJCWlmICh0aGlzLmFsaWduUmFua3MpCisJCQl7CisJCQkJdGhpcy5tYXhSYW5rSGVpZ2h0ID0gW107CisJCQkJdGhpcy5maW5kUmFua0hlaWdodHModGhpcy5ub2RlLCAwKTsKKwkJCQl0aGlzLnNldENlbGxIZWlnaHRzKHRoaXMubm9kZSwgMCk7CisJCQl9CisJCQkKKwkJCWlmICh0aGlzLm5vZGUgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLmxheW91dCh0aGlzLm5vZGUpOworCQkJCXZhciB4MCA9IHRoaXMuZ3JhcGguZ3JpZFNpemU7CisJCQkJdmFyIHkwID0geDA7CisJCQkJCisJCQkJaWYgKCF0aGlzLm1vdmVUcmVlKQorCQkJCXsKKwkJCQkJdmFyIGcgPSB0aGlzLmdldFZlcnRleEJvdW5kcyh0aGlzLnJvb3QpOworCQkJCQkKKwkJCQkJaWYgKGcgIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJeDAgPSBnLng7CisJCQkJCQl5MCA9IGcueTsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQl2YXIgYm91bmRzID0gbnVsbDsKKwkJCQkKKwkJCQlpZiAodGhpcy5pc0hvcml6b250YWwoKSkKKwkJCQl7CisJCQkJCWJvdW5kcyA9IHRoaXMuaG9yaXpvbnRhbExheW91dCh0aGlzLm5vZGUsIHgwLCB5MCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWJvdW5kcyA9IHRoaXMudmVydGljYWxMYXlvdXQodGhpcy5ub2RlLCBudWxsLCB4MCwgeTApOworCQkJCX0KKworCQkJCWlmIChib3VuZHMgIT0gbnVsbCkKKwkJCQl7CisJCQkJCXZhciBkeCA9IDA7CisJCQkJCXZhciBkeSA9IDA7CisKKwkJCQkJaWYgKGJvdW5kcy54IDwgMCkKKwkJCQkJeworCQkJCQkJZHggPSBNYXRoLmFicyh4MCAtIGJvdW5kcy54KTsKKwkJCQkJfQorCisJCQkJCWlmIChib3VuZHMueSA8IDApCisJCQkJCXsKKwkJCQkJCWR5ID0gTWF0aC5hYnMoeTAgLSBib3VuZHMueSk7CQorCQkJCQl9CisKKwkJCQkJaWYgKGR4ICE9IDAgfHwgZHkgIT0gMCkKKwkJCQkJeworCQkJCQkJdGhpcy5tb3ZlTm9kZSh0aGlzLm5vZGUsIGR4LCBkeSk7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmICh0aGlzLnJlc2l6ZVBhcmVudCkKKwkJCQkJeworCQkJCQkJdGhpcy5hZGp1c3RQYXJlbnRzKCk7CisJCQkJCX0KKworCQkJCQlpZiAodGhpcy5lZGdlUm91dGluZykKKwkJCQkJeworCQkJCQkJLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBlZGdlcyBzZXR0aW5nIHRoZWlyIHBvc2l0aW9ucworCQkJCQkJdGhpcy5sb2NhbEVkZ2VQcm9jZXNzaW5nKHRoaXMubm9kZSk7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJLy8gTWFpbnRhaW5pbmcgcGFyZW50IGxvY2F0aW9uCisJCQkJaWYgKHRoaXMucGFyZW50WCAhPSBudWxsICYmIHRoaXMucGFyZW50WSAhPSBudWxsKQorCQkJCXsKKwkJCQkJdmFyIGdlbyA9IHRoaXMuZ3JhcGguZ2V0Q2VsbEdlb21ldHJ5KHBhcmVudCk7CisJCQkJCQorCQkJCQlpZiAoZ2VvICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCWdlbyA9IGdlby5jbG9uZSgpOworCQkJCQkJZ2VvLnggPSB0aGlzLnBhcmVudFg7CisJCQkJCQlnZW8ueSA9IHRoaXMucGFyZW50WTsKKwkJCQkJCW1vZGVsLnNldEdlb21ldHJ5KHBhcmVudCwgZ2VvKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCW1vZGVsLmVuZFVwZGF0ZSgpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogbW92ZU5vZGUKKyAqIAorICogTW92ZXMgdGhlIHNwZWNpZmllZCBub2RlIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuIGJ5IHRoZSBnaXZlbiBhbW91bnQuCisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLm1vdmVOb2RlID0gZnVuY3Rpb24obm9kZSwgZHgsIGR5KQoreworCW5vZGUueCArPSBkeDsKKwlub2RlLnkgKz0gZHk7CisJdGhpcy5hcHBseShub2RlKTsKKwkKKwl2YXIgY2hpbGQgPSBub2RlLmNoaWxkOworCQorCXdoaWxlIChjaGlsZCAhPSBudWxsKQorCXsKKwkJdGhpcy5tb3ZlTm9kZShjaGlsZCwgZHgsIGR5KTsKKwkJY2hpbGQgPSBjaGlsZC5uZXh0OworCX0KK307CisKKworLyoqCisgKiBGdW5jdGlvbjogc29ydE91dGdvaW5nRWRnZXMKKyAqIAorICogQ2FsbGVkIGlmIDxzb3J0RWRnZXM+IGlzIHRydWUgdG8gc29ydCB0aGUgYXJyYXkgb2Ygb3V0Z29pbmcgZWRnZXMgaW4gcGxhY2UuCisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLnNvcnRPdXRnb2luZ0VkZ2VzID0gZnVuY3Rpb24oc291cmNlLCBlZGdlcykKK3sKKwl2YXIgbG9va3VwID0gbmV3IG14RGljdGlvbmFyeSgpOworCQorCWVkZ2VzLnNvcnQoZnVuY3Rpb24oZTEsIGUyKQorCXsKKwkJdmFyIGVuZDEgPSBlMS5nZXRUZXJtaW5hbChlMS5nZXRUZXJtaW5hbChmYWxzZSkgPT0gc291cmNlKTsKKwkJdmFyIHAxID0gbG9va3VwLmdldChlbmQxKTsKKwkJCisJCWlmIChwMSA9PSBudWxsKQorCQl7CisJCQlwMSA9IG14Q2VsbFBhdGguY3JlYXRlKGVuZDEpLnNwbGl0KG14Q2VsbFBhdGguUEFUSF9TRVBBUkFUT1IpOworCQkJbG9va3VwLnB1dChlbmQxLCBwMSk7CisJCX0KKworCQl2YXIgZW5kMiA9IGUyLmdldFRlcm1pbmFsKGUyLmdldFRlcm1pbmFsKGZhbHNlKSA9PSBzb3VyY2UpOworCQl2YXIgcDIgPSBsb29rdXAuZ2V0KGVuZDIpOworCQkKKwkJaWYgKHAyID09IG51bGwpCisJCXsKKwkJCXAyID0gbXhDZWxsUGF0aC5jcmVhdGUoZW5kMikuc3BsaXQobXhDZWxsUGF0aC5QQVRIX1NFUEFSQVRPUik7CisJCQlsb29rdXAucHV0KGVuZDIsIHAyKTsKKwkJfQorCisJCXJldHVybiBteENlbGxQYXRoLmNvbXBhcmUocDEsIHAyKTsKKwl9KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGZpbmRSYW5rSGVpZ2h0cworICogCisgKiBTdG9yZXMgdGhlIG1heGltdW0gaGVpZ2h0IChyZWxhdGl2ZSB0byB0aGUgbGF5b3V0CisgKiBkaXJlY3Rpb24pIG9mIGNlbGxzIGluIGVhY2ggcmFuaworICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5maW5kUmFua0hlaWdodHMgPSBmdW5jdGlvbihub2RlLCByYW5rKQoreworCWlmICh0aGlzLm1heFJhbmtIZWlnaHRbcmFua10gPT0gbnVsbCB8fCB0aGlzLm1heFJhbmtIZWlnaHRbcmFua10gPCBub2RlLmhlaWdodCkKKwl7CisJCXRoaXMubWF4UmFua0hlaWdodFtyYW5rXSA9IG5vZGUuaGVpZ2h0OworCX0KKworCXZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7CisJCisJd2hpbGUgKGNoaWxkICE9IG51bGwpCisJeworCQl0aGlzLmZpbmRSYW5rSGVpZ2h0cyhjaGlsZCwgcmFuayArIDEpOworCQljaGlsZCA9IGNoaWxkLm5leHQ7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0Q2VsbEhlaWdodHMKKyAqIAorICogU2V0IHRoZSBjZWxscyBoZWlnaHRzIChyZWxhdGl2ZSB0byB0aGUgbGF5b3V0CisgKiBkaXJlY3Rpb24pIHdoZW4gdGhlIHRvcHMgb2YgZWFjaCByYW5rIGFyZSB0byBiZSBhbGlnbmVkCisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLnNldENlbGxIZWlnaHRzID0gZnVuY3Rpb24obm9kZSwgcmFuaykKK3sKKwlpZiAodGhpcy5tYXhSYW5rSGVpZ2h0W3JhbmtdICE9IG51bGwgJiYgdGhpcy5tYXhSYW5rSGVpZ2h0W3JhbmtdID4gbm9kZS5oZWlnaHQpCisJeworCQlub2RlLmhlaWdodCA9IHRoaXMubWF4UmFua0hlaWdodFtyYW5rXTsKKwl9CisKKwl2YXIgY2hpbGQgPSBub2RlLmNoaWxkOworCQorCXdoaWxlIChjaGlsZCAhPSBudWxsKQorCXsKKwkJdGhpcy5zZXRDZWxsSGVpZ2h0cyhjaGlsZCwgcmFuayArIDEpOworCQljaGlsZCA9IGNoaWxkLm5leHQ7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZGZzCisgKiAKKyAqIERvZXMgYSBkZXB0aCBmaXJzdCBzZWFyY2ggc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBjZWxsLgorICogTWFrZXMgc3VyZSB0aGUgc3BlY2lmaWVkIHBhcmVudCBpcyBuZXZlciBsZWZ0IGJ5IHRoZQorICogYWxnb3JpdGhtLgorICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5kZnMgPSBmdW5jdGlvbihjZWxsLCBwYXJlbnQpCit7CisJdmFyIGlkID0gbXhDZWxsUGF0aC5jcmVhdGUoY2VsbCk7CisJdmFyIG5vZGUgPSBudWxsOworCQorCWlmIChjZWxsICE9IG51bGwgJiYgdGhpcy52aXNpdGVkW2lkXSA9PSBudWxsICYmICF0aGlzLmlzVmVydGV4SWdub3JlZChjZWxsKSkKKwl7CisJCXRoaXMudmlzaXRlZFtpZF0gPSBjZWxsOworCQlub2RlID0gdGhpcy5jcmVhdGVOb2RlKGNlbGwpOworCisJCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwkJdmFyIHByZXYgPSBudWxsOworCQl2YXIgb3V0ID0gdGhpcy5ncmFwaC5nZXRFZGdlcyhjZWxsLCBwYXJlbnQsIHRoaXMuaW52ZXJ0LCAhdGhpcy5pbnZlcnQsIGZhbHNlLCB0cnVlKTsKKwkJdmFyIHZpZXcgPSB0aGlzLmdyYXBoLmdldFZpZXcoKTsKKwkJCisJCWlmICh0aGlzLnNvcnRFZGdlcykKKwkJeworCQkJdGhpcy5zb3J0T3V0Z29pbmdFZGdlcyhjZWxsLCBvdXQpOworCQl9CisKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBvdXQubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBlZGdlID0gb3V0W2ldOworCQkJCisJCQlpZiAoIXRoaXMuaXNFZGdlSWdub3JlZChlZGdlKSkKKwkJCXsKKwkJCQkvLyBSZXNldHMgdGhlIHBvaW50cyBvbiB0aGUgdHJhdmVyc2VkIGVkZ2UKKwkJCQlpZiAodGhpcy5yZXNldEVkZ2VzKQorCQkJCXsKKwkJCQkJdGhpcy5zZXRFZGdlUG9pbnRzKGVkZ2UsIG51bGwpOworCQkJCX0KKwkJCQkKKwkJCQlpZiAodGhpcy5lZGdlUm91dGluZykKKwkJCQl7CisJCQkJCXRoaXMuc2V0RWRnZVN0eWxlRW5hYmxlZChlZGdlLCBmYWxzZSk7CisJCQkJCXRoaXMuc2V0RWRnZVBvaW50cyhlZGdlLCBudWxsKTsKKwkJCQl9CisJCQkJCisJCQkJLy8gQ2hlY2tzIGlmIHRlcm1pbmFsIGluIHNhbWUgc3dpbWxhbmUKKwkJCQl2YXIgc3RhdGUgPSB2aWV3LmdldFN0YXRlKGVkZ2UpOworCQkJCXZhciB0YXJnZXQgPSAoc3RhdGUgIT0gbnVsbCkgPyBzdGF0ZS5nZXRWaXNpYmxlVGVybWluYWwodGhpcy5pbnZlcnQpIDogdmlldy5nZXRWaXNpYmxlVGVybWluYWwoZWRnZSwgdGhpcy5pbnZlcnQpOworCQkJCXZhciB0bXAgPSB0aGlzLmRmcyh0YXJnZXQsIHBhcmVudCk7CisJCQkJCisJCQkJaWYgKHRtcCAhPSBudWxsICYmIG1vZGVsLmdldEdlb21ldHJ5KHRhcmdldCkgIT0gbnVsbCkKKwkJCQl7CisJCQkJCWlmIChwcmV2ID09IG51bGwpCisJCQkJCXsKKwkJCQkJCW5vZGUuY2hpbGQgPSB0bXA7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlwcmV2Lm5leHQgPSB0bXA7CisJCQkJCX0KKwkJCQkJCisJCQkJCXByZXYgPSB0bXA7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXJldHVybiBub2RlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogbGF5b3V0CisgKiAKKyAqIFN0YXJ0cyB0aGUgYWN0dWFsIGNvbXBhY3QgdHJlZSBsYXlvdXQgYWxnb3JpdGhtCisgKiBhdCB0aGUgZ2l2ZW4gbm9kZS4KKyAqLworbXhDb21wYWN0VHJlZUxheW91dC5wcm90b3R5cGUubGF5b3V0ID0gZnVuY3Rpb24obm9kZSkKK3sKKwlpZiAobm9kZSAhPSBudWxsKQorCXsKKwkJdmFyIGNoaWxkID0gbm9kZS5jaGlsZDsKKwkJCisJCXdoaWxlIChjaGlsZCAhPSBudWxsKQorCQl7CisJCQl0aGlzLmxheW91dChjaGlsZCk7CisJCQljaGlsZCA9IGNoaWxkLm5leHQ7CisJCX0KKwkJCisJCWlmIChub2RlLmNoaWxkICE9IG51bGwpCisJCXsKKwkJCXRoaXMuYXR0YWNoUGFyZW50KG5vZGUsIHRoaXMuam9pbihub2RlKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLmxheW91dExlYWYobm9kZSk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBob3Jpem9udGFsTGF5b3V0CisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLmhvcml6b250YWxMYXlvdXQgPSBmdW5jdGlvbihub2RlLCB4MCwgeTAsIGJvdW5kcykKK3sKKwlub2RlLnggKz0geDAgKyBub2RlLm9mZnNldFg7CisJbm9kZS55ICs9IHkwICsgbm9kZS5vZmZzZXRZOworCWJvdW5kcyA9IHRoaXMuYXBwbHkobm9kZSwgYm91bmRzKTsKKwl2YXIgY2hpbGQgPSBub2RlLmNoaWxkOworCQorCWlmIChjaGlsZCAhPSBudWxsKQorCXsKKwkJYm91bmRzID0gdGhpcy5ob3Jpem9udGFsTGF5b3V0KGNoaWxkLCBub2RlLngsIG5vZGUueSwgYm91bmRzKTsKKwkJdmFyIHNpYmxpbmdPZmZzZXQgPSBub2RlLnkgKyBjaGlsZC5vZmZzZXRZOworCQl2YXIgcyA9IGNoaWxkLm5leHQ7CisJCQorCQl3aGlsZSAocyAhPSBudWxsKQorCQl7CisJCQlib3VuZHMgPSB0aGlzLmhvcml6b250YWxMYXlvdXQocywgbm9kZS54ICsgY2hpbGQub2Zmc2V0WCwgc2libGluZ09mZnNldCwgYm91bmRzKTsKKwkJCXNpYmxpbmdPZmZzZXQgKz0gcy5vZmZzZXRZOworCQkJcyA9IHMubmV4dDsKKwkJfQorCX0KKwkKKwlyZXR1cm4gYm91bmRzOworfTsKKwkKKy8qKgorICogRnVuY3Rpb246IHZlcnRpY2FsTGF5b3V0CisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLnZlcnRpY2FsTGF5b3V0ID0gZnVuY3Rpb24obm9kZSwgcGFyZW50LCB4MCwgeTAsIGJvdW5kcykKK3sKKwlub2RlLnggKz0geDAgKyBub2RlLm9mZnNldFk7CisJbm9kZS55ICs9IHkwICsgbm9kZS5vZmZzZXRYOworCWJvdW5kcyA9IHRoaXMuYXBwbHkobm9kZSwgYm91bmRzKTsKKwl2YXIgY2hpbGQgPSBub2RlLmNoaWxkOworCQorCWlmIChjaGlsZCAhPSBudWxsKQorCXsKKwkJYm91bmRzID0gdGhpcy52ZXJ0aWNhbExheW91dChjaGlsZCwgbm9kZSwgbm9kZS54LCBub2RlLnksIGJvdW5kcyk7CisJCXZhciBzaWJsaW5nT2Zmc2V0ID0gbm9kZS54ICsgY2hpbGQub2Zmc2V0WTsKKwkJdmFyIHMgPSBjaGlsZC5uZXh0OworCQkKKwkJd2hpbGUgKHMgIT0gbnVsbCkKKwkJeworCQkJYm91bmRzID0gdGhpcy52ZXJ0aWNhbExheW91dChzLCBub2RlLCBzaWJsaW5nT2Zmc2V0LCBub2RlLnkgKyBjaGlsZC5vZmZzZXRYLCBib3VuZHMpOworCQkJc2libGluZ09mZnNldCArPSBzLm9mZnNldFk7CisJCQlzID0gcy5uZXh0OworCQl9CisJfQorCQorCXJldHVybiBib3VuZHM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhdHRhY2hQYXJlbnQKKyAqLworbXhDb21wYWN0VHJlZUxheW91dC5wcm90b3R5cGUuYXR0YWNoUGFyZW50ID0gZnVuY3Rpb24obm9kZSwgaGVpZ2h0KQoreworCXZhciB4ID0gdGhpcy5ub2RlRGlzdGFuY2UgKyB0aGlzLmxldmVsRGlzdGFuY2U7CisJdmFyIHkyID0gKGhlaWdodCAtIG5vZGUud2lkdGgpIC8gMiAtIHRoaXMubm9kZURpc3RhbmNlOworCXZhciB5MSA9IHkyICsgbm9kZS53aWR0aCArIDIgKiB0aGlzLm5vZGVEaXN0YW5jZSAtIGhlaWdodDsKKwkKKwlub2RlLmNoaWxkLm9mZnNldFggPSB4ICsgbm9kZS5oZWlnaHQ7CisJbm9kZS5jaGlsZC5vZmZzZXRZID0geTE7CisJCisJbm9kZS5jb250b3VyLnVwcGVySGVhZCA9IHRoaXMuY3JlYXRlTGluZShub2RlLmhlaWdodCwgMCwKKwkJdGhpcy5jcmVhdGVMaW5lKHgsIHkxLCBub2RlLmNvbnRvdXIudXBwZXJIZWFkKSk7CisJbm9kZS5jb250b3VyLmxvd2VySGVhZCA9IHRoaXMuY3JlYXRlTGluZShub2RlLmhlaWdodCwgMCwKKwkJdGhpcy5jcmVhdGVMaW5lKHgsIHkyLCBub2RlLmNvbnRvdXIubG93ZXJIZWFkKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBsYXlvdXRMZWFmCisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLmxheW91dExlYWYgPSBmdW5jdGlvbihub2RlKQoreworCXZhciBkaXN0ID0gMiAqIHRoaXMubm9kZURpc3RhbmNlOworCQorCW5vZGUuY29udG91ci51cHBlclRhaWwgPSB0aGlzLmNyZWF0ZUxpbmUoCisJCW5vZGUuaGVpZ2h0ICsgZGlzdCwgMCk7CisJbm9kZS5jb250b3VyLnVwcGVySGVhZCA9IG5vZGUuY29udG91ci51cHBlclRhaWw7CisJbm9kZS5jb250b3VyLmxvd2VyVGFpbCA9IHRoaXMuY3JlYXRlTGluZSgKKwkJMCwgLW5vZGUud2lkdGggLSBkaXN0KTsKKwlub2RlLmNvbnRvdXIubG93ZXJIZWFkID0gdGhpcy5jcmVhdGVMaW5lKAorCQlub2RlLmhlaWdodCArIGRpc3QsIDAsIG5vZGUuY29udG91ci5sb3dlclRhaWwpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogam9pbgorICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24obm9kZSkKK3sKKwl2YXIgZGlzdCA9IDIgKiB0aGlzLm5vZGVEaXN0YW5jZTsKKwkKKwl2YXIgY2hpbGQgPSBub2RlLmNoaWxkOworCW5vZGUuY29udG91ciA9IGNoaWxkLmNvbnRvdXI7CisJdmFyIGggPSBjaGlsZC53aWR0aCArIGRpc3Q7CisJdmFyIHN1bSA9IGg7CisJY2hpbGQgPSBjaGlsZC5uZXh0OworCQorCXdoaWxlIChjaGlsZCAhPSBudWxsKQorCXsKKwkJdmFyIGQgPSB0aGlzLm1lcmdlKG5vZGUuY29udG91ciwgY2hpbGQuY29udG91cik7CisJCWNoaWxkLm9mZnNldFkgPSBkICsgaDsKKwkJY2hpbGQub2Zmc2V0WCA9IDA7CisJCWggPSBjaGlsZC53aWR0aCArIGRpc3Q7CisJCXN1bSArPSBkICsgaDsKKwkJY2hpbGQgPSBjaGlsZC5uZXh0OworCX0KKwkKKwlyZXR1cm4gc3VtOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogbWVyZ2UKKyAqLworbXhDb21wYWN0VHJlZUxheW91dC5wcm90b3R5cGUubWVyZ2UgPSBmdW5jdGlvbihwMSwgcDIpCit7CisJdmFyIHggPSAwOworCXZhciB5ID0gMDsKKwl2YXIgdG90YWwgPSAwOworCQorCXZhciB1cHBlciA9IHAxLmxvd2VySGVhZDsKKwl2YXIgbG93ZXIgPSBwMi51cHBlckhlYWQ7CisJCisJd2hpbGUgKGxvd2VyICE9IG51bGwgJiYgdXBwZXIgIT0gbnVsbCkKKwl7CisJCXZhciBkID0gdGhpcy5vZmZzZXQoeCwgeSwgbG93ZXIuZHgsIGxvd2VyLmR5LAorCQkJdXBwZXIuZHgsIHVwcGVyLmR5KTsKKwkJeSArPSBkOworCQl0b3RhbCArPSBkOworCQkKKwkJaWYgKHggKyBsb3dlci5keCA8PSB1cHBlci5keCkKKwkJeworCQkJeCArPSBsb3dlci5keDsKKwkJCXkgKz0gbG93ZXIuZHk7CisJCQlsb3dlciA9IGxvd2VyLm5leHQ7CisJCX0KKwkJZWxzZQorCQl7CQkJCQorCQkJeCAtPSB1cHBlci5keDsKKwkJCXkgLT0gdXBwZXIuZHk7CisJCQl1cHBlciA9IHVwcGVyLm5leHQ7CisJCX0KKwl9CisJCisJaWYgKGxvd2VyICE9IG51bGwpCisJeworCQl2YXIgYiA9IHRoaXMuYnJpZGdlKHAxLnVwcGVyVGFpbCwgMCwgMCwgbG93ZXIsIHgsIHkpOworCQlwMS51cHBlclRhaWwgPSAoYi5uZXh0ICE9IG51bGwpID8gcDIudXBwZXJUYWlsIDogYjsKKwkJcDEubG93ZXJUYWlsID0gcDIubG93ZXJUYWlsOworCX0KKwllbHNlCisJeworCQl2YXIgYiA9IHRoaXMuYnJpZGdlKHAyLmxvd2VyVGFpbCwgeCwgeSwgdXBwZXIsIDAsIDApOworCQkKKwkJaWYgKGIubmV4dCA9PSBudWxsKQorCQl7CisJCQlwMS5sb3dlclRhaWwgPSBiOworCQl9CisJfQorCQorCXAxLmxvd2VySGVhZCA9IHAyLmxvd2VySGVhZDsKKwkKKwlyZXR1cm4gdG90YWw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBvZmZzZXQKKyAqLworbXhDb21wYWN0VHJlZUxheW91dC5wcm90b3R5cGUub2Zmc2V0ID0gZnVuY3Rpb24ocDEsIHAyLCBhMSwgYTIsIGIxLCBiMikKK3sKKwl2YXIgZCA9IDA7CisJCisJaWYgKGIxIDw9IHAxIHx8IHAxICsgYTEgPD0gMCkKKwl7CisJCXJldHVybiAwOworCX0KKworCXZhciB0ID0gYjEgKiBhMiAtIGExICogYjI7CisJCisJaWYgKHQgPiAwKQorCXsKKwkJaWYgKHAxIDwgMCkKKwkJeworCQkJdmFyIHMgPSBwMSAqIGEyOworCQkJZCA9IHMgLyBhMSAtIHAyOworCQl9CisJCWVsc2UgaWYgKHAxID4gMCkKKwkJeworCQkJdmFyIHMgPSBwMSAqIGIyOworCQkJZCA9IHMgLyBiMSAtIHAyOworCQl9CisJCWVsc2UKKwkJeworCQkJZCA9IC1wMjsKKwkJfQorCX0KKwllbHNlIGlmIChiMSA8IHAxICsgYTEpCisJeworCQl2YXIgcyA9IChiMSAtIHAxKSAqIGEyOworCQlkID0gYjIgLSAocDIgKyBzIC8gYTEpOworCX0KKwllbHNlIGlmIChiMSA+IHAxICsgYTEpCisJeworCQl2YXIgcyA9IChhMSArIHAxKSAqIGIyOworCQlkID0gcyAvIGIxIC0gKHAyICsgYTIpOworCX0KKwllbHNlCisJeworCQlkID0gYjIgLSAocDIgKyBhMik7CisJfQorCisJaWYgKGQgPiAwKQorCXsKKwkJcmV0dXJuIGQ7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiAwOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGJyaWRnZQorICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5icmlkZ2UgPSBmdW5jdGlvbihsaW5lMSwgeDEsIHkxLCBsaW5lMiwgeDIsIHkyKQoreworCXZhciBkeCA9IHgyICsgbGluZTIuZHggLSB4MTsKKwl2YXIgZHkgPSAwOworCXZhciBzID0gMDsKKwkKKwlpZiAobGluZTIuZHggPT0gMCkKKwl7CisJCWR5ID0gbGluZTIuZHk7CisJfQorCWVsc2UKKwl7CisJCXMgPSBkeCAqIGxpbmUyLmR5OworCQlkeSA9IHMgLyBsaW5lMi5keDsKKwl9CisJCisJdmFyIHIgPSB0aGlzLmNyZWF0ZUxpbmUoZHgsIGR5LCBsaW5lMi5uZXh0KTsKKwlsaW5lMS5uZXh0ID0gdGhpcy5jcmVhdGVMaW5lKDAsIHkyICsgbGluZTIuZHkgLSBkeSAtIHkxLCByKTsKKwkKKwlyZXR1cm4gcjsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZU5vZGUKKyAqLworbXhDb21wYWN0VHJlZUxheW91dC5wcm90b3R5cGUuY3JlYXRlTm9kZSA9IGZ1bmN0aW9uKGNlbGwpCit7CisJdmFyIG5vZGUgPSBuZXcgT2JqZWN0KCk7CisJbm9kZS5jZWxsID0gY2VsbDsKKwlub2RlLnggPSAwOworCW5vZGUueSA9IDA7CisJbm9kZS53aWR0aCA9IDA7CisJbm9kZS5oZWlnaHQgPSAwOworCQorCXZhciBnZW8gPSB0aGlzLmdldFZlcnRleEJvdW5kcyhjZWxsKTsKKwkKKwlpZiAoZ2VvICE9IG51bGwpCisJeworCQlpZiAodGhpcy5pc0hvcml6b250YWwoKSkKKwkJeworCQkJbm9kZS53aWR0aCA9IGdlby5oZWlnaHQ7CisJCQlub2RlLmhlaWdodCA9IGdlby53aWR0aDsJCQkKKwkJfQorCQllbHNlCisJCXsKKwkJCW5vZGUud2lkdGggPSBnZW8ud2lkdGg7CisJCQlub2RlLmhlaWdodCA9IGdlby5oZWlnaHQ7CisJCX0KKwl9CisJCisJbm9kZS5vZmZzZXRYID0gMDsKKwlub2RlLm9mZnNldFkgPSAwOworCW5vZGUuY29udG91ciA9IG5ldyBPYmplY3QoKTsKKwkKKwlyZXR1cm4gbm9kZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFwcGx5CisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLmFwcGx5ID0gZnVuY3Rpb24obm9kZSwgYm91bmRzKQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwl2YXIgY2VsbCA9IG5vZGUuY2VsbDsKKwl2YXIgZyA9IG1vZGVsLmdldEdlb21ldHJ5KGNlbGwpOworCisJaWYgKGNlbGwgIT0gbnVsbCAmJiBnICE9IG51bGwpCisJeworCQlpZiAodGhpcy5pc1ZlcnRleE1vdmFibGUoY2VsbCkpCisJCXsKKwkJCWcgPSB0aGlzLnNldFZlcnRleExvY2F0aW9uKGNlbGwsIG5vZGUueCwgbm9kZS55KTsKKwkJCQorCQkJaWYgKHRoaXMucmVzaXplUGFyZW50KQorCQkJeworCQkJCXZhciBwYXJlbnQgPSBtb2RlbC5nZXRQYXJlbnQoY2VsbCk7CisJCQkJdmFyIGlkID0gbXhDZWxsUGF0aC5jcmVhdGUocGFyZW50KTsKKwkJCQkKKwkJCQkvLyBJbXBsZW1lbnRzIHNldCBzZW1hbnRpYworCQkJCWlmICh0aGlzLnBhcmVudHNDaGFuZ2VkW2lkXSA9PSBudWxsKQorCQkJCXsKKwkJCQkJdGhpcy5wYXJlbnRzQ2hhbmdlZFtpZF0gPSBwYXJlbnQ7CQkJCQkKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCWlmIChib3VuZHMgPT0gbnVsbCkKKwkJeworCQkJYm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKGcueCwgZy55LCBnLndpZHRoLCBnLmhlaWdodCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUoTWF0aC5taW4oYm91bmRzLngsIGcueCksCisJCQkJTWF0aC5taW4oYm91bmRzLnksIGcueSksCisJCQkJTWF0aC5tYXgoYm91bmRzLnggKyBib3VuZHMud2lkdGgsIGcueCArIGcud2lkdGgpLAorCQkJCU1hdGgubWF4KGJvdW5kcy55ICsgYm91bmRzLmhlaWdodCwgZy55ICsgZy5oZWlnaHQpKTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gYm91bmRzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlTGluZQorICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5jcmVhdGVMaW5lID0gZnVuY3Rpb24oZHgsIGR5LCBuZXh0KQoreworCXZhciBsaW5lID0gbmV3IE9iamVjdCgpOworCWxpbmUuZHggPSBkeDsKKwlsaW5lLmR5ID0gZHk7CisJbGluZS5uZXh0ID0gbmV4dDsKKwkKKwlyZXR1cm4gbGluZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkanVzdFBhcmVudHMKKyAqIAorICogQWRqdXN0IHBhcmVudCBjZWxscyB3aG9zZSBjaGlsZCBnZW9tZXRyaWVzIGhhdmUgY2hhbmdlZC4gVGhlIGRlZmF1bHQgCisgKiBpbXBsZW1lbnRhdGlvbiBhZGp1c3RzIHRoZSBncm91cCB0byBqdXN0IGZpdCBhcm91bmQgdGhlIGNoaWxkcmVuIHdpdGggCisgKiBhIHBhZGRpbmcuCisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLmFkanVzdFBhcmVudHMgPSBmdW5jdGlvbigpCit7CisJdmFyIHRtcCA9IFtdOworCQorCWZvciAodmFyIGlkIGluIHRoaXMucGFyZW50c0NoYW5nZWQpCisJeworCQl0bXAucHVzaCh0aGlzLnBhcmVudHNDaGFuZ2VkW2lkXSk7CisJfQorCQorCXRoaXMuYXJyYW5nZUdyb3VwcyhteFV0aWxzLnNvcnRDZWxscyh0bXAsIHRydWUpLCB0aGlzLmdyb3VwUGFkZGluZywgdGhpcy5ncm91cFBhZGRpbmdUb3AsCisJCXRoaXMuZ3JvdXBQYWRkaW5nUmlnaHQsIHRoaXMuZ3JvdXBQYWRkaW5nQm90dG9tLCB0aGlzLmdyb3VwUGFkZGluZ0xlZnQpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogbG9jYWxFZGdlUHJvY2Vzc2luZworICoKKyAqIE1vdmVzIHRoZSBzcGVjaWZpZWQgbm9kZSBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbiBieSB0aGUgZ2l2ZW4gYW1vdW50LgorICovCitteENvbXBhY3RUcmVlTGF5b3V0LnByb3RvdHlwZS5sb2NhbEVkZ2VQcm9jZXNzaW5nID0gZnVuY3Rpb24obm9kZSkKK3sKKwl0aGlzLnByb2Nlc3NOb2RlT3V0Z29pbmcobm9kZSk7CisJdmFyIGNoaWxkID0gbm9kZS5jaGlsZDsKKworCXdoaWxlIChjaGlsZCAhPSBudWxsKQorCXsKKwkJdGhpcy5sb2NhbEVkZ2VQcm9jZXNzaW5nKGNoaWxkKTsKKwkJY2hpbGQgPSBjaGlsZC5uZXh0OworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGxvY2FsRWRnZVByb2Nlc3NpbmcKKyAqCisgKiBTZXBhcmF0ZXMgdGhlIHggcG9zaXRpb24gb2YgZWRnZXMgYXMgdGhleSBjb25uZWN0IHRvIHZlcnRpY2VzCisgKi8KK214Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLnByb2Nlc3NOb2RlT3V0Z29pbmcgPSBmdW5jdGlvbihub2RlKQoreworCXZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7CisJdmFyIHBhcmVudENlbGwgPSBub2RlLmNlbGw7CisKKwl2YXIgY2hpbGRDb3VudCA9IDA7CisJdmFyIHNvcnRlZENlbGxzID0gW107CisKKwl3aGlsZSAoY2hpbGQgIT0gbnVsbCkKKwl7CisJCWNoaWxkQ291bnQrKzsKKworCQl2YXIgc29ydGluZ0NyaXRlcmlvbiA9IGNoaWxkLng7CisKKwkJaWYgKHRoaXMuaG9yaXpvbnRhbCkKKwkJeworCQkJc29ydGluZ0NyaXRlcmlvbiA9IGNoaWxkLnk7CisJCX0KKworCQlzb3J0ZWRDZWxscy5wdXNoKG5ldyBXZWlnaHRlZENlbGxTb3J0ZXIoY2hpbGQsIHNvcnRpbmdDcml0ZXJpb24pKTsKKwkJY2hpbGQgPSBjaGlsZC5uZXh0OworCX0KKworCXNvcnRlZENlbGxzLnNvcnQoV2VpZ2h0ZWRDZWxsU29ydGVyLnByb3RvdHlwZS5jb21wYXJlKTsKKworCXZhciBhdmFpbGFibGVXaWR0aCA9IG5vZGUud2lkdGg7CisKKwl2YXIgcmVxdWlyZWRXaWR0aCA9IChjaGlsZENvdW50ICsgMSkgKiB0aGlzLnByZWZIb3pFZGdlU2VwOworCisJLy8gQWRkIGEgYnVmZmVyIG9uIHRoZSBlZGdlcyBvZiB0aGUgdmVydGV4IGlmIHRoZSBlZGdlIGNvdW50IGFsbG93cworCWlmIChhdmFpbGFibGVXaWR0aCA+IHJlcXVpcmVkV2lkdGggKyAoMiAqIHRoaXMucHJlZkhvekVkZ2VTZXApKQorCXsKKwkJYXZhaWxhYmxlV2lkdGggLT0gMiAqIHRoaXMucHJlZkhvekVkZ2VTZXA7CisJfQorCisJdmFyIGVkZ2VTcGFjaW5nID0gYXZhaWxhYmxlV2lkdGggLyBjaGlsZENvdW50OworCisJdmFyIGN1cnJlbnRYT2Zmc2V0ID0gZWRnZVNwYWNpbmcgLyAyLjA7CisKKwlpZiAoYXZhaWxhYmxlV2lkdGggPiByZXF1aXJlZFdpZHRoICsgKDIgKiB0aGlzLnByZWZIb3pFZGdlU2VwKSkKKwl7CisJCWN1cnJlbnRYT2Zmc2V0ICs9IHRoaXMucHJlZkhvekVkZ2VTZXA7CisJfQorCisJdmFyIGN1cnJlbnRZT2Zmc2V0ID0gdGhpcy5taW5FZGdlSmV0dHkgLSB0aGlzLnByZWZWZXJ0RWRnZU9mZjsKKwl2YXIgbWF4WU9mZnNldCA9IDA7CisKKwl2YXIgcGFyZW50Qm91bmRzID0gdGhpcy5nZXRWZXJ0ZXhCb3VuZHMocGFyZW50Q2VsbCk7CisJY2hpbGQgPSBub2RlLmNoaWxkOworCisJZm9yICh2YXIgaiA9IDA7IGogPCBzb3J0ZWRDZWxscy5sZW5ndGg7IGorKykKKwl7CisJCXZhciBjaGlsZENlbGwgPSBzb3J0ZWRDZWxsc1tqXS5jZWxsLmNlbGw7CisJCXZhciBjaGlsZEJvdW5kcyA9IHRoaXMuZ2V0VmVydGV4Qm91bmRzKGNoaWxkQ2VsbCk7CisKKwkJdmFyIGVkZ2VzID0gdGhpcy5ncmFwaC5nZXRFZGdlc0JldHdlZW4ocGFyZW50Q2VsbCwKKwkJCQljaGlsZENlbGwsIGZhbHNlKTsKKwkJCisJCXZhciBuZXdQb2ludHMgPSBbXTsKKwkJdmFyIHggPSAwOworCQl2YXIgeSA9IDA7CisKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykKKwkJeworCQkJaWYgKHRoaXMuaG9yaXpvbnRhbCkKKwkJCXsKKwkJCQkvLyBVc2Ugb3Bwb3NpdGUgY28tb3JkcywgY2FsY3VsYXRpb24gd2FzIGRvbmUgZm9yIAorCQkJCS8vIAorCQkJCXggPSBwYXJlbnRCb3VuZHMueCArIHBhcmVudEJvdW5kcy53aWR0aDsKKwkJCQl5ID0gcGFyZW50Qm91bmRzLnkgKyBjdXJyZW50WE9mZnNldDsKKwkJCQluZXdQb2ludHMucHVzaChuZXcgbXhQb2ludCh4LCB5KSk7CisJCQkJeCA9IHBhcmVudEJvdW5kcy54ICsgcGFyZW50Qm91bmRzLndpZHRoCisJCQkJCQkrIGN1cnJlbnRZT2Zmc2V0OworCQkJCW5ld1BvaW50cy5wdXNoKG5ldyBteFBvaW50KHgsIHkpKTsKKwkJCQl5ID0gY2hpbGRCb3VuZHMueSArIGNoaWxkQm91bmRzLmhlaWdodCAvIDIuMDsKKwkJCQluZXdQb2ludHMucHVzaChuZXcgbXhQb2ludCh4LCB5KSk7CisJCQkJdGhpcy5zZXRFZGdlUG9pbnRzKGVkZ2VzW2ldLCBuZXdQb2ludHMpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXggPSBwYXJlbnRCb3VuZHMueCArIGN1cnJlbnRYT2Zmc2V0OworCQkJCXkgPSBwYXJlbnRCb3VuZHMueSArIHBhcmVudEJvdW5kcy5oZWlnaHQ7CisJCQkJbmV3UG9pbnRzLnB1c2gobmV3IG14UG9pbnQoeCwgeSkpOworCQkJCXkgPSBwYXJlbnRCb3VuZHMueSArIHBhcmVudEJvdW5kcy5oZWlnaHQKKwkJCQkJCSsgY3VycmVudFlPZmZzZXQ7CisJCQkJbmV3UG9pbnRzLnB1c2gobmV3IG14UG9pbnQoeCwgeSkpOworCQkJCXggPSBjaGlsZEJvdW5kcy54ICsgY2hpbGRCb3VuZHMud2lkdGggLyAyLjA7CisJCQkJbmV3UG9pbnRzLnB1c2gobmV3IG14UG9pbnQoeCwgeSkpOworCQkJCXRoaXMuc2V0RWRnZVBvaW50cyhlZGdlc1tpXSwgbmV3UG9pbnRzKTsKKwkJCX0KKwkJfQorCisJCWlmIChqIDwgY2hpbGRDb3VudCAvIDIpCisJCXsKKwkJCWN1cnJlbnRZT2Zmc2V0ICs9IHRoaXMucHJlZlZlcnRFZGdlT2ZmOworCQl9CisJCWVsc2UgaWYgKGogPiBjaGlsZENvdW50IC8gMikKKwkJeworCQkJY3VycmVudFlPZmZzZXQgLT0gdGhpcy5wcmVmVmVydEVkZ2VPZmY7CisJCX0KKwkJLy8gSWdub3JlIHRoZSBjYXNlIGlmIGVxdWFscywgdGhpcyBtZWFucyB0aGUgc2Vjb25kIG9mIDIKKwkJLy8gamV0dHlzIHdpdGggdGhlIHNhbWUgeSAoZXZlbiBudW1iZXIgb2YgZWRnZXMpCisKKwkJLy8JCQkJCQkJCXBvc1trICogMl0gPSBjdXJyZW50WDsKKwkJY3VycmVudFhPZmZzZXQgKz0gZWRnZVNwYWNpbmc7CisJCS8vCQkJCQkJCQlwb3NbayAqIDIgKyAxXSA9IGN1cnJlbnRZT2Zmc2V0OworCisJCW1heFlPZmZzZXQgPSBNYXRoLm1heChtYXhZT2Zmc2V0LCBjdXJyZW50WU9mZnNldCk7CisJfQorfTsKKworLyoqCisgKiBDbGFzczogV2VpZ2h0ZWRDZWxsU29ydGVyCisgKiAKKyAqIEEgdXRpbGl0eSBjbGFzcyB1c2VkIHRvIHRyYWNrIGNlbGxzIHdoaWxzdCBzb3J0aW5nIG9jY3VycyBvbiB0aGUgd2VpZ2h0ZWQKKyAqIHN1bSBvZiB0aGVpciBjb25uZWN0ZWQgZWRnZXMuIERvZXMgbm90IHZpb2xhdGUgKHguY29tcGFyZVRvKHkpPT0wKSA9PQorICogKHguZXF1YWxzKHkpKQorICoKKyAqIENvbnN0cnVjdG9yOiBXZWlnaHRlZENlbGxTb3J0ZXIKKyAqIAorICogQ29uc3RydWN0cyBhIG5ldyB3ZWlnaHRlZCBjZWxsIHNvcnRlZCBmb3IgdGhlIGdpdmVuIGNlbGwgYW5kIHdlaWdodC4KKyAqLworZnVuY3Rpb24gV2VpZ2h0ZWRDZWxsU29ydGVyKGNlbGwsIHdlaWdodGVkVmFsdWUpCit7CisJdGhpcy5jZWxsID0gY2VsbDsKKwl0aGlzLndlaWdodGVkVmFsdWUgPSB3ZWlnaHRlZFZhbHVlOworfTsKKworLyoqCisgKiBWYXJpYWJsZTogd2VpZ2h0ZWRWYWx1ZQorICogCisgKiBUaGUgd2VpZ2h0ZWQgdmFsdWUgb2YgdGhlIGNlbGwgc3RvcmVkLgorICovCitXZWlnaHRlZENlbGxTb3J0ZXIucHJvdG90eXBlLndlaWdodGVkVmFsdWUgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBudWRnZQorICogCisgKiBXaGV0aGVyIG9yIG5vdCB0byBmbGlwIGVxdWFsIHdlaWdodCB2YWx1ZXMuCisgKi8KK1dlaWdodGVkQ2VsbFNvcnRlci5wcm90b3R5cGUubnVkZ2UgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogdmlzaXRlZAorICogCisgKiBXaGV0aGVyIG9yIG5vdCB0aGlzIGNlbGwgaGFzIGJlZW4gdmlzaXRlZCBpbiB0aGUgY3VycmVudCBhc3NpZ25tZW50LgorICovCitXZWlnaHRlZENlbGxTb3J0ZXIucHJvdG90eXBlLnZpc2l0ZWQgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogcmFua0luZGV4CisgKiAKKyAqIFRoZSBpbmRleCB0aGlzIGNlbGwgaXMgaW4gdGhlIG1vZGVsIHJhbmsuCisgKi8KK1dlaWdodGVkQ2VsbFNvcnRlci5wcm90b3R5cGUucmFua0luZGV4ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogY2VsbAorICogCisgKiBUaGUgY2VsbCB3aG9zZSBtZWRpYW4gdmFsdWUgaXMgYmVpbmcgY2FsY3VsYXRlZC4KKyAqLworV2VpZ2h0ZWRDZWxsU29ydGVyLnByb3RvdHlwZS5jZWxsID0gbnVsbDsKKworLyoqCisgKiBGdW5jdGlvbjogY29tcGFyZQorICogCisgKiBDb21wYXJlcyB0d28gV2VpZ2h0ZWRDZWxsU29ydGVycy4KKyAqLworV2VpZ2h0ZWRDZWxsU29ydGVyLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24oYSwgYikKK3sKKwlpZiAoYSAhPSBudWxsICYmIGIgIT0gbnVsbCkKKwl7CisJCWlmIChiLndlaWdodGVkVmFsdWUgPiBhLndlaWdodGVkVmFsdWUpCisJCXsKKwkJCXJldHVybiAxOworCQl9CisJCWVsc2UgaWYgKGIud2VpZ2h0ZWRWYWx1ZSA8IGEud2VpZ2h0ZWRWYWx1ZSkKKwkJeworCQkJcmV0dXJuIC0xOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKGIubnVkZ2UpCisJCQl7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCWVsc2UKKwl7CisJCXJldHVybiAwOworCX0KK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L214Q29tcG9zaXRlTGF5b3V0LmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9teENvbXBvc2l0ZUxheW91dC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTNlMTE2Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9teENvbXBvc2l0ZUxheW91dC5qcwpAQCAtMCwwICsxLDEwMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhDb21wb3NpdGVMYXlvdXQKKyAqIAorICogQWxsb3dzIHRvIGNvbXBvc2UgbXVsdGlwbGUgbGF5b3V0cyBpbnRvIGEgc2luZ2xlIGxheW91dC4gVGhlIG1hc3RlciBsYXlvdXQKKyAqIGlzIHRoZSBsYXlvdXQgdGhhdCBoYW5kbGVzIG1vdmUgb3BlcmF0aW9ucyBpZiBhbm90aGVyIGxheW91dCB0aGFuIHRoZSBmaXJzdAorICogZWxlbWVudCBpbiA8bGF5b3V0cz4gc2hvdWxkIGJlIHVzZWQuIFRoZSA8bWFzdGVyPiBsYXlvdXQgaXMgbm90IGV4ZWN1dGVkIGFzCisgKiB0aGUgY29kZSBhc3N1bWVzIHRoYXQgaXQgaXMgcGFydCBvZiA8bGF5b3V0cz4uCisgKiAKKyAqIEV4YW1wbGU6CisgKiAoY29kZSkKKyAqIHZhciBmaXJzdCA9IG5ldyBteEZhc3RPcmdhbmljTGF5b3V0KGdyYXBoKTsKKyAqIHZhciBzZWNvbmQgPSBuZXcgbXhQYXJhbGxlbEVkZ2VMYXlvdXQoZ3JhcGgpOworICogdmFyIGxheW91dCA9IG5ldyBteENvbXBvc2l0ZUxheW91dChncmFwaCwgW2ZpcnN0LCBzZWNvbmRdLCBmaXJzdCk7CisgKiBsYXlvdXQuZXhlY3V0ZShncmFwaC5nZXREZWZhdWx0UGFyZW50KCkpOworICogKGVuZCkKKyAqIAorICogQ29uc3RydWN0b3I6IG14Q29tcG9zaXRlTGF5b3V0CisgKgorICogQ29uc3RydWN0cyBhIG5ldyBsYXlvdXQgdXNpbmcgdGhlIGdpdmVuIGxheW91dHMuIFRoZSBncmFwaCBpbnN0YW5jZSBpcworICogcmVxdWlyZWQgZm9yIGNyZWF0aW5nIHRoZSB0cmFuc2FjdGlvbiB0aGF0IGNvbnRhaW5zIGFsbCBsYXlvdXRzLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIAorICogZ3JhcGggLSBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKiBsYXlvdXRzIC0gQXJyYXkgb2YgPG14R3JhcGhMYXlvdXRzPi4KKyAqIG1hc3RlciAtIE9wdGlvbmFsIGxheW91dCB0aGF0IGhhbmRsZXMgbW92ZXMuIElmIG5vIGxheW91dCBpcyBnaXZlbiB0aGVuCisgKiB0aGUgZmlyc3QgbGF5b3V0IG9mIHRoZSBhYm92ZSBhcnJheSBpcyB1c2VkIHRvIGhhbmRsZSBtb3Zlcy4KKyAqLworZnVuY3Rpb24gbXhDb21wb3NpdGVMYXlvdXQoZ3JhcGgsIGxheW91dHMsIG1hc3RlcikKK3sKKwlteEdyYXBoTGF5b3V0LmNhbGwodGhpcywgZ3JhcGgpOworCXRoaXMubGF5b3V0cyA9IGxheW91dHM7CisJdGhpcy5tYXN0ZXIgPSBtYXN0ZXI7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhHcmFwaExheW91dC4KKyAqLworbXhDb21wb3NpdGVMYXlvdXQucHJvdG90eXBlID0gbmV3IG14R3JhcGhMYXlvdXQoKTsKK214Q29tcG9zaXRlTGF5b3V0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG14Q29tcG9zaXRlTGF5b3V0OworCQorLyoqCisgKiBWYXJpYWJsZTogbGF5b3V0cworICogCisgKiBIb2xkcyB0aGUgYXJyYXkgb2YgPG14R3JhcGhMYXlvdXRzPiB0aGF0IHRoaXMgbGF5b3V0IGNvbnRhaW5zLgorICovCitteENvbXBvc2l0ZUxheW91dC5wcm90b3R5cGUubGF5b3V0cyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGxheW91dHMKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSA8bXhHcmFwaExheW91dHM+IHRoYXQgaGFuZGxlcyBtb3Zlcy4gSWYgdGhpcyBpcyBudWxsCisgKiB0aGVuIHRoZSBmaXJzdCBsYXlvdXQgaW4gPGxheW91dHM+IGlzIHVzZWQuCisgKi8KK214Q29tcG9zaXRlTGF5b3V0LnByb3RvdHlwZS5tYXN0ZXIgPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3ZlQ2VsbAorICogCisgKiBJbXBsZW1lbnRzIDxteEdyYXBoTGF5b3V0Lm1vdmVDZWxsPiBieSBjYWxsaW5nIG1vdmUgb24gPG1hc3Rlcj4gb3IgdGhlIGZpcnN0CisgKiBsYXlvdXQgaW4gPGxheW91dHM+LgorICovCitteENvbXBvc2l0ZUxheW91dC5wcm90b3R5cGUubW92ZUNlbGwgPSBmdW5jdGlvbihjZWxsLCB4LCB5KQoreworCWlmICh0aGlzLm1hc3RlciAhPSBudWxsKQorCXsKKwkJdGhpcy5tYXN0ZXIubW92ZS5hcHBseSh0aGlzLm1hc3RlciwgYXJndW1lbnRzKTsKKwl9CisJZWxzZQorCXsKKwkJdGhpcy5sYXlvdXRzWzBdLm1vdmUuYXBwbHkodGhpcy5sYXlvdXRzWzBdLCBhcmd1bWVudHMpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGV4ZWN1dGUKKyAqIAorICogSW1wbGVtZW50cyA8bXhHcmFwaExheW91dC5leGVjdXRlPiBieSBleGVjdXRpbmcgYWxsIDxsYXlvdXRzPiBpbiBhCisgKiBzaW5nbGUgdHJhbnNhY3Rpb24uCisgKi8KK214Q29tcG9zaXRlTGF5b3V0LnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24ocGFyZW50KQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwkKKwltb2RlbC5iZWdpblVwZGF0ZSgpOworCXRyeQorCXsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxheW91dHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXRoaXMubGF5b3V0c1tpXS5leGVjdXRlLmFwcGx5KHRoaXMubGF5b3V0c1tpXSwgYXJndW1lbnRzKTsKKwkJfQorCX0KKwlmaW5hbGx5CisJeworCQltb2RlbC5lbmRVcGRhdGUoKTsKKwl9Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9teEVkZ2VMYWJlbExheW91dC5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvbXhFZGdlTGFiZWxMYXlvdXQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiYTI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvbXhFZGdlTGFiZWxMYXlvdXQuanMKQEAgLTAsMCArMSwxNjUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14RWRnZUxhYmVsTGF5b3V0CisgKiAKKyAqIEV4dGVuZHMgPG14R3JhcGhMYXlvdXQ+IHRvIGltcGxlbWVudCBhbiBlZGdlIGxhYmVsIGxheW91dC4gVGhpcyBsYXlvdXQKKyAqIG1ha2VzIHVzZSBvZiBjZWxsIHN0YXRlcywgd2hpY2ggbWVhbnMgdGhlIGdyYXBoIG11c3QgYmUgdmFsaWRhdGVkIGluCisgKiBhIGdyYXBoIHZpZXcgKHNvIHRoYXQgdGhlIGxhYmVsIGJvdW5kcyBhcmUgYXZhaWxhYmxlKSBiZWZvcmUgdGhpcyBsYXlvdXQKKyAqIGNhbiBiZSBleGVjdXRlZC4KKyAqIAorICogRXhhbXBsZToKKyAqIAorICogKGNvZGUpCisgKiB2YXIgbGF5b3V0ID0gbmV3IG14RWRnZUxhYmVsTGF5b3V0KGdyYXBoKTsKKyAqIGxheW91dC5leGVjdXRlKGdyYXBoLmdldERlZmF1bHRQYXJlbnQoKSk7CisgKiAoZW5kKQorICogCisgKiBDb25zdHJ1Y3RvcjogbXhFZGdlTGFiZWxMYXlvdXQKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGVkZ2UgbGFiZWwgbGF5b3V0LgorICoKKyAqIEFyZ3VtZW50czoKKyAqIAorICogZ3JhcGggLSA8bXhHcmFwaD4gdGhhdCBjb250YWlucyB0aGUgY2VsbHMuCisgKi8KK2Z1bmN0aW9uIG14RWRnZUxhYmVsTGF5b3V0KGdyYXBoLCByYWRpdXMpCit7CisJbXhHcmFwaExheW91dC5jYWxsKHRoaXMsIGdyYXBoKTsKK307CisKKy8qKgorICogRXh0ZW5kcyBteEdyYXBoTGF5b3V0LgorICovCitteEVkZ2VMYWJlbExheW91dC5wcm90b3R5cGUgPSBuZXcgbXhHcmFwaExheW91dCgpOworbXhFZGdlTGFiZWxMYXlvdXQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhFZGdlTGFiZWxMYXlvdXQ7CisKKy8qKgorICogRnVuY3Rpb246IGV4ZWN1dGUKKyAqIAorICogSW1wbGVtZW50cyA8bXhHcmFwaExheW91dC5leGVjdXRlPi4KKyAqLworbXhFZGdlTGFiZWxMYXlvdXQucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbihwYXJlbnQpCit7CisJdmFyIHZpZXcgPSB0aGlzLmdyYXBoLnZpZXc7CisJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpOworCQorCS8vIEdldHMgYWxsIHZlcnRpY2VzIGFuZCBlZGdlcyBpbnNpZGUgdGhlIHBhcmVudAorCXZhciBlZGdlcyA9IFtdOworCXZhciB2ZXJ0aWNlcyA9IFtdOworCXZhciBjaGlsZENvdW50ID0gbW9kZWwuZ2V0Q2hpbGRDb3VudChwYXJlbnQpOworCQorCWZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKQorCXsKKwkJdmFyIGNlbGwgPSBtb2RlbC5nZXRDaGlsZEF0KHBhcmVudCwgaSk7CisJCXZhciBzdGF0ZSA9IHZpZXcuZ2V0U3RhdGUoY2VsbCk7CisJCQorCQlpZiAoc3RhdGUgIT0gbnVsbCkKKwkJeworCQkJaWYgKCF0aGlzLmlzVmVydGV4SWdub3JlZChjZWxsKSkKKwkJCXsKKwkJCQl2ZXJ0aWNlcy5wdXNoKHN0YXRlKTsKKwkJCX0KKwkJCWVsc2UgaWYgKCF0aGlzLmlzRWRnZUlnbm9yZWQoY2VsbCkpCisJCQl7CisJCQkJZWRnZXMucHVzaChzdGF0ZSk7CisJCQl9CisJCX0KKwl9CisJCisJdGhpcy5wbGFjZUxhYmVscyh2ZXJ0aWNlcywgZWRnZXMpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcGxhY2VMYWJlbHMKKyAqIAorICogUGxhY2VzIHRoZSBsYWJlbHMgb2YgdGhlIGdpdmVuIGVkZ2VzLgorICovCitteEVkZ2VMYWJlbExheW91dC5wcm90b3R5cGUucGxhY2VMYWJlbHMgPSBmdW5jdGlvbih2LCBlKQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwkKKwkvLyBNb3ZlcyB0aGUgdmVydGljZXMgdG8gYnVpbGQgYSBjaXJjbGUuIE1ha2VzIHN1cmUgdGhlCisJLy8gcmFkaXVzIGlzIGxhcmdlIGVub3VnaCBmb3IgdGhlIHZlcnRpY2VzIHRvIG5vdAorCS8vIG92ZXJsYXAKKwltb2RlbC5iZWdpblVwZGF0ZSgpOworCXRyeQorCXsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKQorCQl7CisJCQl2YXIgZWRnZSA9IGVbaV07CisJCQkKKwkJCWlmIChlZGdlICE9IG51bGwgJiYgZWRnZS50ZXh0ICE9IG51bGwgJiYKKwkJCQllZGdlLnRleHQuYm91bmRpbmdCb3ggIT0gbnVsbCkKKwkJCXsKKwkJCQlmb3IgKHZhciBqID0gMDsgaiA8IHYubGVuZ3RoOyBqKyspCisJCQkJeworCQkJCQl2YXIgdmVydGV4ID0gdltqXTsKKwkJCQkJCisJCQkJCWlmICh2ZXJ0ZXggIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJdGhpcy5hdm9pZChlZGdlLCB2ZXJ0ZXgpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCWZpbmFsbHkKKwl7CisJCW1vZGVsLmVuZFVwZGF0ZSgpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGF2b2lkCisgKiAKKyAqIFBsYWNlcyB0aGUgbGFiZWxzIG9mIHRoZSBnaXZlbiBlZGdlcy4KKyAqLworbXhFZGdlTGFiZWxMYXlvdXQucHJvdG90eXBlLmF2b2lkID0gZnVuY3Rpb24oZWRnZSwgdmVydGV4KQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwl2YXIgbGFiUmVjdCA9IGVkZ2UudGV4dC5ib3VuZGluZ0JveDsKKwkKKwlpZiAobXhVdGlscy5pbnRlcnNlY3RzKGxhYlJlY3QsIHZlcnRleCkpCisJeworCQl2YXIgZHkxID0gLWxhYlJlY3QueSAtIGxhYlJlY3QuaGVpZ2h0ICsgdmVydGV4Lnk7CisJCXZhciBkeTIgPSAtbGFiUmVjdC55ICsgdmVydGV4LnkgKyB2ZXJ0ZXguaGVpZ2h0OworCQkKKwkJdmFyIGR5ID0gKE1hdGguYWJzKGR5MSkgPCBNYXRoLmFicyhkeTIpKSA/IGR5MSA6IGR5MjsKKwkJCisJCXZhciBkeDEgPSAtbGFiUmVjdC54IC0gbGFiUmVjdC53aWR0aCArIHZlcnRleC54OworCQl2YXIgZHgyID0gLWxhYlJlY3QueCArIHZlcnRleC54ICsgdmVydGV4LndpZHRoOworCQorCQl2YXIgZHggPSAoTWF0aC5hYnMoZHgxKSA8IE1hdGguYWJzKGR4MikpID8gZHgxIDogZHgyOworCQkKKwkJaWYgKE1hdGguYWJzKGR4KSA8IE1hdGguYWJzKGR5KSkKKwkJeworCQkJZHkgPSAwOworCQl9CisJCWVsc2UKKwkJeworCQkJZHggPSAwOworCQl9CisJCisJCXZhciBnID0gbW9kZWwuZ2V0R2VvbWV0cnkoZWRnZS5jZWxsKTsKKwkJCisJCWlmIChnICE9IG51bGwpCisJCXsKKwkJCWcgPSBnLmNsb25lKCk7CisJCQkKKwkJCWlmIChnLm9mZnNldCAhPSBudWxsKQorCQkJeworCQkJCWcub2Zmc2V0LnggKz0gZHg7CisJCQkJZy5vZmZzZXQueSArPSBkeTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlnLm9mZnNldCA9IG5ldyBteFBvaW50KGR4LCBkeSk7CisJCQl9CisJCQkKKwkJCW1vZGVsLnNldEdlb21ldHJ5KGVkZ2UuY2VsbCwgZyk7CisJCX0KKwl9Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9teEZhc3RPcmdhbmljTGF5b3V0LmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9teEZhc3RPcmdhbmljTGF5b3V0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OWJmNjkKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L214RmFzdE9yZ2FuaWNMYXlvdXQuanMKQEAgLTAsMCArMSw1OTEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14RmFzdE9yZ2FuaWNMYXlvdXQKKyAqIAorICogRXh0ZW5kcyA8bXhHcmFwaExheW91dD4gdG8gaW1wbGVtZW50IGEgZmFzdCBvcmdhbmljIGxheW91dCBhbGdvcml0aG0uCisgKiBUaGUgdmVydGljZXMgbmVlZCB0byBiZSBjb25uZWN0ZWQgZm9yIHRoaXMgbGF5b3V0IHRvIHdvcmssIHZlcnRpY2VzCisgKiB3aXRoIG5vIGNvbm5lY3Rpb25zIGFyZSBpZ25vcmVkLgorICogCisgKiBFeGFtcGxlOgorICogCisgKiAoY29kZSkKKyAqIHZhciBsYXlvdXQgPSBuZXcgbXhGYXN0T3JnYW5pY0xheW91dChncmFwaCk7CisgKiBsYXlvdXQuZXhlY3V0ZShncmFwaC5nZXREZWZhdWx0UGFyZW50KCkpOworICogKGVuZCkKKyAqIAorICogQ29uc3RydWN0b3I6IG14Q29tcGFjdFRyZWVMYXlvdXQKKyAqIAorICogQ29uc3RydWN0cyBhIG5ldyBmYXN0IG9yZ2FuaWMgbGF5b3V0IGZvciB0aGUgc3BlY2lmaWVkIGdyYXBoLgorICovCitmdW5jdGlvbiBteEZhc3RPcmdhbmljTGF5b3V0KGdyYXBoKQoreworCW14R3JhcGhMYXlvdXQuY2FsbCh0aGlzLCBncmFwaCk7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhHcmFwaExheW91dC4KKyAqLworbXhGYXN0T3JnYW5pY0xheW91dC5wcm90b3R5cGUgPSBuZXcgbXhHcmFwaExheW91dCgpOworbXhGYXN0T3JnYW5pY0xheW91dC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBteEZhc3RPcmdhbmljTGF5b3V0OworCisvKioKKyAqIFZhcmlhYmxlOiB1c2VJbnB1dE9yaWdpbgorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgaW5wdXQgY2VsbHMgc2hvdWxkIGJlIHRoZSBvcmlnaW4KKyAqIG9mIHRoZSBsYXlvdXQgcmVzdWx0LiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214RmFzdE9yZ2FuaWNMYXlvdXQucHJvdG90eXBlLnVzZUlucHV0T3JpZ2luID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogcmVzZXRFZGdlcworICogCisgKiBTcGVjaWZpZXMgaWYgYWxsIGVkZ2UgcG9pbnRzIG9mIHRyYXZlcnNlZCBlZGdlcyBzaG91bGQgYmUgcmVtb3ZlZC4KKyAqIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhGYXN0T3JnYW5pY0xheW91dC5wcm90b3R5cGUucmVzZXRFZGdlcyA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGRpc2FibGVFZGdlU3R5bGUKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBTVFlMRV9OT0VER0VTVFlMRSBmbGFnIHNob3VsZCBiZSBzZXQgb24gZWRnZXMgdGhhdCBhcmUKKyAqIG1vZGlmaWVkIGJ5IHRoZSByZXN1bHQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhGYXN0T3JnYW5pY0xheW91dC5wcm90b3R5cGUuZGlzYWJsZUVkZ2VTdHlsZSA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGZvcmNlQ29uc3RhbnQKKyAqIAorICogVGhlIGZvcmNlIGNvbnN0YW50IGJ5IHdoaWNoIHRoZSBhdHRyYWN0aXZlIGZvcmNlcyBhcmUgZGl2aWRlZCBhbmQgdGhlCisgKiByZXBsdXNpdmUgZm9yY2VzIGFyZSBtdWx0aXBsZSBieSB0aGUgc3F1YXJlIG9mLiBUaGUgdmFsdWUgZXF1YXRlcyB0byB0aGUKKyAqIGF2ZXJhZ2UgcmFkaXVzIHRoZXJlIGlzIG9mIGZyZWUgc3BhY2UgYXJvdW5kIGVhY2ggbm9kZS4gRGVmYXVsdCBpcyA1MC4KKyAqLworbXhGYXN0T3JnYW5pY0xheW91dC5wcm90b3R5cGUuZm9yY2VDb25zdGFudCA9IDUwOworCisvKioKKyAqIFZhcmlhYmxlOiBmb3JjZUNvbnN0YW50U3F1YXJlZAorICogCisgKiBDYWNoZSBvZiA8Zm9yY2VDb25zdGFudD5eMiBmb3IgcGVyZm9ybWFuY2UuCisgKi8KK214RmFzdE9yZ2FuaWNMYXlvdXQucHJvdG90eXBlLmZvcmNlQ29uc3RhbnRTcXVhcmVkID0gMDsKKworLyoqCisgKiBWYXJpYWJsZTogbWluRGlzdGFuY2VMaW1pdAorICogCisgKiBNaW5pbWFsIGRpc3RhbmNlIGxpbWl0LiBEZWZhdWx0IGlzIDIuIFByZXZlbnRzIG9mCisgKiBkaXZpZGluZyBieSB6ZXJvLgorICovCitteEZhc3RPcmdhbmljTGF5b3V0LnByb3RvdHlwZS5taW5EaXN0YW5jZUxpbWl0ID0gMjsKKworLyoqCisgKiBWYXJpYWJsZTogbWluRGlzdGFuY2VMaW1pdAorICogCisgKiBNaW5pbWFsIGRpc3RhbmNlIGxpbWl0LiBEZWZhdWx0IGlzIDIuIFByZXZlbnRzIG9mCisgKiBkaXZpZGluZyBieSB6ZXJvLgorICovCitteEZhc3RPcmdhbmljTGF5b3V0LnByb3RvdHlwZS5tYXhEaXN0YW5jZUxpbWl0ID0gNTAwOworCisvKioKKyAqIFZhcmlhYmxlOiBtaW5EaXN0YW5jZUxpbWl0U3F1YXJlZAorICogCisgKiBDYWNoZWQgdmVyc2lvbiBvZiA8bWluRGlzdGFuY2VMaW1pdD4gc3F1YXJlZC4KKyAqLworbXhGYXN0T3JnYW5pY0xheW91dC5wcm90b3R5cGUubWluRGlzdGFuY2VMaW1pdFNxdWFyZWQgPSA0OworCisvKioKKyAqIFZhcmlhYmxlOiBpbml0aWFsVGVtcAorICogCisgKiBTdGFydCB2YWx1ZSBvZiB0ZW1wZXJhdHVyZS4gRGVmYXVsdCBpcyAyMDAuCisgKi8KK214RmFzdE9yZ2FuaWNMYXlvdXQucHJvdG90eXBlLmluaXRpYWxUZW1wID0gMjAwOworCisvKioKKyAqIFZhcmlhYmxlOiB0ZW1wZXJhdHVyZQorICogCisgKiBUZW1wZXJhdHVyZSB0byBsaW1pdCBkaXNwbGFjZW1lbnQgYXQgbGF0ZXIgc3RhZ2VzIG9mIGxheW91dC4KKyAqLworbXhGYXN0T3JnYW5pY0xheW91dC5wcm90b3R5cGUudGVtcGVyYXR1cmUgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBtYXhJdGVyYXRpb25zCisgKiAKKyAqIFRvdGFsIG51bWJlciBvZiBpdGVyYXRpb25zIHRvIHJ1biB0aGUgbGF5b3V0IHRob3VnaC4KKyAqLworbXhGYXN0T3JnYW5pY0xheW91dC5wcm90b3R5cGUubWF4SXRlcmF0aW9ucyA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IGl0ZXJhdGlvbgorICogCisgKiBDdXJyZW50IGl0ZXJhdGlvbiBjb3VudC4KKyAqLworbXhGYXN0T3JnYW5pY0xheW91dC5wcm90b3R5cGUuaXRlcmF0aW9uID0gMDsKKworLyoqCisgKiBWYXJpYWJsZTogdmVydGV4QXJyYXkKKyAqIAorICogQW4gYXJyYXkgb2YgYWxsIHZlcnRpY2VzIHRvIGJlIGxhaWQgb3V0LgorICovCitteEZhc3RPcmdhbmljTGF5b3V0LnByb3RvdHlwZS52ZXJ0ZXhBcnJheTsKKworLyoqCisgKiBWYXJpYWJsZTogZGlzcFgKKyAqIAorICogQW4gYXJyYXkgb2YgbG9jYWxseSBzdG9yZWQgWCBjby1vcmRpbmF0ZSBkaXNwbGFjZW1lbnRzIGZvciB0aGUgdmVydGljZXMuCisgKi8KK214RmFzdE9yZ2FuaWNMYXlvdXQucHJvdG90eXBlLmRpc3BYOworCisvKioKKyAqIFZhcmlhYmxlOiBkaXNwWQorICogCisgKiBBbiBhcnJheSBvZiBsb2NhbGx5IHN0b3JlZCBZIGNvLW9yZGluYXRlIGRpc3BsYWNlbWVudHMgZm9yIHRoZSB2ZXJ0aWNlcy4KKyAqLworbXhGYXN0T3JnYW5pY0xheW91dC5wcm90b3R5cGUuZGlzcFk7CisKKy8qKgorICogVmFyaWFibGU6IGNlbGxMb2NhdGlvbgorICogCisgKiBBbiBhcnJheSBvZiBsb2NhbGx5IHN0b3JlZCBjby1vcmRpbmF0ZSBwb3NpdGlvbnMgZm9yIHRoZSB2ZXJ0aWNlcy4KKyAqLworbXhGYXN0T3JnYW5pY0xheW91dC5wcm90b3R5cGUuY2VsbExvY2F0aW9uOworCisvKioKKyAqIFZhcmlhYmxlOiByYWRpdXMKKyAqIAorICogVGhlIGFwcHJveGltYXRlIHJhZGl1cyBvZiBlYWNoIGNlbGwsIG5vZGVzIG9ubHkuCisgKi8KK214RmFzdE9yZ2FuaWNMYXlvdXQucHJvdG90eXBlLnJhZGl1czsKKworLyoqCisgKiBWYXJpYWJsZTogcmFkaXVzU3F1YXJlZAorICogCisgKiBUaGUgYXBwcm94aW1hdGUgcmFkaXVzIHNxdWFyZWQgb2YgZWFjaCBjZWxsLCBub2RlcyBvbmx5LgorICovCitteEZhc3RPcmdhbmljTGF5b3V0LnByb3RvdHlwZS5yYWRpdXNTcXVhcmVkOworCisvKioKKyAqIFZhcmlhYmxlOiBpc01vdmVhYmxlCisgKiAKKyAqIEFycmF5IG9mIGJvb2xlYW5zIHJlcHJlc2VudGluZyB0aGUgbW92YWJsZSBzdGF0ZXMgb2YgdGhlIHZlcnRpY2VzLgorICovCitteEZhc3RPcmdhbmljTGF5b3V0LnByb3RvdHlwZS5pc01vdmVhYmxlOworCisvKioKKyAqIFZhcmlhYmxlOiBuZWlnaGJvdXJzCisgKiAKKyAqIExvY2FsIGNvcHkgb2YgY2VsbCBuZWlnaGJvdXJzLgorICovCitteEZhc3RPcmdhbmljTGF5b3V0LnByb3RvdHlwZS5uZWlnaGJvdXJzOworCisvKioKKyAqIFZhcmlhYmxlOiBpbmRpY2VzCisgKiAKKyAqIEhhc2h0YWJsZSBmcm9tIGNlbGxzIHRvIGxvY2FsIGluZGljZXMuCisgKi8KK214RmFzdE9yZ2FuaWNMYXlvdXQucHJvdG90eXBlLmluZGljZXM7CisKKy8qKgorICogVmFyaWFibGU6IGFsbG93ZWRUb1J1bgorICogCisgKiBCb29sZWFuIGZsYWcgdGhhdCBzcGVjaWZpZXMgaWYgdGhlIGxheW91dCBpcyBhbGxvd2VkIHRvIHJ1bi4gSWYgdGhpcyBpcworICogc2V0IHRvIGZhbHNlLCB0aGVuIHRoZSBsYXlvdXQgZXhpdHMgaW4gdGhlIGZvbGxvd2luZyBpdGVyYXRpb24uCisgKi8KK214RmFzdE9yZ2FuaWNMYXlvdXQucHJvdG90eXBlLmFsbG93ZWRUb1J1biA9IHRydWU7CisKKy8qKgorICogRnVuY3Rpb246IGlzVmVydGV4SWdub3JlZAorICogCisgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBnaXZlbiA8bXhDZWxsPiBzaG91bGQgYmUgaWdub3JlZCBhcyBhCisgKiB2ZXJ0ZXguIFRoaXMgcmV0dXJucyB0cnVlIGlmIHRoZSBjZWxsIGhhcyBubyBjb25uZWN0aW9ucy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmVydGV4IC0gPG14Q2VsbD4gd2hvc2UgaWdub3JlZCBzdGF0ZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214RmFzdE9yZ2FuaWNMYXlvdXQucHJvdG90eXBlLmlzVmVydGV4SWdub3JlZCA9IGZ1bmN0aW9uKHZlcnRleCkKK3sKKwlyZXR1cm4gbXhHcmFwaExheW91dC5wcm90b3R5cGUuaXNWZXJ0ZXhJZ25vcmVkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwKKwkJdGhpcy5ncmFwaC5nZXRDb25uZWN0aW9ucyh2ZXJ0ZXgpLmxlbmd0aCA9PSAwOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZXhlY3V0ZQorICogCisgKiBJbXBsZW1lbnRzIDxteEdyYXBoTGF5b3V0LmV4ZWN1dGU+LiBUaGlzIG9wZXJhdGVzIG9uIGFsbCBjaGlsZHJlbiBvZiB0aGUKKyAqIGdpdmVuIHBhcmVudCB3aGVyZSA8aXNWZXJ0ZXhJZ25vcmVkPiByZXR1cm5zIGZhbHNlLgorICovCitteEZhc3RPcmdhbmljTGF5b3V0LnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24ocGFyZW50KQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwl0aGlzLnZlcnRleEFycmF5ID0gW107CisJdmFyIGNlbGxzID0gdGhpcy5ncmFwaC5nZXRDaGlsZFZlcnRpY2VzKHBhcmVudCk7CisJCisJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwl7CisJCWlmICghdGhpcy5pc1ZlcnRleElnbm9yZWQoY2VsbHNbaV0pKQorCQl7CisJCQl0aGlzLnZlcnRleEFycmF5LnB1c2goY2VsbHNbaV0pOworCQl9CisJfQorCQorCXZhciBpbml0aWFsQm91bmRzID0gKHRoaXMudXNlSW5wdXRPcmlnaW4pID8KKwkJCXRoaXMuZ3JhcGguZ2V0Qm91bmRpbmdCb3hGcm9tR2VvbWV0cnkodGhpcy52ZXJ0ZXhBcnJheSkgOgorCQkJCW51bGw7CisJdmFyIG4gPSB0aGlzLnZlcnRleEFycmF5Lmxlbmd0aDsKKworCXRoaXMuaW5kaWNlcyA9IFtdOworCXRoaXMuZGlzcFggPSBbXTsKKwl0aGlzLmRpc3BZID0gW107CisJdGhpcy5jZWxsTG9jYXRpb24gPSBbXTsKKwl0aGlzLmlzTW92ZWFibGUgPSBbXTsKKwl0aGlzLm5laWdoYm91cnMgPSBbXTsKKwl0aGlzLnJhZGl1cyA9IFtdOworCXRoaXMucmFkaXVzU3F1YXJlZCA9IFtdOworCisJaWYgKHRoaXMuZm9yY2VDb25zdGFudCA8IDAuMDAxKQorCXsKKwkJdGhpcy5mb3JjZUNvbnN0YW50ID0gMC4wMDE7CisJfQorCisJdGhpcy5mb3JjZUNvbnN0YW50U3F1YXJlZCA9IHRoaXMuZm9yY2VDb25zdGFudCAqIHRoaXMuZm9yY2VDb25zdGFudDsKKworCS8vIENyZWF0ZSBhIG1hcCBvZiB2ZXJ0aWNlcyBmaXJzdC4gVGhpcyBpcyByZXF1aXJlZCBmb3IgdGhlIGFycmF5IG9mCisJLy8gYXJyYXlzIGNhbGxlZCBuZWlnaGJvdXJzIHdoaWNoIGhvbGRzLCBmb3IgZWFjaCB2ZXJ0ZXgsIGEgbGlzdCBvZgorCS8vIGludHMgd2hpY2ggcmVwcmVzZW50cyB0aGUgbmVpZ2hib3VycyBjZWxscyB0byB0aGF0IHZlcnRleCBhcworCS8vIHRoZSBpbmRpY2VzIGludG8gdmVydGV4QXJyYXkKKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudmVydGV4QXJyYXkubGVuZ3RoOyBpKyspCisJeworCQl2YXIgdmVydGV4ID0gdGhpcy52ZXJ0ZXhBcnJheVtpXTsKKwkJdGhpcy5jZWxsTG9jYXRpb25baV0gPSBbXTsKKwkJCisJCS8vIFNldCB1cCB0aGUgbWFwcGluZyBmcm9tIGFycmF5IGluZGljZXMgdG8gY2VsbHMKKwkJdmFyIGlkID0gbXhPYmplY3RJZGVudGl0eS5nZXQodmVydGV4KTsKKwkJdGhpcy5pbmRpY2VzW2lkXSA9IGk7CisJCXZhciBib3VuZHMgPSB0aGlzLmdldFZlcnRleEJvdW5kcyh2ZXJ0ZXgpOworCisJCS8vIFNldCB0aGUgWCxZIHZhbHVlIG9mIHRoZSBpbnRlcm5hbCB2ZXJzaW9uIG9mIHRoZSBjZWxsIHRvCisJCS8vIHRoZSBjZW50ZXIgcG9pbnQgb2YgdGhlIHZlcnRleCBmb3IgYmV0dGVyIHBvc2l0aW9uaW5nCisJCXZhciB3aWR0aCA9IGJvdW5kcy53aWR0aDsKKwkJdmFyIGhlaWdodCA9IGJvdW5kcy5oZWlnaHQ7CisJCQorCQkvLyBSYW5kb21pemUgKDAsIDApIGxvY2F0aW9ucworCQl2YXIgeCA9IGJvdW5kcy54OworCQl2YXIgeSA9IGJvdW5kcy55OworCQkKKwkJdGhpcy5jZWxsTG9jYXRpb25baV1bMF0gPSB4ICsgd2lkdGggLyAyLjA7CisJCXRoaXMuY2VsbExvY2F0aW9uW2ldWzFdID0geSArIGhlaWdodCAvIDIuMDsKKwkJdGhpcy5yYWRpdXNbaV0gPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KTsKKwkJdGhpcy5yYWRpdXNTcXVhcmVkW2ldID0gdGhpcy5yYWRpdXNbaV0gKiB0aGlzLnJhZGl1c1tpXTsKKwl9CisKKwkvLyBNb3ZlcyBjZWxsIGxvY2F0aW9uIGJhY2sgdG8gdG9wLWxlZnQgZnJvbSBjZW50ZXIgbG9jYXRpb25zIHVzZWQgaW4KKwkvLyBhbGdvcml0aG0sIHJlc2V0dGluZyB0aGUgZWRnZSBwb2ludHMgaXMgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24KKwltb2RlbC5iZWdpblVwZGF0ZSgpOworCXRyeQorCXsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspCisJCXsKKwkJCXRoaXMuZGlzcFhbaV0gPSAwOworCQkJdGhpcy5kaXNwWVtpXSA9IDA7CisJCQl0aGlzLmlzTW92ZWFibGVbaV0gPSB0aGlzLmlzVmVydGV4TW92YWJsZSh0aGlzLnZlcnRleEFycmF5W2ldKTsKKworCQkJLy8gR2V0IGxpc3RzIG9mIG5laWdoYm91cnMgdG8gYWxsIHZlcnRpY2VzLCB0cmFuc2xhdGUgdGhlIGNlbGxzCisJCQkvLyBvYnRhaW5lZCBpbiBpbmRpY2VzIGludG8gdmVydGV4QXJyYXkgYW5kIHN0b3JlIGFzIGFuIGFycmF5CisJCQkvLyBhZ2FpbnN0IHRoZSBvcmdpbmlhbCBjZWxsIGluZGV4CisJCQl2YXIgZWRnZXMgPSB0aGlzLmdyYXBoLmdldENvbm5lY3Rpb25zKHRoaXMudmVydGV4QXJyYXlbaV0sIHBhcmVudCk7CisJCQl2YXIgY2VsbHMgPSB0aGlzLmdyYXBoLmdldE9wcG9zaXRlcyhlZGdlcywgdGhpcy52ZXJ0ZXhBcnJheVtpXSk7CisJCQl0aGlzLm5laWdoYm91cnNbaV0gPSBbXTsKKworCQkJZm9yICh2YXIgaiA9IDA7IGogPCBjZWxscy5sZW5ndGg7IGorKykKKwkJCXsKKwkJCQkvLyBSZXNldHMgdGhlIHBvaW50cyBvbiB0aGUgdHJhdmVyc2VkIGVkZ2UKKwkJCQlpZiAodGhpcy5yZXNldEVkZ2VzKQorCQkJCXsKKwkJCQkJdGhpcy5ncmFwaC5yZXNldEVkZ2UoZWRnZXNbal0pOworCQkJCX0KKworCQkJICAgIGlmICh0aGlzLmRpc2FibGVFZGdlU3R5bGUpCisJCQkgICAgeworCQkJICAgIAl0aGlzLnNldEVkZ2VTdHlsZUVuYWJsZWQoZWRnZXNbal0sIGZhbHNlKTsKKwkJCSAgICB9CisKKwkJCQkvLyBMb29rcyB0aGUgY2VsbCB1cCBpbiB0aGUgaW5kaWNlcyBkaWN0aW9uYXJ5CisJCQkJdmFyIGlkID0gbXhPYmplY3RJZGVudGl0eS5nZXQoY2VsbHNbal0pOworCQkJCXZhciBpbmRleCA9IHRoaXMuaW5kaWNlc1tpZF07CisKKwkJCQkvLyBDaGVjayB0aGUgY29ubmVjdGVkIGNlbGwgaW4gcGFydCBvZiB0aGUgdmVydGV4IGxpc3QgdG8gYmUKKwkJCQkvLyBhY3RlZCBvbiBieSB0aGlzIGxheW91dAorCQkJCWlmIChpbmRleCAhPSBudWxsKQorCQkJCXsKKwkJCQkJdGhpcy5uZWlnaGJvdXJzW2ldW2pdID0gaW5kZXg7CisJCQkJfQorCisJCQkJLy8gRWxzZSBpZiBpbmRleCBvZiB0aGUgb3RoZXIgY2VsbCBkb2Vzbid0IGNvcnJlc3BvbmQgdG8KKwkJCQkvLyBhbnkgY2VsbCBsaXN0ZWQgdG8gYmUgYWN0ZWQgdXBvbiBpbiB0aGlzIGxheW91dC4gU2V0CisJCQkJLy8gdGhlIGluZGV4IHRvIHRoZSB2YWx1ZSBvZiB0aGlzIHZlcnRleCAoYSBkdW1teSBzZWxmLWxvb3ApCisJCQkJLy8gc28gdGhlIGF0dHJhY3Rpb24gZm9yY2Ugb2YgdGhlIGVkZ2UgaXMgbm90IGNhbGN1bGF0ZWQKKwkJCQllbHNlCisJCQkJeworCQkJCQl0aGlzLm5laWdoYm91cnNbaV1bal0gPSBpOworCQkJCX0KKwkJCX0KKwkJfQorCQl0aGlzLnRlbXBlcmF0dXJlID0gdGhpcy5pbml0aWFsVGVtcDsKKworCQkvLyBJZiBtYXggbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaGFzIG5vdCBiZWVuIHNldCwgZ3Vlc3MgaXQKKwkJaWYgKHRoaXMubWF4SXRlcmF0aW9ucyA9PSAwKQorCQl7CisJCQl0aGlzLm1heEl0ZXJhdGlvbnMgPSAyMCAqIE1hdGguc3FydChuKTsKKwkJfQorCQkKKwkJLy8gTWFpbiBpdGVyYXRpb24gbG9vcAorCQlmb3IgKHRoaXMuaXRlcmF0aW9uID0gMDsgdGhpcy5pdGVyYXRpb24gPCB0aGlzLm1heEl0ZXJhdGlvbnM7IHRoaXMuaXRlcmF0aW9uKyspCisJCXsKKwkJCWlmICghdGhpcy5hbGxvd2VkVG9SdW4pCisJCQl7CisJCQkJcmV0dXJuOworCQkJfQorCQkJCisJCQkvLyBDYWxjdWxhdGUgcmVwdWxzaXZlIGZvcmNlcyBvbiBhbGwgdmVydGljZXMKKwkJCXRoaXMuY2FsY1JlcHVsc2lvbigpOworCisJCQkvLyBDYWxjdWxhdGUgYXR0cmFjdGl2ZSBmb3JjZXMgdGhyb3VnaCBlZGdlcworCQkJdGhpcy5jYWxjQXR0cmFjdGlvbigpOworCisJCQl0aGlzLmNhbGNQb3NpdGlvbnMoKTsKKwkJCXRoaXMucmVkdWNlVGVtcGVyYXR1cmUoKTsKKwkJfQorCisJCXZhciBtaW54ID0gbnVsbDsKKwkJdmFyIG1pbnkgPSBudWxsOworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnZlcnRleEFycmF5Lmxlbmd0aDsgaSsrKQorCQl7CisJCQl2YXIgdmVydGV4ID0gdGhpcy52ZXJ0ZXhBcnJheVtpXTsKKwkJCQorCQkJaWYgKHRoaXMuaXNWZXJ0ZXhNb3ZhYmxlKHZlcnRleCkpCisJCQl7CisJCQkJdmFyIGJvdW5kcyA9IHRoaXMuZ2V0VmVydGV4Qm91bmRzKHZlcnRleCk7CisJCQkJCisJCQkJaWYgKGJvdW5kcyAhPSBudWxsKQorCQkJCXsKKwkJCQkJdGhpcy5jZWxsTG9jYXRpb25baV1bMF0gLT0gYm91bmRzLndpZHRoIC8gMi4wOworCQkJCQl0aGlzLmNlbGxMb2NhdGlvbltpXVsxXSAtPSBib3VuZHMuaGVpZ2h0IC8gMi4wOworCQkJCQkKKwkJCQkJdmFyIHggPSB0aGlzLmdyYXBoLnNuYXAodGhpcy5jZWxsTG9jYXRpb25baV1bMF0pOworCQkJCQl2YXIgeSA9IHRoaXMuZ3JhcGguc25hcCh0aGlzLmNlbGxMb2NhdGlvbltpXVsxXSk7CisJCQkJCQorCQkJCQl0aGlzLnNldFZlcnRleExvY2F0aW9uKHZlcnRleCwgeCwgeSk7CisJCQkJCQorCQkJCQlpZiAobWlueCA9PSBudWxsKQorCQkJCQl7CisJCQkJCQltaW54ID0geDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCW1pbnggPSBNYXRoLm1pbihtaW54LCB4KTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKG1pbnkgPT0gbnVsbCkKKwkJCQkJeworCQkJCQkJbWlueSA9IHk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQltaW55ID0gTWF0aC5taW4obWlueSwgeSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCS8vIE1vZGlmaWVzIHRoZSBjbG9uZWQgZ2VvbWV0cmllcyBpbi1wbGFjZS4gTm90IG5lZWRlZAorCQkvLyB0byBjbG9uZSB0aGUgZ2VvbWV0cmllcyBhZ2FpbiBhcyB3ZSdyZSBpbiB0aGUgc2FtZQorCQkvLyB1bmRvYWJsZSBjaGFuZ2UuCisJCXZhciBkeCA9IC0obWlueCB8fCAwKSArIDE7CisJCXZhciBkeSA9IC0obWlueSB8fCAwKSArIDE7CisJCQorCQlpZiAoaW5pdGlhbEJvdW5kcyAhPSBudWxsKQorCQl7CisJCQlkeCArPSBpbml0aWFsQm91bmRzLng7CisJCQlkeSArPSBpbml0aWFsQm91bmRzLnk7CisJCX0KKwkJCisJCXRoaXMuZ3JhcGgubW92ZUNlbGxzKHRoaXMudmVydGV4QXJyYXksIGR4LCBkeSk7CisJfQorCWZpbmFsbHkKKwl7CisJCW1vZGVsLmVuZFVwZGF0ZSgpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGNhbGNQb3NpdGlvbnMKKyAqIAorICogVGFrZXMgdGhlIGRpc3BsYWNlbWVudHMgY2FsY3VsYXRlZCBmb3IgZWFjaCBjZWxsIGFuZCBhcHBsaWVzIHRoZW0gdG8gdGhlCisgKiBsb2NhbCBjYWNoZSBvZiBjZWxsIHBvc2l0aW9ucy4gTGltaXRzIHRoZSBkaXNwbGFjZW1lbnQgdG8gdGhlIGN1cnJlbnQKKyAqIHRlbXBlcmF0dXJlLgorICovCitteEZhc3RPcmdhbmljTGF5b3V0LnByb3RvdHlwZS5jYWxjUG9zaXRpb25zID0gZnVuY3Rpb24oKQoreworCWZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnZlcnRleEFycmF5Lmxlbmd0aDsgaW5kZXgrKykKKwl7CisJCWlmICh0aGlzLmlzTW92ZWFibGVbaW5kZXhdKQorCQl7CisJCQkvLyBHZXQgdGhlIGRpc3RhbmNlIG9mIGRpc3BsYWNlbWVudCBmb3IgdGhpcyBub2RlIGZvciB0aGlzCisJCQkvLyBpdGVyYXRpb24KKwkJCXZhciBkZWx0YUxlbmd0aCA9IE1hdGguc3FydCh0aGlzLmRpc3BYW2luZGV4XSAqIHRoaXMuZGlzcFhbaW5kZXhdICsKKwkJCQl0aGlzLmRpc3BZW2luZGV4XSAqIHRoaXMuZGlzcFlbaW5kZXhdKTsKKworCQkJaWYgKGRlbHRhTGVuZ3RoIDwgMC4wMDEpCisJCQl7CisJCQkJZGVsdGFMZW5ndGggPSAwLjAwMTsKKwkJCX0KKworCQkJLy8gU2NhbGUgZG93biBieSB0aGUgY3VycmVudCB0ZW1wZXJhdHVyZSBpZiBsZXNzIHRoYW4gdGhlCisJCQkvLyBkaXNwbGFjZW1lbnQgZGlzdGFuY2UKKwkJCXZhciBuZXdYRGlzcCA9IHRoaXMuZGlzcFhbaW5kZXhdIC8gZGVsdGFMZW5ndGgKKwkJCQkqIE1hdGgubWluKGRlbHRhTGVuZ3RoLCB0aGlzLnRlbXBlcmF0dXJlKTsKKworCQkJdmFyIG5ld1lEaXNwID0gdGhpcy5kaXNwWVtpbmRleF0gLyBkZWx0YUxlbmd0aAorCQkJCSogTWF0aC5taW4oZGVsdGFMZW5ndGgsIHRoaXMudGVtcGVyYXR1cmUpOworCisJCQkvLyByZXNldCBkaXNwbGFjZW1lbnRzCisJCQl0aGlzLmRpc3BYW2luZGV4XSA9IDA7CisJCQl0aGlzLmRpc3BZW2luZGV4XSA9IDA7CisKKwkJCS8vIFVwZGF0ZSB0aGUgY2FjaGVkIGNlbGwgbG9jYXRpb25zCisJCQl0aGlzLmNlbGxMb2NhdGlvbltpbmRleF1bMF0gKz0gbmV3WERpc3A7CisJCQl0aGlzLmNlbGxMb2NhdGlvbltpbmRleF1bMV0gKz0gbmV3WURpc3A7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjYWxjQXR0cmFjdGlvbgorICogCisgKiBDYWxjdWxhdGVzIHRoZSBhdHRyYWN0aXZlIGZvcmNlcyBiZXR3ZWVuIGFsbCBsYWlkIG91dCBub2RlcyBsaW5rZWQgYnkKKyAqIGVkZ2VzCisgKi8KK214RmFzdE9yZ2FuaWNMYXlvdXQucHJvdG90eXBlLmNhbGNBdHRyYWN0aW9uID0gZnVuY3Rpb24oKQoreworCS8vIENoZWNrIHRoZSBuZWlnaGJvdXJzIG9mIGVhY2ggdmVydGV4IGFuZCBjYWxjdWxhdGUgdGhlIGF0dHJhY3RpdmUKKwkvLyBmb3JjZSBvZiB0aGUgZWRnZSBjb25uZWN0aW5nIHRoZW0KKwlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudmVydGV4QXJyYXkubGVuZ3RoOyBpKyspCisJeworCQlmb3IgKHZhciBrID0gMDsgayA8IHRoaXMubmVpZ2hib3Vyc1tpXS5sZW5ndGg7IGsrKykKKwkJeworCQkJLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgb3RoZSBjZWxsIGluIHRoZSB2ZXJ0ZXggYXJyYXkKKwkJCXZhciBqID0gdGhpcy5uZWlnaGJvdXJzW2ldW2tdOworCQkJCisJCQkvLyBEbyBub3QgcHJvY2VlZCBzZWxmLWxvb3BzCisJCQlpZiAoaSAhPSBqICYmCisJCQkJdGhpcy5pc01vdmVhYmxlW2ldICYmCisJCQkJdGhpcy5pc01vdmVhYmxlW2pdKQorCQkJeworCQkJCXZhciB4RGVsdGEgPSB0aGlzLmNlbGxMb2NhdGlvbltpXVswXSAtIHRoaXMuY2VsbExvY2F0aW9uW2pdWzBdOworCQkJCXZhciB5RGVsdGEgPSB0aGlzLmNlbGxMb2NhdGlvbltpXVsxXSAtIHRoaXMuY2VsbExvY2F0aW9uW2pdWzFdOworCisJCQkJLy8gVGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIG5vZGVzCisJCQkJdmFyIGRlbHRhTGVuZ3RoU3F1YXJlZCA9IHhEZWx0YSAqIHhEZWx0YSArIHlEZWx0YQorCQkJCQkJKiB5RGVsdGEgLSB0aGlzLnJhZGl1c1NxdWFyZWRbaV0gLSB0aGlzLnJhZGl1c1NxdWFyZWRbal07CisKKwkJCQlpZiAoZGVsdGFMZW5ndGhTcXVhcmVkIDwgdGhpcy5taW5EaXN0YW5jZUxpbWl0U3F1YXJlZCkKKwkJCQl7CisJCQkJCWRlbHRhTGVuZ3RoU3F1YXJlZCA9IHRoaXMubWluRGlzdGFuY2VMaW1pdFNxdWFyZWQ7CisJCQkJfQorCQkJCQorCQkJCXZhciBkZWx0YUxlbmd0aCA9IE1hdGguc3FydChkZWx0YUxlbmd0aFNxdWFyZWQpOworCQkJCXZhciBmb3JjZSA9IChkZWx0YUxlbmd0aFNxdWFyZWQpIC8gdGhpcy5mb3JjZUNvbnN0YW50OworCisJCQkJdmFyIGRpc3BsYWNlbWVudFggPSAoeERlbHRhIC8gZGVsdGFMZW5ndGgpICogZm9yY2U7CisJCQkJdmFyIGRpc3BsYWNlbWVudFkgPSAoeURlbHRhIC8gZGVsdGFMZW5ndGgpICogZm9yY2U7CisJCQkJCisJCQkJdGhpcy5kaXNwWFtpXSAtPSBkaXNwbGFjZW1lbnRYOworCQkJCXRoaXMuZGlzcFlbaV0gLT0gZGlzcGxhY2VtZW50WTsKKwkJCQkKKwkJCQl0aGlzLmRpc3BYW2pdICs9IGRpc3BsYWNlbWVudFg7CisJCQkJdGhpcy5kaXNwWVtqXSArPSBkaXNwbGFjZW1lbnRZOworCQkJfQorCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY2FsY1JlcHVsc2lvbgorICogCisgKiBDYWxjdWxhdGVzIHRoZSByZXB1bHNpdmUgZm9yY2VzIGJldHdlZW4gYWxsIGxhaWQgb3V0IG5vZGVzCisgKi8KK214RmFzdE9yZ2FuaWNMYXlvdXQucHJvdG90eXBlLmNhbGNSZXB1bHNpb24gPSBmdW5jdGlvbigpCit7CisJdmFyIHZlcnRleENvdW50ID0gdGhpcy52ZXJ0ZXhBcnJheS5sZW5ndGg7CisKKwlmb3IgKHZhciBpID0gMDsgaSA8IHZlcnRleENvdW50OyBpKyspCisJeworCQlmb3IgKHZhciBqID0gaTsgaiA8IHZlcnRleENvdW50OyBqKyspCisJCXsKKwkJCS8vIEV4aXRzIGlmIHRoZSBsYXlvdXQgaXMgbm8gbG9uZ2VyIGFsbG93ZWQgdG8gcnVuCisJCQlpZiAoIXRoaXMuYWxsb3dlZFRvUnVuKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKGogIT0gaSAmJgorCQkJCXRoaXMuaXNNb3ZlYWJsZVtpXSAmJgorCQkJCXRoaXMuaXNNb3ZlYWJsZVtqXSkKKwkJCXsKKwkJCQl2YXIgeERlbHRhID0gdGhpcy5jZWxsTG9jYXRpb25baV1bMF0gLSB0aGlzLmNlbGxMb2NhdGlvbltqXVswXTsKKwkJCQl2YXIgeURlbHRhID0gdGhpcy5jZWxsTG9jYXRpb25baV1bMV0gLSB0aGlzLmNlbGxMb2NhdGlvbltqXVsxXTsKKworCQkJCWlmICh4RGVsdGEgPT0gMCkKKwkJCQl7CisJCQkJCXhEZWx0YSA9IDAuMDEgKyBNYXRoLnJhbmRvbSgpOworCQkJCX0KKwkJCQkKKwkJCQlpZiAoeURlbHRhID09IDApCisJCQkJeworCQkJCQl5RGVsdGEgPSAwLjAxICsgTWF0aC5yYW5kb20oKTsKKwkJCQl9CisJCQkJCisJCQkJLy8gRGlzdGFuY2UgYmV0d2VlbiBub2RlcworCQkJCXZhciBkZWx0YUxlbmd0aCA9IE1hdGguc3FydCgoeERlbHRhICogeERlbHRhKQorCQkJCQkJKyAoeURlbHRhICogeURlbHRhKSk7CisJCQkJdmFyIGRlbHRhTGVuZ3RoV2l0aFJhZGl1cyA9IGRlbHRhTGVuZ3RoIC0gdGhpcy5yYWRpdXNbaV0KKwkJCQkJCS0gdGhpcy5yYWRpdXNbal07CisKKwkJCQlpZiAoZGVsdGFMZW5ndGhXaXRoUmFkaXVzID4gdGhpcy5tYXhEaXN0YW5jZUxpbWl0KQorCQkJCXsKKwkJCQkJLy8gSWdub3JlIHZlcnRpY2VzIHRvbyBmYXIgYXBhcnQKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYgKGRlbHRhTGVuZ3RoV2l0aFJhZGl1cyA8IHRoaXMubWluRGlzdGFuY2VMaW1pdCkKKwkJCQl7CisJCQkJCWRlbHRhTGVuZ3RoV2l0aFJhZGl1cyA9IHRoaXMubWluRGlzdGFuY2VMaW1pdDsKKwkJCQl9CisKKwkJCQl2YXIgZm9yY2UgPSB0aGlzLmZvcmNlQ29uc3RhbnRTcXVhcmVkIC8gZGVsdGFMZW5ndGhXaXRoUmFkaXVzOworCisJCQkJdmFyIGRpc3BsYWNlbWVudFggPSAoeERlbHRhIC8gZGVsdGFMZW5ndGgpICogZm9yY2U7CisJCQkJdmFyIGRpc3BsYWNlbWVudFkgPSAoeURlbHRhIC8gZGVsdGFMZW5ndGgpICogZm9yY2U7CisJCQkJCisJCQkJdGhpcy5kaXNwWFtpXSArPSBkaXNwbGFjZW1lbnRYOworCQkJCXRoaXMuZGlzcFlbaV0gKz0gZGlzcGxhY2VtZW50WTsKKworCQkJCXRoaXMuZGlzcFhbal0gLT0gZGlzcGxhY2VtZW50WDsKKwkJCQl0aGlzLmRpc3BZW2pdIC09IGRpc3BsYWNlbWVudFk7CisJCQl9CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWR1Y2VUZW1wZXJhdHVyZQorICogCisgKiBSZWR1Y2VzIHRoZSB0ZW1wZXJhdHVyZSBvZiB0aGUgbGF5b3V0IGZyb20gYW4gaW5pdGlhbCBzZXR0aW5nIGluIGEgbGluZWFyCisgKiBmYXNoaW9uIHRvIHplcm8uCisgKi8KK214RmFzdE9yZ2FuaWNMYXlvdXQucHJvdG90eXBlLnJlZHVjZVRlbXBlcmF0dXJlID0gZnVuY3Rpb24oKQoreworCXRoaXMudGVtcGVyYXR1cmUgPSB0aGlzLmluaXRpYWxUZW1wICogKDEuMCAtIHRoaXMuaXRlcmF0aW9uIC8gdGhpcy5tYXhJdGVyYXRpb25zKTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L214R3JhcGhMYXlvdXQuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L214R3JhcGhMYXlvdXQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E1OWEzZQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvbXhHcmFwaExheW91dC5qcwpAQCAtMCwwICsxLDQ2MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhHcmFwaExheW91dAorICogCisgKiBCYXNlIGNsYXNzIGZvciBhbGwgbGF5b3V0IGFsZ29yaXRobXMgaW4gbXhHcmFwaC4gTWFpbiBwdWJsaWMgZnVuY3Rpb25zIGFyZQorICogPG1vdmU+IGZvciBoYW5kbGluZyBhIG1vdmVkIGNlbGwgd2l0aGluIGEgbGF5b3V0ZWQgcGFyZW50LCBhbmQgPGV4ZWN1dGU+IGZvcgorICogcnVubmluZyB0aGUgbGF5b3V0IG9uIGEgZ2l2ZW4gcGFyZW50IGNlbGwuCisgKgorICogS25vd24gU3ViY2xhc3NlczoKKyAqCisgKiA8bXhDaXJjbGVMYXlvdXQ+LCA8bXhDb21wYWN0VHJlZUxheW91dD4sIDxteENvbXBvc2l0ZUxheW91dD4sCisgKiA8bXhGYXN0T3JnYW5pY0xheW91dD4sIDxteFBhcmFsbGVsRWRnZUxheW91dD4sIDxteFBhcnRpdGlvbkxheW91dD4sCisgKiA8bXhTdGFja0xheW91dD4KKyAqIAorICogQ29uc3RydWN0b3I6IG14R3JhcGhMYXlvdXQKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGxheW91dCB1c2luZyB0aGUgZ2l2ZW4gbGF5b3V0cy4KKyAqCisgKiBBcmd1bWVudHM6CisgKiAKKyAqIGdyYXBoIC0gRW5jbG9zaW5nIAorICovCitmdW5jdGlvbiBteEdyYXBoTGF5b3V0KGdyYXBoKQoreworCXRoaXMuZ3JhcGggPSBncmFwaDsKK307CisKKy8qKgorICogVmFyaWFibGU6IGdyYXBoCisgKiAKKyAqIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEdyYXBoPi4KKyAqLworbXhHcmFwaExheW91dC5wcm90b3R5cGUuZ3JhcGggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB1c2VCb3VuZGluZ0JveAorICoKKyAqIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBsYWJlbCBzaG91bGQgYmUgdXNlZCBpZgorICogaXRzIGF2YWlsYWJsZS4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoTGF5b3V0LnByb3RvdHlwZS51c2VCb3VuZGluZ0JveCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHBhcmVudAorICoKKyAqIFRoZSBwYXJlbnQgY2VsbCBvZiB0aGUgbGF5b3V0LCBpZiBhbnkKKyAqLworbXhHcmFwaExheW91dC5wcm90b3R5cGUucGFyZW50ID0gbnVsbDsKKworLyoqCisgKiBGdW5jdGlvbjogbW92ZUNlbGwKKyAqIAorICogTm90aWZpZWQgd2hlbiBhIGNlbGwgaXMgYmVpbmcgbW92ZWQgaW4gYSBwYXJlbnQgdGhhdCBoYXMgYXV0b21hdGljCisgKiBsYXlvdXQgdG8gdXBkYXRlIHRoZSBjZWxsIHN0YXRlIChlZy4gaW5kZXgpIHNvIHRoYXQgdGhlIG91dGNvbWUgb2YgdGhlCisgKiBsYXlvdXQgd2lsbCBwb3NpdGlvbiB0aGUgdmVydGV4IGFzIGNsb3NlIHRvIHRoZSBwb2ludCAoeCwgeSkgYXMKKyAqIHBvc3NpYmxlLgorICogCisgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdoaWNoIGhhcyBiZWVuIG1vdmVkLgorICogeCAtIFgtY29vcmRpbmF0ZSBvZiB0aGUgbmV3IGNlbGwgbG9jYXRpb24uCisgKiB5IC0gWS1jb29yZGluYXRlIG9mIHRoZSBuZXcgY2VsbCBsb2NhdGlvbi4KKyAqLworbXhHcmFwaExheW91dC5wcm90b3R5cGUubW92ZUNlbGwgPSBmdW5jdGlvbihjZWxsLCB4LCB5KSB7IH07CisKKy8qKgorICogRnVuY3Rpb246IGV4ZWN1dGUKKyAqIAorICogRXhlY3V0ZXMgdGhlIGxheW91dCBhbGdvcml0aG0gZm9yIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gcGFyZW50LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwYXJlbnQgLSA8bXhDZWxsPiB3aG9zZSBjaGlsZHJlbiBzaG91bGQgYmUgbGF5ZWQgb3V0LgorICovCitteEdyYXBoTGF5b3V0LnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24ocGFyZW50KSB7IH07CisKKy8qKgorICogRnVuY3Rpb246IGdldEdyYXBoCisgKiAKKyAqIFJldHVybnMgdGhlIGdyYXBoIHRoYXQgdGhpcyBsYXlvdXQgb3BlcmF0ZXMgb24uCisgKi8KK214R3JhcGhMYXlvdXQucHJvdG90eXBlLmdldEdyYXBoID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmdyYXBoOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q29uc3RyYWludAorICogCisgKiBSZXR1cm5zIHRoZSBjb25zdHJhaW50IGZvciB0aGUgZ2l2ZW4ga2V5IGFuZCBjZWxsLiBUaGUgb3B0aW9uYWwgZWRnZSBhbmQKKyAqIHNvdXJjZSBhcmd1bWVudHMgYXJlIHVzZWQgdG8gcmV0dXJuIGluYm91bmQgYW5kIG91dGdvaW5nIHJvdXRpbmctCisgKiBjb25zdHJhaW50cyBmb3IgdGhlIGdpdmVuIGVkZ2UgYW5kIHZlcnRleC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMKKyAqIHJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBzdHlsZSBvZiB0aGUgZ2l2ZW4gY2VsbC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICoga2V5IC0gS2V5IG9mIHRoZSBjb25zdHJhaW50IHRvIGJlIHJldHVybmVkLgorICogY2VsbCAtIDxteENlbGw+IHdob3NlIGNvbnN0cmFpbnQgc2hvdWxkIGJlIHJldHVybmVkLgorICogZWRnZSAtIE9wdGlvbmFsIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgY29ubmVjdGlvbiB3aG9zZSBjb25zdHJhaW50CisgKiBzaG91bGQgYmUgcmV0dXJuZWQuIERlZmF1bHQgaXMgbnVsbC4KKyAqIHNvdXJjZSAtIE9wdGlvbmFsIGJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW5jb21pbmcKKyAqIG9yIG91dGdvaW5nLiBEZWZhdWx0IGlzIG51bGwuCisgKi8KK214R3JhcGhMYXlvdXQucHJvdG90eXBlLmdldENvbnN0cmFpbnQgPSBmdW5jdGlvbihrZXksIGNlbGwsIGVkZ2UsIHNvdXJjZSkKK3sKKwl2YXIgc3RhdGUgPSB0aGlzLmdyYXBoLnZpZXcuZ2V0U3RhdGUoY2VsbCk7CisJdmFyIHN0eWxlID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuc3R5bGUgOiB0aGlzLmdyYXBoLmdldENlbGxTdHlsZShjZWxsKTsKKwkKKwlyZXR1cm4gKHN0eWxlICE9IG51bGwpID8gc3R5bGVba2V5XSA6IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB0cmF2ZXJzZQorICogCisgKiBUcmF2ZXJzZXMgdGhlIChkaXJlY3RlZCkgZ3JhcGggaW52b2tpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBlYWNoCisgKiB2aXNpdGVkIHZlcnRleCBhbmQgZWRnZS4gVGhlIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCB0aGUgY3VycmVudCB2ZXJ0ZXgKKyAqIGFuZCB0aGUgaW5jb21pbmcgZWRnZSBhcyBhIHBhcmFtZXRlci4gVGhpcyBpbXBsZW1lbnRhdGlvbiBtYWtlcyBzdXJlCisgKiBlYWNoIHZlcnRleCBpcyBvbmx5IHZpc2l0ZWQgb25jZS4gVGhlIGZ1bmN0aW9uIG1heSByZXR1cm4gZmFsc2UgaWYgdGhlCisgKiB0cmF2ZXJzYWwgc2hvdWxkIHN0b3AgYXQgdGhlIGdpdmVuIHZlcnRleC4KKyAqIAorICogRXhhbXBsZToKKyAqIAorICogKGNvZGUpCisgKiBteExvZy5zaG93KCk7CisgKiB2YXIgY2VsbCA9IGdyYXBoLmdldFNlbGVjdGlvbkNlbGwoKTsKKyAqIGdyYXBoLnRyYXZlcnNlKGNlbGwsIGZhbHNlLCBmdW5jdGlvbih2ZXJ0ZXgsIGVkZ2UpCisgKiB7CisgKiAgIG14TG9nLmRlYnVnKGdyYXBoLmdldExhYmVsKHZlcnRleCkpOworICogfSk7CisgKiAoZW5kKQorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2ZXJ0ZXggLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRleCB3aGVyZSB0aGUgdHJhdmVyc2FsIHN0YXJ0cy4KKyAqIGRpcmVjdGVkIC0gT3B0aW9uYWwgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGVkZ2VzIHNob3VsZCBvbmx5IGJlIHRyYXZlcnNlZAorICogZnJvbSBzb3VyY2UgdG8gdGFyZ2V0LiBEZWZhdWx0IGlzIHRydWUuCisgKiBmdW5jIC0gVmlzaXRvciBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBjdXJyZW50IHZlcnRleCBhbmQgdGhlIGluY29taW5nCisgKiBlZGdlIGFzIGFyZ3VtZW50cy4gVGhlIHRyYXZlcnNhbCBzdG9wcyBpZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZS4KKyAqIGVkZ2UgLSBPcHRpb25hbCA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIGluY29taW5nIGVkZ2UuIFRoaXMgaXMKKyAqIG51bGwgZm9yIHRoZSBmaXJzdCBzdGVwIG9mIHRoZSB0cmF2ZXJzYWwuCisgKiB2aXNpdGVkIC0gT3B0aW9uYWwgPG14RGljdGlvbmFyeT4gb2YgY2VsbCBwYXRocyBmb3IgdGhlIHZpc2l0ZWQgY2VsbHMuCisgKi8KK214R3JhcGhMYXlvdXQudHJhdmVyc2UgPSBmdW5jdGlvbih2ZXJ0ZXgsIGRpcmVjdGVkLCBmdW5jLCBlZGdlLCB2aXNpdGVkKQoreworCWlmIChmdW5jICE9IG51bGwgJiYgdmVydGV4ICE9IG51bGwpCisJeworCQlkaXJlY3RlZCA9IChkaXJlY3RlZCAhPSBudWxsKSA/IGRpcmVjdGVkIDogdHJ1ZTsKKwkJdmlzaXRlZCA9IHZpc2l0ZWQgfHwgbmV3IG14RGljdGlvbmFyeSgpOworCQkKKwkJaWYgKCF2aXNpdGVkLmdldCh2ZXJ0ZXgpKQorCQl7CisJCQl2aXNpdGVkLnB1dCh2ZXJ0ZXgsIHRydWUpOworCQkJdmFyIHJlc3VsdCA9IGZ1bmModmVydGV4LCBlZGdlKTsKKwkJCQorCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdCkKKwkJCXsKKwkJCQl2YXIgZWRnZUNvdW50ID0gdGhpcy5ncmFwaC5tb2RlbC5nZXRFZGdlQ291bnQodmVydGV4KTsKKwkJCQkKKwkJCQlpZiAoZWRnZUNvdW50ID4gMCkKKwkJCQl7CisJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWRnZUNvdW50OyBpKyspCisJCQkJCXsKKwkJCQkJCXZhciBlID0gdGhpcy5ncmFwaC5tb2RlbC5nZXRFZGdlQXQodmVydGV4LCBpKTsKKwkJCQkJCXZhciBpc1NvdXJjZSA9IHRoaXMuZ3JhcGgubW9kZWwuZ2V0VGVybWluYWwoZSwgdHJ1ZSkgPT0gdmVydGV4OworCQkJCQkJCQkJCQkJCisJCQkJCQlpZiAoIWRpcmVjdGVkIHx8IGlzU291cmNlKQorCQkJCQkJeworCQkJCQkJCXZhciBuZXh0ID0gdGhpcy5ncmFwaC52aWV3LmdldFZpc2libGVUZXJtaW5hbChlLCAhaXNTb3VyY2UpOworCQkJCQkJCXRoaXMudHJhdmVyc2UobmV4dCwgZGlyZWN0ZWQsIGZ1bmMsIGUsIHZpc2l0ZWQpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNWZXJ0ZXhNb3ZhYmxlCisgKiAKKyAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGdpdmVuIDxteENlbGw+IGlzIG1vdmFibGUgb3IKKyAqIGJlbmRhYmxlIGJ5IHRoZSBhbGdvcml0aG0uIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbgorICogY2VsbCBpcyBtb3ZhYmxlIGluIHRoZSBncmFwaC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdob3NlIG1vdmFibGUgc3RhdGUgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoTGF5b3V0LnByb3RvdHlwZS5pc1ZlcnRleE1vdmFibGUgPSBmdW5jdGlvbihjZWxsKQoreworCXJldHVybiB0aGlzLmdyYXBoLmlzQ2VsbE1vdmFibGUoY2VsbCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1ZlcnRleElnbm9yZWQKKyAqIAorICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgZ2l2ZW4gPG14Q2VsbD4gc2hvdWxkIGJlIGlnbm9yZWQgYnkKKyAqIHRoZSBhbGdvcml0aG0uIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBmYWxzZSBmb3IgYWxsIHZlcnRpY2VzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2ZXJ0ZXggLSA8bXhDZWxsPiB3aG9zZSBpZ25vcmVkIHN0YXRlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaExheW91dC5wcm90b3R5cGUuaXNWZXJ0ZXhJZ25vcmVkID0gZnVuY3Rpb24odmVydGV4KQoreworCXJldHVybiAhdGhpcy5ncmFwaC5nZXRNb2RlbCgpLmlzVmVydGV4KHZlcnRleCkgfHwKKwkJIXRoaXMuZ3JhcGguaXNDZWxsVmlzaWJsZSh2ZXJ0ZXgpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFZGdlSWdub3JlZAorICogCisgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBnaXZlbiA8bXhDZWxsPiBzaG91bGQgYmUgaWdub3JlZCBieQorICogdGhlIGFsZ29yaXRobS4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGZhbHNlIGZvciBhbGwgdmVydGljZXMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBpZ25vcmVkIHN0YXRlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaExheW91dC5wcm90b3R5cGUuaXNFZGdlSWdub3JlZCA9IGZ1bmN0aW9uKGVkZ2UpCit7CisJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpOworCQorCXJldHVybiAhbW9kZWwuaXNFZGdlKGVkZ2UpIHx8CisJCSF0aGlzLmdyYXBoLmlzQ2VsbFZpc2libGUoZWRnZSkgfHwKKwkJbW9kZWwuZ2V0VGVybWluYWwoZWRnZSwgdHJ1ZSkgPT0gbnVsbCB8fAorCQltb2RlbC5nZXRUZXJtaW5hbChlZGdlLCBmYWxzZSkgPT0gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEVkZ2VTdHlsZUVuYWJsZWQKKyAqIAorICogRGlzYWJsZXMgb3IgZW5hYmxlcyB0aGUgZWRnZSBzdHlsZSBvZiB0aGUgZ2l2ZW4gZWRnZS4KKyAqLworbXhHcmFwaExheW91dC5wcm90b3R5cGUuc2V0RWRnZVN0eWxlRW5hYmxlZCA9IGZ1bmN0aW9uKGVkZ2UsIHZhbHVlKQoreworCXRoaXMuZ3JhcGguc2V0Q2VsbFN0eWxlcyhteENvbnN0YW50cy5TVFlMRV9OT0VER0VTVFlMRSwKKwkJCSh2YWx1ZSkgPyAnMCcgOiAnMScsIFtlZGdlXSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRPcnRob2dvbmFsRWRnZQorICogCisgKiBEaXNhYmxlcyBvciBlbmFibGVzIG9ydGhvZ29uYWwgZW5kIHNlZ21lbnRzIG9mIHRoZSBnaXZlbiBlZGdlLgorICovCitteEdyYXBoTGF5b3V0LnByb3RvdHlwZS5zZXRPcnRob2dvbmFsRWRnZSA9IGZ1bmN0aW9uKGVkZ2UsIHZhbHVlKQoreworCXRoaXMuZ3JhcGguc2V0Q2VsbFN0eWxlcyhteENvbnN0YW50cy5TVFlMRV9PUlRIT0dPTkFMLAorCQkJKHZhbHVlKSA/ICcxJyA6ICcwJywgW2VkZ2VdKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFBhcmVudE9mZnNldAorICogCisgKiBEZXRlcm1pbmVzIHRoZSBvZmZzZXQgb2YgdGhlIGdpdmVuIHBhcmVudCB0byB0aGUgcGFyZW50CisgKiBvZiB0aGUgbGF5b3V0CisgKi8KK214R3JhcGhMYXlvdXQucHJvdG90eXBlLmdldFBhcmVudE9mZnNldCA9IGZ1bmN0aW9uKHBhcmVudCkKK3sKKwl2YXIgcmVzdWx0ID0gbmV3IG14UG9pbnQoKTsKKworCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgIT0gdGhpcy5wYXJlbnQpCisJeworCQl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCk7CisKKwkJaWYgKG1vZGVsLmlzQW5jZXN0b3IodGhpcy5wYXJlbnQsIHBhcmVudCkpCisJCXsKKwkJCXZhciBwYXJlbnRHZW8gPSBtb2RlbC5nZXRHZW9tZXRyeShwYXJlbnQpOworCisJCQl3aGlsZSAocGFyZW50ICE9IHRoaXMucGFyZW50KQorCQkJeworCQkJCXJlc3VsdC54ID0gcmVzdWx0LnggKyBwYXJlbnRHZW8ueDsKKwkJCQlyZXN1bHQueSA9IHJlc3VsdC55ICsgcGFyZW50R2VvLnk7CisKKwkJCQlwYXJlbnQgPSBtb2RlbC5nZXRQYXJlbnQocGFyZW50KTs7CisJCQkJcGFyZW50R2VvID0gbW9kZWwuZ2V0R2VvbWV0cnkocGFyZW50KTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXN1bHQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRFZGdlUG9pbnRzCisgKiAKKyAqIFJlcGxhY2VzIHRoZSBhcnJheSBvZiBteFBvaW50cyBpbiB0aGUgZ2VvbWV0cnkgb2YgdGhlIGdpdmVuIGVkZ2UKKyAqIHdpdGggdGhlIGdpdmVuIGFycmF5IG9mIG14UG9pbnRzLgorICovCitteEdyYXBoTGF5b3V0LnByb3RvdHlwZS5zZXRFZGdlUG9pbnRzID0gZnVuY3Rpb24oZWRnZSwgcG9pbnRzKQoreworCWlmIChlZGdlICE9IG51bGwpCisJeworCQl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLm1vZGVsOworCQl2YXIgZ2VvbWV0cnkgPSBtb2RlbC5nZXRHZW9tZXRyeShlZGdlKTsKKworCQlpZiAoZ2VvbWV0cnkgPT0gbnVsbCkKKwkJeworCQkJZ2VvbWV0cnkgPSBuZXcgbXhHZW9tZXRyeSgpOworCQkJZ2VvbWV0cnkuc2V0UmVsYXRpdmUodHJ1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlnZW9tZXRyeSA9IGdlb21ldHJ5LmNsb25lKCk7CisJCX0KKworCQlpZiAodGhpcy5wYXJlbnQgIT0gbnVsbCAmJiBwb2ludHMgIT0gbnVsbCkKKwkJeworCQkJdmFyIHBhcmVudCA9IG1vZGVsLmdldFBhcmVudChlZGdlKTsKKworCQkJdmFyIHBhcmVudE9mZnNldCA9IHRoaXMuZ2V0UGFyZW50T2Zmc2V0KHBhcmVudCk7CisKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCXBvaW50c1tpXS54ID0gcG9pbnRzW2ldLnggLSBwYXJlbnRPZmZzZXQueDsKKwkJCQlwb2ludHNbaV0ueSA9IHBvaW50c1tpXS55IC0gcGFyZW50T2Zmc2V0Lnk7CisJCQl9CisJCX0KKworCQlnZW9tZXRyeS5wb2ludHMgPSBwb2ludHM7CisJCW1vZGVsLnNldEdlb21ldHJ5KGVkZ2UsIGdlb21ldHJ5KTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRWZXJ0ZXhMb2NhdGlvbgorICogCisgKiBTZXRzIHRoZSBuZXcgcG9zaXRpb24gb2YgdGhlIGdpdmVuIGNlbGwgdGFraW5nIGludG8gYWNjb3VudCB0aGUgc2l6ZSBvZgorICogdGhlIGJvdW5kaW5nIGJveCBpZiA8dXNlQm91bmRpbmdCb3g+IGlzIHRydWUuIFRoZSBjaGFuZ2UgaXMgb25seSBjYXJyaWVkCisgKiBvdXQgaWYgdGhlIG5ldyBsb2NhdGlvbiBpcyBub3QgZXF1YWwgdG8gdGhlIGV4aXN0aW5nIGxvY2F0aW9uLCBvdGhlcndpc2UKKyAqIHRoZSBnZW9tZXRyeSBpcyBub3QgcmVwbGFjZWQgd2l0aCBhbiB1cGRhdGVkIGluc3RhbmNlLiBUaGUgbmV3IG9yIG9sZAorICogYm91bmRzIGFyZSByZXR1cm5lZCAoaW5jbHVkaW5nIG92ZXJsYXBwaW5nIGxhYmVscykuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBnZW9tZXRyeSBpcyB0byBiZSBzZXQuCisgKiB4IC0gSW50ZWdlciB0aGF0IGRlZmluZXMgdGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgbmV3IGxvY2F0aW9uLgorICogeSAtIEludGVnZXIgdGhhdCBkZWZpbmVzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIG5ldyBsb2NhdGlvbi4KKyAqLworbXhHcmFwaExheW91dC5wcm90b3R5cGUuc2V0VmVydGV4TG9jYXRpb24gPSBmdW5jdGlvbihjZWxsLCB4LCB5KQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwl2YXIgZ2VvbWV0cnkgPSBtb2RlbC5nZXRHZW9tZXRyeShjZWxsKTsKKwl2YXIgcmVzdWx0ID0gbnVsbDsKKwkKKwlpZiAoZ2VvbWV0cnkgIT0gbnVsbCkKKwl7CisJCXJlc3VsdCA9IG5ldyBteFJlY3RhbmdsZSh4LCB5LCBnZW9tZXRyeS53aWR0aCwgZ2VvbWV0cnkuaGVpZ2h0KTsKKwkJCisJCS8vIENoZWNrcyBmb3Igb3ZlcnNpemUgbGFiZWxzIGFuZCBzaGlmdHMgdGhlIHJlc3VsdAorCQkvLyBUT0RPOiBVc2UgbXhVdGlscy5nZXRTdHJpbmdTaXplIGZvciBsYWJlbCBib3VuZHMKKwkJaWYgKHRoaXMudXNlQm91bmRpbmdCb3gpCisJCXsKKwkJCXZhciBzdGF0ZSA9IHRoaXMuZ3JhcGguZ2V0VmlldygpLmdldFN0YXRlKGNlbGwpOworCQkJCisJCQlpZiAoc3RhdGUgIT0gbnVsbCAmJiBzdGF0ZS50ZXh0ICE9IG51bGwgJiYgc3RhdGUudGV4dC5ib3VuZGluZ0JveCAhPSBudWxsKQorCQkJeworCQkJCXZhciBzY2FsZSA9IHRoaXMuZ3JhcGguZ2V0VmlldygpLnNjYWxlOworCQkJCXZhciBib3ggPSBzdGF0ZS50ZXh0LmJvdW5kaW5nQm94OworCQkJCQorCQkJCWlmIChzdGF0ZS50ZXh0LmJvdW5kaW5nQm94LnggPCBzdGF0ZS54KQorCQkJCXsKKwkJCQkJeCArPSAoc3RhdGUueCAtIGJveC54KSAvIHNjYWxlOworCQkJCQlyZXN1bHQud2lkdGggPSBib3gud2lkdGg7CisJCQkJfQorCQkJCQorCQkJCWlmIChzdGF0ZS50ZXh0LmJvdW5kaW5nQm94LnkgPCBzdGF0ZS55KQorCQkJCXsKKwkJCQkJeSArPSAoc3RhdGUueSAtIGJveC55KSAvIHNjYWxlOworCQkJCQlyZXN1bHQuaGVpZ2h0ID0gYm94LmhlaWdodDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAodGhpcy5wYXJlbnQgIT0gbnVsbCkKKwkJeworCQkJdmFyIHBhcmVudCA9IG1vZGVsLmdldFBhcmVudChjZWxsKTsKKworCQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudCAhPSB0aGlzLnBhcmVudCkKKwkJCXsKKwkJCQl2YXIgcGFyZW50T2Zmc2V0ID0gdGhpcy5nZXRQYXJlbnRPZmZzZXQocGFyZW50KTsKKworCQkJCXggPSB4IC0gcGFyZW50T2Zmc2V0Lng7CisJCQkJeSA9IHkgLSBwYXJlbnRPZmZzZXQueTsKKwkJCX0KKwkJfQorCisJCWlmIChnZW9tZXRyeS54ICE9IHggfHwgZ2VvbWV0cnkueSAhPSB5KQorCQl7CisJCQlnZW9tZXRyeSA9IGdlb21ldHJ5LmNsb25lKCk7CisJCQlnZW9tZXRyeS54ID0geDsKKwkJCWdlb21ldHJ5LnkgPSB5OworCQkJCisJCQltb2RlbC5zZXRHZW9tZXRyeShjZWxsLCBnZW9tZXRyeSk7CisJCX0KKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFZlcnRleEJvdW5kcworICogCisgKiBSZXR1cm5zIGFuIDxteFJlY3RhbmdsZT4gdGhhdCBkZWZpbmVzIHRoZSBib3VuZHMgb2YgdGhlIGdpdmVuIGNlbGwgb3IKKyAqIHRoZSBib3VuZGluZyBib3ggaWYgPHVzZUJvdW5kaW5nQm94PiBpcyB0cnVlLgorICovCitteEdyYXBoTGF5b3V0LnByb3RvdHlwZS5nZXRWZXJ0ZXhCb3VuZHMgPSBmdW5jdGlvbihjZWxsKQoreworCXZhciBnZW8gPSB0aGlzLmdyYXBoLmdldE1vZGVsKCkuZ2V0R2VvbWV0cnkoY2VsbCk7CisKKwkvLyBDaGVja3MgZm9yIG92ZXJzaXplIGxhYmVsIGJvdW5kaW5nIGJveCBhbmQgY29ycmVjdHMKKwkvLyB0aGUgcmV0dXJuIHZhbHVlIGFjY29yZGluZ2x5CisJLy8gVE9ETzogVXNlIG14VXRpbHMuZ2V0U3RyaW5nU2l6ZSBmb3IgbGFiZWwgYm91bmRzCisJaWYgKHRoaXMudXNlQm91bmRpbmdCb3gpCisJeworCQl2YXIgc3RhdGUgPSB0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXRTdGF0ZShjZWxsKTsKKworCQlpZiAoc3RhdGUgIT0gbnVsbCAmJiBzdGF0ZS50ZXh0ICE9IG51bGwgJiYgc3RhdGUudGV4dC5ib3VuZGluZ0JveCAhPSBudWxsKQorCQl7CisJCQl2YXIgc2NhbGUgPSB0aGlzLmdyYXBoLmdldFZpZXcoKS5zY2FsZTsKKwkJCXZhciB0bXAgPSBzdGF0ZS50ZXh0LmJvdW5kaW5nQm94OworCisJCQl2YXIgZHgwID0gTWF0aC5tYXgoc3RhdGUueCAtIHRtcC54LCAwKSAvIHNjYWxlOworCQkJdmFyIGR5MCA9IE1hdGgubWF4KHN0YXRlLnkgLSB0bXAueSwgMCkgLyBzY2FsZTsKKwkJCXZhciBkeDEgPSBNYXRoLm1heCgodG1wLnggKyB0bXAud2lkdGgpIC0gKHN0YXRlLnggKyBzdGF0ZS53aWR0aCksIDApIC8gc2NhbGU7CisgIAkJCXZhciBkeTEgPSBNYXRoLm1heCgodG1wLnkgKyB0bXAuaGVpZ2h0KSAtIChzdGF0ZS55ICsgc3RhdGUuaGVpZ2h0KSwgMCkgLyBzY2FsZTsKKworCQkJZ2VvID0gbmV3IG14UmVjdGFuZ2xlKGdlby54IC0gZHgwLCBnZW8ueSAtIGR5MCwgZ2VvLndpZHRoICsgZHgwICsgZHgxLCBnZW8uaGVpZ2h0ICsgZHkwICsgZHkxKTsKKwkJfQorCX0KKworCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKQorCXsKKwkJdmFyIHBhcmVudCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5nZXRQYXJlbnQoY2VsbCk7CisJCWdlbyA9IGdlby5jbG9uZSgpOworCisJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgIT0gdGhpcy5wYXJlbnQpCisJCXsKKwkJCXZhciBwYXJlbnRPZmZzZXQgPSB0aGlzLmdldFBhcmVudE9mZnNldChwYXJlbnQpOworCQkJZ2VvLnggPSBnZW8ueCArIHBhcmVudE9mZnNldC54OworCQkJZ2VvLnkgPSBnZW8ueSArIHBhcmVudE9mZnNldC55OworCQl9CisJfQorCisJcmV0dXJuIG5ldyBteFJlY3RhbmdsZShnZW8ueCwgZ2VvLnksIGdlby53aWR0aCwgZ2VvLmhlaWdodCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhcnJhbmdlR3JvdXBzCisgKiAKKyAqIFNob3J0Y3V0IHRvIDxteEdyYXBoLnVwZGF0ZUdyb3VwQm91bmRzPiB3aXRoIG1vdmVHcm91cCBzZXQgdG8gdHJ1ZS4KKyAqLworbXhHcmFwaExheW91dC5wcm90b3R5cGUuYXJyYW5nZUdyb3VwcyA9IGZ1bmN0aW9uKGNlbGxzLCBib3JkZXIsIHRvcEJvcmRlciwgcmlnaHRCb3JkZXIsIGJvdHRvbUJvcmRlciwgbGVmdEJvcmRlcikKK3sKKwlyZXR1cm4gdGhpcy5ncmFwaC51cGRhdGVHcm91cEJvdW5kcyhjZWxscywgYm9yZGVyLCB0cnVlLCB0b3BCb3JkZXIsIHJpZ2h0Qm9yZGVyLCBib3R0b21Cb3JkZXIsIGxlZnRCb3JkZXIpOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvbXhQYXJhbGxlbEVkZ2VMYXlvdXQuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L214UGFyYWxsZWxFZGdlTGF5b3V0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZDQzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L214UGFyYWxsZWxFZGdlTGF5b3V0LmpzCkBAIC0wLDAgKzEsMjI1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFBhcmFsbGVsRWRnZUxheW91dAorICogCisgKiBFeHRlbmRzIDxteEdyYXBoTGF5b3V0PiBmb3IgYXJyYW5naW5nIHBhcmFsbGVsIGVkZ2VzLiBUaGlzIGxheW91dCB3b3JrcworICogb24gZWRnZXMgZm9yIGFsbCBwYWlycyBvZiB2ZXJ0aWNlcyB3aGVyZSB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGVkZ2UKKyAqIGNvbm5lY3RpbmcgdGhlIGxhdHRlci4KKyAqIAorICogRXhhbXBsZToKKyAqIAorICogKGNvZGUpCisgKiB2YXIgbGF5b3V0ID0gbmV3IG14UGFyYWxsZWxFZGdlTGF5b3V0KGdyYXBoKTsKKyAqIGxheW91dC5leGVjdXRlKGdyYXBoLmdldERlZmF1bHRQYXJlbnQoKSk7CisgKiAoZW5kKQorICogCisgKiBUbyBydW4gdGhlIGxheW91dCBmb3IgdGhlIHBhcmFsbGVsIGVkZ2VzIG9mIGEgY2hhbmdlZCBlZGdlIG9ubHksIHRoZQorICogZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQuCisgKiAKKyAqIChjb2RlKQorICogdmFyIGxheW91dCA9IG5ldyBteFBhcmFsbGVsRWRnZUxheW91dChncmFwaCk7CisgKiAKKyAqIGdyYXBoLmFkZExpc3RlbmVyKG14RXZlbnQuQ0VMTF9DT05ORUNURUQsIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorICogeworICogICB2YXIgbW9kZWwgPSBncmFwaC5nZXRNb2RlbCgpOworICogICB2YXIgZWRnZSA9IGV2dC5nZXRQcm9wZXJ0eSgnZWRnZScpOworICogICB2YXIgc3JjID0gbW9kZWwuZ2V0VGVybWluYWwoZWRnZSwgdHJ1ZSk7CisgKiAgIHZhciB0cmcgPSBtb2RlbC5nZXRUZXJtaW5hbChlZGdlLCBmYWxzZSk7CisgKiAgIAorICogICBsYXlvdXQuaXNFZGdlSWdub3JlZCA9IGZ1bmN0aW9uKGVkZ2UyKQorICogICB7CisgKiAgICAgdmFyIHNyYzIgPSBtb2RlbC5nZXRUZXJtaW5hbChlZGdlMiwgdHJ1ZSk7CisgKiAgICAgdmFyIHRyZzIgPSBtb2RlbC5nZXRUZXJtaW5hbChlZGdlMiwgZmFsc2UpOworICogICAgIAorICogICAgIHJldHVybiAhKG1vZGVsLmlzRWRnZShlZGdlMikgJiYgKChzcmMgPT0gc3JjMiAmJiB0cmcgPT0gdHJnMikgfHwgKHNyYyA9PSB0cmcyICYmIHRyZyA9PSBzcmMyKSkpOworICogICB9OworICogICAKKyAqICAgbGF5b3V0LmV4ZWN1dGUoZ3JhcGguZ2V0RGVmYXVsdFBhcmVudCgpKTsKKyAqIH0pOworICogKGVuZCkKKyAqIAorICogQ29uc3RydWN0b3I6IG14Q29tcGFjdFRyZWVMYXlvdXQKKyAqIAorICogQ29uc3RydWN0cyBhIG5ldyBmYXN0IG9yZ2FuaWMgbGF5b3V0IGZvciB0aGUgc3BlY2lmaWVkIGdyYXBoLgorICovCitmdW5jdGlvbiBteFBhcmFsbGVsRWRnZUxheW91dChncmFwaCkKK3sKKwlteEdyYXBoTGF5b3V0LmNhbGwodGhpcywgZ3JhcGgpOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14R3JhcGhMYXlvdXQuCisgKi8KK214UGFyYWxsZWxFZGdlTGF5b3V0LnByb3RvdHlwZSA9IG5ldyBteEdyYXBoTGF5b3V0KCk7CitteFBhcmFsbGVsRWRnZUxheW91dC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBteFBhcmFsbGVsRWRnZUxheW91dDsKKworLyoqCisgKiBWYXJpYWJsZTogc3BhY2luZworICogCisgKiBEZWZpbmVzIHRoZSBzcGFjaW5nIGJldHdlZW4gdGhlIHBhcmFsbGVscy4gRGVmYXVsdCBpcyAyMC4KKyAqLworbXhQYXJhbGxlbEVkZ2VMYXlvdXQucHJvdG90eXBlLnNwYWNpbmcgPSAyMDsKKworLyoqCisgKiBGdW5jdGlvbjogZXhlY3V0ZQorICogCisgKiBJbXBsZW1lbnRzIDxteEdyYXBoTGF5b3V0LmV4ZWN1dGU+LgorICovCitteFBhcmFsbGVsRWRnZUxheW91dC5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uKHBhcmVudCkKK3sKKwl2YXIgbG9va3VwID0gdGhpcy5maW5kUGFyYWxsZWxzKHBhcmVudCk7CisJCisJdGhpcy5ncmFwaC5tb2RlbC5iZWdpblVwZGF0ZSgpOwkKKwl0cnkKKwl7CisJCWZvciAodmFyIGkgaW4gbG9va3VwKQorCQl7CisJCQl2YXIgcGFyYWxsZWxzID0gbG9va3VwW2ldOworCisJCQlpZiAocGFyYWxsZWxzLmxlbmd0aCA+IDEpCisJCQl7CisJCQkJdGhpcy5sYXlvdXQocGFyYWxsZWxzKTsKKwkJCX0KKwkJfQorCX0KKwlmaW5hbGx5CisJeworCQl0aGlzLmdyYXBoLm1vZGVsLmVuZFVwZGF0ZSgpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGZpbmRQYXJhbGxlbHMKKyAqIAorICogRmluZHMgdGhlIHBhcmFsbGVsIGVkZ2VzIGluIHRoZSBnaXZlbiBwYXJlbnQuCisgKi8KK214UGFyYWxsZWxFZGdlTGF5b3V0LnByb3RvdHlwZS5maW5kUGFyYWxsZWxzID0gZnVuY3Rpb24ocGFyZW50KQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwl2YXIgbG9va3VwID0gW107CisJdmFyIGNoaWxkQ291bnQgPSBtb2RlbC5nZXRDaGlsZENvdW50KHBhcmVudCk7CisJCisJZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspCisJeworCQl2YXIgY2hpbGQgPSBtb2RlbC5nZXRDaGlsZEF0KHBhcmVudCwgaSk7CisJCQorCQlpZiAoIXRoaXMuaXNFZGdlSWdub3JlZChjaGlsZCkpCisJCXsKKwkJCXZhciBpZCA9IHRoaXMuZ2V0RWRnZUlkKGNoaWxkKTsKKwkJCQorCQkJaWYgKGlkICE9IG51bGwpCisJCQl7CisJCQkJaWYgKGxvb2t1cFtpZF0gPT0gbnVsbCkKKwkJCQl7CisJCQkJCWxvb2t1cFtpZF0gPSBbXTsKKwkJCQl9CisJCQkJCisJCQkJbG9va3VwW2lkXS5wdXNoKGNoaWxkKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gbG9va3VwOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0RWRnZUlkCisgKiAKKyAqIFJldHVybnMgYSB1bmlxdWUgSUQgZm9yIHRoZSBnaXZlbiBlZGdlLiBUaGUgaWQgaXMgaW5kZXBlbmRlbnQgb2YgdGhlCisgKiBlZGdlIGRpcmVjdGlvbiBhbmQgaXMgYnVpbHQgdXNpbmcgdGhlIHZpc2libGUgdGVybWluYWwgb2YgdGhlIGdpdmVuCisgKiBlZGdlLgorICovCitteFBhcmFsbGVsRWRnZUxheW91dC5wcm90b3R5cGUuZ2V0RWRnZUlkID0gZnVuY3Rpb24oZWRnZSkKK3sKKwl2YXIgdmlldyA9IHRoaXMuZ3JhcGguZ2V0VmlldygpOworCQorCS8vIENhbm5vdCB1c2VkIGNhY2hlZCB2aXNpYmxlIHRlcm1pbmFsIGJlY2F1c2UgdGhpcyBjb3VsZCBiZSB0cmlnZ2VyZWQgaW4gQkVGT1JFX1VORE8KKwl2YXIgc3JjID0gdmlldy5nZXRWaXNpYmxlVGVybWluYWwoZWRnZSwgdHJ1ZSk7CisJdmFyIHRyZyA9IHZpZXcuZ2V0VmlzaWJsZVRlcm1pbmFsKGVkZ2UsIGZhbHNlKTsKKworCWlmIChzcmMgIT0gbnVsbCAmJiB0cmcgIT0gbnVsbCkKKwl7CisJCXNyYyA9IG14T2JqZWN0SWRlbnRpdHkuZ2V0KHNyYyk7CisJCXRyZyA9IG14T2JqZWN0SWRlbnRpdHkuZ2V0KHRyZyk7CisJCQorCQlyZXR1cm4gKHNyYyA+IHRyZykgPyB0cmcgKyAnLScgKyBzcmMgOiBzcmMgKyAnLScgKyB0cmc7CisJfQorCQorCXJldHVybiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogbGF5b3V0CisgKiAKKyAqIExheXMgb3V0IHRoZSBwYXJhbGxlbCBlZGdlcyBpbiB0aGUgZ2l2ZW4gYXJyYXkuCisgKi8KK214UGFyYWxsZWxFZGdlTGF5b3V0LnByb3RvdHlwZS5sYXlvdXQgPSBmdW5jdGlvbihwYXJhbGxlbHMpCit7CisJdmFyIGVkZ2UgPSBwYXJhbGxlbHNbMF07CisJdmFyIHZpZXcgPSB0aGlzLmdyYXBoLmdldFZpZXcoKTsKKwl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCk7CisJdmFyIHNyYyA9IG1vZGVsLmdldEdlb21ldHJ5KHZpZXcuZ2V0VmlzaWJsZVRlcm1pbmFsKGVkZ2UsIHRydWUpKTsKKwl2YXIgdHJnID0gbW9kZWwuZ2V0R2VvbWV0cnkodmlldy5nZXRWaXNpYmxlVGVybWluYWwoZWRnZSwgZmFsc2UpKTsKKwkKKwkvLyBSb3V0ZXMgbXVsdGlwbGUgbG9vcHMKKwlpZiAoc3JjID09IHRyZykKKwl7CisJCXZhciB4MCA9IHNyYy54ICsgc3JjLndpZHRoICsgdGhpcy5zcGFjaW5nOworCQl2YXIgeTAgPSBzcmMueSArIHNyYy5oZWlnaHQgLyAyOworCisJCWZvciAodmFyIGkgPSAwOyBpIDwgcGFyYWxsZWxzLmxlbmd0aDsgaSsrKQorCQl7CisJCQl0aGlzLnJvdXRlKHBhcmFsbGVsc1tpXSwgeDAsIHkwKTsKKwkJCXgwICs9IHRoaXMuc3BhY2luZzsKKwkJfQorCX0KKwllbHNlIGlmIChzcmMgIT0gbnVsbCAmJiB0cmcgIT0gbnVsbCkKKwl7CisJCS8vIFJvdXRlcyBwYXJhbGxlbCBlZGdlcworCQl2YXIgc2N4ID0gc3JjLnggKyBzcmMud2lkdGggLyAyOworCQl2YXIgc2N5ID0gc3JjLnkgKyBzcmMuaGVpZ2h0IC8gMjsKKwkJCisJCXZhciB0Y3ggPSB0cmcueCArIHRyZy53aWR0aCAvIDI7CisJCXZhciB0Y3kgPSB0cmcueSArIHRyZy5oZWlnaHQgLyAyOworCQkKKwkJdmFyIGR4ID0gdGN4IC0gc2N4OworCQl2YXIgZHkgPSB0Y3kgLSBzY3k7CisKKwkJdmFyIGxlbiA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7CisJCQorCQlpZiAobGVuID4gMCkKKwkJeworCQkJdmFyIHgwID0gc2N4ICsgZHggLyAyOworCQkJdmFyIHkwID0gc2N5ICsgZHkgLyAyOworCQkJCisJCQl2YXIgbnggPSBkeSAqIHRoaXMuc3BhY2luZyAvIGxlbjsKKwkJCXZhciBueSA9IGR4ICogdGhpcy5zcGFjaW5nIC8gbGVuOworCQkJCisJCQl4MCArPSBueCAqIChwYXJhbGxlbHMubGVuZ3RoIC0gMSkgLyAyOworCQkJeTAgLT0gbnkgKiAocGFyYWxsZWxzLmxlbmd0aCAtIDEpIC8gMjsKKwkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgcGFyYWxsZWxzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCXRoaXMucm91dGUocGFyYWxsZWxzW2ldLCB4MCwgeTApOworCQkJCXgwIC09IG54OworCQkJCXkwICs9IG55OworCQkJfQorCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcm91dGUKKyAqIAorICogUm91dGVzIHRoZSBnaXZlbiBlZGdlIHZpYSB0aGUgZ2l2ZW4gcG9pbnQuCisgKi8KK214UGFyYWxsZWxFZGdlTGF5b3V0LnByb3RvdHlwZS5yb3V0ZSA9IGZ1bmN0aW9uKGVkZ2UsIHgsIHkpCit7CisJaWYgKHRoaXMuZ3JhcGguaXNDZWxsTW92YWJsZShlZGdlKSkKKwl7CisJCXRoaXMuc2V0RWRnZVBvaW50cyhlZGdlLCBbbmV3IG14UG9pbnQoeCwgeSldKTsKKwl9Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9teFBhcnRpdGlvbkxheW91dC5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvbXhQYXJ0aXRpb25MYXlvdXQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2NmY1NAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvbXhQYXJ0aXRpb25MYXlvdXQuanMKQEAgLTAsMCArMSwyNDAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14UGFydGl0aW9uTGF5b3V0CisgKiAKKyAqIEV4dGVuZHMgPG14R3JhcGhMYXlvdXQ+IGZvciBwYXJ0aXRpb25pbmcgdGhlIHBhcmVudCBjZWxsIHZlcnRpY2FsbHkgb3IKKyAqIGhvcml6b250YWxseSBieSBmaWxsaW5nIHRoZSBjb21wbGV0ZSBhcmVhIHdpdGggdGhlIGNoaWxkIGNlbGxzLiBBIGhvcml6b250YWwKKyAqIGxheW91dCBwYXJ0aXRpb25zIHRoZSBoZWlnaHQgb2YgdGhlIGdpdmVuIHBhcmVudCB3aGVyZWFzIGEgYSBub24taG9yaXpvbnRhbAorICogbGF5b3V0IHBhcnRpdGlvbnMgdGhlIHdpZHRoLiBJZiB0aGUgcGFyZW50IGlzIGEgbGF5ZXIgKHRoYXQgaXMsIGEgY2hpbGQgb2YKKyAqIHRoZSByb290IG5vZGUpLCB0aGVuIHRoZSBjdXJyZW50IGdyYXBoIHNpemUgaXMgcGFydGl0aW9uZWQuIFRoZSBjaGlsZHJlbiBkbworICogbm90IG5lZWQgdG8gYmUgY29ubmVjdGVkIGZvciB0aGlzIGxheW91dCB0byB3b3JrLgorICogCisgKiBFeGFtcGxlOgorICogCisgKiAoY29kZSkKKyAqIHZhciBsYXlvdXQgPSBuZXcgbXhQYXJ0aXRpb25MYXlvdXQoZ3JhcGgsIHRydWUsIDEwLCAyMCk7CisgKiBsYXlvdXQuZXhlY3V0ZShncmFwaC5nZXREZWZhdWx0UGFyZW50KCkpOworICogKGVuZCkKKyAqIAorICogQ29uc3RydWN0b3I6IG14UGFydGl0aW9uTGF5b3V0CisgKiAKKyAqIENvbnN0cnVjdHMgYSBuZXcgc3RhY2sgbGF5b3V0IGxheW91dCBmb3IgdGhlIHNwZWNpZmllZCBncmFwaCwKKyAqIHNwYWNpbmcsIG9yaWVudGF0aW9uIGFuZCBvZmZzZXQuCisgKi8KK2Z1bmN0aW9uIG14UGFydGl0aW9uTGF5b3V0KGdyYXBoLCBob3Jpem9udGFsLCBzcGFjaW5nLCBib3JkZXIpCit7CisJbXhHcmFwaExheW91dC5jYWxsKHRoaXMsIGdyYXBoKTsKKwl0aGlzLmhvcml6b250YWwgPSAoaG9yaXpvbnRhbCAhPSBudWxsKSA/IGhvcml6b250YWwgOiB0cnVlOworCXRoaXMuc3BhY2luZyA9IHNwYWNpbmcgfHwgMDsKKwl0aGlzLmJvcmRlciA9IGJvcmRlciB8fCAwOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14R3JhcGhMYXlvdXQuCisgKi8KK214UGFydGl0aW9uTGF5b3V0LnByb3RvdHlwZSA9IG5ldyBteEdyYXBoTGF5b3V0KCk7CitteFBhcnRpdGlvbkxheW91dC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBteFBhcnRpdGlvbkxheW91dDsKKworLyoqCisgKiBWYXJpYWJsZTogaG9yaXpvbnRhbAorICogCisgKiBCb29sZWFuIGluZGljYXRpbmcgdGhlIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgc3BhY2UgaXMgcGFydGl0aW9uZWQuCisgKiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214UGFydGl0aW9uTGF5b3V0LnByb3RvdHlwZS5ob3Jpem9udGFsID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogc3BhY2luZworICogCisgKiBJbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSBhYnNvbHV0ZSBzcGFjaW5nIGluIHBpeGVscyBiZXR3ZWVuIHRoZQorICogY2hpbGRyZW4uIERlZmF1bHQgaXMgMC4KKyAqLworbXhQYXJ0aXRpb25MYXlvdXQucHJvdG90eXBlLnNwYWNpbmcgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBib3JkZXIKKyAqIAorICogSW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgYWJzb2x1dGUgaW5zZXQgaW4gcGl4ZWxzIGZvciB0aGUgcGFyZW50IHRoYXQKKyAqIGNvbnRhaW5zIHRoZSBjaGlsZHJlbi4gRGVmYXVsdCBpcyAwLgorICovCitteFBhcnRpdGlvbkxheW91dC5wcm90b3R5cGUuYm9yZGVyID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogcmVzaXplVmVydGljZXMKKyAqIAorICogQm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB2ZXJ0aWNlcyBzaG91bGQgYmUgcmVzaXplZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteFBhcnRpdGlvbkxheW91dC5wcm90b3R5cGUucmVzaXplVmVydGljZXMgPSB0cnVlOworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0hvcml6b250YWwKKyAqIAorICogUmV0dXJucyA8aG9yaXpvbnRhbD4uCisgKi8KK214UGFydGl0aW9uTGF5b3V0LnByb3RvdHlwZS5pc0hvcml6b250YWwgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuaG9yaXpvbnRhbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdmVDZWxsCisgKiAKKyAqIEltcGxlbWVudHMgPG14R3JhcGhMYXlvdXQubW92ZUNlbGw+LgorICovCitteFBhcnRpdGlvbkxheW91dC5wcm90b3R5cGUubW92ZUNlbGwgPSBmdW5jdGlvbihjZWxsLCB4LCB5KQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwl2YXIgcGFyZW50ID0gbW9kZWwuZ2V0UGFyZW50KGNlbGwpOworCQorCWlmIChjZWxsICE9IG51bGwgJiYKKwkJcGFyZW50ICE9IG51bGwpCisJeworCQl2YXIgaSA9IDA7CisJCXZhciBsYXN0ID0gMDsKKwkJdmFyIGNoaWxkQ291bnQgPSBtb2RlbC5nZXRDaGlsZENvdW50KHBhcmVudCk7CisJCQorCQkvLyBGaW5kcyBpbmRleCBvZiB0aGUgY2xvc2VzdCBzd2ltbGFuZQorCQkvLyBUT0RPOiBUYWtlIGludG8gYWNjb3VudCB0aGUgb3JpZW50YXRpb24KKwkJZm9yIChpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykKKwkJeworCQkJdmFyIGNoaWxkID0gbW9kZWwuZ2V0Q2hpbGRBdChwYXJlbnQsIGkpOworCQkJdmFyIGJvdW5kcyA9IHRoaXMuZ2V0VmVydGV4Qm91bmRzKGNoaWxkKTsKKwkJCQorCQkJaWYgKGJvdW5kcyAhPSBudWxsKQorCQkJeworCQkJCXZhciB0bXAgPSBib3VuZHMueCArIGJvdW5kcy53aWR0aCAvIDI7CisJCQkJCisJCQkJaWYgKGxhc3QgPCB4ICYmIHRtcCA+IHgpCisJCQkJeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJCisJCQkJbGFzdCA9IHRtcDsKKwkJCX0KKwkJfQorCQkKKwkJLy8gQ2hhbmdlcyBjaGlsZCBvcmRlciBpbiBwYXJlbnQKKwkJdmFyIGlkeCA9IHBhcmVudC5nZXRJbmRleChjZWxsKTsKKwkJaWR4ID0gTWF0aC5tYXgoMCwgaSAtICgoaSA+IGlkeCkgPyAxIDogMCkpOworCQkKKwkJbW9kZWwuYWRkKHBhcmVudCwgY2VsbCwgaWR4KTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBleGVjdXRlCisgKiAKKyAqIEltcGxlbWVudHMgPG14R3JhcGhMYXlvdXQuZXhlY3V0ZT4uIEFsbCBjaGlsZHJlbiB3aGVyZSA8aXNWZXJ0ZXhJZ25vcmVkPgorICogcmV0dXJucyBmYWxzZSBhbmQgPGlzVmVydGV4TW92YWJsZT4gcmV0dXJucyB0cnVlIGFyZSBtb2RpZmllZC4KKyAqLworbXhQYXJ0aXRpb25MYXlvdXQucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbihwYXJlbnQpCit7CisJdmFyIGhvcml6b250YWwgPSB0aGlzLmlzSG9yaXpvbnRhbCgpOworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwl2YXIgcGdlbyA9IG1vZGVsLmdldEdlb21ldHJ5KHBhcmVudCk7CisJCisJLy8gSGFuZGxlcyBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlIHBhcmVudCBpcyBlaXRoZXIgYSBsYXllciB3aXRoIG5vCisJLy8gZ2VvbWV0cnkgb3IgdGhlIGN1cnJlbnQgcm9vdCBvZiB0aGUgdmlldyBpbiB3aGljaCBjYXNlIHRoZSBzaXplCisJLy8gb2YgdGhlIGdyYXBoJ3MgY29udGFpbmVyIHdpbGwgYmUgdXNlZC4KKwlpZiAodGhpcy5ncmFwaC5jb250YWluZXIgIT0gbnVsbCAmJgorCQkoKHBnZW8gPT0gbnVsbCAmJgorCQltb2RlbC5pc0xheWVyKHBhcmVudCkpIHx8CisJCXBhcmVudCA9PSB0aGlzLmdyYXBoLmdldFZpZXcoKS5jdXJyZW50Um9vdCkpCisJeworCQl2YXIgd2lkdGggPSB0aGlzLmdyYXBoLmNvbnRhaW5lci5vZmZzZXRXaWR0aCAtIDE7CisJCXZhciBoZWlnaHQgPSB0aGlzLmdyYXBoLmNvbnRhaW5lci5vZmZzZXRIZWlnaHQgLSAxOworCQlwZ2VvID0gbmV3IG14UmVjdGFuZ2xlKDAsIDAsIHdpZHRoLCBoZWlnaHQpOworCX0KKworCWlmIChwZ2VvICE9IG51bGwpCisJeworCQl2YXIgY2hpbGRyZW4gPSBbXTsKKwkJdmFyIGNoaWxkQ291bnQgPSBtb2RlbC5nZXRDaGlsZENvdW50KHBhcmVudCk7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykKKwkJeworCQkJdmFyIGNoaWxkID0gbW9kZWwuZ2V0Q2hpbGRBdChwYXJlbnQsIGkpOworCQkJCisJCQlpZiAoIXRoaXMuaXNWZXJ0ZXhJZ25vcmVkKGNoaWxkKSAmJgorCQkJCXRoaXMuaXNWZXJ0ZXhNb3ZhYmxlKGNoaWxkKSkKKwkJCXsKKwkJCQljaGlsZHJlbi5wdXNoKGNoaWxkKTsKKwkJCX0KKwkJfQorCQkKKwkJdmFyIG4gPSBjaGlsZHJlbi5sZW5ndGg7CisKKwkJaWYgKG4gPiAwKQorCQl7CisJCQl2YXIgeDAgPSB0aGlzLmJvcmRlcjsKKwkJCXZhciB5MCA9IHRoaXMuYm9yZGVyOworCQkJdmFyIG90aGVyID0gKGhvcml6b250YWwpID8gcGdlby5oZWlnaHQgOiBwZ2VvLndpZHRoOworCQkJb3RoZXIgLT0gMiAqIHRoaXMuYm9yZGVyOworCisJCQl2YXIgc2l6ZSA9ICh0aGlzLmdyYXBoLmlzU3dpbWxhbmUocGFyZW50KSkgPworCQkJCXRoaXMuZ3JhcGguZ2V0U3RhcnRTaXplKHBhcmVudCkgOgorCQkJCW5ldyBteFJlY3RhbmdsZSgpOworCisJCQlvdGhlciAtPSAoaG9yaXpvbnRhbCkgPyBzaXplLmhlaWdodCA6IHNpemUud2lkdGg7CisJCQl4MCA9IHgwICsgc2l6ZS53aWR0aDsKKwkJCXkwID0geTAgKyBzaXplLmhlaWdodDsKKworCQkJdmFyIHRtcCA9IHRoaXMuYm9yZGVyICsgKG4gLSAxKSAqIHRoaXMuc3BhY2luZzsKKwkJCXZhciB2YWx1ZSA9IChob3Jpem9udGFsKSA/CisJCQkJKChwZ2VvLndpZHRoIC0geDAgLSB0bXApIC8gbikgOgorCQkJCSgocGdlby5oZWlnaHQgLSB5MCAtIHRtcCkgLyBuKTsKKwkJCQorCQkJLy8gQXZvaWRzIG5lZ2F0aXZlIHZhbHVlcywgdGhhdCBpcyB2YWx1ZXMgd2hlcmUgdGhlIHN1bSBvZiB0aGUKKwkJCS8vIHNwYWNpbmcgcGx1cyB0aGUgYm9yZGVyIGlzIGxhcmdlciB0aGVuIHRoZSBhdmFpbGFibGUgc3BhY2UKKwkJCWlmICh2YWx1ZSA+IDApCisJCQl7CisJCQkJbW9kZWwuYmVnaW5VcGRhdGUoKTsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJCQl7CisJCQkJCQl2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTsKKwkJCQkJCXZhciBnZW8gPSBtb2RlbC5nZXRHZW9tZXRyeShjaGlsZCk7CisJCQkJCQorCQkJCQkJaWYgKGdlbyAhPSBudWxsKQorCQkJCQkJeworCQkJCQkJCWdlbyA9IGdlby5jbG9uZSgpOworCQkJCQkJCWdlby54ID0geDA7CisJCQkJCQkJZ2VvLnkgPSB5MDsKKworCQkJCQkJCWlmIChob3Jpem9udGFsKQorCQkJCQkJCXsKKwkJCQkJCQkJaWYgKHRoaXMucmVzaXplVmVydGljZXMpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWdlby53aWR0aCA9IHZhbHVlOworCQkJCQkJCQkJZ2VvLmhlaWdodCA9IG90aGVyOworCQkJCQkJCQl9CisJCQkJCQkJCQorCQkJCQkJCQl4MCArPSB2YWx1ZSArIHRoaXMuc3BhY2luZzsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJaWYgKHRoaXMucmVzaXplVmVydGljZXMpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWdlby5oZWlnaHQgPSB2YWx1ZTsKKwkJCQkJCQkJCWdlby53aWR0aCA9IG90aGVyOworCQkJCQkJCQl9CisJCQkJCQkJCQorCQkJCQkJCQl5MCArPSB2YWx1ZSArIHRoaXMuc3BhY2luZzsKKwkJCQkJCQl9CisKKwkJCQkJCQltb2RlbC5zZXRHZW9tZXRyeShjaGlsZCwgZ2VvKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlmaW5hbGx5CisJCQkJeworCQkJCQltb2RlbC5lbmRVcGRhdGUoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9teFJhZGlhbFRyZWVMYXlvdXQuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbGF5b3V0L214UmFkaWFsVHJlZUxheW91dC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjdjMzY2Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9teFJhZGlhbFRyZWVMYXlvdXQuanMKQEAgLTAsMCArMSwzMTcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14UmFkaWFsVHJlZUxheW91dAorICogCisgKiBFeHRlbmRzIDxteEdyYXBoTGF5b3V0PiB0byBpbXBsZW1lbnQgYSByYWRpYWwgdHJlZSBhbGdvcml0aG0uIFRoaXMKKyAqIGxheW91dCBpcyBzdWl0YWJsZSBmb3IgZ3JhcGhzIHRoYXQgaGF2ZSBubyBjeWNsZXMgKHRyZWVzKS4gVmVydGljZXMgdGhhdCBhcmUKKyAqIG5vdCBjb25uZWN0ZWQgdG8gdGhlIHRyZWUgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoaXMgbGF5b3V0LgorICogCisgKiBFeGFtcGxlOgorICogCisgKiAoY29kZSkKKyAqIHZhciBsYXlvdXQgPSBuZXcgbXhSYWRpYWxUcmVlTGF5b3V0KGdyYXBoKTsKKyAqIGxheW91dC5leGVjdXRlKGdyYXBoLmdldERlZmF1bHRQYXJlbnQoKSk7CisgKiAoZW5kKQorICogCisgKiBDb25zdHJ1Y3RvcjogbXhSYWRpYWxUcmVlTGF5b3V0CisgKiAKKyAqIENvbnN0cnVjdHMgYSBuZXcgcmFkaWFsIHRyZWUgbGF5b3V0IGZvciB0aGUgc3BlY2lmaWVkIGdyYXBoCisgKi8KK2Z1bmN0aW9uIG14UmFkaWFsVHJlZUxheW91dChncmFwaCkKK3sKKwlteENvbXBhY3RUcmVlTGF5b3V0LmNhbGwodGhpcywgZ3JhcGggLCBmYWxzZSk7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhHcmFwaExheW91dC4KKyAqLworbXhVdGlscy5leHRlbmQobXhSYWRpYWxUcmVlTGF5b3V0LCBteENvbXBhY3RUcmVlTGF5b3V0KTsKKworLyoqCisgKiBWYXJpYWJsZTogYW5nbGVPZmZzZXQKKyAqCisgKiBUaGUgaW5pdGlhbCBvZmZzZXQgdG8gY29tcHV0ZSB0aGUgYW5nbGUgcG9zaXRpb24uCisgKi8KK214UmFkaWFsVHJlZUxheW91dC5wcm90b3R5cGUuYW5nbGVPZmZzZXQgPSAwLjU7CisKKy8qKgorICogVmFyaWFibGU6IHJvb3R4CisgKgorICogVGhlIFggY28tb3JkaW5hdGUgb2YgdGhlIHJvb3QgY2VsbAorICovCitteFJhZGlhbFRyZWVMYXlvdXQucHJvdG90eXBlLnJvb3R4ID0gMDsKKworLyoqCisgKiBWYXJpYWJsZTogcm9vdHkKKyAqCisgKiBUaGUgWSBjby1vcmRpbmF0ZSBvZiB0aGUgcm9vdCBjZWxsCisgKi8KK214UmFkaWFsVHJlZUxheW91dC5wcm90b3R5cGUucm9vdHkgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBsZXZlbERpc3RhbmNlCisgKgorICogSG9sZHMgdGhlIGxldmVsRGlzdGFuY2UuIERlZmF1bHQgaXMgMTIwLgorICovCitteFJhZGlhbFRyZWVMYXlvdXQucHJvdG90eXBlLmxldmVsRGlzdGFuY2UgPSAxMjA7CisKKy8qKgorICogVmFyaWFibGU6IG5vZGVEaXN0YW5jZQorICoKKyAqIEhvbGRzIHRoZSBub2RlRGlzdGFuY2UuIERlZmF1bHQgaXMgMTAuCisgKi8KK214UmFkaWFsVHJlZUxheW91dC5wcm90b3R5cGUubm9kZURpc3RhbmNlID0gMTA7CisKKy8qKgorICogVmFyaWFibGU6IGF1dG9SYWRpdXMKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSByYWRpb3Mgc2hvdWxkIGJlIGNvbXB1dGVkIGF1dG9tYXRpY2FsbHkKKyAqLworbXhSYWRpYWxUcmVlTGF5b3V0LnByb3RvdHlwZS5hdXRvUmFkaXVzID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHNvcnRFZGdlcworICogCisgKiBTcGVjaWZpZXMgaWYgZWRnZXMgc2hvdWxkIGJlIHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIG9yZGVyIG9mIHRoZWlyCisgKiBvcHBvc2l0ZSB0ZXJtaW5hbCBjZWxsIGluIHRoZSBtb2RlbC4KKyAqLworbXhSYWRpYWxUcmVlTGF5b3V0LnByb3RvdHlwZS5zb3J0RWRnZXMgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogcm93TWluWAorICogCisgKiBBcnJheSBvZiBsZWZ0bW9zdCB4IGNvb3JkaW5hdGUgb2YgZWFjaCByb3cKKyAqLworbXhSYWRpYWxUcmVlTGF5b3V0LnByb3RvdHlwZS5yb3dNaW5YID0gW107CisKKy8qKgorICogVmFyaWFibGU6IHJvd01heFgKKyAqIAorICogQXJyYXkgb2YgcmlnaHRtb3N0IHggY29vcmRpbmF0ZSBvZiBlYWNoIHJvdworICovCitteFJhZGlhbFRyZWVMYXlvdXQucHJvdG90eXBlLnJvd01heFggPSBbXTsKKworLyoqCisgKiBWYXJpYWJsZTogcm93TWluQ2VuWAorICogCisgKiBBcnJheSBvZiB4IGNvb3JkaW5hdGUgb2YgbGVmdG1vc3QgdmVydGV4IG9mIGVhY2ggcm93CisgKi8KK214UmFkaWFsVHJlZUxheW91dC5wcm90b3R5cGUucm93TWluQ2VuWCA9IFtdOworCisvKioKKyAqIFZhcmlhYmxlOiByb3dNYXhDZW5YCisgKiAKKyAqIEFycmF5IG9mIHggY29vcmRpbmF0ZSBvZiByaWdodG1vc3QgdmVydGV4IG9mIGVhY2ggcm93CisgKi8KK214UmFkaWFsVHJlZUxheW91dC5wcm90b3R5cGUucm93TWF4Q2VuWCA9IFtdOworCisvKioKKyAqIFZhcmlhYmxlOiByb3dSYWRpCisgKiAKKyAqIEFycmF5IG9mIHkgZGVsdGFzIG9mIGVhY2ggcm93IGJlaGluZCByb290IHZlcnRleCwgYWxzbyB0aGUgcmFkaXVzIGluIHRoZSB0cmVlCisgKi8KK214UmFkaWFsVHJlZUxheW91dC5wcm90b3R5cGUucm93UmFkaSA9IFtdOworCisvKioKKyAqIFZhcmlhYmxlOiByb3cKKyAqIAorICogQXJyYXkgb2YgdmVydGljZXMgb24gZWFjaCByb3cKKyAqLworbXhSYWRpYWxUcmVlTGF5b3V0LnByb3RvdHlwZS5yb3cgPSBbXTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNWZXJ0ZXhJZ25vcmVkCisgKiAKKyAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGdpdmVuIDxteENlbGw+IHNob3VsZCBiZSBpZ25vcmVkIGFzIGEKKyAqIHZlcnRleC4gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGNlbGwgaGFzIG5vIGNvbm5lY3Rpb25zLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2ZXJ0ZXggLSA8bXhDZWxsPiB3aG9zZSBpZ25vcmVkIHN0YXRlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhSYWRpYWxUcmVlTGF5b3V0LnByb3RvdHlwZS5pc1ZlcnRleElnbm9yZWQgPSBmdW5jdGlvbih2ZXJ0ZXgpCit7CisJcmV0dXJuIG14R3JhcGhMYXlvdXQucHJvdG90eXBlLmlzVmVydGV4SWdub3JlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8CisJCXRoaXMuZ3JhcGguZ2V0Q29ubmVjdGlvbnModmVydGV4KS5sZW5ndGggPT0gMDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGV4ZWN1dGUKKyAqIAorICogSW1wbGVtZW50cyA8bXhHcmFwaExheW91dC5leGVjdXRlPi4KKyAqIAorICogSWYgdGhlIHBhcmVudCBoYXMgYW55IGNvbm5lY3RlZCBlZGdlcywgdGhlbiBpdCBpcyB1c2VkIGFzIHRoZSByb290IG9mCisgKiB0aGUgdHJlZS4gRWxzZSwgPG14R3JhcGguZmluZFRyZWVSb290cz4gd2lsbCBiZSB1c2VkIHRvIGZpbmQgYSBzdWl0YWJsZQorICogcm9vdCBub2RlIHdpdGhpbiB0aGUgc2V0IG9mIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiBwYXJlbnQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHBhcmVudCAtIDxteENlbGw+IHdob3NlIGNoaWxkcmVuIHNob3VsZCBiZSBsYWlkIG91dC4KKyAqIHJvb3QgLSBPcHRpb25hbCA8bXhDZWxsPiB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcm9vdCBvZiB0aGUgdHJlZS4KKyAqLworbXhSYWRpYWxUcmVlTGF5b3V0LnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24ocGFyZW50LCByb290KQoreworCXRoaXMucGFyZW50ID0gcGFyZW50OworCQorCXRoaXMudXNlQm91bmRpbmdCb3ggPSBmYWxzZTsKKwl0aGlzLmVkZ2VSb3V0aW5nID0gZmFsc2U7CisJLy90aGlzLmhvcml6b250YWwgPSBmYWxzZTsKKworCW14Q29tcGFjdFRyZWVMYXlvdXQucHJvdG90eXBlLmV4ZWN1dGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkKKwl2YXIgYm91bmRzID0gbnVsbDsKKwl2YXIgcm9vdEJvdW5kcyA9IHRoaXMuZ2V0VmVydGV4Qm91bmRzKHRoaXMucm9vdCk7CisJdGhpcy5jZW50ZXJYID0gcm9vdEJvdW5kcy54ICsgcm9vdEJvdW5kcy53aWR0aCAvIDI7CisJdGhpcy5jZW50ZXJZID0gcm9vdEJvdW5kcy55ICsgcm9vdEJvdW5kcy5oZWlnaHQgLyAyOworCisJLy8gQ2FsY3VsYXRlIHRoZSBib3VuZHMgb2YgdGhlIGludm9sdmVkIHZlcnRpY2VzIGRpcmVjdGx5IGZyb20gdGhlIHZhbHVlcyBzZXQgaW4gdGhlIGNvbXBhY3QgdHJlZQorCWZvciAodmFyIHZlcnRleCBpbiB0aGlzLnZpc2l0ZWQpCisJeworCQl2YXIgdmVydGV4Qm91bmRzID0gdGhpcy5nZXRWZXJ0ZXhCb3VuZHModGhpcy52aXNpdGVkW3ZlcnRleF0pOworCQlib3VuZHMgPSAoYm91bmRzICE9IG51bGwpID8gYm91bmRzIDogdmVydGV4Qm91bmRzLmNsb25lKCk7CisJCWJvdW5kcy5hZGQodmVydGV4Qm91bmRzKTsKKwl9CisJCisJdGhpcy5jYWxjUm93RGltcyhbdGhpcy5ub2RlXSwgMCk7CisJCisJdmFyIG1heExlZnRHcmFkID0gMDsKKwl2YXIgbWF4UmlnaHRHcmFkID0gMDsKKworCS8vIEZpbmQgdGhlIHN0ZWVwZXN0IGxlZnQgYW5kIHJpZ2h0IGdyYWRpZW50cworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3cubGVuZ3RoOyBpKyspCisJeworCQl2YXIgbGVmdEdyYWQgPSAodGhpcy5jZW50ZXJYIC0gdGhpcy5yb3dNaW5YW2ldIC0gdGhpcy5ub2RlRGlzdGFuY2UpIC8gdGhpcy5yb3dSYWRpW2ldOworCQl2YXIgcmlnaHRHcmFkID0gKHRoaXMucm93TWF4WFtpXSAtIHRoaXMuY2VudGVyWCAtIHRoaXMubm9kZURpc3RhbmNlKSAvIHRoaXMucm93UmFkaVtpXTsKKwkJCisJCW1heExlZnRHcmFkID0gTWF0aC5tYXggKG1heExlZnRHcmFkLCBsZWZ0R3JhZCk7CisJCW1heFJpZ2h0R3JhZCA9IE1hdGgubWF4IChtYXhSaWdodEdyYWQsIHJpZ2h0R3JhZCk7CisJfQorCQorCS8vIEV4dGVuZCBvdXQgcm93IHNvIHRoZXkgbWVldCB0aGUgbWF4aW11bSBncmFkaWVudCBhbmQgY29udmVydCB0byBwb2xhciBjby1vcmRzCisJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJvdy5sZW5ndGg7IGkrKykKKwl7CisJCXZhciB4TGVmdExpbWl0ID0gdGhpcy5jZW50ZXJYIC0gdGhpcy5ub2RlRGlzdGFuY2UgLSBtYXhMZWZ0R3JhZCAqIHRoaXMucm93UmFkaVtpXTsKKwkJdmFyIHhSaWdodExpbWl0ID0gdGhpcy5jZW50ZXJYICsgdGhpcy5ub2RlRGlzdGFuY2UgKyBtYXhSaWdodEdyYWQgKiB0aGlzLnJvd1JhZGlbaV07CisJCXZhciBmdWxsV2lkdGggPSB4UmlnaHRMaW1pdCAtIHhMZWZ0TGltaXQ7CisJCQorCQlmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMucm93W2ldLmxlbmd0aDsgaiArKykKKwkJeworCQkJdmFyIHJvdyA9IHRoaXMucm93W2ldOworCQkJdmFyIG5vZGUgPSByb3dbal07CisJCQl2YXIgdmVydGV4Qm91bmRzID0gdGhpcy5nZXRWZXJ0ZXhCb3VuZHMobm9kZS5jZWxsKTsKKwkJCXZhciB4UHJvcG9ydGlvbiA9ICh2ZXJ0ZXhCb3VuZHMueCArIHZlcnRleEJvdW5kcy53aWR0aCAvIDIgLSB4TGVmdExpbWl0KSAvIChmdWxsV2lkdGgpOworCQkJdmFyIHRoZXRhID0gIDIgKiBNYXRoLlBJICogeFByb3BvcnRpb247CisJCQlub2RlLnRoZXRhID0gdGhldGE7CisJCX0KKwl9CisKKwkvLyBQb3N0LXByb2Nlc3MgZnJvbSBvdXRzaWRlIGlud2FyZHMgdG8gdHJ5IHRvIGFsaWduIHBhcmVudHMgd2l0aCBjaGlsZHJlbgorCWZvciAodmFyIGkgPSB0aGlzLnJvdy5sZW5ndGggLSAyOyBpID49IDA7IGktLSkKKwl7CisJCXZhciByb3cgPSB0aGlzLnJvd1tpXTsKKwkJCisJCWZvciAodmFyIGogPSAwOyBqIDwgcm93Lmxlbmd0aDsgaisrKQorCQl7CisJCQl2YXIgbm9kZSA9IHJvd1tqXTsKKwkJCXZhciBjaGlsZCA9IG5vZGUuY2hpbGQ7CisJCQl2YXIgY291bnRlciA9IDA7CisJCQl2YXIgdG90YWxUaGV0YSA9IDA7CisJCQkKKwkJCXdoaWxlIChjaGlsZCAhPSBudWxsKQorCQkJeworCQkJCXRvdGFsVGhldGEgKz0gY2hpbGQudGhldGE7CisJCQkJY291bnRlcisrOworCQkJCWNoaWxkID0gY2hpbGQubmV4dDsKKwkJCX0KKwkJCQorCQkJaWYgKGNvdW50ZXIgPiAwKQorCQkJeworCQkJCXZhciBhdmVyVGhldGEgPSB0b3RhbFRoZXRhIC8gY291bnRlcjsKKwkJCQkKKwkJCQlpZiAoYXZlclRoZXRhID4gbm9kZS50aGV0YSAmJiBqIDwgcm93Lmxlbmd0aCAtIDEpCisJCQkJeworCQkJCQl2YXIgbmV4dFRoZXRhID0gcm93W2orMV0udGhldGE7CisJCQkJCW5vZGUudGhldGEgPSBNYXRoLm1pbiAoYXZlclRoZXRhLCBuZXh0VGhldGEgLSBNYXRoLlBJLzEwKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoYXZlclRoZXRhIDwgbm9kZS50aGV0YSAmJiBqID4gMCApCisJCQkJeworCQkJCQl2YXIgbGFzdFRoZXRhID0gcm93W2otMV0udGhldGE7CisJCQkJCW5vZGUudGhldGEgPSBNYXRoLm1heCAoYXZlclRoZXRhLCBsYXN0VGhldGEgKyBNYXRoLlBJLzEwKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJLy8gU2V0IGxvY2F0aW9ucworCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yb3cubGVuZ3RoOyBpKyspCisJeworCQlmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMucm93W2ldLmxlbmd0aDsgaiArKykKKwkJeworCQkJdmFyIHJvdyA9IHRoaXMucm93W2ldOworCQkJdmFyIG5vZGUgPSByb3dbal07CisJCQl2YXIgdmVydGV4Qm91bmRzID0gdGhpcy5nZXRWZXJ0ZXhCb3VuZHMobm9kZS5jZWxsKTsKKwkJCXRoaXMuc2V0VmVydGV4TG9jYXRpb24obm9kZS5jZWxsLAorCQkJCQkJCQkJdGhpcy5jZW50ZXJYIC0gdmVydGV4Qm91bmRzLndpZHRoIC8gMiArIHRoaXMucm93UmFkaVtpXSAqIE1hdGguY29zKG5vZGUudGhldGEpLAorCQkJCQkJCQkJdGhpcy5jZW50ZXJZIC0gdmVydGV4Qm91bmRzLmhlaWdodCAvIDIgKyB0aGlzLnJvd1JhZGlbaV0gKiBNYXRoLnNpbihub2RlLnRoZXRhKSk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjYWxjUm93RGltcworICogCisgKiBSZWN1cnNpdmUgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBkaW1lbnNpb25zIG9mIGVhY2ggcm93CisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHJvdyAtIEFycmF5IG9mIGludGVybmFsIG5vZGVzLCB0aGUgY2hpbGRyZW4gb2Ygd2hpY2ggYXJlIHRvIGJlIHByb2Nlc3NlZC4KKyAqIHJvd051bSAtIEludGVnZXIgaW5kaWNhdGluZyB3aGljaCByb3cgaXMgYmVpbmcgcHJvY2Vzc2VkLgorICovCitteFJhZGlhbFRyZWVMYXlvdXQucHJvdG90eXBlLmNhbGNSb3dEaW1zID0gZnVuY3Rpb24ocm93LCByb3dOdW0pCit7CisJaWYgKHJvdyA9PSBudWxsIHx8IHJvdy5sZW5ndGggPT0gMCkKKwl7CisJCXJldHVybjsKKwl9CisKKwkvLyBQbGFjZSByb290J3MgY2hpbGRyZW4gcHJvcG9ydGlvbmFsbHkgYXJvdW5kIHRoZSBmaXJzdCBsZXZlbAorCXRoaXMucm93TWluWFtyb3dOdW1dID0gdGhpcy5jZW50ZXJYOworCXRoaXMucm93TWF4WFtyb3dOdW1dID0gdGhpcy5jZW50ZXJYOworCXRoaXMucm93TWluQ2VuWFtyb3dOdW1dID0gdGhpcy5jZW50ZXJYOworCXRoaXMucm93TWF4Q2VuWFtyb3dOdW1dID0gdGhpcy5jZW50ZXJYOworCXRoaXMucm93W3Jvd051bV0gPSBbXTsKKworCXZhciByb3dIYXNDaGlsZHJlbiA9IGZhbHNlOworCisJZm9yICh2YXIgaSA9IDA7IGkgPCByb3cubGVuZ3RoOyBpKyspCisJeworCQl2YXIgY2hpbGQgPSByb3dbaV0gIT0gbnVsbCA/IHJvd1tpXS5jaGlsZCA6IG51bGw7CisKKwkJd2hpbGUgKGNoaWxkICE9IG51bGwpCisJCXsKKwkJCXZhciBjZWxsID0gY2hpbGQuY2VsbDsKKwkJCXZlcnRleEJvdW5kcyA9IHRoaXMuZ2V0VmVydGV4Qm91bmRzKGNlbGwpOworCQkJCisJCQl0aGlzLnJvd01pblhbcm93TnVtXSA9IE1hdGgubWluKHZlcnRleEJvdW5kcy54LCB0aGlzLnJvd01pblhbcm93TnVtXSk7CisJCQl0aGlzLnJvd01heFhbcm93TnVtXSA9IE1hdGgubWF4KHZlcnRleEJvdW5kcy54ICsgdmVydGV4Qm91bmRzLndpZHRoLCB0aGlzLnJvd01heFhbcm93TnVtXSk7CisJCQl0aGlzLnJvd01pbkNlblhbcm93TnVtXSA9IE1hdGgubWluKHZlcnRleEJvdW5kcy54ICsgdmVydGV4Qm91bmRzLndpZHRoIC8gMiwgdGhpcy5yb3dNaW5DZW5YW3Jvd051bV0pOworCQkJdGhpcy5yb3dNYXhDZW5YW3Jvd051bV0gPSBNYXRoLm1heCh2ZXJ0ZXhCb3VuZHMueCArIHZlcnRleEJvdW5kcy53aWR0aCAvIDIsIHRoaXMucm93TWF4Q2VuWFtyb3dOdW1dKTsKKwkJCXRoaXMucm93UmFkaVtyb3dOdW1dID0gdmVydGV4Qm91bmRzLnkgLSB0aGlzLmdldFZlcnRleEJvdW5kcyh0aGlzLnJvb3QpLnk7CisJCisJCQlpZiAoY2hpbGQuY2hpbGQgIT0gbnVsbCkKKwkJCXsKKwkJCQlyb3dIYXNDaGlsZHJlbiA9IHRydWU7CisJCQl9CisJCQl0aGlzLnJvd1tyb3dOdW1dLnB1c2goY2hpbGQpOworCQkJY2hpbGQgPSBjaGlsZC5uZXh0OworCQl9CisJfQorCQorCWlmIChyb3dIYXNDaGlsZHJlbikKKwl7CisJCXRoaXMuY2FsY1Jvd0RpbXModGhpcy5yb3dbcm93TnVtXSwgcm93TnVtICsgMSk7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvbXhTdGFja0xheW91dC5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9sYXlvdXQvbXhTdGFja0xheW91dC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDQ2YTViCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL2xheW91dC9teFN0YWNrTGF5b3V0LmpzCkBAIC0wLDAgKzEsNTE1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFN0YWNrTGF5b3V0CisgKiAKKyAqIEV4dGVuZHMgPG14R3JhcGhMYXlvdXQ+IHRvIGNyZWF0ZSBhIGhvcml6b250YWwgb3IgdmVydGljYWwgc3RhY2sgb2YgdGhlCisgKiBjaGlsZCB2ZXJ0aWNlcy4gVGhlIGNoaWxkcmVuIGRvIG5vdCBuZWVkIHRvIGJlIGNvbm5lY3RlZCBmb3IgdGhpcyBsYXlvdXQKKyAqIHRvIHdvcmsuCisgKiAKKyAqIEV4YW1wbGU6CisgKiAKKyAqIChjb2RlKQorICogdmFyIGxheW91dCA9IG5ldyBteFN0YWNrTGF5b3V0KGdyYXBoLCB0cnVlKTsKKyAqIGxheW91dC5leGVjdXRlKGdyYXBoLmdldERlZmF1bHRQYXJlbnQoKSk7CisgKiAoZW5kKQorICogCisgKiBDb25zdHJ1Y3RvcjogbXhTdGFja0xheW91dAorICogCisgKiBDb25zdHJ1Y3RzIGEgbmV3IHN0YWNrIGxheW91dCBsYXlvdXQgZm9yIHRoZSBzcGVjaWZpZWQgZ3JhcGgsCisgKiBzcGFjaW5nLCBvcmllbnRhdGlvbiBhbmQgb2Zmc2V0LgorICovCitmdW5jdGlvbiBteFN0YWNrTGF5b3V0KGdyYXBoLCBob3Jpem9udGFsLCBzcGFjaW5nLCB4MCwgeTAsIGJvcmRlcikKK3sKKwlteEdyYXBoTGF5b3V0LmNhbGwodGhpcywgZ3JhcGgpOworCXRoaXMuaG9yaXpvbnRhbCA9IChob3Jpem9udGFsICE9IG51bGwpID8gaG9yaXpvbnRhbCA6IHRydWU7CisJdGhpcy5zcGFjaW5nID0gKHNwYWNpbmcgIT0gbnVsbCkgPyBzcGFjaW5nIDogMDsKKwl0aGlzLngwID0gKHgwICE9IG51bGwpID8geDAgOiAwOworCXRoaXMueTAgPSAoeTAgIT0gbnVsbCkgPyB5MCA6IDA7CisJdGhpcy5ib3JkZXIgPSAoYm9yZGVyICE9IG51bGwpID8gYm9yZGVyIDogMDsKK307CisKKy8qKgorICogRXh0ZW5kcyBteEdyYXBoTGF5b3V0LgorICovCitteFN0YWNrTGF5b3V0LnByb3RvdHlwZSA9IG5ldyBteEdyYXBoTGF5b3V0KCk7CitteFN0YWNrTGF5b3V0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG14U3RhY2tMYXlvdXQ7CisKKy8qKgorICogVmFyaWFibGU6IGhvcml6b250YWwKKyAqCisgKiBTcGVjaWZpZXMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBsYXlvdXQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhTdGFja0xheW91dC5wcm90b3R5cGUuaG9yaXpvbnRhbCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHNwYWNpbmcKKyAqCisgKiBTcGVjaWZpZXMgdGhlIHNwYWNpbmcgYmV0d2VlbiB0aGUgY2VsbHMuIERlZmF1bHQgaXMgMC4KKyAqLworbXhTdGFja0xheW91dC5wcm90b3R5cGUuc3BhY2luZyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHgwCisgKgorICogU3BlY2lmaWVzIHRoZSBob3Jpem9udGFsIG9yaWdpbiBvZiB0aGUgbGF5b3V0LiBEZWZhdWx0IGlzIDAuCisgKi8KK214U3RhY2tMYXlvdXQucHJvdG90eXBlLngwID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogeTAKKyAqCisgKiBTcGVjaWZpZXMgdGhlIHZlcnRpY2FsIG9yaWdpbiBvZiB0aGUgbGF5b3V0LiBEZWZhdWx0IGlzIDAuCisgKi8KK214U3RhY2tMYXlvdXQucHJvdG90eXBlLnkwID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogYm9yZGVyCisgKgorICogQm9yZGVyIHRvIGJlIGFkZGVkIGlmIGZpbGwgaXMgdHJ1ZS4gRGVmYXVsdCBpcyAwLgorICovCitteFN0YWNrTGF5b3V0LnByb3RvdHlwZS5ib3JkZXIgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBtYXJnaW5Ub3AKKyAqIAorICogVG9wIG1hcmdpbiBmb3IgdGhlIGNoaWxkIGFyZWEuIERlZmF1bHQgaXMgMC4KKyAqLworbXhTdGFja0xheW91dC5wcm90b3R5cGUubWFyZ2luVG9wID0gMDsKKworLyoqCisgKiBWYXJpYWJsZTogbWFyZ2luTGVmdAorICogCisgKiBUb3AgbWFyZ2luIGZvciB0aGUgY2hpbGQgYXJlYS4gRGVmYXVsdCBpcyAwLgorICovCitteFN0YWNrTGF5b3V0LnByb3RvdHlwZS5tYXJnaW5MZWZ0ID0gMDsKKworLyoqCisgKiBWYXJpYWJsZTogbWFyZ2luUmlnaHQKKyAqIAorICogVG9wIG1hcmdpbiBmb3IgdGhlIGNoaWxkIGFyZWEuIERlZmF1bHQgaXMgMC4KKyAqLworbXhTdGFja0xheW91dC5wcm90b3R5cGUubWFyZ2luUmlnaHQgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBtYXJnaW5Cb3R0b20KKyAqIAorICogVG9wIG1hcmdpbiBmb3IgdGhlIGNoaWxkIGFyZWEuIERlZmF1bHQgaXMgMC4KKyAqLworbXhTdGFja0xheW91dC5wcm90b3R5cGUubWFyZ2luQm90dG9tID0gMDsKKworLyoqCisgKiBWYXJpYWJsZToga2VlcEZpcnN0TG9jYXRpb24KKyAqIAorICogQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgY2VsbCBzaG91bGQgYmUKKyAqIGtlcHQsIHRoYXQgaXMsIGl0IHdpbGwgbm90IGJlIG1vdmVkIHRvIHgwIG9yIHkwLgorICovCitteFN0YWNrTGF5b3V0LnByb3RvdHlwZS5rZWVwRmlyc3RMb2NhdGlvbiA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBmaWxsCisgKiAKKyAqIEJvb2xlYW4gaW5kaWNhdGluZyBpZiBkaW1lbnNpb24gc2hvdWxkIGJlIGNoYW5nZWQgdG8gZmlsbCBvdXQgdGhlIHBhcmVudAorICogY2VsbC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhTdGFja0xheW91dC5wcm90b3R5cGUuZmlsbCA9IGZhbHNlOworCQorLyoqCisgKiBWYXJpYWJsZTogcmVzaXplUGFyZW50CisgKiAKKyAqIElmIHRoZSBwYXJlbnQgc2hvdWxkIGJlIHJlc2l6ZWQgdG8gbWF0Y2ggdGhlIHdpZHRoL2hlaWdodCBvZiB0aGUKKyAqIHN0YWNrLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteFN0YWNrTGF5b3V0LnByb3RvdHlwZS5yZXNpemVQYXJlbnQgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogcmVzaXplUGFyZW50TWF4CisgKiAKKyAqIFVzZSBtYXhpbXVtIG9mIGV4aXN0aW5nIHZhbHVlIGFuZCBuZXcgdmFsdWUgZm9yIHJlc2l6ZSBvZiBwYXJlbnQuCisgKiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteFN0YWNrTGF5b3V0LnByb3RvdHlwZS5yZXNpemVQYXJlbnRNYXggPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogcmVzaXplTGFzdAorICogCisgKiBJZiB0aGUgbGFzdCBlbGVtZW50IHNob3VsZCBiZSByZXNpemVkIHRvIGZpbGwgb3V0IHRoZSBwYXJlbnQuIERlZmF1bHQgaXMKKyAqIGZhbHNlLiBJZiA8cmVzaXplUGFyZW50PiBpcyB0cnVlIHRoZW4gdGhpcyBpcyBpZ25vcmVkLgorICovCitteFN0YWNrTGF5b3V0LnByb3RvdHlwZS5yZXNpemVMYXN0ID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHdyYXAKKyAqIAorICogVmFsdWUgYXQgd2hpY2ggYSBuZXcgY29sdW1uIG9yIHJvdyBzaG91bGQgYmUgY3JlYXRlZC4gRGVmYXVsdCBpcyBudWxsLgorICovCitteFN0YWNrTGF5b3V0LnByb3RvdHlwZS53cmFwID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogYm9yZGVyQ29sbGFwc2UKKyAqIAorICogSWYgdGhlIHN0cm9rZVdpZHRoIHNob3VsZCBiZSBpZ25vcmVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214U3RhY2tMYXlvdXQucHJvdG90eXBlLmJvcmRlckNvbGxhcHNlID0gdHJ1ZTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNIb3Jpem9udGFsCisgKiAKKyAqIFJldHVybnMgPGhvcml6b250YWw+LgorICovCitteFN0YWNrTGF5b3V0LnByb3RvdHlwZS5pc0hvcml6b250YWwgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuaG9yaXpvbnRhbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdmVDZWxsCisgKiAKKyAqIEltcGxlbWVudHMgPG14R3JhcGhMYXlvdXQubW92ZUNlbGw+LgorICovCitteFN0YWNrTGF5b3V0LnByb3RvdHlwZS5tb3ZlQ2VsbCA9IGZ1bmN0aW9uKGNlbGwsIHgsIHkpCit7CisJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpOworCXZhciBwYXJlbnQgPSBtb2RlbC5nZXRQYXJlbnQoY2VsbCk7CisJdmFyIGhvcml6b250YWwgPSB0aGlzLmlzSG9yaXpvbnRhbCgpOworCQorCWlmIChjZWxsICE9IG51bGwgJiYgcGFyZW50ICE9IG51bGwpCisJeworCQl2YXIgaSA9IDA7CisJCXZhciBsYXN0ID0gMDsKKwkJdmFyIGNoaWxkQ291bnQgPSBtb2RlbC5nZXRDaGlsZENvdW50KHBhcmVudCk7CisJCXZhciB2YWx1ZSA9IChob3Jpem9udGFsKSA/IHggOiB5OworCQl2YXIgcHN0YXRlID0gdGhpcy5ncmFwaC5nZXRWaWV3KCkuZ2V0U3RhdGUocGFyZW50KTsKKworCQlpZiAocHN0YXRlICE9IG51bGwpCisJCXsKKwkJCXZhbHVlIC09IChob3Jpem9udGFsKSA/IHBzdGF0ZS54IDogcHN0YXRlLnk7CisJCX0KKwkJCisJCXZhbHVlIC89IHRoaXMuZ3JhcGgudmlldy5zY2FsZTsKKwkJCisJCWZvciAoaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspCisJCXsKKwkJCXZhciBjaGlsZCA9IG1vZGVsLmdldENoaWxkQXQocGFyZW50LCBpKTsKKwkJCQorCQkJaWYgKGNoaWxkICE9IGNlbGwpCisJCQl7CisJCQkJdmFyIGJvdW5kcyA9IG1vZGVsLmdldEdlb21ldHJ5KGNoaWxkKTsKKwkJCQkKKwkJCQlpZiAoYm91bmRzICE9IG51bGwpCisJCQkJeworCQkJCQl2YXIgdG1wID0gKGhvcml6b250YWwpID8KKwkJCQkJCWJvdW5kcy54ICsgYm91bmRzLndpZHRoIC8gMiA6CisJCQkJCQlib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgLyAyOworCQkJCQkKKwkJCQkJaWYgKGxhc3QgPD0gdmFsdWUgJiYgdG1wID4gdmFsdWUpCisJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCQorCQkJCQlsYXN0ID0gdG1wOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIENoYW5nZXMgY2hpbGQgb3JkZXIgaW4gcGFyZW50CisJCXZhciBpZHggPSBwYXJlbnQuZ2V0SW5kZXgoY2VsbCk7CisJCWlkeCA9IE1hdGgubWF4KDAsIGkgLSAoKGkgPiBpZHgpID8gMSA6IDApKTsKKworCQltb2RlbC5hZGQocGFyZW50LCBjZWxsLCBpZHgpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFBhcmVudFNpemUKKyAqIAorICogUmV0dXJucyB0aGUgc2l6ZSBmb3IgdGhlIHBhcmVudCBjb250YWluZXIgb3IgdGhlIHNpemUgb2YgdGhlIGdyYXBoCisgKiBjb250YWluZXIgaWYgdGhlIHBhcmVudCBpcyBhIGxheWVyIG9yIHRoZSByb290IG9mIHRoZSBtb2RlbC4KKyAqLworbXhTdGFja0xheW91dC5wcm90b3R5cGUuZ2V0UGFyZW50U2l6ZSA9IGZ1bmN0aW9uKHBhcmVudCkKK3sKKwl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCk7CQkJCisJdmFyIHBnZW8gPSBtb2RlbC5nZXRHZW9tZXRyeShwYXJlbnQpOworCQorCS8vIEhhbmRsZXMgc3BlY2lhbCBjYXNlIHdoZXJlIHRoZSBwYXJlbnQgaXMgZWl0aGVyIGEgbGF5ZXIgd2l0aCBubworCS8vIGdlb21ldHJ5IG9yIHRoZSBjdXJyZW50IHJvb3Qgb2YgdGhlIHZpZXcgaW4gd2hpY2ggY2FzZSB0aGUgc2l6ZQorCS8vIG9mIHRoZSBncmFwaCdzIGNvbnRhaW5lciB3aWxsIGJlIHVzZWQuCisJaWYgKHRoaXMuZ3JhcGguY29udGFpbmVyICE9IG51bGwgJiYgKChwZ2VvID09IG51bGwgJiYKKwkJbW9kZWwuaXNMYXllcihwYXJlbnQpKSB8fCBwYXJlbnQgPT0gdGhpcy5ncmFwaC5nZXRWaWV3KCkuY3VycmVudFJvb3QpKQorCXsKKwkJdmFyIHdpZHRoID0gdGhpcy5ncmFwaC5jb250YWluZXIub2Zmc2V0V2lkdGggLSAxOworCQl2YXIgaGVpZ2h0ID0gdGhpcy5ncmFwaC5jb250YWluZXIub2Zmc2V0SGVpZ2h0IC0gMTsKKwkJcGdlbyA9IG5ldyBteFJlY3RhbmdsZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKwl9CisJCisJcmV0dXJuIHBnZW87Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBleGVjdXRlCisgKiAKKyAqIEltcGxlbWVudHMgPG14R3JhcGhMYXlvdXQuZXhlY3V0ZT4uCisgKiAKKyAqIE9ubHkgY2hpbGRyZW4gd2hlcmUgPGlzVmVydGV4SWdub3JlZD4gcmV0dXJucyBmYWxzZSBhcmUgdGFrZW4gaW50bworICogYWNjb3VudC4KKyAqLworbXhTdGFja0xheW91dC5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uKHBhcmVudCkKK3sKKwlpZiAocGFyZW50ICE9IG51bGwpCisJeworCQl2YXIgcGdlbyA9IHRoaXMuZ2V0UGFyZW50U2l6ZShwYXJlbnQpOworCQl2YXIgaG9yaXpvbnRhbCA9IHRoaXMuaXNIb3Jpem9udGFsKCk7CisJCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsJCisJCXZhciBmaWxsVmFsdWUgPSBudWxsOworCQkKKwkJaWYgKHBnZW8gIT0gbnVsbCkKKwkJeworCQkJZmlsbFZhbHVlID0gKGhvcml6b250YWwpID8gcGdlby5oZWlnaHQgLSB0aGlzLm1hcmdpblRvcCAtIHRoaXMubWFyZ2luQm90dG9tIDoKKwkJCQlwZ2VvLndpZHRoIC0gdGhpcy5tYXJnaW5MZWZ0IC0gdGhpcy5tYXJnaW5SaWdodDsKKwkJfQorCQkKKwkJZmlsbFZhbHVlIC09IDIgKiB0aGlzLnNwYWNpbmcgKyAyICogdGhpcy5ib3JkZXI7CisJCXZhciB4MCA9IHRoaXMueDAgKyB0aGlzLmJvcmRlciArIHRoaXMubWFyZ2luTGVmdDsKKwkJdmFyIHkwID0gdGhpcy55MCArIHRoaXMuYm9yZGVyICsgdGhpcy5tYXJnaW5Ub3A7CisJCQorCQkvLyBIYW5kbGVzIHN3aW1sYW5lIHN0YXJ0IHNpemUKKwkJaWYgKHRoaXMuZ3JhcGguaXNTd2ltbGFuZShwYXJlbnQpKQorCQl7CisJCQkvLyBVc2VzIGNvbXB1dGVkIHN0eWxlIHRvIGdldCBsYXRlc3QgCisJCQl2YXIgc3R5bGUgPSB0aGlzLmdyYXBoLmdldENlbGxTdHlsZShwYXJlbnQpOworCQkJdmFyIHN0YXJ0ID0gbXhVdGlscy5nZXROdW1iZXIoc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1NUQVJUU0laRSwgbXhDb25zdGFudHMuREVGQVVMVF9TVEFSVFNJWkUpOworCQkJdmFyIGhvcnogPSBteFV0aWxzLmdldFZhbHVlKHN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9IT1JJWk9OVEFMLCB0cnVlKSA9PSAxOworCisJCQlpZiAocGdlbyAhPSBudWxsKQorCQkJeworCQkJCWlmIChob3J6KQorCQkJCXsKKwkJCQkJc3RhcnQgPSBNYXRoLm1pbihzdGFydCwgcGdlby5oZWlnaHQpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlzdGFydCA9IE1hdGgubWluKHN0YXJ0LCBwZ2VvLndpZHRoKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmIChob3Jpem9udGFsID09IGhvcnopCisJCQl7CisJCQkJZmlsbFZhbHVlIC09IHN0YXJ0OworCQkJfQorCisJCQlpZiAoaG9yeikKKwkJCXsKKwkJCQl5MCArPSBzdGFydDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl4MCArPSBzdGFydDsKKwkJCX0KKwkJfQorCisJCW1vZGVsLmJlZ2luVXBkYXRlKCk7CisJCXRyeQorCQl7CisJCQl2YXIgdG1wID0gMDsKKwkJCXZhciBsYXN0ID0gbnVsbDsKKwkJCXZhciBsYXN0VmFsdWUgPSAwOworCQkJdmFyIGxhc3RDaGlsZCA9IG51bGw7CisJCQl2YXIgY2hpbGRDb3VudCA9IG1vZGVsLmdldENoaWxkQ291bnQocGFyZW50KTsKKwkJCQorCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspCisJCQl7CisJCQkJdmFyIGNoaWxkID0gbW9kZWwuZ2V0Q2hpbGRBdChwYXJlbnQsIGkpOworCQkJCQorCQkJCWlmICghdGhpcy5pc1ZlcnRleElnbm9yZWQoY2hpbGQpICYmIHRoaXMuaXNWZXJ0ZXhNb3ZhYmxlKGNoaWxkKSkKKwkJCQl7CisJCQkJCXZhciBnZW8gPSBtb2RlbC5nZXRHZW9tZXRyeShjaGlsZCk7CisJCQkJCQorCQkJCQlpZiAoZ2VvICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCWdlbyA9IGdlby5jbG9uZSgpOworCQkJCQkJCisJCQkJCQlpZiAodGhpcy53cmFwICE9IG51bGwgJiYgbGFzdCAhPSBudWxsKQorCQkJCQkJeworCQkJCQkJCWlmICgoaG9yaXpvbnRhbCAmJiBsYXN0LnggKyBsYXN0LndpZHRoICsKKwkJCQkJCQkJZ2VvLndpZHRoICsgMiAqIHRoaXMuc3BhY2luZyA+IHRoaXMud3JhcCkgfHwKKwkJCQkJCQkJKCFob3Jpem9udGFsICYmIGxhc3QueSArIGxhc3QuaGVpZ2h0ICsKKwkJCQkJCQkJZ2VvLmhlaWdodCArIDIgKiB0aGlzLnNwYWNpbmcgPiB0aGlzLndyYXApKQorCQkJCQkJCXsKKwkJCQkJCQkJbGFzdCA9IG51bGw7CisJCQkJCQkJCQorCQkJCQkJCQlpZiAoaG9yaXpvbnRhbCkKKwkJCQkJCQkJeworCQkJCQkJCQkJeTAgKz0gdG1wICsgdGhpcy5zcGFjaW5nOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UKKwkJCQkJCQkJeworCQkJCQkJCQkJeDAgKz0gdG1wICsgdGhpcy5zcGFjaW5nOworCQkJCQkJCQl9CisJCQkJCQkJCQorCQkJCQkJCQl0bXAgPSAwOworCQkJCQkJCX0JCisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCXRtcCA9IE1hdGgubWF4KHRtcCwgKGhvcml6b250YWwpID8gZ2VvLmhlaWdodCA6IGdlby53aWR0aCk7CisJCQkJCQl2YXIgc3cgPSAwOworCQkJCQkJCisJCQkJCQlpZiAoIXRoaXMuYm9yZGVyQ29sbGFwc2UpCisJCQkJCQl7CisJCQkJCQkJdmFyIGNoaWxkU3R5bGUgPSB0aGlzLmdyYXBoLmdldENlbGxTdHlsZShjaGlsZCk7CisJCQkJCQkJc3cgPSBteFV0aWxzLmdldE51bWJlcihjaGlsZFN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9TVFJPS0VXSURUSCwgMSk7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWlmIChsYXN0ICE9IG51bGwpCisJCQkJCQl7CisJCQkJCQkJaWYgKGhvcml6b250YWwpCisJCQkJCQkJeworCQkJCQkJCQlnZW8ueCA9IGxhc3RWYWx1ZSArIHRoaXMuc3BhY2luZyArIE1hdGguZmxvb3Ioc3cgLyAyKTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJZ2VvLnkgPSBsYXN0VmFsdWUgKyB0aGlzLnNwYWNpbmcgKyBNYXRoLmZsb29yKHN3IC8gMik7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoIXRoaXMua2VlcEZpcnN0TG9jYXRpb24pCisJCQkJCQl7CisJCQkJCQkJaWYgKGhvcml6b250YWwpCisJCQkJCQkJeworCQkJCQkJCQlnZW8ueCA9IHgwOworCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlnZW8ueSA9IHkwOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJaWYgKGhvcml6b250YWwpCisJCQkJCQl7CisJCQkJCQkJZ2VvLnkgPSB5MDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlnZW8ueCA9IHgwOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlpZiAodGhpcy5maWxsICYmIGZpbGxWYWx1ZSAhPSBudWxsKQorCQkJCQkJeworCQkJCQkJCWlmIChob3Jpem9udGFsKQorCQkJCQkJCXsKKwkJCQkJCQkJZ2VvLmhlaWdodCA9IGZpbGxWYWx1ZTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJZ2VvLndpZHRoID0gZmlsbFZhbHVlOwkJCQkJCQkJCQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJdGhpcy5zZXRDaGlsZEdlb21ldHJ5KGNoaWxkLCBnZW8pOworCQkJCQkJbGFzdENoaWxkID0gY2hpbGQ7CisJCQkJCQlsYXN0ID0gZ2VvOworCQkJCQkJCisJCQkJCQlpZiAoaG9yaXpvbnRhbCkKKwkJCQkJCXsKKwkJCQkJCQlsYXN0VmFsdWUgPSBsYXN0LnggKyBsYXN0LndpZHRoICsgTWF0aC5mbG9vcihzdyAvIDIpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWxhc3RWYWx1ZSA9IGxhc3QueSArIGxhc3QuaGVpZ2h0ICsgTWF0aC5mbG9vcihzdyAvIDIpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAodGhpcy5yZXNpemVQYXJlbnQgJiYgcGdlbyAhPSBudWxsICYmIGxhc3QgIT0gbnVsbCAmJiAhdGhpcy5ncmFwaC5pc0NlbGxDb2xsYXBzZWQocGFyZW50KSkKKwkJCXsKKwkJCQl0aGlzLnVwZGF0ZVBhcmVudEdlb21ldHJ5KHBhcmVudCwgcGdlbywgbGFzdCk7CisJCQl9CisJCQllbHNlIGlmICh0aGlzLnJlc2l6ZUxhc3QgJiYgcGdlbyAhPSBudWxsICYmIGxhc3QgIT0gbnVsbCAmJiBsYXN0Q2hpbGQgIT0gbnVsbCkKKwkJCXsKKwkJCQlpZiAoaG9yaXpvbnRhbCkKKwkJCQl7CisJCQkJCWxhc3Qud2lkdGggPSBwZ2VvLndpZHRoIC0gbGFzdC54IC0gdGhpcy5zcGFjaW5nIC0gdGhpcy5tYXJnaW5SaWdodCAtIHRoaXMubWFyZ2luTGVmdDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbGFzdC5oZWlnaHQgPSBwZ2VvLmhlaWdodCAtIGxhc3QueSAtIHRoaXMuc3BhY2luZyAtIHRoaXMubWFyZ2luQm90dG9tOworCQkJCX0KKwkJCQkKKwkJCQl0aGlzLnNldENoaWxkR2VvbWV0cnkobGFzdENoaWxkLCBsYXN0KTsKKwkJCX0KKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCW1vZGVsLmVuZFVwZGF0ZSgpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZXhlY3V0ZQorICogCisgKiBJbXBsZW1lbnRzIDxteEdyYXBoTGF5b3V0LmV4ZWN1dGU+LgorICogCisgKiBPbmx5IGNoaWxkcmVuIHdoZXJlIDxpc1ZlcnRleElnbm9yZWQ+IHJldHVybnMgZmFsc2UgYXJlIHRha2VuIGludG8KKyAqIGFjY291bnQuCisgKi8KK214U3RhY2tMYXlvdXQucHJvdG90eXBlLnNldENoaWxkR2VvbWV0cnkgPSBmdW5jdGlvbihjaGlsZCwgZ2VvKQoreworCXZhciBnZW8yID0gdGhpcy5ncmFwaC5nZXRDZWxsR2VvbWV0cnkoY2hpbGQpOworCQorCWlmIChnZW8yID09IG51bGwgfHwgZ2VvLnggIT0gZ2VvMi54IHx8IGdlby55ICE9IGdlbzIueSB8fAorCQlnZW8ud2lkdGggIT0gZ2VvMi53aWR0aCB8fCBnZW8uaGVpZ2h0ICE9IGdlbzIuaGVpZ2h0KQorCXsKKwkJdGhpcy5ncmFwaC5nZXRNb2RlbCgpLnNldEdlb21ldHJ5KGNoaWxkLCBnZW8pOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGV4ZWN1dGUKKyAqIAorICogSW1wbGVtZW50cyA8bXhHcmFwaExheW91dC5leGVjdXRlPi4KKyAqIAorICogT25seSBjaGlsZHJlbiB3aGVyZSA8aXNWZXJ0ZXhJZ25vcmVkPiByZXR1cm5zIGZhbHNlIGFyZSB0YWtlbiBpbnRvCisgKiBhY2NvdW50LgorICovCitteFN0YWNrTGF5b3V0LnByb3RvdHlwZS51cGRhdGVQYXJlbnRHZW9tZXRyeSA9IGZ1bmN0aW9uKHBhcmVudCwgcGdlbywgbGFzdCkKK3sKKwl2YXIgaG9yaXpvbnRhbCA9IHRoaXMuaXNIb3Jpem9udGFsKCk7CisJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpOwkKKworCXZhciBwZ2VvMiA9IHBnZW8uY2xvbmUoKTsKKwkKKwlpZiAoaG9yaXpvbnRhbCkKKwl7CisJCXZhciB0bXAgPSBsYXN0LnggKyBsYXN0LndpZHRoICsgdGhpcy5zcGFjaW5nICsgdGhpcy5tYXJnaW5SaWdodDsKKwkJCisJCWlmICh0aGlzLnJlc2l6ZVBhcmVudE1heCkKKwkJeworCQkJcGdlbzIud2lkdGggPSBNYXRoLm1heChwZ2VvMi53aWR0aCwgdG1wKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBnZW8yLndpZHRoID0gdG1wOworCQl9CisJfQorCWVsc2UKKwl7CisJCXZhciB0bXAgPSBsYXN0LnkgKyBsYXN0LmhlaWdodCArIHRoaXMuc3BhY2luZyArIHRoaXMubWFyZ2luQm90dG9tOworCQkKKwkJaWYgKHRoaXMucmVzaXplUGFyZW50TWF4KQorCQl7CisJCQlwZ2VvMi5oZWlnaHQgPSBNYXRoLm1heChwZ2VvMi5oZWlnaHQsIHRtcCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwZ2VvMi5oZWlnaHQgPSB0bXA7CisJCX0KKwl9CisJCisJaWYgKHBnZW8ueCAhPSBwZ2VvMi54IHx8IHBnZW8ueSAhPSBwZ2VvMi55IHx8CisJCXBnZW8ud2lkdGggIT0gcGdlbzIud2lkdGggfHwgcGdlby5oZWlnaHQgIT0gcGdlbzIuaGVpZ2h0KQorCXsKKwkJbW9kZWwuc2V0R2VvbWV0cnkocGFyZW50LCBwZ2VvMik7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9tb2RlbC9teENlbGwuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbW9kZWwvbXhDZWxsLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZTk0YmEKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbW9kZWwvbXhDZWxsLmpzCkBAIC0wLDAgKzEsODI1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteENlbGwKKyAqCisgKiBDZWxscyBhcmUgdGhlIGVsZW1lbnRzIG9mIHRoZSBncmFwaCBtb2RlbC4gVGhleSByZXByZXNlbnQgdGhlIHN0YXRlCisgKiBvZiB0aGUgZ3JvdXBzLCB2ZXJ0aWNlcyBhbmQgZWRnZXMgaW4gYSBncmFwaC4KKyAqIAorICogQ3VzdG9tIGF0dHJpYnV0ZXM6CisgKiAKKyAqIEZvciBjdXN0b20gYXR0cmlidXRlcyB3ZSByZWNvbW1lbmQgdXNpbmcgYW4gWE1MIG5vZGUgYXMgdGhlIHZhbHVlIG9mIGEgY2VsbC4KKyAqIFRoZSBmb2xsb3dpbmcgY29kZSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBjZWxsIHdpdGggYW4gWE1MIG5vZGUgYXMgdGhlCisgKiB2YWx1ZToKKyAqIAorICogKGNvZGUpCisgKiB2YXIgZG9jID0gbXhVdGlscy5jcmVhdGVYbWxEb2N1bWVudCgpOworICogdmFyIG5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudCgnTXlOb2RlJykKKyAqIG5vZGUuc2V0QXR0cmlidXRlKCdsYWJlbCcsICdNeUxhYmVsJyk7CisgKiBub2RlLnNldEF0dHJpYnV0ZSgnYXR0cmlidXRlMScsICd2YWx1ZTEnKTsKKyAqIGdyYXBoLmluc2VydFZlcnRleChncmFwaC5nZXREZWZhdWx0UGFyZW50KCksIG51bGwsIG5vZGUsIDQwLCA0MCwgODAsIDMwKTsKKyAqIChlbmQpCisgKiAKKyAqIEZvciB0aGUgbGFiZWwgdG8gd29yaywgPG14R3JhcGguY29udmVydFZhbHVlVG9TdHJpbmc+IGFuZAorICogPG14R3JhcGguY2VsbExhYmVsQ2hhbmdlZD4gc2hvdWxkIGJlIG92ZXJyaWRkZW4gYXMgZm9sbG93czoKKyAqIAorICogKGNvZGUpCisgKiBncmFwaC5jb252ZXJ0VmFsdWVUb1N0cmluZyA9IGZ1bmN0aW9uKGNlbGwpCisgKiB7CisgKiAgIGlmIChteFV0aWxzLmlzTm9kZShjZWxsLnZhbHVlKSkKKyAqICAgeworICogICAgIHJldHVybiBjZWxsLmdldEF0dHJpYnV0ZSgnbGFiZWwnLCAnJykKKyAqICAgfQorICogfTsKKyAqIAorICogdmFyIGNlbGxMYWJlbENoYW5nZWQgPSBncmFwaC5jZWxsTGFiZWxDaGFuZ2VkOworICogZ3JhcGguY2VsbExhYmVsQ2hhbmdlZCA9IGZ1bmN0aW9uKGNlbGwsIG5ld1ZhbHVlLCBhdXRvU2l6ZSkKKyAqIHsKKyAqICAgaWYgKG14VXRpbHMuaXNOb2RlKGNlbGwudmFsdWUpKQorICogICB7CisgKiAgICAgLy8gQ2xvbmVzIHRoZSB2YWx1ZSBmb3IgY29ycmVjdCB1bmRvL3JlZG8KKyAqICAgICB2YXIgZWx0ID0gY2VsbC52YWx1ZS5jbG9uZU5vZGUodHJ1ZSk7CisgKiAgICAgZWx0LnNldEF0dHJpYnV0ZSgnbGFiZWwnLCBuZXdWYWx1ZSk7CisgKiAgICAgbmV3VmFsdWUgPSBlbHQ7CisgKiAgIH0KKyAqICAgCisgKiAgIGNlbGxMYWJlbENoYW5nZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAqIH07CisgKiAoZW5kKQorICogCisgKiBDYWxsYmFjazogb25Jbml0CisgKgorICogQ2FsbGVkIGZyb20gd2l0aGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAqIAorICogQ29uc3RydWN0b3I6IG14Q2VsbAorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgY2VsbCB0byBiZSB1c2VkIGluIGEgZ3JhcGggbW9kZWwuCisgKiBUaGlzIG1ldGhvZCBpbnZva2VzIDxvbkluaXQ+IHVwb24gY29tcGxldGlvbi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBPcHRpb25hbCBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBjZWxsIHZhbHVlLgorICogZ2VvbWV0cnkgLSBPcHRpb25hbCA8bXhHZW9tZXRyeT4gdGhhdCBzcGVjaWZpZXMgdGhlIGdlb21ldHJ5LgorICogc3R5bGUgLSBPcHRpb25hbCBmb3JtYXR0ZWQgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgc3R5bGUuCisgKi8KK2Z1bmN0aW9uIG14Q2VsbCh2YWx1ZSwgZ2VvbWV0cnksIHN0eWxlKQoreworCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl0aGlzLnNldEdlb21ldHJ5KGdlb21ldHJ5KTsKKwl0aGlzLnNldFN0eWxlKHN0eWxlKTsKKwkKKwlpZiAodGhpcy5vbkluaXQgIT0gbnVsbCkKKwl7CisJCXRoaXMub25Jbml0KCk7CisJfQorfTsKKworLyoqCisgKiBWYXJpYWJsZTogaWQKKyAqCisgKiBIb2xkcyB0aGUgSWQuIERlZmF1bHQgaXMgbnVsbC4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5pZCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHZhbHVlCisgKgorICogSG9sZHMgdGhlIHVzZXIgb2JqZWN0LiBEZWZhdWx0IGlzIG51bGwuCisgKi8KK214Q2VsbC5wcm90b3R5cGUudmFsdWUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBnZW9tZXRyeQorICoKKyAqIEhvbGRzIHRoZSA8bXhHZW9tZXRyeT4uIERlZmF1bHQgaXMgbnVsbC4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5nZW9tZXRyeSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHN0eWxlCisgKgorICogSG9sZHMgdGhlIHN0eWxlIGFzIGEgc3RyaW5nIG9mIHRoZSBmb3JtIFsoc3R5bGVuYW1lfGtleT12YWx1ZSk7XS4gRGVmYXVsdCBpcworICogbnVsbC4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5zdHlsZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHZlcnRleAorICoKKyAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBjZWxsIGlzIGEgdmVydGV4LiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteENlbGwucHJvdG90eXBlLnZlcnRleCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBlZGdlCisgKgorICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNlbGwgaXMgYW4gZWRnZS4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5lZGdlID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGNvbm5lY3RhYmxlCisgKgorICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNlbGwgaXMgY29ubmVjdGFibGUuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5jb25uZWN0YWJsZSA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHZpc2libGUKKyAqCisgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgY2VsbCBpcyB2aXNpYmxlLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214Q2VsbC5wcm90b3R5cGUudmlzaWJsZSA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGNvbGxhcHNlZAorICoKKyAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBjZWxsIGlzIGNvbGxhcHNlZC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5jb2xsYXBzZWQgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogcGFyZW50CisgKgorICogUmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgY2VsbC4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5wYXJlbnQgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzb3VyY2UKKyAqCisgKiBSZWZlcmVuY2UgdG8gdGhlIHNvdXJjZSB0ZXJtaW5hbC4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5zb3VyY2UgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB0YXJnZXQKKyAqCisgKiBSZWZlcmVuY2UgdG8gdGhlIHRhcmdldCB0ZXJtaW5hbC4KKyAqLworbXhDZWxsLnByb3RvdHlwZS50YXJnZXQgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjaGlsZHJlbgorICoKKyAqIEhvbGRzIHRoZSBjaGlsZCBjZWxscy4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5jaGlsZHJlbiA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGVkZ2VzCisgKgorICogSG9sZHMgdGhlIGVkZ2VzLgorICovCitteENlbGwucHJvdG90eXBlLmVkZ2VzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbXhUcmFuc2llbnQKKyAqCisgKiBMaXN0IG9mIG1lbWJlcnMgdGhhdCBzaG91bGQgbm90IGJlIGNsb25lZCBpbnNpZGUgPGNsb25lPi4gVGhpcyBmaWVsZCBpcworICogcGFzc2VkIHRvIDxteFV0aWxzLmNsb25lPiBhbmQgaXMgbm90IG1hZGUgcGVyc2lzdGVudCBpbiA8bXhDZWxsQ29kZWM+LgorICogVGhpcyBpcyBub3QgYSBjb252ZW50aW9uIGZvciBhbGwgY2xhc3NlcywgaXQgaXMgb25seSB1c2VkIGluIHRoaXMgY2xhc3MKKyAqIHRvIG1hcmsgdHJhbnNpZW50IGZpZWxkcyBzaW5jZSB0cmFuc2llbnQgbW9kaWZpZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5CisgKiB0aGUgbGFuZ3VhZ2UuCisgKi8KK214Q2VsbC5wcm90b3R5cGUubXhUcmFuc2llbnQgPSBbJ2lkJywgJ3ZhbHVlJywgJ3BhcmVudCcsICdzb3VyY2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGFyZ2V0JywgJ2NoaWxkcmVuJywgJ2VkZ2VzJ107CisKKy8qKgorICogRnVuY3Rpb246IGdldElkCisgKgorICogUmV0dXJucyB0aGUgSWQgb2YgdGhlIGNlbGwgYXMgYSBzdHJpbmcuCisgKi8KK214Q2VsbC5wcm90b3R5cGUuZ2V0SWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuaWQ7Cit9OworCQkKKy8qKgorICogRnVuY3Rpb246IHNldElkCisgKgorICogU2V0cyB0aGUgSWQgb2YgdGhlIGNlbGwgdG8gdGhlIGdpdmVuIHN0cmluZy4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5zZXRJZCA9IGZ1bmN0aW9uKGlkKQoreworCXRoaXMuaWQgPSBpZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFZhbHVlCisgKgorICogUmV0dXJucyB0aGUgdXNlciBvYmplY3Qgb2YgdGhlIGNlbGwuIFRoZSB1c2VyCisgKiBvYmplY3QgaXMgc3RvcmVkIGluIDx2YWx1ZT4uCisgKi8KK214Q2VsbC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMudmFsdWU7Cit9OworCQkKKy8qKgorICogRnVuY3Rpb246IHNldFZhbHVlCisgKgorICogU2V0cyB0aGUgdXNlciBvYmplY3Qgb2YgdGhlIGNlbGwuIFRoZSB1c2VyIG9iamVjdAorICogaXMgc3RvcmVkIGluIDx2YWx1ZT4uCisgKi8KK214Q2VsbC5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLnZhbHVlID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB2YWx1ZUNoYW5nZWQKKyAqCisgKiBDaGFuZ2VzIHRoZSB1c2VyIG9iamVjdCBhZnRlciBhbiBpbi1wbGFjZSBlZGl0CisgKiBhbmQgcmV0dXJucyB0aGUgcHJldmlvdXMgdmFsdWUuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIHJlcGxhY2VzIHRoZSB1c2VyIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB2YWx1ZSBhbmQKKyAqIHJldHVybnMgdGhlIG9sZCB1c2VyIG9iamVjdC4KKyAqLworbXhDZWxsLnByb3RvdHlwZS52YWx1ZUNoYW5nZWQgPSBmdW5jdGlvbihuZXdWYWx1ZSkKK3sKKwl2YXIgcHJldmlvdXMgPSB0aGlzLmdldFZhbHVlKCk7CisJdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7CisJCisJcmV0dXJuIHByZXZpb3VzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0R2VvbWV0cnkKKyAqCisgKiBSZXR1cm5zIHRoZSA8bXhHZW9tZXRyeT4gdGhhdCBkZXNjcmliZXMgdGhlIDxnZW9tZXRyeT4uCisgKi8KK214Q2VsbC5wcm90b3R5cGUuZ2V0R2VvbWV0cnkgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuZ2VvbWV0cnk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRHZW9tZXRyeQorICoKKyAqIFNldHMgdGhlIDxteEdlb21ldHJ5PiB0byBiZSB1c2VkIGFzIHRoZSA8Z2VvbWV0cnk+LgorICovCitteENlbGwucHJvdG90eXBlLnNldEdlb21ldHJ5ID0gZnVuY3Rpb24oZ2VvbWV0cnkpCit7CisJdGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0U3R5bGUKKyAqCisgKiBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSA8c3R5bGU+LgorICovCitteENlbGwucHJvdG90eXBlLmdldFN0eWxlID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLnN0eWxlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0U3R5bGUKKyAqCisgKiBTZXRzIHRoZSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgPHN0eWxlPi4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5zZXRTdHlsZSA9IGZ1bmN0aW9uKHN0eWxlKQoreworCXRoaXMuc3R5bGUgPSBzdHlsZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzVmVydGV4CisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBjZWxsIGlzIGEgdmVydGV4LgorICovCitteENlbGwucHJvdG90eXBlLmlzVmVydGV4ID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLnZlcnRleCAhPSAwOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0VmVydGV4CisgKgorICogU3BlY2lmaWVzIGlmIHRoZSBjZWxsIGlzIGEgdmVydGV4LiBUaGlzIHNob3VsZCBvbmx5IGJlIGFzc2lnbmVkIGF0CisgKiBjb25zdHJ1Y3Rpb24gb2YgdGhlIGNlbGwgYW5kIG5vdCBiZSBjaGFuZ2VkIGR1cmluZyBpdHMgbGlmZWN5Y2xlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2ZXJ0ZXggLSBCb29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIHRoZSBjZWxsIGlzIGEgdmVydGV4LgorICovCitteENlbGwucHJvdG90eXBlLnNldFZlcnRleCA9IGZ1bmN0aW9uKHZlcnRleCkKK3sKKwl0aGlzLnZlcnRleCA9IHZlcnRleDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzRWRnZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2VsbCBpcyBhbiBlZGdlLgorICovCitteENlbGwucHJvdG90eXBlLmlzRWRnZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5lZGdlICE9IDA7Cit9OworCQorLyoqCisgKiBGdW5jdGlvbjogc2V0RWRnZQorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIGNlbGwgaXMgYW4gZWRnZS4gVGhpcyBzaG91bGQgb25seSBiZSBhc3NpZ25lZCBhdAorICogY29uc3RydWN0aW9uIG9mIHRoZSBjZWxsIGFuZCBub3QgYmUgY2hhbmdlZCBkdXJpbmcgaXRzIGxpZmVjeWNsZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZWRnZSAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIGNlbGwgaXMgYW4gZWRnZS4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5zZXRFZGdlID0gZnVuY3Rpb24oZWRnZSkKK3sKKwl0aGlzLmVkZ2UgPSBlZGdlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDb25uZWN0YWJsZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2VsbCBpcyBjb25uZWN0YWJsZS4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5pc0Nvbm5lY3RhYmxlID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmNvbm5lY3RhYmxlICE9IDA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRDb25uZWN0YWJsZQorICoKKyAqIFNldHMgdGhlIGNvbm5lY3RhYmxlIHN0YXRlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjb25uZWN0YWJsZSAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgdGhlIG5ldyBjb25uZWN0YWJsZSBzdGF0ZS4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5zZXRDb25uZWN0YWJsZSA9IGZ1bmN0aW9uKGNvbm5lY3RhYmxlKQoreworCXRoaXMuY29ubmVjdGFibGUgPSBjb25uZWN0YWJsZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzVmlzaWJsZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2VsbCBpcyB2aXNpYmlsZS4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5pc1Zpc2libGUgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMudmlzaWJsZSAhPSAwOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0VmlzaWJsZQorICoKKyAqIFNwZWNpZmllcyBpZiB0aGUgY2VsbCBpcyB2aXNpYmxlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2aXNpYmxlIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyB0aGUgbmV3IHZpc2libGUgc3RhdGUuCisgKi8KK214Q2VsbC5wcm90b3R5cGUuc2V0VmlzaWJsZSA9IGZ1bmN0aW9uKHZpc2libGUpCit7CisJdGhpcy52aXNpYmxlID0gdmlzaWJsZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQ29sbGFwc2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBjZWxsIGlzIGNvbGxhcHNlZC4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5pc0NvbGxhcHNlZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5jb2xsYXBzZWQgIT0gMDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldENvbGxhcHNlZAorICoKKyAqIFNldHMgdGhlIGNvbGxhcHNlZCBzdGF0ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY29sbGFwc2VkIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyB0aGUgbmV3IGNvbGxhcHNlZCBzdGF0ZS4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5zZXRDb2xsYXBzZWQgPSBmdW5jdGlvbihjb2xsYXBzZWQpCit7CisJdGhpcy5jb2xsYXBzZWQgPSBjb2xsYXBzZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRQYXJlbnQKKyAqCisgKiBSZXR1cm5zIHRoZSBjZWxsJ3MgcGFyZW50LgorICovCitteENlbGwucHJvdG90eXBlLmdldFBhcmVudCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5wYXJlbnQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRQYXJlbnQKKyAqCisgKiBTZXRzIHRoZSBwYXJlbnQgY2VsbC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogcGFyZW50IC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBuZXcgcGFyZW50LgorICovCitteENlbGwucHJvdG90eXBlLnNldFBhcmVudCA9IGZ1bmN0aW9uKHBhcmVudCkKK3sKKwl0aGlzLnBhcmVudCA9IHBhcmVudDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFRlcm1pbmFsCisgKgorICogUmV0dXJucyB0aGUgc291cmNlIG9yIHRhcmdldCB0ZXJtaW5hbC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc291cmNlIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgc291cmNlIHRlcm1pbmFsIHNob3VsZCBiZQorICogcmV0dXJuZWQuCisgKi8KK214Q2VsbC5wcm90b3R5cGUuZ2V0VGVybWluYWwgPSBmdW5jdGlvbihzb3VyY2UpCit7CisJcmV0dXJuIChzb3VyY2UpID8gdGhpcy5zb3VyY2UgOiB0aGlzLnRhcmdldDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFRlcm1pbmFsCisgKgorICogU2V0cyB0aGUgc291cmNlIG9yIHRhcmdldCB0ZXJtaW5hbCBhbmQgcmV0dXJucyB0aGUgbmV3IHRlcm1pbmFsLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB0ZXJtaW5hbCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgbmV3IHNvdXJjZSBvciB0YXJnZXQgdGVybWluYWwuCisgKiBpc1NvdXJjZSAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIHNvdXJjZSBvciB0YXJnZXQgdGVybWluYWwKKyAqIHNob3VsZCBiZSBzZXQuCisgKi8KK214Q2VsbC5wcm90b3R5cGUuc2V0VGVybWluYWwgPSBmdW5jdGlvbih0ZXJtaW5hbCwgaXNTb3VyY2UpCit7CisJaWYgKGlzU291cmNlKQorCXsKKwkJdGhpcy5zb3VyY2UgPSB0ZXJtaW5hbDsKKwl9CisJZWxzZQorCXsKKwkJdGhpcy50YXJnZXQgPSB0ZXJtaW5hbDsKKwl9CisJCisJcmV0dXJuIHRlcm1pbmFsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q2hpbGRDb3VudAorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGlsZCBjZWxscy4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5nZXRDaGlsZENvdW50ID0gZnVuY3Rpb24oKQoreworCXJldHVybiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSA/IDAgOiB0aGlzLmNoaWxkcmVuLmxlbmd0aDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEluZGV4CisgKgorICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBpbiB0aGUgY2hpbGQgYXJyYXkuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNoaWxkIC0gQ2hpbGQgd2hvc2UgaW5kZXggc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteENlbGwucHJvdG90eXBlLmdldEluZGV4ID0gZnVuY3Rpb24oY2hpbGQpCit7CisJcmV0dXJuIG14VXRpbHMuaW5kZXhPZih0aGlzLmNoaWxkcmVuLCBjaGlsZCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDaGlsZEF0CisgKgorICogUmV0dXJucyB0aGUgY2hpbGQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogaW5kZXggLSBJbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSBjaGlsZCB0byBiZSByZXR1cm5lZC4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5nZXRDaGlsZEF0ID0gZnVuY3Rpb24oaW5kZXgpCit7CisJcmV0dXJuICh0aGlzLmNoaWxkcmVuID09IG51bGwpID8gbnVsbCA6IHRoaXMuY2hpbGRyZW5baW5kZXhdOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaW5zZXJ0CisgKgorICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIGNoaWxkIGludG8gdGhlIGNoaWxkIGFycmF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKKyAqIGFuZCB1cGRhdGVzIHRoZSBwYXJlbnQgcmVmZXJlbmNlIG9mIHRoZSBjaGlsZC4gSWYgbm90IGNoaWxkSW5kZXggaXMKKyAqIHNwZWNpZmllZCB0aGVuIHRoZSBjaGlsZCBpcyBhcHBlbmRlZCB0byB0aGUgY2hpbGQgYXJyYXkuIFJldHVybnMgdGhlCisgKiBpbnNlcnRlZCBjaGlsZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2hpbGQgLSA8bXhDZWxsPiB0byBiZSBpbnNlcnRlZCBvciBhcHBlbmRlZCB0byB0aGUgY2hpbGQgYXJyYXkuCisgKiBpbmRleCAtIE9wdGlvbmFsIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBjaGlsZAorICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIGNoaWxkIGFycmF5LgorICovCitteENlbGwucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uKGNoaWxkLCBpbmRleCkKK3sKKwlpZiAoY2hpbGQgIT0gbnVsbCkKKwl7CisJCWlmIChpbmRleCA9PSBudWxsKQorCQl7CisJCQlpbmRleCA9IHRoaXMuZ2V0Q2hpbGRDb3VudCgpOworCQkJCisJCQlpZiAoY2hpbGQuZ2V0UGFyZW50KCkgPT0gdGhpcykKKwkJCXsKKwkJCQlpbmRleC0tOworCQkJfQorCQl9CisKKwkJY2hpbGQucmVtb3ZlRnJvbVBhcmVudCgpOworCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7CisJCQorCQlpZiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKQorCQl7CisJCQl0aGlzLmNoaWxkcmVuID0gW107CisJCQl0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpOworCQl9CisJCWVsc2UKKwkJeworCQkJdGhpcy5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDAsIGNoaWxkKTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gY2hpbGQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZW1vdmUKKyAqCisgKiBSZW1vdmVzIHRoZSBjaGlsZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIGNoaWxkIGFycmF5IGFuZAorICogcmV0dXJucyB0aGUgY2hpbGQgdGhhdCB3YXMgcmVtb3ZlZC4gV2lsbCByZW1vdmUgdGhlIHBhcmVudCByZWZlcmVuY2Ugb2YKKyAqIHRoZSBjaGlsZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogaW5kZXggLSBJbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSBpbmRleCBvZiB0aGUgY2hpbGQgdG8gYmUKKyAqIHJlbW92ZWQuCisgKi8KK214Q2VsbC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oaW5kZXgpCit7CisJdmFyIGNoaWxkID0gbnVsbDsKKwkKKwlpZiAodGhpcy5jaGlsZHJlbiAhPSBudWxsICYmIGluZGV4ID49IDApCisJeworCQljaGlsZCA9IHRoaXMuZ2V0Q2hpbGRBdChpbmRleCk7CisJCQorCQlpZiAoY2hpbGQgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5jaGlsZHJlbi5zcGxpY2UoaW5kZXgsIDEpOworCQkJY2hpbGQuc2V0UGFyZW50KG51bGwpOworCQl9CisJfQorCQorCXJldHVybiBjaGlsZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlbW92ZUZyb21QYXJlbnQKKyAqCisgKiBSZW1vdmVzIHRoZSBjZWxsIGZyb20gaXRzIHBhcmVudC4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5yZW1vdmVGcm9tUGFyZW50ID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKQorCXsKKwkJdmFyIGluZGV4ID0gdGhpcy5wYXJlbnQuZ2V0SW5kZXgodGhpcyk7CisJCXRoaXMucGFyZW50LnJlbW92ZShpbmRleCk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0RWRnZUNvdW50CisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVkZ2VzIGluIHRoZSBlZGdlIGFycmF5LgorICovCitteENlbGwucHJvdG90eXBlLmdldEVkZ2VDb3VudCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gKHRoaXMuZWRnZXMgPT0gbnVsbCkgPyAwIDogdGhpcy5lZGdlcy5sZW5ndGg7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRFZGdlSW5kZXgKKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGVkZ2UgaW4gPGVkZ2VzPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZWRnZSAtIDxteENlbGw+IHdob3NlIGluZGV4IGluIDxlZGdlcz4gc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteENlbGwucHJvdG90eXBlLmdldEVkZ2VJbmRleCA9IGZ1bmN0aW9uKGVkZ2UpCit7CisJcmV0dXJuIG14VXRpbHMuaW5kZXhPZih0aGlzLmVkZ2VzLCBlZGdlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEVkZ2VBdAorICoKKyAqIFJldHVybnMgdGhlIGVkZ2UgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBpbiA8ZWRnZXM+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBpbmRleCAtIEludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIGluZGV4IG9mIHRoZSBlZGdlIHRvIGJlIHJldHVybmVkLgorICovCitteENlbGwucHJvdG90eXBlLmdldEVkZ2VBdCA9IGZ1bmN0aW9uKGluZGV4KQoreworCXJldHVybiAodGhpcy5lZGdlcyA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmVkZ2VzW2luZGV4XTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGluc2VydEVkZ2UKKyAqCisgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgZWRnZSBpbnRvIHRoZSBlZGdlIGFycmF5IGFuZCByZXR1cm5zIHRoZSBlZGdlLgorICogV2lsbCB1cGRhdGUgdGhlIHJlc3BlY3RpdmUgdGVybWluYWwgcmVmZXJlbmNlIG9mIHRoZSBlZGdlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbD4gdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgZWRnZSBhcnJheS4KKyAqIGlzT3V0Z29pbmcgLSBCb29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIHRoZSBlZGdlIGlzIG91dGdvaW5nLgorICovCitteENlbGwucHJvdG90eXBlLmluc2VydEVkZ2UgPSBmdW5jdGlvbihlZGdlLCBpc091dGdvaW5nKQoreworCWlmIChlZGdlICE9IG51bGwpCisJeworCQllZGdlLnJlbW92ZUZyb21UZXJtaW5hbChpc091dGdvaW5nKTsKKwkJZWRnZS5zZXRUZXJtaW5hbCh0aGlzLCBpc091dGdvaW5nKTsKKwkJCisJCWlmICh0aGlzLmVkZ2VzID09IG51bGwgfHwKKwkJCWVkZ2UuZ2V0VGVybWluYWwoIWlzT3V0Z29pbmcpICE9IHRoaXMgfHwKKwkJCW14VXRpbHMuaW5kZXhPZih0aGlzLmVkZ2VzLCBlZGdlKSA8IDApCisJCXsKKwkJCWlmICh0aGlzLmVkZ2VzID09IG51bGwpCisJCQl7CisJCQkJdGhpcy5lZGdlcyA9IFtdOworCQkJfQorCQkJCisJCQl0aGlzLmVkZ2VzLnB1c2goZWRnZSk7CisJCX0KKwl9CisJCisJcmV0dXJuIGVkZ2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZW1vdmVFZGdlCisgKgorICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGVkZ2UgZnJvbSB0aGUgZWRnZSBhcnJheSBhbmQgcmV0dXJucyB0aGUgZWRnZS4KKyAqIFdpbGwgcmVtb3ZlIHRoZSByZXNwZWN0aXZlIHRlcm1pbmFsIHJlZmVyZW5jZSBmcm9tIHRoZSBlZGdlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbD4gdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBlZGdlIGFycmF5LgorICogaXNPdXRnb2luZyAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIGVkZ2UgaXMgb3V0Z29pbmcuCisgKi8KK214Q2VsbC5wcm90b3R5cGUucmVtb3ZlRWRnZSA9IGZ1bmN0aW9uKGVkZ2UsIGlzT3V0Z29pbmcpCit7CisJaWYgKGVkZ2UgIT0gbnVsbCkKKwl7CisJCWlmIChlZGdlLmdldFRlcm1pbmFsKCFpc091dGdvaW5nKSAhPSB0aGlzICYmCisJCQl0aGlzLmVkZ2VzICE9IG51bGwpCisJCXsKKwkJCXZhciBpbmRleCA9IHRoaXMuZ2V0RWRnZUluZGV4KGVkZ2UpOworCQkJCisJCQlpZiAoaW5kZXggPj0gMCkKKwkJCXsKKwkJCQl0aGlzLmVkZ2VzLnNwbGljZShpbmRleCwgMSk7CisJCQl9CisJCX0KKwkJCisJCWVkZ2Uuc2V0VGVybWluYWwobnVsbCwgaXNPdXRnb2luZyk7CisJfQorCQorCXJldHVybiBlZGdlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVtb3ZlRnJvbVRlcm1pbmFsCisgKgorICogUmVtb3ZlcyB0aGUgZWRnZSBmcm9tIGl0cyBzb3VyY2Ugb3IgdGFyZ2V0IHRlcm1pbmFsLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBpc1NvdXJjZSAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIGVkZ2Ugc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBpdHMKKyAqIHNvdXJjZSBvciB0YXJnZXQgdGVybWluYWwuCisgKi8KK214Q2VsbC5wcm90b3R5cGUucmVtb3ZlRnJvbVRlcm1pbmFsID0gZnVuY3Rpb24oaXNTb3VyY2UpCit7CisJdmFyIHRlcm1pbmFsID0gdGhpcy5nZXRUZXJtaW5hbChpc1NvdXJjZSk7CisJCisJaWYgKHRlcm1pbmFsICE9IG51bGwpCisJeworCQl0ZXJtaW5hbC5yZW1vdmVFZGdlKHRoaXMsIGlzU291cmNlKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBoYXNBdHRyaWJ1dGUKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSB1c2VyIG9iamVjdCBpcyBhbiBYTUwgbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbgorICogYXR0cmlidXRlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBuYW1lIC0gTmFtZSBvZiB0aGUgYXR0cmlidXRlLgorICovCitteENlbGwucHJvdG90eXBlLmhhc0F0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5hbWUpCit7CisJdmFyIHVzZXJPYmplY3QgPSB0aGlzLmdldFZhbHVlKCk7CisJCisJcmV0dXJuICh1c2VyT2JqZWN0ICE9IG51bGwgJiYKKwkJdXNlck9iamVjdC5ub2RlVHlwZSA9PSBteENvbnN0YW50cy5OT0RFVFlQRV9FTEVNRU5UICYmIHVzZXJPYmplY3QuaGFzQXR0cmlidXRlKSA/CisJCXVzZXJPYmplY3QuaGFzQXR0cmlidXRlKG5hbWUpIDogdXNlck9iamVjdC5nZXRBdHRyaWJ1dGUobmFtZSkgIT0gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEF0dHJpYnV0ZQorICoKKyAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgZnJvbSB0aGUgdXNlciBvYmplY3QgaWYgaXQgaXMgYW4gWE1MCisgKiBub2RlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBuYW1lIC0gTmFtZSBvZiB0aGUgYXR0cmlidXRlIHdob3NlIHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqIGRlZmF1bHRWYWx1ZSAtIE9wdGlvbmFsIGRlZmF1bHQgdmFsdWUgdG8gdXNlIGlmIHRoZSBhdHRyaWJ1dGUgaGFzIG5vCisgKiB2YWx1ZS4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbihuYW1lLCBkZWZhdWx0VmFsdWUpCit7CisJdmFyIHVzZXJPYmplY3QgPSB0aGlzLmdldFZhbHVlKCk7CisJCisJdmFyIHZhbCA9ICh1c2VyT2JqZWN0ICE9IG51bGwgJiYKKwkJdXNlck9iamVjdC5ub2RlVHlwZSA9PSBteENvbnN0YW50cy5OT0RFVFlQRV9FTEVNRU5UKSA/CisJCXVzZXJPYmplY3QuZ2V0QXR0cmlidXRlKG5hbWUpIDogbnVsbDsKKwkJCisJcmV0dXJuIHZhbCB8fCBkZWZhdWx0VmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRBdHRyaWJ1dGUKKyAqCisgKiBTZXRzIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG9uIHRoZSB1c2VyIG9iamVjdCBpZiBpdCBpcyBhbiBYTUwgbm9kZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogbmFtZSAtIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgc2V0LgorICogdmFsdWUgLSBOZXcgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAqLworbXhDZWxsLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkKK3sKKwl2YXIgdXNlck9iamVjdCA9IHRoaXMuZ2V0VmFsdWUoKTsKKwkKKwlpZiAodXNlck9iamVjdCAhPSBudWxsICYmCisJCXVzZXJPYmplY3Qubm9kZVR5cGUgPT0gbXhDb25zdGFudHMuTk9ERVRZUEVfRUxFTUVOVCkKKwl7CisJCXVzZXJPYmplY3Quc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjbG9uZQorICoKKyAqIFJldHVybnMgYSBjbG9uZSBvZiB0aGUgY2VsbC4gVXNlcyA8Y2xvbmVWYWx1ZT4gdG8gY2xvbmUKKyAqIHRoZSB1c2VyIG9iamVjdC4gQWxsIGZpZWxkcyBpbiA8bXhUcmFuc2llbnQ+IGFyZSBpZ25vcmVkCisgKiBkdXJpbmcgdGhlIGNsb25pbmcuCisgKi8KK214Q2VsbC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpCit7CisJdmFyIGNsb25lID0gbXhVdGlscy5jbG9uZSh0aGlzLCB0aGlzLm14VHJhbnNpZW50KTsKKwljbG9uZS5zZXRWYWx1ZSh0aGlzLmNsb25lVmFsdWUoKSk7CisJCisJcmV0dXJuIGNsb25lOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY2xvbmVWYWx1ZQorICoKKyAqIFJldHVybnMgYSBjbG9uZSBvZiB0aGUgY2VsbCdzIHVzZXIgb2JqZWN0LgorICovCitteENlbGwucHJvdG90eXBlLmNsb25lVmFsdWUgPSBmdW5jdGlvbigpCit7CisJdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOworCQorCWlmICh2YWx1ZSAhPSBudWxsKQorCXsKKwkJaWYgKHR5cGVvZih2YWx1ZS5jbG9uZSkgPT0gJ2Z1bmN0aW9uJykKKwkJeworCQkJdmFsdWUgPSB2YWx1ZS5jbG9uZSgpOworCQl9CisJCWVsc2UgaWYgKCFpc05hTih2YWx1ZS5ub2RlVHlwZSkpCisJCXsKKwkJCXZhbHVlID0gdmFsdWUuY2xvbmVOb2RlKHRydWUpOworCQl9CisJfQorCQorCXJldHVybiB2YWx1ZTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbW9kZWwvbXhDZWxsUGF0aC5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9tb2RlbC9teENlbGxQYXRoLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MWE4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbW9kZWwvbXhDZWxsUGF0aC5qcwpAQCAtMCwwICsxLDE2MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLwordmFyIG14Q2VsbFBhdGggPQoreworCisJLyoqCisJICogQ2xhc3M6IG14Q2VsbFBhdGgKKwkgKiAKKwkgKiBJbXBsZW1lbnRzIGEgbWVjaGFuaXNtIGZvciB0ZW1wb3JhcnkgY2VsbCBJZHMuCisJICogCisJICogVmFyaWFibGU6IFBBVEhfU0VQQVJBVE9SCisJICogCisJICogRGVmaW5lcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gdGhlIHBhdGggY29tcG9uZW50cy4gRGVmYXVsdCBpcyAiLiIuCisJICovCisJUEFUSF9TRVBBUkFUT1I6ICcuJywKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogY3JlYXRlCisJICogCisJICogQ3JlYXRlcyB0aGUgY2VsbCBwYXRoIGZvciB0aGUgZ2l2ZW4gY2VsbC4gVGhlIGNlbGwgcGF0aCBpcyBhCisJICogY29uY2F0ZW5hdGlvbiBvZiB0aGUgaW5kaWNlcyBvZiBhbGwgYW5jZXN0b3JzIG9uIHRoZSAoZmluaXRlKSBwYXRoIHRvCisJICogdGhlIHJvb3QsIGVnLiAiMC4wLjAuMSIuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBjZWxsIC0gQ2VsbCB3aG9zZSBwYXRoIHNob3VsZCBiZSByZXR1cm5lZC4KKwkgKi8KKwljcmVhdGU6IGZ1bmN0aW9uKGNlbGwpCisJeworCQl2YXIgcmVzdWx0ID0gJyc7CisJCQorCQlpZiAoY2VsbCAhPSBudWxsKQorCQl7CisJCQl2YXIgcGFyZW50ID0gY2VsbC5nZXRQYXJlbnQoKTsKKwkJCQorCQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKQorCQkJeworCQkJCXZhciBpbmRleCA9IHBhcmVudC5nZXRJbmRleChjZWxsKTsKKwkJCQlyZXN1bHQgPSBpbmRleCArIG14Q2VsbFBhdGguUEFUSF9TRVBBUkFUT1IgKyByZXN1bHQ7CisJCQkJCisJCQkJY2VsbCA9IHBhcmVudDsKKwkJCQlwYXJlbnQgPSBjZWxsLmdldFBhcmVudCgpOworCQkJfQorCQl9CisJCQorCQkvLyBSZW1vdmVzIHRyYWlsaW5nIHNlcGFyYXRvcgorCQl2YXIgbiA9IHJlc3VsdC5sZW5ndGg7CisJCQorCQlpZiAobiA+IDEpCisJCXsKKwkJCXJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoMCwgbiAtIDEpOworCQl9CisJCQorCQlyZXR1cm4gcmVzdWx0OworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IGdldFBhcmVudFBhdGgKKwkgKiAKKwkgKiBSZXR1cm5zIHRoZSBwYXRoIGZvciB0aGUgcGFyZW50IG9mIHRoZSBjZWxsIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbgorCSAqIHBhdGguIFJldHVybnMgbnVsbCBpZiB0aGUgZ2l2ZW4gcGF0aCBoYXMgbm8gcGFyZW50LgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogcGF0aCAtIFBhdGggd2hvc2UgcGFyZW50IHBhdGggc2hvdWxkIGJlIHJldHVybmVkLgorCSAqLworCWdldFBhcmVudFBhdGg6IGZ1bmN0aW9uKHBhdGgpCisJeworCQlpZiAocGF0aCAhPSBudWxsKQorCQl7CisJCQl2YXIgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKG14Q2VsbFBhdGguUEFUSF9TRVBBUkFUT1IpOworCisJCQlpZiAoaW5kZXggPj0gMCkKKwkJCXsKKwkJCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpOworCQkJfQorCQkJZWxzZSBpZiAocGF0aC5sZW5ndGggPiAwKQorCQkJeworCQkJCXJldHVybiAnJzsKKwkJCX0KKwkJfQorCisJCXJldHVybiBudWxsOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogcmVzb2x2ZQorCSAqIAorCSAqIFJldHVybnMgdGhlIGNlbGwgZm9yIHRoZSBzcGVjaWZpZWQgY2VsbCBwYXRoIHVzaW5nIHRoZSBnaXZlbiByb290IGFzIHRoZQorCSAqIHJvb3Qgb2YgdGhlIHBhdGguCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiByb290IC0gUm9vdCBjZWxsIG9mIHRoZSBwYXRoIHRvIGJlIHJlc29sdmVkLgorCSAqIHBhdGggLSBTdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBwYXRoLgorCSAqLworCXJlc29sdmU6IGZ1bmN0aW9uKHJvb3QsIHBhdGgpCisJeworCQl2YXIgcGFyZW50ID0gcm9vdDsKKwkJCisJCWlmIChwYXRoICE9IG51bGwpCisJCXsKKwkJCXZhciB0b2tlbnMgPSBwYXRoLnNwbGl0KG14Q2VsbFBhdGguUEFUSF9TRVBBUkFUT1IpOworCQkJCisJCQlmb3IgKHZhciBpPTA7IGk8dG9rZW5zLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCXBhcmVudCA9IHBhcmVudC5nZXRDaGlsZEF0KHBhcnNlSW50KHRva2Vuc1tpXSkpOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gcGFyZW50OworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IGNvbXBhcmUKKwkgKiAKKwkgKiBDb21wYXJlcyB0aGUgZ2l2ZW4gY2VsbCBwYXRocyBhbmQgcmV0dXJucyAtMSBpZiBwMSBpcyBzbWFsbGVyLCAwIGlmCisJICogcDEgaXMgZXF1YWwgYW5kIDEgaWYgcDEgaXMgZ3JlYXRlciB0aGFuIHAyLgorCSAqLworCWNvbXBhcmU6IGZ1bmN0aW9uKHAxLCBwMikKKwl7CisJCXZhciBtaW4gPSBNYXRoLm1pbihwMS5sZW5ndGgsIHAyLmxlbmd0aCk7CisJCXZhciBjb21wID0gMDsKKwkJCisJCWZvciAodmFyIGkgPSAwOyBpIDwgbWluOyBpKyspCisJCXsKKwkJCWlmIChwMVtpXSAhPSBwMltpXSkKKwkJCXsKKwkJCQlpZiAocDFbaV0ubGVuZ3RoID09IDAgfHwKKwkJCQkJcDJbaV0ubGVuZ3RoID09IDApCisJCQkJeworCQkJCQljb21wID0gKHAxW2ldID09IHAyW2ldKSA/IDAgOiAoKHAxW2ldID4gcDJbaV0pID8gMSA6IC0xKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdmFyIHQxID0gcGFyc2VJbnQocDFbaV0pOworCQkJCQl2YXIgdDIgPSBwYXJzZUludChwMltpXSk7CisJCQkJCQorCQkJCQljb21wID0gKHQxID09IHQyKSA/IDAgOiAoKHQxID4gdDIpID8gMSA6IC0xKTsKKwkJCQl9CisJCQkJCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJCisJCS8vIENvbXBhcmVzIHBhdGggbGVuZ3RoIGlmIGJvdGggcGF0aHMgYXJlIGVxdWFsIHRvIHRoaXMgcG9pbnQKKwkJaWYgKGNvbXAgPT0gMCkKKwkJeworCQkJdmFyIHQxID0gcDEubGVuZ3RoOworCQkJdmFyIHQyID0gcDIubGVuZ3RoOworCQkJCisJCQlpZiAodDEgIT0gdDIpCisJCQl7CisJCQkJY29tcCA9ICh0MSA+IHQyKSA/IDEgOiAtMTsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIGNvbXA7CisJfQorCit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL21vZGVsL214R2VvbWV0cnkuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbW9kZWwvbXhHZW9tZXRyeS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDkyNzhhCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL21vZGVsL214R2VvbWV0cnkuanMKQEAgLTAsMCArMSw0MTUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14R2VvbWV0cnkKKyAqIAorICogRXh0ZW5kcyA8bXhSZWN0YW5nbGU+IHRvIHJlcHJlc2VudCB0aGUgZ2VvbWV0cnkgb2YgYSBjZWxsLgorICogCisgKiBGb3IgdmVydGljZXMsIHRoZSBnZW9tZXRyeSBjb25zaXN0cyBvZiB0aGUgeC0gYW5kIHktbG9jYXRpb24sIGFuZCB0aGUgd2lkdGgKKyAqIGFuZCBoZWlnaHQuIEZvciBlZGdlcywgdGhlIGdlb21ldHJ5IGNvbnNpc3RzIG9mIHRoZSBvcHRpb25hbCB0ZXJtaW5hbC0gYW5kCisgKiBjb250cm9sIHBvaW50cy4gVGhlIHRlcm1pbmFsIHBvaW50cyBhcmUgb25seSByZXF1aXJlZCBpZiBhbiBlZGdlIGlzCisgKiB1bmNvbm5lY3RlZCwgYW5kIGFyZSBzdG9yZWQgaW4gdGhlIHNvdXJjZVBvaW50PiBhbmQgPHRhcmdldFBvaW50PgorICogdmFyaWFibGVzLCByZXNwZWN0aXZlbHkuCisgKiAKKyAqIEV4YW1wbGU6CisgKiAKKyAqIElmIGFuIGVkZ2UgaXMgdW5jb25uZWN0ZWQsIHRoYXQgaXMsIGl0IGhhcyBubyBzb3VyY2Ugb3IgdGFyZ2V0IHRlcm1pbmFsLAorICogdGhlbiBhIGdlb21ldHJ5IHdpdGggdGVybWluYWwgcG9pbnRzIGZvciBhIG5ldyBlZGdlIGNhbiBiZSBkZWZpbmVkIGFzCisgKiBmb2xsb3dzLgorICogCisgKiAoY29kZSkKKyAqIGdlb21ldHJ5LnNldFRlcm1pbmFsUG9pbnQobmV3IG14UG9pbnQoeDEsIHkxKSwgdHJ1ZSk7CisgKiBnZW9tZXRyeS5wb2ludHMgPSBbbmV3IG14UG9pbnQoeDIsIHkyKV07CisgKiBnZW9tZXRyeS5zZXRUZXJtaW5hbFBvaW50KG5ldyBteFBvaW50KHgzLCB5MyksIGZhbHNlKTsKKyAqIChlbmQpCisgKiAKKyAqIENvbnRyb2wgcG9pbnRzIGFyZSB1c2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbm5lY3RlZCBzdGF0ZSBvZiBhbiBlZGdlIGFuZCBtYXkKKyAqIGJlIGlnbm9yZWQgb3IgaW50ZXJwcmV0ZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHRoZSBlZGdlJ3MgPG14RWRnZVN0eWxlPi4KKyAqIAorICogVG8gZGlzYWJsZSBhdXRvbWF0aWMgcmVzZXQgb2YgY29udHJvbCBwb2ludHMgYWZ0ZXIgYSBjZWxsIGhhcyBiZWVuIG1vdmVkIG9yCisgKiByZXNpemVkLCB0aGUgdGhlIDxteEdyYXBoLnJlc2l6ZUVkZ2VzT25Nb3ZlPiBhbmQKKyAqIDxteEdyYXBoLnJlc2V0RWRnZXNPblJlc2l6ZT4gbWF5IGJlIHVzZWQuCisgKgorICogRWRnZSBMYWJlbHM6CisgKiAKKyAqIFVzaW5nIHRoZSB4LSBhbmQgeS1jb29yZGluYXRlcyBvZiBhIGNlbGwncyBnZW9tZXRyeSwgaXQgaXMgcG9zc2libGUgdG8KKyAqIHBvc2l0aW9uIHRoZSBsYWJlbCBvbiBlZGdlcyBvbiBhIHNwZWNpZmljIGxvY2F0aW9uIG9uIHRoZSBhY3R1YWwgZWRnZSBzaGFwZQorICogYXMgaXQgYXBwZWFycyBvbiB0aGUgc2NyZWVuLiBUaGUgeC1jb29yZGluYXRlIG9mIGFuIGVkZ2UncyBnZW9tZXRyeSBpcyB1c2VkCisgKiB0byBkZXNjcmliZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY2VudGVyIG9mIHRoZSBlZGdlIGZyb20gLTEgdG8gMSB3aXRoIDAKKyAqIGJlaW5nIHRoZSBjZW50ZXIgb2YgdGhlIGVkZ2UgYW5kIHRoZSBkZWZhdWx0IHZhbHVlLiBUaGUgeS1jb29yZGluYXRlIG9mIGFuCisgKiBlZGdlJ3MgZ2VvbWV0cnkgaXMgdXNlZCB0byBkZXNjcmliZSB0aGUgYWJzb2x1dGUsIG9ydGhvZ29uYWwgZGlzdGFuY2UgaW4KKyAqIHBpeGVscyBmcm9tIHRoYXQgcG9pbnQuIEluIGFkZGl0aW9uLCB0aGUgPG14R2VvbWV0cnkub2Zmc2V0PiBpcyB1c2VkIGFzIGFuCisgKiBhYnNvbHV0ZSBvZmZzZXQgdmVjdG9yIGZyb20gdGhlIHJlc3VsdGluZyBwb2ludC4KKyAqIAorICogVGhpcyBjb29yZGluYXRlIHN5c3RlbSBpcyBhcHBsaWVkIGlmIDxyZWxhdGl2ZT4gaXMgdHJ1ZSwgb3RoZXJ3aXNlIHRoZQorICogb2Zmc2V0IGRlZmluZXMgdGhlIGFic29sdXRlIHZlY3RvciBmcm9tIHRoZSBlZGdlJ3MgY2VudGVyIHBvaW50IHRvIHRoZQorICogbGFiZWwgYW5kIHRoZSB2YWx1ZXMgZm9yIDx4PiBhbmQgPHk+IGFyZSBpZ25vcmVkLgorICogCisgKiBUaGUgd2lkdGggYW5kIGhlaWdodCBwYXJhbWV0ZXIgZm9yIGVkZ2UgZ2VvbWV0cmllcyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlCisgKiBsYWJlbCB3aWR0aCBhbmQgaGVpZ2h0IChlZy4gZm9yIHdvcmQgd3JhcHBpbmcpLgorICogCisgKiBQb3J0czoKKyAqIAorICogVGhlIHRlcm0gInBvcnQiIHJlZmVycyB0byBhIHJlbGF0aXZlbHkgcG9zaXRpb25lZCwgY29ubmVjdGFibGUgY2hpbGQgY2VsbCwKKyAqIHdoaWNoIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIGFub3RoZXIgY2VsbAorICogaW4gdGhlIGdyYXBoLiBQb3J0cyBhcmUgdHlwaWNhbGx5IG1vZGVsZWQgYXMgdmVydGljZXMgd2l0aCByZWxhdGl2ZQorICogZ2VvbWV0cmllcy4KKyAqIAorICogT2Zmc2V0czoKKyAqIAorICogVGhlIDxvZmZzZXQ+IGZpZWxkIGlzIGludGVycHJldGVkIGluIDMgZGlmZmVyZW50IHdheXMsIGRlcGVuZGluZyBvbiB0aGUgY2VsbAorICogYW5kIHRoZSBnZW9tZXRyeS4gRm9yIGVkZ2VzLCB0aGUgb2Zmc2V0IGRlZmluZXMgdGhlIGFic29sdXRlIG9mZnNldCBmb3IgdGhlCisgKiBlZGdlIGxhYmVsLiBGb3IgcmVsYXRpdmUgZ2VvbWV0cmllcywgdGhlIG9mZnNldCBkZWZpbmVzIHRoZSBhYnNvbHV0ZSBvZmZzZXQKKyAqIGZvciB0aGUgb3JpZ2luICh0b3AsIGxlZnQgY29ybmVyKSBvZiB0aGUgdmVydGV4LCBvdGhlcndpc2UgdGhlIG9mZnNldAorICogZGVmaW5lcyB0aGUgYWJzb2x1dGUgb2Zmc2V0IGZvciB0aGUgbGFiZWwgaW5zaWRlIHRoZSB2ZXJ0ZXggb3IgZ3JvdXAuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteEdlb21ldHJ5CisgKgorICogQ29uc3RydWN0cyBhIG5ldyBvYmplY3QgdG8gZGVzY3JpYmUgdGhlIHNpemUgYW5kIGxvY2F0aW9uIG9mIGEgdmVydGV4IG9yCisgKiB0aGUgY29udHJvbCBwb2ludHMgb2YgYW4gZWRnZS4KKyAqLworZnVuY3Rpb24gbXhHZW9tZXRyeSh4LCB5LCB3aWR0aCwgaGVpZ2h0KQoreworCW14UmVjdGFuZ2xlLmNhbGwodGhpcywgeCwgeSwgd2lkdGgsIGhlaWdodCk7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhSZWN0YW5nbGUuCisgKi8KK214R2VvbWV0cnkucHJvdG90eXBlID0gbmV3IG14UmVjdGFuZ2xlKCk7CitteEdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG14R2VvbWV0cnk7CisKKy8qKgorICogVmFyaWFibGU6IFRSQU5TTEFURV9DT05UUk9MX1BPSU5UUworICogCisgKiBHbG9iYWwgc3dpdGNoIHRvIHRyYW5zbGF0ZSB0aGUgcG9pbnRzIGluIHRyYW5zbGF0ZS4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdlb21ldHJ5LnByb3RvdHlwZS5UUkFOU0xBVEVfQ09OVFJPTF9QT0lOVFMgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBhbHRlcm5hdGVCb3VuZHMKKyAqCisgKiBTdG9yZXMgYWx0ZXJuYXRlIHZhbHVlcyBmb3IgeCwgeSwgd2lkdGggYW5kIGhlaWdodCBpbiBhIHJlY3RhbmdsZS4gU2VlCisgKiA8c3dhcD4gdG8gZXhjaGFuZ2UgdGhlIHZhbHVlcy4gRGVmYXVsdCBpcyBudWxsLgorICovCitteEdlb21ldHJ5LnByb3RvdHlwZS5hbHRlcm5hdGVCb3VuZHMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzb3VyY2VQb2ludAorICoKKyAqIERlZmluZXMgdGhlIHNvdXJjZSA8bXhQb2ludD4gb2YgdGhlIGVkZ2UuIFRoaXMgaXMgdXNlZCBpZiB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgZWRnZSBkb2VzIG5vdCBoYXZlIGEgc291cmNlIHZlcnRleC4gT3RoZXJ3aXNlIGl0IGlzCisgKiBpZ25vcmVkLiBEZWZhdWx0IGlzICBudWxsLgorICovCitteEdlb21ldHJ5LnByb3RvdHlwZS5zb3VyY2VQb2ludCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHRhcmdldFBvaW50CisgKgorICogRGVmaW5lcyB0aGUgdGFyZ2V0IDxteFBvaW50PiBvZiB0aGUgZWRnZS4gVGhpcyBpcyB1c2VkIGlmIHRoZQorICogY29ycmVzcG9uZGluZyBlZGdlIGRvZXMgbm90IGhhdmUgYSB0YXJnZXQgdmVydGV4LiBPdGhlcndpc2UgaXQgaXMKKyAqIGlnbm9yZWQuIERlZmF1bHQgaXMgbnVsbC4KKyAqLworbXhHZW9tZXRyeS5wcm90b3R5cGUudGFyZ2V0UG9pbnQgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBwb2ludHMKKyAqCisgKiBBcnJheSBvZiA8bXhQb2ludHM+IHdoaWNoIHNwZWNpZmllcyB0aGUgY29udHJvbCBwb2ludHMgYWxvbmcgdGhlIGVkZ2UuCisgKiBUaGVzZSBwb2ludHMgYXJlIHRoZSBpbnRlcm1lZGlhdGUgcG9pbnRzIG9uIHRoZSBlZGdlLCBmb3IgdGhlIGVuZHBvaW50cworICogdXNlIDx0YXJnZXRQb2ludD4gYW5kIDxzb3VyY2VQb2ludD4gb3Igc2V0IHRoZSB0ZXJtaW5hbHMgb2YgdGhlIGVkZ2UgdG8KKyAqIGEgbm9uLW51bGwgdmFsdWUuIERlZmF1bHQgaXMgbnVsbC4KKyAqLworbXhHZW9tZXRyeS5wcm90b3R5cGUucG9pbnRzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogb2Zmc2V0CisgKgorICogRm9yIGVkZ2VzLCB0aGlzIGhvbGRzIHRoZSBvZmZzZXQgKGluIHBpeGVscykgZnJvbSB0aGUgcG9zaXRpb24gZGVmaW5lZAorICogYnkgPHg+IGFuZCA8eT4gb24gdGhlIGVkZ2UuIEZvciByZWxhdGl2ZSBnZW9tZXRyaWVzIChmb3IgdmVydGljZXMpLCB0aGlzCisgKiBkZWZpbmVzIHRoZSBhYnNvbHV0ZSBvZmZzZXQgZnJvbSB0aGUgcG9pbnQgZGVmaW5lZCBieSB0aGUgcmVsYXRpdmUKKyAqIGNvb3JkaW5hdGVzLiBGb3IgYWJzb2x1dGUgZ2VvbWV0cmllcyAoZm9yIHZlcnRpY2VzKSwgdGhpcyBkZWZpbmVzIHRoZQorICogb2Zmc2V0IGZvciB0aGUgbGFiZWwuIERlZmF1bHQgaXMgbnVsbC4KKyAqLworbXhHZW9tZXRyeS5wcm90b3R5cGUub2Zmc2V0ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogcmVsYXRpdmUKKyAqCisgKiBTcGVjaWZpZXMgaWYgdGhlIGNvb3JkaW5hdGVzIGluIHRoZSBnZW9tZXRyeSBhcmUgdG8gYmUgaW50ZXJwcmV0ZWQgYXMKKyAqIHJlbGF0aXZlIGNvb3JkaW5hdGVzLiBGb3IgZWRnZXMsIHRoaXMgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGxvY2F0aW9uIG9mCisgKiB0aGUgZWRnZSBsYWJlbCByZWxhdGl2ZSB0byB0aGUgZWRnZSBhcyByZW5kZXJlZCBvbiB0aGUgZGlzcGxheS4gRm9yCisgKiB2ZXJ0aWNlcywgdGhpcyBzcGVjaWZpZXMgdGhlIHJlbGF0aXZlIGxvY2F0aW9uIGluc2lkZSB0aGUgYm91bmRzIG9mIHRoZQorICogcGFyZW50IGNlbGwuCisgKiAKKyAqIElmIHRoaXMgaXMgZmFsc2UsIHRoZW4gdGhlIGNvb3JkaW5hdGVzIGFyZSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luIG9mIHRoZQorICogcGFyZW50IGNlbGwgb3IsIGZvciBlZGdlcywgdGhlIGVkZ2UgbGFiZWwgcG9zaXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlCisgKiBjZW50ZXIgb2YgdGhlIGVkZ2UgYXMgcmVuZGVyZWQgb24gc2NyZWVuLgorICogCisgKiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteEdlb21ldHJ5LnByb3RvdHlwZS5yZWxhdGl2ZSA9IGZhbHNlOworCisvKioKKyAqIEZ1bmN0aW9uOiBzd2FwCisgKiAKKyAqIFN3YXBzIHRoZSB4LCB5LCB3aWR0aCBhbmQgaGVpZ2h0IHdpdGggdGhlIHZhbHVlcyBzdG9yZWQgaW4KKyAqIDxhbHRlcm5hdGVCb3VuZHM+IGFuZCBwdXRzIHRoZSBwcmV2aW91cyB2YWx1ZXMgaW50byA8YWx0ZXJuYXRlQm91bmRzPiBhcworICogYSByZWN0YW5nbGUuIFRoaXMgb3BlcmF0aW9uIGlzIGNhcnJpZWQtb3V0IGluLXBsYWNlLCB0aGF0IGlzLCB1c2luZyB0aGUKKyAqIGV4aXN0aW5nIGdlb21ldHJ5IGluc3RhbmNlLiBJZiB0aGlzIG9wZXJhdGlvbiBpcyBjYWxsZWQgZHVyaW5nIGEgZ3JhcGgKKyAqIG1vZGVsIHRyYW5zYWN0aW9uYWwgY2hhbmdlLCB0aGVuIHRoZSBnZW9tZXRyeSBzaG91bGQgYmUgY2xvbmVkIGJlZm9yZQorICogY2FsbGluZyB0aGlzIG1ldGhvZCBhbmQgc2V0dGluZyB0aGUgZ2VvbWV0cnkgb2YgdGhlIGNlbGwgdXNpbmcKKyAqIDxteEdyYXBoTW9kZWwuc2V0R2VvbWV0cnk+LgorICovCitteEdlb21ldHJ5LnByb3RvdHlwZS5zd2FwID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLmFsdGVybmF0ZUJvdW5kcyAhPSBudWxsKQorCXsKKwkJdmFyIG9sZCA9IG5ldyBteFJlY3RhbmdsZSgKKwkJCXRoaXMueCwgdGhpcy55LCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7CisKKwkJdGhpcy54ID0gdGhpcy5hbHRlcm5hdGVCb3VuZHMueDsKKwkJdGhpcy55ID0gdGhpcy5hbHRlcm5hdGVCb3VuZHMueTsKKwkJdGhpcy53aWR0aCA9IHRoaXMuYWx0ZXJuYXRlQm91bmRzLndpZHRoOworCQl0aGlzLmhlaWdodCA9IHRoaXMuYWx0ZXJuYXRlQm91bmRzLmhlaWdodDsKKworCQl0aGlzLmFsdGVybmF0ZUJvdW5kcyA9IG9sZDsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRUZXJtaW5hbFBvaW50CisgKiAKKyAqIFJldHVybnMgdGhlIDxteFBvaW50PiByZXByZXNlbnRpbmcgdGhlIHNvdXJjZSBvciB0YXJnZXQgcG9pbnQgb2YgdGhpcworICogZWRnZS4gVGhpcyBpcyBvbmx5IHVzZWQgaWYgdGhlIGVkZ2UgaGFzIG5vIHNvdXJjZSBvciB0YXJnZXQgdmVydGV4LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBpc1NvdXJjZSAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIHNvdXJjZSBvciB0YXJnZXQgcG9pbnQKKyAqIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHZW9tZXRyeS5wcm90b3R5cGUuZ2V0VGVybWluYWxQb2ludCA9IGZ1bmN0aW9uKGlzU291cmNlKQoreworCXJldHVybiAoaXNTb3VyY2UpID8gdGhpcy5zb3VyY2VQb2ludCA6IHRoaXMudGFyZ2V0UG9pbnQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRUZXJtaW5hbFBvaW50CisgKiAKKyAqIFNldHMgdGhlIDxzb3VyY2VQb2ludD4gb3IgPHRhcmdldFBvaW50PiB0byB0aGUgZ2l2ZW4gPG14UG9pbnQ+IGFuZAorICogcmV0dXJucyB0aGUgbmV3IHBvaW50LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwb2ludCAtIFBvaW50IHRvIGJlIHVzZWQgYXMgdGhlIG5ldyBzb3VyY2Ugb3IgdGFyZ2V0IHBvaW50LgorICogaXNTb3VyY2UgLSBCb29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIHRoZSBzb3VyY2Ugb3IgdGFyZ2V0IHBvaW50CisgKiBzaG91bGQgYmUgc2V0LgorICovCitteEdlb21ldHJ5LnByb3RvdHlwZS5zZXRUZXJtaW5hbFBvaW50ID0gZnVuY3Rpb24ocG9pbnQsIGlzU291cmNlKQoreworCWlmIChpc1NvdXJjZSkKKwl7CisJCXRoaXMuc291cmNlUG9pbnQgPSBwb2ludDsKKwl9CisJZWxzZQorCXsKKwkJdGhpcy50YXJnZXRQb2ludCA9IHBvaW50OworCX0KKwkKKwlyZXR1cm4gcG9pbnQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByb3RhdGUKKyAqIAorICogUm90YXRlcyB0aGUgZ2VvbWV0cnkgYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgZ2l2ZW4gY2VudGVyLiBUaGF0IGlzLAorICogPHg+IGFuZCA8eT4gb2YgdGhlIGdlb21ldHJ5LCB0aGUgPHNvdXJjZVBvaW50PiwgPHRhcmdldFBvaW50PiBhbmQgYWxsCisgKiA8cG9pbnRzPiBhcmUgdHJhbnNsYXRlZCBieSB0aGUgZ2l2ZW4gYW1vdW50LiA8eD4gYW5kIDx5PiBhcmUgb25seQorICogdHJhbnNsYXRlZCBpZiA8cmVsYXRpdmU+IGlzIGZhbHNlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBhbmdsZSAtIE51bWJlciB0aGF0IHNwZWNpZmllcyB0aGUgcm90YXRpb24gYW5nbGUgaW4gZGVncmVlcy4KKyAqIGN4IC0gPG14UG9pbnQ+IHRoYXQgc3BlY2lmaWVzIHRoZSBjZW50ZXIgb2YgdGhlIHJvdGF0aW9uLgorICovCitteEdlb21ldHJ5LnByb3RvdHlwZS5yb3RhdGUgPSBmdW5jdGlvbihhbmdsZSwgY3gpCit7CisJdmFyIHJhZCA9IG14VXRpbHMudG9SYWRpYW5zKGFuZ2xlKTsKKwl2YXIgY29zID0gTWF0aC5jb3MocmFkKTsKKwl2YXIgc2luID0gTWF0aC5zaW4ocmFkKTsKKwkKKwkvLyBSb3RhdGVzIHRoZSBnZW9tZXRyeQorCWlmICghdGhpcy5yZWxhdGl2ZSkKKwl7CisJCXZhciBjdCA9IG5ldyBteFBvaW50KHRoaXMuZ2V0Q2VudGVyWCgpLCB0aGlzLmdldENlbnRlclkoKSk7CisJCXZhciBwdCA9IG14VXRpbHMuZ2V0Um90YXRlZFBvaW50KGN0LCBjb3MsIHNpbiwgY3gpOworCQkKKwkJdGhpcy54ID0gTWF0aC5yb3VuZChwdC54IC0gdGhpcy53aWR0aCAvIDIpOworCQl0aGlzLnkgPSBNYXRoLnJvdW5kKHB0LnkgLSB0aGlzLmhlaWdodCAvIDIpOworCX0KKworCS8vIFJvdGF0ZXMgdGhlIHNvdXJjZSBwb2ludAorCWlmICh0aGlzLnNvdXJjZVBvaW50ICE9IG51bGwpCisJeworCQl2YXIgcHQgPSBteFV0aWxzLmdldFJvdGF0ZWRQb2ludCh0aGlzLnNvdXJjZVBvaW50LCBjb3MsIHNpbiwgY3gpOworCQl0aGlzLnNvdXJjZVBvaW50LnggPSBNYXRoLnJvdW5kKHB0LngpOworCQl0aGlzLnNvdXJjZVBvaW50LnkgPSBNYXRoLnJvdW5kKHB0LnkpOworCX0KKwkKKwkvLyBUcmFuc2xhdGVzIHRoZSB0YXJnZXQgcG9pbnQKKwlpZiAodGhpcy50YXJnZXRQb2ludCAhPSBudWxsKQorCXsKKwkJdmFyIHB0ID0gbXhVdGlscy5nZXRSb3RhdGVkUG9pbnQodGhpcy50YXJnZXRQb2ludCwgY29zLCBzaW4sIGN4KTsKKwkJdGhpcy50YXJnZXRQb2ludC54ID0gTWF0aC5yb3VuZChwdC54KTsKKwkJdGhpcy50YXJnZXRQb2ludC55ID0gTWF0aC5yb3VuZChwdC55KTsJCisJfQorCQorCS8vIFRyYW5zbGF0ZSB0aGUgY29udHJvbCBwb2ludHMKKwlpZiAodGhpcy5wb2ludHMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wb2ludHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCWlmICh0aGlzLnBvaW50c1tpXSAhPSBudWxsKQorCQkJeworCQkJCXZhciBwdCA9IG14VXRpbHMuZ2V0Um90YXRlZFBvaW50KHRoaXMucG9pbnRzW2ldLCBjb3MsIHNpbiwgY3gpOworCQkJCXRoaXMucG9pbnRzW2ldLnggPSBNYXRoLnJvdW5kKHB0LngpOworCQkJCXRoaXMucG9pbnRzW2ldLnkgPSBNYXRoLnJvdW5kKHB0LnkpOworCQkJfQorCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogdHJhbnNsYXRlCisgKiAKKyAqIFRyYW5zbGF0ZXMgdGhlIGdlb21ldHJ5IGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBUaGF0IGlzLCA8eD4gYW5kIDx5PiBvZiB0aGUKKyAqIGdlb21ldHJ5LCB0aGUgPHNvdXJjZVBvaW50PiwgPHRhcmdldFBvaW50PiBhbmQgYWxsIDxwb2ludHM+IGFyZSB0cmFuc2xhdGVkCisgKiBieSB0aGUgZ2l2ZW4gYW1vdW50LiA8eD4gYW5kIDx5PiBhcmUgb25seSB0cmFuc2xhdGVkIGlmIDxyZWxhdGl2ZT4gaXMgZmFsc2UuCisgKiBJZiA8VFJBTlNMQVRFX0NPTlRST0xfUE9JTlRTPiBpcyBmYWxzZSwgdGhlbiA8cG9pbnRzPiBhcmUgbm90IG1vZGlmaWVkIGJ5CisgKiB0aGlzIGZ1bmN0aW9uLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBkeCAtIE51bWJlciB0aGF0IHNwZWNpZmllcyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSB0cmFuc2xhdGlvbi4KKyAqIGR5IC0gTnVtYmVyIHRoYXQgc3BlY2lmaWVzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHRyYW5zbGF0aW9uLgorICovCitteEdlb21ldHJ5LnByb3RvdHlwZS50cmFuc2xhdGUgPSBmdW5jdGlvbihkeCwgZHkpCit7CisJZHggPSBwYXJzZUZsb2F0KGR4KTsKKwlkeSA9IHBhcnNlRmxvYXQoZHkpOworCQorCS8vIFRyYW5zbGF0ZXMgdGhlIGdlb21ldHJ5CisJaWYgKCF0aGlzLnJlbGF0aXZlKQorCXsKKwkJdGhpcy54ID0gcGFyc2VGbG9hdCh0aGlzLngpICsgZHg7CisJCXRoaXMueSA9IHBhcnNlRmxvYXQodGhpcy55KSArIGR5OworCX0KKworCS8vIFRyYW5zbGF0ZXMgdGhlIHNvdXJjZSBwb2ludAorCWlmICh0aGlzLnNvdXJjZVBvaW50ICE9IG51bGwpCisJeworCQl0aGlzLnNvdXJjZVBvaW50LnggPSBwYXJzZUZsb2F0KHRoaXMuc291cmNlUG9pbnQueCkgKyBkeDsKKwkJdGhpcy5zb3VyY2VQb2ludC55ID0gcGFyc2VGbG9hdCh0aGlzLnNvdXJjZVBvaW50LnkpICsgZHk7CisJfQorCQorCS8vIFRyYW5zbGF0ZXMgdGhlIHRhcmdldCBwb2ludAorCWlmICh0aGlzLnRhcmdldFBvaW50ICE9IG51bGwpCisJeworCQl0aGlzLnRhcmdldFBvaW50LnggPSBwYXJzZUZsb2F0KHRoaXMudGFyZ2V0UG9pbnQueCkgKyBkeDsKKwkJdGhpcy50YXJnZXRQb2ludC55ID0gcGFyc2VGbG9hdCh0aGlzLnRhcmdldFBvaW50LnkpICsgZHk7CQkKKwl9CisKKwkvLyBUcmFuc2xhdGUgdGhlIGNvbnRyb2wgcG9pbnRzCisJaWYgKHRoaXMuVFJBTlNMQVRFX0NPTlRST0xfUE9JTlRTICYmIHRoaXMucG9pbnRzICE9IG51bGwpCisJeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucG9pbnRzLmxlbmd0aDsgaSsrKQorCQl7CisJCQlpZiAodGhpcy5wb2ludHNbaV0gIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLnBvaW50c1tpXS54ID0gcGFyc2VGbG9hdCh0aGlzLnBvaW50c1tpXS54KSArIGR4OworCQkJCXRoaXMucG9pbnRzW2ldLnkgPSBwYXJzZUZsb2F0KHRoaXMucG9pbnRzW2ldLnkpICsgZHk7CisJCQl9CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzY2FsZQorICogCisgKiBTY2FsZXMgdGhlIGdlb21ldHJ5IGJ5IHRoZSBnaXZlbiBhbW91bnQuIFRoYXQgaXMsIDx4PiBhbmQgPHk+IG9mIHRoZQorICogZ2VvbWV0cnksIHRoZSA8c291cmNlUG9pbnQ+LCA8dGFyZ2V0UG9pbnQ+IGFuZCBhbGwgPHBvaW50cz4gYXJlIHNjYWxlZAorICogYnkgdGhlIGdpdmVuIGFtb3VudC4gPHg+LCA8eT4sIDx3aWR0aD4gYW5kIDxoZWlnaHQ+IGFyZSBvbmx5IHNjYWxlZCBpZgorICogPHJlbGF0aXZlPiBpcyBmYWxzZS4gSWYgPGZpeGVkQXNwZWN0PiBpcyB0cnVlLCB0aGVuIHRoZSBzbWFsbGVyIHZhbHVlCisgKiBpcyB1c2VkIHRvIHNjYWxlIHRoZSB3aWR0aCBhbmQgdGhlIGhlaWdodC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3ggLSBOdW1iZXIgdGhhdCBzcGVjaWZpZXMgdGhlIGhvcml6b250YWwgc2NhbGUgZmFjdG9yLgorICogc3kgLSBOdW1iZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHZlcnRpY2FsIHNjYWxlIGZhY3Rvci4KKyAqIGZpeGVkQXNwZWN0IC0gT3B0aW9uYWwgYm9vbGVhbiB0byBrZWVwIHRoZSBhc3BlY3QgcmF0aW8gZml4ZWQuCisgKi8KK214R2VvbWV0cnkucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24oc3gsIHN5LCBmaXhlZEFzcGVjdCkKK3sKKwlzeCA9IHBhcnNlRmxvYXQoc3gpOworCXN5ID0gcGFyc2VGbG9hdChzeSk7CisKKwkvLyBUcmFuc2xhdGVzIHRoZSBzb3VyY2UgcG9pbnQKKwlpZiAodGhpcy5zb3VyY2VQb2ludCAhPSBudWxsKQorCXsKKwkJdGhpcy5zb3VyY2VQb2ludC54ID0gcGFyc2VGbG9hdCh0aGlzLnNvdXJjZVBvaW50LngpICogc3g7CisJCXRoaXMuc291cmNlUG9pbnQueSA9IHBhcnNlRmxvYXQodGhpcy5zb3VyY2VQb2ludC55KSAqIHN5OworCX0KKwkKKwkvLyBUcmFuc2xhdGVzIHRoZSB0YXJnZXQgcG9pbnQKKwlpZiAodGhpcy50YXJnZXRQb2ludCAhPSBudWxsKQorCXsKKwkJdGhpcy50YXJnZXRQb2ludC54ID0gcGFyc2VGbG9hdCh0aGlzLnRhcmdldFBvaW50LngpICogc3g7CisJCXRoaXMudGFyZ2V0UG9pbnQueSA9IHBhcnNlRmxvYXQodGhpcy50YXJnZXRQb2ludC55KSAqIHN5OwkJCisJfQorCisJLy8gVHJhbnNsYXRlIHRoZSBjb250cm9sIHBvaW50cworCWlmICh0aGlzLnBvaW50cyAhPSBudWxsKQorCXsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBvaW50cy5sZW5ndGg7IGkrKykKKwkJeworCQkJaWYgKHRoaXMucG9pbnRzW2ldICE9IG51bGwpCisJCQl7CisJCQkJdGhpcy5wb2ludHNbaV0ueCA9IHBhcnNlRmxvYXQodGhpcy5wb2ludHNbaV0ueCkgKiBzeDsKKwkJCQl0aGlzLnBvaW50c1tpXS55ID0gcGFyc2VGbG9hdCh0aGlzLnBvaW50c1tpXS55KSAqIHN5OworCQkJfQorCQl9CisJfQorCQorCS8vIFRyYW5zbGF0ZXMgdGhlIGdlb21ldHJ5CisJaWYgKCF0aGlzLnJlbGF0aXZlKQorCXsKKwkJdGhpcy54ID0gcGFyc2VGbG9hdCh0aGlzLngpICogc3g7CisJCXRoaXMueSA9IHBhcnNlRmxvYXQodGhpcy55KSAqIHN5OworCisJCWlmIChmaXhlZEFzcGVjdCkKKwkJeworCQkJc3kgPSBzeCA9IE1hdGgubWluKHN4LCBzeSk7CisJCX0KKwkJCisJCXRoaXMud2lkdGggPSBwYXJzZUZsb2F0KHRoaXMud2lkdGgpICogc3g7CisJCXRoaXMuaGVpZ2h0ID0gcGFyc2VGbG9hdCh0aGlzLmhlaWdodCkgKiBzeTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBlcXVhbHMKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgZXF1YWxzIHRoaXMgZ2VvbWV0cnkuCisgKi8KK214R2VvbWV0cnkucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uKG9iaikKK3sKKwlyZXR1cm4gbXhSZWN0YW5nbGUucHJvdG90eXBlLmVxdWFscy5hcHBseSh0aGlzLCBhcmd1bWVudHMpICYmCisJCXRoaXMucmVsYXRpdmUgPT0gb2JqLnJlbGF0aXZlICYmCisJCSgodGhpcy5zb3VyY2VQb2ludCA9PSBudWxsICYmIG9iai5zb3VyY2VQb2ludCA9PSBudWxsKSB8fCAodGhpcy5zb3VyY2VQb2ludCAhPSBudWxsICYmIHRoaXMuc291cmNlUG9pbnQuZXF1YWxzKG9iai5zb3VyY2VQb2ludCkpKSAmJgorCQkoKHRoaXMudGFyZ2V0UG9pbnQgPT0gbnVsbCAmJiBvYmoudGFyZ2V0UG9pbnQgPT0gbnVsbCkgfHwgKHRoaXMudGFyZ2V0UG9pbnQgIT0gbnVsbCAmJiB0aGlzLnRhcmdldFBvaW50LmVxdWFscyhvYmoudGFyZ2V0UG9pbnQpKSkgJiYKKwkJKCh0aGlzLnBvaW50cyA9PSBudWxsICYmIG9iai5wb2ludHMgPT0gbnVsbCkgfHwgKHRoaXMucG9pbnRzICE9IG51bGwgJiYgbXhVdGlscy5lcXVhbFBvaW50cyh0aGlzLnBvaW50cywgb2JqLnBvaW50cykpKSAmJgorCQkoKHRoaXMuYWx0ZXJuYXRlQm91bmRzID09IG51bGwgJiYgb2JqLmFsdGVybmF0ZUJvdW5kcyA9PSBudWxsKSB8fCAodGhpcy5hbHRlcm5hdGVCb3VuZHMgIT0gbnVsbCAmJiB0aGlzLmFsdGVybmF0ZUJvdW5kcy5lcXVhbHMob2JqLmFsdGVybmF0ZUJvdW5kcykpKSAmJgorCQkoKHRoaXMub2Zmc2V0ID09IG51bGwgJiYgb2JqLm9mZnNldCA9PSBudWxsKSB8fCAodGhpcy5vZmZzZXQgIT0gbnVsbCAmJiB0aGlzLm9mZnNldC5lcXVhbHMob2JqLm9mZnNldCkpKTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvbW9kZWwvbXhHcmFwaE1vZGVsLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL21vZGVsL214R3JhcGhNb2RlbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDAxYmFjCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL21vZGVsL214R3JhcGhNb2RlbC5qcwpAQCAtMCwwICsxLDI2NjcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14R3JhcGhNb2RlbAorICogCisgKiBFeHRlbmRzIDxteEV2ZW50U291cmNlPiB0byBpbXBsZW1lbnQgYSBncmFwaCBtb2RlbC4gVGhlIGdyYXBoIG1vZGVsIGFjdHMgYXMKKyAqIGEgd3JhcHBlciBhcm91bmQgdGhlIGNlbGxzIHdoaWNoIGFyZSBpbiBjaGFyZ2Ugb2Ygc3RvcmluZyB0aGUgYWN0dWFsIGdyYXBoCisgKiBkYXRhc3RydWN0dXJlLiBUaGUgbW9kZWwgYWN0cyBhcyBhIHRyYW5zYWN0aW9uYWwgd3JhcHBlciB3aXRoIGV2ZW50CisgKiBub3RpZmljYXRpb24gZm9yIGFsbCBjaGFuZ2VzLCB3aGVyZWFzIHRoZSBjZWxscyBjb250YWluIHRoZSBhdG9taWMKKyAqIG9wZXJhdGlvbnMgZm9yIHVwZGF0aW5nIHRoZSBhY3R1YWwgZGF0YXN0cnVjdHVyZS4KKyAqIAorICogTGF5ZXJzOgorICogCisgKiBUaGUgY2VsbCBoaWVyYXJjaHkgaW4gdGhlIG1vZGVsIG11c3QgaGF2ZSBhIHRvcC1sZXZlbCByb290IGNlbGwgd2hpY2gKKyAqIGNvbnRhaW5zIHRoZSBsYXllcnMgKHR5cGljYWxseSBvbmUgZGVmYXVsdCBsYXllciksIHdoaWNoIGluIHR1cm4gY29udGFpbiB0aGUKKyAqIHRvcC1sZXZlbCBjZWxscyBvZiB0aGUgbGF5ZXJzLiBUaGlzIG1lYW5zIGVhY2ggY2VsbCBpcyBjb250YWluZWQgaW4gYSBsYXllci4KKyAqIElmIG5vIGxheWVycyBhcmUgcmVxdWlyZWQsIHRoZW4gYWxsIG5ldyBjZWxscyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGRlZmF1bHQKKyAqIGxheWVyLgorICogCisgKiBMYXllcnMgYXJlIHVzZWZ1bCBmb3IgaGlkaW5nIGFuZCBzaG93aW5nIGdyb3VwcyBvZiBjZWxscywgb3IgZm9yIHBsYWNpbmcKKyAqIGdyb3VwcyBvZiBjZWxscyBvbiB0b3Agb2Ygb3RoZXIgY2VsbHMgaW4gdGhlIGRpc3BsYXkuIFRvIGlkZW50aWZ5IGEgbGF5ZXIsCisgKiB0aGUgPGlzTGF5ZXI+IGZ1bmN0aW9uIGlzIHVzZWQuIEl0IHJldHVybnMgdHJ1ZSBpZiB0aGUgcGFyZW50IG9mIHRoZSBnaXZlbgorICogY2VsbCBpcyB0aGUgcm9vdCBvZiB0aGUgbW9kZWwuCisgKiAKKyAqIEV2ZW50czoKKyAqIAorICogU2VlIGV2ZW50cyBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMuIFRoZXJlIGlzIGEgbmV3IHNldCBvZiBldmVudHMgZm9yCisgKiB0cmFja2luZyB0cmFuc2FjdGlvbmFsIGNoYW5nZXMgYXMgdGhleSBoYXBwZW4uIFRoZSBldmVudHMgYXJlIGNhbGxlZAorICogc3RhcnRFZGl0IGZvciB0aGUgaW5pdGlhbCBiZWdpblVwZGF0ZSwgZXhlY3V0ZWQgZm9yIGVhY2ggZXhlY3V0ZWQgY2hhbmdlCisgKiBhbmQgZW5kRWRpdCBmb3IgdGhlIHRlcm1pbmFsIGVuZFVwZGF0ZS4gVGhlIGV4ZWN1dGVkIGV2ZW50IGNvbnRhaW5zIGEKKyAqIHByb3BlcnR5IGNhbGxlZCBjaGFuZ2Ugd2hpY2ggcmVwcmVzZW50cyB0aGUgY2hhbmdlIGFmdGVyIGV4ZWN1dGlvbi4KKyAqIAorICogRW5jb2RpbmcgdGhlIG1vZGVsOgorICogCisgKiBUbyBlbmNvZGUgYSBncmFwaCBtb2RlbCwgdXNlIHRoZSBmb2xsb3dpbmcgY29kZToKKyAqIAorICogKGNvZGUpCisgKiB2YXIgZW5jID0gbmV3IG14Q29kZWMoKTsKKyAqIHZhciBub2RlID0gZW5jLmVuY29kZShncmFwaC5nZXRNb2RlbCgpKTsKKyAqIChlbmQpCisgKiAKKyAqIFRoaXMgd2lsbCBjcmVhdGUgYW4gWE1MIG5vZGUgdGhhdCBjb250YWlucyBhbGwgdGhlIG1vZGVsIGluZm9ybWF0aW9uLgorICogCisgKiBFbmNvZGluZyBhbmQgZGVjb2RpbmcgY2hhbmdlczoKKyAqIAorICogRm9yIHRoZSBlbmNvZGluZyBvZiBjaGFuZ2VzLCBhIGdyYXBoIG1vZGVsIGxpc3RlbmVyIGlzIHJlcXVpcmVkIHRoYXQgZW5jb2RlcworICogZWFjaCBjaGFuZ2UgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkgb2YgY2hhbmdlcy4KKyAqIAorICogKGNvZGUpCisgKiBtb2RlbC5hZGRMaXN0ZW5lcihteEV2ZW50LkNIQU5HRSwgZnVuY3Rpb24oc2VuZGVyLCBldnQpCisgKiB7CisgKiAgIHZhciBjaGFuZ2VzID0gZXZ0LmdldFByb3BlcnR5KCdlZGl0JykuY2hhbmdlczsKKyAqICAgdmFyIG5vZGVzID0gW107CisgKiAgIHZhciBjb2RlYyA9IG5ldyBteENvZGVjKCk7CisgKiAKKyAqICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKQorICogICB7CisgKiAgICAgbm9kZXMucHVzaChjb2RlYy5lbmNvZGUoY2hhbmdlc1tpXSkpOworICogICB9CisgKiAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBub2RlcworICogfSk7CisgKiAoZW5kKQorICogCisgKiBGb3IgdGhlIGRlY29kaW5nIGFuZCBleGVjdXRpb24gb2YgY2hhbmdlcywgdGhlIGNvZGVjIG5lZWRzIGEgbG9va3VwIGZ1bmN0aW9uCisgKiB0aGF0IGFsbG93cyBpdCB0byByZXNvbHZlIGNlbGwgSURzIGFzIGZvbGxvd3M6CisgKiAKKyAqIChjb2RlKQorICogdmFyIGNvZGVjID0gbmV3IG14Q29kZWMoKTsKKyAqIGNvZGVjLmxvb2t1cCA9IGZ1bmN0aW9uKGlkKQorICogeworICogICByZXR1cm4gbW9kZWwuZ2V0Q2VsbChpZCk7CisgKiB9CisgKiAoZW5kKQorICogCisgKiBGb3IgZWFjaCBlbmNvZGVkIGNoYW5nZSAocmVwcmVzZW50ZWQgYnkgYSBub2RlKSwgdGhlIGZvbGxvd2luZyBjb2RlIGNhbiBiZQorICogdXNlZCB0byBjYXJyeSBvdXQgdGhlIGRlY29kaW5nIGFuZCBjcmVhdGUgYSBjaGFuZ2Ugb2JqZWN0LgorICogCisgKiAoY29kZSkKKyAqIHZhciBjaGFuZ2VzID0gW107CisgKiB2YXIgY2hhbmdlID0gY29kZWMuZGVjb2RlKG5vZGUpOworICogY2hhbmdlLm1vZGVsID0gbW9kZWw7CisgKiBjaGFuZ2UuZXhlY3V0ZSgpOworICogY2hhbmdlcy5wdXNoKGNoYW5nZSk7CisgKiAoZW5kKQorICogCisgKiBUaGUgY2hhbmdlcyBjYW4gdGhlbiBiZSBkaXNwYXRjaGVkIHVzaW5nIHRoZSBtb2RlbCBhcyBmb2xsb3dzLgorICogCisgKiAoY29kZSkKKyAqIHZhciBlZGl0ID0gbmV3IG14VW5kb2FibGVFZGl0KG1vZGVsLCBmYWxzZSk7CisgKiBlZGl0LmNoYW5nZXMgPSBjaGFuZ2VzOworICogCisgKiBlZGl0Lm5vdGlmeSA9IGZ1bmN0aW9uKCkKKyAqIHsKKyAqICAgZWRpdC5zb3VyY2UuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuQ0hBTkdFLAorICogICAJJ2VkaXQnLCBlZGl0LCAnY2hhbmdlcycsIGVkaXQuY2hhbmdlcykpOworICogICBlZGl0LnNvdXJjZS5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5OT1RJRlksCisgKiAgIAknZWRpdCcsIGVkaXQsICdjaGFuZ2VzJywgZWRpdC5jaGFuZ2VzKSk7CisgKiB9CisgKiAKKyAqIG1vZGVsLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LlVORE8sICdlZGl0JywgZWRpdCkpOworICogbW9kZWwuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuQ0hBTkdFLAorICogCQknZWRpdCcsIGVkaXQsICdjaGFuZ2VzJywgY2hhbmdlcykpOworICogKGVuZCkKKyAqCisgKiBFdmVudDogbXhFdmVudC5DSEFOR0UKKyAqCisgKiBGaXJlcyB3aGVuIGFuIHVuZG9hYmxlIGVkaXQgaXMgZGlzcGF0Y2hlZC4gVGhlIDxjb2RlPmVkaXQ8L2NvZGU+IHByb3BlcnR5CisgKiBjb250YWlucyB0aGUgPG14VW5kb2FibGVFZGl0Pi4gVGhlIDxjb2RlPmNoYW5nZXM8L2NvZGU+IHByb3BlcnR5IGNvbnRhaW5zCisgKiB0aGUgYXJyYXkgb2YgYXRvbWljIGNoYW5nZXMgaW5zaWRlIHRoZSB1bmRvYWJsZSBlZGl0LiBUaGUgY2hhbmdlcyBwcm9wZXJ0eQorICogaXMgPHN0cm9uZz5kZXByZWNhdGVkPC9zdHJvbmc+LCBwbGVhc2UgdXNlIGVkaXQuY2hhbmdlcyBpbnN0ZWFkLgorICoKKyAqIEV4YW1wbGU6CisgKiAKKyAqIEZvciBmaW5kaW5nIG5ld2x5IGluc2VydGVkIGNlbGxzLCB0aGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQ6CisgKiAKKyAqIChjb2RlKQorICogZ3JhcGgubW9kZWwuYWRkTGlzdGVuZXIobXhFdmVudC5DSEFOR0UsIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorICogeworICogICB2YXIgY2hhbmdlcyA9IGV2dC5nZXRQcm9wZXJ0eSgnZWRpdCcpLmNoYW5nZXM7CisgKiAKKyAqICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKQorICogICB7CisgKiAgICAgdmFyIGNoYW5nZSA9IGNoYW5nZXNbaV07CisgKiAgICAgCisgKiAgICAgaWYgKGNoYW5nZSBpbnN0YW5jZW9mIG14Q2hpbGRDaGFuZ2UgJiYKKyAqICAgICAgIGNoYW5nZS5jaGFuZ2UucHJldmlvdXMgPT0gbnVsbCkKKyAqICAgICB7CisgKiAgICAgICBncmFwaC5zdGFydEVkaXRpbmdBdENlbGwoY2hhbmdlLmNoaWxkKTsKKyAqICAgICAgIGJyZWFrOworICogICAgIH0KKyAqICAgfQorICogfSk7CisgKiAoZW5kKQorICogCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50Lk5PVElGWQorICoKKyAqIFNhbWUgYXMgPG14RXZlbnQuQ0hBTkdFPiwgdGhpcyBldmVudCBjYW4gYmUgdXNlZCBmb3IgY2xhc3NlcyB0aGF0IG5lZWQgdG8KKyAqIGltcGxlbWVudCBhIHN5bmMgbWVjaGFuaXNtIGJldHdlZW4gdGhpcyBtb2RlbCBhbmQsIHNheSwgYSByZW1vdGUgbW9kZWwuIEluCisgKiBzdWNoIGEgc2V0dXAsIG9ubHkgbG9jYWwgY2hhbmdlcyBzaG91bGQgdHJpZ2dlciBhIG5vdGlmeSBldmVudCBhbmQgYWxsCisgKiBjaGFuZ2VzIHNob3VsZCB0cmlnZ2VyIGEgY2hhbmdlIGV2ZW50LgorICogCisgKiBFdmVudDogbXhFdmVudC5FWEVDVVRFCisgKiAKKyAqIEZpcmVzIGJldHdlZW4gYmVnaW4tIGFuZCBlbmRVcGRhdGUgYW5kIGFmdGVyIGFuIGF0b21pYyBjaGFuZ2Ugd2FzIGV4ZWN1dGVkCisgKiBpbiB0aGUgbW9kZWwuIFRoZSA8Y29kZT5jaGFuZ2U8L2NvZGU+IHByb3BlcnR5IGNvbnRhaW5zIHRoZSBhdG9taWMgY2hhbmdlCisgKiB0aGF0IHdhcyBleGVjdXRlZC4KKyAqIAorICogRXZlbnQ6IG14RXZlbnQuRVhFQ1VURUQKKyAqIAorICogRmlyZXMgYmV0d2VlbiBTVEFSVF9FRElUIGFuZCBFTkRfRURJVCBhZnRlciBhbiBhdG9taWMgY2hhbmdlIHdhcyBleGVjdXRlZC4KKyAqIFRoZSA8Y29kZT5jaGFuZ2U8L2NvZGU+IHByb3BlcnR5IGNvbnRhaW5zIHRoZSBjaGFuZ2UgdGhhdCB3YXMgZXhlY3V0ZWQuCisgKgorICogRXZlbnQ6IG14RXZlbnQuQkVHSU5fVVBEQVRFCisgKgorICogRmlyZXMgYWZ0ZXIgdGhlIDx1cGRhdGVMZXZlbD4gd2FzIGluY3JlbWVudGVkIGluIDxiZWdpblVwZGF0ZT4uIFRoaXMgZXZlbnQKKyAqIGNvbnRhaW5zIG5vIHByb3BlcnRpZXMuCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LlNUQVJUX0VESVQKKyAqCisgKiBGaXJlcyBhZnRlciB0aGUgPHVwZGF0ZUxldmVsPiB3YXMgY2hhbmdlZCBmcm9tIDAgdG8gMS4gVGhpcyBldmVudAorICogY29udGFpbnMgbm8gcHJvcGVydGllcy4KKyAqIAorICogRXZlbnQ6IG14RXZlbnQuRU5EX1VQREFURQorICogCisgKiBGaXJlcyBhZnRlciB0aGUgPHVwZGF0ZUxldmVsPiB3YXMgZGVjcmVhc2VkIGluIDxlbmRVcGRhdGU+IGJ1dCBiZWZvcmUgYW55CisgKiBub3RpZmljYXRpb24gb3IgY2hhbmdlIGRpc3BhdGNoaW5nLiBUaGUgPGNvZGU+ZWRpdDwvY29kZT4gcHJvcGVydHkgY29udGFpbnMKKyAqIHRoZSA8Y3VycmVudEVkaXQ+LgorICogCisgKiBFdmVudDogbXhFdmVudC5FTkRfRURJVAorICoKKyAqIEZpcmVzIGFmdGVyIHRoZSA8dXBkYXRlTGV2ZWw+IHdhcyBjaGFuZ2VkIGZyb20gMSB0byAwLiBUaGlzIGV2ZW50CisgKiBjb250YWlucyBubyBwcm9wZXJ0aWVzLgorICogCisgKiBFdmVudDogbXhFdmVudC5CRUZPUkVfVU5ETworICogCisgKiBGaXJlcyBiZWZvcmUgdGhlIGNoYW5nZSBpcyBkaXNwYXRjaGVkIGFmdGVyIHRoZSB1cGRhdGUgbGV2ZWwgaGFzIHJlYWNoZWQgMAorICogaW4gPGVuZFVwZGF0ZT4uIFRoZSA8Y29kZT5lZGl0PC9jb2RlPiBwcm9wZXJ0eSBjb250YWlucyB0aGUgPGN1cnJlbmVFZGl0Pi4KKyAqIAorICogRXZlbnQ6IG14RXZlbnQuVU5ETworICogCisgKiBGaXJlcyBhZnRlciB0aGUgY2hhbmdlIHdhcyBkaXNwYXRjaGVkIGluIDxlbmRVcGRhdGU+LiBUaGUgPGNvZGU+ZWRpdDwvY29kZT4KKyAqIHByb3BlcnR5IGNvbnRhaW5zIHRoZSA8Y3VycmVudEVkaXQ+LgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhHcmFwaE1vZGVsCisgKiAKKyAqIENvbnN0cnVjdHMgYSBuZXcgZ3JhcGggbW9kZWwuIElmIG5vIHJvb3QgaXMgc3BlY2lmaWVkIHRoZW4gYSBuZXcgcm9vdAorICogPG14Q2VsbD4gd2l0aCBhIGRlZmF1bHQgbGF5ZXIgaXMgY3JlYXRlZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogcm9vdCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgcm9vdCBjZWxsLgorICovCitmdW5jdGlvbiBteEdyYXBoTW9kZWwocm9vdCkKK3sKKwl0aGlzLmN1cnJlbnRFZGl0ID0gdGhpcy5jcmVhdGVVbmRvYWJsZUVkaXQoKTsKKwkKKwlpZiAocm9vdCAhPSBudWxsKQorCXsKKwkJdGhpcy5zZXRSb290KHJvb3QpOworCX0KKwllbHNlCisJeworCQl0aGlzLmNsZWFyKCk7CisJfQorfTsKKworLyoqCisgKiBFeHRlbmRzIG14RXZlbnRTb3VyY2UuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUgPSBuZXcgbXhFdmVudFNvdXJjZSgpOworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG14R3JhcGhNb2RlbDsKKworLyoqCisgKiBWYXJpYWJsZTogcm9vdAorICogCisgKiBIb2xkcyB0aGUgcm9vdCBjZWxsLCB3aGljaCBpbiB0dXJuIGNvbnRhaW5zIHRoZSBjZWxscyB0aGF0IHJlcHJlc2VudCB0aGUKKyAqIGxheWVycyBvZiB0aGUgZGlhZ3JhbSBhcyBjaGlsZCBjZWxscy4gVGhhdCBpcywgdGhlIGFjdHVhbCBlbGVtZW50cyBvZiB0aGUKKyAqIGRpYWdyYW0gYXJlIHN1cHBvc2VkIHRvIGxpdmUgaW4gdGhlIHRoaXJkIGdlbmVyYXRpb24gb2YgY2VsbHMgYW5kIGJlbG93LgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLnJvb3QgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjZWxscworICogCisgKiBNYXBzIGZyb20gSWRzIHRvIGNlbGxzLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmNlbGxzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbWFpbnRhaW5FZGdlUGFyZW50CisgKiAKKyAqIFNwZWNpZmllcyBpZiBlZGdlcyBzaG91bGQgYXV0b21hdGljYWxseSBiZSBtb3ZlZCBpbnRvIHRoZSBuZWFyZXN0IGNvbW1vbgorICogYW5jZXN0b3Igb2YgdGhlaXIgdGVybWluYWxzLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUubWFpbnRhaW5FZGdlUGFyZW50ID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogaWdub3JlUmVsYXRpdmVFZGdlUGFyZW50CisgKiAKKyAqIFNwZWNpZmllcyBpZiByZWxhdGl2ZSBlZGdlIHBhcmVudHMgc2hvdWxkIGJlIGlnbm9yZWQgZm9yIGZpbmRpbmcgdGhlIG5lYXJlc3QKKyAqIGNvbW1vbiBhbmNlc3RvcnMgb2YgYW4gZWRnZSdzIHRlcm1pbmFscy4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmlnbm9yZVJlbGF0aXZlRWRnZVBhcmVudCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGNyZWF0ZUlkcworICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIG1vZGVsIHNob3VsZCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBJZHMgZm9yIG5ldyBjZWxscy4KKyAqIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5jcmVhdGVJZHMgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBwcmVmaXgKKyAqIAorICogRGVmaW5lcyB0aGUgcHJlZml4IG9mIG5ldyBJZHMuIERlZmF1bHQgaXMgYW4gZW1wdHkgc3RyaW5nLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLnByZWZpeCA9ICcnOworCisvKioKKyAqIFZhcmlhYmxlOiBwb3N0Zml4CisgKiAKKyAqIERlZmluZXMgdGhlIHBvc3RmaXggb2YgbmV3IElkcy4gRGVmYXVsdCBpcyBhbiBlbXB0eSBzdHJpbmcuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUucG9zdGZpeCA9ICcnOworCisvKioKKyAqIFZhcmlhYmxlOiBuZXh0SWQKKyAqIAorICogU3BlY2lmaWVzIHRoZSBuZXh0IElkIHRvIGJlIGNyZWF0ZWQuIEluaXRpYWwgdmFsdWUgaXMgMC4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5uZXh0SWQgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBjdXJyZW50RWRpdAorICogCisgKiBIb2xkcyB0aGUgY2hhbmdlcyBmb3IgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uIElmIHRoZSB0cmFuc2FjdGlvbiBpcworICogY2xvc2VkIHRoZW4gYSBuZXcgb2JqZWN0IGlzIGNyZWF0ZWQgZm9yIHRoaXMgdmFyaWFibGUgdXNpbmcKKyAqIDxjcmVhdGVVbmRvYWJsZUVkaXQ+LgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmN1cnJlbnRFZGl0ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogdXBkYXRlTGV2ZWwKKyAqIAorICogQ291bnRlciBmb3IgdGhlIGRlcHRoIG9mIG5lc3RlZCB0cmFuc2FjdGlvbnMuIEVhY2ggY2FsbCB0byA8YmVnaW5VcGRhdGU+CisgKiB3aWxsIGluY3JlbWVudCB0aGlzIG51bWJlciBhbmQgZWFjaCBjYWxsIHRvIDxlbmRVcGRhdGU+IHdpbGwgZGVjcmVtZW50CisgKiBpdC4gV2hlbiB0aGUgY291bnRlciByZWFjaGVzIDAsIHRoZSB0cmFuc2FjdGlvbiBpcyBjbG9zZWQgYW5kIHRoZQorICogcmVzcGVjdGl2ZSBldmVudHMgYXJlIGZpcmVkLiBJbml0aWFsIHZhbHVlIGlzIDAuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUudXBkYXRlTGV2ZWwgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBlbmRpbmdVcGRhdGUKKyAqIAorICogVHJ1ZSBpZiB0aGUgcHJvZ3JhbSBmbG93IGlzIGN1cnJlbnRseSBpbnNpZGUgZW5kVXBkYXRlLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmVuZGluZ1VwZGF0ZSA9IGZhbHNlOworCisvKioKKyAqIEZ1bmN0aW9uOiBjbGVhcgorICoKKyAqIFNldHMgYSBuZXcgcm9vdCB1c2luZyA8Y3JlYXRlUm9vdD4uCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpCit7CisJdGhpcy5zZXRSb290KHRoaXMuY3JlYXRlUm9vdCgpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQ3JlYXRlSWRzCisgKgorICogUmV0dXJucyA8Y3JlYXRlSWRzPi4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5pc0NyZWF0ZUlkcyA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5jcmVhdGVJZHM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRDcmVhdGVJZHMKKyAqCisgKiBTZXRzIDxjcmVhdGVJZHM+LgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLnNldENyZWF0ZUlkcyA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuY3JlYXRlSWRzID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVSb290CisgKgorICogQ3JlYXRlcyBhIG5ldyByb290IGNlbGwgd2l0aCBhIGRlZmF1bHQgbGF5ZXIgKGNoaWxkIDApLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmNyZWF0ZVJvb3QgPSBmdW5jdGlvbigpCit7CisJdmFyIGNlbGwgPSBuZXcgbXhDZWxsKCk7CisJY2VsbC5pbnNlcnQobmV3IG14Q2VsbCgpKTsKKwkKKwlyZXR1cm4gY2VsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldENlbGwKKyAqCisgKiBSZXR1cm5zIHRoZSA8bXhDZWxsPiBmb3IgdGhlIHNwZWNpZmllZCBJZCBvciBudWxsIGlmIG5vIGNlbGwgY2FuIGJlCisgKiBmb3VuZCBmb3IgdGhlIGdpdmVuIElkLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGlkIC0gQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBJZCBvZiB0aGUgY2VsbC4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5nZXRDZWxsID0gZnVuY3Rpb24oaWQpCit7CisJcmV0dXJuICh0aGlzLmNlbGxzICE9IG51bGwpID8gdGhpcy5jZWxsc1tpZF0gOiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZmlsdGVyQ2VsbHMKKyAqIAorICogUmV0dXJucyB0aGUgY2VsbHMgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkgd2hlcmUgdGhlIGdpdmVuIGZpbHRlciBmdW5jdGlvbgorICogcmV0dXJucyB0cnVlLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmZpbHRlckNlbGxzID0gZnVuY3Rpb24oY2VsbHMsIGZpbHRlcikKK3sKKwl2YXIgcmVzdWx0ID0gbnVsbDsKKwkKKwlpZiAoY2VsbHMgIT0gbnVsbCkKKwl7CisJCXJlc3VsdCA9IFtdOworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkJeworCQkJaWYgKGZpbHRlcihjZWxsc1tpXSkpCisJCQl7CisJCQkJcmVzdWx0LnB1c2goY2VsbHNbaV0pOworCQkJfQorCQl9CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXREZXNjZW5kYW50cworICogCisgKiBSZXR1cm5zIGFsbCBkZXNjZW5kYW50cyBvZiB0aGUgZ2l2ZW4gY2VsbCBhbmQgdGhlIGNlbGwgaXRzZWxmIGluIGFuIGFycmF5LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwYXJlbnQgLSA8bXhDZWxsPiB3aG9zZSBkZXNjZW5kYW50cyBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuZ2V0RGVzY2VuZGFudHMgPSBmdW5jdGlvbihwYXJlbnQpCit7CisJcmV0dXJuIHRoaXMuZmlsdGVyRGVzY2VuZGFudHMobnVsbCwgcGFyZW50KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGZpbHRlckRlc2NlbmRhbnRzCisgKiAKKyAqIFZpc2l0cyBhbGwgY2VsbHMgcmVjdXJzaXZlbHkgYW5kIGFwcGxpZXMgdGhlIHNwZWNpZmllZCBmaWx0ZXIgZnVuY3Rpb24KKyAqIHRvIGVhY2ggY2VsbC4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB0aGVuIHRoZSBjZWxsIGlzIGFkZGVkCisgKiB0byB0aGUgcmVzdWx0aW5nIGFycmF5LiBUaGUgcGFyZW50IGFuZCByZXN1bHQgcGFyYW10ZXJzIGFyZSBvcHRpb25hbC4KKyAqIElmIHBhcmVudCBpcyBub3Qgc3BlY2lmaWVkIHRoZW4gdGhlIHJlY3Vyc2lvbiBzdGFydHMgYXQgPHJvb3Q+LgorICogCisgKiBFeGFtcGxlOgorICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGV4dHJhY3RzIGFsbCB2ZXJ0aWNlcyBmcm9tIGEgZ2l2ZW4gbW9kZWw6CisgKiAoY29kZSkKKyAqIHZhciBmaWx0ZXIgPSBmdW5jdGlvbihjZWxsKQorICogeworICogCXJldHVybiBtb2RlbC5pc1ZlcnRleChjZWxsKTsKKyAqIH0KKyAqIHZhciB2ZXJ0aWNlcyA9IG1vZGVsLmZpbHRlckRlc2NlbmRhbnRzKGZpbHRlcik7CisgKiAoZW5kKQorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBmaWx0ZXIgLSBKYXZhU2NyaXB0IGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gPG14Q2VsbD4gYXMgYW4gYXJndW1lbnQKKyAqIGFuZCByZXR1cm5zIGEgYm9vbGVhbi4KKyAqIHBhcmVudCAtIE9wdGlvbmFsIDxteENlbGw+IHRoYXQgaXMgdXNlZCBhcyB0aGUgcm9vdCBvZiB0aGUgcmVjdXJzaW9uLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmZpbHRlckRlc2NlbmRhbnRzID0gZnVuY3Rpb24oZmlsdGVyLCBwYXJlbnQpCit7CisJLy8gQ3JlYXRlcyBhIG5ldyBhcnJheSBmb3Igc3RvcmluZyB0aGUgcmVzdWx0CisJdmFyIHJlc3VsdCA9IFtdOworCisJLy8gUmVjdXJzaW9uIHN0YXJ0cyBhdCB0aGUgcm9vdCBvZiB0aGUgbW9kZWwKKwlwYXJlbnQgPSBwYXJlbnQgfHwgdGhpcy5nZXRSb290KCk7CisJCisJLy8gQ2hlY2tzIGlmIHRoZSBmaWx0ZXIgcmV0dXJucyB0cnVlIGZvciB0aGUgY2VsbAorCS8vIGFuZCBhZGRzIGl0IHRvIHRoZSByZXN1bHQgYXJyYXkKKwlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyKHBhcmVudCkpCisJeworCQlyZXN1bHQucHVzaChwYXJlbnQpOworCX0KKwkKKwkvLyBWaXNpdHMgdGhlIGNoaWxkcmVuIG9mIHRoZSBjZWxsCisJdmFyIGNoaWxkQ291bnQgPSB0aGlzLmdldENoaWxkQ291bnQocGFyZW50KTsKKwkKKwlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykKKwl7CisJCXZhciBjaGlsZCA9IHRoaXMuZ2V0Q2hpbGRBdChwYXJlbnQsIGkpOworCQlyZXN1bHQgPSByZXN1bHQuY29uY2F0KHRoaXMuZmlsdGVyRGVzY2VuZGFudHMoZmlsdGVyLCBjaGlsZCkpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRSb290CisgKiAKKyAqIFJldHVybnMgdGhlIHJvb3Qgb2YgdGhlIG1vZGVsIG9yIHRoZSB0b3Btb3N0IHBhcmVudCBvZiB0aGUgZ2l2ZW4gY2VsbC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gT3B0aW9uYWwgPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIGNoaWxkLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmdldFJvb3QgPSBmdW5jdGlvbihjZWxsKQoreworCXZhciByb290ID0gY2VsbCB8fCB0aGlzLnJvb3Q7CisJCisJaWYgKGNlbGwgIT0gbnVsbCkKKwl7CisJCXdoaWxlIChjZWxsICE9IG51bGwpCisJCXsKKwkJCXJvb3QgPSBjZWxsOworCQkJY2VsbCA9IHRoaXMuZ2V0UGFyZW50KGNlbGwpOworCQl9CisJfQorCQorCXJldHVybiByb290OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0Um9vdAorICogCisgKiBTZXRzIHRoZSA8cm9vdD4gb2YgdGhlIG1vZGVsIHVzaW5nIDxteFJvb3RDaGFuZ2U+IGFuZCBhZGRzIHRoZSBjaGFuZ2UgdG8KKyAqIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiBUaGlzIHJlc2V0cyBhbGwgZGF0YXN0cnVjdHVyZXMgaW4gdGhlIG1vZGVsIGFuZAorICogaXMgdGhlIHByZWZlcnJlZCB3YXkgb2YgY2xlYXJpbmcgYW4gZXhpc3RpbmcgbW9kZWwuIFJldHVybnMgdGhlIG5ldworICogcm9vdC4KKyAqIAorICogRXhhbXBsZToKKyAqIAorICogKGNvZGUpCisgKiB2YXIgcm9vdCA9IG5ldyBteENlbGwoKTsKKyAqIHJvb3QuaW5zZXJ0KG5ldyBteENlbGwoKSk7CisgKiBtb2RlbC5zZXRSb290KHJvb3QpOworICogKGVuZCkKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiByb290IC0gPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIG5ldyByb290LgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLnNldFJvb3QgPSBmdW5jdGlvbihyb290KQoreworCXRoaXMuZXhlY3V0ZShuZXcgbXhSb290Q2hhbmdlKHRoaXMsIHJvb3QpKTsKKwkKKwlyZXR1cm4gcm9vdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJvb3RDaGFuZ2VkCisgKiAKKyAqIElubmVyIGNhbGxiYWNrIHRvIGNoYW5nZSB0aGUgcm9vdCBvZiB0aGUgbW9kZWwgYW5kIHVwZGF0ZSB0aGUgaW50ZXJuYWwKKyAqIGRhdGFzdHJ1Y3R1cmVzLCBzdWNoIGFzIDxjZWxscz4gYW5kIDxuZXh0SWQ+LiBSZXR1cm5zIHRoZSBwcmV2aW91cyByb290LgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHJvb3QgLSA8bXhDZWxsPiB0aGF0IHNwZWNpZmllcyB0aGUgbmV3IHJvb3QuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUucm9vdENoYW5nZWQgPSBmdW5jdGlvbihyb290KQoreworCXZhciBvbGRSb290ID0gdGhpcy5yb290OworCXRoaXMucm9vdCA9IHJvb3Q7CisJCisJLy8gUmVzZXRzIGNvdW50ZXJzIGFuZCBkYXRhc3RydWN0dXJlcworCXRoaXMubmV4dElkID0gMDsKKwl0aGlzLmNlbGxzID0gbnVsbDsKKwl0aGlzLmNlbGxBZGRlZChyb290KTsKKwkKKwlyZXR1cm4gb2xkUm9vdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzUm9vdAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGNlbGwgaXMgdGhlIHJvb3Qgb2YgdGhlIG1vZGVsIGFuZCBhIG5vbi1udWxsCisgKiB2YWx1ZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBwb3NzaWJsZSByb290LgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmlzUm9vdCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIGNlbGwgIT0gbnVsbCAmJiB0aGlzLnJvb3QgPT0gY2VsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzTGF5ZXIKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIDxpc1Jvb3Q+IHJldHVybnMgdHJ1ZSBmb3IgdGhlIHBhcmVudCBvZiB0aGUgZ2l2ZW4gY2VsbC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBwb3NzaWJsZSBsYXllci4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5pc0xheWVyID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gdGhpcy5pc1Jvb3QodGhpcy5nZXRQYXJlbnQoY2VsbCkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNBbmNlc3RvcgorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHBhcmVudCBpcyBhbiBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4gY2hpbGQuCisgKgorICogUGFyYW1ldGVyczoKKyAqIAorICogcGFyZW50IC0gPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIHBhcmVudC4KKyAqIGNoaWxkIC0gPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIGNoaWxkLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmlzQW5jZXN0b3IgPSBmdW5jdGlvbihwYXJlbnQsIGNoaWxkKQoreworCXdoaWxlIChjaGlsZCAhPSBudWxsICYmIGNoaWxkICE9IHBhcmVudCkKKwl7CisJCWNoaWxkID0gdGhpcy5nZXRQYXJlbnQoY2hpbGQpOworCX0KKwkKKwlyZXR1cm4gY2hpbGQgPT0gcGFyZW50OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY29udGFpbnMKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBtb2RlbCBjb250YWlucyB0aGUgZ2l2ZW4gPG14Q2VsbD4uCisgKgorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRoYXQgc3BlY2lmaWVzIHRoZSBjZWxsLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gdGhpcy5pc0FuY2VzdG9yKHRoaXMucm9vdCwgY2VsbCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRQYXJlbnQKKyAqIAorICogUmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBnaXZlbiBjZWxsLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBwYXJlbnQgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmdldFBhcmVudCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIChjZWxsICE9IG51bGwpID8gY2VsbC5nZXRQYXJlbnQoKSA6IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGQKKyAqIAorICogQWRkcyB0aGUgc3BlY2lmaWVkIGNoaWxkIHRvIHRoZSBwYXJlbnQgYXQgdGhlIGdpdmVuIGluZGV4IHVzaW5nCisgKiA8bXhDaGlsZENoYW5nZT4gYW5kIGFkZHMgdGhlIGNoYW5nZSB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gSWYgbm8KKyAqIGluZGV4IGlzIHNwZWNpZmllZCB0aGVuIHRoZSBjaGlsZCBpcyBhcHBlbmRlZCB0byB0aGUgcGFyZW50J3MgYXJyYXkgb2YKKyAqIGNoaWxkcmVuLiBSZXR1cm5zIHRoZSBpbnNlcnRlZCBjaGlsZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogcGFyZW50IC0gPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIHBhcmVudCB0byBjb250YWluIHRoZSBjaGlsZC4KKyAqIGNoaWxkIC0gPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIGNoaWxkIHRvIGJlIGluc2VydGVkLgorICogaW5kZXggLSBPcHRpb25hbCBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSBpbmRleCBvZiB0aGUgY2hpbGQuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24ocGFyZW50LCBjaGlsZCwgaW5kZXgpCit7CisJaWYgKGNoaWxkICE9IHBhcmVudCAmJiBwYXJlbnQgIT0gbnVsbCAmJiBjaGlsZCAhPSBudWxsKQorCXsJCisJCS8vIEFwcGVuZHMgdGhlIGNoaWxkIGlmIG5vIGluZGV4IHdhcyBzcGVjaWZpZWQKKwkJaWYgKGluZGV4ID09IG51bGwpCisJCXsKKwkJCWluZGV4ID0gdGhpcy5nZXRDaGlsZENvdW50KHBhcmVudCk7CisJCX0KKwkJCisJCXZhciBwYXJlbnRDaGFuZ2VkID0gcGFyZW50ICE9IHRoaXMuZ2V0UGFyZW50KGNoaWxkKTsKKwkJdGhpcy5leGVjdXRlKG5ldyBteENoaWxkQ2hhbmdlKHRoaXMsIHBhcmVudCwgY2hpbGQsIGluZGV4KSk7CisKKwkJLy8gTWFpbnRhaW5zIHRoZSBlZGdlcyBwYXJlbnRzIGJ5IG1vdmluZyB0aGUgZWRnZXMKKwkJLy8gaW50byB0aGUgbmVhcmVzdCBjb21tb24gYW5jZXN0b3Igb2YgaXRzCisJCS8vIHRlcm1pbmFscworCQlpZiAodGhpcy5tYWludGFpbkVkZ2VQYXJlbnQgJiYgcGFyZW50Q2hhbmdlZCkKKwkJeworCQkJdGhpcy51cGRhdGVFZGdlUGFyZW50cyhjaGlsZCk7CisJCX0KKwl9CisJCisJcmV0dXJuIGNoaWxkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY2VsbEFkZGVkCisgKiAKKyAqIElubmVyIGNhbGxiYWNrIHRvIHVwZGF0ZSA8Y2VsbHM+IHdoZW4gYSBjZWxsIGhhcyBiZWVuIGFkZGVkLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiByZXNvbHZlcyBjb2xsaXNpb25zIGJ5IGNyZWF0aW5nIG5ldyBJZHMuIFRvIGNoYW5nZSB0aGUKKyAqIElEIG9mIGEgY2VsbCBhZnRlciBpdCB3YXMgaW5zZXJ0ZWQgaW50byB0aGUgbW9kZWwsIHVzZSB0aGUgZm9sbG93aW5nCisgKiBjb2RlOgorICogCisgKiAoY29kZQorICogZGVsZXRlIG1vZGVsLmNlbGxzW2NlbGwuZ2V0SWQoKV07CisgKiBjZWxsLnNldElkKG5ld0lkKTsKKyAqIG1vZGVsLmNlbGxzW2NlbGwuZ2V0SWQoKV0gPSBjZWxsOworICogKGVuZCkKKyAqCisgKiBJZiB0aGUgY2hhbmdlIG9mIHRoZSBJRCBzaG91bGQgYmUgcGFydCBvZiB0aGUgY29tbWFuZCBoaXN0b3J5LCB0aGVuIHRoZQorICogY2VsbCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBtb2RlbCBhbmQgYSBjbG9uZSB3aXRoIHRoZSBuZXcgSUQgc2hvdWxkCisgKiBiZSByZWluc2VydGVkIGludG8gdGhlIG1vZGVsIGluc3RlYWQuCisgKgorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRoYXQgc3BlY2lmaWVzIHRoZSBjZWxsIHRoYXQgaGFzIGJlZW4gYWRkZWQuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuY2VsbEFkZGVkID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlpZiAoY2VsbCAhPSBudWxsKQorCXsKKwkJLy8gQ3JlYXRlcyBhbiBJZCBmb3IgdGhlIGNlbGwgaWYgbm90IElkIGV4aXN0cworCQlpZiAoY2VsbC5nZXRJZCgpID09IG51bGwgJiYgdGhpcy5jcmVhdGVJZHMpCisJCXsKKwkJCWNlbGwuc2V0SWQodGhpcy5jcmVhdGVJZChjZWxsKSk7CisJCX0KKwkJCisJCWlmIChjZWxsLmdldElkKCkgIT0gbnVsbCkKKwkJeworCQkJdmFyIGNvbGxpc2lvbiA9IHRoaXMuZ2V0Q2VsbChjZWxsLmdldElkKCkpOworCQkJCisJCQlpZiAoY29sbGlzaW9uICE9IGNlbGwpCisJCQl7CQorCQkJCS8vIENyZWF0ZXMgbmV3IElkIGZvciB0aGUgY2VsbAorCQkJCS8vIGFzIGxvbmcgYXMgdGhlcmUgaXMgYSBjb2xsaXNpb24KKwkJCQl3aGlsZSAoY29sbGlzaW9uICE9IG51bGwpCisJCQkJeworCQkJCQljZWxsLnNldElkKHRoaXMuY3JlYXRlSWQoY2VsbCkpOworCQkJCQljb2xsaXNpb24gPSB0aGlzLmdldENlbGwoY2VsbC5nZXRJZCgpKTsKKwkJCQl9CisJCQkJCisJCQkJLy8gTGF6aWx5IGNyZWF0ZXMgdGhlIGNlbGxzIGRpY3Rpb25hcnkKKwkJCQlpZiAodGhpcy5jZWxscyA9PSBudWxsKQorCQkJCXsKKwkJCQkJdGhpcy5jZWxscyA9IG5ldyBPYmplY3QoKTsKKwkJCQl9CisJCQkJCisJCQkJdGhpcy5jZWxsc1tjZWxsLmdldElkKCldID0gY2VsbDsKKwkJCX0KKwkJfQorCQkKKwkJLy8gTWFrZXMgc3VyZSBJRHMgb2YgZGVsZXRlZCBjZWxscyBhcmUgbm90IHJldXNlZAorCQlpZiAobXhVdGlscy5pc051bWVyaWMoY2VsbC5nZXRJZCgpKSkKKwkJeworCQkJdGhpcy5uZXh0SWQgPSBNYXRoLm1heCh0aGlzLm5leHRJZCwgY2VsbC5nZXRJZCgpKTsKKwkJfQorCQkKKwkJLy8gUmVjdXJzaXZlbHkgcHJvY2Vzc2VzIGNoaWxkIGNlbGxzCisJCXZhciBjaGlsZENvdW50ID0gdGhpcy5nZXRDaGlsZENvdW50KGNlbGwpOworCQkKKwkJZm9yICh2YXIgaT0wOyBpPGNoaWxkQ291bnQ7IGkrKykKKwkJeworCQkJdGhpcy5jZWxsQWRkZWQodGhpcy5nZXRDaGlsZEF0KGNlbGwsIGkpKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUlkCisgKiAKKyAqIEhvb2sgbWV0aG9kIHRvIGNyZWF0ZSBhbiBJZCBmb3IgdGhlIHNwZWNpZmllZCBjZWxsLiBUaGlzIGltcGxlbWVudGF0aW9uCisgKiBjb25jYXRlbmF0ZXMgPHByZWZpeD4sIGlkIGFuZCA8cG9zdGZpeD4gdG8gY3JlYXRlIHRoZSBJZCBhbmQgaW5jcmVtZW50cworICogPG5leHRJZD4uIFRoZSBjZWxsIGlzIGlnbm9yZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbiwgYnV0IGNhbiBiZSB1c2VkIGluCisgKiBvdmVycmlkZGVuIG1ldGhvZHMgdG8gcHJlZml4IHRoZSBJZHMgd2l0aCBlZy4gdGhlIGNlbGwgdHlwZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGNlbGwgLSA8bXhDZWxsPiB0byBjcmVhdGUgdGhlIElkIGZvci4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5jcmVhdGVJZCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJdmFyIGlkID0gdGhpcy5uZXh0SWQ7CisJdGhpcy5uZXh0SWQrKzsKKwkKKwlyZXR1cm4gdGhpcy5wcmVmaXggKyBpZCArIHRoaXMucG9zdGZpeDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZUVkZ2VQYXJlbnRzCisgKiAKKyAqIFVwZGF0ZXMgdGhlIHBhcmVudCBmb3IgYWxsIGVkZ2VzIHRoYXQgYXJlIGNvbm5lY3RlZCB0byBjZWxsIG9yIG9uZSBvZgorICogaXRzIGRlc2NlbmRhbnRzIHVzaW5nIDx1cGRhdGVFZGdlUGFyZW50Pi4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS51cGRhdGVFZGdlUGFyZW50cyA9IGZ1bmN0aW9uKGNlbGwsIHJvb3QpCit7CisJLy8gR2V0cyB0aGUgdG9wbW9zdCBub2RlIG9mIHRoZSBoaWVyYXJjaHkKKwlyb290ID0gcm9vdCB8fCB0aGlzLmdldFJvb3QoY2VsbCk7CisJCisJLy8gVXBkYXRlcyBlZGdlcyBvbiBjaGlsZHJlbiBmaXJzdAorCXZhciBjaGlsZENvdW50ID0gdGhpcy5nZXRDaGlsZENvdW50KGNlbGwpOworCQorCWZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKQorCXsKKwkJdmFyIGNoaWxkID0gdGhpcy5nZXRDaGlsZEF0KGNlbGwsIGkpOworCQl0aGlzLnVwZGF0ZUVkZ2VQYXJlbnRzKGNoaWxkLCByb290KTsKKwl9CisJCisJLy8gVXBkYXRlcyB0aGUgcGFyZW50cyBvZiBhbGwgY29ubmVjdGVkIGVkZ2VzCisJdmFyIGVkZ2VDb3VudCA9IHRoaXMuZ2V0RWRnZUNvdW50KGNlbGwpOworCXZhciBlZGdlcyA9IFtdOworCisJZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlQ291bnQ7IGkrKykKKwl7CisJCWVkZ2VzLnB1c2godGhpcy5nZXRFZGdlQXQoY2VsbCwgaSkpOworCX0KKwkKKwlmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKQorCXsKKwkJdmFyIGVkZ2UgPSBlZGdlc1tpXTsKKwkJCisJCS8vIFVwZGF0ZXMgZWRnZSBwYXJlbnQgaWYgZWRnZSBhbmQgY2hpbGQgaGF2ZQorCQkvLyBhIGNvbW1vbiByb290IG5vZGUgKGRvZXMgbm90IG5lZWQgdG8gYmUgdGhlCisJCS8vIG1vZGVsIHJvb3Qgbm9kZSkKKwkJaWYgKHRoaXMuaXNBbmNlc3Rvcihyb290LCBlZGdlKSkKKwkJeworCQkJdGhpcy51cGRhdGVFZGdlUGFyZW50KGVkZ2UsIHJvb3QpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlRWRnZVBhcmVudAorICoKKyAqIElubmVyIGNhbGxiYWNrIHRvIHVwZGF0ZSB0aGUgcGFyZW50IG9mIHRoZSBzcGVjaWZpZWQgPG14Q2VsbD4gdG8gdGhlCisgKiBuZWFyZXN0LWNvbW1vbi1hbmNlc3RvciBvZiBpdHMgdHdvIHRlcm1pbmFscy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIGVkZ2UuCisgKiByb290IC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50IHJvb3Qgb2YgdGhlIG1vZGVsLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLnVwZGF0ZUVkZ2VQYXJlbnQgPSBmdW5jdGlvbihlZGdlLCByb290KQoreworCXZhciBzb3VyY2UgPSB0aGlzLmdldFRlcm1pbmFsKGVkZ2UsIHRydWUpOworCXZhciB0YXJnZXQgPSB0aGlzLmdldFRlcm1pbmFsKGVkZ2UsIGZhbHNlKTsKKwl2YXIgY2VsbCA9IG51bGw7CisJCisJLy8gVXNlcyB0aGUgZmlyc3Qgbm9uLXJlbGF0aXZlIGRlc2NlbmRhbnRzIG9mIHRoZSBzb3VyY2UgdGVybWluYWwKKwl3aGlsZSAoc291cmNlICE9IG51bGwgJiYgIXRoaXMuaXNFZGdlKHNvdXJjZSkgJiYKKwkJc291cmNlLmdlb21ldHJ5ICE9IG51bGwgJiYgc291cmNlLmdlb21ldHJ5LnJlbGF0aXZlKQorCXsKKwkJc291cmNlID0gdGhpcy5nZXRQYXJlbnQoc291cmNlKTsKKwl9CisJCisJLy8gVXNlcyB0aGUgZmlyc3Qgbm9uLXJlbGF0aXZlIGRlc2NlbmRhbnRzIG9mIHRoZSB0YXJnZXQgdGVybWluYWwKKwl3aGlsZSAodGFyZ2V0ICE9IG51bGwgJiYgdGhpcy5pZ25vcmVSZWxhdGl2ZUVkZ2VQYXJlbnQgJiYKKwkJIXRoaXMuaXNFZGdlKHRhcmdldCkgJiYgdGFyZ2V0Lmdlb21ldHJ5ICE9IG51bGwgJiYgCisJCXRhcmdldC5nZW9tZXRyeS5yZWxhdGl2ZSkKKwl7CisJCXRhcmdldCA9IHRoaXMuZ2V0UGFyZW50KHRhcmdldCk7CisJfQorCQorCWlmICh0aGlzLmlzQW5jZXN0b3Iocm9vdCwgc291cmNlKSAmJiB0aGlzLmlzQW5jZXN0b3Iocm9vdCwgdGFyZ2V0KSkKKwl7CisJCWlmIChzb3VyY2UgPT0gdGFyZ2V0KQorCQl7CisJCQljZWxsID0gdGhpcy5nZXRQYXJlbnQoc291cmNlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWNlbGwgPSB0aGlzLmdldE5lYXJlc3RDb21tb25BbmNlc3Rvcihzb3VyY2UsIHRhcmdldCk7CisJCX0KKworCQlpZiAoY2VsbCAhPSBudWxsICYmICh0aGlzLmdldFBhcmVudChjZWxsKSAhPSB0aGlzLnJvb3QgfHwKKwkJCXRoaXMuaXNBbmNlc3RvcihjZWxsLCBlZGdlKSkgJiYgdGhpcy5nZXRQYXJlbnQoZWRnZSkgIT0gY2VsbCkKKwkJeworCQkJdmFyIGdlbyA9IHRoaXMuZ2V0R2VvbWV0cnkoZWRnZSk7CisJCQkKKwkJCWlmIChnZW8gIT0gbnVsbCkKKwkJCXsKKwkJCQl2YXIgb3JpZ2luMSA9IHRoaXMuZ2V0T3JpZ2luKHRoaXMuZ2V0UGFyZW50KGVkZ2UpKTsKKwkJCQl2YXIgb3JpZ2luMiA9IHRoaXMuZ2V0T3JpZ2luKGNlbGwpOworCQkJCQorCQkJCXZhciBkeCA9IG9yaWdpbjIueCAtIG9yaWdpbjEueDsKKwkJCQl2YXIgZHkgPSBvcmlnaW4yLnkgLSBvcmlnaW4xLnk7CisJCQkJCisJCQkJZ2VvID0gZ2VvLmNsb25lKCk7CisJCQkJZ2VvLnRyYW5zbGF0ZSgtZHgsIC1keSk7CisJCQkJdGhpcy5zZXRHZW9tZXRyeShlZGdlLCBnZW8pOworCQkJfQorCisJCQl0aGlzLmFkZChjZWxsLCBlZGdlLCB0aGlzLmdldENoaWxkQ291bnQoY2VsbCkpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0T3JpZ2luCisgKiAKKyAqIFJldHVybnMgdGhlIGFic29sdXRlLCBhY2N1bXVsYXRlZCBvcmlnaW4gZm9yIHRoZSBjaGlsZHJlbiBpbnNpZGUgdGhlCisgKiBnaXZlbiBwYXJlbnQgYXMgYW4gPG14UG9pbnQ+LgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmdldE9yaWdpbiA9IGZ1bmN0aW9uKGNlbGwpCit7CisJdmFyIHJlc3VsdCA9IG51bGw7CisJCisJaWYgKGNlbGwgIT0gbnVsbCkKKwl7CisJCXJlc3VsdCA9IHRoaXMuZ2V0T3JpZ2luKHRoaXMuZ2V0UGFyZW50KGNlbGwpKTsKKwkJCisJCWlmICghdGhpcy5pc0VkZ2UoY2VsbCkpCisJCXsKKwkJCXZhciBnZW8gPSB0aGlzLmdldEdlb21ldHJ5KGNlbGwpOworCQkJCisJCQlpZiAoZ2VvICE9IG51bGwpCisJCQl7CisJCQkJcmVzdWx0LnggKz0gZ2VvLng7CisJCQkJcmVzdWx0LnkgKz0gZ2VvLnk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcmVzdWx0ID0gbmV3IG14UG9pbnQoKTsKKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldE5lYXJlc3RDb21tb25BbmNlc3RvcgorICogCisgKiBSZXR1cm5zIHRoZSBuZWFyZXN0IGNvbW1vbiBhbmNlc3RvciBmb3IgdGhlIHNwZWNpZmllZCBjZWxscy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsMSAtIDxteENlbGw+IHRoYXQgc3BlY2lmaWVzIHRoZSBmaXJzdCBjZWxsIGluIHRoZSB0cmVlLgorICogY2VsbDIgLSA8bXhDZWxsPiB0aGF0IHNwZWNpZmllcyB0aGUgc2Vjb25kIGNlbGwgaW4gdGhlIHRyZWUuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuZ2V0TmVhcmVzdENvbW1vbkFuY2VzdG9yID0gZnVuY3Rpb24oY2VsbDEsIGNlbGwyKQoreworCWlmIChjZWxsMSAhPSBudWxsICYmIGNlbGwyICE9IG51bGwpCisJewkJCisJCS8vIENyZWF0ZXMgdGhlIGNlbGwgcGF0aCBmb3IgdGhlIHNlY29uZCBjZWxsCisJCXZhciBwYXRoID0gbXhDZWxsUGF0aC5jcmVhdGUoY2VsbDIpOworCisJCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGggPiAwKQorCQl7CisJCQkvLyBCdWJibGVzIHRocm91Z2ggdGhlIGFuY2VzdG9ycyBvZiB0aGUgZmlyc3QKKwkJCS8vIGNlbGwgdG8gZmluZCB0aGUgbmVhcmVzdCBjb21tb24gYW5jZXN0b3IuCisJCQl2YXIgY2VsbCA9IGNlbGwxOworCQkJdmFyIGN1cnJlbnQgPSBteENlbGxQYXRoLmNyZWF0ZShjZWxsKTsKKwkJCQorCQkJLy8gSW52ZXJ0cyBhcmd1bWVudHMKKwkJCWlmIChwYXRoLmxlbmd0aCA8IGN1cnJlbnQubGVuZ3RoKQorCQkJeworCQkJCWNlbGwgPSBjZWxsMjsKKwkJCQl2YXIgdG1wID0gY3VycmVudDsKKwkJCQljdXJyZW50ID0gcGF0aDsKKwkJCQlwYXRoID0gdG1wOworCQkJfQorCQkJCisJCQl3aGlsZSAoY2VsbCAhPSBudWxsKQorCQkJeworCQkJCXZhciBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChjZWxsKTsKKwkJCQkKKwkJCQkvLyBDaGVja3MgaWYgdGhlIGNlbGwgcGF0aCBpcyBlcXVhbCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnaXZlbiBjZWxsIHBhdGgKKwkJCQlpZiAocGF0aC5pbmRleE9mKGN1cnJlbnQgKyBteENlbGxQYXRoLlBBVEhfU0VQQVJBVE9SKSA9PSAwICYmIHBhcmVudCAhPSBudWxsKQorCQkJCXsKKwkJCQkJcmV0dXJuIGNlbGw7CisJCQkJfQorCQkJCQorCQkJCWN1cnJlbnQgPSBteENlbGxQYXRoLmdldFBhcmVudFBhdGgoY3VycmVudCk7CisJCQkJY2VsbCA9IHBhcmVudDsKKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlbW92ZQorICogCisgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgY2VsbCBmcm9tIHRoZSBtb2RlbCB1c2luZyA8bXhDaGlsZENoYW5nZT4gYW5kIGFkZHMKKyAqIHRoZSBjaGFuZ2UgdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uIFRoaXMgb3BlcmF0aW9uIHdpbGwgcmVtb3ZlIHRoZQorICogY2VsbCBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbiBmcm9tIHRoZSBtb2RlbC4gUmV0dXJucyB0aGUgcmVtb3ZlZCBjZWxsLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGF0IHNob3VsZCBiZSByZW1vdmVkLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKGNlbGwpCit7CisJaWYgKGNlbGwgPT0gdGhpcy5yb290KQorCXsKKwkJdGhpcy5zZXRSb290KG51bGwpOworCX0KKwllbHNlIGlmICh0aGlzLmdldFBhcmVudChjZWxsKSAhPSBudWxsKQorCXsKKwkJdGhpcy5leGVjdXRlKG5ldyBteENoaWxkQ2hhbmdlKHRoaXMsIG51bGwsIGNlbGwpKTsKKwl9CisJCisJcmV0dXJuIGNlbGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjZWxsUmVtb3ZlZAorICogCisgKiBJbm5lciBjYWxsYmFjayB0byB1cGRhdGUgPGNlbGxzPiB3aGVuIGEgY2VsbCBoYXMgYmVlbiByZW1vdmVkLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGF0IHNwZWNpZmllcyB0aGUgY2VsbCB0aGF0IGhhcyBiZWVuIHJlbW92ZWQuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuY2VsbFJlbW92ZWQgPSBmdW5jdGlvbihjZWxsKQoreworCWlmIChjZWxsICE9IG51bGwgJiYgdGhpcy5jZWxscyAhPSBudWxsKQorCXsKKwkJLy8gUmVjdXJzaXZlbHkgcHJvY2Vzc2VzIGNoaWxkIGNlbGxzCisJCXZhciBjaGlsZENvdW50ID0gdGhpcy5nZXRDaGlsZENvdW50KGNlbGwpOworCQkKKwkJZm9yICh2YXIgaSA9IGNoaWxkQ291bnQgLSAxOyBpID49IDA7IGktLSkKKwkJeworCQkJdGhpcy5jZWxsUmVtb3ZlZCh0aGlzLmdldENoaWxkQXQoY2VsbCwgaSkpOworCQl9CisJCQorCQkvLyBSZW1vdmVzIHRoZSBkaWN0aW9uYXJ5IGVudHJ5IGZvciB0aGUgY2VsbAorCQlpZiAodGhpcy5jZWxscyAhPSBudWxsICYmIGNlbGwuZ2V0SWQoKSAhPSBudWxsKQorCQl7CisJCQlkZWxldGUgdGhpcy5jZWxsc1tjZWxsLmdldElkKCldOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcGFyZW50Rm9yQ2VsbENoYW5nZWQKKyAqIAorICogSW5uZXIgY2FsbGJhY2sgdG8gdXBkYXRlIHRoZSBwYXJlbnQgb2YgYSBjZWxsIHVzaW5nIDxteENlbGwuaW5zZXJ0PgorICogb24gdGhlIHBhcmVudCBhbmQgcmV0dXJuIHRoZSBwcmV2aW91cyBwYXJlbnQuCisgKgorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRvIHVwZGF0ZSB0aGUgcGFyZW50IGZvci4KKyAqIHBhcmVudCAtIDxteENlbGw+IHRoYXQgc3BlY2lmaWVzIHRoZSBuZXcgcGFyZW50IG9mIHRoZSBjZWxsLgorICogaW5kZXggLSBPcHRpb25hbCBpbnRlZ2VyIHRoYXQgZGVmaW5lcyB0aGUgaW5kZXggb2YgdGhlIGNoaWxkCisgKiBpbiB0aGUgcGFyZW50J3MgY2hpbGQgYXJyYXkuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUucGFyZW50Rm9yQ2VsbENoYW5nZWQgPSBmdW5jdGlvbihjZWxsLCBwYXJlbnQsIGluZGV4KQoreworCXZhciBwcmV2aW91cyA9IHRoaXMuZ2V0UGFyZW50KGNlbGwpOworCQorCWlmIChwYXJlbnQgIT0gbnVsbCkKKwl7CisJCWlmIChwYXJlbnQgIT0gcHJldmlvdXMgfHwgcHJldmlvdXMuZ2V0SW5kZXgoY2VsbCkgIT0gaW5kZXgpCisJCXsKKwkJCXBhcmVudC5pbnNlcnQoY2VsbCwgaW5kZXgpOworCQl9CisJfQorCWVsc2UgaWYgKHByZXZpb3VzICE9IG51bGwpCisJeworCQl2YXIgb2xkSW5kZXggPSBwcmV2aW91cy5nZXRJbmRleChjZWxsKTsKKwkJcHJldmlvdXMucmVtb3ZlKG9sZEluZGV4KTsKKwl9CisJCisJLy8gQ2hlY2tzIGlmIHRoZSBwcmV2aW91cyBwYXJlbnQgd2FzIGFscmVhZHkgaW4gdGhlCisJLy8gbW9kZWwgYW5kIGF2b2lkcyBjYWxsaW5nIGNlbGxBZGRlZCBpZiBpdCB3YXMuCisJaWYgKCF0aGlzLmNvbnRhaW5zKHByZXZpb3VzKSAmJiBwYXJlbnQgIT0gbnVsbCkKKwl7CisJCXRoaXMuY2VsbEFkZGVkKGNlbGwpOworCX0KKwllbHNlIGlmIChwYXJlbnQgPT0gbnVsbCkKKwl7CisJCXRoaXMuY2VsbFJlbW92ZWQoY2VsbCk7CisJfQorCQorCXJldHVybiBwcmV2aW91czsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldENoaWxkQ291bnQKKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhlIGdpdmVuIGNlbGwuCisgKgorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdob3NlIG51bWJlciBvZiBjaGlsZHJlbiBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuZ2V0Q2hpbGRDb3VudCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIChjZWxsICE9IG51bGwpID8gY2VsbC5nZXRDaGlsZENvdW50KCkgOiAwOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q2hpbGRBdAorICoKKyAqIFJldHVybnMgdGhlIGNoaWxkIG9mIHRoZSBnaXZlbiA8bXhDZWxsPiBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHBhcmVudC4KKyAqIGluZGV4IC0gSW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgaW5kZXggb2YgdGhlIGNoaWxkIHRvIGJlIHJldHVybmVkLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmdldENoaWxkQXQgPSBmdW5jdGlvbihjZWxsLCBpbmRleCkKK3sKKwlyZXR1cm4gKGNlbGwgIT0gbnVsbCkgPyBjZWxsLmdldENoaWxkQXQoaW5kZXgpIDogbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldENoaWxkcmVuCisgKiAKKyAqIFJldHVybnMgYWxsIGNoaWxkcmVuIG9mIHRoZSBnaXZlbiA8bXhDZWxsPiBhcyBhbiBhcnJheSBvZiA8bXhDZWxscz4uIFRoZQorICogcmV0dXJuIHZhbHVlIHNob3VsZCBiZSBvbmx5IGJlIHJlYWQuCisgKgorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRoZSByZXByZXNlbnRzIHRoZSBwYXJlbnQuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuZ2V0Q2hpbGRyZW4gPSBmdW5jdGlvbihjZWxsKQoreworCXJldHVybiAoY2VsbCAhPSBudWxsKSA/IGNlbGwuY2hpbGRyZW4gOiBudWxsOworfTsKKwkKKy8qKgorICogRnVuY3Rpb246IGdldENoaWxkVmVydGljZXMKKyAqIAorICogUmV0dXJucyB0aGUgY2hpbGQgdmVydGljZXMgb2YgdGhlIGdpdmVuIHBhcmVudC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgY2hpbGQgdmVydGljZXMgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmdldENoaWxkVmVydGljZXMgPSBmdW5jdGlvbihwYXJlbnQpCit7CisJcmV0dXJuIHRoaXMuZ2V0Q2hpbGRDZWxscyhwYXJlbnQsIHRydWUsIGZhbHNlKTsKK307CisJCQorLyoqCisgKiBGdW5jdGlvbjogZ2V0Q2hpbGRFZGdlcworICogCisgKiBSZXR1cm5zIHRoZSBjaGlsZCBlZGdlcyBvZiB0aGUgZ2l2ZW4gcGFyZW50LgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBjaGlsZCBlZGdlcyBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuZ2V0Q2hpbGRFZGdlcyA9IGZ1bmN0aW9uKHBhcmVudCkKK3sKKwlyZXR1cm4gdGhpcy5nZXRDaGlsZENlbGxzKHBhcmVudCwgZmFsc2UsIHRydWUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q2hpbGRDZWxscworICogCisgKiBSZXR1cm5zIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gY2VsbCB0aGF0IGFyZSB2ZXJ0aWNlcyBhbmQvb3IgZWRnZXMKKyAqIGRlcGVuZGluZyBvbiB0aGUgYXJndW1lbnRzLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGUgcmVwcmVzZW50cyB0aGUgcGFyZW50LgorICogdmVydGljZXMgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgY2hpbGQgdmVydGljZXMgc2hvdWxkIGJlIHJldHVybmVkLgorICogRGVmYXVsdCBpcyBmYWxzZS4KKyAqIGVkZ2VzIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIGNoaWxkIGVkZ2VzIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuZ2V0Q2hpbGRDZWxscyA9IGZ1bmN0aW9uKHBhcmVudCwgdmVydGljZXMsIGVkZ2VzKQoreworCXZlcnRpY2VzID0gKHZlcnRpY2VzICE9IG51bGwpID8gdmVydGljZXMgOiBmYWxzZTsKKwllZGdlcyA9IChlZGdlcyAhPSBudWxsKSA/IGVkZ2VzIDogZmFsc2U7CisJCisJdmFyIGNoaWxkQ291bnQgPSB0aGlzLmdldENoaWxkQ291bnQocGFyZW50KTsKKwl2YXIgcmVzdWx0ID0gW107CisKKwlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykKKwl7CisJCXZhciBjaGlsZCA9IHRoaXMuZ2V0Q2hpbGRBdChwYXJlbnQsIGkpOworCisJCWlmICgoIWVkZ2VzICYmICF2ZXJ0aWNlcykgfHwgKGVkZ2VzICYmIHRoaXMuaXNFZGdlKGNoaWxkKSkgfHwKKwkJCSh2ZXJ0aWNlcyAmJiB0aGlzLmlzVmVydGV4KGNoaWxkKSkpCisJCXsKKwkJCXJlc3VsdC5wdXNoKGNoaWxkKTsKKwkJfQorCX0KKworCXJldHVybiByZXN1bHQ7Cit9OworCQkKKy8qKgorICogRnVuY3Rpb246IGdldFRlcm1pbmFsCisgKiAKKyAqIFJldHVybnMgdGhlIHNvdXJjZSBvciB0YXJnZXQgPG14Q2VsbD4gb2YgdGhlIGdpdmVuIGVkZ2UgZGVwZW5kaW5nIG9uIHRoZQorICogdmFsdWUgb2YgdGhlIGJvb2xlYW4gcGFyYW1ldGVyLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGVkZ2UgLSA8bXhDZWxsPiB0aGF0IHNwZWNpZmllcyB0aGUgZWRnZS4KKyAqIGlzU291cmNlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIHdoaWNoIGVuZCBvZiB0aGUgZWRnZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuZ2V0VGVybWluYWwgPSBmdW5jdGlvbihlZGdlLCBpc1NvdXJjZSkKK3sKKwlyZXR1cm4gKGVkZ2UgIT0gbnVsbCkgPyBlZGdlLmdldFRlcm1pbmFsKGlzU291cmNlKSA6IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRUZXJtaW5hbAorICogCisgKiBTZXRzIHRoZSBzb3VyY2Ugb3IgdGFyZ2V0IHRlcm1pbmFsIG9mIHRoZSBnaXZlbiA8bXhDZWxsPiB1c2luZworICogPG14VGVybWluYWxDaGFuZ2U+IGFuZCBhZGRzIHRoZSBjaGFuZ2UgdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVwZGF0ZXMgdGhlIHBhcmVudCBvZiB0aGUgZWRnZSB1c2luZyA8dXBkYXRlRWRnZVBhcmVudD4KKyAqIGlmIHJlcXVpcmVkLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGVkZ2UgLSA8bXhDZWxsPiB0aGF0IHNwZWNpZmllcyB0aGUgZWRnZS4KKyAqIHRlcm1pbmFsIC0gPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIG5ldyB0ZXJtaW5hbC4KKyAqIGlzU291cmNlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSB0ZXJtaW5hbCBpcyB0aGUgbmV3IHNvdXJjZSBvcgorICogdGFyZ2V0IHRlcm1pbmFsIG9mIHRoZSBlZGdlLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLnNldFRlcm1pbmFsID0gZnVuY3Rpb24oZWRnZSwgdGVybWluYWwsIGlzU291cmNlKQoreworCXZhciB0ZXJtaW5hbENoYW5nZWQgPSB0ZXJtaW5hbCAhPSB0aGlzLmdldFRlcm1pbmFsKGVkZ2UsIGlzU291cmNlKTsKKwl0aGlzLmV4ZWN1dGUobmV3IG14VGVybWluYWxDaGFuZ2UodGhpcywgZWRnZSwgdGVybWluYWwsIGlzU291cmNlKSk7CisJCisJaWYgKHRoaXMubWFpbnRhaW5FZGdlUGFyZW50ICYmIHRlcm1pbmFsQ2hhbmdlZCkKKwl7CisJCXRoaXMudXBkYXRlRWRnZVBhcmVudChlZGdlLCB0aGlzLmdldFJvb3QoKSk7CisJfQorCQorCXJldHVybiB0ZXJtaW5hbDsKK307CisJCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRUZXJtaW5hbHMKKyAqIAorICogU2V0cyB0aGUgc291cmNlIGFuZCB0YXJnZXQgPG14Q2VsbD4gb2YgdGhlIGdpdmVuIDxteENlbGw+IGluIGEgc2luZ2xlCisgKiB0cmFuc2FjdGlvbiB1c2luZyA8c2V0VGVybWluYWw+IGZvciBlYWNoIGVuZCBvZiB0aGUgZWRnZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIGVkZ2UuCisgKiBzb3VyY2UgLSA8bXhDZWxsPiB0aGF0IHNwZWNpZmllcyB0aGUgbmV3IHNvdXJjZSB0ZXJtaW5hbC4KKyAqIHRhcmdldCAtIDxteENlbGw+IHRoYXQgc3BlY2lmaWVzIHRoZSBuZXcgdGFyZ2V0IHRlcm1pbmFsLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLnNldFRlcm1pbmFscyA9IGZ1bmN0aW9uKGVkZ2UsIHNvdXJjZSwgdGFyZ2V0KQoreworCXRoaXMuYmVnaW5VcGRhdGUoKTsKKwl0cnkKKwl7CisJCXRoaXMuc2V0VGVybWluYWwoZWRnZSwgc291cmNlLCB0cnVlKTsKKwkJdGhpcy5zZXRUZXJtaW5hbChlZGdlLCB0YXJnZXQsIGZhbHNlKTsKKwl9CisJZmluYWxseQorCXsKKwkJdGhpcy5lbmRVcGRhdGUoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB0ZXJtaW5hbEZvckNlbGxDaGFuZ2VkCisgKiAKKyAqIElubmVyIGhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgdGhlIHRlcm1pbmFsIG9mIHRoZSBlZGdlIHVzaW5nCisgKiA8bXhDZWxsLmluc2VydEVkZ2U+IGFuZCByZXR1cm4gdGhlIHByZXZpb3VzIHRlcm1pbmFsLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIGVkZ2UgdG8gYmUgdXBkYXRlZC4KKyAqIHRlcm1pbmFsIC0gPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIG5ldyB0ZXJtaW5hbC4KKyAqIGlzU291cmNlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSB0ZXJtaW5hbCBpcyB0aGUgbmV3IHNvdXJjZSBvcgorICogdGFyZ2V0IHRlcm1pbmFsIG9mIHRoZSBlZGdlLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLnRlcm1pbmFsRm9yQ2VsbENoYW5nZWQgPSBmdW5jdGlvbihlZGdlLCB0ZXJtaW5hbCwgaXNTb3VyY2UpCit7CisJdmFyIHByZXZpb3VzID0gdGhpcy5nZXRUZXJtaW5hbChlZGdlLCBpc1NvdXJjZSk7CisJCisJaWYgKHRlcm1pbmFsICE9IG51bGwpCisJeworCQl0ZXJtaW5hbC5pbnNlcnRFZGdlKGVkZ2UsIGlzU291cmNlKTsKKwl9CisJZWxzZSBpZiAocHJldmlvdXMgIT0gbnVsbCkKKwl7CisJCXByZXZpb3VzLnJlbW92ZUVkZ2UoZWRnZSwgaXNTb3VyY2UpOworCX0KKwkKKwlyZXR1cm4gcHJldmlvdXM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRFZGdlQ291bnQKKyAqIAorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IGVkZ2VzIGNvbm5lY3RlZCB0byB0aGUgZ2l2ZW4gY2VsbC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSB2ZXJ0ZXguCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuZ2V0RWRnZUNvdW50ID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gKGNlbGwgIT0gbnVsbCkgPyBjZWxsLmdldEVkZ2VDb3VudCgpIDogMDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEVkZ2VBdAorICogCisgKiBSZXR1cm5zIHRoZSBlZGdlIG9mIGNlbGwgYXQgdGhlIGdpdmVuIGluZGV4LgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGF0IHNwZWNpZmllcyB0aGUgdmVydGV4LgorICogaW5kZXggLSBJbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSBpbmRleCBvZiB0aGUgZWRnZQorICogdG8gcmV0dXJuLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmdldEVkZ2VBdCA9IGZ1bmN0aW9uKGNlbGwsIGluZGV4KQoreworCXJldHVybiAoY2VsbCAhPSBudWxsKSA/IGNlbGwuZ2V0RWRnZUF0KGluZGV4KSA6IG51bGw7Cit9OworCQorLyoqCisgKiBGdW5jdGlvbjogZ2V0RGlyZWN0ZWRFZGdlQ291bnQKKyAqIAorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGluY29taW5nIG9yIG91dGdvaW5nIGVkZ2VzLCBpZ25vcmluZyB0aGUgZ2l2ZW4KKyAqIGVkZ2UuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBlZGdlIGNvdW50IHNob3VsZCBiZSByZXR1cm5lZC4KKyAqIG91dGdvaW5nIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgbnVtYmVyIG9mIG91dGdvaW5nIG9yCisgKiBpbmNvbWluZyBlZGdlcyBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiBpZ25vcmVkRWRnZSAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyBhbiBlZGdlIHRvIGJlIGlnbm9yZWQuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuZ2V0RGlyZWN0ZWRFZGdlQ291bnQgPSBmdW5jdGlvbihjZWxsLCBvdXRnb2luZywgaWdub3JlZEVkZ2UpCit7CisJdmFyIGNvdW50ID0gMDsKKwl2YXIgZWRnZUNvdW50ID0gdGhpcy5nZXRFZGdlQ291bnQoY2VsbCk7CisKKwlmb3IgKHZhciBpID0gMDsgaSA8IGVkZ2VDb3VudDsgaSsrKQorCXsKKwkJdmFyIGVkZ2UgPSB0aGlzLmdldEVkZ2VBdChjZWxsLCBpKTsKKworCQlpZiAoZWRnZSAhPSBpZ25vcmVkRWRnZSAmJiB0aGlzLmdldFRlcm1pbmFsKGVkZ2UsIG91dGdvaW5nKSA9PSBjZWxsKQorCQl7CisJCQljb3VudCsrOworCQl9CisJfQorCisJcmV0dXJuIGNvdW50OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q29ubmVjdGlvbnMKKyAqIAorICogUmV0dXJucyBhbGwgZWRnZXMgb2YgdGhlIGdpdmVuIGNlbGwgd2l0aG91dCBsb29wcy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdob3NlIGVkZ2VzIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqIAorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmdldENvbm5lY3Rpb25zID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gdGhpcy5nZXRFZGdlcyhjZWxsLCB0cnVlLCB0cnVlLCBmYWxzZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRJbmNvbWluZ0VkZ2VzCisgKiAKKyAqIFJldHVybnMgdGhlIGluY29taW5nIGVkZ2VzIG9mIHRoZSBnaXZlbiBjZWxsIHdpdGhvdXQgbG9vcHMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBpbmNvbWluZyBlZGdlcyBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiAKKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5nZXRJbmNvbWluZ0VkZ2VzID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gdGhpcy5nZXRFZGdlcyhjZWxsLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0T3V0Z29pbmdFZGdlcworICogCisgKiBSZXR1cm5zIHRoZSBvdXRnb2luZyBlZGdlcyBvZiB0aGUgZ2l2ZW4gY2VsbCB3aXRob3V0IGxvb3BzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2Ugb3V0Z29pbmcgZWRnZXMgc2hvdWxkIGJlIHJldHVybmVkLgorICogCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuZ2V0T3V0Z29pbmdFZGdlcyA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIHRoaXMuZ2V0RWRnZXMoY2VsbCwgZmFsc2UsIHRydWUsIGZhbHNlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEVkZ2VzCisgKiAKKyAqIFJldHVybnMgYWxsIGRpc3RpbmN0IGVkZ2VzIGNvbm5lY3RlZCB0byB0aGlzIGNlbGwgYXMgYSBuZXcgYXJyYXkgb2YKKyAqIDxteENlbGxzPi4gSWYgYXQgbGVhc3Qgb25lIG9mIGluY29taW5nIG9yIG91dGdvaW5nIGlzIHRydWUsIHRoZW4gbG9vcHMKKyAqIGFyZSBpZ25vcmVkLCBvdGhlcndpc2UgaWYgYm90aCBhcmUgZmFsc2UsIHRoZW4gYWxsIGVkZ2VzIGNvbm5lY3RlZCB0bworICogdGhlIGdpdmVuIGNlbGwgYXJlIHJldHVybmVkIGluY2x1ZGluZyBsb29wcy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRoYXQgc3BlY2lmaWVzIHRoZSBjZWxsLgorICogaW5jb21pbmcgLSBPcHRpb25hbCBib29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIGluY29taW5nIGVkZ2VzIHNob3VsZCBiZQorICogcmV0dXJuZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqIG91dGdvaW5nIC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiBvdXRnb2luZyBlZGdlcyBzaG91bGQgYmUKKyAqIHJldHVybmVkLiBEZWZhdWx0IGlzIHRydWUuCisgKiBpbmNsdWRlTG9vcHMgLSBPcHRpb25hbCBib29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIGxvb3BzIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqIERlZmF1bHQgaXMgdHJ1ZS4gCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuZ2V0RWRnZXMgPSBmdW5jdGlvbihjZWxsLCBpbmNvbWluZywgb3V0Z29pbmcsIGluY2x1ZGVMb29wcykKK3sKKwlpbmNvbWluZyA9IChpbmNvbWluZyAhPSBudWxsKSA/IGluY29taW5nIDogdHJ1ZTsKKwlvdXRnb2luZyA9IChvdXRnb2luZyAhPSBudWxsKSA/IG91dGdvaW5nIDogdHJ1ZTsKKwlpbmNsdWRlTG9vcHMgPSAoaW5jbHVkZUxvb3BzICE9IG51bGwpID8gaW5jbHVkZUxvb3BzIDogdHJ1ZTsKKwkKKwl2YXIgZWRnZUNvdW50ID0gdGhpcy5nZXRFZGdlQ291bnQoY2VsbCk7CisJdmFyIHJlc3VsdCA9IFtdOworCisJZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlQ291bnQ7IGkrKykKKwl7CisJCXZhciBlZGdlID0gdGhpcy5nZXRFZGdlQXQoY2VsbCwgaSk7CisJCXZhciBzb3VyY2UgPSB0aGlzLmdldFRlcm1pbmFsKGVkZ2UsIHRydWUpOworCQl2YXIgdGFyZ2V0ID0gdGhpcy5nZXRUZXJtaW5hbChlZGdlLCBmYWxzZSk7CisKKwkJaWYgKChpbmNsdWRlTG9vcHMgJiYgc291cmNlID09IHRhcmdldCkgfHwgKChzb3VyY2UgIT0gdGFyZ2V0KSAmJiAoKGluY29taW5nICYmIHRhcmdldCA9PSBjZWxsKSB8fAorCQkJKG91dGdvaW5nICYmIHNvdXJjZSA9PSBjZWxsKSkpKQorCQl7CisJCQlyZXN1bHQucHVzaChlZGdlKTsKKwkJfQorCX0KKworCXJldHVybiByZXN1bHQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRFZGdlc0JldHdlZW4KKyAqIAorICogUmV0dXJucyBhbGwgZWRnZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gc291cmNlIGFuZCB0YXJnZXQgcGFpci4gSWYgZGlyZWN0ZWQKKyAqIGlzIHRydWUsIHRoZW4gb25seSBlZGdlcyBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIHRhcmdldCBhcmUgcmV0dXJuZWQsCisgKiBvdGhlcndpc2UsIGFsbCBlZGdlcyBiZXR3ZWVuIHRoZSB0d28gY2VsbHMgYXJlIHJldHVybmVkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzb3VyY2UgLSA8bXhDZWxsPiB0aGF0IGRlZmluZXMgdGhlIHNvdXJjZSB0ZXJtaW5hbCBvZiB0aGUgZWRnZSB0byBiZQorICogcmV0dXJuZWQuCisgKiB0YXJnZXQgLSA8bXhDZWxsPiB0aGF0IGRlZmluZXMgdGhlIHRhcmdldCB0ZXJtaW5hbCBvZiB0aGUgZWRnZSB0byBiZQorICogcmV0dXJuZWQuCisgKiBkaXJlY3RlZCAtIE9wdGlvbmFsIGJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIGRpcmVjdGlvbiBvZiB0aGUKKyAqIGVkZ2Ugc2hvdWxkIGJlIHRha2VuIGludG8gYWNjb3VudC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5nZXRFZGdlc0JldHdlZW4gPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCwgZGlyZWN0ZWQpCit7CisJZGlyZWN0ZWQgPSAoZGlyZWN0ZWQgIT0gbnVsbCkgPyBkaXJlY3RlZCA6IGZhbHNlOworCQorCXZhciB0bXAxID0gdGhpcy5nZXRFZGdlQ291bnQoc291cmNlKTsKKwl2YXIgdG1wMiA9IHRoaXMuZ2V0RWRnZUNvdW50KHRhcmdldCk7CisJCisJLy8gQXNzdW1lcyB0aGUgc291cmNlIGhhcyBsZXNzIGNvbm5lY3RlZCBlZGdlcworCXZhciB0ZXJtaW5hbCA9IHNvdXJjZTsKKwl2YXIgZWRnZUNvdW50ID0gdG1wMTsKKwkKKwkvLyBVc2VzIHRoZSBzbWFsbGVyIGFycmF5IG9mIGNvbm5lY3RlZCBlZGdlcworCS8vIGZvciBzZWFyY2hpbmcgdGhlIGVkZ2UKKwlpZiAodG1wMiA8IHRtcDEpCisJeworCQllZGdlQ291bnQgPSB0bXAyOworCQl0ZXJtaW5hbCA9IHRhcmdldDsKKwl9CisJCisJdmFyIHJlc3VsdCA9IFtdOworCQorCS8vIENoZWNrcyBpZiB0aGUgZWRnZSBpcyBjb25uZWN0ZWQgdG8gdGhlIGNvcnJlY3QKKwkvLyBjZWxsIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBtYXRjaAorCWZvciAodmFyIGkgPSAwOyBpIDwgZWRnZUNvdW50OyBpKyspCisJeworCQl2YXIgZWRnZSA9IHRoaXMuZ2V0RWRnZUF0KHRlcm1pbmFsLCBpKTsKKwkJdmFyIHNyYyA9IHRoaXMuZ2V0VGVybWluYWwoZWRnZSwgdHJ1ZSk7CisJCXZhciB0cmcgPSB0aGlzLmdldFRlcm1pbmFsKGVkZ2UsIGZhbHNlKTsKKwkJdmFyIGRpcmVjdGVkTWF0Y2ggPSAoc3JjID09IHNvdXJjZSkgJiYgKHRyZyA9PSB0YXJnZXQpOworCQl2YXIgb3Bwb3NpdGVNYXRjaCA9ICh0cmcgPT0gc291cmNlKSAmJiAoc3JjID09IHRhcmdldCk7CisKKwkJaWYgKGRpcmVjdGVkTWF0Y2ggfHwgKCFkaXJlY3RlZCAmJiBvcHBvc2l0ZU1hdGNoKSkKKwkJeworCQkJcmVzdWx0LnB1c2goZWRnZSk7CisJCX0KKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldE9wcG9zaXRlcworICogCisgKiBSZXR1cm5zIGFsbCBvcHBvc2l0ZSB2ZXJ0aWNlcyB3cnQgdGVybWluYWwgZm9yIHRoZSBnaXZlbiBlZGdlcywgb25seQorICogcmV0dXJuaW5nIHNvdXJjZXMgYW5kL29yIHRhcmdldHMgYXMgc3BlY2lmaWVkLiBUaGUgcmVzdWx0IGlzIHJldHVybmVkCisgKiBhcyBhbiBhcnJheSBvZiA8bXhDZWxscz4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGVkZ2VzIC0gQXJyYXkgb2YgPG14Q2VsbHM+IHRoYXQgY29udGFpbiB0aGUgZWRnZXMgdG8gYmUgZXhhbWluZWQuCisgKiB0ZXJtaW5hbCAtIDxteENlbGw+IHRoYXQgc3BlY2lmaWVzIHRoZSBrbm93biBlbmQgb2YgdGhlIGVkZ2VzLgorICogc291cmNlcyAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgc291cmNlIHRlcm1pbmFscyBzaG91bGQgYmUgY29udGFpbmVkCisgKiBpbiB0aGUgcmVzdWx0LiBEZWZhdWx0IGlzIHRydWUuCisgKiB0YXJnZXRzIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0YXJnZXQgdGVybWluYWxzIHNob3VsZCBiZSBjb250YWluZWQKKyAqIGluIHRoZSByZXN1bHQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5nZXRPcHBvc2l0ZXMgPSBmdW5jdGlvbihlZGdlcywgdGVybWluYWwsIHNvdXJjZXMsIHRhcmdldHMpCit7CisJc291cmNlcyA9IChzb3VyY2VzICE9IG51bGwpID8gc291cmNlcyA6IHRydWU7CisJdGFyZ2V0cyA9ICh0YXJnZXRzICE9IG51bGwpID8gdGFyZ2V0cyA6IHRydWU7CisJCisJdmFyIHRlcm1pbmFscyA9IFtdOworCQorCWlmIChlZGdlcyAhPSBudWxsKQorCXsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykKKwkJeworCQkJdmFyIHNvdXJjZSA9IHRoaXMuZ2V0VGVybWluYWwoZWRnZXNbaV0sIHRydWUpOworCQkJdmFyIHRhcmdldCA9IHRoaXMuZ2V0VGVybWluYWwoZWRnZXNbaV0sIGZhbHNlKTsKKwkJCQorCQkJLy8gQ2hlY2tzIGlmIHRoZSB0ZXJtaW5hbCBpcyB0aGUgc291cmNlIG9mCisJCQkvLyB0aGUgZWRnZSBhbmQgaWYgdGhlIHRhcmdldCBzaG91bGQgYmUKKwkJCS8vIHN0b3JlZCBpbiB0aGUgcmVzdWx0CisJCQlpZiAoc291cmNlID09IHRlcm1pbmFsICYmIHRhcmdldCAhPSBudWxsICYmIHRhcmdldCAhPSB0ZXJtaW5hbCAmJiB0YXJnZXRzKQorCQkJeworCQkJCXRlcm1pbmFscy5wdXNoKHRhcmdldCk7CisJCQl9CisJCQkKKwkJCS8vIENoZWNrcyBpZiB0aGUgdGVybWluYWwgaXMgdGhlIHRhZ2V0IG9mCisJCQkvLyB0aGUgZWRnZSBhbmQgaWYgdGhlIHNvdXJjZSBzaG91bGQgYmUKKwkJCS8vIHN0b3JlZCBpbiB0aGUgcmVzdWx0CisJCQllbHNlIGlmICh0YXJnZXQgPT0gdGVybWluYWwgJiYgc291cmNlICE9IG51bGwgJiYgc291cmNlICE9IHRlcm1pbmFsICYmIHNvdXJjZXMpCisJCQl7CisJCQkJdGVybWluYWxzLnB1c2goc291cmNlKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gdGVybWluYWxzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0VG9wbW9zdENlbGxzCisgKiAKKyAqIFJldHVybnMgdGhlIHRvcG1vc3QgY2VsbHMgb2YgdGhlIGhpZXJhcmNoeSBpbiBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIG5vCisgKiBkZXNjZW5kYW50cyBmb3IgZWFjaCA8bXhDZWxsPiB0aGF0IGl0IGNvbnRhaW5zLiBEdXBsaWNhdGVzIHNob3VsZCBiZQorICogcmVtb3ZlZCBpbiB0aGUgY2VsbHMgYXJyYXkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbHMgLSBBcnJheSBvZiA8bXhDZWxscz4gd2hvc2UgdG9wbW9zdCBhbmNlc3RvcnMgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmdldFRvcG1vc3RDZWxscyA9IGZ1bmN0aW9uKGNlbGxzKQoreworCXZhciBkaWN0ID0gbmV3IG14RGljdGlvbmFyeSgpOworCXZhciB0bXAgPSBbXTsKKwkKKwlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorCXsKKwkJZGljdC5wdXQoY2VsbHNbaV0sIHRydWUpOworCX0KKwkKKwlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorCXsKKwkJdmFyIGNlbGwgPSBjZWxsc1tpXTsKKwkJdmFyIHRvcG1vc3QgPSB0cnVlOworCQl2YXIgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoY2VsbCk7CisJCQorCQl3aGlsZSAocGFyZW50ICE9IG51bGwpCisJCXsKKwkJCWlmIChkaWN0LmdldChwYXJlbnQpKQorCQkJeworCQkJCXRvcG1vc3QgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQocGFyZW50KTsKKwkJfQorCQkKKwkJaWYgKHRvcG1vc3QpCisJCXsKKwkJCXRtcC5wdXNoKGNlbGwpOworCQl9CisJfQorCQorCXJldHVybiB0bXA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1ZlcnRleAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGNlbGwgaXMgYSB2ZXJ0ZXguCisgKgorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgcG9zc2libGUgdmVydGV4LgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmlzVmVydGV4ID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gKGNlbGwgIT0gbnVsbCkgPyBjZWxsLmlzVmVydGV4KCkgOiBmYWxzZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzRWRnZQorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGNlbGwgaXMgYW4gZWRnZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBwb3NzaWJsZSBlZGdlLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmlzRWRnZSA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIChjZWxsICE9IG51bGwpID8gY2VsbC5pc0VkZ2UoKSA6IGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDb25uZWN0YWJsZQorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIDxteENlbGw+IGlzIGNvbm5lY3RhYmxlLiBJZiA8ZWRnZXNDb25uZWN0YWJsZT4KKyAqIGlzIGZhbHNlLCB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBmb3IgYWxsIGVkZ2VzIGVsc2UgaXQgcmV0dXJucworICogdGhlIHJldHVybiB2YWx1ZSBvZiA8bXhDZWxsLmlzQ29ubmVjdGFibGU+LgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBjb25uZWN0YWJsZSBzdGF0ZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuaXNDb25uZWN0YWJsZSA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIChjZWxsICE9IG51bGwpID8gY2VsbC5pc0Nvbm5lY3RhYmxlKCkgOiBmYWxzZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFZhbHVlCisgKiAKKyAqIFJldHVybnMgdGhlIHVzZXIgb2JqZWN0IG9mIHRoZSBnaXZlbiA8bXhDZWxsPiB1c2luZyA8bXhDZWxsLmdldFZhbHVlPi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgdXNlciBvYmplY3Qgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gKGNlbGwgIT0gbnVsbCkgPyBjZWxsLmdldFZhbHVlKCkgOiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0VmFsdWUKKyAqIAorICogU2V0cyB0aGUgdXNlciBvYmplY3Qgb2YgdGhlbiBnaXZlbiA8bXhDZWxsPiB1c2luZyA8bXhWYWx1ZUNoYW5nZT4KKyAqIGFuZCBhZGRzIHRoZSBjaGFuZ2UgdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uCisgKgorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdob3NlIHVzZXIgb2JqZWN0IHNob3VsZCBiZSBjaGFuZ2VkLgorICogdmFsdWUgLSBPYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBuZXcgdXNlciBvYmplY3QuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbihjZWxsLCB2YWx1ZSkKK3sKKwl0aGlzLmV4ZWN1dGUobmV3IG14VmFsdWVDaGFuZ2UodGhpcywgY2VsbCwgdmFsdWUpKTsKKwkKKwlyZXR1cm4gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB2YWx1ZUZvckNlbGxDaGFuZ2VkCisgKiAKKyAqIElubmVyIGNhbGxiYWNrIHRvIHVwZGF0ZSB0aGUgdXNlciBvYmplY3Qgb2YgdGhlIGdpdmVuIDxteENlbGw+CisgKiB1c2luZyA8bXhDZWxsLnZhbHVlQ2hhbmdlZD4gYW5kIHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUsCisgKiB0aGF0IGlzLCB0aGUgcmV0dXJuIHZhbHVlIG9mIDxteENlbGwudmFsdWVDaGFuZ2VkPi4KKyAqIAorICogVG8gY2hhbmdlIGEgc3BlY2lmaWMgYXR0cmlidXRlIGluIGFuIFhNTCBub2RlLCB0aGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlCisgKiB1c2VkLgorICogCisgKiAoY29kZSkKKyAqIGdyYXBoLmdldE1vZGVsKCkudmFsdWVGb3JDZWxsQ2hhbmdlZCA9IGZ1bmN0aW9uKGNlbGwsIHZhbHVlKQorICogeworICogICB2YXIgcHJldmlvdXMgPSBjZWxsLnZhbHVlLmdldEF0dHJpYnV0ZSgnbGFiZWwnKTsKKyAqICAgY2VsbC52YWx1ZS5zZXRBdHRyaWJ1dGUoJ2xhYmVsJywgdmFsdWUpOworICogICAKKyAqICAgcmV0dXJuIHByZXZpb3VzOworICogfTsKKyAqIChlbmQpIAorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLnZhbHVlRm9yQ2VsbENoYW5nZWQgPSBmdW5jdGlvbihjZWxsLCB2YWx1ZSkKK3sKKwlyZXR1cm4gY2VsbC52YWx1ZUNoYW5nZWQodmFsdWUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0R2VvbWV0cnkKKyAqIAorICogUmV0dXJucyB0aGUgPG14R2VvbWV0cnk+IG9mIHRoZSBnaXZlbiA8bXhDZWxsPi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgZ2VvbWV0cnkgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmdldEdlb21ldHJ5ID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gKGNlbGwgIT0gbnVsbCkgPyBjZWxsLmdldEdlb21ldHJ5KCkgOiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0R2VvbWV0cnkKKyAqIAorICogU2V0cyB0aGUgPG14R2VvbWV0cnk+IG9mIHRoZSBnaXZlbiA8bXhDZWxsPi4gVGhlIGFjdHVhbCB1cGRhdGUKKyAqIG9mIHRoZSBjZWxsIGlzIGNhcnJpZWQgb3V0IGluIDxnZW9tZXRyeUZvckNlbGxDaGFuZ2VkPi4gVGhlCisgKiA8bXhHZW9tZXRyeUNoYW5nZT4gYWN0aW9uIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGNoYW5nZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdob3NlIGdlb21ldHJ5IHNob3VsZCBiZSBjaGFuZ2VkLgorICogZ2VvbWV0cnkgLSA8bXhHZW9tZXRyeT4gdGhhdCBkZWZpbmVzIHRoZSBuZXcgZ2VvbWV0cnkuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuc2V0R2VvbWV0cnkgPSBmdW5jdGlvbihjZWxsLCBnZW9tZXRyeSkKK3sKKwlpZiAoZ2VvbWV0cnkgIT0gdGhpcy5nZXRHZW9tZXRyeShjZWxsKSkKKwl7CisJCXRoaXMuZXhlY3V0ZShuZXcgbXhHZW9tZXRyeUNoYW5nZSh0aGlzLCBjZWxsLCBnZW9tZXRyeSkpOworCX0KKwkKKwlyZXR1cm4gZ2VvbWV0cnk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZW9tZXRyeUZvckNlbGxDaGFuZ2VkCisgKiAKKyAqIElubmVyIGNhbGxiYWNrIHRvIHVwZGF0ZSB0aGUgPG14R2VvbWV0cnk+IG9mIHRoZSBnaXZlbiA8bXhDZWxsPiB1c2luZworICogPG14Q2VsbC5zZXRHZW9tZXRyeT4gYW5kIHJldHVybiB0aGUgcHJldmlvdXMgPG14R2VvbWV0cnk+LgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmdlb21ldHJ5Rm9yQ2VsbENoYW5nZWQgPSBmdW5jdGlvbihjZWxsLCBnZW9tZXRyeSkKK3sKKwl2YXIgcHJldmlvdXMgPSB0aGlzLmdldEdlb21ldHJ5KGNlbGwpOworCWNlbGwuc2V0R2VvbWV0cnkoZ2VvbWV0cnkpOworCQorCXJldHVybiBwcmV2aW91czsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFN0eWxlCisgKiAKKyAqIFJldHVybnMgdGhlIHN0eWxlIG9mIHRoZSBnaXZlbiA8bXhDZWxsPi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2Ugc3R5bGUgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmdldFN0eWxlID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gKGNlbGwgIT0gbnVsbCkgPyBjZWxsLmdldFN0eWxlKCkgOiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0U3R5bGUKKyAqIAorICogU2V0cyB0aGUgc3R5bGUgb2YgdGhlIGdpdmVuIDxteENlbGw+IHVzaW5nIDxteFN0eWxlQ2hhbmdlPiBhbmQKKyAqIGFkZHMgdGhlIGNoYW5nZSB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2Ugc3R5bGUgc2hvdWxkIGJlIGNoYW5nZWQuCisgKiBzdHlsZSAtIFN0cmluZyBvZiB0aGUgZm9ybSBbc3R5bGVuYW1lO3xrZXk9dmFsdWU7XSB0byBzcGVjaWZ5CisgKiB0aGUgbmV3IGNlbGwgc3R5bGUuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuc2V0U3R5bGUgPSBmdW5jdGlvbihjZWxsLCBzdHlsZSkKK3sKKwlpZiAoc3R5bGUgIT0gdGhpcy5nZXRTdHlsZShjZWxsKSkKKwl7CisJCXRoaXMuZXhlY3V0ZShuZXcgbXhTdHlsZUNoYW5nZSh0aGlzLCBjZWxsLCBzdHlsZSkpOworCX0KKwkKKwlyZXR1cm4gc3R5bGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzdHlsZUZvckNlbGxDaGFuZ2VkCisgKiAKKyAqIElubmVyIGNhbGxiYWNrIHRvIHVwZGF0ZSB0aGUgc3R5bGUgb2YgdGhlIGdpdmVuIDxteENlbGw+CisgKiB1c2luZyA8bXhDZWxsLnNldFN0eWxlPiBhbmQgcmV0dXJuIHRoZSBwcmV2aW91cyBzdHlsZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIGNlbGwgdG8gYmUgdXBkYXRlZC4KKyAqIHN0eWxlIC0gU3RyaW5nIG9mIHRoZSBmb3JtIFtzdHlsZW5hbWU7fGtleT12YWx1ZTtdIHRvIHNwZWNpZnkKKyAqIHRoZSBuZXcgY2VsbCBzdHlsZS4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5zdHlsZUZvckNlbGxDaGFuZ2VkID0gZnVuY3Rpb24oY2VsbCwgc3R5bGUpCit7CisJdmFyIHByZXZpb3VzID0gdGhpcy5nZXRTdHlsZShjZWxsKTsKKwljZWxsLnNldFN0eWxlKHN0eWxlKTsKKwkKKwlyZXR1cm4gcHJldmlvdXM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NvbGxhcHNlZAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIDxteENlbGw+IGlzIGNvbGxhcHNlZC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgY29sbGFwc2VkIHN0YXRlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5pc0NvbGxhcHNlZCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIChjZWxsICE9IG51bGwpID8gY2VsbC5pc0NvbGxhcHNlZCgpIDogZmFsc2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRDb2xsYXBzZWQKKyAqIAorICogU2V0cyB0aGUgY29sbGFwc2VkIHN0YXRlIG9mIHRoZSBnaXZlbiA8bXhDZWxsPiB1c2luZyA8bXhDb2xsYXBzZUNoYW5nZT4KKyAqIGFuZCBhZGRzIHRoZSBjaGFuZ2UgdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uCisgKgorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdob3NlIGNvbGxhcHNlZCBzdGF0ZSBzaG91bGQgYmUgY2hhbmdlZC4KKyAqIGNvbGxhcHNlZCAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgdGhlIG5ldyBjb2xscGFzZWQgc3RhdGUuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuc2V0Q29sbGFwc2VkID0gZnVuY3Rpb24oY2VsbCwgY29sbGFwc2VkKQoreworCWlmIChjb2xsYXBzZWQgIT0gdGhpcy5pc0NvbGxhcHNlZChjZWxsKSkKKwl7CisJCXRoaXMuZXhlY3V0ZShuZXcgbXhDb2xsYXBzZUNoYW5nZSh0aGlzLCBjZWxsLCBjb2xsYXBzZWQpKTsKKwl9CisJCisJcmV0dXJuIGNvbGxhcHNlZDsKK307CisJCisvKioKKyAqIEZ1bmN0aW9uOiBjb2xsYXBzZWRTdGF0ZUZvckNlbGxDaGFuZ2VkCisgKgorICogSW5uZXIgY2FsbGJhY2sgdG8gdXBkYXRlIHRoZSBjb2xsYXBzZWQgc3RhdGUgb2YgdGhlCisgKiBnaXZlbiA8bXhDZWxsPiB1c2luZyA8bXhDZWxsLnNldENvbGxhcHNlZD4gYW5kIHJldHVybgorICogdGhlIHByZXZpb3VzIGNvbGxhcHNlZCBzdGF0ZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIGNlbGwgdG8gYmUgdXBkYXRlZC4KKyAqIGNvbGxhcHNlZCAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgdGhlIG5ldyBjb2xscGFzZWQgc3RhdGUuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuY29sbGFwc2VkU3RhdGVGb3JDZWxsQ2hhbmdlZCA9IGZ1bmN0aW9uKGNlbGwsIGNvbGxhcHNlZCkKK3sKKwl2YXIgcHJldmlvdXMgPSB0aGlzLmlzQ29sbGFwc2VkKGNlbGwpOworCWNlbGwuc2V0Q29sbGFwc2VkKGNvbGxhcHNlZCk7CisJCisJcmV0dXJuIHByZXZpb3VzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNWaXNpYmxlCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gPG14Q2VsbD4gaXMgdmlzaWJsZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdob3NlIHZpc2libGUgc3RhdGUgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmlzVmlzaWJsZSA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIChjZWxsICE9IG51bGwpID8gY2VsbC5pc1Zpc2libGUoKSA6IGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0VmlzaWJsZQorICogCisgKiBTZXRzIHRoZSB2aXNpYmxlIHN0YXRlIG9mIHRoZSBnaXZlbiA8bXhDZWxsPiB1c2luZyA8bXhWaXNpYmxlQ2hhbmdlPiBhbmQKKyAqIGFkZHMgdGhlIGNoYW5nZSB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgdmlzaWJsZSBzdGF0ZSBzaG91bGQgYmUgY2hhbmdlZC4KKyAqIHZpc2libGUgLSBCb29sZWFuIHRoYXQgc3BlY2lmaWVzIHRoZSBuZXcgdmlzaWJsZSBzdGF0ZS4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5zZXRWaXNpYmxlID0gZnVuY3Rpb24oY2VsbCwgdmlzaWJsZSkKK3sKKwlpZiAodmlzaWJsZSAhPSB0aGlzLmlzVmlzaWJsZShjZWxsKSkKKwl7CisJCXRoaXMuZXhlY3V0ZShuZXcgbXhWaXNpYmxlQ2hhbmdlKHRoaXMsIGNlbGwsIHZpc2libGUpKTsKKwl9CisJCisJcmV0dXJuIHZpc2libGU7Cit9OworCQorLyoqCisgKiBGdW5jdGlvbjogdmlzaWJsZVN0YXRlRm9yQ2VsbENoYW5nZWQKKyAqCisgKiBJbm5lciBjYWxsYmFjayB0byB1cGRhdGUgdGhlIHZpc2libGUgc3RhdGUgb2YgdGhlCisgKiBnaXZlbiA8bXhDZWxsPiB1c2luZyA8bXhDZWxsLnNldENvbGxhcHNlZD4gYW5kIHJldHVybgorICogdGhlIHByZXZpb3VzIHZpc2libGUgc3RhdGUuCisgKgorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRoYXQgc3BlY2lmaWVzIHRoZSBjZWxsIHRvIGJlIHVwZGF0ZWQuCisgKiB2aXNpYmxlIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyB0aGUgbmV3IHZpc2libGUgc3RhdGUuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUudmlzaWJsZVN0YXRlRm9yQ2VsbENoYW5nZWQgPSBmdW5jdGlvbihjZWxsLCB2aXNpYmxlKQoreworCXZhciBwcmV2aW91cyA9IHRoaXMuaXNWaXNpYmxlKGNlbGwpOworCWNlbGwuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKwkKKwlyZXR1cm4gcHJldmlvdXM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBleGVjdXRlCisgKiAKKyAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBlZGl0IGFuZCBmaXJlcyBldmVudHMgaWYgcmVxdWlyZWQuIFRoZSBlZGl0IG9iamVjdAorICogcmVxdWlyZXMgYW4gZXhlY3V0ZSBmdW5jdGlvbiB3aGljaCBpcyBpbnZva2VkLiBUaGUgZWRpdCBpcyBhZGRlZCB0byB0aGUKKyAqIDxjdXJyZW50RWRpdD4gYmV0d2VlbiA8YmVnaW5VcGRhdGU+IGFuZCA8ZW5kVXBkYXRlPiBjYWxscywgc28gdGhhdAorICogZXZlbnRzIHdpbGwgYmUgZmlyZWQgaWYgdGhpcyBleGVjdXRlIGlzIGFuIGluZGl2aWR1YWwgdHJhbnNhY3Rpb24sIHRoYXQKKyAqIGlzLCBpZiBubyBwcmV2aW91cyA8YmVnaW5VcGRhdGU+IGNhbGxzIGhhdmUgYmVlbiBtYWRlIHdpdGhvdXQgY2FsbGluZworICogPGVuZFVwZGF0ZT4uIFRoaXMgaW1wbGVtZW50YXRpb24gZmlyZXMgYW4gPGV4ZWN1dGU+IGV2ZW50IGJlZm9yZQorICogZXhlY3V0aW5nIHRoZSBnaXZlbiBjaGFuZ2UuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNoYW5nZSAtIE9iamVjdCB0aGF0IGRlc2NyaWJlZCB0aGUgY2hhbmdlLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbihjaGFuZ2UpCit7CisJY2hhbmdlLmV4ZWN1dGUoKTsKKwl0aGlzLmJlZ2luVXBkYXRlKCk7CisJdGhpcy5jdXJyZW50RWRpdC5hZGQoY2hhbmdlKTsKKwl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LkVYRUNVVEUsICdjaGFuZ2UnLCBjaGFuZ2UpKTsKKwkvLyBOZXcgZ2xvYmFsIGV4ZWN1dGVkIGV2ZW50CisJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5FWEVDVVRFRCwgJ2NoYW5nZScsIGNoYW5nZSkpOworCXRoaXMuZW5kVXBkYXRlKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBiZWdpblVwZGF0ZQorICogCisgKiBJbmNyZW1lbnRzIHRoZSA8dXBkYXRlTGV2ZWw+IGJ5IG9uZS4gVGhlIGV2ZW50IG5vdGlmaWNhdGlvbgorICogaXMgcXVldWVkIHVudGlsIDx1cGRhdGVMZXZlbD4gcmVhY2hlcyAwIGJ5IHVzZSBvZgorICogPGVuZFVwZGF0ZT4uCisgKgorICogQWxsIGNoYW5nZXMgb24gPG14R3JhcGhNb2RlbD4gYXJlIHRyYW5zYWN0aW9uYWwsCisgKiB0aGF0IGlzLCB0aGV5IGFyZSBleGVjdXRlZCBpbiBhIHNpbmdsZSB1bmRvYWJsZSBjaGFuZ2UKKyAqIG9uIHRoZSBtb2RlbCAod2l0aG91dCB0cmFuc2FjdGlvbiBpc29sYXRpb24pLgorICogVGhlcmVmb3JlLCBpZiB5b3Ugd2FudCB0byBjb21iaW5lIGFueQorICogbnVtYmVyIG9mIGNoYW5nZXMgaW50byBhIHNpbmdsZSB1bmRvYWJsZSBjaGFuZ2UsCisgKiB5b3Ugc2hvdWxkIGdyb3VwIGFueSB0d28gb3IgbW9yZSBBUEkgY2FsbHMgdGhhdAorICogbW9kaWZ5IHRoZSBncmFwaCBtb2RlbCBiZXR3ZWVuIDxiZWdpblVwZGF0ZT4KKyAqIGFuZCA8ZW5kVXBkYXRlPiBjYWxscyBhcyBzaG93biBoZXJlOgorICogCisgKiAoY29kZSkKKyAqIHZhciBtb2RlbCA9IGdyYXBoLmdldE1vZGVsKCk7CisgKiB2YXIgcGFyZW50ID0gZ3JhcGguZ2V0RGVmYXVsdFBhcmVudCgpOworICogdmFyIGluZGV4ID0gbW9kZWwuZ2V0Q2hpbGRDb3VudChwYXJlbnQpOworICogbW9kZWwuYmVnaW5VcGRhdGUoKTsKKyAqIHRyeQorICogeworICogICBtb2RlbC5hZGQocGFyZW50LCB2MSwgaW5kZXgpOworICogICBtb2RlbC5hZGQocGFyZW50LCB2MiwgaW5kZXgrMSk7CisgKiB9CisgKiBmaW5hbGx5CisgKiB7CisgKiAgIG1vZGVsLmVuZFVwZGF0ZSgpOworICogfQorICogKGVuZCkKKyAqIAorICogT2YgY291cnNlIHRoZXJlIGlzIGEgc2hvcnRjdXQgZm9yIGFwcGVuZGluZyBhCisgKiBzZXF1ZW5jZSBvZiBjZWxscyBpbnRvIHRoZSBkZWZhdWx0IHBhcmVudDoKKyAqIAorICogKGNvZGUpCisgKiBncmFwaC5hZGRDZWxscyhbdjEsIHYyXSkuCisgKiAoZW5kKQorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmJlZ2luVXBkYXRlID0gZnVuY3Rpb24oKQoreworCXRoaXMudXBkYXRlTGV2ZWwrKzsKKwl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LkJFR0lOX1VQREFURSkpOworCQorCWlmICh0aGlzLnVwZGF0ZUxldmVsID09IDEpCisJeworCQl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LlNUQVJUX0VESVQpKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBlbmRVcGRhdGUKKyAqIAorICogRGVjcmVtZW50cyB0aGUgPHVwZGF0ZUxldmVsPiBieSBvbmUgYW5kIGZpcmVzIGFuIDx1bmRvPgorICogZXZlbnQgaWYgdGhlIDx1cGRhdGVMZXZlbD4gcmVhY2hlcyAwLiBUaGlzIGZ1bmN0aW9uCisgKiBpbmRpcmVjdGx5IGZpcmVzIGEgPGNoYW5nZT4gZXZlbnQgYnkgaW52b2tpbmcgdGhlIG5vdGlmeQorICogZnVuY3Rpb24gb24gdGhlIDxjdXJyZW50RWRpdD4gdW5kIHRoZW4gY3JlYXRlcyBhIG5ldworICogPGN1cnJlbnRFZGl0PiB1c2luZyA8Y3JlYXRlVW5kb2FibGVFZGl0Pi4KKyAqCisgKiBUaGUgPHVuZG8+IGV2ZW50IGlzIGZpcmVkIG9ubHkgb25jZSBwZXIgZWRpdCwgd2hlcmVhcworICogdGhlIDxjaGFuZ2U+IGV2ZW50IGlzIGZpcmVkIHdoZW5ldmVyIHRoZSBub3RpZnkKKyAqIGZ1bmN0aW9uIGlzIGludm9rZWQsIHRoYXQgaXMsIG9uIHVuZG8gYW5kIHJlZG8gb2YKKyAqIHRoZSBlZGl0LgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmVuZFVwZGF0ZSA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnVwZGF0ZUxldmVsLS07CisJCisJaWYgKHRoaXMudXBkYXRlTGV2ZWwgPT0gMCkKKwl7CisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuRU5EX0VESVQpKTsKKwl9CisJCisJaWYgKCF0aGlzLmVuZGluZ1VwZGF0ZSkKKwl7CisJCXRoaXMuZW5kaW5nVXBkYXRlID0gdGhpcy51cGRhdGVMZXZlbCA9PSAwOworCQl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LkVORF9VUERBVEUsICdlZGl0JywgdGhpcy5jdXJyZW50RWRpdCkpOworCisJCXRyeQorCQl7CQkKKwkJCWlmICh0aGlzLmVuZGluZ1VwZGF0ZSAmJiAhdGhpcy5jdXJyZW50RWRpdC5pc0VtcHR5KCkpCisJCQl7CisJCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5CRUZPUkVfVU5ETywgJ2VkaXQnLCB0aGlzLmN1cnJlbnRFZGl0KSk7CisJCQkJdmFyIHRtcCA9IHRoaXMuY3VycmVudEVkaXQ7CisJCQkJdGhpcy5jdXJyZW50RWRpdCA9IHRoaXMuY3JlYXRlVW5kb2FibGVFZGl0KCk7CisJCQkJdG1wLm5vdGlmeSgpOworCQkJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuVU5ETywgJ2VkaXQnLCB0bXApKTsKKwkJCX0KKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCXRoaXMuZW5kaW5nVXBkYXRlID0gZmFsc2U7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVVbmRvYWJsZUVkaXQKKyAqIAorICogQ3JlYXRlcyBhIG5ldyA8bXhVbmRvYWJsZUVkaXQ+IHRoYXQgaW1wbGVtZW50cyB0aGUKKyAqIG5vdGlmeSBmdW5jdGlvbiB0byBmaXJlIGEgPGNoYW5nZT4gYW5kIDxub3RpZnk+IGV2ZW50CisgKiB0aHJvdWdoIHRoZSA8bXhVbmRvYWJsZUVkaXQ+J3Mgc291cmNlLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmNyZWF0ZVVuZG9hYmxlRWRpdCA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgZWRpdCA9IG5ldyBteFVuZG9hYmxlRWRpdCh0aGlzLCB0cnVlKTsKKwkKKwllZGl0Lm5vdGlmeSA9IGZ1bmN0aW9uKCkKKwl7CisJCS8vIExBVEVSOiBSZW1vdmUgY2hhbmdlcyBwcm9wZXJ0eSAoZGVwcmVjYXRlZCkKKwkJZWRpdC5zb3VyY2UuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuQ0hBTkdFLAorCQkJJ2VkaXQnLCBlZGl0LCAnY2hhbmdlcycsIGVkaXQuY2hhbmdlcykpOworCQllZGl0LnNvdXJjZS5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5OT1RJRlksCisJCQknZWRpdCcsIGVkaXQsICdjaGFuZ2VzJywgZWRpdC5jaGFuZ2VzKSk7CisJfTsKKwkKKwlyZXR1cm4gZWRpdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IG1lcmdlQ2hpbGRyZW4KKyAqIAorICogTWVyZ2VzIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gY2VsbCBpbnRvIHRoZSBnaXZlbiB0YXJnZXQgY2VsbCBpbnNpZGUKKyAqIHRoaXMgbW9kZWwuIEFsbCBjZWxscyBhcmUgY2xvbmVkIHVubGVzcyB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgY2VsbCBpbgorICogdGhlIG1vZGVsIHdpdGggdGhlIHNhbWUgaWQsIGluIHdoaWNoIGNhc2UgdGhlIHNvdXJjZSBjZWxsIGlzIGlnbm9yZWQgYW5kCisgKiBhbGwgZWRnZXMgYXJlIGNvbm5lY3RlZCB0byB0aGUgY29ycmVzcG9uZGluZyBjZWxsIGluIHRoaXMgbW9kZWwuIEVkZ2VzCisgKiBhcmUgY29uc2lkZXJlZCB0byBoYXZlIG5vIGlkZW50aXR5IGFuZCBhcmUgYWx3YXlzIGNsb25lZCB1bmxlc3MgdGhlCisgKiBjbG9uZUFsbEVkZ2VzIGZsYWcgaXMgc2V0IHRvIGZhbHNlLCBpbiB3aGljaCBjYXNlIGVkZ2VzIHdpdGggdGhlIHNhbWUKKyAqIGlkIGluIHRoZSB0YXJnZXQgbW9kZWwgYXJlIHJlY29ubmVjdGVkIHRvIHJlZmxlY3QgdGhlIHRlcm1pbmFscyBvZiB0aGUKKyAqIHNvdXJjZSBlZGdlcy4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5tZXJnZUNoaWxkcmVuID0gZnVuY3Rpb24oZnJvbSwgdG8sIGNsb25lQWxsRWRnZXMpCit7CisJY2xvbmVBbGxFZGdlcyA9IChjbG9uZUFsbEVkZ2VzICE9IG51bGwpID8gY2xvbmVBbGxFZGdlcyA6IHRydWU7CisJCisJdGhpcy5iZWdpblVwZGF0ZSgpOworCXRyeQorCXsKKwkJdmFyIG1hcHBpbmcgPSBuZXcgT2JqZWN0KCk7CisJCXRoaXMubWVyZ2VDaGlsZHJlbkltcGwoZnJvbSwgdG8sIGNsb25lQWxsRWRnZXMsIG1hcHBpbmcpOworCQkKKwkJLy8gUG9zdC1wcm9jZXNzZXMgYWxsIGVkZ2VzIGluIHRoZSBtYXBwaW5nIGFuZAorCQkvLyByZWNvbm5lY3RzIHRoZSB0ZXJtaW5hbHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKwkJLy8gY2VsbHMgaW4gdGhlIHRhcmdldCBtb2RlbAorCQlmb3IgKHZhciBrZXkgaW4gbWFwcGluZykKKwkJeworCQkJdmFyIGNlbGwgPSBtYXBwaW5nW2tleV07CisJCQl2YXIgdGVybWluYWwgPSB0aGlzLmdldFRlcm1pbmFsKGNlbGwsIHRydWUpOworCisJCQlpZiAodGVybWluYWwgIT0gbnVsbCkKKwkJCXsKKwkJCQl0ZXJtaW5hbCA9IG1hcHBpbmdbbXhDZWxsUGF0aC5jcmVhdGUodGVybWluYWwpXTsKKwkJCQl0aGlzLnNldFRlcm1pbmFsKGNlbGwsIHRlcm1pbmFsLCB0cnVlKTsKKwkJCX0KKwkJCQorCQkJdGVybWluYWwgPSB0aGlzLmdldFRlcm1pbmFsKGNlbGwsIGZhbHNlKTsKKwkJCQorCQkJaWYgKHRlcm1pbmFsICE9IG51bGwpCisJCQl7CisJCQkJdGVybWluYWwgPSBtYXBwaW5nW214Q2VsbFBhdGguY3JlYXRlKHRlcm1pbmFsKV07CisJCQkJdGhpcy5zZXRUZXJtaW5hbChjZWxsLCB0ZXJtaW5hbCwgZmFsc2UpOworCQkJfQorCQl9CisJfQorCWZpbmFsbHkKKwl7CisJCXRoaXMuZW5kVXBkYXRlKCk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogbWVyZ2VDaGlsZHJlbgorICogCisgKiBDbG9uZXMgdGhlIGNoaWxkcmVuIG9mIHRoZSBzb3VyY2UgY2VsbCBpbnRvIHRoZSBnaXZlbiB0YXJnZXQgY2VsbCBpbgorICogdGhpcyBtb2RlbCBhbmQgYWRkcyBhbiBlbnRyeSB0byB0aGUgbWFwcGluZyB0aGF0IG1hcHMgZnJvbSB0aGUgc291cmNlCisgKiBjZWxsIHRvIHRoZSB0YXJnZXQgY2VsbCB3aXRoIHRoZSBzYW1lIGlkIG9yIHRoZSBjbG9uZSBvZiB0aGUgc291cmNlIGNlbGwKKyAqIHRoYXQgd2FzIGluc2VydGVkIGludG8gdGhpcyBtb2RlbC4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5tZXJnZUNoaWxkcmVuSW1wbCA9IGZ1bmN0aW9uKGZyb20sIHRvLCBjbG9uZUFsbEVkZ2VzLCBtYXBwaW5nKQoreworCXRoaXMuYmVnaW5VcGRhdGUoKTsKKwl0cnkKKwl7CisJCXZhciBjaGlsZENvdW50ID0gZnJvbS5nZXRDaGlsZENvdW50KCk7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykKKwkJeworCQkJdmFyIGNlbGwgPSBmcm9tLmdldENoaWxkQXQoaSk7CisJCQkKKwkJCWlmICh0eXBlb2YoY2VsbC5nZXRJZCkgPT0gJ2Z1bmN0aW9uJykKKwkJCXsKKwkJCQl2YXIgaWQgPSBjZWxsLmdldElkKCk7CisJCQkJdmFyIHRhcmdldCA9IChpZCAhPSBudWxsICYmICghdGhpcy5pc0VkZ2UoY2VsbCkgfHwgIWNsb25lQWxsRWRnZXMpKSA/CisJCQkJCQl0aGlzLmdldENlbGwoaWQpIDogbnVsbDsKKwkJCQkKKwkJCQkvLyBDbG9uZXMgYW5kIGFkZHMgdGhlIGNoaWxkIGlmIG5vIGNlbGwgZXhpc3RzIGZvciB0aGUgaWQKKwkJCQlpZiAodGFyZ2V0ID09IG51bGwpCisJCQkJeworCQkJCQl2YXIgY2xvbmUgPSBjZWxsLmNsb25lKCk7CisJCQkJCWNsb25lLnNldElkKGlkKTsKKwkJCQkJCisJCQkJCS8vIFNldHMgdGhlIHRlcm1pbmFscyBmcm9tIHRoZSBvcmlnaW5hbCBjZWxsIHRvIHRoZSBjbG9uZQorCQkJCQkvLyBiZWNhdXNlIHRoZSBsb29rdXAgdXNlcyBzdHJpbmdzIG5vdCBjZWxscyBpbiBKUworCQkJCQljbG9uZS5zZXRUZXJtaW5hbChjZWxsLmdldFRlcm1pbmFsKHRydWUpLCB0cnVlKTsKKwkJCQkJY2xvbmUuc2V0VGVybWluYWwoY2VsbC5nZXRUZXJtaW5hbChmYWxzZSksIGZhbHNlKTsKKwkJCQkJCisJCQkJCS8vIERvICpOT1QqIHVzZSBtb2RlbC5hZGQgYXMgdGhpcyB3aWxsIG1vdmUgdGhlIGVkZ2UgYXdheQorCQkJCQkvLyBmcm9tIHRoZSBwYXJlbnQgaW4gdXBkYXRlRWRnZVBhcmVudCBpZiBtYWludGFpbkVkZ2VQYXJlbnQKKwkJCQkJLy8gaXMgZW5hYmxlZCBpbiB0aGUgdGFyZ2V0IG1vZGVsCisJCQkJCXRhcmdldCA9IHRvLmluc2VydChjbG9uZSk7CisJCQkJCXRoaXMuY2VsbEFkZGVkKHRhcmdldCk7CisJCQkJfQorCQkJCQorCQkJCS8vIFN0b3JlcyB0aGUgbWFwcGluZyBmb3IgbGF0ZXIgcmVjb25uZWN0aW5nIGVkZ2VzCisJCQkJbWFwcGluZ1tteENlbGxQYXRoLmNyZWF0ZShjZWxsKV0gPSB0YXJnZXQ7CisJCQkJCisJCQkJLy8gUmVjdXJzZXMKKwkJCQl0aGlzLm1lcmdlQ2hpbGRyZW5JbXBsKGNlbGwsIHRhcmdldCwgY2xvbmVBbGxFZGdlcywgbWFwcGluZyk7CisJCQl9CisJCX0KKwl9CisJZmluYWxseQorCXsKKwkJdGhpcy5lbmRVcGRhdGUoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRQYXJlbnRzCisgKiAKKyAqIFJldHVybnMgYW4gYXJyYXkgdGhhdCByZXByZXNlbnRzIHRoZSBzZXQgKG5vIGR1cGxpY2F0ZXMpIG9mIGFsbCBwYXJlbnRzCisgKiBmb3IgdGhlIGdpdmVuIGFycmF5IG9mIGNlbGxzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxscyAtIEFycmF5IG9mIGNlbGxzIHdob3NlIHBhcmVudHMgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmdldFBhcmVudHMgPSBmdW5jdGlvbihjZWxscykKK3sKKwl2YXIgcGFyZW50cyA9IFtdOworCQorCWlmIChjZWxscyAhPSBudWxsKQorCXsKKwkJdmFyIGRpY3QgPSBuZXcgbXhEaWN0aW9uYXJ5KCk7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorCQl7CisJCQl2YXIgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoY2VsbHNbaV0pOworCQkJCisJCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIWRpY3QuZ2V0KHBhcmVudCkpCisJCQl7CisJCQkJZGljdC5wdXQocGFyZW50LCB0cnVlKTsKKwkJCQlwYXJlbnRzLnB1c2gocGFyZW50KTsKKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gcGFyZW50czsKK307CisKKy8vCisvLyBDZWxsIENsb25pbmcKKy8vCisKKy8qKgorICogRnVuY3Rpb246IGNsb25lQ2VsbAorICogCisgKiBSZXR1cm5zIGEgZGVlcCBjbG9uZSBvZiB0aGUgZ2l2ZW4gPG14Q2VsbD4gKGluY2x1ZGluZworICogdGhlIGNoaWxkcmVuKSB3aGljaCBpcyBjcmVhdGVkIHVzaW5nIDxjbG9uZUNlbGxzPi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdG8gYmUgY2xvbmVkLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLmNsb25lQ2VsbCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJaWYgKGNlbGwgIT0gbnVsbCkKKwl7CisJCXJldHVybiB0aGlzLmNsb25lQ2VsbHMoW2NlbGxdLCB0cnVlKVswXTsKKwl9CisJCisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjbG9uZUNlbGxzCisgKiAKKyAqIFJldHVybnMgYW4gYXJyYXkgb2YgY2xvbmVzIGZvciB0aGUgZ2l2ZW4gYXJyYXkgb2YgPG14Q2VsbHM+LgorICogRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBpbmNsdWRlQ2hpbGRyZW4sIGEgZGVlcCBjbG9uZSBpcyBjcmVhdGVkIGZvcgorICogZWFjaCBjZWxsLiBDb25uZWN0aW9ucyBhcmUgcmVzdG9yZWQgYmFzZWQgaWYgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGNlbGwgaXMgY29udGFpbmVkIGluIHRoZSBwYXNzZWQgaW4gYXJyYXkuCisgKgorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbHMgLSBBcnJheSBvZiA8bXhDZWxsPiB0byBiZSBjbG9uZWQuCisgKiBpbmNsdWRlQ2hpbGRyZW4gLSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGNlbGxzIHNob3VsZCBiZSBjbG9uZWQKKyAqIHdpdGggYWxsIGRlc2NlbmRhbnRzLgorICogbWFwcGluZyAtIE9wdGlvbmFsIG1hcHBpbmcgZm9yIGV4aXN0aW5nIGNsb25lcy4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5jbG9uZUNlbGxzID0gZnVuY3Rpb24oY2VsbHMsIGluY2x1ZGVDaGlsZHJlbiwgbWFwcGluZykKK3sKKwltYXBwaW5nID0gKG1hcHBpbmcgIT0gbnVsbCkgPyBtYXBwaW5nIDogbmV3IE9iamVjdCgpOworCXZhciBjbG9uZXMgPSBbXTsKKwkKKwlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorCXsKKwkJaWYgKGNlbGxzW2ldICE9IG51bGwpCisJCXsKKwkJCWNsb25lcy5wdXNoKHRoaXMuY2xvbmVDZWxsSW1wbChjZWxsc1tpXSwgbWFwcGluZywgaW5jbHVkZUNoaWxkcmVuKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQljbG9uZXMucHVzaChudWxsKTsKKwkJfQorCX0KKwkKKwlmb3IgKHZhciBpID0gMDsgaSA8IGNsb25lcy5sZW5ndGg7IGkrKykKKwl7CisJCWlmIChjbG9uZXNbaV0gIT0gbnVsbCkKKwkJeworCQkJdGhpcy5yZXN0b3JlQ2xvbmUoY2xvbmVzW2ldLCBjZWxsc1tpXSwgbWFwcGluZyk7CisJCX0KKwl9CisJCisJcmV0dXJuIGNsb25lczsKK307CisJCQkKKy8qKgorICogRnVuY3Rpb246IGNsb25lQ2VsbEltcGwKKyAqIAorICogSW5uZXIgaGVscGVyIG1ldGhvZCBmb3IgY2xvbmluZyBjZWxscyByZWN1cnNpdmVseS4KKyAqLworbXhHcmFwaE1vZGVsLnByb3RvdHlwZS5jbG9uZUNlbGxJbXBsID0gZnVuY3Rpb24oY2VsbCwgbWFwcGluZywgaW5jbHVkZUNoaWxkcmVuKQoreworCXZhciBjbG9uZSA9IHRoaXMuY2VsbENsb25lZChjZWxsKTsKKwkKKwkvLyBTdG9yZXMgdGhlIGNsb25lIGluIHRoZSBsb29rdXAgdGFibGUKKwltYXBwaW5nW214T2JqZWN0SWRlbnRpdHkuZ2V0KGNlbGwpXSA9IGNsb25lOworCQorCWlmIChpbmNsdWRlQ2hpbGRyZW4pCisJeworCQl2YXIgY2hpbGRDb3VudCA9IHRoaXMuZ2V0Q2hpbGRDb3VudChjZWxsKTsKKwkJCisJCWZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKQorCQl7CisJCQl2YXIgY2xvbmVDaGlsZCA9IHRoaXMuY2xvbmVDZWxsSW1wbCgKKwkJCQl0aGlzLmdldENoaWxkQXQoY2VsbCwgaSksIG1hcHBpbmcsIHRydWUpOworCQkJY2xvbmUuaW5zZXJ0KGNsb25lQ2hpbGQpOworCQl9CisJfQorCQorCXJldHVybiBjbG9uZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNlbGxDbG9uZWQKKyAqIAorICogSG9vayBmb3IgY2xvbmluZyB0aGUgY2VsbC4gVGhpcyByZXR1cm5zIGNlbGwuY2xvbmUoKSBvcgorICogYW55IHBvc3NpYmxlIGV4Y2VwdGlvbnMuCisgKi8KK214R3JhcGhNb2RlbC5wcm90b3R5cGUuY2VsbENsb25lZCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIGNlbGwuY2xvbmUoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlc3RvcmVDbG9uZQorICogCisgKiBJbm5lciBoZWxwZXIgbWV0aG9kIGZvciByZXN0b3JpbmcgdGhlIGNvbm5lY3Rpb25zIGluCisgKiBhIG5ldHdvcmsgb2YgY2xvbmVkIGNlbGxzLgorICovCitteEdyYXBoTW9kZWwucHJvdG90eXBlLnJlc3RvcmVDbG9uZSA9IGZ1bmN0aW9uKGNsb25lLCBjZWxsLCBtYXBwaW5nKQoreworCXZhciBzb3VyY2UgPSB0aGlzLmdldFRlcm1pbmFsKGNlbGwsIHRydWUpOworCQorCWlmIChzb3VyY2UgIT0gbnVsbCkKKwl7CisJCXZhciB0bXAgPSBtYXBwaW5nW214T2JqZWN0SWRlbnRpdHkuZ2V0KHNvdXJjZSldOworCQkKKwkJaWYgKHRtcCAhPSBudWxsKQorCQl7CisJCQl0bXAuaW5zZXJ0RWRnZShjbG9uZSwgdHJ1ZSk7CisJCX0KKwl9CisJCisJdmFyIHRhcmdldCA9IHRoaXMuZ2V0VGVybWluYWwoY2VsbCwgZmFsc2UpOworCQorCWlmICh0YXJnZXQgIT0gbnVsbCkKKwl7CisJCXZhciB0bXAgPSBtYXBwaW5nW214T2JqZWN0SWRlbnRpdHkuZ2V0KHRhcmdldCldOworCQkKKwkJaWYgKHRtcCAhPSBudWxsKQorCQl7CQorCQkJdG1wLmluc2VydEVkZ2UoY2xvbmUsIGZhbHNlKTsKKwkJfQorCX0KKwkKKwl2YXIgY2hpbGRDb3VudCA9IHRoaXMuZ2V0Q2hpbGRDb3VudChjbG9uZSk7CisJCisJZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspCisJeworCQl0aGlzLnJlc3RvcmVDbG9uZSh0aGlzLmdldENoaWxkQXQoY2xvbmUsIGkpLAorCQkJdGhpcy5nZXRDaGlsZEF0KGNlbGwsIGkpLCBtYXBwaW5nKTsKKwl9Cit9OworCisvLworLy8gQXRvbWljIGNoYW5nZXMKKy8vCisKKy8qKgorICogQ2xhc3M6IG14Um9vdENoYW5nZQorICogCisgKiBBY3Rpb24gdG8gY2hhbmdlIHRoZSByb290IGluIGEgbW9kZWwuCisgKgorICogQ29uc3RydWN0b3I6IG14Um9vdENoYW5nZQorICogCisgKiBDb25zdHJ1Y3RzIGEgY2hhbmdlIG9mIHRoZSByb290IGluIHRoZQorICogc3BlY2lmaWVkIG1vZGVsLgorICovCitmdW5jdGlvbiBteFJvb3RDaGFuZ2UobW9kZWwsIHJvb3QpCit7CisJdGhpcy5tb2RlbCA9IG1vZGVsOworCXRoaXMucm9vdCA9IHJvb3Q7CisJdGhpcy5wcmV2aW91cyA9IHJvb3Q7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBleGVjdXRlCisgKiAKKyAqIENhcnJpZXMgb3V0IGEgY2hhbmdlIG9mIHRoZSByb290IHVzaW5nCisgKiA8bXhHcmFwaE1vZGVsLnJvb3RDaGFuZ2VkPi4KKyAqLworbXhSb290Q2hhbmdlLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24oKQoreworCXRoaXMucm9vdCA9IHRoaXMucHJldmlvdXM7CisJdGhpcy5wcmV2aW91cyA9IHRoaXMubW9kZWwucm9vdENoYW5nZWQodGhpcy5wcmV2aW91cyk7Cit9OworCisvKioKKyAqIENsYXNzOiBteENoaWxkQ2hhbmdlCisgKiAKKyAqIEFjdGlvbiB0byBhZGQgb3IgcmVtb3ZlIGEgY2hpbGQgaW4gYSBtb2RlbC4KKyAqCisgKiBDb25zdHJ1Y3RvcjogbXhDaGlsZENoYW5nZQorICogCisgKiBDb25zdHJ1Y3RzIGEgY2hhbmdlIG9mIGEgY2hpbGQgaW4gdGhlCisgKiBzcGVjaWZpZWQgbW9kZWwuCisgKi8KK2Z1bmN0aW9uIG14Q2hpbGRDaGFuZ2UobW9kZWwsIHBhcmVudCwgY2hpbGQsIGluZGV4KQoreworCXRoaXMubW9kZWwgPSBtb2RlbDsKKwl0aGlzLnBhcmVudCA9IHBhcmVudDsKKwl0aGlzLnByZXZpb3VzID0gcGFyZW50OworCXRoaXMuY2hpbGQgPSBjaGlsZDsKKwl0aGlzLmluZGV4ID0gaW5kZXg7CisJdGhpcy5wcmV2aW91c0luZGV4ID0gaW5kZXg7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBleGVjdXRlCisgKiAKKyAqIENoYW5nZXMgdGhlIHBhcmVudCBvZiA8Y2hpbGQ+IHVzaW5nCisgKiA8bXhHcmFwaE1vZGVsLnBhcmVudEZvckNlbGxDaGFuZ2VkPiBhbmQKKyAqIHJlbW92ZXMgb3IgcmVzdG9yZXMgdGhlIGNlbGwncworICogY29ubmVjdGlvbnMuCisgKi8KK214Q2hpbGRDaGFuZ2UucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbigpCit7CisJdmFyIHRtcCA9IHRoaXMubW9kZWwuZ2V0UGFyZW50KHRoaXMuY2hpbGQpOworCXZhciB0bXAyID0gKHRtcCAhPSBudWxsKSA/IHRtcC5nZXRJbmRleCh0aGlzLmNoaWxkKSA6IDA7CisJCisJaWYgKHRoaXMucHJldmlvdXMgPT0gbnVsbCkKKwl7CisJCXRoaXMuY29ubmVjdCh0aGlzLmNoaWxkLCBmYWxzZSk7CisJfQorCQorCXRtcCA9IHRoaXMubW9kZWwucGFyZW50Rm9yQ2VsbENoYW5nZWQoCisJCXRoaXMuY2hpbGQsIHRoaXMucHJldmlvdXMsIHRoaXMucHJldmlvdXNJbmRleCk7CisJCQorCWlmICh0aGlzLnByZXZpb3VzICE9IG51bGwpCisJeworCQl0aGlzLmNvbm5lY3QodGhpcy5jaGlsZCwgdHJ1ZSk7CisJfQorCQorCXRoaXMucGFyZW50ID0gdGhpcy5wcmV2aW91czsKKwl0aGlzLnByZXZpb3VzID0gdG1wOworCXRoaXMuaW5kZXggPSB0aGlzLnByZXZpb3VzSW5kZXg7CisJdGhpcy5wcmV2aW91c0luZGV4ID0gdG1wMjsKK307CisKKy8qKgorICogRnVuY3Rpb246IGRpc2Nvbm5lY3QKKyAqIAorICogRGlzY29ubmVjdHMgdGhlIGdpdmVuIGNlbGwgcmVjdXJzaXZlbHkgZnJvbSBpdHMKKyAqIHRlcm1pbmFscyBhbmQgc3RvcmVzIHRoZSBwcmV2aW91cyB0ZXJtaW5hbCBpbiB0aGUKKyAqIGNlbGwncyB0ZXJtaW5hbHMuCisgKi8KK214Q2hpbGRDaGFuZ2UucHJvdG90eXBlLmNvbm5lY3QgPSBmdW5jdGlvbihjZWxsLCBpc0Nvbm5lY3QpCit7CisJaXNDb25uZWN0ID0gKGlzQ29ubmVjdCAhPSBudWxsKSA/IGlzQ29ubmVjdCA6IHRydWU7CisJCisJdmFyIHNvdXJjZSA9IGNlbGwuZ2V0VGVybWluYWwodHJ1ZSk7CisJdmFyIHRhcmdldCA9IGNlbGwuZ2V0VGVybWluYWwoZmFsc2UpOworCQorCWlmIChzb3VyY2UgIT0gbnVsbCkKKwl7CisJCWlmIChpc0Nvbm5lY3QpCisJCXsKKwkJCXRoaXMubW9kZWwudGVybWluYWxGb3JDZWxsQ2hhbmdlZChjZWxsLCBzb3VyY2UsIHRydWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJdGhpcy5tb2RlbC50ZXJtaW5hbEZvckNlbGxDaGFuZ2VkKGNlbGwsIG51bGwsIHRydWUpOworCQl9CisJfQorCQorCWlmICh0YXJnZXQgIT0gbnVsbCkKKwl7CisJCWlmIChpc0Nvbm5lY3QpCisJCXsKKwkJCXRoaXMubW9kZWwudGVybWluYWxGb3JDZWxsQ2hhbmdlZChjZWxsLCB0YXJnZXQsIGZhbHNlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRoaXMubW9kZWwudGVybWluYWxGb3JDZWxsQ2hhbmdlZChjZWxsLCBudWxsLCBmYWxzZSk7CisJCX0KKwl9CisJCisJY2VsbC5zZXRUZXJtaW5hbChzb3VyY2UsIHRydWUpOworCWNlbGwuc2V0VGVybWluYWwodGFyZ2V0LCBmYWxzZSk7CisJCisJdmFyIGNoaWxkQ291bnQgPSB0aGlzLm1vZGVsLmdldENoaWxkQ291bnQoY2VsbCk7CisJCisJZm9yICh2YXIgaT0wOyBpPGNoaWxkQ291bnQ7IGkrKykKKwl7CisJCXRoaXMuY29ubmVjdCh0aGlzLm1vZGVsLmdldENoaWxkQXQoY2VsbCwgaSksIGlzQ29ubmVjdCk7CisJfQorfTsKKworLyoqCisgKiBDbGFzczogbXhUZXJtaW5hbENoYW5nZQorICogCisgKiBBY3Rpb24gdG8gY2hhbmdlIGEgdGVybWluYWwgaW4gYSBtb2RlbC4KKyAqCisgKiBDb25zdHJ1Y3RvcjogbXhUZXJtaW5hbENoYW5nZQorICogCisgKiBDb25zdHJ1Y3RzIGEgY2hhbmdlIG9mIGEgdGVybWluYWwgaW4gdGhlIAorICogc3BlY2lmaWVkIG1vZGVsLgorICovCitmdW5jdGlvbiBteFRlcm1pbmFsQ2hhbmdlKG1vZGVsLCBjZWxsLCB0ZXJtaW5hbCwgc291cmNlKQoreworCXRoaXMubW9kZWwgPSBtb2RlbDsKKwl0aGlzLmNlbGwgPSBjZWxsOworCXRoaXMudGVybWluYWwgPSB0ZXJtaW5hbDsKKwl0aGlzLnByZXZpb3VzID0gdGVybWluYWw7CisJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBleGVjdXRlCisgKiAKKyAqIENoYW5nZXMgdGhlIHRlcm1pbmFsIG9mIDxjZWxsPiB0byA8cHJldmlvdXM+IHVzaW5nCisgKiA8bXhHcmFwaE1vZGVsLnRlcm1pbmFsRm9yQ2VsbENoYW5nZWQ+LgorICovCitteFRlcm1pbmFsQ2hhbmdlLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24oKQoreworCXRoaXMudGVybWluYWwgPSB0aGlzLnByZXZpb3VzOworCXRoaXMucHJldmlvdXMgPSB0aGlzLm1vZGVsLnRlcm1pbmFsRm9yQ2VsbENoYW5nZWQoCisJCXRoaXMuY2VsbCwgdGhpcy5wcmV2aW91cywgdGhpcy5zb3VyY2UpOworfTsKKworLyoqCisgKiBDbGFzczogbXhWYWx1ZUNoYW5nZQorICogCisgKiBBY3Rpb24gdG8gY2hhbmdlIGEgdXNlciBvYmplY3QgaW4gYSBtb2RlbC4KKyAqCisgKiBDb25zdHJ1Y3RvcjogbXhWYWx1ZUNoYW5nZQorICogCisgKiBDb25zdHJ1Y3RzIGEgY2hhbmdlIG9mIGEgdXNlciBvYmplY3QgaW4gdGhlIAorICogc3BlY2lmaWVkIG1vZGVsLgorICovCitmdW5jdGlvbiBteFZhbHVlQ2hhbmdlKG1vZGVsLCBjZWxsLCB2YWx1ZSkKK3sKKwl0aGlzLm1vZGVsID0gbW9kZWw7CisJdGhpcy5jZWxsID0gY2VsbDsKKwl0aGlzLnZhbHVlID0gdmFsdWU7CisJdGhpcy5wcmV2aW91cyA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZXhlY3V0ZQorICogCisgKiBDaGFuZ2VzIHRoZSB2YWx1ZSBvZiA8Y2VsbD4gdG8gPHByZXZpb3VzPiB1c2luZworICogPG14R3JhcGhNb2RlbC52YWx1ZUZvckNlbGxDaGFuZ2VkPi4KKyAqLworbXhWYWx1ZUNoYW5nZS5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnZhbHVlID0gdGhpcy5wcmV2aW91czsKKwl0aGlzLnByZXZpb3VzID0gdGhpcy5tb2RlbC52YWx1ZUZvckNlbGxDaGFuZ2VkKAorCQl0aGlzLmNlbGwsIHRoaXMucHJldmlvdXMpOworfTsKKworLyoqCisgKiBDbGFzczogbXhTdHlsZUNoYW5nZQorICogCisgKiBBY3Rpb24gdG8gY2hhbmdlIGEgY2VsbCdzIHN0eWxlIGluIGEgbW9kZWwuCisgKgorICogQ29uc3RydWN0b3I6IG14U3R5bGVDaGFuZ2UKKyAqIAorICogQ29uc3RydWN0cyBhIGNoYW5nZSBvZiBhIHN0eWxlIGluIHRoZQorICogc3BlY2lmaWVkIG1vZGVsLgorICovCitmdW5jdGlvbiBteFN0eWxlQ2hhbmdlKG1vZGVsLCBjZWxsLCBzdHlsZSkKK3sKKwl0aGlzLm1vZGVsID0gbW9kZWw7CisJdGhpcy5jZWxsID0gY2VsbDsKKwl0aGlzLnN0eWxlID0gc3R5bGU7CisJdGhpcy5wcmV2aW91cyA9IHN0eWxlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZXhlY3V0ZQorICogCisgKiBDaGFuZ2VzIHRoZSBzdHlsZSBvZiA8Y2VsbD4gdG8gPHByZXZpb3VzPiB1c2luZworICogPG14R3JhcGhNb2RlbC5zdHlsZUZvckNlbGxDaGFuZ2VkPi4KKyAqLworbXhTdHlsZUNoYW5nZS5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnN0eWxlID0gdGhpcy5wcmV2aW91czsKKwl0aGlzLnByZXZpb3VzID0gdGhpcy5tb2RlbC5zdHlsZUZvckNlbGxDaGFuZ2VkKAorCQl0aGlzLmNlbGwsIHRoaXMucHJldmlvdXMpOworfTsKKworLyoqCisgKiBDbGFzczogbXhHZW9tZXRyeUNoYW5nZQorICogCisgKiBBY3Rpb24gdG8gY2hhbmdlIGEgY2VsbCdzIGdlb21ldHJ5IGluIGEgbW9kZWwuCisgKgorICogQ29uc3RydWN0b3I6IG14R2VvbWV0cnlDaGFuZ2UKKyAqIAorICogQ29uc3RydWN0cyBhIGNoYW5nZSBvZiBhIGdlb21ldHJ5IGluIHRoZQorICogc3BlY2lmaWVkIG1vZGVsLgorICovCitmdW5jdGlvbiBteEdlb21ldHJ5Q2hhbmdlKG1vZGVsLCBjZWxsLCBnZW9tZXRyeSkKK3sKKwl0aGlzLm1vZGVsID0gbW9kZWw7CisJdGhpcy5jZWxsID0gY2VsbDsKKwl0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnk7CisJdGhpcy5wcmV2aW91cyA9IGdlb21ldHJ5OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZXhlY3V0ZQorICogCisgKiBDaGFuZ2VzIHRoZSBnZW9tZXRyeSBvZiA8Y2VsbD4gcm8gPHByZXZpb3VzPiB1c2luZworICogPG14R3JhcGhNb2RlbC5nZW9tZXRyeUZvckNlbGxDaGFuZ2VkPi4KKyAqLworbXhHZW9tZXRyeUNoYW5nZS5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLmdlb21ldHJ5ID0gdGhpcy5wcmV2aW91czsKKwl0aGlzLnByZXZpb3VzID0gdGhpcy5tb2RlbC5nZW9tZXRyeUZvckNlbGxDaGFuZ2VkKAorCQl0aGlzLmNlbGwsIHRoaXMucHJldmlvdXMpOworfTsKKworLyoqCisgKiBDbGFzczogbXhDb2xsYXBzZUNoYW5nZQorICogCisgKiBBY3Rpb24gdG8gY2hhbmdlIGEgY2VsbCdzIGNvbGxhcHNlZCBzdGF0ZSBpbiBhIG1vZGVsLgorICoKKyAqIENvbnN0cnVjdG9yOiBteENvbGxhcHNlQ2hhbmdlCisgKiAKKyAqIENvbnN0cnVjdHMgYSBjaGFuZ2Ugb2YgYSBjb2xsYXBzZWQgc3RhdGUgaW4gdGhlCisgKiBzcGVjaWZpZWQgbW9kZWwuCisgKi8KK2Z1bmN0aW9uIG14Q29sbGFwc2VDaGFuZ2UobW9kZWwsIGNlbGwsIGNvbGxhcHNlZCkKK3sKKwl0aGlzLm1vZGVsID0gbW9kZWw7CisJdGhpcy5jZWxsID0gY2VsbDsKKwl0aGlzLmNvbGxhcHNlZCA9IGNvbGxhcHNlZDsKKwl0aGlzLnByZXZpb3VzID0gY29sbGFwc2VkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZXhlY3V0ZQorICogCisgKiBDaGFuZ2VzIHRoZSBjb2xsYXBzZWQgc3RhdGUgb2YgPGNlbGw+IHRvIDxwcmV2aW91cz4gdXNpbmcKKyAqIDxteEdyYXBoTW9kZWwuY29sbGFwc2VkU3RhdGVGb3JDZWxsQ2hhbmdlZD4uCisgKi8KK214Q29sbGFwc2VDaGFuZ2UucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbigpCit7CisJdGhpcy5jb2xsYXBzZWQgPSB0aGlzLnByZXZpb3VzOworCXRoaXMucHJldmlvdXMgPSB0aGlzLm1vZGVsLmNvbGxhcHNlZFN0YXRlRm9yQ2VsbENoYW5nZWQoCisJCXRoaXMuY2VsbCwgdGhpcy5wcmV2aW91cyk7Cit9OworCisvKioKKyAqIENsYXNzOiBteFZpc2libGVDaGFuZ2UKKyAqIAorICogQWN0aW9uIHRvIGNoYW5nZSBhIGNlbGwncyB2aXNpYmxlIHN0YXRlIGluIGEgbW9kZWwuCisgKgorICogQ29uc3RydWN0b3I6IG14VmlzaWJsZUNoYW5nZQorICogCisgKiBDb25zdHJ1Y3RzIGEgY2hhbmdlIG9mIGEgdmlzaWJsZSBzdGF0ZSBpbiB0aGUKKyAqIHNwZWNpZmllZCBtb2RlbC4KKyAqLworZnVuY3Rpb24gbXhWaXNpYmxlQ2hhbmdlKG1vZGVsLCBjZWxsLCB2aXNpYmxlKQoreworCXRoaXMubW9kZWwgPSBtb2RlbDsKKwl0aGlzLmNlbGwgPSBjZWxsOworCXRoaXMudmlzaWJsZSA9IHZpc2libGU7CisJdGhpcy5wcmV2aW91cyA9IHZpc2libGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBleGVjdXRlCisgKiAKKyAqIENoYW5nZXMgdGhlIHZpc2libGUgc3RhdGUgb2YgPGNlbGw+IHRvIDxwcmV2aW91cz4gdXNpbmcKKyAqIDxteEdyYXBoTW9kZWwudmlzaWJsZVN0YXRlRm9yQ2VsbENoYW5nZWQ+LgorICovCitteFZpc2libGVDaGFuZ2UucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbigpCit7CisJdGhpcy52aXNpYmxlID0gdGhpcy5wcmV2aW91czsKKwl0aGlzLnByZXZpb3VzID0gdGhpcy5tb2RlbC52aXNpYmxlU3RhdGVGb3JDZWxsQ2hhbmdlZCgKKwkJdGhpcy5jZWxsLCB0aGlzLnByZXZpb3VzKTsKK307CisKKy8qKgorICogQ2xhc3M6IG14Q2VsbEF0dHJpYnV0ZUNoYW5nZQorICogCisgKiBBY3Rpb24gdG8gY2hhbmdlIHRoZSBhdHRyaWJ1dGUgb2YgYSBjZWxsJ3MgdXNlciBvYmplY3QuCisgKiBUaGVyZSBpcyBubyBtZXRob2Qgb24gdGhlIGdyYXBoIG1vZGVsIHRoYXQgdXNlcyB0aGlzCisgKiBhY3Rpb24uIFRvIHVzZSB0aGUgYWN0aW9uLCB5b3UgY2FuIHVzZSB0aGUgY29kZSBzaG93bgorICogaW4gdGhlIGV4YW1wbGUgYmVsb3cuCisgKiAKKyAqIEV4YW1wbGU6CisgKiAKKyAqIFRvIGNoYW5nZSB0aGUgYXR0cmlidXRlTmFtZSBpbiB0aGUgY2VsbCdzIHVzZXIgb2JqZWN0CisgKiB0byBhdHRyaWJ1dGVWYWx1ZSwgdXNlIHRoZSBmb2xsb3dpbmcgY29kZToKKyAqIAorICogKGNvZGUpCisgKiBtb2RlbC5iZWdpblVwZGF0ZSgpOworICogdHJ5CisgKiB7CisgKiAgIHZhciBlZGl0ID0gbmV3IG14Q2VsbEF0dHJpYnV0ZUNoYW5nZSgKKyAqICAgICBjZWxsLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSk7CisgKiAgIG1vZGVsLmV4ZWN1dGUoZWRpdCk7CisgKiB9CisgKiBmaW5hbGx5CisgKiB7CisgKiAgIG1vZGVsLmVuZFVwZGF0ZSgpOworICogfSAKKyAqIChlbmQpCisgKgorICogQ29uc3RydWN0b3I6IG14Q2VsbEF0dHJpYnV0ZUNoYW5nZQorICogCisgKiBDb25zdHJ1Y3RzIGEgY2hhbmdlIG9mIGEgYXR0cmlidXRlIG9mIHRoZSBET00gbm9kZQorICogc3RvcmVkIGFzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gPG14Q2VsbD4uCisgKi8KK2Z1bmN0aW9uIG14Q2VsbEF0dHJpYnV0ZUNoYW5nZShjZWxsLCBhdHRyaWJ1dGUsIHZhbHVlKQoreworCXRoaXMuY2VsbCA9IGNlbGw7CisJdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7CisJdGhpcy52YWx1ZSA9IHZhbHVlOworCXRoaXMucHJldmlvdXMgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGV4ZWN1dGUKKyAqIAorICogQ2hhbmdlcyB0aGUgYXR0cmlidXRlIG9mIHRoZSBjZWxsJ3MgdXNlciBvYmplY3QgYnkKKyAqIHVzaW5nIDxteENlbGwuc2V0QXR0cmlidXRlPi4KKyAqLworbXhDZWxsQXR0cmlidXRlQ2hhbmdlLnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24oKQoreworCXZhciB0bXAgPSB0aGlzLmNlbGwuZ2V0QXR0cmlidXRlKHRoaXMuYXR0cmlidXRlKTsKKwkKKwlpZiAodGhpcy5wcmV2aW91cyA9PSBudWxsKQorCXsKKwkJdGhpcy5jZWxsLnZhbHVlLnJlbW92ZUF0dHJpYnV0ZSh0aGlzLmF0dHJpYnV0ZSk7CisJfQorCWVsc2UKKwl7CisJCXRoaXMuY2VsbC5zZXRBdHRyaWJ1dGUodGhpcy5hdHRyaWJ1dGUsIHRoaXMucHJldmlvdXMpOworCX0KKwkKKwl0aGlzLnByZXZpb3VzID0gdG1wOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9teENsaWVudC5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9teENsaWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTllODkyCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL214Q2xpZW50LmpzCkBAIC0wLDAgKzEsNzY5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE3LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNywgR2F1ZGVueiBBbGRlcgorICovCit2YXIgbXhDbGllbnQgPQoreworCS8qKgorCSAqIENsYXNzOiBteENsaWVudAorCSAqCisJICogQm9vdHN0cmFwcGluZyBtZWNoYW5pc20gZm9yIHRoZSBteEdyYXBoIHRoaW4gY2xpZW50LiBUaGUgcHJvZHVjdGlvbiB2ZXJzaW9uCisJICogb2YgdGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBjb2RlIHJlcXVpcmVkIHRvIHJ1biB0aGUgbXhHcmFwaCB0aGluIGNsaWVudCwgYXMKKwkgKiB3ZWxsIGFzIGdsb2JhbCBjb25zdGFudHMgdG8gaWRlbnRpZnkgdGhlIGJyb3dzZXIgYW5kIG9wZXJhdGluZyBzeXN0ZW0gaW4KKwkgKiB1c2UuIFlvdSBtYXkgaGF2ZSB0byBsb2FkIGNocm9tZTovL2dsb2JhbC9jb250ZW50L2NvbnRlbnRBcmVhVXRpbHMuanMgaW4KKwkgKiB5b3VyIHBhZ2UgdG8gZGlzYWJsZSBjZXJ0YWluIHNlY3VyaXR5IHJlc3RyaWN0aW9ucyBpbiBNb3ppbGxhLgorCSAqIAorCSAqIFZhcmlhYmxlOiBWRVJTSU9OCisJICoKKwkgKiBDb250YWlucyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBteEdyYXBoIGxpYnJhcnkuIFRoZSBzdHJpbmdzIHRoYXQKKwkgKiBjb21tdW5pY2F0ZSB2ZXJzaW9ucyBvZiBteEdyYXBoIHVzZSB0aGUgZm9sbG93aW5nIGZvcm1hdC4KKwkgKiAKKwkgKiB2ZXJzaW9uTWFqb3IudmVyc2lvbk1pbm9yLmJ1aWxkTnVtYmVyLnJldmlzaW9uTnVtYmVyCisJICogCisJICogQ3VycmVudCB2ZXJzaW9uIGlzIDMuNy41LgorCSAqLworCVZFUlNJT046ICczLjcuNScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogSVNfSUUKKwkgKgorCSAqIFRydWUgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBpcyBJbnRlcm5ldCBFeHBsb3JlciAxMCBvciBiZWxvdy4gVXNlIDxteENsaWVudC5JU19JRTExPgorCSAqIHRvIGRldGVjdCBJRSAxMS4KKwkgKi8KKwlJU19JRTogbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgPj0gMCwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBJU19JRTYKKwkgKgorCSAqIFRydWUgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBpcyBJbnRlcm5ldCBFeHBsb3JlciA2LnguCisJICovCisJSVNfSUU2OiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUgNicpID49IDAsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogSVNfSUUxMQorCSAqCisJICogVHJ1ZSBpZiB0aGUgY3VycmVudCBicm93c2VyIGlzIEludGVybmV0IEV4cGxvcmVyIDExLnguCisJICovCisJSVNfSUUxMTogISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9UcmlkZW50XC83XC4vKSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBJU19FREdFCisJICoKKwkgKiBUcnVlIGlmIHRoZSBjdXJyZW50IGJyb3dzZXIgaXMgTWljcm9zb2Z0IEVkZ2UuCisJICovCisJSVNfRURHRTogISFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9FZGdlXC8vKSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBJU19RVUlSS1MKKwkgKgorCSAqIFRydWUgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBpcyBJbnRlcm5ldCBFeHBsb3JlciBhbmQgaXQgaXMgaW4gcXVpcmtzIG1vZGUuCisJICovCisJSVNfUVVJUktTOiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUnKSA+PSAwICYmIChkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gbnVsbCB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gNSksCisKKwkvKioKKwkgKiBWYXJpYWJsZTogSVNfRU0KKwkgKiAKKwkgKiBUcnVlIGlmIHRoZSBicm93c2VyIGlzIElFMTEgaW4gZW50ZXJwcmlzZSBtb2RlIChJRTggc3RhbmRhcmRzIG1vZGUpLgorCSAqLworCUlTX0VNOiAnc3BlbGxjaGVjaycgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKSAmJiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gOCwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBWTUxfUFJFRklYCisJICogCisJICogUHJlZml4IGZvciBWTUwgbmFtZXNwYWNlIGluIG5vZGUgbmFtZXMuIERlZmF1bHQgaXMgJ3YnLgorCSAqLworCVZNTF9QUkVGSVg6ICd2JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBPRkZJQ0VfUFJFRklYCisJICogCisJICogUHJlZml4IGZvciBWTUwgb2ZmaWNlIG5hbWVzcGFjZSBpbiBub2RlIG5hbWVzLiBEZWZhdWx0IGlzICdvJy4KKwkgKi8KKwlPRkZJQ0VfUFJFRklYOiAnbycsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogSVNfTlMKKwkgKgorCSAqIFRydWUgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBpcyBOZXRzY2FwZSAoaW5jbHVkaW5nIEZpcmVmb3gpLgorCSAqLworICAJSVNfTlM6IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignTW96aWxsYS8nKSA+PSAwICYmCisgIAkJbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgPCAwICYmCisgIAkJbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdFZGdlLycpIDwgMCwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBJU19PUAorCSAqCisJICogVHJ1ZSBpZiB0aGUgY3VycmVudCBicm93c2VyIGlzIE9wZXJhLgorCSAqLworICAJSVNfT1A6IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignT3BlcmEvJykgPj0gMCB8fAorICAJCW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignT1BSLycpID49IDAsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogSVNfT1QKKwkgKgorCSAqIFRydWUgaWYgLW8tdHJhbnNmb3JtIGlzIGF2YWlsYWJsZSBhcyBhIENTUyBzdHlsZSwgaWUgZm9yIE9wZXJhIGJyb3dzZXJzCisJICogYmFzZWQgb24gYSBQcmVzdG8gZW5naW5lIHdpdGggdmVyc2lvbiAyLjUgb3IgbGF0ZXIuCisJICovCisgIAlJU19PVDogbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdQcmVzdG8vJykgPj0gMCAmJgorICAJCW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignUHJlc3RvLzIuNC4nKSA8IDAgJiYKKyAgCQluYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1ByZXN0by8yLjMuJykgPCAwICYmCisgIAkJbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdQcmVzdG8vMi4yLicpIDwgMCAmJgorICAJCW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignUHJlc3RvLzIuMS4nKSA8IDAgJiYKKyAgCQluYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1ByZXN0by8yLjAuJykgPCAwICYmCisgIAkJbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdQcmVzdG8vMS4nKSA8IDAsCisgIAkKKwkvKioKKwkgKiBWYXJpYWJsZTogSVNfU0YKKwkgKgorCSAqIFRydWUgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBpcyBTYWZhcmkuCisJICovCisgIAlJU19TRjogbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdBcHBsZVdlYktpdC8nKSA+PSAwICYmCisgIAkJbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUvJykgPCAwICYmCisgIAkJbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdFZGdlLycpIDwgMCwKKyAgCQorCS8qKgorCSAqIFZhcmlhYmxlOiBJU19JT1MKKwkgKiAKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHVzZXIgYWdlbnQgaXMgYW4gaVBhZCwgaVBob25lIG9yIGlQb2QuCisJICovCisgIAlJU19JT1M6IChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC8oaVBhZHxpUGhvbmV8aVBvZCkvZykgPyB0cnVlIDogZmFsc2UpLAorICAJCQorCS8qKgorCSAqIFZhcmlhYmxlOiBJU19HQworCSAqCisJICogVHJ1ZSBpZiB0aGUgY3VycmVudCBicm93c2VyIGlzIEdvb2dsZSBDaHJvbWUuCisJICovCisgIAlJU19HQzogbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUvJykgPj0gMCAmJgorCQluYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0VkZ2UvJykgPCAwLAorCQorCS8qKgorCSAqIFZhcmlhYmxlOiBJU19DSFJPTUVBUFAKKwkgKgorCSAqIFRydWUgaWYgdGhlIHRoaXMgaXMgcnVubmluZyBpbnNpZGUgYSBDaHJvbWUgQXBwLgorCSAqLworICAJSVNfQ0hST01FQVBQOiB3aW5kb3cuY2hyb21lICE9IG51bGwgJiYgY2hyb21lLmFwcCAhPSBudWxsICYmIGNocm9tZS5hcHAucnVudGltZSAhPSBudWxsLAorCQkKKwkvKioKKwkgKiBWYXJpYWJsZTogSVNfRkYKKwkgKgorCSAqIFRydWUgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBpcyBGaXJlZm94LgorCSAqLworICAJSVNfRkY6IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveC8nKSA+PSAwLAorICAJCisJLyoqCisJICogVmFyaWFibGU6IElTX01UCisJICoKKwkgKiBUcnVlIGlmIC1tb3otdHJhbnNmb3JtIGlzIGF2YWlsYWJsZSBhcyBhIENTUyBzdHlsZS4gVGhpcyBpcyB0aGUgY2FzZQorCSAqIGZvciBhbGwgRmlyZWZveC1iYXNlZCBicm93c2VycyBuZXdlciB0aGFuIG9yIGVxdWFsIDMsIHN1Y2ggYXMgQ2FtaW5vLAorCSAqIEljZXdlYXNlbCwgU2VhbW9ua2V5IGFuZCBJY2VhcGUuCisJICovCisgIAlJU19NVDogKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveC8nKSA+PSAwICYmCisJCW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveC8xLicpIDwgMCAmJgorICAJCW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveC8yLicpIDwgMCkgfHwKKyAgCQkobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdJY2V3ZWFzZWwvJykgPj0gMCAmJgorICAJCW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignSWNld2Vhc2VsLzEuJykgPCAwICYmCisgIAkJbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdJY2V3ZWFzZWwvMi4nKSA8IDApIHx8CisgIAkJKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignU2VhTW9ua2V5LycpID49IDAgJiYKKyAgCQluYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1NlYU1vbmtleS8xLicpIDwgMCkgfHwKKyAgCQkobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdJY2VhcGUvJykgPj0gMCAmJgorICAJCW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignSWNlYXBlLzEuJykgPCAwKSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBJU19TVkcKKwkgKgorCSAqIFRydWUgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgU1ZHLgorCSAqLworICAJSVNfU1ZHOiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gvJykgPj0gMCB8fCAvLyBGRiBhbmQgQ2FtaW5vCisJICAJbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdJY2V3ZWFzZWwvJykgPj0gMCB8fCAvLyBGaXJlZm94IG9uIERlYmlhbgorCSAgCW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignU2VhbW9ua2V5LycpID49IDAgfHwgLy8gRmlyZWZveC1iYXNlZAorCSAgCW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignSWNlYXBlLycpID49IDAgfHwgLy8gU2VhbW9ua2V5IG9uIERlYmlhbgorCSAgCW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignR2FsZW9uLycpID49IDAgfHwgLy8gR25vbWUgQnJvd3NlciAob2xkKQorCSAgCW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRXBpcGhhbnkvJykgPj0gMCB8fCAvLyBHbm9tZSBCcm93c2VyIChuZXcpCisJICAJbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdBcHBsZVdlYktpdC8nKSA+PSAwIHx8IC8vIFNhZmFyaS9Hb29nbGUgQ2hyb21lCisJICAJbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdHZWNrby8nKSA+PSAwIHx8IC8vIE5ldHNjYXBlL0dlY2tvCisJICAJbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdPcGVyYS8nKSA+PSAwIHx8IC8vIE9wZXJhCisJICAJKGRvY3VtZW50LmRvY3VtZW50TW9kZSAhPSBudWxsICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA+PSA5KSwgLy8gSUU5KworCisJLyoqCisJICogVmFyaWFibGU6IE5PX0ZPCisJICoKKwkgKiBUcnVlIGlmIGZvcmVpZ25PYmplY3Qgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLiBUaGlzIGlzIHRoZSBjYXNlIGZvcgorCSAqIE9wZXJhLCBvbGRlciBTVkctYmFzZWQgYnJvd3NlcnMgYW5kIGFsbCB2ZXJzaW9ucyBvZiBJRS4KKwkgKi8KKyAgCU5PX0ZPOiAhZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLAorICAJCSdmb3JlaWduT2JqZWN0JykgIT0gJ1tvYmplY3QgU1ZHRm9yZWlnbk9iamVjdEVsZW1lbnRdJyB8fCBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ09wZXJhLycpID49IDAsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogSVNfVk1MCisJICoKKwkgKiBUcnVlIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIFZNTC4KKwkgKi8KKyAgCUlTX1ZNTDogbmF2aWdhdG9yLmFwcE5hbWUudG9VcHBlckNhc2UoKSA9PSAnTUlDUk9TT0ZUIElOVEVSTkVUIEVYUExPUkVSJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBJU19XSU4KKwkgKgorCSAqIFRydWUgaWYgdGhlIGNsaWVudCBpcyBhIFdpbmRvd3MuCisJICovCisgIAlJU19XSU46IG5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoJ1dpbicpID4gMCwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBJU19NQUMKKwkgKgorCSAqIFRydWUgaWYgdGhlIGNsaWVudCBpcyBhIE1hYy4KKwkgKi8KKyAgCUlTX01BQzogbmF2aWdhdG9yLmFwcFZlcnNpb24uaW5kZXhPZignTWFjJykgPiAwLAorCisJLyoqCisJICogVmFyaWFibGU6IElTX1RPVUNICisJICogCisJICogVHJ1ZSBpZiB0aGlzIGRldmljZSBzdXBwb3J0cyB0b3VjaHN0YXJ0Ly1tb3ZlLy1lbmQgZXZlbnRzIChBcHBsZSBpT1MsCisJICogQW5kcm9pZCwgQ2hyb21lYm9vayBhbmQgQ2hyb21lIEJyb3dzZXIgb24gdG91Y2gtZW5hYmxlZCBkZXZpY2VzKS4KKwkgKi8KKyAgCUlTX1RPVUNIOiAnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogSVNfUE9JTlRFUgorCSAqIAorCSAqIFRydWUgaWYgdGhpcyBkZXZpY2Ugc3VwcG9ydHMgTWljcm9zb2Z0IHBvaW50ZXIgZXZlbnRzIChhbHdheXMgZmFsc2Ugb24gTWFjcykuCisJICovCisgIAlJU19QT0lOVEVSOiB3aW5kb3cuUG9pbnRlckV2ZW50ICE9IG51bGwgJiYgIShuYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCdNYWMnKSA+IDApLAorCisJLyoqCisJICogVmFyaWFibGU6IElTX0xPQ0FMCisJICoKKwkgKiBUcnVlIGlmIHRoZSBkb2N1bWVudHMgbG9jYXRpb24gZG9lcyBub3Qgc3RhcnQgd2l0aCBodHRwOi8vIG9yIGh0dHBzOi8vLgorCSAqLworICAJSVNfTE9DQUw6IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignaHR0cDovLycpIDwgMCAmJgorICAJCQkgIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignaHR0cHM6Ly8nKSA8IDAsCisKKwkvKioKKwkgKiBGdW5jdGlvbjogaXNCcm93c2VyU3VwcG9ydGVkCisJICoKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBpcyBzdXBwb3J0ZWQsIHRoYXQgaXMsIGlmCisJICogPG14Q2xpZW50LklTX1ZNTD4gb3IgPG14Q2xpZW50LklTX1NWRz4gaXMgdHJ1ZS4KKwkgKiAKKwkgKiBFeGFtcGxlOgorCSAqIAorCSAqIChjb2RlKQorCSAqIGlmICghbXhDbGllbnQuaXNCcm93c2VyU3VwcG9ydGVkKCkpCisJICogeworCSAqICAgbXhVdGlscy5lcnJvcignQnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkIScsIDIwMCwgZmFsc2UpOworCSAqIH0KKwkgKiAoZW5kKQorCSAqLworCWlzQnJvd3NlclN1cHBvcnRlZDogZnVuY3Rpb24oKQorCXsKKwkJcmV0dXJuIG14Q2xpZW50LklTX1ZNTCB8fCBteENsaWVudC5JU19TVkc7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBsaW5rCisJICoKKwkgKiBBZGRzIGEgbGluayBub2RlIHRvIHRoZSBoZWFkIG9mIHRoZSBkb2N1bWVudC4gVXNlIHRoaXMKKwkgKiB0byBhZGQgYSBzdHlsZXNoZWV0IHRvIHRoZSBwYWdlIGFzIGZvbGxvd3M6CisJICoKKwkgKiAoY29kZSkKKwkgKiBteENsaWVudC5saW5rKCdzdHlsZXNoZWV0JywgZmlsZW5hbWUpOworCSAqIChlbmQpCisJICoKKwkgKiB3aGVyZSBmaWxlbmFtZSBpcyB0aGUgKHJlbGF0aXZlKSBVUkwgb2YgdGhlIHN0eWxlc2hlZXQuIFRoZSBjaGFyc2V0CisJICogaXMgaGFyZGNvZGVkIHRvIElTTy04ODU5LTEgYW5kIHRoZSB0eXBlIGlzIHRleHQvY3NzLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogcmVsIC0gU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgcmVsIGF0dHJpYnV0ZSBvZiB0aGUgbGluayBub2RlLgorCSAqIGhyZWYgLSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBocmVmIGF0dHJpYnV0ZSBvZiB0aGUgbGluayBub2RlLgorCSAqIGRvYyAtIE9wdGlvbmFsIHBhcmVudCBkb2N1bWVudCBvZiB0aGUgbGluayBub2RlLgorCSAqLworCWxpbms6IGZ1bmN0aW9uKHJlbCwgaHJlZiwgZG9jKQorCXsKKwkJZG9jID0gZG9jIHx8IGRvY3VtZW50OworCisJCS8vIFdvcmthcm91bmQgZm9yIE9wZXJhdGlvbiBBYm9ydGVkIGluIElFNiBpZiBiYXNlIHRhZyBpcyB1c2VkIGluIGhlYWQKKwkJaWYgKG14Q2xpZW50LklTX0lFNikKKwkJeworCQkJZG9jLndyaXRlKCc8bGluayByZWw9IicgKyByZWwgKyAnIiBocmVmPSInICsgaHJlZiArICciIGNoYXJzZXQ9IlVURi04IiB0eXBlPSJ0ZXh0L2NzcyIvPicpOworCQl9CisJCWVsc2UKKwkJewkKKwkJCXZhciBsaW5rID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKKwkJCQorCQkJbGluay5zZXRBdHRyaWJ1dGUoJ3JlbCcsIHJlbCk7CisJCQlsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpOworCQkJbGluay5zZXRBdHRyaWJ1dGUoJ2NoYXJzZXQnLCAnVVRGLTgnKTsKKwkJCWxpbmsuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvY3NzJyk7CisJCQkKKwkJCXZhciBoZWFkID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07CisJICAgCQloZWFkLmFwcGVuZENoaWxkKGxpbmspOworCQl9CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogaW5jbHVkZQorCSAqCisJICogRHluYW1pY2FsbHkgYWRkcyBhIHNjcmlwdCBub2RlIHRvIHRoZSBkb2N1bWVudCBoZWFkZXIuCisJICogCisJICogSW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMsIHRoZSBpbmNsdWRlcyBhcmUgcmVzb2x2ZWQgaW4gdGhlIG14Q2xpZW50LmpzCisJICogZmlsZSB0byByZWR1Y2UgdGhlIG51bWJlciBvZiByZXF1ZXN0cyByZXF1aXJlZCBmb3IgY2xpZW50IHN0YXJ0dXAuIFRoaXMKKwkgKiBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cywgYnV0IG5vdCBpbgorCSAqIHByb2R1Y3Rpb24gc3lzdGVtcy4KKwkgKi8KKwlpbmNsdWRlOiBmdW5jdGlvbihzcmMpCisJeworCQlkb2N1bWVudC53cml0ZSgnPHNjcmlwdCBzcmM9Iicrc3JjKyciPjwvc2NyaXB0PicpOworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IGRpc3Bvc2UKKwkgKiAKKwkgKiBGcmVlcyB1cCBtZW1vcnkgaW4gSUUgYnkgcmVzb2x2aW5nIGN5Y2xpYyBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGUgRE9NCisJICogYW5kIHRoZSBKYXZhU2NyaXB0IG9iamVjdHMuCisJICovCisJZGlzcG9zZTogZnVuY3Rpb24oKQorCXsKKwkJLy8gQ2xlYW5zIGFsbCBvYmplY3RzIHdoZXJlIGxpc3RlbmVycyBoYXZlIGJlZW4gYWRkZWQKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBteEV2ZW50Lm9iamVjdHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCWlmIChteEV2ZW50Lm9iamVjdHNbaV0ubXhMaXN0ZW5lckxpc3QgIT0gbnVsbCkKKwkJCXsKKwkJCQlteEV2ZW50LnJlbW92ZUFsbExpc3RlbmVycyhteEV2ZW50Lm9iamVjdHNbaV0pOworCQkJfQorCQl9CisJfQorCit9OworCisvKioKKyAqIFZhcmlhYmxlOiBteExvYWRSZXNvdXJjZXMKKyAqIAorICogT3B0aW9uYWwgZ2xvYmFsIGNvbmZpZyB2YXJpYWJsZSB0byB0b2dnbGUgbG9hZGluZyBvZiB0aGUgdHdvIHJlc291cmNlIGZpbGVzCisgKiBpbiA8bXhHcmFwaD4gYW5kIDxteEVkaXRvcj4uIERlZmF1bHQgaXMgdHJ1ZS4gTk9URTogVGhpcyBpcyBhIGdsb2JhbCB2YXJpYWJsZSwKKyAqIG5vdCBhIHZhcmlhYmxlIG9mIG14Q2xpZW50LgorICoKKyAqIChjb2RlKQorICogPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICogCQl2YXIgbXhMb2FkUmVzb3VyY2VzID0gZmFsc2U7CisgKiA8L3NjcmlwdD4KKyAqIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9wYXRoL3RvL2NvcmUvZGlyZWN0b3J5L2pzL214Q2xpZW50LmpzIj48L3NjcmlwdD4KKyAqIChlbmQpCisgKi8KK2lmICh0eXBlb2YobXhMb2FkUmVzb3VyY2VzKSA9PSAndW5kZWZpbmVkJykKK3sKKwlteExvYWRSZXNvdXJjZXMgPSB0cnVlOworfQorCisvKioKKyAqIFZhcmlhYmxlOiBteEZvcmNlSW5jbHVkZXMKKyAqIAorICogT3B0aW9uYWwgZ2xvYmFsIGNvbmZpZyB2YXJpYWJsZSB0byBmb3JjZSBsb2FkaW5nIHRoZSBKYXZhU2NyaXB0IGZpbGVzIGluCisgKiBkZXZlbG9wbWVudCBtb2RlLiBEZWZhdWx0IGlzIHVuZGVmaW5lZC4gTk9URTogVGhpcyBpcyBhIGdsb2JhbCB2YXJpYWJsZSwKKyAqIG5vdCBhIHZhcmlhYmxlIG9mIG14Q2xpZW50LgorICoKKyAqIChjb2RlKQorICogPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICogCQl2YXIgbXhMb2FkUmVzb3VyY2VzID0gdHJ1ZTsKKyAqIDwvc2NyaXB0PgorICogPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iL3BhdGgvdG8vY29yZS9kaXJlY3RvcnkvanMvbXhDbGllbnQuanMiPjwvc2NyaXB0PgorICogKGVuZCkKKyAqLworaWYgKHR5cGVvZihteEZvcmNlSW5jbHVkZXMpID09ICd1bmRlZmluZWQnKQoreworCW14Rm9yY2VJbmNsdWRlcyA9IGZhbHNlOworfQorCisvKioKKyAqIFZhcmlhYmxlOiBteFJlc291cmNlRXh0ZW5zaW9uCisgKiAKKyAqIE9wdGlvbmFsIGdsb2JhbCBjb25maWcgdmFyaWFibGUgdG8gc3BlY2lmeSB0aGUgZXh0ZW5zaW9uIG9mIHJlc291cmNlIGZpbGVzLgorICogRGVmYXVsdCBpcyB0cnVlLiBOT1RFOiBUaGlzIGlzIGEgZ2xvYmFsIHZhcmlhYmxlLCBub3QgYSB2YXJpYWJsZSBvZiBteENsaWVudC4KKyAqCisgKiAoY29kZSkKKyAqIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAqIAkJdmFyIG14UmVzb3VyY2VFeHRlbnNpb24gPSAnLnR4dCc7CisgKiA8L3NjcmlwdD4KKyAqIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9wYXRoL3RvL2NvcmUvZGlyZWN0b3J5L2pzL214Q2xpZW50LmpzIj48L3NjcmlwdD4KKyAqIChlbmQpCisgKi8KK2lmICh0eXBlb2YobXhSZXNvdXJjZUV4dGVuc2lvbikgPT0gJ3VuZGVmaW5lZCcpCit7CisJbXhSZXNvdXJjZUV4dGVuc2lvbiA9ICcudHh0JzsKK30KKworLyoqCisgKiBWYXJpYWJsZTogbXhMb2FkU3R5bGVzaGVldHMKKyAqIAorICogT3B0aW9uYWwgZ2xvYmFsIGNvbmZpZyB2YXJpYWJsZSB0byB0b2dnbGUgbG9hZGluZyBvZiB0aGUgQ1NTIGZpbGVzIHdoZW4KKyAqIHRoZSBsaWJyYXJ5IGlzIGluaXRpYWxpemVkLiBEZWZhdWx0IGlzIHRydWUuIE5PVEU6IFRoaXMgaXMgYSBnbG9iYWwgdmFyaWFibGUsCisgKiBub3QgYSB2YXJpYWJsZSBvZiBteENsaWVudC4KKyAqCisgKiAoY29kZSkKKyAqIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAqIAkJdmFyIG14TG9hZFN0eWxlc2hlZXRzID0gZmFsc2U7CisgKiA8L3NjcmlwdD4KKyAqIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9wYXRoL3RvL2NvcmUvZGlyZWN0b3J5L2pzL214Q2xpZW50LmpzIj48L3NjcmlwdD4KKyAqIChlbmQpCisgKi8KK2lmICh0eXBlb2YobXhMb2FkU3R5bGVzaGVldHMpID09ICd1bmRlZmluZWQnKQoreworCW14TG9hZFN0eWxlc2hlZXRzID0gdHJ1ZTsKK30KKworLyoqCisgKiBWYXJpYWJsZTogYmFzZVBhdGgKKyAqCisgKiBCYXNlcGF0aCBmb3IgYWxsIFVSTHMgaW4gdGhlIGNvcmUgd2l0aG91dCB0cmFpbGluZyBzbGFzaC4gRGVmYXVsdCBpcyAnLicuCisgKiBTZXQgbXhCYXNlUGF0aCBwcmlvciB0byBsb2FkaW5nIHRoZSBteENsaWVudCBsaWJyYXJ5IGFzIGZvbGxvd3MgdG8gb3ZlcnJpZGUKKyAqIHRoaXMgc2V0dGluZzoKKyAqCisgKiAoY29kZSkKKyAqIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAqIAkJbXhCYXNlUGF0aCA9ICcvcGF0aC90by9jb3JlL2RpcmVjdG9yeSc7CisgKiA8L3NjcmlwdD4KKyAqIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9wYXRoL3RvL2NvcmUvZGlyZWN0b3J5L2pzL214Q2xpZW50LmpzIj48L3NjcmlwdD4KKyAqIChlbmQpCisgKiAKKyAqIFdoZW4gdXNpbmcgYSByZWxhdGl2ZSBwYXRoLCB0aGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgVVJMIG9mIHRoZSBwYWdlIHRoYXQKKyAqIGNvbnRhaW5zIHRoZSBhc3NpZ25tZW50LiBUcmFpbGluZyBzbGFzaGVzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuCisgKi8KK2lmICh0eXBlb2YobXhCYXNlUGF0aCkgIT0gJ3VuZGVmaW5lZCcgJiYgbXhCYXNlUGF0aC5sZW5ndGggPiAwKQoreworCS8vIEFkZHMgYSB0cmFpbGluZyBzbGFzaCBpZiByZXF1aXJlZAorCWlmIChteEJhc2VQYXRoLnN1YnN0cmluZyhteEJhc2VQYXRoLmxlbmd0aCAtIDEpID09ICcvJykKKwl7CisJCW14QmFzZVBhdGggPSBteEJhc2VQYXRoLnN1YnN0cmluZygwLCBteEJhc2VQYXRoLmxlbmd0aCAtIDEpOworCX0KKworCW14Q2xpZW50LmJhc2VQYXRoID0gbXhCYXNlUGF0aDsKK30KK2Vsc2UKK3sKKwlteENsaWVudC5iYXNlUGF0aCA9ICcuJzsKK30KKworLyoqCisgKiBWYXJpYWJsZTogaW1hZ2VCYXNlUGF0aAorICoKKyAqIEJhc2VwYXRoIGZvciBhbGwgaW1hZ2VzIFVSTHMgaW4gdGhlIGNvcmUgd2l0aG91dCB0cmFpbGluZyBzbGFzaC4gRGVmYXVsdCBpcworICogPG14Q2xpZW50LmJhc2VQYXRoPiArICcvaW1hZ2VzJy4gU2V0IG14SW1hZ2VCYXNlUGF0aCBwcmlvciB0byBsb2FkaW5nIHRoZQorICogbXhDbGllbnQgbGlicmFyeSBhcyBmb2xsb3dzIHRvIG92ZXJyaWRlIHRoaXMgc2V0dGluZzoKKyAqCisgKiAoY29kZSkKKyAqIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAqIAkJbXhJbWFnZUJhc2VQYXRoID0gJy9wYXRoL3RvL2ltYWdlL2RpcmVjdG9yeSc7CisgKiA8L3NjcmlwdD4KKyAqIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii9wYXRoL3RvL2NvcmUvZGlyZWN0b3J5L2pzL214Q2xpZW50LmpzIj48L3NjcmlwdD4KKyAqIChlbmQpCisgKiAKKyAqIFdoZW4gdXNpbmcgYSByZWxhdGl2ZSBwYXRoLCB0aGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgVVJMIG9mIHRoZSBwYWdlIHRoYXQKKyAqIGNvbnRhaW5zIHRoZSBhc3NpZ25tZW50LiBUcmFpbGluZyBzbGFzaGVzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuCisgKi8KK2lmICh0eXBlb2YobXhJbWFnZUJhc2VQYXRoKSAhPSAndW5kZWZpbmVkJyAmJiBteEltYWdlQmFzZVBhdGgubGVuZ3RoID4gMCkKK3sKKwkvLyBBZGRzIGEgdHJhaWxpbmcgc2xhc2ggaWYgcmVxdWlyZWQKKwlpZiAobXhJbWFnZUJhc2VQYXRoLnN1YnN0cmluZyhteEltYWdlQmFzZVBhdGgubGVuZ3RoIC0gMSkgPT0gJy8nKQorCXsKKwkJbXhJbWFnZUJhc2VQYXRoID0gbXhJbWFnZUJhc2VQYXRoLnN1YnN0cmluZygwLCBteEltYWdlQmFzZVBhdGgubGVuZ3RoIC0gMSk7CisJfQorCisJbXhDbGllbnQuaW1hZ2VCYXNlUGF0aCA9IG14SW1hZ2VCYXNlUGF0aDsKK30KK2Vsc2UKK3sKKwlteENsaWVudC5pbWFnZUJhc2VQYXRoID0gbXhDbGllbnQuYmFzZVBhdGggKyAnL2ltYWdlcyc7CQorfQorCisvKioKKyAqIFZhcmlhYmxlOiBsYW5ndWFnZQorICoKKyAqIERlZmluZXMgdGhlIGxhbmd1YWdlIG9mIHRoZSBjbGllbnQsIGVnLiBlbiBmb3IgZW5nbGlzaCwgZGUgZm9yIGdlcm1hbiBldGMuCisgKiBUaGUgc3BlY2lhbCB2YWx1ZSAnbm9uZScgd2lsbCBkaXNhYmxlIGFsbCBidWlsdC1pbiBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQKKyAqIHJlc291cmNlIGxvYWRpbmcuIFNlZSA8bXhSZXNvdXJjZXMuZ2V0U3BlY2lhbEJ1bmRsZT4gZm9yIGhhbmRsaW5nIGlkZW50aWZpZXJzCisgKiB3aXRoIGFuZCB3aXRob3V0IGEgZGFzaC4KKyAqIAorICogU2V0IG14TGFuZ3VhZ2UgcHJpb3IgdG8gbG9hZGluZyB0aGUgbXhDbGllbnQgbGlicmFyeSBhcyBmb2xsb3dzIHRvIG92ZXJyaWRlCisgKiB0aGlzIHNldHRpbmc6CisgKgorICogKGNvZGUpCisgKiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgKiAJCW14TGFuZ3VhZ2UgPSAnZW4nOworICogPC9zY3JpcHQ+CisgKiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqcy9teENsaWVudC5qcyI+PC9zY3JpcHQ+CisgKiAoZW5kKQorICogCisgKiBJZiBpbnRlcm5hdGlvbmFsaXphdGlvbiBpcyBkaXNhYmxlZCwgdGhlbiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBzaG91bGQgYmUKKyAqIG92ZXJyaWRkZW4gdG8gcmVmbGVjdCB0aGUgY3VycmVudCBsYW5ndWFnZSBvZiB0aGUgc3lzdGVtLiBUaGVzZSB2YXJpYWJsZXMgYXJlCisgKiBjbGVhcmVkIHdoZW4gaTE4biBpcyBkaXNhYmxlZC4KKyAqIDxteEVkaXRvci5hc2tab29tUmVzb3VyY2U+LCA8bXhFZGl0b3IubGFzdFNhdmVkUmVzb3VyY2U+LAorICogPG14RWRpdG9yLmN1cnJlbnRGaWxlUmVzb3VyY2U+LCA8bXhFZGl0b3IucHJvcGVydGllc1Jlc291cmNlPiwKKyAqIDxteEVkaXRvci50YXNrc1Jlc291cmNlPiwgPG14RWRpdG9yLmhlbHBSZXNvdXJjZT4sIDxteEVkaXRvci5vdXRsaW5lUmVzb3VyY2U+LAorICogPG14RWxib3dFZGdlSGFuZGxlci5kb3VibGVDbGlja09yaWVudGF0aW9uUmVzb3VyY2U+LCA8bXhVdGlscy5lcnJvclJlc291cmNlPiwKKyAqIDxteFV0aWxzLmNsb3NlUmVzb3VyY2U+LCA8bXhHcmFwaFNlbGVjdGlvbk1vZGVsLmRvbmVSZXNvdXJjZT4sCisgKiA8bXhHcmFwaFNlbGVjdGlvbk1vZGVsLnVwZGF0aW5nU2VsZWN0aW9uUmVzb3VyY2U+LCA8bXhHcmFwaFZpZXcuZG9uZVJlc291cmNlPiwKKyAqIDxteEdyYXBoVmlldy51cGRhdGluZ0RvY3VtZW50UmVzb3VyY2U+LCA8bXhDZWxsUmVuZGVyZXIuY29sbGFwc2VFeHBhbmRSZXNvdXJjZT4sCisgKiA8bXhHcmFwaC5jb250YWluc1ZhbGlkYXRpb25FcnJvcnNSZXNvdXJjZT4gYW5kCisgKiA8bXhHcmFwaC5hbHJlYWR5Q29ubmVjdGVkUmVzb3VyY2U+LgorICovCitpZiAodHlwZW9mKG14TGFuZ3VhZ2UpICE9ICd1bmRlZmluZWQnICYmIG14TGFuZ3VhZ2UgIT0gbnVsbCkKK3sKKwlteENsaWVudC5sYW5ndWFnZSA9IG14TGFuZ3VhZ2U7Cit9CitlbHNlCit7CisJbXhDbGllbnQubGFuZ3VhZ2UgPSAobXhDbGllbnQuSVNfSUUpID8gbmF2aWdhdG9yLnVzZXJMYW5ndWFnZSA6IG5hdmlnYXRvci5sYW5ndWFnZTsKK30KKworLyoqCisgKiBWYXJpYWJsZTogZGVmYXVsdExhbmd1YWdlCisgKiAKKyAqIERlZmluZXMgdGhlIGRlZmF1bHQgbGFuZ3VhZ2Ugd2hpY2ggaXMgdXNlZCBpbiB0aGUgY29tbW9uIHJlc291cmNlIGZpbGVzLiBBbnkKKyAqIHJlc291cmNlcyBmb3IgdGhpcyBsYW5ndWFnZSB3aWxsIG9ubHkgbG9hZCB0aGUgY29tbW9uIHJlc291cmNlIGZpbGUsIGJ1dCBub3QKKyAqIHRoZSBsYW5ndWFnZS1zcGVjaWZpYyByZXNvdXJjZSBmaWxlLiBEZWZhdWx0IGlzICdlbicuCisgKiAKKyAqIFNldCBteERlZmF1bHRMYW5ndWFnZSBwcmlvciB0byBsb2FkaW5nIHRoZSBteENsaWVudCBsaWJyYXJ5IGFzIGZvbGxvd3MgdG8gb3ZlcnJpZGUKKyAqIHRoaXMgc2V0dGluZzoKKyAqCisgKiAoY29kZSkKKyAqIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAqIAkJbXhEZWZhdWx0TGFuZ3VhZ2UgPSAnZGUnOworICogPC9zY3JpcHQ+CisgKiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJqcy9teENsaWVudC5qcyI+PC9zY3JpcHQ+CisgKiAoZW5kKQorICovCitpZiAodHlwZW9mKG14RGVmYXVsdExhbmd1YWdlKSAhPSAndW5kZWZpbmVkJyAmJiBteERlZmF1bHRMYW5ndWFnZSAhPSBudWxsKQoreworCW14Q2xpZW50LmRlZmF1bHRMYW5ndWFnZSA9IG14RGVmYXVsdExhbmd1YWdlOworfQorZWxzZQoreworCW14Q2xpZW50LmRlZmF1bHRMYW5ndWFnZSA9ICdlbic7Cit9CisKKy8vIEFkZHMgYWxsIHJlcXVpcmVkIHN0eWxlc2hlZXRzIGFuZCBuYW1lc3BhY2VzCitpZiAobXhMb2FkU3R5bGVzaGVldHMpCit7CisJbXhDbGllbnQubGluaygnc3R5bGVzaGVldCcsIG14Q2xpZW50LmJhc2VQYXRoICsgJy9jc3MvY29tbW9uLmNzcycpOworfQorCisvKioKKyAqIFZhcmlhYmxlOiBsYW5ndWFnZXMKKyAqCisgKiBEZWZpbmVzIHRoZSBvcHRpb25hbCBhcnJheSBvZiBhbGwgc3VwcG9ydGVkIGxhbmd1YWdlIGV4dGVuc2lvbnMuIFRoZSBkZWZhdWx0CisgKiBsYW5ndWFnZSBkb2VzIG5vdCBoYXZlIHRvIGJlIHBhcnQgb2YgdGhpcyBsaXN0LiBTZWUKKyAqIDxteFJlc291cmNlcy5pc0xhbmd1YWdlU3VwcG9ydGVkPi4KKyAqCisgKiAoY29kZSkKKyAqIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAqIAkJbXhMYW5ndWFnZXMgPSBbJ2RlJywgJ2l0JywgJ2ZyJ107CisgKiA8L3NjcmlwdD4KKyAqIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpzL214Q2xpZW50LmpzIj48L3NjcmlwdD4KKyAqIChlbmQpCisgKiAKKyAqIFRoaXMgaXMgdXNlZCB0byBhdm9pZCB1bm5lY2Vzc2FyeSByZXF1ZXN0cyB0byBsYW5ndWFnZSBmaWxlcywgaWUuIGlmIGEgNDA0CisgKiB3aWxsIGJlIHJldHVybmVkLgorICovCitpZiAodHlwZW9mKG14TGFuZ3VhZ2VzKSAhPSAndW5kZWZpbmVkJyAmJiBteExhbmd1YWdlcyAhPSBudWxsKQoreworCW14Q2xpZW50Lmxhbmd1YWdlcyA9IG14TGFuZ3VhZ2VzOworfQorCisvLyBBZGRzIHJlcXVpcmVkIG5hbWVzcGFjZXMsIHN0eWxlc2hlZXRzIGFuZCBtZW1vcnkgaGFuZGxpbmcgZm9yIG9sZGVyIElFIGJyb3dzZXJzCitpZiAobXhDbGllbnQuSVNfVk1MKQoreworCWlmIChteENsaWVudC5JU19TVkcpCisJeworCQlteENsaWVudC5JU19WTUwgPSBmYWxzZTsKKwl9CisJZWxzZQorCXsKKwkJLy8gRW5hYmxlcyBzdXBwb3J0IGZvciBJRTggc3RhbmRhcmRzIG1vZGUuIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIGFsbCBhdHRyaWJ1dGVzIGZvciBWTUwKKwkJLy8gZWxlbWVudHMgdG8gYmUgc2V0IHVzaW5nIGRpcmVjdCBub3RhdGlvbiwgaWUuIG5vZGUuYXR0ciA9IHZhbHVlLiBUaGUgdXNlIG9mIHNldEF0dHJpYnV0ZQorCQkvLyBpcyBub3QgcG9zc2libGUuCisJCWlmIChkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gOCkKKwkJeworCQkJZG9jdW1lbnQubmFtZXNwYWNlcy5hZGQobXhDbGllbnQuVk1MX1BSRUZJWCwgJ3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sJywgJyNkZWZhdWx0I1ZNTCcpOworCQkJZG9jdW1lbnQubmFtZXNwYWNlcy5hZGQobXhDbGllbnQuT0ZGSUNFX1BSRUZJWCwgJ3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZScsICcjZGVmYXVsdCNWTUwnKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRvY3VtZW50Lm5hbWVzcGFjZXMuYWRkKG14Q2xpZW50LlZNTF9QUkVGSVgsICd1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCcpOworCQkJZG9jdW1lbnQubmFtZXNwYWNlcy5hZGQobXhDbGllbnQuT0ZGSUNFX1BSRUZJWCwgJ3VybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZScpOworCQl9CisKKwkJLy8gV29ya2Fyb3VuZCBmb3IgbGltaXRlZCBudW1iZXIgb2Ygc3R5bGVzaGVldHMgaW4gSUUgKGRvZXMgbm90IHdvcmsgaW4gc3RhbmRhcmRzIG1vZGUpCisJCWlmIChteENsaWVudC5JU19RVUlSS1MgJiYgZG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoID49IDMwKQorCQl7CisJCQkoZnVuY3Rpb24oKQorCQkJeworCQkJCXZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKKwkJCQlub2RlLnR5cGUgPSAndGV4dC9jc3MnOworCQkJCW5vZGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gbXhDbGllbnQuVk1MX1BSRUZJWCArICdcXDoqe2JlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpfScgKworCQkgICAgICAgIAlteENsaWVudC5PRkZJQ0VfUFJFRklYICsgJ1xcOip7YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCl9JzsKKwkJICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKG5vZGUpOworCQkJfSkoKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRvY3VtZW50LmNyZWF0ZVN0eWxlU2hlZXQoKS5jc3NUZXh0ID0gbXhDbGllbnQuVk1MX1BSRUZJWCArICdcXDoqe2JlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpfScgKworCQkgICAgCW14Q2xpZW50Lk9GRklDRV9QUkVGSVggKyAnXFw6KntiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKX0nOworCQl9CisJICAgIAorCSAgICBpZiAobXhMb2FkU3R5bGVzaGVldHMpCisJICAgIHsKKwkgICAgCW14Q2xpZW50LmxpbmsoJ3N0eWxlc2hlZXQnLCBteENsaWVudC5iYXNlUGF0aCArICcvY3NzL2V4cGxvcmVyLmNzcycpOworCSAgICB9CisJCisJCS8vIENsZWFucyB1cCByZXNvdXJjZXMgd2hlbiB0aGUgYXBwbGljYXRpb24gdGVybWluYXRlcworCQl3aW5kb3cuYXR0YWNoRXZlbnQoJ29udW5sb2FkJywgbXhDbGllbnQuZGlzcG9zZSk7CisJfQorfQorCisvLyBQUkVQUk9DRVNTT1ItUkVNT1ZFLVNUQVJUCisvLyBJZiBzY3JpcHQgaXMgbG9hZGVkIHZpYSBDb21tb25KUywgZG8gbm90IHdyaXRlIDxzY3JpcHQ+IHRhZ3MgdG8gdGhlIHBhZ2UKKy8vIGZvciBkZXBlbmRlbmNpZXMuIFRoZXNlIGFyZSBhbHJlYWR5IGluY2x1ZGVkIGluIHRoZSBidWlsZC4KK2lmIChteEZvcmNlSW5jbHVkZXMgfHwgISh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyAhPSBudWxsKSkKK3sKKy8vIFBSRVBST0NFU1NPUi1SRU1PVkUtRU5ECisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3V0aWwvbXhMb2cuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdXRpbC9teE9iamVjdElkZW50aXR5LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3V0aWwvbXhEaWN0aW9uYXJ5LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3V0aWwvbXhSZXNvdXJjZXMuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdXRpbC9teFBvaW50LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3V0aWwvbXhSZWN0YW5nbGUuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdXRpbC9teEVmZmVjdHMuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdXRpbC9teFV0aWxzLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3V0aWwvbXhDb25zdGFudHMuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdXRpbC9teEV2ZW50T2JqZWN0LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3V0aWwvbXhNb3VzZUV2ZW50LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3V0aWwvbXhFdmVudFNvdXJjZS5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy91dGlsL214RXZlbnQuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdXRpbC9teFhtbFJlcXVlc3QuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdXRpbC9teENsaXBib2FyZC5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy91dGlsL214V2luZG93LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3V0aWwvbXhGb3JtLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3V0aWwvbXhJbWFnZS5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy91dGlsL214RGl2UmVzaXplci5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy91dGlsL214RHJhZ1NvdXJjZS5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy91dGlsL214VG9vbGJhci5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy91dGlsL214VW5kb2FibGVFZGl0LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3V0aWwvbXhVbmRvTWFuYWdlci5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy91dGlsL214VXJsQ29udmVydGVyLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3V0aWwvbXhQYW5uaW5nTWFuYWdlci5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy91dGlsL214UG9wdXBNZW51LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3V0aWwvbXhBdXRvU2F2ZU1hbmFnZXIuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdXRpbC9teEFuaW1hdGlvbi5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy91dGlsL214TW9ycGhpbmcuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdXRpbC9teEltYWdlQnVuZGxlLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3V0aWwvbXhJbWFnZUV4cG9ydC5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy91dGlsL214QWJzdHJhY3RDYW52YXMyRC5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy91dGlsL214WG1sQ2FudmFzMkQuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdXRpbC9teFN2Z0NhbnZhczJELmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3V0aWwvbXhWbWxDYW52YXMyRC5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy91dGlsL214R3VpZGUuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvc2hhcGUvbXhTdGVuY2lsLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3NoYXBlL214U2hhcGUuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvc2hhcGUvbXhTdGVuY2lsUmVnaXN0cnkuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvc2hhcGUvbXhNYXJrZXIuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvc2hhcGUvbXhBY3Rvci5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9zaGFwZS9teENsb3VkLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3NoYXBlL214UmVjdGFuZ2xlU2hhcGUuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvc2hhcGUvbXhFbGxpcHNlLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3NoYXBlL214RG91YmxlRWxsaXBzZS5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9zaGFwZS9teFJob21idXMuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvc2hhcGUvbXhQb2x5bGluZS5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9zaGFwZS9teEFycm93LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3NoYXBlL214QXJyb3dDb25uZWN0b3IuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvc2hhcGUvbXhUZXh0LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3NoYXBlL214VHJpYW5nbGUuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvc2hhcGUvbXhIZXhhZ29uLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3NoYXBlL214TGluZS5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9zaGFwZS9teEltYWdlU2hhcGUuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvc2hhcGUvbXhMYWJlbC5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9zaGFwZS9teEN5bGluZGVyLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3NoYXBlL214Q29ubmVjdG9yLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3NoYXBlL214U3dpbWxhbmUuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvbGF5b3V0L214R3JhcGhMYXlvdXQuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvbGF5b3V0L214U3RhY2tMYXlvdXQuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvbGF5b3V0L214UGFydGl0aW9uTGF5b3V0LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2xheW91dC9teENvbXBhY3RUcmVlTGF5b3V0LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2xheW91dC9teFJhZGlhbFRyZWVMYXlvdXQuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvbGF5b3V0L214RmFzdE9yZ2FuaWNMYXlvdXQuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvbGF5b3V0L214Q2lyY2xlTGF5b3V0LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2xheW91dC9teFBhcmFsbGVsRWRnZUxheW91dC5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9sYXlvdXQvbXhDb21wb3NpdGVMYXlvdXQuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvbGF5b3V0L214RWRnZUxhYmVsTGF5b3V0LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2xheW91dC9oaWVyYXJjaGljYWwvbW9kZWwvbXhHcmFwaEFic3RyYWN0SGllcmFyY2h5Q2VsbC5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL21vZGVsL214R3JhcGhIaWVyYXJjaHlOb2RlLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2xheW91dC9oaWVyYXJjaGljYWwvbW9kZWwvbXhHcmFwaEhpZXJhcmNoeUVkZ2UuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvbGF5b3V0L2hpZXJhcmNoaWNhbC9tb2RlbC9teEdyYXBoSGllcmFyY2h5TW9kZWwuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvbGF5b3V0L2hpZXJhcmNoaWNhbC9tb2RlbC9teFN3aW1sYW5lTW9kZWwuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvbGF5b3V0L2hpZXJhcmNoaWNhbC9zdGFnZS9teEhpZXJhcmNoaWNhbExheW91dFN0YWdlLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2xheW91dC9oaWVyYXJjaGljYWwvc3RhZ2UvbXhNZWRpYW5IeWJyaWRDcm9zc2luZ1JlZHVjdGlvbi5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL3N0YWdlL214TWluaW11bUN5Y2xlUmVtb3Zlci5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL3N0YWdlL214Q29vcmRpbmF0ZUFzc2lnbm1lbnQuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvbGF5b3V0L2hpZXJhcmNoaWNhbC9zdGFnZS9teFN3aW1sYW5lT3JkZXJpbmcuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvbGF5b3V0L2hpZXJhcmNoaWNhbC9teEhpZXJhcmNoaWNhbExheW91dC5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9sYXlvdXQvaGllcmFyY2hpY2FsL214U3dpbWxhbmVMYXlvdXQuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvbW9kZWwvbXhHcmFwaE1vZGVsLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL21vZGVsL214Q2VsbC5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9tb2RlbC9teEdlb21ldHJ5LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL21vZGVsL214Q2VsbFBhdGguanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdmlldy9teFBlcmltZXRlci5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy92aWV3L214UHJpbnRQcmV2aWV3LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3ZpZXcvbXhTdHlsZXNoZWV0LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3ZpZXcvbXhDZWxsU3RhdGUuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdmlldy9teEdyYXBoU2VsZWN0aW9uTW9kZWwuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdmlldy9teENlbGxFZGl0b3IuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdmlldy9teENlbGxSZW5kZXJlci5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy92aWV3L214RWRnZVN0eWxlLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3ZpZXcvbXhTdHlsZVJlZ2lzdHJ5LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3ZpZXcvbXhHcmFwaFZpZXcuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdmlldy9teEdyYXBoLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3ZpZXcvbXhDZWxsT3ZlcmxheS5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy92aWV3L214T3V0bGluZS5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy92aWV3L214TXVsdGlwbGljaXR5LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3ZpZXcvbXhMYXlvdXRNYW5hZ2VyLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL3ZpZXcvbXhTd2ltbGFuZU1hbmFnZXIuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdmlldy9teFRlbXBvcmFyeUNlbGxTdGF0ZXMuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdmlldy9teENlbGxTdGF0ZVByZXZpZXcuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvdmlldy9teENvbm5lY3Rpb25Db25zdHJhaW50LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2hhbmRsZXIvbXhHcmFwaEhhbmRsZXIuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvaGFuZGxlci9teFBhbm5pbmdIYW5kbGVyLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2hhbmRsZXIvbXhQb3B1cE1lbnVIYW5kbGVyLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2hhbmRsZXIvbXhDZWxsTWFya2VyLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2hhbmRsZXIvbXhTZWxlY3Rpb25DZWxsc0hhbmRsZXIuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvaGFuZGxlci9teENvbm5lY3Rpb25IYW5kbGVyLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2hhbmRsZXIvbXhDb25zdHJhaW50SGFuZGxlci5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9oYW5kbGVyL214UnViYmVyYmFuZC5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9oYW5kbGVyL214SGFuZGxlLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2hhbmRsZXIvbXhWZXJ0ZXhIYW5kbGVyLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2hhbmRsZXIvbXhFZGdlSGFuZGxlci5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9oYW5kbGVyL214RWxib3dFZGdlSGFuZGxlci5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9oYW5kbGVyL214RWRnZVNlZ21lbnRIYW5kbGVyLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2hhbmRsZXIvbXhLZXlIYW5kbGVyLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2hhbmRsZXIvbXhUb29sdGlwSGFuZGxlci5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9oYW5kbGVyL214Q2VsbFRyYWNrZXIuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvaGFuZGxlci9teENlbGxIaWdobGlnaHQuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvZWRpdG9yL214RGVmYXVsdEtleUhhbmRsZXIuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvZWRpdG9yL214RGVmYXVsdFBvcHVwTWVudS5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9lZGl0b3IvbXhEZWZhdWx0VG9vbGJhci5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9lZGl0b3IvbXhFZGl0b3IuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvaW8vbXhDb2RlY1JlZ2lzdHJ5LmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2lvL214Q29kZWMuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvaW8vbXhPYmplY3RDb2RlYy5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9pby9teENlbGxDb2RlYy5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9pby9teE1vZGVsQ29kZWMuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvaW8vbXhSb290Q2hhbmdlQ29kZWMuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvaW8vbXhDaGlsZENoYW5nZUNvZGVjLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2lvL214VGVybWluYWxDaGFuZ2VDb2RlYy5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9pby9teEdlbmVyaWNDaGFuZ2VDb2RlYy5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9pby9teEdyYXBoQ29kZWMuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvaW8vbXhHcmFwaFZpZXdDb2RlYy5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9pby9teFN0eWxlc2hlZXRDb2RlYy5qcycpOworCW14Q2xpZW50LmluY2x1ZGUobXhDbGllbnQuYmFzZVBhdGgrJy9qcy9pby9teERlZmF1bHRLZXlIYW5kbGVyQ29kZWMuanMnKTsKKwlteENsaWVudC5pbmNsdWRlKG14Q2xpZW50LmJhc2VQYXRoKycvanMvaW8vbXhEZWZhdWx0VG9vbGJhckNvZGVjLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2lvL214RGVmYXVsdFBvcHVwTWVudUNvZGVjLmpzJyk7CisJbXhDbGllbnQuaW5jbHVkZShteENsaWVudC5iYXNlUGF0aCsnL2pzL2lvL214RWRpdG9yQ29kZWMuanMnKTsKKy8vIFBSRVBST0NFU1NPUi1SRU1PVkUtU1RBUlQKK30KKy8vIFBSRVBST0NFU1NPUi1SRU1PVkUtRU5ECmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhBY3Rvci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teEFjdG9yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YTgwODAKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhBY3Rvci5qcwpAQCAtMCwwICsxLDg2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteEFjdG9yCisgKgorICogRXh0ZW5kcyA8bXhTaGFwZT4gdG8gaW1wbGVtZW50IGFuIGFjdG9yIHNoYXBlLiBJZiBhIGN1c3RvbSBzaGFwZSB3aXRoIG9uZQorICogZmlsbGVkIGFyZWEgaXMgbmVlZGVkLCB0aGVuIHRoaXMgc2hhcGUncyA8cmVkcmF3UGF0aD4gc2hvdWxkIGJlIG92ZXJyaWRkZW4uCisgKiAKKyAqIEV4YW1wbGU6CisgKiAKKyAqIChjb2RlKQorICogZnVuY3Rpb24gU2FtcGxlU2hhcGUoKSB7IH0KKyAqIAorICogU2FtcGxlU2hhcGUucHJvdG90eXBlID0gbmV3IG14QWN0b3IoKTsKKyAqIFNhbXBsZVNoYXBlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHZzQXNlU2hhcGU7CisgKiAKKyAqIG14Q2VsbFJlbmRlcmVyLnByb3RvdHlwZS5kZWZhdWx0U2hhcGVzWydzYW1wbGUnXSA9IFNhbXBsZVNoYXBlOworICogU2FtcGxlU2hhcGUucHJvdG90eXBlLnJlZHJhd1BhdGggPSBmdW5jdGlvbihwYXRoLCB4LCB5LCB3LCBoKQorICogeworICogICBwYXRoLm1vdmVUbygwLCAwKTsKKyAqICAgcGF0aC5saW5lVG8odywgaCk7CisgKiAgIC8vIC4uLgorICogICBwYXRoLmNsb3NlKCk7CisgKiB9CisgKiAoZW5kKQorICogCisgKiBUaGlzIHNoYXBlIGlzIHJlZ2lzdGVyZWQgdW5kZXIgPG14Q29uc3RhbnRzLlNIQVBFX0FDVE9SPiBpbgorICogPG14Q2VsbFJlbmRlcmVyPi4KKyAqIAorICogQ29uc3RydWN0b3I6IG14QWN0b3IKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGFjdG9yIHNoYXBlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBib3VuZHMgLSA8bXhSZWN0YW5nbGU+IHRoYXQgZGVmaW5lcyB0aGUgYm91bmRzLiBUaGlzIGlzIHN0b3JlZCBpbgorICogPG14U2hhcGUuYm91bmRzPi4KKyAqIGZpbGwgLSBTdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBmaWxsIGNvbG9yLiBUaGlzIGlzIHN0b3JlZCBpbiA8ZmlsbD4uCisgKiBzdHJva2UgLSBTdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBzdHJva2UgY29sb3IuIFRoaXMgaXMgc3RvcmVkIGluIDxzdHJva2U+LgorICogc3Ryb2tld2lkdGggLSBPcHRpb25hbCBpbnRlZ2VyIHRoYXQgZGVmaW5lcyB0aGUgc3Ryb2tlIHdpZHRoLiBEZWZhdWx0IGlzCisgKiAxLiBUaGlzIGlzIHN0b3JlZCBpbiA8c3Ryb2tld2lkdGg+LgorICovCitmdW5jdGlvbiBteEFjdG9yKGJvdW5kcywgZmlsbCwgc3Ryb2tlLCBzdHJva2V3aWR0aCkKK3sKKwlteFNoYXBlLmNhbGwodGhpcyk7CisJdGhpcy5ib3VuZHMgPSBib3VuZHM7CisJdGhpcy5maWxsID0gZmlsbDsKKwl0aGlzLnN0cm9rZSA9IHN0cm9rZTsKKwl0aGlzLnN0cm9rZXdpZHRoID0gKHN0cm9rZXdpZHRoICE9IG51bGwpID8gc3Ryb2tld2lkdGggOiAxOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14U2hhcGUuCisgKi8KK214VXRpbHMuZXh0ZW5kKG14QWN0b3IsIG14U2hhcGUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBwYWludFZlcnRleFNoYXBlCisgKiAKKyAqIFJlZGlyZWN0cyB0byByZWRyYXdQYXRoIGZvciBzdWJjbGFzc2VzIHRvIHdvcmsuCisgKi8KK214QWN0b3IucHJvdG90eXBlLnBhaW50VmVydGV4U2hhcGUgPSBmdW5jdGlvbihjLCB4LCB5LCB3LCBoKQoreworCWMudHJhbnNsYXRlKHgsIHkpOworCWMuYmVnaW4oKTsKKwl0aGlzLnJlZHJhd1BhdGgoYywgeCwgeSwgdywgaCk7CisJYy5maWxsQW5kU3Ryb2tlKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWRyYXdQYXRoCisgKgorICogRHJhd3MgdGhlIHBhdGggZm9yIHRoaXMgc2hhcGUuCisgKi8KK214QWN0b3IucHJvdG90eXBlLnJlZHJhd1BhdGggPSBmdW5jdGlvbihjLCB4LCB5LCB3LCBoKQoreworCXZhciB3aWR0aCA9IHcvMzsKKwljLm1vdmVUbygwLCBoKTsKKwljLmN1cnZlVG8oMCwgMyAqIGggLyA1LCAwLCAyICogaCAvIDUsIHcgLyAyLCAyICogaCAvIDUpOworCWMuY3VydmVUbyh3IC8gMiAtIHdpZHRoLCAyICogaCAvIDUsIHcgLyAyIC0gd2lkdGgsIDAsIHcgLyAyLCAwKTsKKwljLmN1cnZlVG8odyAvIDIgKyB3aWR0aCwgMCwgdyAvIDIgKyB3aWR0aCwgMiAqIGggLyA1LCB3IC8gMiwgMiAqIGggLyA1KTsKKwljLmN1cnZlVG8odywgMiAqIGggLyA1LCB3LCAzICogaCAvIDUsIHcsIGgpOworCWMuY2xvc2UoKTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhBcnJvdy5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teEFycm93LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YzQ0MDIKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhBcnJvdy5qcwpAQCAtMCwwICsxLDExNSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhBcnJvdworICoKKyAqIEV4dGVuZHMgPG14U2hhcGU+IHRvIGltcGxlbWVudCBhbiBhcnJvdyBzaGFwZS4gKFRoZSBzaGFwZQorICogaXMgdXNlZCB0byByZXByZXNlbnQgZWRnZXMsIG5vdCB2ZXJ0aWNlcy4pCisgKiBUaGlzIHNoYXBlIGlzIHJlZ2lzdGVyZWQgdW5kZXIgPG14Q29uc3RhbnRzLlNIQVBFX0FSUk9XPgorICogaW4gPG14Q2VsbFJlbmRlcmVyPi4KKyAqIAorICogQ29uc3RydWN0b3I6IG14QXJyb3cKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGFycm93IHNoYXBlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwb2ludHMgLSBBcnJheSBvZiA8bXhQb2ludHM+IHRoYXQgZGVmaW5lIHRoZSBwb2ludHMuIFRoaXMgaXMgc3RvcmVkIGluCisgKiA8bXhTaGFwZS5wb2ludHM+LgorICogZmlsbCAtIFN0cmluZyB0aGF0IGRlZmluZXMgdGhlIGZpbGwgY29sb3IuIFRoaXMgaXMgc3RvcmVkIGluIDxmaWxsPi4KKyAqIHN0cm9rZSAtIFN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHN0cm9rZSBjb2xvci4gVGhpcyBpcyBzdG9yZWQgaW4gPHN0cm9rZT4uCisgKiBzdHJva2V3aWR0aCAtIE9wdGlvbmFsIGludGVnZXIgdGhhdCBkZWZpbmVzIHRoZSBzdHJva2Ugd2lkdGguIERlZmF1bHQgaXMKKyAqIDEuIFRoaXMgaXMgc3RvcmVkIGluIDxzdHJva2V3aWR0aD4uCisgKiBhcnJvd1dpZHRoIC0gT3B0aW9uYWwgaW50ZWdlciB0aGF0IGRlZmluZXMgdGhlIGFycm93IHdpZHRoLiBEZWZhdWx0IGlzCisgKiA8bXhDb25zdGFudHMuQVJST1dfV0lEVEg+LiBUaGlzIGlzIHN0b3JlZCBpbiA8YXJyb3dXaWR0aD4uCisgKiBzcGFjaW5nIC0gT3B0aW9uYWwgaW50ZWdlciB0aGF0IGRlZmluZXMgdGhlIHNwYWNpbmcgYmV0d2VlbiB0aGUgYXJyb3cgc2hhcGUKKyAqIGFuZCBpdHMgZW5kcG9pbnRzLiBEZWZhdWx0IGlzIDxteENvbnN0YW50cy5BUlJPV19TUEFDSU5HPi4gVGhpcyBpcyBzdG9yZWQgaW4KKyAqIDxzcGFjaW5nPi4KKyAqIGVuZFNpemUgLSBPcHRpb25hbCBpbnRlZ2VyIHRoYXQgZGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgYXJyb3doZWFkLiBEZWZhdWx0CisgKiBpcyA8bXhDb25zdGFudHMuQVJST1dfU0laRT4uIFRoaXMgaXMgc3RvcmVkIGluIDxlbmRTaXplPi4KKyAqLworZnVuY3Rpb24gbXhBcnJvdyhwb2ludHMsIGZpbGwsIHN0cm9rZSwgc3Ryb2tld2lkdGgsIGFycm93V2lkdGgsIHNwYWNpbmcsIGVuZFNpemUpCit7CisJbXhTaGFwZS5jYWxsKHRoaXMpOworCXRoaXMucG9pbnRzID0gcG9pbnRzOworCXRoaXMuZmlsbCA9IGZpbGw7CisJdGhpcy5zdHJva2UgPSBzdHJva2U7CisJdGhpcy5zdHJva2V3aWR0aCA9IChzdHJva2V3aWR0aCAhPSBudWxsKSA/IHN0cm9rZXdpZHRoIDogMTsKKwl0aGlzLmFycm93V2lkdGggPSAoYXJyb3dXaWR0aCAhPSBudWxsKSA/IGFycm93V2lkdGggOiBteENvbnN0YW50cy5BUlJPV19XSURUSDsKKwl0aGlzLnNwYWNpbmcgPSAoc3BhY2luZyAhPSBudWxsKSA/IHNwYWNpbmcgOiBteENvbnN0YW50cy5BUlJPV19TUEFDSU5HOworCXRoaXMuZW5kU2l6ZSA9IChlbmRTaXplICE9IG51bGwpID8gZW5kU2l6ZSA6IG14Q29uc3RhbnRzLkFSUk9XX1NJWkU7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhTaGFwZS4KKyAqLworbXhVdGlscy5leHRlbmQobXhBcnJvdywgbXhTaGFwZSk7CisKKy8qKgorICogRnVuY3Rpb246IGF1Z21lbnRCb3VuZGluZ0JveAorICoKKyAqIEF1Z21lbnRzIHRoZSBib3VuZGluZyBib3ggd2l0aCB0aGUgZWRnZSB3aWR0aCBhbmQgbWFya2Vycy4KKyAqLworbXhBcnJvdy5wcm90b3R5cGUuYXVnbWVudEJvdW5kaW5nQm94ID0gZnVuY3Rpb24oYmJveCkKK3sKKwlteFNoYXBlLnByb3RvdHlwZS5hdWdtZW50Qm91bmRpbmdCb3guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkKKwl2YXIgdyA9IE1hdGgubWF4KHRoaXMuYXJyb3dXaWR0aCwgdGhpcy5lbmRTaXplKTsKKwliYm94Lmdyb3coKHcgLyAyICsgdGhpcy5zdHJva2V3aWR0aCkgKiB0aGlzLnNjYWxlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHBhaW50RWRnZVNoYXBlCisgKiAKKyAqIFBhaW50cyB0aGUgbGluZSBzaGFwZS4KKyAqLworbXhBcnJvdy5wcm90b3R5cGUucGFpbnRFZGdlU2hhcGUgPSBmdW5jdGlvbihjLCBwdHMpCit7CisJLy8gR2VvbWV0cnkgb2YgYXJyb3cKKwl2YXIgc3BhY2luZyA9ICBteENvbnN0YW50cy5BUlJPV19TUEFDSU5HOworCXZhciB3aWR0aCA9IG14Q29uc3RhbnRzLkFSUk9XX1dJRFRIOworCXZhciBhcnJvdyA9IG14Q29uc3RhbnRzLkFSUk9XX1NJWkU7CisKKwkvLyBCYXNlIHZlY3RvciAoYmV0d2VlbiBlbmQgcG9pbnRzKQorCXZhciBwMCA9IHB0c1swXTsKKwl2YXIgcGUgPSBwdHNbcHRzLmxlbmd0aCAtIDFdOworCXZhciBkeCA9IHBlLnggLSBwMC54OworCXZhciBkeSA9IHBlLnkgLSBwMC55OworCXZhciBkaXN0ID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTsKKwl2YXIgbGVuZ3RoID0gZGlzdCAtIDIgKiBzcGFjaW5nIC0gYXJyb3c7CisJCisJLy8gQ29tcHV0ZXMgdGhlIG5vcm0gYW5kIHRoZSBpbnZlcnNlIG5vcm0KKwl2YXIgbnggPSBkeCAvIGRpc3Q7CisJdmFyIG55ID0gZHkgLyBkaXN0OworCXZhciBiYXNleCA9IGxlbmd0aCAqIG54OworCXZhciBiYXNleSA9IGxlbmd0aCAqIG55OworCXZhciBmbG9vcnggPSB3aWR0aCAqIG55LzM7CisJdmFyIGZsb29yeSA9IC13aWR0aCAqIG54LzM7CisJCisJLy8gQ29tcHV0ZXMgcG9pbnRzCisJdmFyIHAweCA9IHAwLnggLSBmbG9vcnggLyAyICsgc3BhY2luZyAqIG54OworCXZhciBwMHkgPSBwMC55IC0gZmxvb3J5IC8gMiArIHNwYWNpbmcgKiBueTsKKwl2YXIgcDF4ID0gcDB4ICsgZmxvb3J4OworCXZhciBwMXkgPSBwMHkgKyBmbG9vcnk7CisJdmFyIHAyeCA9IHAxeCArIGJhc2V4OworCXZhciBwMnkgPSBwMXkgKyBiYXNleTsKKwl2YXIgcDN4ID0gcDJ4ICsgZmxvb3J4OworCXZhciBwM3kgPSBwMnkgKyBmbG9vcnk7CisJLy8gcDQgbm90IG5lY2Vzc2FyeQorCXZhciBwNXggPSBwM3ggLSAzICogZmxvb3J4OworCXZhciBwNXkgPSBwM3kgLSAzICogZmxvb3J5OworCQorCWMuYmVnaW4oKTsKKwljLm1vdmVUbyhwMHgsIHAweSk7CisJYy5saW5lVG8ocDF4LCBwMXkpOworCWMubGluZVRvKHAyeCwgcDJ5KTsKKwljLmxpbmVUbyhwM3gsIHAzeSk7CisJYy5saW5lVG8ocGUueCAtIHNwYWNpbmcgKiBueCwgcGUueSAtIHNwYWNpbmcgKiBueSk7CisJYy5saW5lVG8ocDV4LCBwNXkpOworCWMubGluZVRvKHA1eCArIGZsb29yeCwgcDV5ICsgZmxvb3J5KTsKKwljLmNsb3NlKCk7CisKKwljLmZpbGxBbmRTdHJva2UoKTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhBcnJvd0Nvbm5lY3Rvci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teEFycm93Q29ubmVjdG9yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYmFlODkKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhBcnJvd0Nvbm5lY3Rvci5qcwpAQCAtMCwwICsxLDQ4NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhBcnJvd0Nvbm5lY3RvcgorICoKKyAqIEV4dGVuZHMgPG14U2hhcGU+IHRvIGltcGxlbWVudCBhbiBuZXcgcm91bmRlZCBhcnJvdyBzaGFwZSB3aXRoIHN1cHBvcnQgZm9yCisgKiB3YXlwb2ludHMgYW5kIGRvdWJsZSBhcnJvd3MuIChUaGUgc2hhcGUgaXMgdXNlZCB0byByZXByZXNlbnQgZWRnZXMsIG5vdAorICogdmVydGljZXMuKSBUaGlzIHNoYXBlIGlzIHJlZ2lzdGVyZWQgdW5kZXIgPG14Q29uc3RhbnRzLlNIQVBFX0FSUk9XX0NPTk5FQ1RPUj4KKyAqIGluIDxteENlbGxSZW5kZXJlcj4uCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteEFycm93Q29ubmVjdG9yCisgKgorICogQ29uc3RydWN0cyBhIG5ldyBhcnJvdyBzaGFwZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogcG9pbnRzIC0gQXJyYXkgb2YgPG14UG9pbnRzPiB0aGF0IGRlZmluZSB0aGUgcG9pbnRzLiBUaGlzIGlzIHN0b3JlZCBpbgorICogPG14U2hhcGUucG9pbnRzPi4KKyAqIGZpbGwgLSBTdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBmaWxsIGNvbG9yLiBUaGlzIGlzIHN0b3JlZCBpbiA8ZmlsbD4uCisgKiBzdHJva2UgLSBTdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBzdHJva2UgY29sb3IuIFRoaXMgaXMgc3RvcmVkIGluIDxzdHJva2U+LgorICogc3Ryb2tld2lkdGggLSBPcHRpb25hbCBpbnRlZ2VyIHRoYXQgZGVmaW5lcyB0aGUgc3Ryb2tlIHdpZHRoLiBEZWZhdWx0IGlzCisgKiAxLiBUaGlzIGlzIHN0b3JlZCBpbiA8c3Ryb2tld2lkdGg+LgorICogYXJyb3dXaWR0aCAtIE9wdGlvbmFsIGludGVnZXIgdGhhdCBkZWZpbmVzIHRoZSBhcnJvdyB3aWR0aC4gRGVmYXVsdCBpcworICogPG14Q29uc3RhbnRzLkFSUk9XX1dJRFRIPi4gVGhpcyBpcyBzdG9yZWQgaW4gPGFycm93V2lkdGg+LgorICogc3BhY2luZyAtIE9wdGlvbmFsIGludGVnZXIgdGhhdCBkZWZpbmVzIHRoZSBzcGFjaW5nIGJldHdlZW4gdGhlIGFycm93IHNoYXBlCisgKiBhbmQgaXRzIGVuZHBvaW50cy4gRGVmYXVsdCBpcyA8bXhDb25zdGFudHMuQVJST1dfU1BBQ0lORz4uIFRoaXMgaXMgc3RvcmVkIGluCisgKiA8c3BhY2luZz4uCisgKiBlbmRTaXplIC0gT3B0aW9uYWwgaW50ZWdlciB0aGF0IGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIGFycm93aGVhZC4gRGVmYXVsdAorICogaXMgPG14Q29uc3RhbnRzLkFSUk9XX1NJWkU+LiBUaGlzIGlzIHN0b3JlZCBpbiA8ZW5kU2l6ZT4uCisgKi8KK2Z1bmN0aW9uIG14QXJyb3dDb25uZWN0b3IocG9pbnRzLCBmaWxsLCBzdHJva2UsIHN0cm9rZXdpZHRoLCBhcnJvd1dpZHRoLCBzcGFjaW5nLCBlbmRTaXplKQoreworCW14U2hhcGUuY2FsbCh0aGlzKTsKKwl0aGlzLnBvaW50cyA9IHBvaW50czsKKwl0aGlzLmZpbGwgPSBmaWxsOworCXRoaXMuc3Ryb2tlID0gc3Ryb2tlOworCXRoaXMuc3Ryb2tld2lkdGggPSAoc3Ryb2tld2lkdGggIT0gbnVsbCkgPyBzdHJva2V3aWR0aCA6IDE7CisJdGhpcy5hcnJvd1dpZHRoID0gKGFycm93V2lkdGggIT0gbnVsbCkgPyBhcnJvd1dpZHRoIDogbXhDb25zdGFudHMuQVJST1dfV0lEVEg7CisJdGhpcy5hcnJvd1NwYWNpbmcgPSAoc3BhY2luZyAhPSBudWxsKSA/IHNwYWNpbmcgOiBteENvbnN0YW50cy5BUlJPV19TUEFDSU5HOworCXRoaXMuc3RhcnRTaXplID0gbXhDb25zdGFudHMuQVJST1dfU0laRSAvIDU7CisJdGhpcy5lbmRTaXplID0gbXhDb25zdGFudHMuQVJST1dfU0laRSAvIDU7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhTaGFwZS4KKyAqLworbXhVdGlscy5leHRlbmQobXhBcnJvd0Nvbm5lY3RvciwgbXhTaGFwZSk7CisKKy8qKgorICogVmFyaWFibGU6IHVzZVN2Z0JvdW5kaW5nQm94CisgKiAKKyAqIEFsbG93cyB0byB1c2UgdGhlIFNWRyBib3VuZGluZyBib3ggaW4gU1ZHLiBEZWZhdWx0IGlzIGZhbHNlIGZvciBwZXJmb3JtYW5jZQorICogcmVhc29ucy4KKyAqLworbXhBcnJvd0Nvbm5lY3Rvci5wcm90b3R5cGUudXNlU3ZnQm91bmRpbmdCb3ggPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiByZXNldFN0eWxlcworICogCisgKiBPdmVycmlkZXMgbXhTaGFwZSB0byByZXNldCBzcGFjaW5nLgorICovCitteEFycm93Q29ubmVjdG9yLnByb3RvdHlwZS5yZXNldFN0eWxlcyA9IGZ1bmN0aW9uKCkKK3sKKwlteFNoYXBlLnByb3RvdHlwZS5yZXNldFN0eWxlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQorCXRoaXMuYXJyb3dTcGFjaW5nID0gbXhDb25zdGFudHMuQVJST1dfU1BBQ0lORzsKK307CisKKy8qKgorICogT3ZlcnJpZGVzIGFwcGx5IHRvIGdldCBzbW9vdGggdHJhbnNpdGlvbiBmcm9tIGRlZmF1bHQgc3RhcnQtIGFuZCBlbmRzaXplLgorICovCitteEFycm93Q29ubmVjdG9yLnByb3RvdHlwZS5hcHBseSA9IGZ1bmN0aW9uKHN0YXRlKQoreworCW14U2hhcGUucHJvdG90eXBlLmFwcGx5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKwlpZiAodGhpcy5zdHlsZSAhPSBudWxsKQorCXsKKwkJdGhpcy5zdGFydFNpemUgPSBteFV0aWxzLmdldE51bWJlcih0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9TVEFSVFNJWkUsIG14Q29uc3RhbnRzLkFSUk9XX1NJWkUgLyA1KSAqIDM7CisJCXRoaXMuZW5kU2l6ZSA9IG14VXRpbHMuZ2V0TnVtYmVyKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0VORFNJWkUsIG14Q29uc3RhbnRzLkFSUk9XX1NJWkUgLyA1KSAqIDM7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogYXVnbWVudEJvdW5kaW5nQm94CisgKgorICogQXVnbWVudHMgdGhlIGJvdW5kaW5nIGJveCB3aXRoIHRoZSBlZGdlIHdpZHRoIGFuZCBtYXJrZXJzLgorICovCitteEFycm93Q29ubmVjdG9yLnByb3RvdHlwZS5hdWdtZW50Qm91bmRpbmdCb3ggPSBmdW5jdGlvbihiYm94KQoreworCW14U2hhcGUucHJvdG90eXBlLmF1Z21lbnRCb3VuZGluZ0JveC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQorCXZhciB3ID0gdGhpcy5nZXRFZGdlV2lkdGgoKTsKKwkKKwlpZiAodGhpcy5pc01hcmtlclN0YXJ0KCkpCisJeworCQl3ID0gTWF0aC5tYXgodywgdGhpcy5nZXRTdGFydEFycm93V2lkdGgoKSk7CisJfQorCQorCWlmICh0aGlzLmlzTWFya2VyRW5kKCkpCisJeworCQl3ID0gTWF0aC5tYXgodywgdGhpcy5nZXRFbmRBcnJvd1dpZHRoKCkpOworCX0KKwkKKwliYm94Lmdyb3coKHcgLyAyICsgdGhpcy5zdHJva2V3aWR0aCkgKiB0aGlzLnNjYWxlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHBhaW50RWRnZVNoYXBlCisgKiAKKyAqIFBhaW50cyB0aGUgbGluZSBzaGFwZS4KKyAqLworbXhBcnJvd0Nvbm5lY3Rvci5wcm90b3R5cGUucGFpbnRFZGdlU2hhcGUgPSBmdW5jdGlvbihjLCBwdHMpCit7CisJLy8gR2VvbWV0cnkgb2YgYXJyb3cKKwl2YXIgc3Ryb2tlV2lkdGggPSB0aGlzLnN0cm9rZXdpZHRoOworCQorCWlmICh0aGlzLm91dGxpbmUpCisJeworCQlzdHJva2VXaWR0aCA9IE1hdGgubWF4KDEsIG14VXRpbHMuZ2V0TnVtYmVyKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1NUUk9LRVdJRFRILCB0aGlzLnN0cm9rZXdpZHRoKSk7CisJfQorCQorCXZhciBzdGFydFdpZHRoID0gdGhpcy5nZXRTdGFydEFycm93V2lkdGgoKSArIHN0cm9rZVdpZHRoOworCXZhciBlbmRXaWR0aCA9IHRoaXMuZ2V0RW5kQXJyb3dXaWR0aCgpICsgc3Ryb2tlV2lkdGg7CisJdmFyIGVkZ2VXaWR0aCA9IHRoaXMub3V0bGluZSA/IHRoaXMuZ2V0RWRnZVdpZHRoKCkgKyBzdHJva2VXaWR0aCA6IHRoaXMuZ2V0RWRnZVdpZHRoKCk7CisJdmFyIG9wZW5FbmRlZCA9IHRoaXMuaXNPcGVuRW5kZWQoKTsKKwl2YXIgbWFya2VyU3RhcnQgPSB0aGlzLmlzTWFya2VyU3RhcnQoKTsKKwl2YXIgbWFya2VyRW5kID0gdGhpcy5pc01hcmtlckVuZCgpOworCXZhciBzcGFjaW5nID0gKG9wZW5FbmRlZCkgPyAwIDogdGhpcy5hcnJvd1NwYWNpbmcgKyBzdHJva2VXaWR0aCAvIDI7CisJdmFyIHN0YXJ0U2l6ZSA9IHRoaXMuc3RhcnRTaXplICsgc3Ryb2tlV2lkdGg7CisJdmFyIGVuZFNpemUgPSB0aGlzLmVuZFNpemUgKyBzdHJva2VXaWR0aDsKKwl2YXIgaXNSb3VuZGVkID0gdGhpcy5pc0Fycm93Um91bmRlZCgpOworCQorCS8vIEJhc2UgdmVjdG9yIChiZXR3ZWVuIGZpcnN0IHBvaW50cykKKwl2YXIgcGUgPSBwdHNbcHRzLmxlbmd0aCAtIDFdOworCisJLy8gRmluZHMgZmlyc3Qgbm9uLW92ZXJsYXBwaW5nIHBvaW50CisJdmFyIGkwID0gMTsKKwkKKwl3aGlsZSAoaTAgPCBwdHMubGVuZ3RoIC0gMSAmJiBwdHNbaTBdLnggPT0gcHRzWzBdLnggJiYgcHRzW2kwXS55ID09IHB0c1swXS55KQorCXsKKwkJaTArKzsKKwl9CisJCisJdmFyIGR4ID0gcHRzW2kwXS54IC0gcHRzWzBdLng7CisJdmFyIGR5ID0gcHRzW2kwXS55IC0gcHRzWzBdLnk7CisJdmFyIGRpc3QgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpOworCQorCWlmIChkaXN0ID09IDApCisJeworCQlyZXR1cm47CisJfQorCQorCS8vIENvbXB1dGVzIHRoZSBub3JtIGFuZCB0aGUgaW52ZXJzZSBub3JtCisJdmFyIG54ID0gZHggLyBkaXN0OworCXZhciBueDIsIG54MSA9IG54OworCXZhciBueSA9IGR5IC8gZGlzdDsKKwl2YXIgbnkyLCBueTEgPSBueTsKKwl2YXIgb3J0aHggPSBlZGdlV2lkdGggKiBueTsKKwl2YXIgb3J0aHkgPSAtZWRnZVdpZHRoICogbng7CisJCisJLy8gU3RvcmVzIHRoZSBpbmJvdW5kIGZ1bmN0aW9uIGNhbGxzIGluIHJldmVyc2Ugb3JkZXIgaW4gZm5zCisJdmFyIGZucyA9IFtdOworCQorCWlmIChpc1JvdW5kZWQpCisJeworCQljLnNldExpbmVKb2luKCdyb3VuZCcpOworCX0KKwllbHNlIGlmIChwdHMubGVuZ3RoID4gMikKKwl7CisJCS8vIE9ubHkgbWl0cmUgaWYgdGhlcmUgYXJlIHdheXBvaW50cworCQljLnNldE1pdGVyTGltaXQoMS40Mik7CisJfQorCisJYy5iZWdpbigpOworCisJdmFyIHN0YXJ0TnggPSBueDsKKwl2YXIgc3RhcnROeSA9IG55OworCisJaWYgKG1hcmtlclN0YXJ0ICYmICFvcGVuRW5kZWQpCisJeworCQl0aGlzLnBhaW50TWFya2VyKGMsIHB0c1swXS54LCBwdHNbMF0ueSwgbngsIG55LCBzdGFydFNpemUsIHN0YXJ0V2lkdGgsIGVkZ2VXaWR0aCwgc3BhY2luZywgdHJ1ZSk7CisJfQorCWVsc2UKKwl7CisJCXZhciBvdXRTdGFydFggPSBwdHNbMF0ueCArIG9ydGh4IC8gMiArIHNwYWNpbmcgKiBueDsKKwkJdmFyIG91dFN0YXJ0WSA9IHB0c1swXS55ICsgb3J0aHkgLyAyICsgc3BhY2luZyAqIG55OworCQl2YXIgaW5FbmRYID0gcHRzWzBdLnggLSBvcnRoeCAvIDIgKyBzcGFjaW5nICogbng7CisJCXZhciBpbkVuZFkgPSBwdHNbMF0ueSAtIG9ydGh5IC8gMiArIHNwYWNpbmcgKiBueTsKKwkJCisJCWlmIChvcGVuRW5kZWQpCisJCXsKKwkJCWMubW92ZVRvKG91dFN0YXJ0WCwgb3V0U3RhcnRZKTsKKwkJCQorCQkJZm5zLnB1c2goZnVuY3Rpb24oKQorCQkJeworCQkJCWMubGluZVRvKGluRW5kWCwgaW5FbmRZKTsKKwkJCX0pOworCQl9CisJCWVsc2UKKwkJeworCQkJYy5tb3ZlVG8oaW5FbmRYLCBpbkVuZFkpOworCQkJYy5saW5lVG8ob3V0U3RhcnRYLCBvdXRTdGFydFkpOworCQl9CisJfQorCQorCXZhciBkeDEgPSAwOworCXZhciBkeTEgPSAwOworCXZhciBkaXN0MSA9IDA7CisKKwlmb3IgKHZhciBpID0gMDsgaSA8IHB0cy5sZW5ndGggLSAyOyBpKyspCisJeworCQkvLyBXb3JrIG91dCBpbiB3aGljaCBkaXJlY3Rpb24gdGhlIGxpbmUgaXMgYmVuZGluZworCQl2YXIgcG9zID0gbXhVdGlscy5yZWxhdGl2ZUNjdyhwdHNbaV0ueCwgcHRzW2ldLnksIHB0c1tpKzFdLngsIHB0c1tpKzFdLnksIHB0c1tpKzJdLngsIHB0c1tpKzJdLnkpOworCisJCWR4MSA9IHB0c1tpKzJdLnggLSBwdHNbaSsxXS54OworCQlkeTEgPSBwdHNbaSsyXS55IC0gcHRzW2krMV0ueTsKKworCQlkaXN0MSA9IE1hdGguc3FydChkeDEgKiBkeDEgKyBkeTEgKiBkeTEpOworCQkKKwkJaWYgKGRpc3QxICE9IDApCisJCXsKKwkJCW54MSA9IGR4MSAvIGRpc3QxOworCQkJbnkxID0gZHkxIC8gZGlzdDE7CisJCQkKKwkJCXZhciB0bXAxID0gbnggKiBueDEgKyBueSAqIG55MTsKKwkJCXRtcCA9IE1hdGgubWF4KE1hdGguc3FydCgodG1wMSArIDEpIC8gMiksIDAuMDQpOworCQkJCisJCQkvLyBXb3JrIG91dCB0aGUgbm9ybWFsIG9ydGhvZ29uYWwgdG8gdGhlIGxpbmUgdGhyb3VnaCB0aGUgY29udHJvbCBwb2ludCBhbmQgdGhlIGVkZ2Ugc2lkZXMgaW50ZXJzZWN0aW9uCisJCQlueDIgPSAobnggKyBueDEpOworCQkJbnkyID0gKG55ICsgbnkxKTsKKwkKKwkJCXZhciBkaXN0MiA9IE1hdGguc3FydChueDIgKiBueDIgKyBueTIgKiBueTIpOworCQkJCisJCQlpZiAoZGlzdDIgIT0gMCkKKwkJCXsKKwkJCQlueDIgPSBueDIgLyBkaXN0MjsKKwkJCQlueTIgPSBueTIgLyBkaXN0MjsKKwkJCQkKKwkJCQkvLyBIaWdoZXIgc3Ryb2tld2lkdGhzIHJlcXVpcmUgYSBsYXJnZXIgbWluaW11bSBiZW5kLCAwLjM1IGNvdmVycyBhbGwgYnV0IHRoZSBtb3N0IGV4dHJlbWUgY2FzZXMKKwkJCQl2YXIgc3Ryb2tlV2lkdGhGYWN0b3IgPSBNYXRoLm1heCh0bXAsIE1hdGgubWluKHRoaXMuc3Ryb2tld2lkdGggLyAyMDAgKyAwLjA0LCAwLjM1KSk7CisJCQkJdmFyIGFuZ2xlRmFjdG9yID0gKHBvcyAhPSAwICYmIGlzUm91bmRlZCkgPyBNYXRoLm1heCgwLjEsIHN0cm9rZVdpZHRoRmFjdG9yKSA6IE1hdGgubWF4KHRtcCwgMC4wNik7CisKKwkJCQl2YXIgb3V0WCA9IHB0c1tpKzFdLnggKyBueTIgKiBlZGdlV2lkdGggLyAyIC8gYW5nbGVGYWN0b3I7CisJCQkJdmFyIG91dFkgPSBwdHNbaSsxXS55IC0gbngyICogZWRnZVdpZHRoIC8gMiAvIGFuZ2xlRmFjdG9yOworCQkJCXZhciBpblggPSBwdHNbaSsxXS54IC0gbnkyICogZWRnZVdpZHRoIC8gMiAvIGFuZ2xlRmFjdG9yOworCQkJCXZhciBpblkgPSBwdHNbaSsxXS55ICsgbngyICogZWRnZVdpZHRoIC8gMiAvIGFuZ2xlRmFjdG9yOworCQkJCQorCQkJCWlmIChwb3MgPT0gMCB8fCAhaXNSb3VuZGVkKQorCQkJCXsKKwkJCQkJLy8gSWYgdGhlIHR3byBzZWdtZW50cyBhcmUgYWxpZ25lZCwgb3IgaWYgd2UncmUgbm90IGRyYXdpbmcgY3VydmVkIHNlY3Rpb25zIGJldHdlZW4gc2VnbWVudHMKKwkJCQkJLy8ganVzdCBkcmF3IHN0cmFpZ2h0IHRvIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnQKKwkJCQkJYy5saW5lVG8ob3V0WCwgb3V0WSk7CisJCQkJCQorCQkJCQkoZnVuY3Rpb24oeCwgeSkKKwkJCQkJeworCQkJCQkJZm5zLnB1c2goZnVuY3Rpb24oKQorCQkJCQkJeworCQkJCQkJCWMubGluZVRvKHgsIHkpOworCQkJCQkJfSk7CisJCQkJCX0pKGluWCwgaW5ZKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAocG9zID09IC0xKQorCQkJCXsKKwkJCQkJdmFyIGMxeCA9IGluWCArIG55ICogZWRnZVdpZHRoOworCQkJCQl2YXIgYzF5ID0gaW5ZIC0gbnggKiBlZGdlV2lkdGg7CisJCQkJCXZhciBjMnggPSBpblggKyBueTEgKiBlZGdlV2lkdGg7CisJCQkJCXZhciBjMnkgPSBpblkgLSBueDEgKiBlZGdlV2lkdGg7CisJCQkJCWMubGluZVRvKGMxeCwgYzF5KTsKKwkJCQkJYy5xdWFkVG8ob3V0WCwgb3V0WSwgYzJ4LCBjMnkpOworCQkJCQkKKwkJCQkJKGZ1bmN0aW9uKHgsIHkpCisJCQkJCXsKKwkJCQkJCWZucy5wdXNoKGZ1bmN0aW9uKCkKKwkJCQkJCXsKKwkJCQkJCQljLmxpbmVUbyh4LCB5KTsKKwkJCQkJCX0pOworCQkJCQl9KShpblgsIGluWSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWMubGluZVRvKG91dFgsIG91dFkpOworCQkJCQkKKwkJCQkJKGZ1bmN0aW9uKHgsIHkpCisJCQkJCXsKKwkJCQkJCXZhciBjMXggPSBvdXRYIC0gbnkgKiBlZGdlV2lkdGg7CisJCQkJCQl2YXIgYzF5ID0gb3V0WSArIG54ICogZWRnZVdpZHRoOworCQkJCQkJdmFyIGMyeCA9IG91dFggLSBueTEgKiBlZGdlV2lkdGg7CisJCQkJCQl2YXIgYzJ5ID0gb3V0WSArIG54MSAqIGVkZ2VXaWR0aDsKKwkJCQkJCQorCQkJCQkJZm5zLnB1c2goZnVuY3Rpb24oKQorCQkJCQkJeworCQkJCQkJCWMucXVhZFRvKHgsIHksIGMxeCwgYzF5KTsKKwkJCQkJCX0pOworCQkJCQkJZm5zLnB1c2goZnVuY3Rpb24oKQorCQkJCQkJeworCQkJCQkJCWMubGluZVRvKGMyeCwgYzJ5KTsKKwkJCQkJCX0pOworCQkJCQl9KShpblgsIGluWSk7CisJCQkJfQorCQkJCQorCQkJCW54ID0gbngxOworCQkJCW55ID0gbnkxOworCQkJfQorCQl9CisJfQorCQorCW9ydGh4ID0gZWRnZVdpZHRoICogbnkxOworCW9ydGh5ID0gLSBlZGdlV2lkdGggKiBueDE7CisKKwlpZiAobWFya2VyRW5kICYmICFvcGVuRW5kZWQpCisJeworCQl0aGlzLnBhaW50TWFya2VyKGMsIHBlLngsIHBlLnksIC1ueCwgLW55LCBlbmRTaXplLCBlbmRXaWR0aCwgZWRnZVdpZHRoLCBzcGFjaW5nLCBmYWxzZSk7CisJfQorCWVsc2UKKwl7CisJCWMubGluZVRvKHBlLnggLSBzcGFjaW5nICogbngxICsgb3J0aHggLyAyLCBwZS55IC0gc3BhY2luZyAqIG55MSArIG9ydGh5IC8gMik7CisJCQorCQl2YXIgaW5TdGFydFggPSBwZS54IC0gc3BhY2luZyAqIG54MSAtIG9ydGh4IC8gMjsKKwkJdmFyIGluU3RhcnRZID0gcGUueSAtIHNwYWNpbmcgKiBueTEgLSBvcnRoeSAvIDI7CisKKwkJaWYgKCFvcGVuRW5kZWQpCisJCXsKKwkJCWMubGluZVRvKGluU3RhcnRYLCBpblN0YXJ0WSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQljLm1vdmVUbyhpblN0YXJ0WCwgaW5TdGFydFkpOworCQkJCisJCQlmbnMuc3BsaWNlKDAsIDAsIGZ1bmN0aW9uKCkKKwkJCXsKKwkJCQljLm1vdmVUbyhpblN0YXJ0WCwgaW5TdGFydFkpOworCQkJfSk7CisJCX0KKwl9CisJCisJZm9yICh2YXIgaSA9IGZucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKKwl7CisJCWZuc1tpXSgpOworCX0KKworCWlmIChvcGVuRW5kZWQpCisJeworCQljLmVuZCgpOworCQljLnN0cm9rZSgpOworCX0KKwllbHNlCisJeworCQljLmNsb3NlKCk7CisJCWMuZmlsbEFuZFN0cm9rZSgpOworCX0KKwkKKwkvLyBXb3JrYXJvdW5kIGZvciBzaGFkb3cgb24gdG9wIG9mIGJhc2UgYXJyb3cKKwljLnNldFNoYWRvdyhmYWxzZSk7CisJCisJLy8gTmVlZCB0byByZWRyYXcgdGhlIG1hcmtlcnMgd2l0aG91dCB0aGUgbG93IG1pdGVyIGxpbWl0CisJYy5zZXRNaXRlckxpbWl0KDQpOworCQorCWlmIChpc1JvdW5kZWQpCisJeworCQljLnNldExpbmVKb2luKCdmbGF0Jyk7CisJfQorCisJaWYgKHB0cy5sZW5ndGggPiAyKQorCXsKKwkJLy8gT25seSB0byByZXBhaW50IG1hcmtlcnMgaWYgbm8gd2F5cG9pbnRzCisJCS8vIE5lZWQgdG8gcmVkcmF3IHRoZSBtYXJrZXJzIHdpdGhvdXQgdGhlIGxvdyBtaXRlciBsaW1pdAorCQljLnNldE1pdGVyTGltaXQoNCk7CisJCWlmIChtYXJrZXJTdGFydCAmJiAhb3BlbkVuZGVkKQorCQl7CisJCQljLmJlZ2luKCk7CisJCQl0aGlzLnBhaW50TWFya2VyKGMsIHB0c1swXS54LCBwdHNbMF0ueSwgc3RhcnROeCwgc3RhcnROeSwgc3RhcnRTaXplLCBzdGFydFdpZHRoLCBlZGdlV2lkdGgsIHNwYWNpbmcsIHRydWUpOworCQkJYy5zdHJva2UoKTsKKwkJCWMuZW5kKCk7CisJCX0KKwkJCisJCWlmIChtYXJrZXJFbmQgJiYgIW9wZW5FbmRlZCkKKwkJeworCQkJYy5iZWdpbigpOworCQkJdGhpcy5wYWludE1hcmtlcihjLCBwZS54LCBwZS55LCAtbngsIC1ueSwgZW5kU2l6ZSwgZW5kV2lkdGgsIGVkZ2VXaWR0aCwgc3BhY2luZywgdHJ1ZSk7CisJCQljLnN0cm9rZSgpOworCQkJYy5lbmQoKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHBhaW50RWRnZVNoYXBlCisgKiAKKyAqIFBhaW50cyB0aGUgbGluZSBzaGFwZS4KKyAqLworbXhBcnJvd0Nvbm5lY3Rvci5wcm90b3R5cGUucGFpbnRNYXJrZXIgPSBmdW5jdGlvbihjLCBwdFgsIHB0WSwgbngsIG55LCBzaXplLCBhcnJvd1dpZHRoLCBlZGdlV2lkdGgsIHNwYWNpbmcsIGluaXRpYWxNb3ZlKQoreworCXZhciB3aWR0aEFycm93UmF0aW8gPSBlZGdlV2lkdGggLyBhcnJvd1dpZHRoOworCXZhciBvcnRoeCA9IGVkZ2VXaWR0aCAqIG55IC8gMjsKKwl2YXIgb3J0aHkgPSAtZWRnZVdpZHRoICogbnggLyAyOworCisJdmFyIHNwYWNlWCA9IChzcGFjaW5nICsgc2l6ZSkgKiBueDsKKwl2YXIgc3BhY2VZID0gKHNwYWNpbmcgKyBzaXplKSAqIG55OworCisJaWYgKGluaXRpYWxNb3ZlKQorCXsKKwkJYy5tb3ZlVG8ocHRYIC0gb3J0aHggKyBzcGFjZVgsIHB0WSAtIG9ydGh5ICsgc3BhY2VZKTsKKwl9CisJZWxzZQorCXsKKwkJYy5saW5lVG8ocHRYIC0gb3J0aHggKyBzcGFjZVgsIHB0WSAtIG9ydGh5ICsgc3BhY2VZKTsKKwl9CisKKwljLmxpbmVUbyhwdFggLSBvcnRoeCAvIHdpZHRoQXJyb3dSYXRpbyArIHNwYWNlWCwgcHRZIC0gb3J0aHkgLyB3aWR0aEFycm93UmF0aW8gKyBzcGFjZVkpOworCWMubGluZVRvKHB0WCArIHNwYWNpbmcgKiBueCwgcHRZICsgc3BhY2luZyAqIG55KTsKKwljLmxpbmVUbyhwdFggKyBvcnRoeCAvIHdpZHRoQXJyb3dSYXRpbyArIHNwYWNlWCwgcHRZICsgb3J0aHkgLyB3aWR0aEFycm93UmF0aW8gKyBzcGFjZVkpOworCWMubGluZVRvKHB0WCArIG9ydGh4ICsgc3BhY2VYLCBwdFkgKyBvcnRoeSArIHNwYWNlWSk7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGlzQXJyb3dSb3VuZGVkCisgKiAKKyAqIFJldHVybnMgd2V0aGVyIHRoZSBhcnJvdyBpcyByb3VuZGVkCisgKi8KK214QXJyb3dDb25uZWN0b3IucHJvdG90eXBlLmlzQXJyb3dSb3VuZGVkID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmlzUm91bmRlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFN0YXJ0QXJyb3dXaWR0aAorICogCisgKiBSZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgc3RhcnQgYXJyb3cKKyAqLworbXhBcnJvd0Nvbm5lY3Rvci5wcm90b3R5cGUuZ2V0U3RhcnRBcnJvd1dpZHRoID0gZnVuY3Rpb24oKQoreworCXJldHVybiBteENvbnN0YW50cy5BUlJPV19XSURUSDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEVuZEFycm93V2lkdGgKKyAqIAorICogUmV0dXJucyB0aGUgd2lkdGggb2YgdGhlIGVuZCBhcnJvdworICovCitteEFycm93Q29ubmVjdG9yLnByb3RvdHlwZS5nZXRFbmRBcnJvd1dpZHRoID0gZnVuY3Rpb24oKQoreworCXJldHVybiBteENvbnN0YW50cy5BUlJPV19XSURUSDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEVkZ2VXaWR0aAorICogCisgKiBSZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgYm9keSBvZiB0aGUgZWRnZQorICovCitteEFycm93Q29ubmVjdG9yLnByb3RvdHlwZS5nZXRFZGdlV2lkdGggPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIG14Q29uc3RhbnRzLkFSUk9XX1dJRFRIIC8gMzsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzT3BlbkVuZGVkCisgKiAKKyAqIFJldHVybnMgd2hldGhlciB0aGUgZW5kcyBvZiB0aGUgc2hhcGUgYXJlIGRyYXduCisgKi8KK214QXJyb3dDb25uZWN0b3IucHJvdG90eXBlLmlzT3BlbkVuZGVkID0gZnVuY3Rpb24oKQoreworCXJldHVybiBmYWxzZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzTWFya2VyU3RhcnQKKyAqIAorICogUmV0dXJucyB3aGV0aGVyIHRoZSBzdGFydCBtYXJrZXIgaXMgZHJhd24KKyAqLworbXhBcnJvd0Nvbm5lY3Rvci5wcm90b3R5cGUuaXNNYXJrZXJTdGFydCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gKG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfU1RBUlRBUlJPVywgbXhDb25zdGFudHMuTk9ORSkgIT0gbXhDb25zdGFudHMuTk9ORSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc01hcmtlckVuZAorICogCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGVuZCBtYXJrZXIgaXMgZHJhd24KKyAqLworbXhBcnJvd0Nvbm5lY3Rvci5wcm90b3R5cGUuaXNNYXJrZXJFbmQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIChteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0VOREFSUk9XLCBteENvbnN0YW50cy5OT05FKSAhPSBteENvbnN0YW50cy5OT05FKTsKK307ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214Q2xvdWQuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhDbG91ZC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjFmOTMxCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214Q2xvdWQuanMKQEAgLTAsMCArMSw1NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhDbG91ZAorICoKKyAqIEV4dGVuZHMgPG14QWN0b3I+IHRvIGltcGxlbWVudCBhIGNsb3VkIHNoYXBlLgorICogCisgKiBUaGlzIHNoYXBlIGlzIHJlZ2lzdGVyZWQgdW5kZXIgPG14Q29uc3RhbnRzLlNIQVBFX0NMT1VEPiBpbgorICogPG14Q2VsbFJlbmRlcmVyPi4KKyAqIAorICogQ29uc3RydWN0b3I6IG14Q2xvdWQKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsb3VkIHNoYXBlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBib3VuZHMgLSA8bXhSZWN0YW5nbGU+IHRoYXQgZGVmaW5lcyB0aGUgYm91bmRzLiBUaGlzIGlzIHN0b3JlZCBpbgorICogPG14U2hhcGUuYm91bmRzPi4KKyAqIGZpbGwgLSBTdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBmaWxsIGNvbG9yLiBUaGlzIGlzIHN0b3JlZCBpbiA8ZmlsbD4uCisgKiBzdHJva2UgLSBTdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBzdHJva2UgY29sb3IuIFRoaXMgaXMgc3RvcmVkIGluIDxzdHJva2U+LgorICogc3Ryb2tld2lkdGggLSBPcHRpb25hbCBpbnRlZ2VyIHRoYXQgZGVmaW5lcyB0aGUgc3Ryb2tlIHdpZHRoLiBEZWZhdWx0IGlzCisgKiAxLiBUaGlzIGlzIHN0b3JlZCBpbiA8c3Ryb2tld2lkdGg+LgorICovCitmdW5jdGlvbiBteENsb3VkKGJvdW5kcywgZmlsbCwgc3Ryb2tlLCBzdHJva2V3aWR0aCkKK3sKKwlteEFjdG9yLmNhbGwodGhpcyk7CisJdGhpcy5ib3VuZHMgPSBib3VuZHM7CisJdGhpcy5maWxsID0gZmlsbDsKKwl0aGlzLnN0cm9rZSA9IHN0cm9rZTsKKwl0aGlzLnN0cm9rZXdpZHRoID0gKHN0cm9rZXdpZHRoICE9IG51bGwpID8gc3Ryb2tld2lkdGggOiAxOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14QWN0b3IuCisgKi8KK214VXRpbHMuZXh0ZW5kKG14Q2xvdWQsIG14QWN0b3IpOworCisvKioKKyAqIEZ1bmN0aW9uOiByZWRyYXdQYXRoCisgKgorICogRHJhd3MgdGhlIHBhdGggZm9yIHRoaXMgc2hhcGUuCisgKi8KK214Q2xvdWQucHJvdG90eXBlLnJlZHJhd1BhdGggPSBmdW5jdGlvbihjLCB4LCB5LCB3LCBoKQoreworCWMubW92ZVRvKDAuMjUgKiB3LCAwLjI1ICogaCk7CisJYy5jdXJ2ZVRvKDAuMDUgKiB3LCAwLjI1ICogaCwgMCwgMC41ICogaCwgMC4xNiAqIHcsIDAuNTUgKiBoKTsKKwljLmN1cnZlVG8oMCwgMC42NiAqIGgsIDAuMTggKiB3LCAwLjkgKiBoLCAwLjMxICogdywgMC44ICogaCk7CisJYy5jdXJ2ZVRvKDAuNCAqIHcsIGgsIDAuNyAqIHcsIGgsIDAuOCAqIHcsIDAuOCAqIGgpOworCWMuY3VydmVUbyh3LCAwLjggKiBoLCB3LCAwLjYgKiBoLCAwLjg3NSAqIHcsIDAuNSAqIGgpOworCWMuY3VydmVUbyh3LCAwLjMgKiBoLCAwLjggKiB3LCAwLjEgKiBoLCAwLjYyNSAqIHcsIDAuMiAqIGgpOworCWMuY3VydmVUbygwLjUgKiB3LCAwLjA1ICogaCwgMC4zICogdywgMC4wNSAqIGgsIDAuMjUgKiB3LCAwLjI1ICogaCk7CisJYy5jbG9zZSgpOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teENvbm5lY3Rvci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teENvbm5lY3Rvci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk2OGEwCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214Q29ubmVjdG9yLmpzCkBAIC0wLDAgKzEsMTQ5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteENvbm5lY3RvcgorICogCisgKiBFeHRlbmRzIDxteFNoYXBlPiB0byBpbXBsZW1lbnQgYSBjb25uZWN0b3Igc2hhcGUuIFRoZSBjb25uZWN0b3IKKyAqIHNoYXBlIGFsbG93cyBmb3IgYXJyb3cgaGVhZHMgb24gZWl0aGVyIHNpZGUuCisgKiAKKyAqIFRoaXMgc2hhcGUgaXMgcmVnaXN0ZXJlZCB1bmRlciA8bXhDb25zdGFudHMuU0hBUEVfQ09OTkVDVE9SPiBpbgorICogPG14Q2VsbFJlbmRlcmVyPi4KKyAqIAorICogQ29uc3RydWN0b3I6IG14Q29ubmVjdG9yCisgKiAKKyAqIENvbnN0cnVjdHMgYSBuZXcgY29ubmVjdG9yIHNoYXBlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwb2ludHMgLSBBcnJheSBvZiA8bXhQb2ludHM+IHRoYXQgZGVmaW5lIHRoZSBwb2ludHMuIFRoaXMgaXMgc3RvcmVkIGluCisgKiA8bXhTaGFwZS5wb2ludHM+LgorICogc3Ryb2tlIC0gU3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgc3Ryb2tlIGNvbG9yLiBUaGlzIGlzIHN0b3JlZCBpbiA8c3Ryb2tlPi4KKyAqIERlZmF1bHQgaXMgJ2JsYWNrJy4KKyAqIHN0cm9rZXdpZHRoIC0gT3B0aW9uYWwgaW50ZWdlciB0aGF0IGRlZmluZXMgdGhlIHN0cm9rZSB3aWR0aC4gRGVmYXVsdCBpcworICogMS4gVGhpcyBpcyBzdG9yZWQgaW4gPHN0cm9rZXdpZHRoPi4KKyAqLworZnVuY3Rpb24gbXhDb25uZWN0b3IocG9pbnRzLCBzdHJva2UsIHN0cm9rZXdpZHRoKQoreworCW14UG9seWxpbmUuY2FsbCh0aGlzLCBwb2ludHMsIHN0cm9rZSwgc3Ryb2tld2lkdGgpOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14UG9seWxpbmUuCisgKi8KK214VXRpbHMuZXh0ZW5kKG14Q29ubmVjdG9yLCBteFBvbHlsaW5lKTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlQm91bmRpbmdCb3gKKyAqCisgKiBVcGRhdGVzIHRoZSA8Ym91bmRpbmdCb3g+IGZvciB0aGlzIHNoYXBlIHVzaW5nIDxjcmVhdGVCb3VuZGluZ0JveD4gYW5kCisgKiA8YXVnbWVudEJvdW5kaW5nQm94PiBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gPGJvdW5kaW5nQm94Pi4KKyAqLworbXhDb25uZWN0b3IucHJvdG90eXBlLnVwZGF0ZUJvdW5kaW5nQm94ID0gZnVuY3Rpb24oKQoreworCXRoaXMudXNlU3ZnQm91bmRpbmdCb3ggPSB0aGlzLnN0eWxlICE9IG51bGwgJiYgdGhpcy5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9DVVJWRURdID09IDE7CisJbXhTaGFwZS5wcm90b3R5cGUudXBkYXRlQm91bmRpbmdCb3guYXBwbHkodGhpcywgYXJndW1lbnRzKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHBhaW50RWRnZVNoYXBlCisgKiAKKyAqIFBhaW50cyB0aGUgbGluZSBzaGFwZS4KKyAqLworbXhDb25uZWN0b3IucHJvdG90eXBlLnBhaW50RWRnZVNoYXBlID0gZnVuY3Rpb24oYywgcHRzKQoreworCS8vIFRoZSBpbmRpcmVjdGlvbiB2aWEgZnVuY3Rpb25zIGZvciBtYXJrZXJzIGlzIG5lZWRlZCBpbgorCS8vIG9yZGVyIHRvIGFwcGx5IHRoZSBvZmZzZXRzIGJlZm9yZSBwYWludGluZyB0aGUgbGluZSBhbmQKKwkvLyBwYWludCB0aGUgbWFya2VycyBhZnRlciBwYWludGluZyB0aGUgbGluZS4KKwl2YXIgc291cmNlTWFya2VyID0gdGhpcy5jcmVhdGVNYXJrZXIoYywgcHRzLCB0cnVlKTsKKwl2YXIgdGFyZ2V0TWFya2VyID0gdGhpcy5jcmVhdGVNYXJrZXIoYywgcHRzLCBmYWxzZSk7CisKKwlteFBvbHlsaW5lLnByb3RvdHlwZS5wYWludEVkZ2VTaGFwZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQorCS8vIERpc2FibGVzIHNoYWRvd3MsIGRhc2hlZCBzdHlsZXMgYW5kIGZpeGVzIGZpbGwgY29sb3IgZm9yIG1hcmtlcnMKKwljLnNldEZpbGxDb2xvcih0aGlzLnN0cm9rZSk7CisJYy5zZXRTaGFkb3coZmFsc2UpOworCWMuc2V0RGFzaGVkKGZhbHNlKTsKKwkKKwlpZiAoc291cmNlTWFya2VyICE9IG51bGwpCisJeworCQlzb3VyY2VNYXJrZXIoKTsKKwl9CisJCisJaWYgKHRhcmdldE1hcmtlciAhPSBudWxsKQorCXsKKwkJdGFyZ2V0TWFya2VyKCk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlTWFya2VyCisgKiAKKyAqIFByZXBhcmVzIHRoZSBtYXJrZXIgYnkgYWRkaW5nIG9mZnNldHMgaW4gcHRzIGFuZCByZXR1cm5pbmcgYSBmdW5jdGlvbiB0bworICogcGFpbnQgdGhlIG1hcmtlci4KKyAqLworbXhDb25uZWN0b3IucHJvdG90eXBlLmNyZWF0ZU1hcmtlciA9IGZ1bmN0aW9uKGMsIHB0cywgc291cmNlKQoreworCXZhciByZXN1bHQgPSBudWxsOworCXZhciBuID0gcHRzLmxlbmd0aDsKKwl2YXIgdHlwZSA9IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgKHNvdXJjZSkgPyBteENvbnN0YW50cy5TVFlMRV9TVEFSVEFSUk9XIDogbXhDb25zdGFudHMuU1RZTEVfRU5EQVJST1cpOworCXZhciBwMCA9IChzb3VyY2UpID8gcHRzWzFdIDogcHRzW24gLSAyXTsKKwl2YXIgcGUgPSAoc291cmNlKSA/IHB0c1swXSA6IHB0c1tuIC0gMV07CisJCisJaWYgKHR5cGUgIT0gbnVsbCAmJiBwMCAhPSBudWxsICYmIHBlICE9IG51bGwpCisJeworCQl2YXIgY291bnQgPSAxOworCQkKKwkJLy8gVXNlcyBuZXh0IG5vbi1vdmVybGFwcGluZyBwb2ludAorCQl3aGlsZSAoY291bnQgPCBuIC0gMSAmJiBNYXRoLnJvdW5kKHAwLnggLSBwZS54KSA9PSAwICYmIE1hdGgucm91bmQocDAueSAtIHBlLnkpID09IDApCisJCXsKKwkJCXAwID0gKHNvdXJjZSkgPyBwdHNbMSArIGNvdW50XSA6IHB0c1tuIC0gMiAtIGNvdW50XTsKKwkJCWNvdW50Kys7CisJCX0KKwkKKwkJLy8gQ29tcHV0ZXMgdGhlIG5vcm0gYW5kIHRoZSBpbnZlcnNlIG5vcm0KKwkJdmFyIGR4ID0gcGUueCAtIHAwLng7CisJCXZhciBkeSA9IHBlLnkgLSBwMC55OworCQorCQl2YXIgZGlzdCA9IE1hdGgubWF4KDEsIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSkpOworCQkKKwkJdmFyIHVuaXRYID0gZHggLyBkaXN0OworCQl2YXIgdW5pdFkgPSBkeSAvIGRpc3Q7CisJCisJCXZhciBzaXplID0gbXhVdGlscy5nZXROdW1iZXIodGhpcy5zdHlsZSwgKHNvdXJjZSkgPyBteENvbnN0YW50cy5TVFlMRV9TVEFSVFNJWkUgOiBteENvbnN0YW50cy5TVFlMRV9FTkRTSVpFLCBteENvbnN0YW50cy5ERUZBVUxUX01BUktFUlNJWkUpOworCQkKKwkJLy8gQWxsb3cgZm9yIHN0cm9rZSB3aWR0aCBpbiB0aGUgZW5kIHBvaW50IHVzZWQgYW5kIHRoZSAKKwkJLy8gb3J0aG9nb25hbCB2ZWN0b3JzIGRlc2NyaWJpbmcgdGhlIGRpcmVjdGlvbiBvZiB0aGUgbWFya2VyCisJCXZhciBmaWxsZWQgPSB0aGlzLnN0eWxlWyhzb3VyY2UpID8gbXhDb25zdGFudHMuU1RZTEVfU1RBUlRGSUxMIDogbXhDb25zdGFudHMuU1RZTEVfRU5ERklMTF0gIT0gMDsKKwkJCisJCXJlc3VsdCA9IG14TWFya2VyLmNyZWF0ZU1hcmtlcihjLCB0aGlzLCB0eXBlLCBwZSwgdW5pdFgsIHVuaXRZLCBzaXplLCBzb3VyY2UsIHRoaXMuc3Ryb2tld2lkdGgsIGZpbGxlZCk7CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhdWdtZW50Qm91bmRpbmdCb3gKKyAqCisgKiBBdWdtZW50cyB0aGUgYm91bmRpbmcgYm94IHdpdGggdGhlIHN0cm9rZXdpZHRoIGFuZCBzaGFkb3cgb2Zmc2V0cy4KKyAqLworbXhDb25uZWN0b3IucHJvdG90eXBlLmF1Z21lbnRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uKGJib3gpCit7CisJbXhTaGFwZS5wcm90b3R5cGUuYXVnbWVudEJvdW5kaW5nQm94LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCisJLy8gQWRkcyBtYXJrZXIgc2l6ZXMKKwl2YXIgc2l6ZSA9IDA7CisJCisJaWYgKG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfU1RBUlRBUlJPVywgbXhDb25zdGFudHMuTk9ORSkgIT0gbXhDb25zdGFudHMuTk9ORSkKKwl7CisJCXNpemUgPSBteFV0aWxzLmdldE51bWJlcih0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9TVEFSVFNJWkUsIG14Q29uc3RhbnRzLkRFRkFVTFRfTUFSS0VSU0laRSkgKyAxOworCX0KKwkKKwlpZiAobXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9FTkRBUlJPVywgbXhDb25zdGFudHMuTk9ORSkgIT0gbXhDb25zdGFudHMuTk9ORSkKKwl7CisJCXNpemUgPSBNYXRoLm1heChzaXplLCBteFV0aWxzLmdldE51bWJlcih0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9FTkRTSVpFLCBteENvbnN0YW50cy5ERUZBVUxUX01BUktFUlNJWkUpKSArIDE7CisJfQorCQorCWJib3guZ3JvdyhzaXplICogdGhpcy5zY2FsZSk7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214Q3lsaW5kZXIuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhDeWxpbmRlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWVmMTRiCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214Q3lsaW5kZXIuanMKQEAgLTAsMCArMSwxMDUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14Q3lsaW5kZXIKKyAqCisgKiBFeHRlbmRzIDxteFNoYXBlPiB0byBpbXBsZW1lbnQgYW4gY3lsaW5kZXIgc2hhcGUuIElmIGEKKyAqIGN1c3RvbSBzaGFwZSB3aXRoIG9uZSBmaWxsZWQgYXJlYSBhbmQgYW4gb3ZlcmxheSBwYXRoIGlzCisgKiBuZWVkZWQsIHRoZW4gdGhpcyBzaGFwZSdzIDxyZWRyYXdQYXRoPiBzaG91bGQgYmUgb3ZlcnJpZGRlbi4KKyAqIFRoaXMgc2hhcGUgaXMgcmVnaXN0ZXJlZCB1bmRlciA8bXhDb25zdGFudHMuU0hBUEVfQ1lMSU5ERVI+CisgKiBpbiA8bXhDZWxsUmVuZGVyZXI+LgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhDeWxpbmRlcgorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgY3lsaW5kZXIgc2hhcGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGJvdW5kcyAtIDxteFJlY3RhbmdsZT4gdGhhdCBkZWZpbmVzIHRoZSBib3VuZHMuIFRoaXMgaXMgc3RvcmVkIGluCisgKiA8bXhTaGFwZS5ib3VuZHM+LgorICogZmlsbCAtIFN0cmluZyB0aGF0IGRlZmluZXMgdGhlIGZpbGwgY29sb3IuIFRoaXMgaXMgc3RvcmVkIGluIDxmaWxsPi4KKyAqIHN0cm9rZSAtIFN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHN0cm9rZSBjb2xvci4gVGhpcyBpcyBzdG9yZWQgaW4gPHN0cm9rZT4uCisgKiBzdHJva2V3aWR0aCAtIE9wdGlvbmFsIGludGVnZXIgdGhhdCBkZWZpbmVzIHRoZSBzdHJva2Ugd2lkdGguIERlZmF1bHQgaXMKKyAqIDEuIFRoaXMgaXMgc3RvcmVkIGluIDxzdHJva2V3aWR0aD4uCisgKi8KK2Z1bmN0aW9uIG14Q3lsaW5kZXIoYm91bmRzLCBmaWxsLCBzdHJva2UsIHN0cm9rZXdpZHRoKQoreworCW14U2hhcGUuY2FsbCh0aGlzKTsKKwl0aGlzLmJvdW5kcyA9IGJvdW5kczsKKwl0aGlzLmZpbGwgPSBmaWxsOworCXRoaXMuc3Ryb2tlID0gc3Ryb2tlOworCXRoaXMuc3Ryb2tld2lkdGggPSAoc3Ryb2tld2lkdGggIT0gbnVsbCkgPyBzdHJva2V3aWR0aCA6IDE7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhTaGFwZS4KKyAqLworbXhVdGlscy5leHRlbmQobXhDeWxpbmRlciwgbXhTaGFwZSk7CisKKy8qKgorICogVmFyaWFibGU6IG1heEhlaWdodAorICoKKyAqIERlZmluZXMgdGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSB0b3AgYW5kIGJvdHRvbSBwYXJ0CisgKiBvZiB0aGUgY3lsaW5kZXIgc2hhcGUuCisgKi8KK214Q3lsaW5kZXIucHJvdG90eXBlLm1heEhlaWdodCA9IDQwOworCisvKioKKyAqIFZhcmlhYmxlOiBzdmdTdHJva2VUb2xlcmFuY2UKKyAqCisgKiBTZXRzIHN0cm9rZSB0b2xlcmFuY2UgdG8gMCBmb3IgU1ZHLgorICovCitteEN5bGluZGVyLnByb3RvdHlwZS5zdmdTdHJva2VUb2xlcmFuY2UgPSAwOworCisvKioKKyAqIEZ1bmN0aW9uOiBwYWludFZlcnRleFNoYXBlCisgKiAKKyAqIFJlZGlyZWN0cyB0byByZWRyYXdQYXRoIGZvciBzdWJjbGFzc2VzIHRvIHdvcmsuCisgKi8KK214Q3lsaW5kZXIucHJvdG90eXBlLnBhaW50VmVydGV4U2hhcGUgPSBmdW5jdGlvbihjLCB4LCB5LCB3LCBoKQoreworCWMudHJhbnNsYXRlKHgsIHkpOworCWMuYmVnaW4oKTsKKwl0aGlzLnJlZHJhd1BhdGgoYywgeCwgeSwgdywgaCwgZmFsc2UpOworCWMuZmlsbEFuZFN0cm9rZSgpOworCQorCWMuc2V0U2hhZG93KGZhbHNlKTsKKwkKKwljLmJlZ2luKCk7CisJdGhpcy5yZWRyYXdQYXRoKGMsIHgsIHksIHcsIGgsIHRydWUpOworCWMuc3Ryb2tlKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWRyYXdQYXRoCisgKgorICogRHJhd3MgdGhlIHBhdGggZm9yIHRoaXMgc2hhcGUuCisgKi8KK214Q3lsaW5kZXIucHJvdG90eXBlLnJlZHJhd1BhdGggPSBmdW5jdGlvbihjLCB4LCB5LCB3LCBoLCBpc0ZvcmVncm91bmQpCit7CisJdmFyIGR5ID0gTWF0aC5taW4odGhpcy5tYXhIZWlnaHQsIE1hdGgucm91bmQoaCAvIDUpKTsKKwkKKwlpZiAoKGlzRm9yZWdyb3VuZCAmJiB0aGlzLmZpbGwgIT0gbnVsbCkgfHwgKCFpc0ZvcmVncm91bmQgJiYgdGhpcy5maWxsID09IG51bGwpKQorCXsKKwkJYy5tb3ZlVG8oMCwgZHkpOworCQljLmN1cnZlVG8oMCwgMiAqIGR5LCB3LCAyICogZHksIHcsIGR5KTsKKwkJCisJCS8vIE5lZWRzIHNlcGFyYXRlIHNoYXBlcyBmb3IgY29ycmVjdCBoaXQtZGV0ZWN0aW9uCisJCWlmICghaXNGb3JlZ3JvdW5kKQorCQl7CisJCQljLnN0cm9rZSgpOworCQkJYy5iZWdpbigpOworCQl9CisJfQorCQorCWlmICghaXNGb3JlZ3JvdW5kKQorCXsKKwkJYy5tb3ZlVG8oMCwgZHkpOworCQljLmN1cnZlVG8oMCwgLWR5IC8gMywgdywgLWR5IC8gMywgdywgZHkpOworCQljLmxpbmVUbyh3LCBoIC0gZHkpOworCQljLmN1cnZlVG8odywgaCArIGR5IC8gMywgMCwgaCArIGR5IC8gMywgMCwgaCAtIGR5KTsKKwkJYy5jbG9zZSgpOworCX0KK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhEb3VibGVFbGxpcHNlLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214RG91YmxlRWxsaXBzZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWM5NWJiCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214RG91YmxlRWxsaXBzZS5qcwpAQCAtMCwwICsxLDExNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhEb3VibGVFbGxpcHNlCisgKgorICogRXh0ZW5kcyA8bXhTaGFwZT4gdG8gaW1wbGVtZW50IGEgZG91YmxlIGVsbGlwc2Ugc2hhcGUuIFRoaXMgc2hhcGUgaXMKKyAqIHJlZ2lzdGVyZWQgdW5kZXIgPG14Q29uc3RhbnRzLlNIQVBFX0RPVUJMRV9FTExJUFNFPiBpbiA8bXhDZWxsUmVuZGVyZXI+LgorICogVXNlIHRoZSBmb2xsb3dpbmcgb3ZlcnJpZGUgdG8gb25seSBmaWxsIHRoZSBpbm5lciBlbGxpcHNlIGluIHRoaXMgc2hhcGU6CisgKiAKKyAqIChjb2RlKQorICogbXhEb3VibGVFbGxpcHNlLnByb3RvdHlwZS5wYWludFZlcnRleFNoYXBlID0gZnVuY3Rpb24oYywgeCwgeSwgdywgaCkKKyAqIHsKKyAqICAgYy5lbGxpcHNlKHgsIHksIHcsIGgpOworICogICBjLnN0cm9rZSgpOworICogICAKKyAqICAgdmFyIGluc2V0ID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9NQVJHSU4sIE1hdGgubWluKDMgKyB0aGlzLnN0cm9rZXdpZHRoLCBNYXRoLm1pbih3IC8gNSwgaCAvIDUpKSk7CisgKiAgIHggKz0gaW5zZXQ7CisgKiAgIHkgKz0gaW5zZXQ7CisgKiAgIHcgLT0gMiAqIGluc2V0OworICogICBoIC09IDIgKiBpbnNldDsKKyAqICAgCisgKiAgIGlmICh3ID4gMCAmJiBoID4gMCkKKyAqICAgeworICogICAgIGMuZWxsaXBzZSh4LCB5LCB3LCBoKTsKKyAqICAgfQorICogICAKKyAqICAgYy5maWxsQW5kU3Ryb2tlKCk7CisgKiB9OworICogKGVuZCkKKyAqIAorICogQ29uc3RydWN0b3I6IG14RG91YmxlRWxsaXBzZQorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgZWxsaXBzZSBzaGFwZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGJvdW5kcyAtIDxteFJlY3RhbmdsZT4gdGhhdCBkZWZpbmVzIHRoZSBib3VuZHMuIFRoaXMgaXMgc3RvcmVkIGluCisgKiA8bXhTaGFwZS5ib3VuZHM+LgorICogZmlsbCAtIFN0cmluZyB0aGF0IGRlZmluZXMgdGhlIGZpbGwgY29sb3IuIFRoaXMgaXMgc3RvcmVkIGluIDxmaWxsPi4KKyAqIHN0cm9rZSAtIFN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHN0cm9rZSBjb2xvci4gVGhpcyBpcyBzdG9yZWQgaW4gPHN0cm9rZT4uCisgKiBzdHJva2V3aWR0aCAtIE9wdGlvbmFsIGludGVnZXIgdGhhdCBkZWZpbmVzIHRoZSBzdHJva2Ugd2lkdGguIERlZmF1bHQgaXMKKyAqIDEuIFRoaXMgaXMgc3RvcmVkIGluIDxzdHJva2V3aWR0aD4uCisgKi8KK2Z1bmN0aW9uIG14RG91YmxlRWxsaXBzZShib3VuZHMsIGZpbGwsIHN0cm9rZSwgc3Ryb2tld2lkdGgpCit7CisJbXhTaGFwZS5jYWxsKHRoaXMpOworCXRoaXMuYm91bmRzID0gYm91bmRzOworCXRoaXMuZmlsbCA9IGZpbGw7CisJdGhpcy5zdHJva2UgPSBzdHJva2U7CisJdGhpcy5zdHJva2V3aWR0aCA9IChzdHJva2V3aWR0aCAhPSBudWxsKSA/IHN0cm9rZXdpZHRoIDogMTsKK307CisKKy8qKgorICogRXh0ZW5kcyBteFNoYXBlLgorICovCitteFV0aWxzLmV4dGVuZChteERvdWJsZUVsbGlwc2UsIG14U2hhcGUpOworCisvKioKKyAqIFZhcmlhYmxlOiB2bWxTY2FsZQorICogCisgKiBTY2FsZSBmb3IgaW1wcm92aW5nIHRoZSBwcmVjaXNpb24gb2YgVk1MIHJlbmRlcmluZy4gRGVmYXVsdCBpcyAxMC4KKyAqLworbXhEb3VibGVFbGxpcHNlLnByb3RvdHlwZS52bWxTY2FsZSA9IDEwOworCisvKioKKyAqIEZ1bmN0aW9uOiBwYWludEJhY2tncm91bmQKKyAqIAorICogUGFpbnRzIHRoZSBiYWNrZ3JvdW5kLgorICovCitteERvdWJsZUVsbGlwc2UucHJvdG90eXBlLnBhaW50QmFja2dyb3VuZCA9IGZ1bmN0aW9uKGMsIHgsIHksIHcsIGgpCit7CisJYy5lbGxpcHNlKHgsIHksIHcsIGgpOworCWMuZmlsbEFuZFN0cm9rZSgpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcGFpbnRGb3JlZ3JvdW5kCisgKiAKKyAqIFBhaW50cyB0aGUgZm9yZWdyb3VuZC4KKyAqLworbXhEb3VibGVFbGxpcHNlLnByb3RvdHlwZS5wYWludEZvcmVncm91bmQgPSBmdW5jdGlvbihjLCB4LCB5LCB3LCBoKQoreworCWlmICghdGhpcy5vdXRsaW5lKQorCXsKKwkJdmFyIG1hcmdpbiA9IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfTUFSR0lOLCBNYXRoLm1pbigzICsgdGhpcy5zdHJva2V3aWR0aCwgTWF0aC5taW4odyAvIDUsIGggLyA1KSkpOworCQl4ICs9IG1hcmdpbjsKKwkJeSArPSBtYXJnaW47CisJCXcgLT0gMiAqIG1hcmdpbjsKKwkJaCAtPSAyICogbWFyZ2luOworCQkKKwkJLy8gRklYTUU6IFJvdW5kaW5nIGlzc3VlcyBpbiBJRTggc3RhbmRhcmRzIG1vZGUgKG5vdCBpbiAxLngpCisJCWlmICh3ID4gMCAmJiBoID4gMCkKKwkJeworCQkJYy5lbGxpcHNlKHgsIHksIHcsIGgpOworCQl9CisJCQorCQljLnN0cm9rZSgpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldExhYmVsQm91bmRzCisgKiAKKyAqIFJldHVybnMgdGhlIGJvdW5kcyBmb3IgdGhlIGxhYmVsLgorICovCitteERvdWJsZUVsbGlwc2UucHJvdG90eXBlLmdldExhYmVsQm91bmRzID0gZnVuY3Rpb24ocmVjdCkKK3sKKwl2YXIgbWFyZ2luID0gKG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfTUFSR0lOLCBNYXRoLm1pbigzICsgdGhpcy5zdHJva2V3aWR0aCwKKwkJCU1hdGgubWluKHJlY3Qud2lkdGggLyA1IC8gdGhpcy5zY2FsZSwgcmVjdC5oZWlnaHQgLyA1IC8gdGhpcy5zY2FsZSkpKSkgKiB0aGlzLnNjYWxlOworCisJcmV0dXJuIG5ldyBteFJlY3RhbmdsZShyZWN0LnggKyBtYXJnaW4sIHJlY3QueSArIG1hcmdpbiwgcmVjdC53aWR0aCAtIDIgKiBtYXJnaW4sIHJlY3QuaGVpZ2h0IC0gMiAqIG1hcmdpbik7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214RWxsaXBzZS5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teEVsbGlwc2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmOGRmNwotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teEVsbGlwc2UuanMKQEAgLTAsMCArMSw0OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhFbGxpcHNlCisgKgorICogRXh0ZW5kcyA8bXhTaGFwZT4gdG8gaW1wbGVtZW50IGFuIGVsbGlwc2Ugc2hhcGUuCisgKiBUaGlzIHNoYXBlIGlzIHJlZ2lzdGVyZWQgdW5kZXIgPG14Q29uc3RhbnRzLlNIQVBFX0VMTElQU0U+CisgKiBpbiA8bXhDZWxsUmVuZGVyZXI+LgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhFbGxpcHNlCisgKgorICogQ29uc3RydWN0cyBhIG5ldyBlbGxpcHNlIHNoYXBlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBib3VuZHMgLSA8bXhSZWN0YW5nbGU+IHRoYXQgZGVmaW5lcyB0aGUgYm91bmRzLiBUaGlzIGlzIHN0b3JlZCBpbgorICogPG14U2hhcGUuYm91bmRzPi4KKyAqIGZpbGwgLSBTdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBmaWxsIGNvbG9yLiBUaGlzIGlzIHN0b3JlZCBpbiA8ZmlsbD4uCisgKiBzdHJva2UgLSBTdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBzdHJva2UgY29sb3IuIFRoaXMgaXMgc3RvcmVkIGluIDxzdHJva2U+LgorICogc3Ryb2tld2lkdGggLSBPcHRpb25hbCBpbnRlZ2VyIHRoYXQgZGVmaW5lcyB0aGUgc3Ryb2tlIHdpZHRoLiBEZWZhdWx0IGlzCisgKiAxLiBUaGlzIGlzIHN0b3JlZCBpbiA8c3Ryb2tld2lkdGg+LgorICovCitmdW5jdGlvbiBteEVsbGlwc2UoYm91bmRzLCBmaWxsLCBzdHJva2UsIHN0cm9rZXdpZHRoKQoreworCW14U2hhcGUuY2FsbCh0aGlzKTsKKwl0aGlzLmJvdW5kcyA9IGJvdW5kczsKKwl0aGlzLmZpbGwgPSBmaWxsOworCXRoaXMuc3Ryb2tlID0gc3Ryb2tlOworCXRoaXMuc3Ryb2tld2lkdGggPSAoc3Ryb2tld2lkdGggIT0gbnVsbCkgPyBzdHJva2V3aWR0aCA6IDE7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhTaGFwZS4KKyAqLworbXhVdGlscy5leHRlbmQobXhFbGxpcHNlLCBteFNoYXBlKTsKKworLyoqCisgKiBGdW5jdGlvbjogcGFpbnRWZXJ0ZXhTaGFwZQorICogCisgKiBQYWludHMgdGhlIGVsbGlwc2Ugc2hhcGUuCisgKi8KK214RWxsaXBzZS5wcm90b3R5cGUucGFpbnRWZXJ0ZXhTaGFwZSA9IGZ1bmN0aW9uKGMsIHgsIHksIHcsIGgpCit7CisJYy5lbGxpcHNlKHgsIHksIHcsIGgpOworCWMuZmlsbEFuZFN0cm9rZSgpOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teEhleGFnb24uanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhIZXhhZ29uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZjRmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhIZXhhZ29uLmpzCkBAIC0wLDAgKzEsMzQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14SGV4YWdvbgorICogCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgaGV4YWdvbiBzaGFwZS4KKyAqIAorICogQ29uc3RydWN0b3I6IG14SGV4YWdvbgorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgaGV4YWdvbiBzaGFwZS4KKyAqLworZnVuY3Rpb24gbXhIZXhhZ29uKCkKK3sKKwlteEFjdG9yLmNhbGwodGhpcyk7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhBY3Rvci4KKyAqLworbXhVdGlscy5leHRlbmQobXhIZXhhZ29uLCBteEFjdG9yKTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVkcmF3UGF0aAorICoKKyAqIERyYXdzIHRoZSBwYXRoIGZvciB0aGlzIHNoYXBlLgorICovCitteEhleGFnb24ucHJvdG90eXBlLnJlZHJhd1BhdGggPSBmdW5jdGlvbihjLCB4LCB5LCB3LCBoKQoreworCXZhciBhcmNTaXplID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9BUkNTSVpFLCBteENvbnN0YW50cy5MSU5FX0FSQ1NJWkUpIC8gMjsKKwl0aGlzLmFkZFBvaW50cyhjLCBbbmV3IG14UG9pbnQoMC4yNSAqIHcsIDApLCBuZXcgbXhQb2ludCgwLjc1ICogdywgMCksIG5ldyBteFBvaW50KHcsIDAuNSAqIGgpLCBuZXcgbXhQb2ludCgwLjc1ICogdywgaCksCisJICAgICAgICAgICAgICAgICAgIG5ldyBteFBvaW50KDAuMjUgKiB3LCBoKSwgbmV3IG14UG9pbnQoMCwgMC41ICogaCldLCB0aGlzLmlzUm91bmRlZCwgYXJjU2l6ZSwgdHJ1ZSk7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214SW1hZ2VTaGFwZS5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teEltYWdlU2hhcGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzYjY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teEltYWdlU2hhcGUuanMKQEAgLTAsMCArMSwyMzMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14SW1hZ2VTaGFwZQorICoKKyAqIEV4dGVuZHMgPG14U2hhcGU+IHRvIGltcGxlbWVudCBhbiBpbWFnZSBzaGFwZS4gVGhpcyBzaGFwZSBpcyByZWdpc3RlcmVkCisgKiB1bmRlciA8bXhDb25zdGFudHMuU0hBUEVfSU1BR0U+IGluIDxteENlbGxSZW5kZXJlcj4uCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteEltYWdlU2hhcGUKKyAqIAorICogQ29uc3RydWN0cyBhIG5ldyBpbWFnZSBzaGFwZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogYm91bmRzIC0gPG14UmVjdGFuZ2xlPiB0aGF0IGRlZmluZXMgdGhlIGJvdW5kcy4gVGhpcyBpcyBzdG9yZWQgaW4KKyAqIDxteFNoYXBlLmJvdW5kcz4uCisgKiBpbWFnZSAtIFN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgVVJMIG9mIHRoZSBpbWFnZS4gVGhpcyBpcyBzdG9yZWQgaW4KKyAqIDxpbWFnZT4uCisgKiBmaWxsIC0gU3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgZmlsbCBjb2xvci4gVGhpcyBpcyBzdG9yZWQgaW4gPGZpbGw+LgorICogc3Ryb2tlIC0gU3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgc3Ryb2tlIGNvbG9yLiBUaGlzIGlzIHN0b3JlZCBpbiA8c3Ryb2tlPi4KKyAqIHN0cm9rZXdpZHRoIC0gT3B0aW9uYWwgaW50ZWdlciB0aGF0IGRlZmluZXMgdGhlIHN0cm9rZSB3aWR0aC4gRGVmYXVsdCBpcworICogMC4gVGhpcyBpcyBzdG9yZWQgaW4gPHN0cm9rZXdpZHRoPi4KKyAqLworZnVuY3Rpb24gbXhJbWFnZVNoYXBlKGJvdW5kcywgaW1hZ2UsIGZpbGwsIHN0cm9rZSwgc3Ryb2tld2lkdGgpCit7CisJbXhTaGFwZS5jYWxsKHRoaXMpOworCXRoaXMuYm91bmRzID0gYm91bmRzOworCXRoaXMuaW1hZ2UgPSBpbWFnZTsKKwl0aGlzLmZpbGwgPSBmaWxsOworCXRoaXMuc3Ryb2tlID0gc3Ryb2tlOworCXRoaXMuc3Ryb2tld2lkdGggPSAoc3Ryb2tld2lkdGggIT0gbnVsbCkgPyBzdHJva2V3aWR0aCA6IDE7CisJdGhpcy5zaGFkb3cgPSBmYWxzZTsKK307CisKKy8qKgorICogRXh0ZW5kcyBteFNoYXBlLgorICovCitteFV0aWxzLmV4dGVuZChteEltYWdlU2hhcGUsIG14UmVjdGFuZ2xlU2hhcGUpOworCisvKioKKyAqIFZhcmlhYmxlOiBwcmVzZXJ2ZUltYWdlQXNwZWN0CisgKgorICogU3dpdGNoIHRvIHByZXNlcnZlIGltYWdlIGFzcGVjdC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEltYWdlU2hhcGUucHJvdG90eXBlLnByZXNlcnZlSW1hZ2VBc3BlY3QgPSB0cnVlOworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTdmdTY3JlZW5PZmZzZXQKKyAqIAorICogRGlzYWJsZXMgb2Zmc2V0IGluIElFOSBmb3IgY3Jpc3BlciBpbWFnZSBvdXRwdXQuCisgKi8KK214SW1hZ2VTaGFwZS5wcm90b3R5cGUuZ2V0U3ZnU2NyZWVuT2Zmc2V0ID0gZnVuY3Rpb24oKQoreworCXJldHVybiAwOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYXBwbHkKKyAqIAorICogT3ZlcnJpZGVzIDxteFNoYXBlLmFwcGx5PiB0byByZXBsYWNlIHRoZSBmaWxsIGFuZCBzdHJva2UgY29sb3JzIHdpdGggdGhlCisgKiByZXNwZWN0aXZlIHZhbHVlcyBmcm9tIDxteENvbnN0YW50cy5TVFlMRV9JTUFHRV9CQUNLR1JPVU5EPiBhbmQKKyAqIDxteENvbnN0YW50cy5TVFlMRV9JTUFHRV9CT1JERVI+LgorICogCisgKiBBcHBsaWVzIHRoZSBzdHlsZSBvZiB0aGUgZ2l2ZW4gPG14Q2VsbFN0YXRlPiB0byB0aGUgc2hhcGUuIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIGFzc2lnbnMgdGhlIGZvbGxvd2luZyBzdHlsZXMgdG8gbG9jYWwgZmllbGRzOgorICogCisgKiAtIDxteENvbnN0YW50cy5TVFlMRV9JTUFHRV9CQUNLR1JPVU5EPiA9PiBmaWxsCisgKiAtIDxteENvbnN0YW50cy5TVFlMRV9JTUFHRV9CT1JERVI+ID0+IHN0cm9rZQorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IG9mIHRoZSBjb3JyZXNwb25kaW5nIGNlbGwuCisgKi8KK214SW1hZ2VTaGFwZS5wcm90b3R5cGUuYXBwbHkgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlteFNoYXBlLnByb3RvdHlwZS5hcHBseS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQorCXRoaXMuZmlsbCA9IG51bGw7CisJdGhpcy5zdHJva2UgPSBudWxsOworCXRoaXMuZ3JhZGllbnQgPSBudWxsOworCQorCWlmICh0aGlzLnN0eWxlICE9IG51bGwpCisJeworCQl0aGlzLnByZXNlcnZlSW1hZ2VBc3BlY3QgPSBteFV0aWxzLmdldE51bWJlcih0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9JTUFHRV9BU1BFQ1QsIDEpID09IDE7CisJCQorCQkvLyBMZWdhY3kgc3VwcG9ydCBmb3IgaW1hZ2VGbGlwSC9WCisJCXRoaXMuZmxpcEggPSB0aGlzLmZsaXBIIHx8IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgJ2ltYWdlRmxpcEgnLCAwKSA9PSAxOworCQl0aGlzLmZsaXBWID0gdGhpcy5mbGlwViB8fCBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsICdpbWFnZUZsaXBWJywgMCkgPT0gMTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0h0bWxBbGxvd2VkCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiBIVE1MIGlzIGFsbG93ZWQgZm9yIHRoaXMgc2hhcGUuIFRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzCisgKiByZXR1cm5zIGZhbHNlLgorICovCitteEltYWdlU2hhcGUucHJvdG90eXBlLmlzSHRtbEFsbG93ZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuICF0aGlzLnByZXNlcnZlSW1hZ2VBc3BlY3Q7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVIdG1sCisgKgorICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgSFRNTCBET00gbm9kZShzKSB0byByZXByZXNlbnQKKyAqIHRoaXMgc2hhcGUuIFRoaXMgaW1wbGVtZW50YXRpb24gZmFsbHMgYmFjayB0byA8Y3JlYXRlVm1sPgorICogc28gdGhhdCB0aGUgSFRNTCBjcmVhdGlvbiBpcyBvcHRpb25hbC4KKyAqLworbXhJbWFnZVNoYXBlLnByb3RvdHlwZS5jcmVhdGVIdG1sID0gZnVuY3Rpb24oKQoreworCXZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisKKwlyZXR1cm4gbm9kZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHBhaW50VmVydGV4U2hhcGUKKyAqIAorICogR2VuZXJpYyBiYWNrZ3JvdW5kIHBhaW50aW5nIGltcGxlbWVudGF0aW9uLgorICovCitteEltYWdlU2hhcGUucHJvdG90eXBlLnBhaW50VmVydGV4U2hhcGUgPSBmdW5jdGlvbihjLCB4LCB5LCB3LCBoKQoreworCWlmICh0aGlzLmltYWdlICE9IG51bGwpCisJeworCQl2YXIgZmlsbCA9IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfSU1BR0VfQkFDS0dST1VORCwgbnVsbCk7CisJCXZhciBzdHJva2UgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0lNQUdFX0JPUkRFUiwgbnVsbCk7CisJCQorCQlpZiAoZmlsbCAhPSBudWxsKQorCQl7CisJCQkvLyBTdHJva2UgcmVuZGVyaW5nIHJlcXVpcmVkIGZvciBzaGFkb3cKKwkJCWMuc2V0RmlsbENvbG9yKGZpbGwpOworCQkJYy5zZXRTdHJva2VDb2xvcihzdHJva2UpOworCQkJYy5yZWN0KHgsIHksIHcsIGgpOworCQkJYy5maWxsQW5kU3Ryb2tlKCk7CisJCX0KKworCQkvLyBGbGlwSC9WIGFyZSBpbXBsaWNpdCB2aWEgbXhTaGFwZS51cGRhdGVUcmFuc2Zvcm0KKwkJYy5pbWFnZSh4LCB5LCB3LCBoLCB0aGlzLmltYWdlLCB0aGlzLnByZXNlcnZlSW1hZ2VBc3BlY3QsIGZhbHNlLCBmYWxzZSk7CisJCQorCQl2YXIgc3Ryb2tlID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9JTUFHRV9CT1JERVIsIG51bGwpOworCQkKKwkJaWYgKHN0cm9rZSAhPSBudWxsKQorCQl7CisJCQljLnNldFNoYWRvdyhmYWxzZSk7CisJCQljLnNldFN0cm9rZUNvbG9yKHN0cm9rZSk7CisJCQljLnJlY3QoeCwgeSwgdywgaCk7CisJCQljLnN0cm9rZSgpOworCQl9CisJfQorCWVsc2UKKwl7CisJCW14UmVjdGFuZ2xlU2hhcGUucHJvdG90eXBlLnBhaW50QmFja2dyb3VuZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJlZHJhdworICogCisgKiBPdmVycmlkZXMgPG14U2hhcGUucmVkcmF3PiB0byBwcmVzZXJ2ZSB0aGUgYXNwZWN0IHJhdGlvIG9mIGltYWdlcy4KKyAqLworbXhJbWFnZVNoYXBlLnByb3RvdHlwZS5yZWRyYXdIdG1sU2hhcGUgPSBmdW5jdGlvbigpCit7CisJdGhpcy5ub2RlLnN0eWxlLmxlZnQgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLngpICsgJ3B4JzsKKwl0aGlzLm5vZGUuc3R5bGUudG9wID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy55KSArICdweCc7CisJdGhpcy5ub2RlLnN0eWxlLndpZHRoID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy53aWR0aCkpICsgJ3B4JzsKKwl0aGlzLm5vZGUuc3R5bGUuaGVpZ2h0ID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5oZWlnaHQpKSArICdweCc7CisJdGhpcy5ub2RlLmlubmVySFRNTCA9ICcnOworCisJaWYgKHRoaXMuaW1hZ2UgIT0gbnVsbCkKKwl7CisJCXZhciBmaWxsID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9JTUFHRV9CQUNLR1JPVU5ELCAnJyk7CisJCXZhciBzdHJva2UgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0lNQUdFX0JPUkRFUiwgJycpOworCQl0aGlzLm5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gZmlsbDsKKwkJdGhpcy5ub2RlLnN0eWxlLmJvcmRlckNvbG9yID0gc3Ryb2tlOworCQkKKwkJLy8gVk1MIGltYWdlIHN1cHBvcnRzIFBORyBpbiBJRTYKKwkJdmFyIHVzZVZtbCA9IG14Q2xpZW50LklTX0lFNiB8fCAoKGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSBudWxsIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA8PSA4KSAmJiB0aGlzLnJvdGF0aW9uICE9IDApOworCQl2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgodXNlVm1sKSA/IG14Q2xpZW50LlZNTF9QUkVGSVggKyAnOmltYWdlJyA6ICdpbWcnKTsKKwkJaW1nLnNldEF0dHJpYnV0ZSgnYm9yZGVyJywgJzAnKTsKKwkJaW1nLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKwkJaW1nLnNyYyA9IHRoaXMuaW1hZ2U7CisKKwkJdmFyIGZpbHRlciA9ICh0aGlzLm9wYWNpdHkgPCAxMDApID8gJ2FscGhhKG9wYWNpdHk9JyArIHRoaXMub3BhY2l0eSArICcpJyA6ICcnOworCQl0aGlzLm5vZGUuc3R5bGUuZmlsdGVyID0gZmlsdGVyOworCQkKKwkJaWYgKHRoaXMuZmxpcEggJiYgdGhpcy5mbGlwVikKKwkJeworCQkJZmlsdGVyICs9ICdwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShyb3RhdGlvbj0yKSc7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5mbGlwSCkKKwkJeworCQkJZmlsdGVyICs9ICdwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQmFzaWNJbWFnZShtaXJyb3I9MSknOworCQl9CisJCWVsc2UgaWYgKHRoaXMuZmxpcFYpCisJCXsKKwkJCWZpbHRlciArPSAncHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkJhc2ljSW1hZ2Uocm90YXRpb249MiwgbWlycm9yPTEpJzsKKwkJfQorCisJCWlmIChpbWcuc3R5bGUuZmlsdGVyICE9IGZpbHRlcikKKwkJeworCQkJaW1nLnN0eWxlLmZpbHRlciA9IGZpbHRlcjsKKwkJfQorCisJCWlmIChpbWcubm9kZU5hbWUgPT0gJ2ltYWdlJykKKwkJeworCQkJaW1nLnN0eWxlLnJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjsKKwkJfQorCQllbHNlIGlmICh0aGlzLnJvdGF0aW9uICE9IDApCisJCXsKKwkJCS8vIExBVEVSOiBBZGQgZmxpcFYvSCBzdXBwb3J0CisJCQlteFV0aWxzLnNldFByZWZpeGVkU3R5bGUoaW1nLnN0eWxlLCAndHJhbnNmb3JtJywgJ3JvdGF0ZSgnICsgdGhpcy5yb3RhdGlvbiArICdkZWcpJyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlteFV0aWxzLnNldFByZWZpeGVkU3R5bGUoaW1nLnN0eWxlLCAndHJhbnNmb3JtJywgJycpOworCQl9CisKKwkJLy8gS25vd24gcHJvYmxlbTogSUUgY2xpcHMgdG9wIGxpbmUgb2YgaW1hZ2UgZm9yIGNlcnRhaW4gYW5nbGVzCisJCWltZy5zdHlsZS53aWR0aCA9IHRoaXMubm9kZS5zdHlsZS53aWR0aDsKKwkJaW1nLnN0eWxlLmhlaWdodCA9IHRoaXMubm9kZS5zdHlsZS5oZWlnaHQ7CisJCQorCQl0aGlzLm5vZGUuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJyc7CisJCXRoaXMubm9kZS5hcHBlbmRDaGlsZChpbWcpOworCX0KKwllbHNlCisJeworCQl0aGlzLnNldFRyYW5zcGFyZW50QmFja2dyb3VuZEltYWdlKHRoaXMubm9kZSk7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teExhYmVsLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214TGFiZWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzMDViMQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teExhYmVsLmpzCkBAIC0wLDAgKzEsMjc1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteExhYmVsCisgKgorICogRXh0ZW5kcyA8bXhTaGFwZT4gdG8gaW1wbGVtZW50IGFuIGltYWdlIHNoYXBlIHdpdGggYSBsYWJlbC4KKyAqIFRoaXMgc2hhcGUgaXMgcmVnaXN0ZXJlZCB1bmRlciA8bXhDb25zdGFudHMuU0hBUEVfTEFCRUw+IGluCisgKiA8bXhDZWxsUmVuZGVyZXI+LgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhMYWJlbAorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgbGFiZWwgc2hhcGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGJvdW5kcyAtIDxteFJlY3RhbmdsZT4gdGhhdCBkZWZpbmVzIHRoZSBib3VuZHMuIFRoaXMgaXMgc3RvcmVkIGluCisgKiA8bXhTaGFwZS5ib3VuZHM+LgorICogZmlsbCAtIFN0cmluZyB0aGF0IGRlZmluZXMgdGhlIGZpbGwgY29sb3IuIFRoaXMgaXMgc3RvcmVkIGluIDxmaWxsPi4KKyAqIHN0cm9rZSAtIFN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHN0cm9rZSBjb2xvci4gVGhpcyBpcyBzdG9yZWQgaW4gPHN0cm9rZT4uCisgKiBzdHJva2V3aWR0aCAtIE9wdGlvbmFsIGludGVnZXIgdGhhdCBkZWZpbmVzIHRoZSBzdHJva2Ugd2lkdGguIERlZmF1bHQgaXMKKyAqIDEuIFRoaXMgaXMgc3RvcmVkIGluIDxzdHJva2V3aWR0aD4uCisgKi8KK2Z1bmN0aW9uIG14TGFiZWwoYm91bmRzLCBmaWxsLCBzdHJva2UsIHN0cm9rZXdpZHRoKQoreworCW14UmVjdGFuZ2xlU2hhcGUuY2FsbCh0aGlzLCBib3VuZHMsIGZpbGwsIHN0cm9rZSwgc3Ryb2tld2lkdGgpOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14U2hhcGUuCisgKi8KK214VXRpbHMuZXh0ZW5kKG14TGFiZWwsIG14UmVjdGFuZ2xlU2hhcGUpOworCisvKioKKyAqIFZhcmlhYmxlOiBpbWFnZVNpemUKKyAqCisgKiBEZWZhdWx0IHdpZHRoIGFuZCBoZWlnaHQgZm9yIHRoZSBpbWFnZS4gRGVmYXVsdCBpcworICogPG14Q29uc3RhbnRzLkRFRkFVTFRfSU1BR0VTSVpFPi4KKyAqLworbXhMYWJlbC5wcm90b3R5cGUuaW1hZ2VTaXplID0gbXhDb25zdGFudHMuREVGQVVMVF9JTUFHRVNJWkU7CisKKy8qKgorICogVmFyaWFibGU6IHNwYWNpbmcKKyAqCisgKiBEZWZhdWx0IHZhbHVlIGZvciBpbWFnZSBzcGFjaW5nLiBEZWZhdWx0IGlzIDIuCisgKi8KK214TGFiZWwucHJvdG90eXBlLnNwYWNpbmcgPSAyOworCisvKioKKyAqIFZhcmlhYmxlOiBpbmRpY2F0b3JTaXplCisgKgorICogRGVmYXVsdCB3aWR0aCBhbmQgaGVpZ2h0IGZvciB0aGUgaW5kaWNpY2F0b3IuIERlZmF1bHQgaXMgMTAuCisgKi8KK214TGFiZWwucHJvdG90eXBlLmluZGljYXRvclNpemUgPSAxMDsKKworLyoqCisgKiBWYXJpYWJsZTogaW5kaWNhdG9yU3BhY2luZworICoKKyAqIERlZmF1bHQgc3BhY2luZyBiZXR3ZWVuIGltYWdlIGFuZCBpbmRpY2F0b3IuIERlZmF1bHQgaXMgMi4KKyAqLworbXhMYWJlbC5wcm90b3R5cGUuaW5kaWNhdG9yU3BhY2luZyA9IDI7CisKKy8qKgorICogRnVuY3Rpb246IGluaXQKKyAqCisgKiBJbml0aWFsaXplcyB0aGUgc2hhcGUgYW5kIHRoZSA8aW5kaWNhdG9yPi4KKyAqLworbXhMYWJlbC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKGNvbnRhaW5lcikKK3sKKwlteFNoYXBlLnByb3RvdHlwZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisKKwlpZiAodGhpcy5pbmRpY2F0b3JTaGFwZSAhPSBudWxsKQorCXsKKwkJdGhpcy5pbmRpY2F0b3IgPSBuZXcgdGhpcy5pbmRpY2F0b3JTaGFwZSgpOworCQl0aGlzLmluZGljYXRvci5kaWFsZWN0ID0gdGhpcy5kaWFsZWN0OworCQl0aGlzLmluZGljYXRvci5pbml0KHRoaXMubm9kZSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVkcmF3CisgKgorICogUmVjb25maWd1cmVzIHRoaXMgc2hhcGUuIFRoaXMgd2lsbCB1cGRhdGUgdGhlIGNvbG9ycyBvZiB0aGUgaW5kaWNhdG9yCisgKiBhbmQgcmVjb25maWd1cmUgaXQgaWYgcmVxdWlyZWQuCisgKi8KK214TGFiZWwucHJvdG90eXBlLnJlZHJhdyA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAodGhpcy5pbmRpY2F0b3IgIT0gbnVsbCkKKwl7CisJCXRoaXMuaW5kaWNhdG9yLmZpbGwgPSB0aGlzLmluZGljYXRvckNvbG9yOworCQl0aGlzLmluZGljYXRvci5zdHJva2UgPSB0aGlzLmluZGljYXRvclN0cm9rZUNvbG9yOworCQl0aGlzLmluZGljYXRvci5ncmFkaWVudCA9IHRoaXMuaW5kaWNhdG9yR3JhZGllbnRDb2xvcjsKKwkJdGhpcy5pbmRpY2F0b3IuZGlyZWN0aW9uID0gdGhpcy5pbmRpY2F0b3JEaXJlY3Rpb247CisJfQorCQorCW14U2hhcGUucHJvdG90eXBlLnJlZHJhdy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNIdG1sQWxsb3dlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBmb3Igbm9uLXJvdW5kZWQsIG5vbi1yb3RhdGVkIHNoYXBlcyB3aXRoIG5vIGdsYXNzIGdyYWRpZW50IGFuZAorICogbm8gaW5kaWNhdG9yIHNoYXBlLgorICovCitteExhYmVsLnByb3RvdHlwZS5pc0h0bWxBbGxvd2VkID0gZnVuY3Rpb24oKQoreworCXJldHVybiBteFJlY3RhbmdsZVNoYXBlLnByb3RvdHlwZS5pc0h0bWxBbGxvd2VkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgJiYKKwkJdGhpcy5pbmRpY2F0b3JDb2xvciA9PSBudWxsICYmIHRoaXMuaW5kaWNhdG9yU2hhcGUgPT0gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHBhaW50Rm9yZWdyb3VuZAorICogCisgKiBHZW5lcmljIGJhY2tncm91bmQgcGFpbnRpbmcgaW1wbGVtZW50YXRpb24uCisgKi8KK214TGFiZWwucHJvdG90eXBlLnBhaW50Rm9yZWdyb3VuZCA9IGZ1bmN0aW9uKGMsIHgsIHksIHcsIGgpCit7CisJdGhpcy5wYWludEltYWdlKGMsIHgsIHksIHcsIGgpOworCXRoaXMucGFpbnRJbmRpY2F0b3IoYywgeCwgeSwgdywgaCk7CisJCisJbXhSZWN0YW5nbGVTaGFwZS5wcm90b3R5cGUucGFpbnRGb3JlZ3JvdW5kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBwYWludEltYWdlCisgKiAKKyAqIEdlbmVyaWMgYmFja2dyb3VuZCBwYWludGluZyBpbXBsZW1lbnRhdGlvbi4KKyAqLworbXhMYWJlbC5wcm90b3R5cGUucGFpbnRJbWFnZSA9IGZ1bmN0aW9uKGMsIHgsIHksIHcsIGgpCit7CisJaWYgKHRoaXMuaW1hZ2UgIT0gbnVsbCkKKwl7CisJCXZhciBib3VuZHMgPSB0aGlzLmdldEltYWdlQm91bmRzKHgsIHksIHcsIGgpOworCQljLmltYWdlKGJvdW5kcy54LCBib3VuZHMueSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCB0aGlzLmltYWdlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRJbWFnZUJvdW5kcworICogCisgKiBHZW5lcmljIGJhY2tncm91bmQgcGFpbnRpbmcgaW1wbGVtZW50YXRpb24uCisgKi8KK214TGFiZWwucHJvdG90eXBlLmdldEltYWdlQm91bmRzID0gZnVuY3Rpb24oeCwgeSwgdywgaCkKK3sKKwl2YXIgYWxpZ24gPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0lNQUdFX0FMSUdOLCBteENvbnN0YW50cy5BTElHTl9MRUZUKTsKKwl2YXIgdmFsaWduID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9JTUFHRV9WRVJUSUNBTF9BTElHTiwgbXhDb25zdGFudHMuQUxJR05fTUlERExFKTsKKwl2YXIgd2lkdGggPSBteFV0aWxzLmdldE51bWJlcih0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9JTUFHRV9XSURUSCwgbXhDb25zdGFudHMuREVGQVVMVF9JTUFHRVNJWkUpOworCXZhciBoZWlnaHQgPSBteFV0aWxzLmdldE51bWJlcih0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9JTUFHRV9IRUlHSFQsIG14Q29uc3RhbnRzLkRFRkFVTFRfSU1BR0VTSVpFKTsKKwl2YXIgc3BhY2luZyA9IG14VXRpbHMuZ2V0TnVtYmVyKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1NQQUNJTkcsIHRoaXMuc3BhY2luZykgKyA1OworCisJaWYgKGFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUikKKwl7CisJCXggKz0gKHcgLSB3aWR0aCkgLyAyOworCX0KKwllbHNlIGlmIChhbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9SSUdIVCkKKwl7CisJCXggKz0gdyAtIHdpZHRoIC0gc3BhY2luZzsKKwl9CisJZWxzZSAvLyBkZWZhdWx0IGlzIGxlZnQKKwl7CisJCXggKz0gc3BhY2luZzsKKwl9CisKKwlpZiAodmFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX1RPUCkKKwl7CisJCXkgKz0gc3BhY2luZzsKKwl9CisJZWxzZSBpZiAodmFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX0JPVFRPTSkKKwl7CisJCXkgKz0gaCAtIGhlaWdodCAtIHNwYWNpbmc7CisJfQorCWVsc2UgLy8gZGVmYXVsdCBpcyBtaWRkbGUKKwl7CisJCXkgKz0gKGggLSBoZWlnaHQpIC8gMjsKKwl9CisJCisJcmV0dXJuIG5ldyBteFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHBhaW50SW5kaWNhdG9yCisgKiAKKyAqIEdlbmVyaWMgYmFja2dyb3VuZCBwYWludGluZyBpbXBsZW1lbnRhdGlvbi4KKyAqLworbXhMYWJlbC5wcm90b3R5cGUucGFpbnRJbmRpY2F0b3IgPSBmdW5jdGlvbihjLCB4LCB5LCB3LCBoKQoreworCWlmICh0aGlzLmluZGljYXRvciAhPSBudWxsKQorCXsKKwkJdGhpcy5pbmRpY2F0b3IuYm91bmRzID0gdGhpcy5nZXRJbmRpY2F0b3JCb3VuZHMoeCwgeSwgdywgaCk7CisJCXRoaXMuaW5kaWNhdG9yLnBhaW50KGMpOworCX0KKwllbHNlIGlmICh0aGlzLmluZGljYXRvckltYWdlICE9IG51bGwpCisJeworCQl2YXIgYm91bmRzID0gdGhpcy5nZXRJbmRpY2F0b3JCb3VuZHMoeCwgeSwgdywgaCk7CisJCWMuaW1hZ2UoYm91bmRzLngsIGJvdW5kcy55LCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQsIHRoaXMuaW5kaWNhdG9ySW1hZ2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEluZGljYXRvckJvdW5kcworICogCisgKiBHZW5lcmljIGJhY2tncm91bmQgcGFpbnRpbmcgaW1wbGVtZW50YXRpb24uCisgKi8KK214TGFiZWwucHJvdG90eXBlLmdldEluZGljYXRvckJvdW5kcyA9IGZ1bmN0aW9uKHgsIHksIHcsIGgpCit7CisJdmFyIGFsaWduID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9JTUFHRV9BTElHTiwgbXhDb25zdGFudHMuQUxJR05fTEVGVCk7CisJdmFyIHZhbGlnbiA9IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfSU1BR0VfVkVSVElDQUxfQUxJR04sIG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSk7CisJdmFyIHdpZHRoID0gbXhVdGlscy5nZXROdW1iZXIodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfSU5ESUNBVE9SX1dJRFRILCB0aGlzLmluZGljYXRvclNpemUpOworCXZhciBoZWlnaHQgPSBteFV0aWxzLmdldE51bWJlcih0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9JTkRJQ0FUT1JfSEVJR0hULCB0aGlzLmluZGljYXRvclNpemUpOworCXZhciBzcGFjaW5nID0gdGhpcy5zcGFjaW5nICsgNTsJCQorCQorCWlmIChhbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9SSUdIVCkKKwl7CisJCXggKz0gdyAtIHdpZHRoIC0gc3BhY2luZzsKKwl9CisJZWxzZSBpZiAoYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fQ0VOVEVSKQorCXsKKwkJeCArPSAodyAtIHdpZHRoKSAvIDI7CisJfQorCWVsc2UgLy8gZGVmYXVsdCBpcyBsZWZ0CisJeworCQl4ICs9IHNwYWNpbmc7CisJfQorCQorCWlmICh2YWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fQk9UVE9NKQorCXsKKwkJeSArPSBoIC0gaGVpZ2h0IC0gc3BhY2luZzsKKwl9CisJZWxzZSBpZiAodmFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX1RPUCkKKwl7CisJCXkgKz0gc3BhY2luZzsKKwl9CisJZWxzZSAvLyBkZWZhdWx0IGlzIG1pZGRsZQorCXsKKwkJeSArPSAoaCAtIGhlaWdodCkgLyAyOworCX0KKwkKKwlyZXR1cm4gbmV3IG14UmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpOworfTsKKy8qKgorICogRnVuY3Rpb246IHJlZHJhd0h0bWxTaGFwZQorICogCisgKiBHZW5lcmljIGJhY2tncm91bmQgcGFpbnRpbmcgaW1wbGVtZW50YXRpb24uCisgKi8KK214TGFiZWwucHJvdG90eXBlLnJlZHJhd0h0bWxTaGFwZSA9IGZ1bmN0aW9uKCkKK3sKKwlteFJlY3RhbmdsZVNoYXBlLnByb3RvdHlwZS5yZWRyYXdIdG1sU2hhcGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkKKwkvLyBSZW1vdmVzIGFsbCBjaGlsZHJlbgorCXdoaWxlKHRoaXMubm9kZS5oYXNDaGlsZE5vZGVzKCkpCisJeworCQl0aGlzLm5vZGUucmVtb3ZlQ2hpbGQodGhpcy5ub2RlLmxhc3RDaGlsZCk7CisJfQorCQorCWlmICh0aGlzLmltYWdlICE9IG51bGwpCisJeworCQl2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOworCQlub2RlLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKKwkJbm9kZS5zZXRBdHRyaWJ1dGUoJ2JvcmRlcicsICcwJyk7CisJCQorCQl2YXIgYm91bmRzID0gdGhpcy5nZXRJbWFnZUJvdW5kcyh0aGlzLmJvdW5kcy54LCB0aGlzLmJvdW5kcy55LCB0aGlzLmJvdW5kcy53aWR0aCwgdGhpcy5ib3VuZHMuaGVpZ2h0KTsKKwkJYm91bmRzLnggLT0gdGhpcy5ib3VuZHMueDsKKwkJYm91bmRzLnkgLT0gdGhpcy5ib3VuZHMueTsKKworCQlub2RlLnN0eWxlLmxlZnQgPSBNYXRoLnJvdW5kKGJvdW5kcy54KSArICdweCc7CisJCW5vZGUuc3R5bGUudG9wID0gTWF0aC5yb3VuZChib3VuZHMueSkgKyAncHgnOworCQlub2RlLnN0eWxlLndpZHRoID0gTWF0aC5yb3VuZChib3VuZHMud2lkdGgpICsgJ3B4JzsKKwkJbm9kZS5zdHlsZS5oZWlnaHQgPSBNYXRoLnJvdW5kKGJvdW5kcy5oZWlnaHQpICsgJ3B4JzsKKwkJCisJCW5vZGUuc3JjID0gdGhpcy5pbWFnZTsKKwkJCisJCXRoaXMubm9kZS5hcHBlbmRDaGlsZChub2RlKTsKKwl9Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214TGluZS5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teExpbmUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE1NGNiMwotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teExpbmUuanMKQEAgLTAsMCArMSw1MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhMaW5lCisgKgorICogRXh0ZW5kcyA8bXhTaGFwZT4gdG8gaW1wbGVtZW50IGEgaG9yaXpvbnRhbCBsaW5lIHNoYXBlLgorICogVGhpcyBzaGFwZSBpcyByZWdpc3RlcmVkIHVuZGVyIDxteENvbnN0YW50cy5TSEFQRV9MSU5FPiBpbgorICogPG14Q2VsbFJlbmRlcmVyPi4KKyAqIAorICogQ29uc3RydWN0b3I6IG14TGluZQorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgbGluZSBzaGFwZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogYm91bmRzIC0gPG14UmVjdGFuZ2xlPiB0aGF0IGRlZmluZXMgdGhlIGJvdW5kcy4gVGhpcyBpcyBzdG9yZWQgaW4KKyAqIDxteFNoYXBlLmJvdW5kcz4uCisgKiBzdHJva2UgLSBTdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBzdHJva2UgY29sb3IuIERlZmF1bHQgaXMgJ2JsYWNrJy4gVGhpcyBpcworICogc3RvcmVkIGluIDxzdHJva2U+LgorICogc3Ryb2tld2lkdGggLSBPcHRpb25hbCBpbnRlZ2VyIHRoYXQgZGVmaW5lcyB0aGUgc3Ryb2tlIHdpZHRoLiBEZWZhdWx0IGlzCisgKiAxLiBUaGlzIGlzIHN0b3JlZCBpbiA8c3Ryb2tld2lkdGg+LgorICovCitmdW5jdGlvbiBteExpbmUoYm91bmRzLCBzdHJva2UsIHN0cm9rZXdpZHRoKQoreworCW14U2hhcGUuY2FsbCh0aGlzKTsKKwl0aGlzLmJvdW5kcyA9IGJvdW5kczsKKwl0aGlzLnN0cm9rZSA9IHN0cm9rZTsKKwl0aGlzLnN0cm9rZXdpZHRoID0gKHN0cm9rZXdpZHRoICE9IG51bGwpID8gc3Ryb2tld2lkdGggOiAxOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14U2hhcGUuCisgKi8KK214VXRpbHMuZXh0ZW5kKG14TGluZSwgbXhTaGFwZSk7CisKKy8qKgorICogRnVuY3Rpb246IHBhaW50VmVydGV4U2hhcGUKKyAqIAorICogUmVkaXJlY3RzIHRvIHJlZHJhd1BhdGggZm9yIHN1YmNsYXNzZXMgdG8gd29yay4KKyAqLworbXhMaW5lLnByb3RvdHlwZS5wYWludFZlcnRleFNoYXBlID0gZnVuY3Rpb24oYywgeCwgeSwgdywgaCkKK3sKKwl2YXIgbWlkID0geSArIGggLyAyOworCisJYy5iZWdpbigpOworCWMubW92ZVRvKHgsIG1pZCk7CisJYy5saW5lVG8oeCArIHcsIG1pZCk7CisJYy5zdHJva2UoKTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhNYXJrZXIuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhNYXJrZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAwNGViNQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teE1hcmtlci5qcwpAQCAtMCwwICsxLDIwOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLwordmFyIG14TWFya2VyID0KK3sKKwkvKioKKwkgKiBDbGFzczogbXhNYXJrZXIKKwkgKiAKKwkgKiBBIHN0YXRpYyBjbGFzcyB0aGF0IGltcGxlbWVudHMgYWxsIG1hcmtlcnMgZm9yIFZNTCBhbmQgU1ZHIHVzaW5nIGEKKwkgKiByZWdpc3RyeS4gTk9URTogVGhlIHNpZ25hdHVyZXMgaW4gdGhpcyBjbGFzcyB3aWxsIGNoYW5nZS4KKwkgKiAKKwkgKiBWYXJpYWJsZTogbWFya2VycworCSAqIAorCSAqIE1hcHMgZnJvbSBtYXJrZXJzIG5hbWVzIHRvIGZ1bmN0aW9ucyB0byBwYWludCB0aGUgbWFya2Vycy4KKwkgKi8KKwltYXJrZXJzOiBbXSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogYWRkTWFya2VyCisJICogCisJICogQWRkcyBhIGZhY3RvcnkgbWV0aG9kIHRoYXQgdXBkYXRlcyBhIGdpdmVuIGVuZHBvaW50IGFuZCByZXR1cm5zIGEKKwkgKiBmdW5jdGlvbiB0byBwYWludCB0aGUgbWFya2VyIG9udG8gdGhlIGdpdmVuIGNhbnZhcy4KKwkgKi8KKwlhZGRNYXJrZXI6IGZ1bmN0aW9uKHR5cGUsIGZ1bmN0KQorCXsKKwkJbXhNYXJrZXIubWFya2Vyc1t0eXBlXSA9IGZ1bmN0OworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IGNyZWF0ZU1hcmtlcgorCSAqIAorCSAqIFJldHVybnMgYSBmdW5jdGlvbiB0byBwYWludCB0aGUgZ2l2ZW4gbWFya2VyLgorCSAqLworCWNyZWF0ZU1hcmtlcjogZnVuY3Rpb24oY2FudmFzLCBzaGFwZSwgdHlwZSwgcGUsIHVuaXRYLCB1bml0WSwgc2l6ZSwgc291cmNlLCBzdywgZmlsbGVkKQorCXsKKwkJdmFyIGZ1bmN0ID0gbXhNYXJrZXIubWFya2Vyc1t0eXBlXTsKKwkJCisJCXJldHVybiAoZnVuY3QgIT0gbnVsbCkgPyBmdW5jdChjYW52YXMsIHNoYXBlLCB0eXBlLCBwZSwgdW5pdFgsIHVuaXRZLCBzaXplLCBzb3VyY2UsIHN3LCBmaWxsZWQpIDogbnVsbDsKKwl9CisKK307CisKKy8qKgorICogQWRkcyB0aGUgY2xhc3NpYyBhbmQgYmxvY2sgbWFya2VyIGZhY3RvcnkgbWV0aG9kLgorICovCisoZnVuY3Rpb24oKQoreworCWZ1bmN0aW9uIGNyZWF0ZUFycm93KHdpZHRoRmFjdG9yKQorCXsKKwkJd2lkdGhGYWN0b3IgPSAod2lkdGhGYWN0b3IgIT0gbnVsbCkgPyB3aWR0aEZhY3RvciA6IDI7CisJCQorCQlyZXR1cm4gZnVuY3Rpb24oY2FudmFzLCBzaGFwZSwgdHlwZSwgcGUsIHVuaXRYLCB1bml0WSwgc2l6ZSwgc291cmNlLCBzdywgZmlsbGVkKQorCQl7CisJCQkvLyBUaGUgYW5nbGUgb2YgdGhlIGZvcndhcmQgZmFjaW5nIGFycm93IHNpZGVzIGFnYWluc3QgdGhlIHggYXhpcyBpcworCQkJLy8gMjYuNTY1IGRlZ3JlZXMsIDEvc2luKDI2LjU2NSkgPSAyLjIzNiAvIDIgPSAxLjExOCAoIC8gMiBhbGxvd3MgZm9yCisJCQkvLyBvbmx5IGhhbGYgdGhlIHN0cm9rZXdpZHRoIGlzIHByb2Nlc3NlZCApLgorCQkJdmFyIGVuZE9mZnNldFggPSB1bml0WCAqIHN3ICogMS4xMTg7CisJCQl2YXIgZW5kT2Zmc2V0WSA9IHVuaXRZICogc3cgKiAxLjExODsKKwkJCQorCQkJdW5pdFggPSB1bml0WCAqIChzaXplICsgc3cpOworCQkJdW5pdFkgPSB1bml0WSAqIChzaXplICsgc3cpOworCQorCQkJdmFyIHB0ID0gcGUuY2xvbmUoKTsKKwkJCXB0LnggLT0gZW5kT2Zmc2V0WDsKKwkJCXB0LnkgLT0gZW5kT2Zmc2V0WTsKKwkJCQorCQkJdmFyIGYgPSAodHlwZSAhPSBteENvbnN0YW50cy5BUlJPV19DTEFTU0lDICYmIHR5cGUgIT0gbXhDb25zdGFudHMuQVJST1dfQ0xBU1NJQ19USElOKSA/IDEgOiAzIC8gNDsKKwkJCXBlLnggKz0gLXVuaXRYICogZiAtIGVuZE9mZnNldFg7CisJCQlwZS55ICs9IC11bml0WSAqIGYgLSBlbmRPZmZzZXRZOworCQkJCisJCQlyZXR1cm4gZnVuY3Rpb24oKQorCQkJeworCQkJCWNhbnZhcy5iZWdpbigpOworCQkJCWNhbnZhcy5tb3ZlVG8ocHQueCwgcHQueSk7CisJCQkJY2FudmFzLmxpbmVUbyhwdC54IC0gdW5pdFggLSB1bml0WSAvIHdpZHRoRmFjdG9yLCBwdC55IC0gdW5pdFkgKyB1bml0WCAvIHdpZHRoRmFjdG9yKTsKKwkJCQorCQkJCWlmICh0eXBlID09IG14Q29uc3RhbnRzLkFSUk9XX0NMQVNTSUMgfHwgdHlwZSA9PSBteENvbnN0YW50cy5BUlJPV19DTEFTU0lDX1RISU4pCisJCQkJeworCQkJCQljYW52YXMubGluZVRvKHB0LnggLSB1bml0WCAqIDMgLyA0LCBwdC55IC0gdW5pdFkgKiAzIC8gNCk7CisJCQkJfQorCQkJCisJCQkJY2FudmFzLmxpbmVUbyhwdC54ICsgdW5pdFkgLyB3aWR0aEZhY3RvciAtIHVuaXRYLCBwdC55IC0gdW5pdFkgLSB1bml0WCAvIHdpZHRoRmFjdG9yKTsKKwkJCQljYW52YXMuY2xvc2UoKTsKKwkKKwkJCQlpZiAoZmlsbGVkKQorCQkJCXsKKwkJCQkJY2FudmFzLmZpbGxBbmRTdHJva2UoKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJY2FudmFzLnN0cm9rZSgpOworCQkJCX0KKwkJCX07CisJCX0KKwl9OworCQorCW14TWFya2VyLmFkZE1hcmtlcignY2xhc3NpYycsIGNyZWF0ZUFycm93KDIpKTsKKwlteE1hcmtlci5hZGRNYXJrZXIoJ2NsYXNzaWNUaGluJywgY3JlYXRlQXJyb3coMykpOworCW14TWFya2VyLmFkZE1hcmtlcignYmxvY2snLCBjcmVhdGVBcnJvdygyKSk7CisJbXhNYXJrZXIuYWRkTWFya2VyKCdibG9ja1RoaW4nLCBjcmVhdGVBcnJvdygzKSk7CisJCisJZnVuY3Rpb24gY3JlYXRlT3BlbkFycm93KHdpZHRoRmFjdG9yKQorCXsKKwkJd2lkdGhGYWN0b3IgPSAod2lkdGhGYWN0b3IgIT0gbnVsbCkgPyB3aWR0aEZhY3RvciA6IDI7CisJCQorCQlyZXR1cm4gZnVuY3Rpb24oY2FudmFzLCBzaGFwZSwgdHlwZSwgcGUsIHVuaXRYLCB1bml0WSwgc2l6ZSwgc291cmNlLCBzdywgZmlsbGVkKQorCQl7CisJCQkvLyBUaGUgYW5nbGUgb2YgdGhlIGZvcndhcmQgZmFjaW5nIGFycm93IHNpZGVzIGFnYWluc3QgdGhlIHggYXhpcyBpcworCQkJLy8gMjYuNTY1IGRlZ3JlZXMsIDEvc2luKDI2LjU2NSkgPSAyLjIzNiAvIDIgPSAxLjExOCAoIC8gMiBhbGxvd3MgZm9yCisJCQkvLyBvbmx5IGhhbGYgdGhlIHN0cm9rZXdpZHRoIGlzIHByb2Nlc3NlZCApLgorCQkJdmFyIGVuZE9mZnNldFggPSB1bml0WCAqIHN3ICogMS4xMTg7CisJCQl2YXIgZW5kT2Zmc2V0WSA9IHVuaXRZICogc3cgKiAxLjExODsKKwkJCQorCQkJdW5pdFggPSB1bml0WCAqIChzaXplICsgc3cpOworCQkJdW5pdFkgPSB1bml0WSAqIChzaXplICsgc3cpOworCQkJCisJCQl2YXIgcHQgPSBwZS5jbG9uZSgpOworCQkJcHQueCAtPSBlbmRPZmZzZXRYOworCQkJcHQueSAtPSBlbmRPZmZzZXRZOworCQkJCisJCQlwZS54ICs9IC1lbmRPZmZzZXRYICogMjsKKwkJCXBlLnkgKz0gLWVuZE9mZnNldFkgKiAyOworCisJCQlyZXR1cm4gZnVuY3Rpb24oKQorCQkJeworCQkJCWNhbnZhcy5iZWdpbigpOworCQkJCWNhbnZhcy5tb3ZlVG8ocHQueCAtIHVuaXRYIC0gdW5pdFkgLyB3aWR0aEZhY3RvciwgcHQueSAtIHVuaXRZICsgdW5pdFggLyB3aWR0aEZhY3Rvcik7CisJCQkJY2FudmFzLmxpbmVUbyhwdC54LCBwdC55KTsKKwkJCQljYW52YXMubGluZVRvKHB0LnggKyB1bml0WSAvIHdpZHRoRmFjdG9yIC0gdW5pdFgsIHB0LnkgLSB1bml0WSAtIHVuaXRYIC8gd2lkdGhGYWN0b3IpOworCQkJCWNhbnZhcy5zdHJva2UoKTsKKwkJCX07CisJCX0KKwl9OworCQorCW14TWFya2VyLmFkZE1hcmtlcignb3BlbicsIGNyZWF0ZU9wZW5BcnJvdygyKSk7CisJbXhNYXJrZXIuYWRkTWFya2VyKCdvcGVuVGhpbicsIGNyZWF0ZU9wZW5BcnJvdygzKSk7CisJCisJbXhNYXJrZXIuYWRkTWFya2VyKCdvdmFsJywgZnVuY3Rpb24oY2FudmFzLCBzaGFwZSwgdHlwZSwgcGUsIHVuaXRYLCB1bml0WSwgc2l6ZSwgc291cmNlLCBzdywgZmlsbGVkKQorCXsKKwkJdmFyIGEgPSBzaXplIC8gMjsKKwkJCisJCXZhciBwdCA9IHBlLmNsb25lKCk7CisJCXBlLnggLT0gdW5pdFggKiBhOworCQlwZS55IC09IHVuaXRZICogYTsKKworCQlyZXR1cm4gZnVuY3Rpb24oKQorCQl7CisJCQljYW52YXMuZWxsaXBzZShwdC54IC0gYSwgcHQueSAtIGEsIHNpemUsIHNpemUpOworCQkJCQkJCisJCQlpZiAoZmlsbGVkKQorCQkJeworCQkJCWNhbnZhcy5maWxsQW5kU3Ryb2tlKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJY2FudmFzLnN0cm9rZSgpOworCQkJfQorCQl9OworCX0pOworCisJZnVuY3Rpb24gZGlhbW9uZChjYW52YXMsIHNoYXBlLCB0eXBlLCBwZSwgdW5pdFgsIHVuaXRZLCBzaXplLCBzb3VyY2UsIHN3LCBmaWxsZWQpCisJeworCQkvLyBUaGUgYW5nbGUgb2YgdGhlIGZvcndhcmQgZmFjaW5nIGFycm93IHNpZGVzIGFnYWluc3QgdGhlIHggYXhpcyBpcworCQkvLyA0NSBkZWdyZWVzLCAxL3Npbig0NSkgPSAxLjQxNDIgLyAyID0gMC43MDcxICggLyAyIGFsbG93cyBmb3IKKwkJLy8gb25seSBoYWxmIHRoZSBzdHJva2V3aWR0aCBpcyBwcm9jZXNzZWQgKS4gT3IgMC45ODYyIGZvciB0aGluIGRpYW1vbmQuCisJCS8vIE5vdGUgdGhlc2UgdmFsdWVzIGFuZCB0aGUgdGsgdmFyaWFibGUgYmVsb3cgYXJlIGRlcGVuZGVudCwgdXBkYXRlCisJCS8vIGJvdGggdG9nZXRoZXIgKHNhdmVzIHRyaWcgaGFyZCBjb2RpbmcgaXQpLgorCQl2YXIgc3dGYWN0b3IgPSAodHlwZSA9PSBteENvbnN0YW50cy5BUlJPV19ESUFNT05EKSA/ICAwLjcwNzEgOiAwLjk4NjI7CisJCXZhciBlbmRPZmZzZXRYID0gdW5pdFggKiBzdyAqIHN3RmFjdG9yOworCQl2YXIgZW5kT2Zmc2V0WSA9IHVuaXRZICogc3cgKiBzd0ZhY3RvcjsKKwkJCisJCXVuaXRYID0gdW5pdFggKiAoc2l6ZSArIHN3KTsKKwkJdW5pdFkgPSB1bml0WSAqIChzaXplICsgc3cpOworCQkKKwkJdmFyIHB0ID0gcGUuY2xvbmUoKTsKKwkJcHQueCAtPSBlbmRPZmZzZXRYOworCQlwdC55IC09IGVuZE9mZnNldFk7CisJCQorCQlwZS54ICs9IC11bml0WCAtIGVuZE9mZnNldFg7CisJCXBlLnkgKz0gLXVuaXRZIC0gZW5kT2Zmc2V0WTsKKwkJCisJCS8vIHRoaWNrbmVzcyBmYWN0b3IgZm9yIGRpYW1vbmQKKwkJdmFyIHRrID0gKCh0eXBlID09IG14Q29uc3RhbnRzLkFSUk9XX0RJQU1PTkQpID8gIDIgOiAzLjQpOworCQkKKwkJcmV0dXJuIGZ1bmN0aW9uKCkKKwkJeworCQkJY2FudmFzLmJlZ2luKCk7CisJCQljYW52YXMubW92ZVRvKHB0LngsIHB0LnkpOworCQkJY2FudmFzLmxpbmVUbyhwdC54IC0gdW5pdFggLyAyIC0gdW5pdFkgLyB0aywgcHQueSArIHVuaXRYIC8gdGsgLSB1bml0WSAvIDIpOworCQkJY2FudmFzLmxpbmVUbyhwdC54IC0gdW5pdFgsIHB0LnkgLSB1bml0WSk7CisJCQljYW52YXMubGluZVRvKHB0LnggLSB1bml0WCAvIDIgKyB1bml0WSAvIHRrLCBwdC55IC0gdW5pdFkgLyAyIC0gdW5pdFggLyB0ayk7CisJCQljYW52YXMuY2xvc2UoKTsKKwkJCQorCQkJaWYgKGZpbGxlZCkKKwkJCXsKKwkJCQljYW52YXMuZmlsbEFuZFN0cm9rZSgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWNhbnZhcy5zdHJva2UoKTsKKwkJCX0KKwkJfTsKKwl9OworCisJbXhNYXJrZXIuYWRkTWFya2VyKCdkaWFtb25kJywgZGlhbW9uZCk7CisJbXhNYXJrZXIuYWRkTWFya2VyKCdkaWFtb25kVGhpbicsIGRpYW1vbmQpOworfSkoKTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teFBvbHlsaW5lLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214UG9seWxpbmUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0ZTg5NgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teFBvbHlsaW5lLmpzCkBAIC0wLDAgKzEsMTI3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFBvbHlsaW5lCisgKgorICogRXh0ZW5kcyA8bXhTaGFwZT4gdG8gaW1wbGVtZW50IGEgcG9seWxpbmUgKGEgbGluZSB3aXRoIG11bHRpcGxlIHBvaW50cykuCisgKiBUaGlzIHNoYXBlIGlzIHJlZ2lzdGVyZWQgdW5kZXIgPG14Q29uc3RhbnRzLlNIQVBFX1BPTFlMSU5FPiBpbgorICogPG14Q2VsbFJlbmRlcmVyPi4KKyAqIAorICogQ29uc3RydWN0b3I6IG14UG9seWxpbmUKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IHBvbHlsaW5lIHNoYXBlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwb2ludHMgLSBBcnJheSBvZiA8bXhQb2ludHM+IHRoYXQgZGVmaW5lIHRoZSBwb2ludHMuIFRoaXMgaXMgc3RvcmVkIGluCisgKiA8bXhTaGFwZS5wb2ludHM+LgorICogc3Ryb2tlIC0gU3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgc3Ryb2tlIGNvbG9yLiBEZWZhdWx0IGlzICdibGFjaycuIFRoaXMgaXMKKyAqIHN0b3JlZCBpbiA8c3Ryb2tlPi4KKyAqIHN0cm9rZXdpZHRoIC0gT3B0aW9uYWwgaW50ZWdlciB0aGF0IGRlZmluZXMgdGhlIHN0cm9rZSB3aWR0aC4gRGVmYXVsdCBpcworICogMS4gVGhpcyBpcyBzdG9yZWQgaW4gPHN0cm9rZXdpZHRoPi4KKyAqLworZnVuY3Rpb24gbXhQb2x5bGluZShwb2ludHMsIHN0cm9rZSwgc3Ryb2tld2lkdGgpCit7CisJbXhTaGFwZS5jYWxsKHRoaXMpOworCXRoaXMucG9pbnRzID0gcG9pbnRzOworCXRoaXMuc3Ryb2tlID0gc3Ryb2tlOworCXRoaXMuc3Ryb2tld2lkdGggPSAoc3Ryb2tld2lkdGggIT0gbnVsbCkgPyBzdHJva2V3aWR0aCA6IDE7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhTaGFwZS4KKyAqLworbXhVdGlscy5leHRlbmQobXhQb2x5bGluZSwgbXhTaGFwZSk7CisKKy8qKgorICogRnVuY3Rpb246IGdldFJvdGF0aW9uCisgKiAKKyAqIFJldHVybnMgMC4KKyAqLworbXhQb2x5bGluZS5wcm90b3R5cGUuZ2V0Um90YXRpb24gPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTaGFwZVJvdGF0aW9uCisgKiAKKyAqIFJldHVybnMgMC4KKyAqLworbXhQb2x5bGluZS5wcm90b3R5cGUuZ2V0U2hhcGVSb3RhdGlvbiA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gMDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzUGFpbnRCb3VuZHNJbnZlcnRlZAorICogCisgKiBSZXR1cm5zIGZhbHNlLgorICovCitteFBvbHlsaW5lLnByb3RvdHlwZS5pc1BhaW50Qm91bmRzSW52ZXJ0ZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcGFpbnRFZGdlU2hhcGUKKyAqIAorICogUGFpbnRzIHRoZSBsaW5lIHNoYXBlLgorICovCitteFBvbHlsaW5lLnByb3RvdHlwZS5wYWludEVkZ2VTaGFwZSA9IGZ1bmN0aW9uKGMsIHB0cykKK3sKKwlpZiAodGhpcy5zdHlsZSA9PSBudWxsIHx8IHRoaXMuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfQ1VSVkVEXSAhPSAxKQorCXsKKwkJdGhpcy5wYWludExpbmUoYywgcHRzLCB0aGlzLmlzUm91bmRlZCk7CisJfQorCWVsc2UKKwl7CisJCXRoaXMucGFpbnRDdXJ2ZWRMaW5lKGMsIHB0cyk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcGFpbnRMaW5lCisgKiAKKyAqIFBhaW50cyB0aGUgbGluZSBzaGFwZS4KKyAqLworbXhQb2x5bGluZS5wcm90b3R5cGUucGFpbnRMaW5lID0gZnVuY3Rpb24oYywgcHRzLCByb3VuZGVkKQoreworCXZhciBhcmNTaXplID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9BUkNTSVpFLCBteENvbnN0YW50cy5MSU5FX0FSQ1NJWkUpIC8gMjsKKwljLmJlZ2luKCk7CisJdGhpcy5hZGRQb2ludHMoYywgcHRzLCByb3VuZGVkLCBhcmNTaXplLCBmYWxzZSk7CisJYy5zdHJva2UoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHBhaW50TGluZQorICogCisgKiBQYWludHMgdGhlIGxpbmUgc2hhcGUuCisgKi8KK214UG9seWxpbmUucHJvdG90eXBlLnBhaW50Q3VydmVkTGluZSA9IGZ1bmN0aW9uKGMsIHB0cykKK3sKKwljLmJlZ2luKCk7CisJCisJdmFyIHB0ID0gcHRzWzBdOworCXZhciBuID0gcHRzLmxlbmd0aDsKKwkKKwljLm1vdmVUbyhwdC54LCBwdC55KTsKKwkKKwlmb3IgKHZhciBpID0gMTsgaSA8IG4gLSAyOyBpKyspCisJeworCQl2YXIgcDAgPSBwdHNbaV07CisJCXZhciBwMSA9IHB0c1tpICsgMV07CisJCXZhciBpeCA9IChwMC54ICsgcDEueCkgLyAyOworCQl2YXIgaXkgPSAocDAueSArIHAxLnkpIC8gMjsKKwkJCisJCWMucXVhZFRvKHAwLngsIHAwLnksIGl4LCBpeSk7CisJfQorCQorCXZhciBwMCA9IHB0c1tuIC0gMl07CisJdmFyIHAxID0gcHRzW24gLSAxXTsKKwkKKwljLnF1YWRUbyhwMC54LCBwMC55LCBwMS54LCBwMS55KTsKKwljLnN0cm9rZSgpOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teFJlY3RhbmdsZVNoYXBlLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214UmVjdGFuZ2xlU2hhcGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE2MWU0YgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teFJlY3RhbmdsZVNoYXBlLmpzCkBAIC0wLDAgKzEsMTE3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFJlY3RhbmdsZVNoYXBlCisgKgorICogRXh0ZW5kcyA8bXhTaGFwZT4gdG8gaW1wbGVtZW50IGEgcmVjdGFuZ2xlIHNoYXBlLgorICogVGhpcyBzaGFwZSBpcyByZWdpc3RlcmVkIHVuZGVyIDxteENvbnN0YW50cy5TSEFQRV9SRUNUQU5HTEU+CisgKiBpbiA8bXhDZWxsUmVuZGVyZXI+LgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhSZWN0YW5nbGVTaGFwZQorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgcmVjdGFuZ2xlIHNoYXBlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBib3VuZHMgLSA8bXhSZWN0YW5nbGU+IHRoYXQgZGVmaW5lcyB0aGUgYm91bmRzLiBUaGlzIGlzIHN0b3JlZCBpbgorICogPG14U2hhcGUuYm91bmRzPi4KKyAqIGZpbGwgLSBTdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBmaWxsIGNvbG9yLiBUaGlzIGlzIHN0b3JlZCBpbiA8ZmlsbD4uCisgKiBzdHJva2UgLSBTdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBzdHJva2UgY29sb3IuIFRoaXMgaXMgc3RvcmVkIGluIDxzdHJva2U+LgorICogc3Ryb2tld2lkdGggLSBPcHRpb25hbCBpbnRlZ2VyIHRoYXQgZGVmaW5lcyB0aGUgc3Ryb2tlIHdpZHRoLiBEZWZhdWx0IGlzCisgKiAxLiBUaGlzIGlzIHN0b3JlZCBpbiA8c3Ryb2tld2lkdGg+LgorICovCitmdW5jdGlvbiBteFJlY3RhbmdsZVNoYXBlKGJvdW5kcywgZmlsbCwgc3Ryb2tlLCBzdHJva2V3aWR0aCkKK3sKKwlteFNoYXBlLmNhbGwodGhpcyk7CisJdGhpcy5ib3VuZHMgPSBib3VuZHM7CisJdGhpcy5maWxsID0gZmlsbDsKKwl0aGlzLnN0cm9rZSA9IHN0cm9rZTsKKwl0aGlzLnN0cm9rZXdpZHRoID0gKHN0cm9rZXdpZHRoICE9IG51bGwpID8gc3Ryb2tld2lkdGggOiAxOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14U2hhcGUuCisgKi8KK214VXRpbHMuZXh0ZW5kKG14UmVjdGFuZ2xlU2hhcGUsIG14U2hhcGUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0h0bWxBbGxvd2VkCisgKgorICogUmV0dXJucyB0cnVlIGZvciBub24tcm91bmRlZCwgbm9uLXJvdGF0ZWQgc2hhcGVzIHdpdGggbm8gZ2xhc3MgZ3JhZGllbnQuCisgKi8KK214UmVjdGFuZ2xlU2hhcGUucHJvdG90eXBlLmlzSHRtbEFsbG93ZWQgPSBmdW5jdGlvbigpCit7CisJdmFyIGV2ZW50cyA9IHRydWU7CisJCisJaWYgKHRoaXMuc3R5bGUgIT0gbnVsbCkKKwl7CisJCWV2ZW50cyA9IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfUE9JTlRFUl9FVkVOVFMsICcxJykgPT0gJzEnOwkJCisJfQorCQorCXJldHVybiAhdGhpcy5pc1JvdW5kZWQgJiYgIXRoaXMuZ2xhc3MgJiYgdGhpcy5yb3RhdGlvbiA9PSAwICYmIChldmVudHMgfHwKKwkJKHRoaXMuZmlsbCAhPSBudWxsICYmIHRoaXMuZmlsbCAhPSBteENvbnN0YW50cy5OT05FKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBwYWludEJhY2tncm91bmQKKyAqIAorICogR2VuZXJpYyBiYWNrZ3JvdW5kIHBhaW50aW5nIGltcGxlbWVudGF0aW9uLgorICovCitteFJlY3RhbmdsZVNoYXBlLnByb3RvdHlwZS5wYWludEJhY2tncm91bmQgPSBmdW5jdGlvbihjLCB4LCB5LCB3LCBoKQoreworCXZhciBldmVudHMgPSB0cnVlOworCQorCWlmICh0aGlzLnN0eWxlICE9IG51bGwpCisJeworCQlldmVudHMgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1BPSU5URVJfRVZFTlRTLCAnMScpID09ICcxJzsJCQorCX0KKwkKKwlpZiAoZXZlbnRzIHx8ICh0aGlzLmZpbGwgIT0gbnVsbCAmJiB0aGlzLmZpbGwgIT0gbXhDb25zdGFudHMuTk9ORSkgfHwKKwkJKHRoaXMuc3Ryb2tlICE9IG51bGwgJiYgdGhpcy5zdHJva2UgIT0gbXhDb25zdGFudHMuTk9ORSkpCisJeworCQlpZiAoIWV2ZW50cyAmJiAodGhpcy5maWxsID09IG51bGwgfHwgdGhpcy5maWxsID09IG14Q29uc3RhbnRzLk5PTkUpKQorCQl7CisJCQljLnBvaW50ZXJFdmVudHMgPSBmYWxzZTsKKwkJfQorCQkKKwkJaWYgKHRoaXMuaXNSb3VuZGVkKQorCQl7CisJCQl2YXIgciA9IDA7CisJCQkKKwkJCWlmIChteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0FCU09MVVRFX0FSQ1NJWkUsIDApID09ICcxJykKKwkJCXsKKwkJCQlyID0gTWF0aC5taW4odyAvIDIsIE1hdGgubWluKGggLyAyLCBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsCisJCQkJCW14Q29uc3RhbnRzLlNUWUxFX0FSQ1NJWkUsIG14Q29uc3RhbnRzLkxJTkVfQVJDU0laRSkgLyAyKSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdmFyIGYgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0FSQ1NJWkUsCisJCQkJCW14Q29uc3RhbnRzLlJFQ1RBTkdMRV9ST1VORElOR19GQUNUT1IgKiAxMDApIC8gMTAwOworCQkJCXIgPSBNYXRoLm1pbih3ICogZiwgaCAqIGYpOworCQkJfQorCQkJCisJCQljLnJvdW5kcmVjdCh4LCB5LCB3LCBoLCByLCByKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWMucmVjdCh4LCB5LCB3LCBoKTsKKwkJfQorCQkJCisJCWMuZmlsbEFuZFN0cm9rZSgpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHBhaW50Rm9yZWdyb3VuZAorICogCisgKiBHZW5lcmljIGJhY2tncm91bmQgcGFpbnRpbmcgaW1wbGVtZW50YXRpb24uCisgKi8KK214UmVjdGFuZ2xlU2hhcGUucHJvdG90eXBlLnBhaW50Rm9yZWdyb3VuZCA9IGZ1bmN0aW9uKGMsIHgsIHksIHcsIGgpCit7CisJaWYgKHRoaXMuZ2xhc3MgJiYgIXRoaXMub3V0bGluZSAmJiB0aGlzLmZpbGwgIT0gbnVsbCAmJiB0aGlzLmZpbGwgIT0gbXhDb25zdGFudHMuTk9ORSkKKwl7CisJCXRoaXMucGFpbnRHbGFzc0VmZmVjdChjLCB4LCB5LCB3LCBoLCB0aGlzLmdldEFyY1NpemUodyArIHRoaXMuc3Ryb2tld2lkdGgsIGggKyB0aGlzLnN0cm9rZXdpZHRoKSk7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teFJob21idXMuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhSaG9tYnVzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYzI5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhSaG9tYnVzLmpzCkBAIC0wLDAgKzEsNTQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14UmhvbWJ1cworICoKKyAqIEV4dGVuZHMgPG14U2hhcGU+IHRvIGltcGxlbWVudCBhIHJob21idXMgKGFrYSBkaWFtb25kKSBzaGFwZS4KKyAqIFRoaXMgc2hhcGUgaXMgcmVnaXN0ZXJlZCB1bmRlciA8bXhDb25zdGFudHMuU0hBUEVfUkhPTUJVUz4KKyAqIGluIDxteENlbGxSZW5kZXJlcj4uCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteFJob21idXMKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IHJob21idXMgc2hhcGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGJvdW5kcyAtIDxteFJlY3RhbmdsZT4gdGhhdCBkZWZpbmVzIHRoZSBib3VuZHMuIFRoaXMgaXMgc3RvcmVkIGluCisgKiA8bXhTaGFwZS5ib3VuZHM+LgorICogZmlsbCAtIFN0cmluZyB0aGF0IGRlZmluZXMgdGhlIGZpbGwgY29sb3IuIFRoaXMgaXMgc3RvcmVkIGluIDxmaWxsPi4KKyAqIHN0cm9rZSAtIFN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHN0cm9rZSBjb2xvci4gVGhpcyBpcyBzdG9yZWQgaW4gPHN0cm9rZT4uCisgKiBzdHJva2V3aWR0aCAtIE9wdGlvbmFsIGludGVnZXIgdGhhdCBkZWZpbmVzIHRoZSBzdHJva2Ugd2lkdGguIERlZmF1bHQgaXMKKyAqIDEuIFRoaXMgaXMgc3RvcmVkIGluIDxzdHJva2V3aWR0aD4uCisgKi8KK2Z1bmN0aW9uIG14UmhvbWJ1cyhib3VuZHMsIGZpbGwsIHN0cm9rZSwgc3Ryb2tld2lkdGgpCit7CisJbXhTaGFwZS5jYWxsKHRoaXMpOworCXRoaXMuYm91bmRzID0gYm91bmRzOworCXRoaXMuZmlsbCA9IGZpbGw7CisJdGhpcy5zdHJva2UgPSBzdHJva2U7CisJdGhpcy5zdHJva2V3aWR0aCA9IChzdHJva2V3aWR0aCAhPSBudWxsKSA/IHN0cm9rZXdpZHRoIDogMTsKK307CisKKy8qKgorICogRXh0ZW5kcyBteFNoYXBlLgorICovCitteFV0aWxzLmV4dGVuZChteFJob21idXMsIG14U2hhcGUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBwYWludFZlcnRleFNoYXBlCisgKiAKKyAqIEdlbmVyaWMgcGFpbnRpbmcgaW1wbGVtZW50YXRpb24uCisgKi8KK214UmhvbWJ1cy5wcm90b3R5cGUucGFpbnRWZXJ0ZXhTaGFwZSA9IGZ1bmN0aW9uKGMsIHgsIHksIHcsIGgpCit7CisJdmFyIGh3ID0gdyAvIDI7CisJdmFyIGhoID0gaCAvIDI7CisJCisJdmFyIGFyY1NpemUgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0FSQ1NJWkUsIG14Q29uc3RhbnRzLkxJTkVfQVJDU0laRSkgLyAyOworCWMuYmVnaW4oKTsKKwl0aGlzLmFkZFBvaW50cyhjLCBbbmV3IG14UG9pbnQoeCArIGh3LCB5KSwgbmV3IG14UG9pbnQoeCArIHcsIHkgKyBoaCksIG5ldyBteFBvaW50KHggKyBodywgeSArIGgpLAorCSAgICAgbmV3IG14UG9pbnQoeCwgeSArIGhoKV0sIHRoaXMuaXNSb3VuZGVkLCBhcmNTaXplLCB0cnVlKTsKKwljLmZpbGxBbmRTdHJva2UoKTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhTaGFwZS5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teFNoYXBlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNmQ2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhTaGFwZS5qcwpAQCAtMCwwICsxLDE2MDQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14U2hhcGUKKyAqCisgKiBCYXNlIGNsYXNzIGZvciBhbGwgc2hhcGVzLiBBIHNoYXBlIGluIG14R3JhcGggaXMgYQorICogc2VwYXJhdGUgaW1wbGVtZW50YXRpb24gZm9yIFNWRywgVk1MIGFuZCBIVE1MLiBXaGljaAorICogaW1wbGVtZW50YXRpb24gdG8gdXNlIGlzIGNvbnRyb2xsZWQgYnkgdGhlIDxkaWFsZWN0PgorICogcHJvcGVydHkgd2hpY2ggaXMgYXNzaWduZWQgZnJvbSB3aXRoaW4gdGhlIDxteENlbGxSZW5kZXJlcj4KKyAqIHdoZW4gdGhlIHNoYXBlIGlzIGNyZWF0ZWQuIFRoZSBkaWFsZWN0IG11c3QgYmUgYXNzaWduZWQKKyAqIGZvciBhIHNoYXBlLCBhbmQgaXQgZG9lcyBub3JtYWxseSBkZXBlbmQgb24gdGhlIGJyb3dzZXIgYW5kCisgKiB0aGUgY29uZml1cmF0aW9uIG9mIHRoZSBncmFwaCAoc2VlIDxteEdyYXBoPiByZW5kZXJpbmcgaGludCkuCisgKgorICogRm9yIGVhY2ggc3VwcG9ydGVkIHNoYXBlIGluIFNWRyBhbmQgVk1MLCBhIGNvcnJlc3BvbmRpbmcKKyAqIHNoYXBlIGV4aXN0cyBpbiBteEdyYXBoLCBuYW1lbHkgZm9yIHRleHQsIGltYWdlLCByZWN0YW5nbGUsCisgKiByaG9tYnVzLCBlbGxpcHNlIGFuZCBwb2x5bGluZS4gVGhlIG90aGVyIHNoYXBlcyBhcmUgYQorICogY29tYmluYXRpb24gb2YgdGhlc2Ugc2hhcGVzIChlZy4gbGFiZWwgYW5kIHN3aW1sYW5lKQorICogb3IgdGhleSBjb25zaXN0IG9mIG9uZSBvciBtb3JlIChmaWxsZWQpIHBhdGggb2JqZWN0cworICogKGVnLiBhY3RvciBhbmQgY3lsaW5kZXIpLiBUaGUgSFRNTCBpbXBsZW1lbnRhdGlvbiBpcworICogb3B0aW9uYWwgYnV0IG1heSBiZSByZXF1aXJlZCBmb3IgYSBIVE1MLW9ubHkgdmlldyBvZgorICogdGhlIGdyYXBoLgorICoKKyAqIEN1c3RvbSBTaGFwZXM6CisgKgorICogVG8gZXh0ZW5kIGZyb20gdGhpcyBjbGFzcywgdGhlIGJhc2ljIGNvZGUgbG9va3MgYXMgZm9sbG93cy4KKyAqIEluIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgdGhlIGN1c3RvbSBzaGFwZSBjb25zaXN0cyBvbmx5IG9mCisgKiBvbmUgZmlsbGVkIHJlZ2lvbiBvciBvbmUgZmlsbGVkIHJlZ2lvbiBhbmQgYW4gYWRkaXRpb25hbCBzdHJva2UKKyAqIHRoZSA8bXhBY3Rvcj4gYW5kIDxteEN5bGluZGVyPiBzaG91bGQgYmUgc3ViY2xhc3NlZCwKKyAqIHJlc3BlY3RpdmVseS4KKyAqCisgKiAoY29kZSkKKyAqIGZ1bmN0aW9uIEN1c3RvbVNoYXBlKCkgeyB9CisgKiAKKyAqIEN1c3RvbVNoYXBlLnByb3RvdHlwZSA9IG5ldyBteFNoYXBlKCk7CisgKiBDdXN0b21TaGFwZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdXN0b21TaGFwZTsgCisgKiAoZW5kKQorICoKKyAqIFRvIHJlZ2lzdGVyIGEgY3VzdG9tIHNoYXBlIGluIGFuIGV4aXN0aW5nIGdyYXBoIGluc3RhbmNlLAorICogb25lIG11c3QgcmVnaXN0ZXIgdGhlIHNoYXBlIHVuZGVyIGEgbmV3IG5hbWUgaW4gdGhlIGdyYXBoJ3MKKyAqIGNlbGwgcmVuZGVyZXIgYXMgZm9sbG93czoKKyAqCisgKiAoY29kZSkKKyAqIG14Q2VsbFJlbmRlcmVyLnJlZ2lzdGVyU2hhcGUoJ2N1c3RvbVNoYXBlJywgQ3VzdG9tU2hhcGUpOworICogKGVuZCkKKyAqCisgKiBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSBjb25zdHJ1Y3Rvci4KKyAqCisgKiBJbiBvcmRlciB0byB1c2UgdGhlIHNoYXBlIHlvdSBjYW4gcmVmZXIgdG8gdGhlIGdpdmVuIG5hbWUgYWJvdmUKKyAqIGluIGEgc3R5bGVzaGVldC4gRm9yIGV4YW1wbGUsIHRvIGNoYW5nZSB0aGUgc2hhcGUgZm9yIHRoZSBkZWZhdWx0CisgKiB2ZXJ0ZXggc3R5bGUsIHRoZSBmb2xsb3dpbmcgY29kZSBpcyB1c2VkOgorICoKKyAqIChjb2RlKQorICogdmFyIHN0eWxlID0gZ3JhcGguZ2V0U3R5bGVzaGVldCgpLmdldERlZmF1bHRWZXJ0ZXhTdHlsZSgpOworICogc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU0hBUEVdID0gJ2N1c3RvbVNoYXBlJzsKKyAqIChlbmQpCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteFNoYXBlCisgKgorICogQ29uc3RydWN0cyBhIG5ldyBzaGFwZS4KKyAqLworZnVuY3Rpb24gbXhTaGFwZShzdGVuY2lsKQoreworCXRoaXMuc3RlbmNpbCA9IHN0ZW5jaWw7CisJdGhpcy5pbml0U3R5bGVzKCk7Cit9OworCisvKioKKyAqIFZhcmlhYmxlOiBkaWFsZWN0CisgKgorICogSG9sZHMgdGhlIGRpYWxlY3QgaW4gd2hpY2ggdGhlIHNoYXBlIGlzIHRvIGJlIHBhaW50ZWQuCisgKiBUaGlzIGNhbiBiZSBvbmUgb2YgdGhlIERJQUxFQ1QgY29uc3RhbnRzIGluIDxteENvbnN0YW50cz4uCisgKi8KK214U2hhcGUucHJvdG90eXBlLmRpYWxlY3QgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzY2FsZQorICoKKyAqIEhvbGRzIHRoZSBzY2FsZSBpbiB3aGljaCB0aGUgc2hhcGUgaXMgYmVpbmcgcGFpbnRlZC4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUuc2NhbGUgPSAxOworCisvKioKKyAqIFZhcmlhYmxlOiBhbnRpQWxpYXMKKyAqIAorICogUmVuZGVyaW5nIGhpbnQgZm9yIGNvbmZpZ3VyaW5nIHRoZSBjYW52YXMuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmFudGlBbGlhcyA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGJvdW5kcworICoKKyAqIEhvbGRzIHRoZSA8bXhSZWN0YW5nbGU+IHRoYXQgc3BlY2lmaWVzIHRoZSBib3VuZHMgb2YgdGhpcyBzaGFwZS4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUuYm91bmRzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogcG9pbnRzCisgKgorICogSG9sZHMgdGhlIGFycmF5IG9mIDxteFBvaW50cz4gdGhhdCBzcGVjaWZ5IHRoZSBwb2ludHMgb2YgdGhpcyBzaGFwZS4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUucG9pbnRzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbm9kZQorICoKKyAqIEhvbGRzIHRoZSBvdXRlcm1vc3QgRE9NIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoaXMgc2hhcGUuCisgKi8KK214U2hhcGUucHJvdG90eXBlLm5vZGUgPSBudWxsOworIAorLyoqCisgKiBWYXJpYWJsZTogc3RhdGUKKyAqIAorICogT3B0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBjb3JyZXNwb25kaW5nIDxteENlbGxTdGF0ZT4uCisgKi8KK214U2hhcGUucHJvdG90eXBlLnN0YXRlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogc3R5bGUKKyAqCisgKiBPcHRpb25hbCByZWZlcmVuY2UgdG8gdGhlIHN0eWxlIG9mIHRoZSBjb3JyZXNwb25kaW5nIDxteENlbGxTdGF0ZT4uCisgKi8KK214U2hhcGUucHJvdG90eXBlLnN0eWxlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogYm91bmRpbmdCb3gKKyAqCisgKiBDb250YWlucyB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBzaGFwZSwgdGhhdCBpcywgdGhlIHNtYWxsZXN0IHJlY3RhbmdsZQorICogdGhhdCBpbmNsdWRlcyBhbGwgcGl4ZWxzIG9mIHRoZSBzaGFwZS4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUuYm91bmRpbmdCb3ggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzdGVuY2lsCisgKgorICogSG9sZHMgdGhlIDxteFN0ZW5jaWw+IHRoYXQgZGVmaW5lcyB0aGUgc2hhcGUuCisgKi8KK214U2hhcGUucHJvdG90eXBlLnN0ZW5jaWwgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzdmdTdHJva2VUb2xlcmFuY2UKKyAqCisgKiBFdmVudC10b2xlcmFuY2UgZm9yIFNWRyBzdHJva2VzIChpbiBweCkuIERlZmF1bHQgaXMgOC4gVGhpcyBpcyBvbmx5IHBhc3NlZAorICogdG8gdGhlIGNhbnZhcyBpbiA8Y3JlYXRlU3ZnQ2FudmFzPiBpZiA8cG9pbnRlckV2ZW50cz4gaXMgdHJ1ZS4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUuc3ZnU3Ryb2tlVG9sZXJhbmNlID0gODsKKworLyoqCisgKiBWYXJpYWJsZTogcG9pbnRlckV2ZW50cworICogCisgKiBTcGVjaWZpZXMgaWYgcG9pbnRlciBldmVudHMgc2hvdWxkIGJlIGhhbmRsZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUucG9pbnRlckV2ZW50cyA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHN2Z1BvaW50ZXJFdmVudHMKKyAqIAorICogU3BlY2lmaWVzIGlmIHBvaW50ZXIgZXZlbnRzIHNob3VsZCBiZSBoYW5kbGVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214U2hhcGUucHJvdG90eXBlLnN2Z1BvaW50ZXJFdmVudHMgPSAnYWxsJzsKKworLyoqCisgKiBWYXJpYWJsZTogc2hhcGVQb2ludGVyRXZlbnRzCisgKiAKKyAqIFNwZWNpZmllcyBpZiBwb2ludGVyIGV2ZW50cyBvdXRzaWRlIG9mIHNoYXBlIHNob3VsZCBiZSBoYW5kbGVkLiBEZWZhdWx0CisgKiBpcyBmYWxzZS4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUuc2hhcGVQb2ludGVyRXZlbnRzID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHN0ZW5jaWxQb2ludGVyRXZlbnRzCisgKiAKKyAqIFNwZWNpZmllcyBpZiBwb2ludGVyIGV2ZW50cyBvdXRzaWRlIG9mIHN0ZW5jaWxzIHNob3VsZCBiZSBoYW5kbGVkLiBEZWZhdWx0CisgKiBpcyBmYWxzZS4gU2V0IHRoaXMgdG8gdHJ1ZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgMS54IGJyYW5jaC4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUuc3RlbmNpbFBvaW50ZXJFdmVudHMgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogdm1sU2NhbGUKKyAqIAorICogU2NhbGUgZm9yIGltcHJvdmluZyB0aGUgcHJlY2lzaW9uIG9mIFZNTCByZW5kZXJpbmcuIERlZmF1bHQgaXMgMS4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUudm1sU2NhbGUgPSAxOworCisvKioKKyAqIFZhcmlhYmxlOiBvdXRsaW5lCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgc2hhcGUgc2hvdWxkIGJlIGRyYXduIGFzIGFuIG91dGxpbmUuIFRoaXMgZGlzYWJsZXMgYWxsCisgKiBmaWxsIGNvbG9ycyBhbmQgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBvdGhlciBkcmF3aW5nIHN0YXRlcyB0aGF0IHNob3VsZAorICogbm90IGJlIHBhaW50ZWQgZm9yIG91dGxpbmVzLiBEZWZhdWx0IGlzIGZhbHNlLiBUaGlzIHNob3VsZCBiZSBzZXQgYmVmb3JlCisgKiBjYWxsaW5nIDxhcHBseT4uCisgKi8KK214U2hhcGUucHJvdG90eXBlLm91dGxpbmUgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogdmlzaWJsZQorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIHNoYXBlIGlzIHZpc2libGUuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUudmlzaWJsZSA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHVzZVN2Z0JvdW5kaW5nQm94CisgKiAKKyAqIEFsbG93cyB0byB1c2UgdGhlIFNWRyBib3VuZGluZyBib3ggaW4gU1ZHLiBEZWZhdWx0IGlzIGZhbHNlIGZvciBwZXJmb3JtYW5jZQorICogcmVhc29ucy4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUudXNlU3ZnQm91bmRpbmdCb3ggPSBmYWxzZTsKKworLyoqCisgKiBGdW5jdGlvbjogaW5pdAorICoKKyAqIEluaXRpYWxpemVzIHRoZSBzaGFwZSBieSBjcmVhaW5nIHRoZSBET00gbm9kZSB1c2luZyA8Y3JlYXRlPgorICogYW5kIGFkZGluZyBpdCBpbnRvIHRoZSBnaXZlbiBjb250YWluZXIuCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBjb250YWluZXIgLSBET00gbm9kZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgc2hhcGUuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbihjb250YWluZXIpCit7CisJaWYgKHRoaXMubm9kZSA9PSBudWxsKQorCXsKKwkJdGhpcy5ub2RlID0gdGhpcy5jcmVhdGUoY29udGFpbmVyKTsKKwkJCisJCWlmIChjb250YWluZXIgIT0gbnVsbCkKKwkJeworCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMubm9kZSk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbml0U3R5bGVzCisgKgorICogU2V0cyB0aGUgc3R5bGVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICovCitteFNoYXBlLnByb3RvdHlwZS5pbml0U3R5bGVzID0gZnVuY3Rpb24oY29udGFpbmVyKQoreworCXRoaXMuc3Ryb2tld2lkdGggPSAxOworCXRoaXMucm90YXRpb24gPSAwOworCXRoaXMub3BhY2l0eSA9IDEwMDsKKwl0aGlzLmZpbGxPcGFjaXR5ID0gMTAwOworCXRoaXMuc3Ryb2tlT3BhY2l0eSA9IDEwMDsKKwl0aGlzLmZsaXBIID0gZmFsc2U7CisJdGhpcy5mbGlwViA9IGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNQYXJzZVZtbAorICogCisgKiBTcGVjaWZpZXMgaWYgYW55IFZNTCBzaG91bGQgYmUgYWRkZWQgdmlhIGluc2VydEFkamFjZW50SHRtbCB0byB0aGUgRE9NLiBUaGlzCisgKiBpcyBvbmx5IG5lZWRlZCBpbiBJRTggYW5kIG9ubHkgaWYgdGhlIHNoYXBlIGNvbnRhaW5zIFZNTCBtYXJrdXAuIFRoaXMgbWV0aG9kCisgKiByZXR1cm5zIHRydWUuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmlzUGFyc2VWbWwgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRydWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0h0bWxBbGxvd2VkCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiBIVE1MIGlzIGFsbG93ZWQgZm9yIHRoaXMgc2hhcGUuIFRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzCisgKiByZXR1cm5zIGZhbHNlLgorICovCitteFNoYXBlLnByb3RvdHlwZS5pc0h0bWxBbGxvd2VkID0gZnVuY3Rpb24oKQoreworCXJldHVybiBmYWxzZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFN2Z1NjcmVlbk9mZnNldAorICogCisgKiBSZXR1cm5zIDAsIG9yIDAuNSBpZiA8c3Ryb2tld2lkdGg+ICUgMiA9PSAxLgorICovCitteFNoYXBlLnByb3RvdHlwZS5nZXRTdmdTY3JlZW5PZmZzZXQgPSBmdW5jdGlvbigpCit7CisJdmFyIHN3ID0gdGhpcy5zdGVuY2lsICYmIHRoaXMuc3RlbmNpbC5zdHJva2V3aWR0aCAhPSAnaW5oZXJpdCcgPyBOdW1iZXIodGhpcy5zdGVuY2lsLnN0cm9rZXdpZHRoKSA6IHRoaXMuc3Ryb2tld2lkdGg7CisJCisJcmV0dXJuIChteFV0aWxzLm1vZChNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHN3ICogdGhpcy5zY2FsZSkpLCAyKSA9PSAxKSA/IDAuNSA6IDA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGUKKyAqCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBET00gbm9kZShzKSBmb3IgdGhlIHNoYXBlIGluCisgKiB0aGUgZ2l2ZW4gY29udGFpbmVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGludm9rZXMKKyAqIDxjcmVhdGVTdmc+LCA8Y3JlYXRlSHRtbD4gb3IgPGNyZWF0ZVZtbD4gZGVwZW5kaW5nCisgKiBvbiB0aGUgPGRpYWxlY3Q+IGFuZCBzdHlsZSBzZXR0aW5ncy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIGNvbnRhaW5lciAtIERPTSBub2RlIHRoYXQgd2lsbCBjb250YWluIHRoZSBzaGFwZS4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24oY29udGFpbmVyKQoreworCXZhciBub2RlID0gbnVsbDsKKwkKKwlpZiAoY29udGFpbmVyICE9IG51bGwgJiYgY29udGFpbmVyLm93bmVyU1ZHRWxlbWVudCAhPSBudWxsKQorCXsKKwkJbm9kZSA9IHRoaXMuY3JlYXRlU3ZnKGNvbnRhaW5lcik7CisJfQorCWVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSA4IHx8ICFteENsaWVudC5JU19WTUwgfHwKKwkJKHRoaXMuZGlhbGVjdCAhPSBteENvbnN0YW50cy5ESUFMRUNUX1ZNTCAmJiB0aGlzLmlzSHRtbEFsbG93ZWQoKSkpCisJeworCQlub2RlID0gdGhpcy5jcmVhdGVIdG1sKGNvbnRhaW5lcik7CisJfQorCWVsc2UKKwl7CisJCW5vZGUgPSB0aGlzLmNyZWF0ZVZtbChjb250YWluZXIpOworCX0KKwkKKwlyZXR1cm4gbm9kZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVN2ZworICoKKyAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIFNWRyBub2RlKHMpIHRvIHJlcHJlc2VudCB0aGlzIHNoYXBlLgorICovCitteFNoYXBlLnByb3RvdHlwZS5jcmVhdGVTdmcgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhteENvbnN0YW50cy5OU19TVkcsICdnJyk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVWbWwKKyAqCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBWTUwgbm9kZSB0byByZXByZXNlbnQgdGhpcyBzaGFwZS4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUuY3JlYXRlVm1sID0gZnVuY3Rpb24oKQoreworCXZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChteENsaWVudC5WTUxfUFJFRklYICsgJzpncm91cCcpOworCW5vZGUuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOworCQorCXJldHVybiBub2RlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlSHRtbAorICoKKyAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIEhUTUwgRE9NIG5vZGUocykgdG8gcmVwcmVzZW50CisgKiB0aGlzIHNoYXBlLiBUaGlzIGltcGxlbWVudGF0aW9uIGZhbGxzIGJhY2sgdG8gPGNyZWF0ZVZtbD4KKyAqIHNvIHRoYXQgdGhlIEhUTUwgY3JlYXRpb24gaXMgb3B0aW9uYWwuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmNyZWF0ZUh0bWwgPSBmdW5jdGlvbigpCit7CisJdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKwlub2RlLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKwkKKwlyZXR1cm4gbm9kZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlY29uZmlndXJlCisgKgorICogUmVjb25maWd1cmVzIHRoaXMgc2hhcGUuIFRoaXMgd2lsbCB1cGRhdGUgdGhlIGNvbG9ycyBldGMgaW4KKyAqIGFkZGl0aW9uIHRvIHRoZSBib3VuZHMgb3IgcG9pbnRzLgorICovCitteFNoYXBlLnByb3RvdHlwZS5yZWNvbmZpZ3VyZSA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnJlZHJhdygpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVkcmF3CisgKgorICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgU1ZHIG5vZGUocykgdG8gcmVwcmVzZW50IHRoaXMgc2hhcGUuCisgKi8KK214U2hhcGUucHJvdG90eXBlLnJlZHJhdyA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnVwZGF0ZUJvdW5kc0Zyb21Qb2ludHMoKTsKKwkKKwlpZiAodGhpcy52aXNpYmxlICYmIHRoaXMuY2hlY2tCb3VuZHMoKSkKKwl7CisJCXRoaXMubm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnOworCQl0aGlzLmNsZWFyKCk7CisJCQorCQlpZiAodGhpcy5ub2RlLm5vZGVOYW1lID09ICdESVYnICYmICh0aGlzLmlzSHRtbEFsbG93ZWQoKSB8fCAhbXhDbGllbnQuSVNfVk1MKSkKKwkJeworCQkJdGhpcy5yZWRyYXdIdG1sU2hhcGUoKTsKKwkJfQorCQllbHNlCisJCXsJCisJCQl0aGlzLnJlZHJhd1NoYXBlKCk7CisJCX0KKworCQl0aGlzLnVwZGF0ZUJvdW5kaW5nQm94KCk7CisJfQorCWVsc2UKKwl7CisJCXRoaXMubm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CisJCXRoaXMuYm91bmRpbmdCb3ggPSBudWxsOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGNsZWFyCisgKiAKKyAqIFJlbW92ZXMgYWxsIGNoaWxkIG5vZGVzIGFuZCByZXNldHMgYWxsIENTUy4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMubm9kZS5vd25lclNWR0VsZW1lbnQgIT0gbnVsbCkKKwl7CisJCXdoaWxlICh0aGlzLm5vZGUubGFzdENoaWxkICE9IG51bGwpCisJCXsKKwkJCXRoaXMubm9kZS5yZW1vdmVDaGlsZCh0aGlzLm5vZGUubGFzdENoaWxkKTsKKwkJfQorCX0KKwllbHNlCisJeworCQl0aGlzLm5vZGUuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjphYnNvbHV0ZTsnICsgKCh0aGlzLmN1cnNvciAhPSBudWxsKSA/CisJCQkoJ2N1cnNvcjonICsgdGhpcy5jdXJzb3IgKyAnOycpIDogJycpOworCQl0aGlzLm5vZGUuaW5uZXJIVE1MID0gJyc7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlQm91bmRzRnJvbVBvaW50cworICogCisgKiBVcGRhdGVzIHRoZSBib3VuZHMgYmFzZWQgb24gdGhlIHBvaW50cy4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUudXBkYXRlQm91bmRzRnJvbVBvaW50cyA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgcHRzID0gdGhpcy5wb2ludHM7CisJCisJaWYgKHB0cyAhPSBudWxsICYmIHB0cy5sZW5ndGggPiAwICYmIHB0c1swXSAhPSBudWxsKQorCXsKKwkJdGhpcy5ib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUoTnVtYmVyKHB0c1swXS54KSwgTnVtYmVyKHB0c1swXS55KSwgMSwgMSk7CisJCQorCQlmb3IgKHZhciBpID0gMTsgaSA8IHRoaXMucG9pbnRzLmxlbmd0aDsgaSsrKQorCQl7CisJCQlpZiAocHRzW2ldICE9IG51bGwpCisJCQl7CisJCQkJdGhpcy5ib3VuZHMuYWRkKG5ldyBteFJlY3RhbmdsZShOdW1iZXIocHRzW2ldLngpLCBOdW1iZXIocHRzW2ldLnkpLCAxLCAxKSk7CisJCQl9CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRMYWJlbEJvdW5kcworICogCisgKiBSZXR1cm5zIHRoZSA8bXhSZWN0YW5nbGU+IGZvciB0aGUgbGFiZWwgYm91bmRzIG9mIHRoaXMgc2hhcGUsIGJhc2VkIG9uIHRoZQorICogZ2l2ZW4gc2NhbGVkIGFuZCB0cmFuc2xhdGVkIGJvdW5kcyBvZiB0aGUgc2hhcGUuIFRoaXMgbWV0aG9kIHNob3VsZCBub3QKKyAqIGNoYW5nZSB0aGUgcmVjdGFuZ2xlIGluLXBsYWNlLiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIGdpdmVuIHJlY3QuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmdldExhYmVsQm91bmRzID0gZnVuY3Rpb24ocmVjdCkKK3sKKwl2YXIgZCA9IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfRElSRUNUSU9OLCBteENvbnN0YW50cy5ESVJFQ1RJT05fRUFTVCk7CisJdmFyIGJvdW5kcyA9IHJlY3Q7CisJCisJLy8gTm9ybWFsaXplcyBhcmd1bWVudCBmb3IgZ2V0TGFiZWxNYXJnaW5zIGhvb2sKKwlpZiAoZCAhPSBteENvbnN0YW50cy5ESVJFQ1RJT05fU09VVEggJiYgZCAhPSBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEggJiYKKwkJdGhpcy5zdGF0ZSAhPSBudWxsICYmIHRoaXMuc3RhdGUudGV4dCAhPSBudWxsICYmCisJCXRoaXMuc3RhdGUudGV4dC5pc1BhaW50Qm91bmRzSW52ZXJ0ZWQoKSkKKwl7CisJCWJvdW5kcyA9IGJvdW5kcy5jbG9uZSgpOworCQl2YXIgdG1wID0gYm91bmRzLndpZHRoOworCQlib3VuZHMud2lkdGggPSBib3VuZHMuaGVpZ2h0OworCQlib3VuZHMuaGVpZ2h0ID0gdG1wOworCX0KKwkJCisJdmFyIG0gPSB0aGlzLmdldExhYmVsTWFyZ2lucyhib3VuZHMpOworCQorCWlmIChtICE9IG51bGwpCisJeworCQl2YXIgZmxpcEggPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0ZMSVBILCBmYWxzZSkgPT0gJzEnOworCQl2YXIgZmxpcFYgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0ZMSVBWLCBmYWxzZSkgPT0gJzEnOworCQkKKwkJLy8gSGFuZGxlcyBzcGVjaWFsIGNhc2UgZm9yIHZlcnRpY2FsIGxhYmVscworCQlpZiAodGhpcy5zdGF0ZSAhPSBudWxsICYmIHRoaXMuc3RhdGUudGV4dCAhPSBudWxsICYmCisJCQl0aGlzLnN0YXRlLnRleHQuaXNQYWludEJvdW5kc0ludmVydGVkKCkpCisJCXsKKwkJCXZhciB0bXAgPSBtLng7CisJCQltLnggPSBtLmhlaWdodDsKKwkJCW0uaGVpZ2h0ID0gbS53aWR0aDsKKwkJCW0ud2lkdGggPSBtLnk7CisJCQltLnkgPSB0bXA7CisKKwkJCXRtcCA9IGZsaXBIOworCQkJZmxpcEggPSBmbGlwVjsKKwkJCWZsaXBWID0gdG1wOworCQl9CisJCQorCQlyZXR1cm4gbXhVdGlscy5nZXREaXJlY3RlZEJvdW5kcyhyZWN0LCBtLCB0aGlzLnN0eWxlLCBmbGlwSCwgZmxpcFYpOworCX0KKwkKKwlyZXR1cm4gcmVjdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldExhYmVsTWFyZ2lucworICogCisgKiBSZXR1cm5zIHRoZSBzY2FsZWQgdG9wLCBsZWZ0LCBib3R0b20gYW5kIHJpZ2h0IG1hcmdpbiB0byBiZSB1c2VkIGZvcgorICogY29tcHV0aW5nIHRoZSBsYWJlbCBib3VuZHMgYXMgYW4gPG14UmVjdGFuZ2xlPiwgd2hlcmUgdGhlIGJvdHRvbSBhbmQgcmlnaHQKKyAqIG1hcmdpbiBhcmUgZGVmaW5lZCBpbiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLCByZXNwZWN0aXZlbHkuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmdldExhYmVsTWFyZ2lucz0gZnVuY3Rpb24ocmVjdCkKK3sKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNoZWNrQm91bmRzCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYm91bmRzIGFyZSBub3QgbnVsbCBhbmQgYWxsIG9mIGl0cyB2YXJpYWJsZXMgYXJlIG51bWVyaWMuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmNoZWNrQm91bmRzID0gZnVuY3Rpb24oKQoreworCXJldHVybiAoIWlzTmFOKHRoaXMuc2NhbGUpICYmIGlzRmluaXRlKHRoaXMuc2NhbGUpICYmIHRoaXMuc2NhbGUgPiAwICYmCisJCQl0aGlzLmJvdW5kcyAhPSBudWxsICYmICFpc05hTih0aGlzLmJvdW5kcy54KSAmJiAhaXNOYU4odGhpcy5ib3VuZHMueSkgJiYKKwkJCSFpc05hTih0aGlzLmJvdW5kcy53aWR0aCkgJiYgIWlzTmFOKHRoaXMuYm91bmRzLmhlaWdodCkgJiYKKwkJCXRoaXMuYm91bmRzLndpZHRoID4gMCAmJiB0aGlzLmJvdW5kcy5oZWlnaHQgPiAwKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVZtbEdyb3VwCisgKgorICogUmV0dXJucyB0aGUgdGVtcG9yYXJ5IGVsZW1lbnQgdXNlZCBmb3IgcmVuZGVyaW5nIGluIElFOCBzdGFuZGFyZHMgbW9kZS4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUuY3JlYXRlVm1sR3JvdXAgPSBmdW5jdGlvbigpCit7CisJdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG14Q2xpZW50LlZNTF9QUkVGSVggKyAnOmdyb3VwJyk7CisJbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisJbm9kZS5zdHlsZS53aWR0aCA9IHRoaXMubm9kZS5zdHlsZS53aWR0aDsKKwlub2RlLnN0eWxlLmhlaWdodCA9IHRoaXMubm9kZS5zdHlsZS5oZWlnaHQ7CisJCisJcmV0dXJuIG5vZGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWRyYXdTaGFwZQorICoKKyAqIFVwZGF0ZXMgdGhlIFNWRyBvciBWTUwgc2hhcGUuCisgKi8KK214U2hhcGUucHJvdG90eXBlLnJlZHJhd1NoYXBlID0gZnVuY3Rpb24oKQoreworCXZhciBjYW52YXMgPSB0aGlzLmNyZWF0ZUNhbnZhcygpOworCQorCWlmIChjYW52YXMgIT0gbnVsbCkKKwl7CisJCS8vIFNwZWNpZmllcyBpZiBldmVudHMgc2hvdWxkIGJlIGhhbmRsZWQKKwkJY2FudmFzLnBvaW50ZXJFdmVudHMgPSB0aGlzLnBvaW50ZXJFdmVudHM7CisJCisJCXRoaXMucGFpbnQoY2FudmFzKTsKKwkKKwkJaWYgKHRoaXMubm9kZSAhPSBjYW52YXMucm9vdCkKKwkJeworCQkJLy8gRm9yY2VzIHBhcnNpbmcgaW4gSUU4IHN0YW5kYXJkcyBtb2RlIC0gc2xvdyEgYXZvaWQKKwkJCXRoaXMubm9kZS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGNhbnZhcy5yb290Lm91dGVySFRNTCk7CisJCX0KKwkKKwkJaWYgKHRoaXMubm9kZS5ub2RlTmFtZSA9PSAnRElWJyAmJiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gOCkKKwkJeworCQkJLy8gTWFrZXMgRElWIHRyYW5zcGFyZW50IHRvIGV2ZW50cyBmb3IgSUU4IGluIElFOCBzdGFuZGFyZHMKKwkJCS8vIG1vZGUgKE5vdGU6IERvZXMgbm90IHdvcmsgZm9yIElFOSBpbiBJRTggc3RhbmRhcmRzIG1vZGUKKwkJCS8vIGFuZCBub3QgZm9yIElFMTEgaW4gZW50ZXJwcmlzZSBtb2RlKQorCQkJdGhpcy5ub2RlLnN0eWxlLmZpbHRlciA9ICcnOworCQkJCisJCQkvLyBBZGRzIGV2ZW50IHRyYW5zcGFyZW5jeSBpbiBJRTggc3RhbmRhcmRzCisJCQlteFV0aWxzLmFkZFRyYW5zcGFyZW50QmFja2dyb3VuZEZpbHRlcih0aGlzLm5vZGUpOworCQl9CisJCQorCQl0aGlzLmRlc3Ryb3lDYW52YXMoY2FudmFzKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVDYW52YXMKKyAqIAorICogQ3JlYXRlcyBhIG5ldyBjYW52YXMgZm9yIGRyYXdpbmcgdGhpcyBzaGFwZS4gTWF5IHJldHVybiBudWxsLgorICovCitteFNoYXBlLnByb3RvdHlwZS5jcmVhdGVDYW52YXMgPSBmdW5jdGlvbigpCit7CisJdmFyIGNhbnZhcyA9IG51bGw7CisJCisJLy8gTEFURVI6IENoZWNrIGlmIHJldXNpbmcgZXhpc3RpbmcgRE9NIG5vZGVzIGltcHJvdmVzIHBlcmZvcm1hbmNlCisJaWYgKHRoaXMubm9kZS5vd25lclNWR0VsZW1lbnQgIT0gbnVsbCkKKwl7CisJCWNhbnZhcyA9IHRoaXMuY3JlYXRlU3ZnQ2FudmFzKCk7CisJfQorCWVsc2UgaWYgKG14Q2xpZW50LklTX1ZNTCkKKwl7CisJCXRoaXMudXBkYXRlVm1sQ29udGFpbmVyKCk7CisJCWNhbnZhcyA9IHRoaXMuY3JlYXRlVm1sQ2FudmFzKCk7CisJfQorCQorCWlmIChjYW52YXMgIT0gbnVsbCAmJiB0aGlzLm91dGxpbmUpCisJeworCQljYW52YXMuc2V0U3Ryb2tlV2lkdGgodGhpcy5zdHJva2V3aWR0aCk7CisJCWNhbnZhcy5zZXRTdHJva2VDb2xvcih0aGlzLnN0cm9rZSk7CisJCQorCQlpZiAodGhpcy5pc0Rhc2hlZCAhPSBudWxsKQorCQl7CisJCQljYW52YXMuc2V0RGFzaGVkKHRoaXMuaXNEYXNoZWQpOworCQl9CisJCQorCQljYW52YXMuc2V0U3Ryb2tlV2lkdGggPSBmdW5jdGlvbigpIHt9OworCQljYW52YXMuc2V0U3Ryb2tlQ29sb3IgPSBmdW5jdGlvbigpIHt9OworCQljYW52YXMuc2V0RmlsbENvbG9yID0gZnVuY3Rpb24oKSB7fTsKKwkJY2FudmFzLnNldEdyYWRpZW50ID0gZnVuY3Rpb24oKSB7fTsKKwkJY2FudmFzLnNldERhc2hlZCA9IGZ1bmN0aW9uKCkge307CisJfQorCisJcmV0dXJuIGNhbnZhczsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVN2Z0NhbnZhcworICogCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIDxteFN2Z0NhbnZhczJEPiBmb3IgcmVuZGVyaW5nIHRoaXMgc2hhcGUuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmNyZWF0ZVN2Z0NhbnZhcyA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgY2FudmFzID0gbmV3IG14U3ZnQ2FudmFzMkQodGhpcy5ub2RlLCBmYWxzZSk7CisJY2FudmFzLnN0cm9rZVRvbGVyYW5jZSA9ICh0aGlzLnBvaW50ZXJFdmVudHMpID8gdGhpcy5zdmdTdHJva2VUb2xlcmFuY2UgOiAwOworCWNhbnZhcy5wb2ludGVyRXZlbnRzVmFsdWUgPSB0aGlzLnN2Z1BvaW50ZXJFdmVudHM7CisJY2FudmFzLmJsb2NrSW1hZ2VQb2ludGVyRXZlbnRzID0gbXhDbGllbnQuSVNfRkY7CisJdmFyIG9mZiA9IHRoaXMuZ2V0U3ZnU2NyZWVuT2Zmc2V0KCk7CisKKwlpZiAob2ZmICE9IDApCisJeworCQl0aGlzLm5vZGUuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyBvZmYgKyAnLCcgKyBvZmYgKyAnKScpOworCX0KKwllbHNlCisJeworCQl0aGlzLm5vZGUucmVtb3ZlQXR0cmlidXRlKCd0cmFuc2Zvcm0nKTsKKwl9CisJCisJaWYgKCF0aGlzLmFudGlBbGlhcykKKwl7CisJCS8vIFJvdW5kcyBhbGwgbnVtYmVycyBpbiB0aGUgU1ZHIG91dHB1dCB0byBpbnRlZ2VycworCQljYW52YXMuZm9ybWF0ID0gZnVuY3Rpb24odmFsdWUpCisJCXsKKwkJCXJldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQodmFsdWUpKTsKKwkJfTsKKwl9CisJCisJcmV0dXJuIGNhbnZhczsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVZtbENhbnZhcworICogCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIDxteFZtbENhbnZhczJEPiBmb3IgcmVuZGVyaW5nIHRoaXMgc2hhcGUuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmNyZWF0ZVZtbENhbnZhcyA9IGZ1bmN0aW9uKCkKK3sKKwkvLyBXb3JrYXJvdW5kIGZvciBWTUwgcmVuZGVyaW5nIGJ1ZyBpbiBJRTggc3RhbmRhcmRzIG1vZGUKKwl2YXIgbm9kZSA9IChkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gOCAmJiB0aGlzLmlzUGFyc2VWbWwoKSkgPyB0aGlzLmNyZWF0ZVZtbEdyb3VwKCkgOiB0aGlzLm5vZGU7CisJdmFyIGNhbnZhcyA9IG5ldyBteFZtbENhbnZhczJEKG5vZGUsIGZhbHNlKTsKKwkKKwlpZiAobm9kZS50YWdVcm4gIT0gJycpCisJeworCQl2YXIgdyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQodGhpcy5ib3VuZHMud2lkdGgpKTsKKwkJdmFyIGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmhlaWdodCkpOworCQlub2RlLmNvb3Jkc2l6ZSA9ICh3ICogdGhpcy52bWxTY2FsZSkgKyAnLCcgKyAoaCAqIHRoaXMudm1sU2NhbGUpOworCQljYW52YXMuc2NhbGUodGhpcy52bWxTY2FsZSk7CisJCWNhbnZhcy52bWxTY2FsZSA9IHRoaXMudm1sU2NhbGU7CisJfQorCisJLy8gUGFpbnRpbmcgcmVsYXRpdmUgdG8gdG9wLCBsZWZ0IHNoYXBlIGNvcm5lcgorCXZhciBzID0gdGhpcy5zY2FsZTsKKwljYW52YXMudHJhbnNsYXRlKC1NYXRoLnJvdW5kKHRoaXMuYm91bmRzLnggLyBzKSwgLU1hdGgucm91bmQodGhpcy5ib3VuZHMueSAvIHMpKTsKKwkKKwlyZXR1cm4gY2FudmFzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlVm1sQ29udGFpbmVyCisgKiAKKyAqIFVwZGF0ZXMgdGhlIGJvdW5kcyBvZiB0aGUgVk1MIGNvbnRhaW5lci4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUudXBkYXRlVm1sQ29udGFpbmVyID0gZnVuY3Rpb24oKQoreworCXRoaXMubm9kZS5zdHlsZS5sZWZ0ID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy54KSArICdweCc7CisJdGhpcy5ub2RlLnN0eWxlLnRvcCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMueSkgKyAncHgnOworCXZhciB3ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy53aWR0aCkpOworCXZhciBoID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5oZWlnaHQpKTsKKwl0aGlzLm5vZGUuc3R5bGUud2lkdGggPSB3ICsgJ3B4JzsKKwl0aGlzLm5vZGUuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7CisJdGhpcy5ub2RlLnN0eWxlLm92ZXJmbG93ID0gJ3Zpc2libGUnOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVkcmF3SHRtbAorICoKKyAqIEFsbG93IG9wdGltaXphdGlvbiBieSByZXBsYWNpbmcgVk1MIHdpdGggSFRNTC4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUucmVkcmF3SHRtbFNoYXBlID0gZnVuY3Rpb24oKQoreworCS8vIExBVEVSOiBSZWZhY3RvciBtZXRob2RzCisJdGhpcy51cGRhdGVIdG1sQm91bmRzKHRoaXMubm9kZSk7CisJdGhpcy51cGRhdGVIdG1sRmlsdGVycyh0aGlzLm5vZGUpOworCXRoaXMudXBkYXRlSHRtbENvbG9ycyh0aGlzLm5vZGUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlSHRtbEZpbHRlcnMKKyAqCisgKiBBbGxvdyBvcHRpbWl6YXRpb24gYnkgcmVwbGFjaW5nIFZNTCB3aXRoIEhUTUwuCisgKi8KK214U2hhcGUucHJvdG90eXBlLnVwZGF0ZUh0bWxGaWx0ZXJzID0gZnVuY3Rpb24obm9kZSkKK3sKKwl2YXIgZiA9ICcnOworCQorCWlmICh0aGlzLm9wYWNpdHkgPCAxMDApCisJeworCQlmICs9ICdhbHBoYShvcGFjaXR5PScgKyAodGhpcy5vcGFjaXR5KSArICcpJzsKKwl9CisJCisJaWYgKHRoaXMuaXNTaGFkb3cpCisJeworCQkvLyBGSVhNRTogQ2Fubm90IGltcGxlbWVudCBzaGFkb3cgdHJhbnNwYXJlbmN5IHdpdGggZmlsdGVyCisJCWYgKz0gJ3Byb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5kcm9wU2hhZG93ICgnICsKKwkJCSdPZmZYPVwnJyArIE1hdGgucm91bmQobXhDb25zdGFudHMuU0hBRE9XX09GRlNFVF9YICogdGhpcy5zY2FsZSkgKyAnXCcsICcgKworCQkJJ09mZlk9XCcnICsgTWF0aC5yb3VuZChteENvbnN0YW50cy5TSEFET1dfT0ZGU0VUX1kgKiB0aGlzLnNjYWxlKSArICdcJywgJyArCisJCQknQ29sb3I9XCcnICsgbXhDb25zdGFudHMuVk1MX1NIQURPV0NPTE9SICsgJ1wnKSc7CisJfQorCQorCWlmICh0aGlzLmZpbGwgIT0gbnVsbCAmJiB0aGlzLmZpbGwgIT0gbXhDb25zdGFudHMuTk9ORSAmJiB0aGlzLmdyYWRpZW50ICYmIHRoaXMuZ3JhZGllbnQgIT0gbXhDb25zdGFudHMuTk9ORSkKKwl7CisJCXZhciBzdGFydCA9IHRoaXMuZmlsbDsKKwkJdmFyIGVuZCA9IHRoaXMuZ3JhZGllbnQ7CisJCXZhciB0eXBlID0gJzAnOworCQkKKwkJdmFyIGxvb2t1cCA9IHtlYXN0OjAsc291dGg6MSx3ZXN0OjIsbm9ydGg6M307CisJCXZhciBkaXIgPSAodGhpcy5kaXJlY3Rpb24gIT0gbnVsbCkgPyBsb29rdXBbdGhpcy5kaXJlY3Rpb25dIDogMDsKKwkJCisJCWlmICh0aGlzLmdyYWRpZW50RGlyZWN0aW9uICE9IG51bGwpCisJCXsKKwkJCWRpciA9IG14VXRpbHMubW9kKGRpciArIGxvb2t1cFt0aGlzLmdyYWRpZW50RGlyZWN0aW9uXSAtIDEsIDQpOworCQl9CisKKwkJaWYgKGRpciA9PSAxKQorCQl7CisJCQl0eXBlID0gJzEnOworCQkJdmFyIHRtcCA9IHN0YXJ0OworCQkJc3RhcnQgPSBlbmQ7CisJCQllbmQgPSB0bXA7CisJCX0KKwkJZWxzZSBpZiAoZGlyID09IDIpCisJCXsKKwkJCXZhciB0bXAgPSBzdGFydDsKKwkJCXN0YXJ0ID0gZW5kOworCQkJZW5kID0gdG1wOworCQl9CisJCWVsc2UgaWYgKGRpciA9PSAzKQorCQl7CisJCQl0eXBlID0gJzEnOworCQl9CisJCQorCQlmICs9ICdwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoJyArCisJCQknc3RhcnRDb2xvclN0cj1cJycgKyBzdGFydCArICdcJywgZW5kQ29sb3JTdHI9XCcnICsgZW5kICsKKwkJCSdcJywgZ3JhZGllbnRUeXBlPVwnJyArIHR5cGUgKyAnXCcpJzsKKwl9CisKKwlub2RlLnN0eWxlLmZpbHRlciA9IGY7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtaXhlZE1vZGVIdG1sCisgKgorICogQWxsb3cgb3B0aW1pemF0aW9uIGJ5IHJlcGxhY2luZyBWTUwgd2l0aCBIVE1MLgorICovCitteFNoYXBlLnByb3RvdHlwZS51cGRhdGVIdG1sQ29sb3JzID0gZnVuY3Rpb24obm9kZSkKK3sKKwl2YXIgY29sb3IgPSB0aGlzLnN0cm9rZTsKKwkKKwlpZiAoY29sb3IgIT0gbnVsbCAmJiBjb2xvciAhPSBteENvbnN0YW50cy5OT05FKQorCXsKKwkJbm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IGNvbG9yOworCisJCWlmICh0aGlzLmlzRGFzaGVkKQorCQl7CisJCQlub2RlLnN0eWxlLmJvcmRlclN0eWxlID0gJ2Rhc2hlZCc7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5zdHJva2V3aWR0aCA+IDApCisJCXsKKwkJCW5vZGUuc3R5bGUuYm9yZGVyU3R5bGUgPSAnc29saWQnOworCQl9CisKKwkJbm9kZS5zdHlsZS5ib3JkZXJXaWR0aCA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0aGlzLnN0cm9rZXdpZHRoICogdGhpcy5zY2FsZSkpICsgJ3B4JzsKKwl9CisJZWxzZQorCXsKKwkJbm9kZS5zdHlsZS5ib3JkZXJXaWR0aCA9ICcwcHgnOworCX0KKworCWNvbG9yID0gKHRoaXMub3V0bGluZSkgPyBudWxsIDogdGhpcy5maWxsOworCQorCWlmIChjb2xvciAhPSBudWxsICYmIGNvbG9yICE9IG14Q29uc3RhbnRzLk5PTkUpCisJeworCQlub2RlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9yOworCQlub2RlLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICdub25lJzsKKwl9CisJZWxzZSBpZiAodGhpcy5wb2ludGVyRXZlbnRzKQorCXsKKwkJIG5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3RyYW5zcGFyZW50JzsKKwl9CisJZWxzZSBpZiAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09IDgpCisJeworCQlteFV0aWxzLmFkZFRyYW5zcGFyZW50QmFja2dyb3VuZEZpbHRlcihub2RlKTsKKwl9CisJZWxzZQorCXsKKwkJdGhpcy5zZXRUcmFuc3BhcmVudEJhY2tncm91bmRJbWFnZShub2RlKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtaXhlZE1vZGVIdG1sCisgKgorICogQWxsb3cgb3B0aW1pemF0aW9uIGJ5IHJlcGxhY2luZyBWTUwgd2l0aCBIVE1MLgorICovCitteFNoYXBlLnByb3RvdHlwZS51cGRhdGVIdG1sQm91bmRzID0gZnVuY3Rpb24obm9kZSkKK3sKKwl2YXIgc3cgPSAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlID49IDkpID8gMCA6IE1hdGguY2VpbCh0aGlzLnN0cm9rZXdpZHRoICogdGhpcy5zY2FsZSk7CisJbm9kZS5zdHlsZS5ib3JkZXJXaWR0aCA9IE1hdGgubWF4KDEsIHN3KSArICdweCc7CisJbm9kZS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOworCQorCW5vZGUuc3R5bGUubGVmdCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMueCAtIHN3IC8gMikgKyAncHgnOworCW5vZGUuc3R5bGUudG9wID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy55IC0gc3cgLyAyKSArICdweCc7CisKKwlpZiAoZG9jdW1lbnQuY29tcGF0TW9kZSA9PSAnQ1NTMUNvbXBhdCcpCisJeworCQlzdyA9IC1zdzsKKwl9CisJCisJbm9kZS5zdHlsZS53aWR0aCA9IE1hdGgucm91bmQoTWF0aC5tYXgoMCwgdGhpcy5ib3VuZHMud2lkdGggKyBzdykpICsgJ3B4JzsKKwlub2RlLnN0eWxlLmhlaWdodCA9IE1hdGgucm91bmQoTWF0aC5tYXgoMCwgdGhpcy5ib3VuZHMuaGVpZ2h0ICsgc3cpKSArICdweCc7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZXN0cm95Q2FudmFzCisgKiAKKyAqIERlc3Ryb3lzIHRoZSBnaXZlbiBjYW52YXMgd2hpY2ggd2FzIHVzZWQgZm9yIGRyYXdpbmcuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIGluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudHMgb24gYWxsIHNoYXJlZCBncmFkaWVudHMgdXNlZCBpbiB0aGUgY2FudmFzLgorICovCitteFNoYXBlLnByb3RvdHlwZS5kZXN0cm95Q2FudmFzID0gZnVuY3Rpb24oY2FudmFzKQoreworCS8vIE1hbmFnZXMgcmVmZXJlbmNlIGNvdW50cworCWlmIChjYW52YXMgaW5zdGFuY2VvZiBteFN2Z0NhbnZhczJEKQorCXsKKwkJLy8gSW5jcmVtZW50cyByZWYgY291bnRzCisJCWZvciAodmFyIGtleSBpbiBjYW52YXMuZ3JhZGllbnRzKQorCQl7CisJCQl2YXIgZ3JhZGllbnQgPSBjYW52YXMuZ3JhZGllbnRzW2tleV07CisJCQkKKwkJCWlmIChncmFkaWVudCAhPSBudWxsKQorCQkJeworCQkJCWdyYWRpZW50Lm14UmVmQ291bnQgPSAoZ3JhZGllbnQubXhSZWZDb3VudCB8fCAwKSArIDE7CisJCQl9CisJCX0KKwkJCisJCXRoaXMucmVsZWFzZVN2Z0dyYWRpZW50cyh0aGlzLm9sZEdyYWRpZW50cyk7CisJCXRoaXMub2xkR3JhZGllbnRzID0gY2FudmFzLmdyYWRpZW50czsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBwYWludAorICogCisgKiBHZW5lcmljIHJlbmRlcmluZyBjb2RlLgorICovCitteFNoYXBlLnByb3RvdHlwZS5wYWludCA9IGZ1bmN0aW9uKGMpCit7CisJLy8gU2NhbGUgaXMgcGFzc2VkLXRocm91Z2ggdG8gY2FudmFzCisJdmFyIHMgPSB0aGlzLnNjYWxlOworCXZhciB4ID0gdGhpcy5ib3VuZHMueCAvIHM7CisJdmFyIHkgPSB0aGlzLmJvdW5kcy55IC8gczsKKwl2YXIgdyA9IHRoaXMuYm91bmRzLndpZHRoIC8gczsKKwl2YXIgaCA9IHRoaXMuYm91bmRzLmhlaWdodCAvIHM7CisKKwlpZiAodGhpcy5pc1BhaW50Qm91bmRzSW52ZXJ0ZWQoKSkKKwl7CisJCXZhciB0ID0gKHcgLSBoKSAvIDI7CisJCXggKz0gdDsKKwkJeSAtPSB0OworCQl2YXIgdG1wID0gdzsKKwkJdyA9IGg7CisJCWggPSB0bXA7CisJfQorCQorCXRoaXMudXBkYXRlVHJhbnNmb3JtKGMsIHgsIHksIHcsIGgpOworCXRoaXMuY29uZmlndXJlQ2FudmFzKGMsIHgsIHksIHcsIGgpOworCisJLy8gQWRkcyBiYWNrZ3JvdW5kIHJlY3RhbmdsZSB0byBjYXB0dXJlIGV2ZW50cworCXZhciBiZyA9IG51bGw7CisJCisJaWYgKCh0aGlzLnN0ZW5jaWwgPT0gbnVsbCAmJiB0aGlzLnBvaW50cyA9PSBudWxsICYmIHRoaXMuc2hhcGVQb2ludGVyRXZlbnRzKSB8fAorCQkodGhpcy5zdGVuY2lsICE9IG51bGwgJiYgdGhpcy5zdGVuY2lsUG9pbnRlckV2ZW50cykpCisJeworCQl2YXIgYmIgPSB0aGlzLmNyZWF0ZUJvdW5kaW5nQm94KCk7CisJCQorCQlpZiAodGhpcy5kaWFsZWN0ID09IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHKQorCQl7CisJCQliZyA9IHRoaXMuY3JlYXRlVHJhbnNwYXJlbnRTdmdSZWN0YW5nbGUoYmIueCwgYmIueSwgYmIud2lkdGgsIGJiLmhlaWdodCk7CisJCQl0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoYmcpOworCQl9CisJCWVsc2UKKwkJeworCQkJdmFyIHJlY3QgPSBjLmNyZWF0ZVJlY3QoJ3JlY3QnLCBiYi54IC8gcywgYmIueSAvIHMsIGJiLndpZHRoIC8gcywgYmIuaGVpZ2h0IC8gcyk7CisJCQlyZWN0LmFwcGVuZENoaWxkKGMuY3JlYXRlVHJhbnNwYXJlbnRGaWxsKCkpOworCQkJcmVjdC5zdHJva2VkID0gJ2ZhbHNlJzsKKwkJCWMucm9vdC5hcHBlbmRDaGlsZChyZWN0KTsKKwkJfQorCX0KKworCWlmICh0aGlzLnN0ZW5jaWwgIT0gbnVsbCkKKwl7CisJCXRoaXMuc3RlbmNpbC5kcmF3U2hhcGUoYywgdGhpcywgeCwgeSwgdywgaCk7CisJfQorCWVsc2UKKwl7CisJCS8vIFN0ZW5jaWxzIGhhdmUgc2VwYXJhdGUgc3Ryb2tld2lkdGgKKwkJYy5zZXRTdHJva2VXaWR0aCh0aGlzLnN0cm9rZXdpZHRoKTsKKwkJCisJCWlmICh0aGlzLnBvaW50cyAhPSBudWxsKQorCQl7CisJCQkvLyBQYWludHMgZWRnZSBzaGFwZQorCQkJdmFyIHB0cyA9IFtdOworCQkJCisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucG9pbnRzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCWlmICh0aGlzLnBvaW50c1tpXSAhPSBudWxsKQorCQkJCXsKKwkJCQkJcHRzLnB1c2gobmV3IG14UG9pbnQodGhpcy5wb2ludHNbaV0ueCAvIHMsIHRoaXMucG9pbnRzW2ldLnkgLyBzKSk7CisJCQkJfQorCQkJfQorCisJCQl0aGlzLnBhaW50RWRnZVNoYXBlKGMsIHB0cyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvLyBQYWludHMgdmVydGV4IHNoYXBlCisJCQl0aGlzLnBhaW50VmVydGV4U2hhcGUoYywgeCwgeSwgdywgaCk7CisJCX0KKwl9CisJCisJaWYgKGJnICE9IG51bGwgJiYgYy5zdGF0ZSAhPSBudWxsICYmIGMuc3RhdGUudHJhbnNmb3JtICE9IG51bGwpCisJeworCQliZy5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIGMuc3RhdGUudHJhbnNmb3JtKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjb25maWd1cmVDYW52YXMKKyAqIAorICogU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGNhbnZhcyBmb3IgZHJhd2luZyB0aGUgc2hhcGUuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmNvbmZpZ3VyZUNhbnZhcyA9IGZ1bmN0aW9uKGMsIHgsIHksIHcsIGgpCit7CisJdmFyIGRhc2ggPSBudWxsOworCQorCWlmICh0aGlzLnN0eWxlICE9IG51bGwpCisJeworCQlkYXNoID0gdGhpcy5zdHlsZVsnZGFzaFBhdHRlcm4nXTsJCQorCX0KKworCWMuc2V0QWxwaGEodGhpcy5vcGFjaXR5IC8gMTAwKTsKKwljLnNldEZpbGxBbHBoYSh0aGlzLmZpbGxPcGFjaXR5IC8gMTAwKTsKKwljLnNldFN0cm9rZUFscGhhKHRoaXMuc3Ryb2tlT3BhY2l0eSAvIDEwMCk7CisKKwkvLyBTZXRzIGFscGhhLCBjb2xvcnMgYW5kIGdyYWRpZW50cworCWlmICh0aGlzLmlzU2hhZG93ICE9IG51bGwpCisJeworCQljLnNldFNoYWRvdyh0aGlzLmlzU2hhZG93KTsKKwl9CisJCisJLy8gRGFzaCBwYXR0ZXJuCisJaWYgKHRoaXMuaXNEYXNoZWQgIT0gbnVsbCkKKwl7CisJCWMuc2V0RGFzaGVkKHRoaXMuaXNEYXNoZWQsICh0aGlzLnN0eWxlICE9IG51bGwpID8KKwkJCW14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfRklYX0RBU0gsIGZhbHNlKSA9PSAxIDogZmFsc2UpOworCX0KKworCWlmIChkYXNoICE9IG51bGwpCisJeworCQljLnNldERhc2hQYXR0ZXJuKGRhc2gpOworCX0KKworCWlmICh0aGlzLmZpbGwgIT0gbnVsbCAmJiB0aGlzLmZpbGwgIT0gbXhDb25zdGFudHMuTk9ORSAmJiB0aGlzLmdyYWRpZW50ICYmIHRoaXMuZ3JhZGllbnQgIT0gbXhDb25zdGFudHMuTk9ORSkKKwl7CisJCXZhciBiID0gdGhpcy5nZXRHcmFkaWVudEJvdW5kcyhjLCB4LCB5LCB3LCBoKTsKKwkJYy5zZXRHcmFkaWVudCh0aGlzLmZpbGwsIHRoaXMuZ3JhZGllbnQsIGIueCwgYi55LCBiLndpZHRoLCBiLmhlaWdodCwgdGhpcy5ncmFkaWVudERpcmVjdGlvbik7CisJfQorCWVsc2UKKwl7CisJCWMuc2V0RmlsbENvbG9yKHRoaXMuZmlsbCk7CisJfQorCisJYy5zZXRTdHJva2VDb2xvcih0aGlzLnN0cm9rZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRHcmFkaWVudEJvdW5kcworICogCisgKiBSZXR1cm5zIHRoZSBib3VuZGluZyBib3ggZm9yIHRoZSBncmFkaWVudCBib3ggZm9yIHRoaXMgc2hhcGUuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmdldEdyYWRpZW50Qm91bmRzID0gZnVuY3Rpb24oYywgeCwgeSwgdywgaCkKK3sKKwlyZXR1cm4gbmV3IG14UmVjdGFuZ2xlKHgsIHksIHcsIGgpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlVHJhbnNmb3JtCisgKiAKKyAqIFNldHMgdGhlIHNjYWxlIGFuZCByb3RhdGlvbiBvbiB0aGUgZ2l2ZW4gY2FudmFzLgorICovCitteFNoYXBlLnByb3RvdHlwZS51cGRhdGVUcmFuc2Zvcm0gPSBmdW5jdGlvbihjLCB4LCB5LCB3LCBoKQoreworCS8vIE5PVEU6IEN1cnJlbnRseSwgc2NhbGUgaXMgaW1wbGVtZW50ZWQgaW4gc3RhdGUgYW5kIGNhbnZhcy4gVGhpcyB3aWxsCisJLy8gbW92ZSB0byBjYW52YXMgaW4gYSBsYXRlciB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBzdGF0ZXMgYXJlIHVuc2NhbGVkCisJLy8gYW5kIHVudHJhbnNsYXRlZCBhbmQgZG8gbm90IG5lZWQgYW4gdXBkYXRlIGFmdGVyIHpvb21pbmcgb3IgcGFubmluZy4KKwljLnNjYWxlKHRoaXMuc2NhbGUpOworCWMucm90YXRlKHRoaXMuZ2V0U2hhcGVSb3RhdGlvbigpLCB0aGlzLmZsaXBILCB0aGlzLmZsaXBWLCB4ICsgdyAvIDIsIHkgKyBoIC8gMik7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBwYWludFZlcnRleFNoYXBlCisgKiAKKyAqIFBhaW50cyB0aGUgdmVydGV4IHNoYXBlLgorICovCitteFNoYXBlLnByb3RvdHlwZS5wYWludFZlcnRleFNoYXBlID0gZnVuY3Rpb24oYywgeCwgeSwgdywgaCkKK3sKKwl0aGlzLnBhaW50QmFja2dyb3VuZChjLCB4LCB5LCB3LCBoKTsKKwljLnNldFNoYWRvdyhmYWxzZSk7CisJdGhpcy5wYWludEZvcmVncm91bmQoYywgeCwgeSwgdywgaCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBwYWludEJhY2tncm91bmQKKyAqIAorICogSG9vayBmb3Igc3ViY2xhc3NlcnMuIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgZW1wdHkuCisgKi8KK214U2hhcGUucHJvdG90eXBlLnBhaW50QmFja2dyb3VuZCA9IGZ1bmN0aW9uKGMsIHgsIHksIHcsIGgpIHsgfTsKKworLyoqCisgKiBGdW5jdGlvbjogcGFpbnRGb3JlZ3JvdW5kCisgKiAKKyAqIEhvb2sgZm9yIHN1YmNsYXNzZXJzLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgorICovCitteFNoYXBlLnByb3RvdHlwZS5wYWludEZvcmVncm91bmQgPSBmdW5jdGlvbihjLCB4LCB5LCB3LCBoKSB7IH07CisKKy8qKgorICogRnVuY3Rpb246IHBhaW50RWRnZVNoYXBlCisgKiAKKyAqIEhvb2sgZm9yIHN1YmNsYXNzZXJzLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgorICovCitteFNoYXBlLnByb3RvdHlwZS5wYWludEVkZ2VTaGFwZSA9IGZ1bmN0aW9uKGMsIHB0cykgeyB9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRBcmNTaXplCisgKiAKKyAqIFJldHVybnMgdGhlIGFyYyBzaXplIGZvciB0aGUgZ2l2ZW4gZGltZW5zaW9uLgorICovCitteFNoYXBlLnByb3RvdHlwZS5nZXRBcmNTaXplID0gZnVuY3Rpb24odywgaCkKK3sKKwl2YXIgciA9IDA7CisJCisJaWYgKG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfQUJTT0xVVEVfQVJDU0laRSwgMCkgPT0gJzEnKQorCXsKKwkJciA9IE1hdGgubWluKHcgLyAyLCBNYXRoLm1pbihoIC8gMiwgbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLAorCQkJbXhDb25zdGFudHMuU1RZTEVfQVJDU0laRSwgbXhDb25zdGFudHMuTElORV9BUkNTSVpFKSAvIDIpKTsKKwl9CisJZWxzZQorCXsKKwkJdmFyIGYgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0FSQ1NJWkUsCisJCQlteENvbnN0YW50cy5SRUNUQU5HTEVfUk9VTkRJTkdfRkFDVE9SICogMTAwKSAvIDEwMDsKKwkJciA9IE1hdGgubWluKHcgKiBmLCBoICogZik7CisJfQorCQorCXJldHVybiByOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcGFpbnRHbGFzc0VmZmVjdAorICogCisgKiBQYWludHMgdGhlIGdsYXNzIGdyYWRpZW50IGVmZmVjdC4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUucGFpbnRHbGFzc0VmZmVjdCA9IGZ1bmN0aW9uKGMsIHgsIHksIHcsIGgsIGFyYykKK3sKKwl2YXIgc3cgPSBNYXRoLmNlaWwodGhpcy5zdHJva2V3aWR0aCAvIDIpOworCXZhciBzaXplID0gMC40OworCQorCWMuc2V0R3JhZGllbnQoJyNmZmZmZmYnLCAnI2ZmZmZmZicsIHgsIHksIHcsIGggKiAwLjYsICdzb3V0aCcsIDAuOSwgMC4xKTsKKwljLmJlZ2luKCk7CisJYXJjICs9IDIgKiBzdzsKKwkJCisJaWYgKHRoaXMuaXNSb3VuZGVkKQorCXsKKwkJYy5tb3ZlVG8oeCAtIHN3ICsgYXJjLCB5IC0gc3cpOworCQljLnF1YWRUbyh4IC0gc3csIHkgLSBzdywgeCAtIHN3LCB5IC0gc3cgKyBhcmMpOworCQljLmxpbmVUbyh4IC0gc3csIHkgKyBoICogc2l6ZSk7CisJCWMucXVhZFRvKHggKyB3ICogMC41LCB5ICsgaCAqIDAuNywgeCArIHcgKyBzdywgeSArIGggKiBzaXplKTsKKwkJYy5saW5lVG8oeCArIHcgKyBzdywgeSAtIHN3ICsgYXJjKTsKKwkJYy5xdWFkVG8oeCArIHcgKyBzdywgeSAtIHN3LCB4ICsgdyArIHN3IC0gYXJjLCB5IC0gc3cpOworCX0KKwllbHNlCisJeworCQljLm1vdmVUbyh4IC0gc3csIHkgLSBzdyk7CisJCWMubGluZVRvKHggLSBzdywgeSArIGggKiBzaXplKTsKKwkJYy5xdWFkVG8oeCArIHcgKiAwLjUsIHkgKyBoICogMC43LCB4ICsgdyArIHN3LCB5ICsgaCAqIHNpemUpOworCQljLmxpbmVUbyh4ICsgdyArIHN3LCB5IC0gc3cpOworCX0KKwkKKwljLmNsb3NlKCk7CisJYy5maWxsKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRQb2ludHMKKyAqIAorICogUGFpbnRzIHRoZSBnaXZlbiBwb2ludHMgd2l0aCByb3VuZGVkIGNvcm5lcnMuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmFkZFBvaW50cyA9IGZ1bmN0aW9uKGMsIHB0cywgcm91bmRlZCwgYXJjU2l6ZSwgY2xvc2UsIGV4Y2x1ZGUsIGluaXRpYWxNb3ZlKQoreworCWlmIChwdHMgIT0gbnVsbCAmJiBwdHMubGVuZ3RoID4gMCkKKwl7CisJCWluaXRpYWxNb3ZlID0gKGluaXRpYWxNb3ZlICE9IG51bGwpID8gaW5pdGlhbE1vdmUgOiB0cnVlOworCQl2YXIgcGUgPSBwdHNbcHRzLmxlbmd0aCAtIDFdOworCQkKKwkJLy8gQWRkcyB2aXJ0dWFsIHdheXBvaW50IGluIHRoZSBjZW50ZXIgYmV0d2VlbiBzdGFydCBhbmQgZW5kIHBvaW50CisJCWlmIChjbG9zZSAmJiByb3VuZGVkKQorCQl7CisJCQlwdHMgPSBwdHMuc2xpY2UoKTsKKwkJCXZhciBwMCA9IHB0c1swXTsKKwkJCXZhciB3cCA9IG5ldyBteFBvaW50KHBlLnggKyAocDAueCAtIHBlLngpIC8gMiwgcGUueSArIChwMC55IC0gcGUueSkgLyAyKTsKKwkJCXB0cy5zcGxpY2UoMCwgMCwgd3ApOworCQl9CisJCisJCXZhciBwdCA9IHB0c1swXTsKKwkJdmFyIGkgPSAxOworCQorCQkvLyBEcmF3cyB0aGUgbGluZSBzZWdtZW50cworCQlpZiAoaW5pdGlhbE1vdmUpCisJCXsKKwkJCWMubW92ZVRvKHB0LngsIHB0LnkpOworCQl9CisJCWVsc2UKKwkJeworCQkJYy5saW5lVG8ocHQueCwgcHQueSk7CisJCX0KKwkJCisJCXdoaWxlIChpIDwgKChjbG9zZSkgPyBwdHMubGVuZ3RoIDogcHRzLmxlbmd0aCAtIDEpKQorCQl7CisJCQl2YXIgdG1wID0gcHRzW214VXRpbHMubW9kKGksIHB0cy5sZW5ndGgpXTsKKwkJCXZhciBkeCA9IHB0LnggLSB0bXAueDsKKwkJCXZhciBkeSA9IHB0LnkgLSB0bXAueTsKKwkKKwkJCWlmIChyb3VuZGVkICYmIChkeCAhPSAwIHx8IGR5ICE9IDApICYmIChleGNsdWRlID09IG51bGwgfHwgbXhVdGlscy5pbmRleE9mKGV4Y2x1ZGUsIGkgLSAxKSA8IDApKQorCQkJeworCQkJCS8vIERyYXdzIGEgbGluZSBmcm9tIHRoZSBsYXN0IHBvaW50IHRvIHRoZSBjdXJyZW50CisJCQkJLy8gcG9pbnQgd2l0aCBhIHNwYWNpbmcgb2Ygc2l6ZSBvZmYgdGhlIGN1cnJlbnQgcG9pbnQKKwkJCQkvLyBpbnRvIGRpcmVjdGlvbiBvZiB0aGUgbGFzdCBwb2ludAorCQkJCXZhciBkaXN0ID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTsKKwkJCQl2YXIgbngxID0gZHggKiBNYXRoLm1pbihhcmNTaXplLCBkaXN0IC8gMikgLyBkaXN0OworCQkJCXZhciBueTEgPSBkeSAqIE1hdGgubWluKGFyY1NpemUsIGRpc3QgLyAyKSAvIGRpc3Q7CisJCisJCQkJdmFyIHgxID0gdG1wLnggKyBueDE7CisJCQkJdmFyIHkxID0gdG1wLnkgKyBueTE7CisJCQkJYy5saW5lVG8oeDEsIHkxKTsKKwkKKwkJCQkvLyBEcmF3cyBhIGN1cnZlIGZyb20gdGhlIGxhc3QgcG9pbnQgdG8gdGhlIGN1cnJlbnQKKwkJCQkvLyBwb2ludCB3aXRoIGEgc3BhY2luZyBvZiBzaXplIG9mZiB0aGUgY3VycmVudCBwb2ludAorCQkJCS8vIGludG8gZGlyZWN0aW9uIG9mIHRoZSBuZXh0IHBvaW50CisJCQkJdmFyIG5leHQgPSBwdHNbbXhVdGlscy5tb2QoaSArIDEsIHB0cy5sZW5ndGgpXTsKKwkJCQkKKwkJCQkvLyBVc2VzIG5leHQgbm9uLW92ZXJsYXBwaW5nIHBvaW50CisJCQkJd2hpbGUgKGkgPCBwdHMubGVuZ3RoIC0gMiAmJiBNYXRoLnJvdW5kKG5leHQueCAtIHRtcC54KSA9PSAwICYmIE1hdGgucm91bmQobmV4dC55IC0gdG1wLnkpID09IDApCisJCQkJeworCQkJCQluZXh0ID0gcHRzW214VXRpbHMubW9kKGkgKyAyLCBwdHMubGVuZ3RoKV07CisJCQkJCWkrKzsKKwkJCQl9CisJCQkJCisJCQkJZHggPSBuZXh0LnggLSB0bXAueDsKKwkJCQlkeSA9IG5leHQueSAtIHRtcC55OworCQorCQkJCWRpc3QgPSBNYXRoLm1heCgxLCBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpKTsKKwkJCQl2YXIgbngyID0gZHggKiBNYXRoLm1pbihhcmNTaXplLCBkaXN0IC8gMikgLyBkaXN0OworCQkJCXZhciBueTIgPSBkeSAqIE1hdGgubWluKGFyY1NpemUsIGRpc3QgLyAyKSAvIGRpc3Q7CisJCisJCQkJdmFyIHgyID0gdG1wLnggKyBueDI7CisJCQkJdmFyIHkyID0gdG1wLnkgKyBueTI7CisJCisJCQkJYy5xdWFkVG8odG1wLngsIHRtcC55LCB4MiwgeTIpOworCQkJCXRtcCA9IG5ldyBteFBvaW50KHgyLCB5Mik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYy5saW5lVG8odG1wLngsIHRtcC55KTsKKwkJCX0KKwkKKwkJCXB0ID0gdG1wOworCQkJaSsrOworCQl9CisJCisJCWlmIChjbG9zZSkKKwkJeworCQkJYy5jbG9zZSgpOworCQl9CisJCWVsc2UKKwkJeworCQkJYy5saW5lVG8ocGUueCwgcGUueSk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZXNldFN0eWxlcworICogCisgKiBSZXNldHMgYWxsIHN0eWxlcy4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUucmVzZXRTdHlsZXMgPSBmdW5jdGlvbigpCit7CisJdGhpcy5pbml0U3R5bGVzKCk7CisKKwl0aGlzLnNwYWNpbmcgPSAwOworCQorCWRlbGV0ZSB0aGlzLmZpbGw7CisJZGVsZXRlIHRoaXMuZ3JhZGllbnQ7CisJZGVsZXRlIHRoaXMuZ3JhZGllbnREaXJlY3Rpb247CisJZGVsZXRlIHRoaXMuc3Ryb2tlOworCWRlbGV0ZSB0aGlzLnN0YXJ0U2l6ZTsKKwlkZWxldGUgdGhpcy5lbmRTaXplOworCWRlbGV0ZSB0aGlzLnN0YXJ0QXJyb3c7CisJZGVsZXRlIHRoaXMuZW5kQXJyb3c7CisJZGVsZXRlIHRoaXMuZGlyZWN0aW9uOworCWRlbGV0ZSB0aGlzLmlzU2hhZG93OworCWRlbGV0ZSB0aGlzLmlzRGFzaGVkOworCWRlbGV0ZSB0aGlzLmlzUm91bmRlZDsKKwlkZWxldGUgdGhpcy5nbGFzczsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFwcGx5CisgKiAKKyAqIEFwcGxpZXMgdGhlIHN0eWxlIG9mIHRoZSBnaXZlbiA8bXhDZWxsU3RhdGU+IHRvIHRoZSBzaGFwZS4gVGhpcworICogaW1wbGVtZW50YXRpb24gYXNzaWducyB0aGUgZm9sbG93aW5nIHN0eWxlcyB0byBsb2NhbCBmaWVsZHM6CisgKiAKKyAqIC0gPG14Q29uc3RhbnRzLlNUWUxFX0ZJTExDT0xPUj4gPT4gZmlsbAorICogLSA8bXhDb25zdGFudHMuU1RZTEVfR1JBRElFTlRDT0xPUj4gPT4gZ3JhZGllbnQKKyAqIC0gPG14Q29uc3RhbnRzLlNUWUxFX0dSQURJRU5UX0RJUkVDVElPTj4gPT4gZ3JhZGllbnREaXJlY3Rpb24KKyAqIC0gPG14Q29uc3RhbnRzLlNUWUxFX09QQUNJVFk+ID0+IG9wYWNpdHkKKyAqIC0gPG14Q29uc3RhbnRzLlNUWUxFX0ZJTExfT1BBQ0lUWT4gPT4gZmlsbE9wYWNpdHkKKyAqIC0gPG14Q29uc3RhbnRzLlNUWUxFX1NUUk9LRV9PUEFDSVRZPiA9PiBzdHJva2VPcGFjaXR5CisgKiAtIDxteENvbnN0YW50cy5TVFlMRV9TVFJPS0VDT0xPUj4gPT4gc3Ryb2tlCisgKiAtIDxteENvbnN0YW50cy5TVFlMRV9TVFJPS0VXSURUSD4gPT4gc3Ryb2tld2lkdGgKKyAqIC0gPG14Q29uc3RhbnRzLlNUWUxFX1NIQURPVz4gPT4gaXNTaGFkb3cKKyAqIC0gPG14Q29uc3RhbnRzLlNUWUxFX0RBU0hFRD4gPT4gaXNEYXNoZWQKKyAqIC0gPG14Q29uc3RhbnRzLlNUWUxFX1NQQUNJTkc+ID0+IHNwYWNpbmcKKyAqIC0gPG14Q29uc3RhbnRzLlNUWUxFX1NUQVJUU0laRT4gPT4gc3RhcnRTaXplCisgKiAtIDxteENvbnN0YW50cy5TVFlMRV9FTkRTSVpFPiA9PiBlbmRTaXplCisgKiAtIDxteENvbnN0YW50cy5TVFlMRV9ST1VOREVEPiA9PiBpc1JvdW5kZWQKKyAqIC0gPG14Q29uc3RhbnRzLlNUWUxFX1NUQVJUQVJST1c+ID0+IHN0YXJ0QXJyb3cKKyAqIC0gPG14Q29uc3RhbnRzLlNUWUxFX0VOREFSUk9XPiA9PiBlbmRBcnJvdworICogLSA8bXhDb25zdGFudHMuU1RZTEVfUk9UQVRJT04+ID0+IHJvdGF0aW9uCisgKiAtIDxteENvbnN0YW50cy5TVFlMRV9ESVJFQ1RJT04+ID0+IGRpcmVjdGlvbgorICogLSA8bXhDb25zdGFudHMuU1RZTEVfR0xBU1M+ID0+IGdsYXNzCisgKgorICogVGhpcyBrZWVwcyBhIHJlZmVyZW5jZSB0byB0aGUgPHN0eWxlPi4gSWYgeW91IG5lZWQgdG8ga2VlcCBhIHJlZmVyZW5jZSB0bworICogdGhlIGNlbGwsIHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYW5kIHN0b3JlIGEgbG9jYWwgcmVmZXJlbmNlIHRvCisgKiBzdGF0ZS5jZWxsIG9yIHRoZSA8bXhDZWxsU3RhdGU+IGl0c2VsZi4gSWYgPG91dGxpbmU+IHNob3VsZCBiZSB0cnVlLCBtYWtlCisgKiBzdXJlIHRvIHNldCBpdCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiBvZiB0aGUgY29ycmVzcG9uZGluZyBjZWxsLgorICovCitteFNoYXBlLnByb3RvdHlwZS5hcHBseSA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXRoaXMuc3RhdGUgPSBzdGF0ZTsKKwl0aGlzLnN0eWxlID0gc3RhdGUuc3R5bGU7CisKKwlpZiAodGhpcy5zdHlsZSAhPSBudWxsKQorCXsKKwkJdGhpcy5maWxsID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9GSUxMQ09MT1IsIHRoaXMuZmlsbCk7CisJCXRoaXMuZ3JhZGllbnQgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0dSQURJRU5UQ09MT1IsIHRoaXMuZ3JhZGllbnQpOworCQl0aGlzLmdyYWRpZW50RGlyZWN0aW9uID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9HUkFESUVOVF9ESVJFQ1RJT04sIHRoaXMuZ3JhZGllbnREaXJlY3Rpb24pOworCQl0aGlzLm9wYWNpdHkgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX09QQUNJVFksIHRoaXMub3BhY2l0eSk7CisJCXRoaXMuZmlsbE9wYWNpdHkgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0ZJTExfT1BBQ0lUWSwgdGhpcy5maWxsT3BhY2l0eSk7CisJCXRoaXMuc3Ryb2tlT3BhY2l0eSA9IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfU1RST0tFX09QQUNJVFksIHRoaXMuc3Ryb2tlT3BhY2l0eSk7CisJCXRoaXMuc3Ryb2tlID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9TVFJPS0VDT0xPUiwgdGhpcy5zdHJva2UpOworCQl0aGlzLnN0cm9rZXdpZHRoID0gbXhVdGlscy5nZXROdW1iZXIodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfU1RST0tFV0lEVEgsIHRoaXMuc3Ryb2tld2lkdGgpOworCQl0aGlzLnNwYWNpbmcgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1NQQUNJTkcsIHRoaXMuc3BhY2luZyk7CisJCXRoaXMuc3RhcnRTaXplID0gbXhVdGlscy5nZXROdW1iZXIodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfU1RBUlRTSVpFLCB0aGlzLnN0YXJ0U2l6ZSk7CisJCXRoaXMuZW5kU2l6ZSA9IG14VXRpbHMuZ2V0TnVtYmVyKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0VORFNJWkUsIHRoaXMuZW5kU2l6ZSk7CisJCXRoaXMuc3RhcnRBcnJvdyA9IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfU1RBUlRBUlJPVywgdGhpcy5zdGFydEFycm93KTsKKwkJdGhpcy5lbmRBcnJvdyA9IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfRU5EQVJST1csIHRoaXMuZW5kQXJyb3cpOworCQl0aGlzLnJvdGF0aW9uID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9ST1RBVElPTiwgdGhpcy5yb3RhdGlvbik7CisJCXRoaXMuZGlyZWN0aW9uID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9ESVJFQ1RJT04sIHRoaXMuZGlyZWN0aW9uKTsKKwkJdGhpcy5mbGlwSCA9IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfRkxJUEgsIDApID09IDE7CisJCXRoaXMuZmxpcFYgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0ZMSVBWLCAwKSA9PSAxOwkKKwkJCisJCS8vIExlZ2FjeSBzdXBwb3J0IGZvciBzdGVuY2lsRmxpcEgvVgorCQlpZiAodGhpcy5zdGVuY2lsICE9IG51bGwpCisJCXsKKwkJCXRoaXMuZmxpcEggPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsICdzdGVuY2lsRmxpcEgnLCAwKSA9PSAxIHx8IHRoaXMuZmxpcEg7CisJCQl0aGlzLmZsaXBWID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCAnc3RlbmNpbEZsaXBWJywgMCkgPT0gMSB8fCB0aGlzLmZsaXBWOworCQl9CisJCQorCQlpZiAodGhpcy5kaXJlY3Rpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX05PUlRIIHx8IHRoaXMuZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9TT1VUSCkKKwkJeworCQkJdmFyIHRtcCA9IHRoaXMuZmxpcEg7CisJCQl0aGlzLmZsaXBIID0gdGhpcy5mbGlwVjsKKwkJCXRoaXMuZmxpcFYgPSB0bXA7CisJCX0KKworCQl0aGlzLmlzU2hhZG93ID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9TSEFET1csIHRoaXMuaXNTaGFkb3cpID09IDE7CisJCXRoaXMuaXNEYXNoZWQgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0RBU0hFRCwgdGhpcy5pc0Rhc2hlZCkgPT0gMTsKKwkJdGhpcy5pc1JvdW5kZWQgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1JPVU5ERUQsIHRoaXMuaXNSb3VuZGVkKSA9PSAxOworCQl0aGlzLmdsYXNzID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9HTEFTUywgdGhpcy5nbGFzcykgPT0gMTsKKwkJCisJCWlmICh0aGlzLmZpbGwgPT0gbXhDb25zdGFudHMuTk9ORSkKKwkJeworCQkJdGhpcy5maWxsID0gbnVsbDsKKwkJfQorCisJCWlmICh0aGlzLmdyYWRpZW50ID09IG14Q29uc3RhbnRzLk5PTkUpCisJCXsKKwkJCXRoaXMuZ3JhZGllbnQgPSBudWxsOworCQl9CisKKwkJaWYgKHRoaXMuc3Ryb2tlID09IG14Q29uc3RhbnRzLk5PTkUpCisJCXsKKwkJCXRoaXMuc3Ryb2tlID0gbnVsbDsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEN1cnNvcgorICogCisgKiBTZXRzIHRoZSBjdXJzb3Igb24gdGhlIGdpdmVuIHNoYXBlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogY3Vyc29yIC0gVGhlIGN1cnNvciB0byBiZSB1c2VkLgorICovCitteFNoYXBlLnByb3RvdHlwZS5zZXRDdXJzb3IgPSBmdW5jdGlvbihjdXJzb3IpCit7CisJaWYgKGN1cnNvciA9PSBudWxsKQorCXsKKwkJY3Vyc29yID0gJyc7CisJfQorCQorCXRoaXMuY3Vyc29yID0gY3Vyc29yOworCisJaWYgKHRoaXMubm9kZSAhPSBudWxsKQorCXsKKwkJdGhpcy5ub2RlLnN0eWxlLmN1cnNvciA9IGN1cnNvcjsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDdXJzb3IKKyAqIAorICogUmV0dXJucyB0aGUgY3VycmVudCBjdXJzb3IuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmdldEN1cnNvciA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5jdXJzb3I7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1cGRhdGVCb3VuZGluZ0JveAorICoKKyAqIFVwZGF0ZXMgdGhlIDxib3VuZGluZ0JveD4gZm9yIHRoaXMgc2hhcGUgdXNpbmcgPGNyZWF0ZUJvdW5kaW5nQm94PiBhbmQKKyAqIDxhdWdtZW50Qm91bmRpbmdCb3g+IGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiA8Ym91bmRpbmdCb3g+LgorICovCitteFNoYXBlLnByb3RvdHlwZS51cGRhdGVCb3VuZGluZ0JveCA9IGZ1bmN0aW9uKCkKK3sKKwkvLyBUcmllcyB0byBnZXQgYm91bmRpbmcgYm94IGZyb20gU1ZHIHN1YnN5c3RlbQorCS8vIExBVEVSOiBVc2UgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZvciBmYWxsYmFjayBpbiBWTUwKKwlpZiAodGhpcy51c2VTdmdCb3VuZGluZ0JveCAmJiB0aGlzLm5vZGUgIT0gbnVsbCAmJiB0aGlzLm5vZGUub3duZXJTVkdFbGVtZW50ICE9IG51bGwpCisJeworCQl0cnkKKwkJeworCQkJdmFyIGIgPSB0aGlzLm5vZGUuZ2V0QkJveCgpOworCQorCQkJaWYgKGIud2lkdGggPiAwICYmIGIuaGVpZ2h0ID4gMCkKKwkJCXsKKwkJCQl0aGlzLmJvdW5kaW5nQm94ID0gbmV3IG14UmVjdGFuZ2xlKGIueCwgYi55LCBiLndpZHRoLCBiLmhlaWdodCk7CisJCQkJCisJCQkJLy8gQWRkcyBzdHJva2VXaWR0aAorCQkJCXRoaXMuYm91bmRpbmdCb3guZ3Jvdyh0aGlzLnN0cm9rZXdpZHRoICogdGhpcy5zY2FsZSAvIDIpOworCQkJCQorCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQljYXRjaChlKQorCQl7CisJCQkvLyBmYWxsYmFjayB0byBjb2RlIGJlbG93CisJCX0KKwl9CisKKwlpZiAodGhpcy5ib3VuZHMgIT0gbnVsbCkKKwl7CisJCXZhciBiYm94ID0gdGhpcy5jcmVhdGVCb3VuZGluZ0JveCgpOworCQkKKwkJaWYgKGJib3ggIT0gbnVsbCkKKwkJeworCQkJdGhpcy5hdWdtZW50Qm91bmRpbmdCb3goYmJveCk7CisJCQl2YXIgcm90ID0gdGhpcy5nZXRTaGFwZVJvdGF0aW9uKCk7CisJCQkKKwkJCWlmIChyb3QgIT0gMCkKKwkJCXsKKwkJCQliYm94ID0gbXhVdGlscy5nZXRCb3VuZGluZ0JveChiYm94LCByb3QpOworCQkJfQorCQl9CisKKwkJdGhpcy5ib3VuZGluZ0JveCA9IGJib3g7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlQm91bmRpbmdCb3gKKyAqCisgKiBSZXR1cm5zIGEgbmV3IHJlY3RhbmdsZSB0aGF0IHJlcHJlc2VudHMgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgYmFyZSBzaGFwZQorICogd2l0aCBubyBzaGFkb3dzIG9yIHN0cm9rZXdpZHRocy4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUuY3JlYXRlQm91bmRpbmdCb3ggPSBmdW5jdGlvbigpCit7CisJdmFyIGJiID0gdGhpcy5ib3VuZHMuY2xvbmUoKTsKKworCWlmICgodGhpcy5zdGVuY2lsICE9IG51bGwgJiYgKHRoaXMuZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9OT1JUSCB8fAorCQl0aGlzLmRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fU09VVEgpKSB8fCB0aGlzLmlzUGFpbnRCb3VuZHNJbnZlcnRlZCgpKQorCXsKKwkJYmIucm90YXRlOTAoKTsKKwl9CisJCisJcmV0dXJuIGJiOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYXVnbWVudEJvdW5kaW5nQm94CisgKgorICogQXVnbWVudHMgdGhlIGJvdW5kaW5nIGJveCB3aXRoIHRoZSBzdHJva2V3aWR0aCBhbmQgc2hhZG93IG9mZnNldHMuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmF1Z21lbnRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uKGJib3gpCit7CisJaWYgKHRoaXMuaXNTaGFkb3cpCisJeworCQliYm94LndpZHRoICs9IE1hdGguY2VpbChteENvbnN0YW50cy5TSEFET1dfT0ZGU0VUX1ggKiB0aGlzLnNjYWxlKTsKKwkJYmJveC5oZWlnaHQgKz0gTWF0aC5jZWlsKG14Q29uc3RhbnRzLlNIQURPV19PRkZTRVRfWSAqIHRoaXMuc2NhbGUpOworCX0KKwkKKwkvLyBBZGRzIHN0cm9rZVdpZHRoCisJYmJveC5ncm93KHRoaXMuc3Ryb2tld2lkdGggKiB0aGlzLnNjYWxlIC8gMik7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1BhaW50Qm91bmRzSW52ZXJ0ZWQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBib3VuZHMgc2hvdWxkIGJlIGludmVydGVkLgorICovCitteFNoYXBlLnByb3RvdHlwZS5pc1BhaW50Qm91bmRzSW52ZXJ0ZWQgPSBmdW5jdGlvbigpCit7CisJLy8gU3RlbmNpbCBpbXBsZW1lbnRzIGludmVyc2lvbiB2aWEgYXNwZWN0CisJcmV0dXJuIHRoaXMuc3RlbmNpbCA9PSBudWxsICYmICh0aGlzLmRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEggfHwKKwkJCXRoaXMuZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9TT1VUSCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRSb3RhdGlvbgorICogCisgKiBSZXR1cm5zIHRoZSByb3RhdGlvbiBmcm9tIHRoZSBzdHlsZS4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUuZ2V0Um90YXRpb24gPSBmdW5jdGlvbigpCit7CisJcmV0dXJuICh0aGlzLnJvdGF0aW9uICE9IG51bGwpID8gdGhpcy5yb3RhdGlvbiA6IDA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRUZXh0Um90YXRpb24KKyAqIAorICogUmV0dXJucyB0aGUgcm90YXRpb24gZm9yIHRoZSB0ZXh0IGxhYmVsLgorICovCitteFNoYXBlLnByb3RvdHlwZS5nZXRUZXh0Um90YXRpb24gPSBmdW5jdGlvbigpCit7CisJdmFyIHJvdCA9IHRoaXMuZ2V0Um90YXRpb24oKTsKKwkKKwlpZiAobXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9IT1JJWk9OVEFMLCAxKSAhPSAxKQorCXsKKwkJcm90ICs9IG14VGV4dC5wcm90b3R5cGUudmVydGljYWxUZXh0Um90YXRpb247CisJfQorCQorCXJldHVybiByb3Q7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTaGFwZVJvdGF0aW9uCisgKiAKKyAqIFJldHVybnMgdGhlIGFjdHVhbCByb3RhdGlvbiBvZiB0aGUgc2hhcGUuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmdldFNoYXBlUm90YXRpb24gPSBmdW5jdGlvbigpCit7CisJdmFyIHJvdCA9IHRoaXMuZ2V0Um90YXRpb24oKTsKKwkKKwlpZiAodGhpcy5kaXJlY3Rpb24gIT0gbnVsbCkKKwl7CisJCWlmICh0aGlzLmRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEgpCisJCXsKKwkJCXJvdCArPSAyNzA7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5kaXJlY3Rpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX1dFU1QpCisJCXsKKwkJCXJvdCArPSAxODA7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5kaXJlY3Rpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX1NPVVRIKQorCQl7CisJCQlyb3QgKz0gOTA7CisJCX0KKwl9CisJCisJcmV0dXJuIHJvdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVRyYW5zcGFyZW50U3ZnUmVjdGFuZ2xlCisgKiAKKyAqIEFkZHMgYSB0cmFuc3BhcmVudCByZWN0YW5nbGUgdGhhdCBjYXRjaGVzIGFsbCBldmVudHMuCisgKi8KK214U2hhcGUucHJvdG90eXBlLmNyZWF0ZVRyYW5zcGFyZW50U3ZnUmVjdGFuZ2xlID0gZnVuY3Rpb24oeCwgeSwgdywgaCkKK3sKKwl2YXIgcmVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhteENvbnN0YW50cy5OU19TVkcsICdyZWN0Jyk7CisJcmVjdC5zZXRBdHRyaWJ1dGUoJ3gnLCB4KTsKKwlyZWN0LnNldEF0dHJpYnV0ZSgneScsIHkpOworCXJlY3Quc2V0QXR0cmlidXRlKCd3aWR0aCcsIHcpOworCXJlY3Quc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBoKTsKKwlyZWN0LnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7CisJcmVjdC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsICdub25lJyk7CisJcmVjdC5zZXRBdHRyaWJ1dGUoJ3BvaW50ZXItZXZlbnRzJywgJ2FsbCcpOworCQorCXJldHVybiByZWN0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0VHJhbnNwYXJlbnRCYWNrZ3JvdW5kSW1hZ2UKKyAqIAorICogU2V0cyBhIHRyYW5zcGFyZW50IGJhY2tncm91bmQgQ1NTIHN0eWxlIHRvIGNhdGNoIGFsbCBldmVudHMuCisgKiAKKyAqIFBhaW50cyB0aGUgbGluZSBzaGFwZS4KKyAqLworbXhTaGFwZS5wcm90b3R5cGUuc2V0VHJhbnNwYXJlbnRCYWNrZ3JvdW5kSW1hZ2UgPSBmdW5jdGlvbihub2RlKQoreworCW5vZGUuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJ3VybChcJycgKyBteENsaWVudC5pbWFnZUJhc2VQYXRoICsgJy90cmFuc3BhcmVudC5naWZcJyknOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVsZWFzZVN2Z0dyYWRpZW50cworICogCisgKiBQYWludHMgdGhlIGxpbmUgc2hhcGUuCisgKi8KK214U2hhcGUucHJvdG90eXBlLnJlbGVhc2VTdmdHcmFkaWVudHMgPSBmdW5jdGlvbihncmFkcykKK3sKKwlpZiAoZ3JhZHMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGtleSBpbiBncmFkcykKKwkJeworCQkJdmFyIGdyYWRpZW50ID0gZ3JhZHNba2V5XTsKKwkJCQorCQkJaWYgKGdyYWRpZW50ICE9IG51bGwpCisJCQl7CisJCQkJZ3JhZGllbnQubXhSZWZDb3VudCA9IChncmFkaWVudC5teFJlZkNvdW50IHx8IDApIC0gMTsKKwkJCQkKKwkJCQlpZiAoZ3JhZGllbnQubXhSZWZDb3VudCA9PSAwICYmIGdyYWRpZW50LnBhcmVudE5vZGUgIT0gbnVsbCkKKwkJCQl7CisJCQkJCWdyYWRpZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZ3JhZGllbnQpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqCisgKiBEZXN0cm95cyB0aGUgc2hhcGUgYnkgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgRE9NIGFuZCByZWxlYXNpbmcgdGhlIERPTQorICogbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNoYXBlIHVzaW5nIDxteEV2ZW50LnJlbGVhc2U+LgorICovCitteFNoYXBlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLm5vZGUgIT0gbnVsbCkKKwl7CisJCW14RXZlbnQucmVsZWFzZSh0aGlzLm5vZGUpOworCQkKKwkJaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlICE9IG51bGwpCisJCXsKKwkJCXRoaXMubm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubm9kZSk7CisJCX0KKwkJCisJCXRoaXMubm9kZSA9IG51bGw7CisJfQorCQorCS8vIERlY3JlbWVudHMgcmVmQ291bnQgYW5kIHJlbW92ZXMgdW51c2VkCisJdGhpcy5yZWxlYXNlU3ZnR3JhZGllbnRzKHRoaXMub2xkR3JhZGllbnRzKTsKKwl0aGlzLm9sZEdyYWRpZW50cyA9IG51bGw7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214U3RlbmNpbC5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teFN0ZW5jaWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyMmNkOAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teFN0ZW5jaWwuanMKQEAgLTAsMCArMSw3NjEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14U3RlbmNpbAorICoKKyAqIEltcGxlbWVudHMgYSBnZW5lcmljIHNoYXBlIHdoaWNoIGlzIGJhc2VkIG9uIGEgWE1MIG5vZGUgYXMgYSBkZXNjcmlwdGlvbi4KKyAqIAorICogc2hhcGU6CisgKiAKKyAqIFRoZSBvdXRlciBlbGVtZW50IGlzICpzaGFwZSosIHRoYXQgaGFzIGF0dHJpYnV0ZXM6CisgKiAKKyAqIC0gIm5hbWUiLCBzdHJpbmcsIHJlcXVpcmVkLiBUaGUgc3RlbmNpbCBuYW1lIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgc2hhcGUuCisgKiAtICJ3IiBhbmQgImgiIGFyZSBvcHRpb25hbCBkZWNpbWFsIHZpZXcgYm91bmRzLiBUaGlzIGRlZmluZXMgeW91ciBjby1vcmRpbmF0ZQorICogc3lzdGVtIGZvciB0aGUgZ3JhcGhpY3Mgb3BlcmF0aW9ucyBpbiB0aGUgc2hhcGUuIFRoZSBkZWZhdWx0IGlzIDEwMCwxMDAuCisgKiAtICJhc3BlY3QiLCBvcHRpb25hbCBzdHJpbmcuIEVpdGhlciAidmFyaWFibGUiLCB0aGUgZGVmYXVsdCwgb3IgImZpeGVkIi4gRml4ZWQKKyAqIG1lYW5zIGFsd2F5cyByZW5kZXIgdGhlIHNoYXBlIHdpdGggdGhlIGFzcGVjdCByYXRpbyBkZWZpbmVkIGJ5IHRoZSByYXRpbyB3L2guCisgKiBWYXJpYWJsZSBjYXVzZXMgdGhlIHJhdGlvIHRvIG1hdGNoIHRoYXQgb2YgdGhlIGdlb21ldHJ5IG9mIHRoZSBjdXJyZW50IHZlcnRleC4KKyAqIC0gInN0cm9rZXdpZHRoIiwgb3B0aW9uYWwgc3RyaW5nLiBFaXRoZXIgYW4gaW50ZWdlciBvciB0aGUgc3RyaW5nICJpbmhlcml0Ii4KKyAqICJpbmhlcml0IiBpbmRpY2F0ZXMgdGhhdCB0aGUgc3Ryb2tlV2lkdGggb2YgdGhlIGNlbGwgaXMgb25seSBjaGFuZ2VkIG9uIHNjYWxpbmcsCisgKiBub3Qgb24gcmVzaXppbmcuIERlZmF1bHQgaXMgIjEiLgorICogSWYgbnVtZXJpYyB2YWx1ZXMgYXJlIHVzZWQsIHRoZSBzdHJva2VXaWR0aCBvZiB0aGUgY2VsbCBpcyBjaGFuZ2VkIG9uIGJvdGgKKyAqIHNjYWxpbmcgYW5kIHJlc2l6aW5nIGFuZCB0aGUgdmFsdWUgZGVmaW5lcyB0aGUgbXVsdGlwbGUgdGhhdCBpcyBhcHBsaWVkIHRvCisgKiB0aGUgd2lkdGguCisgKiAKKyAqIGNvbm5lY3Rpb25zOgorICogCisgKiBJZiB5b3Ugd2FudCB0byBkZWZpbmUgc3BlY2lmaWMgZml4ZWQgY29ubmVjdGlvbiBwb2ludHMgb24gdGhlIHNoYXBlIHVzZSB0aGUKKyAqICpjb25uZWN0aW9ucyogZWxlbWVudC4gRWFjaCAqY29uc3RyYWludCogZWxlbWVudCB3aXRoaW4gY29ubmVjdGlvbnMgZGVmaW5lcworICogYSBmaXhlZCBjb25uZWN0aW9uIHBvaW50IG9uIHRoZSBzaGFwZS4gQ29uc3RyYWludHMgaGF2ZSBhdHRyaWJ1dGVzOgorICogCisgKiAtICJwZXJpbWV0ZXIiLCByZXF1aXJlZC4gMSBvciAwLiAwIHNldHMgdGhlIGNvbm5lY3Rpb24gcG9pbnQgd2hlcmUgc3BlY2lmaWVkCisgKiBieSB4LHkuIDEgQ2F1c2VzIHRoZSBwb3NpdGlvbiBvZiB0aGUgY29ubmVjdGlvbiBwb2ludCB0byBiZSBleHRyYXBvbGF0ZWQgZnJvbQorICogdGhlIGNlbnRlciBvZiB0aGUgc2hhcGUsIHRocm91Z2ggeCx5IHRvIHRoZSBwb2ludCBvZiBpbnRlcnNlY3Rpb24gd2l0aCB0aGUKKyAqIHBlcmltZXRlciBvZiB0aGUgc2hhcGUuCisgKiAtICJ4IiBhbmQgInkiIGFyZSB0aGUgcG9zaXRpb24gb2YgdGhlIGZpeGVkIHBvaW50IHJlbGF0aXZlIHRvIHRoZSBib3VuZHMgb2YKKyAqIHRoZSBzaGFwZS4gVGhleSBjYW4gYmUgYXV0b21hdGljYWxseSBhZGp1c3RlZCBpZiBwZXJpbWV0ZXI9MS4gU28sICgwLDApIGlzIHRvcAorICogbGVmdCwgKDAuNSwwLjUpIHRoZSBjZW50ZXIsICgxLDAuNSkgdGhlIGNlbnRlciBvZiB0aGUgcmlnaHQgaGFuZCBlZGdlIG9mIHRoZQorICogYm91bmRzLCBldGMuIFZhbHVlcyBtYXkgYmUgbGVzcyB0aGFuIDAgb3IgZ3JlYXRlciB0aGFuIDEgdG8gYmUgcG9zaXRpb25lZAorICogb3V0c2lkZSBvZiB0aGUgc2hhcGUuCisgKiAtICJuYW1lIiwgb3B0aW9uYWwgc3RyaW5nLiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcG9ydCBvbiB0aGUgc2hhcGUuCisgKiAKKyAqIGJhY2tncm91bmQgYW5kIGZvcmVncm91bmQ6CisgKiAKKyAqIFRoZSBwYXRoIG9mIHRoZSBncmFwaGljcyBkcmF3aW5nIGlzIHNwbGl0IGludG8gdHdvIGVsZW1lbnRzLCAqZm9yZWdyb3VuZCogYW5kCisgKiAqYmFja2dyb3VuZCouIFRoZSBzcGxpdCBpcyB0byBkZWZpbmUgd2hpY2ggcGFydCBhbnkgc2hhZG93IGFwcGxpZWQgdG8gdGhlIHNoYXBlCisgKiBpcyBkZXJpdmVkIGZyb20gKHRoZSBiYWNrZ3JvdW5kKS4gVGhpcywgZ2VuZXJhbGx5LCBtZWFucyB0aGUgYmFja2dyb3VuZCBpcyB0aGUKKyAqIGxpbmUgdHJhY2luZyBvZiB0aGUgb3V0c2lkZSBvZiB0aGUgc2hhcGUsIGJ1dCBub3QgYWx3YXlzLgorICogCisgKiBBbnkgc3Ryb2tlLCBmaWxsIG9yIGZpbGxzdHJva2Ugb2YgYSBiYWNrZ3JvdW5kIG11c3QgYmUgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlCisgKiBmb3JlZ3JvdW5kIGVsZW1lbnQsIHRoZXkgbXVzdCBub3QgYmUgdXNlZCB3aXRoaW4gKmJhY2tncm91bmQqLiBJZiB0aGUgYmFja2dyb3VuZAorICogaXMgZW1wdHksIHRoaXMgaXMgbm90IHJlcXVpcmVkLgorICogCisgKiBCZWNhdXNlIHRoZSBiYWNrZ3JvdW5kIGNhbm5vdCBoYXZlIGFueSBmaWxsIG9yIHN0cm9rZSwgaXQgY2FuIGNvbnRhaW4gb25seSBvbmUKKyAqICpwYXRoKiwgKnJlY3QqLCAqcm91bmRyZWN0KiBvciAqZWxsaXBzZSogZWxlbWVudCAob3Igbm9uZSkuIEl0IGNhbiBhbHNvIG5vdAorICogaW5jbHVkZSAqaW1hZ2UqLCAqdGV4dCogb3IgKmluY2x1ZGUtc2hhcGUqLgorICogCisgKiBOb3RlIHRoYXQgdGhlIHN0YXRlLCBzdHlsaW5nIGFuZCBkcmF3aW5nIGluIG14R3JhcGggc3RlbmNpbHMgaXMgdmVyeSBjbG9zZSBpbgorICogZGVzaWduIHRvIHRoYXQgb2YgSFRNTCA1IGNhbnZhcy4gVHV0b3JpYWxzIG9uIHRoaXMgc3ViamVjdCwgaWYgeW91J3JlIG5vdAorICogZmFtaWxpYXIgd2l0aCB0aGUgdG9waWMsIHdpbGwgZ2l2ZSBhIGdvb2QgaGlnaC1sZXZlbCBpbnRyb2R1Y3Rpb24gdG8gdGhlCisgKiBjb25jZXB0cyB1c2VkLgorICogCisgKiBTdGF0ZToKKyAqIAorICogUmVuZGVyaW5nIHdpdGhpbiB0aGUgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBlbGVtZW50cyBoYXMgdGhlIGNvbmNlcHQgb2YKKyAqIHN0YXRlLiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIG9wZXJhdGlvbnMgb3RoZXIgdGhhbiBzdGF0ZSBzYXZlL2xvYWQsIHN0eWxpbmcKKyAqIGFuZCBkcmF3aW5nLiBUaGUgc3R5bGluZyBvcGVyYXRpb25zIGNoYW5nZSB0aGUgY3VycmVudCBzdGF0ZSwgc28geW91IGNhbiBzYXZlCisgKiB0aGUgY3VycmVudCBzdGF0ZSB3aXRoIDxzYXZlLz4gYW5kIHB1bGwgdGhlIGxhc3Qgc2F2ZWQgc3RhdGUgZnJvbSB0aGUgc3RhdGUKKyAqIHN0YWNrIHVzaW5nIDxyZXN0b3JlLz4uCisgKiAKKyAqIFN0eWxpbmc6CisgKiAKKyAqIFRoZSBlbGVtZW50cyB0aGF0IGNoYW5nZSBjb2xvcnMgd2l0aGluIHRoZSBjdXJyZW50IHN0YXRlIGFsbCB0YWtlIGEgaGFzaAorICogcHJlZml4ZWQgaGV4IGNvbG9yIGNvZGUgKCIjRkZFQTgwIikuCisgKiAKKyAqIC0gKnN0cm9rZWNvbG9yKiwgdGhpcyBzZXRzIHRoZSBjb2xvciB0aGF0IGRyYXdpbmcgcGF0aHMgd2lsbCBiZSByZW5kZXJlZCBpbgorICogd2hlbiBhIHN0cm9rZSBvciBmaWxsc3Ryb2tlIGNvbW1hbmQgaXMgaXNzdWVkLgorICogLSAqZmlsbGNvbG9yKiwgdGhpcyBzZXRzIHRoZSBjb2xvciB0aGF0IHRoZSBpbnNpZGUgb2YgY2xvc2VkIHBhdGhzIHdpbGwgYmUKKyAqIHJlbmRlcmVkIGluIHdoZW4gYSBmaWxsIG9yIGZpbGxzdHJva2UgY29tbWFuZCBpcyBpc3N1ZWQuCisgKiAtICpmb250Y29sb3IqLCB0aGlzIHNldHMgdGhlIGNvbG9yIHRoYXQgZm9udHMgYXJlIHJlbmRlcmVkIGluIHdoZW4gdGV4dCBpcyBkcmF3bi4KKyAqIAorICogKmFscGhhKiBkZWZpbmVzIHRoZSBkZWdyZWUgb2YgdHJhbnNwYXJlbmN5IHVzZWQgYmV0d2VlbiAxLjAgZm9yIGZ1bGx5IG9wYXF1ZQorICogYW5kIDAuMCBmb3IgZnVsbHkgdHJhbnNwYXJlbnQuCisgKiAKKyAqICpzdHJva2V3aWR0aCogZGVmaW5lcyB0aGUgaW50ZWdlciB0aGlja25lc3Mgb2YgZHJhd2luZyBlbGVtZW50cyByZW5kZXJlZCBieQorICogc3Ryb2tpbmcuIFVzZSBmaXhlZD0iMSIgdG8gYXBwbHkgdGhlIHZhbHVlIGFzLWlzLCB3aXRob3V0IHNjYWxpbmcuCisgKiAKKyAqICpkYXNoZWQqIGlzICIxIiBmb3IgZGFzaGluZyBlbmFibGVkIGFuZCAiMCIgZm9yIGRpc2FibGVkLgorICogCisgKiBXaGVuICpkYXNoZWQqIGlzIGVuYWJsZWQgdGhlIGN1cnJlbnQgZGFzaCBwYXR0ZXJuLCBkZWZpbmVkIGJ5ICpkYXNocGF0dGVybiosCisgKiBpcyB1c2VkIG9uIHN0cm9rZXMuIGRhc2hwYXR0ZXJuIGlzIGEgc2VxdWVuY2Ugb2Ygc3BhY2Ugc2VwYXJhdGVkICJvbiwgb2ZmIgorICogbGVuZ3RocyB0aGF0IGRlZmluZSB3aGF0IGRpc3RhbmNlIHRvIHBhaW50IHRoZSBzdHJva2UgZm9yLCB0aGVuIHdoYXQgZGlzdGFuY2UKKyAqIHRvIHBhaW50IG5vdGhpbmcgZm9yLCByZXBlYXQuLi4gVGhlIGRlZmF1bHQgaXMgIjMgMyIuIFlvdSBjb3VsZCBkZWZpbmUgYSBtb3JlCisgKiBjb21wbGV4IHBhdHRlcm4gd2l0aCAiNSAzIDIgNiIsIGZvciBleGFtcGxlLiBHZW5lcmFsbHksIGl0IG1ha2VzIHNlbnNlIHRvIGhhdmUKKyAqIGFuIGV2ZW4gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBkYXNocGF0dGVybiwgYnV0IHRoYXQncyBub3QgcmVxdWlyZWQuCisgKiAKKyAqICpsaW5lam9pbiosICpsaW5lY2FwKiBhbmQgKm1pdGVybGltaXQqIGFyZSBiZXN0IGV4cGxhaW5lZCBieSB0aGUgTW96aWxsYSBwYWdlCisgKiBvbiBDYW52YXMgc3R5bGluZyAoYWJvdXQgaGFsZndheSBkb3duKS4gVGhlIHZhbHVlcyBhcmUgYWxsIHRoZSBzYW1lIGV4Y2VwdCB3ZQorICogdXNlICJmbGF0IiBmb3IgbGluZWNhcCwgaW5zdGVhZCBvZiBDYW52YXMnICJidXR0Ii4KKyAqIAorICogRm9yIGZvbnQgc3R5bGluZyB0aGVyZSBhcmUuCisgKiAKKyAqIC0gKmZvbnRzaXplKiwgYW4gaW50ZWdlciwKKyAqIC0gKmZvbnRzdHlsZSosIGFuIE9SZWQgYml0IHBhdHRlcm4gb2YgYm9sZCAoMSksIGl0YWxpYyAoMikgYW5kIHVuZGVybGluZSAoNCksCisgKiBpLmUgYm9sZCB1bmRlcmxpbmUgaXMgIjUiLgorICogLSAqZm9udGZhbWlseSosIGlzIGEgc3RyaW5nIGRlZmluaW5nIHRoZSB0eXBlZmFjZSB0byBiZSB1c2VkLgorICogCisgKiBEcmF3aW5nOgorICogCisgKiBNb3N0IGRyYXdpbmcgaXMgY29udGFpbmVkIHdpdGhpbiBhICpwYXRoKiBlbGVtZW50LiBBZ2FpbiwgdGhlIGdyYXBoaWMKKyAqIHByaW1pdGl2ZXMgYXJlIHZlcnkgc2ltaWxhciB0byB0aGF0IG9mIEhUTUwgNSBjYW52YXMuCisgKiAKKyAqIC0gKm1vdmUqIHRvIGF0dHJpYnV0ZXMgcmVxdWlyZWQgZGVjaW1hbHMgKHgseSkuCisgKiAtICpsaW5lKiB0byBhdHRyaWJ1dGVzIHJlcXVpcmVkIGRlY2ltYWxzICh4LHkpLgorICogLSAqcXVhZCogdG8gcmVxdWlyZWQgZGVjaW1hbHMgKHgyLHkyKSB2aWEgY29udHJvbCBwb2ludCByZXF1aXJlZCBkZWNpbWFscworICogKHgxLHkxKS4KKyAqIC0gKmN1cnZlKiB0byByZXF1aXJlZCBkZWNpbWFscyAoeDMseTMpLCB2aWEgY29udHJvbCBwb2ludHMgcmVxdWlyZWQgZGVjaW1hbHMKKyAqICh4MSx5MSkgYW5kICh4Mix5MikuCisgKiAtICphcmMqLCB0aGlzIGRvZXNuJ3QgZm9sbG93IHRoZSBIVE1MIENhbnZhcyBzaWduYXR1cmVzLCBpbnN0ZWFkIGl0J3MgYSBjb3B5CisgKiBvZiB0aGUgU1ZHIGFyYyBjb21tYW5kLiBUaGUgU1ZHIHNwZWNpZmljYXRpb24gZG9jdW1lbnRhdGlvbiBnaXZlcyB0aGUgYmVzdAorICogZGVzY3JpcHRpb24gb2YgaXRzIGJlaGF2aW9ycy4gVGhlIGF0dHJpYnV0ZXMgYXJlIG5hbWVkIGlkZW50aWNhbGx5LCB0aGV5IGFyZQorICogZGVjaW1hbHMgYW5kIGFsbCByZXF1aXJlZC4KKyAqIC0gKmNsb3NlKiBlbmRzIHRoZSBjdXJyZW50IHN1YnBhdGggYW5kIGNhdXNlcyBhbiBhdXRvbWF0aWMgc3RyYWlnaHQgbGluZSB0bworICogYmUgZHJhd24gZnJvbSB0aGUgY3VycmVudCBwb2ludCB0byB0aGUgaW5pdGlhbCBwb2ludCBvZiB0aGUgY3VycmVudCBzdWJwYXRoLgorICogCisgKiBDb21wbGV4IGRyYXdpbmc6CisgKiAKKyAqIEluIGFkZGl0aW9uIHRvIHRoZSBncmFwaGljcyBwcmltaXRpdmUgb3BlcmF0aW9ucyB0aGVyZSBhcmUgbm9uLXByaW1pdGl2ZQorICogb3BlcmF0aW9ucy4gVGhlc2UgcHJvdmlkZSBhbiBlYXN5IG1ldGhvZCB0byBkcmF3IHNvbWUgYmFzaWMgc2hhcGVzLgorICogCisgKiAtICpyZWN0KiwgYXR0cmlidXRlcyAieCIsICJ5IiwgInciLCAiaCIsIGFsbCByZXF1aXJlZCBkZWNpbWFscworICogLSAqcm91bmRyZWN0KiwgYXR0cmlidXRlcyAieCIsICJ5IiwgInciLCAiaCIsIGFsbCByZXF1aXJlZCBkZWNpbWFscy4gQWxzbworICogImFyY3NpemUiIGFuIG9wdGlvbmFsIGRlY2ltYWwgYXR0cmlidXRlIGRlZmluaW5nIGhvdyBsYXJnZSwgdGhlIGNvcm5lciBjdXJ2ZXMKKyAqIGFyZS4KKyAqIC0gKmVsbGlwc2UqLCBhdHRyaWJ1dGVzICJ4IiwgInkiLCAidyIsICJoIiwgYWxsIHJlcXVpcmVkIGRlY2ltYWxzLgorICogCisgKiBOb3RlIHRoYXQgdGhlc2UgMyBzaGFwZXMgYW5kIGFsbCBwYXRocyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGVpdGhlciBhIGZpbGwsCisgKiBzdHJva2UsIG9yIGZpbGxzdHJva2UuCisgKiAKKyAqIFRleHQ6CisgKiAKKyAqICp0ZXh0KiBlbGVtZW50cyBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcy4KKyAqIAorICogLSAic3RyIiwgdGhlIHRleHQgc3RyaW5nIHRvIGRpc3BsYXksIHJlcXVpcmVkLgorICogLSAieCIgYW5kICJ5IiwgdGhlIGRlY2ltYWwgbG9jYXRpb24gKHgseSkgb2YgdGhlIHRleHQgZWxlbWVudCwgcmVxdWlyZWQuCisgKiAtICJhbGlnbiIsIHRoZSBob3Jpem9udGFsIGFsaWdubWVudCBvZiB0aGUgdGV4dCBlbGVtZW50LCBlaXRoZXIgImxlZnQiLAorICogImNlbnRlciIgb3IgInJpZ2h0Ii4gT3B0aW9uYWwsIGRlZmF1bHQgaXMgImxlZnQiLgorICogLSAidmFsaWduIiwgdGhlIHZlcnRpY2FsIGFsaWdubWVudCBvZiB0aGUgdGV4dCBlbGVtZW50LCBlaXRoZXIgInRvcCIsICJtaWRkbGUiCisgKiBvciAiYm90dG9tIi4gT3B0aW9uYWwsIGRlZmF1bHQgaXMgInRvcCIuCisgKiAtICJsb2NhbGl6ZWQiLCAwIG9yIDEsIGlmIDEgdGhlbiB0aGUgInN0ciIgYWN0dWFsbHkgY29udGFpbnMgYSBrZXkgdG8gdXNlIHRvCisgKiBmZXRjaCB0aGUgdmFsdWUgb3V0IG9mIG14UmVzb3VyY2VzLiBPcHRpb25hbCwgZGVmYXVsdCBpcworICogPG14U3RlbmNpbC5kZWZhdWx0TG9jYWxpemVkPi4KKyAqIC0gInZlcnRpY2FsIiwgMCBvciAxLCBpZiAxIHRoZSBsYWJlbCBpcyByZW5kZXJlZCB2ZXJ0aWNhbGx5IChyb3RhdGVkIGJ5IDkwCisgKiBkZWdyZWVzKS4gT3B0aW9uYWwsIGRlZmF1bHQgaXMgMC4KKyAqIC0gInJvdGF0aW9uIiwgYW5nbGUgaW4gZGVncmVlcyAoMCB0byAzNjApLiBUaGUgYW5nbGUgdG8gcm90YXRlIHRoZSB0ZXh0IGJ5LgorICogT3B0aW9uYWwsIGRlZmF1bHQgaXMgMC4KKyAqIC0gImFsaWduLXNoYXBlIiwgMCBvciAxLCBpZiAwIGlnbm9yZSB0aGUgcm90YXRpb24gb2YgdGhlIHNoYXBlIHdoZW4gc2V0dGluZworICogdGhlIHRleHQgcm90YXRpb24uIE9wdGlvbmFsLCBkZWZhdWx0IGlzIDEuCisgKiAKKyAqIElmIDxhbGxvd0V2YWw+IGlzIHRydWUsIHRoZW4gdGhlIHRleHQgY29udGVudCBvZiB0aGUgdGhpcyBlbGVtZW50IGNhbiBkZWZpbmUKKyAqIGEgZnVuY3Rpb24gd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSBzaGFwZSBhcyB0aGUgb25seSBhcmd1bWVudCBhbmQgcmV0dXJucworICogdGhlIHZhbHVlIGZvciB0aGUgdGV4dCBlbGVtZW50IChpZ25vcmVkIGlmIHRoZSBzdHIgYXR0cmlidXRlIGlzIG5vdCBudWxsKS4KKyAqIAorICogSW1hZ2VzOgorICogCisgKiAqaW1hZ2UqIGVsZW1lbnRzIGNhbiBlaXRoZXIgYmUgZXh0ZXJuYWwgVVJMcywgb3IgZGF0YSBVUklzLCB3aGVyZSBzdXBwb3J0ZWQKKyAqIChub3QgaW4gSUUgNy0pLiBBdHRyaWJ1dGVzIGFyZToKKyAqIAorICogLSAic3JjIiwgcmVxdWlyZWQgc3RyaW5nLiBFaXRoZXIgYSBkYXRhIFVSSSBvciBVUkwuCisgKiAtICJ4IiwgInkiLCByZXF1aXJlZCBkZWNpbWFscy4gVGhlICh4LHkpIHBvc2l0aW9uIG9mIHRoZSBpbWFnZS4KKyAqIC0gInciLCAiaCIsIHJlcXVpcmVkIGRlY2ltYWxzLiBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgaW1hZ2UuCisgKiAtICJmbGlwSCIgYW5kICJmbGlwViIsIG9wdGlvbmFsIDAgb3IgMS4gV2hldGhlciB0byBmbGlwIHRoZSBpbWFnZSBhbG9uZyB0aGUKKyAqIGhvcml6b250YWwvdmVydGljYWwgYXhpcy4gRGVmYXVsdCBpcyAwIGZvciBib3RoLgorICogCisgKiBJZiA8YWxsb3dFdmFsPiBpcyB0cnVlLCB0aGVuIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHRoaXMgZWxlbWVudCBjYW4gZGVmaW5lCisgKiBhIGZ1bmN0aW9uIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgc2hhcGUgYXMgdGhlIG9ubHkgYXJndW1lbnQgYW5kIHJldHVybnMKKyAqIHRoZSB2YWx1ZSBmb3IgdGhlIGltYWdlIHNvdXJjZSAoaWdub3JlZCBpZiB0aGUgc3JjIGF0dHJpYnV0ZSBpcyBub3QgbnVsbCkuCisgKiAKKyAqIFN1Yi1zaGFwZXM6CisgKiAKKyAqICppbmNsdWRlLXNoYXBlKiBhbGxvdyBzdGVuY2lscyB0byBiZSByZW5kZXJlZCB3aXRoaW4gdGhlIGN1cnJlbnQgc3RlbmNpbCBieQorICogcmVmZXJlbmNpbmcgdGhlIHN1Yi1zdGVuY2lsIGJ5IG5hbWUuIEF0dHJpYnV0ZXMgYXJlOgorICogCisgKiAtICJuYW1lIiwgcmVxdWlyZWQgc3RyaW5nLiBUaGUgdW5pcXVlIHNoYXBlIG5hbWUgb2YgdGhlIHN0ZW5jaWwuCisgKiAtICJ4IiwgInkiLCAidyIsICJoIiwgcmVxdWlyZWQgZGVjaW1hbHMuIFRoZSAoeCx5KSBwb3NpdGlvbiBvZiB0aGUgc3ViLXNoYXBlCisgKiBhbmQgaXRzIHdpZHRoIGFuZCBoZWlnaHQuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteFN0ZW5jaWwKKyAqIAorICogQ29uc3RydWN0cyBhIG5ldyBnZW5lcmljIHNoYXBlIGJ5IHNldHRpbmcgPGRlc2M+IHRvIHRoZSBnaXZlbiBYTUwgbm9kZSBhbmQKKyAqIGludm9raW5nIDxwYXJzZURlc2NyaXB0aW9uPiBhbmQgPHBhcnNlQ29uc3RyYWludHM+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBkZXNjIC0gWE1MIG5vZGUgdGhhdCBjb250YWlucyB0aGUgc3RlbmNpbCBkZXNjcmlwdGlvbi4KKyAqLworZnVuY3Rpb24gbXhTdGVuY2lsKGRlc2MpCit7CisJdGhpcy5kZXNjID0gZGVzYzsKKwl0aGlzLnBhcnNlRGVzY3JpcHRpb24oKTsKKwl0aGlzLnBhcnNlQ29uc3RyYWludHMoKTsKK307CisKKy8qKgorICogVmFyaWFibGU6IGRlZmF1bHRMb2NhbGl6ZWQKKyAqIAorICogU3RhdGljIGdsb2JhbCB2YXJpYWJsZSB0aGF0IHNwZWNpZmllcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGxvY2FsaXplZAorICogYXR0cmlidXRlIG9mIHRoZSB0ZXh0IGVsZW1lbnQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214U3RlbmNpbC5kZWZhdWx0TG9jYWxpemVkID0gZmFsc2U7CisKKy8qKgorICogRnVuY3Rpb246IGFsbG93RXZhbAorICogCisgKiBTdGF0aWMgZ2xvYmFsIHN3aXRjaCB0aGF0IHNwZWNpZmllcyBpZiB0aGUgdXNlIG9mIGV2YWwgaXMgYWxsb3dlZCBmb3IKKyAqIGV2YWx1YXRpbmcgdGV4dCBjb250ZW50IGFuZCBpbWFnZXMuIERlZmF1bHQgaXMgZmFsc2UuIFNldCB0aGlzIHRvIHRydWUKKyAqIGlmIHN0ZW5jaWxzIGNhbiBub3QgY29udGFpbiB1c2VyIGlucHV0LgorICovCitteFN0ZW5jaWwuYWxsb3dFdmFsID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGRlc2MKKyAqCisgKiBIb2xkcyB0aGUgWE1MIG5vZGUgd2l0aCB0aGUgc3RlbmNpbCBkZXNjcmlwdGlvbi4KKyAqLworbXhTdGVuY2lsLnByb3RvdHlwZS5kZXNjID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogY29uc3RyYWludHMKKyAqIAorICogSG9sZHMgYW4gYXJyYXkgb2YgPG14Q29ubmVjdGlvbkNvbnN0cmFpbnRzPiBhcyBkZWZpbmVkIGluIHRoZSBzaGFwZS4KKyAqLworbXhTdGVuY2lsLnByb3RvdHlwZS5jb25zdHJhaW50cyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGFzcGVjdAorICoKKyAqIEhvbGRzIHRoZSBhc3BlY3Qgb2YgdGhlIHNoYXBlLiBEZWZhdWx0IGlzICdhdXRvJy4KKyAqLworbXhTdGVuY2lsLnByb3RvdHlwZS5hc3BlY3QgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB3MAorICoKKyAqIEhvbGRzIHRoZSB3aWR0aCBvZiB0aGUgc2hhcGUuIERlZmF1bHQgaXMgMTAwLgorICovCitteFN0ZW5jaWwucHJvdG90eXBlLncwID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogaDAKKyAqCisgKiBIb2xkcyB0aGUgaGVpZ2h0IG9mIHRoZSBzaGFwZS4gRGVmYXVsdCBpcyAxMDAuCisgKi8KK214U3RlbmNpbC5wcm90b3R5cGUuaDAgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBiZ05vZGVzCisgKgorICogSG9sZHMgdGhlIFhNTCBub2RlIHdpdGggdGhlIHN0ZW5jaWwgZGVzY3JpcHRpb24uCisgKi8KK214U3RlbmNpbC5wcm90b3R5cGUuYmdOb2RlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZmdOb2RlcworICoKKyAqIEhvbGRzIHRoZSBYTUwgbm9kZSB3aXRoIHRoZSBzdGVuY2lsIGRlc2NyaXB0aW9uLgorICovCitteFN0ZW5jaWwucHJvdG90eXBlLmZnTm9kZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHN0cm9rZXdpZHRoCisgKgorICogSG9sZHMgdGhlIHN0cm9rZXdpZHRoIGRpcmVjdGlvbiBmcm9tIHRoZSBkZXNjcmlwdGlvbi4KKyAqLworbXhTdGVuY2lsLnByb3RvdHlwZS5zdHJva2V3aWR0aCA9IG51bGw7CisKKy8qKgorICogRnVuY3Rpb246IHBhcnNlRGVzY3JpcHRpb24KKyAqCisgKiBSZWFkcyA8dzA+LCA8aDA+LCA8YXNwZWN0PiwgPGJnTm9kZXM+IGFuZCA8ZmdOb2Rlcz4gZnJvbSA8ZGVzYz4uCisgKi8KK214U3RlbmNpbC5wcm90b3R5cGUucGFyc2VEZXNjcmlwdGlvbiA9IGZ1bmN0aW9uKCkKK3sKKwkvLyBMQVRFUjogUHJlcHJvY2VzcyBub2RlcyBmb3IgZmFzdGVyIHBhaW50aW5nCisJdGhpcy5mZ05vZGUgPSB0aGlzLmRlc2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ZvcmVncm91bmQnKVswXTsKKwl0aGlzLmJnTm9kZSA9IHRoaXMuZGVzYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFja2dyb3VuZCcpWzBdOworCXRoaXMudzAgPSBOdW1iZXIodGhpcy5kZXNjLmdldEF0dHJpYnV0ZSgndycpIHx8IDEwMCk7CisJdGhpcy5oMCA9IE51bWJlcih0aGlzLmRlc2MuZ2V0QXR0cmlidXRlKCdoJykgfHwgMTAwKTsKKwkKKwkvLyBQb3NzaWJsZSB2YWx1ZXMgZm9yIGFzcGVjdCBhcmU6IHZhcmlhYmxlIGFuZCBmaXhlZCB3aGVyZQorCS8vIHZhcmlhYmxlIG1lYW5zIGZpbGwgdGhlIGF2YWlsYWJsZSBzcGFjZSBhbmQgZml4ZWQgbWVhbnMKKwkvLyB1c2UgdzAgYW5kIGgwIHRvIGNvbXB1dGUgdGhlIGFzcGVjdC4KKwl2YXIgYXNwZWN0ID0gdGhpcy5kZXNjLmdldEF0dHJpYnV0ZSgnYXNwZWN0Jyk7CisJdGhpcy5hc3BlY3QgPSAoYXNwZWN0ICE9IG51bGwpID8gYXNwZWN0IDogJ3ZhcmlhYmxlJzsKKwkKKwkvLyBQb3NzaWJsZSB2YWx1ZXMgZm9yIHN0cm9rZXdpZHRoIGFyZSBhbGwgbnVtYmVycyBhbmQgImluaGVyaXQiCisJLy8gd2hlcmUgdGhlIGluaGVyaXQgbWVhbnMgdGFrZSB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgKGllLiB0aGUKKwkvLyB1c2VyLWRlZmluZWQgc3Ryb2tlLXdpZHRoKS4gTm90ZSB0aGF0IHRoZSBzdHJva2V3aWR0aCBpcyBzY2FsZWQKKwkvLyBieSB0aGUgbWluaW11bSBzY2FsaW5nIHRoYXQgaXMgdXNlZCB0byBkcmF3IHRoZSBzaGFwZSAoc3gsIHN5KS4KKwl2YXIgc3cgPSB0aGlzLmRlc2MuZ2V0QXR0cmlidXRlKCdzdHJva2V3aWR0aCcpOworCXRoaXMuc3Ryb2tld2lkdGggPSAoc3cgIT0gbnVsbCkgPyBzdyA6ICcxJzsKK307CisKKy8qKgorICogRnVuY3Rpb246IHBhcnNlQ29uc3RyYWludHMKKyAqCisgKiBSZWFkcyB0aGUgY29uc3RyYWludHMgZnJvbSA8ZGVzYz4gaW50byA8Y29uc3RyYWludHM+IHVzaW5nCisgKiA8cGFyc2VDb25zdHJhaW50Pi4KKyAqLworbXhTdGVuY2lsLnByb3RvdHlwZS5wYXJzZUNvbnN0cmFpbnRzID0gZnVuY3Rpb24oKQoreworCXZhciBjb25ucyA9IHRoaXMuZGVzYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY29ubmVjdGlvbnMnKVswXTsKKwkKKwlpZiAoY29ubnMgIT0gbnVsbCkKKwl7CisJCXZhciB0bXAgPSBteFV0aWxzLmdldENoaWxkTm9kZXMoY29ubnMpOworCQkKKwkJaWYgKHRtcCAhPSBudWxsICYmIHRtcC5sZW5ndGggPiAwKQorCQl7CisJCQl0aGlzLmNvbnN0cmFpbnRzID0gW107CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgdG1wLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCXRoaXMuY29uc3RyYWludHMucHVzaCh0aGlzLnBhcnNlQ29uc3RyYWludCh0bXBbaV0pKTsKKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHBhcnNlQ29uc3RyYWludAorICoKKyAqIFBhcnNlcyB0aGUgZ2l2ZW4gWE1MIG5vZGUgYW5kIHJldHVybnMgaXRzIDxteENvbm5lY3Rpb25Db25zdHJhaW50Pi4KKyAqLworbXhTdGVuY2lsLnByb3RvdHlwZS5wYXJzZUNvbnN0cmFpbnQgPSBmdW5jdGlvbihub2RlKQoreworCXZhciB4ID0gTnVtYmVyKG5vZGUuZ2V0QXR0cmlidXRlKCd4JykpOworCXZhciB5ID0gTnVtYmVyKG5vZGUuZ2V0QXR0cmlidXRlKCd5JykpOworCXZhciBwZXJpbWV0ZXIgPSBub2RlLmdldEF0dHJpYnV0ZSgncGVyaW1ldGVyJykgPT0gJzEnOworCXZhciBuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ25hbWUnKTsKKwkKKwlyZXR1cm4gbmV3IG14Q29ubmVjdGlvbkNvbnN0cmFpbnQobmV3IG14UG9pbnQoeCwgeSksIHBlcmltZXRlciwgbmFtZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBldmFsdWF0ZVRleHRBdHRyaWJ1dGUKKyAqIAorICogR2V0cyB0aGUgZ2l2ZW4gYXR0cmlidXRlIGFzIGEgdGV4dC4gVGhlIHJldHVybiB2YWx1ZSBmcm9tIDxldmFsdWF0ZUF0dHJpYnV0ZT4KKyAqIGlzIHVzZWQgYXMgYSBrZXkgdG8gPG14UmVzb3VyY2VzLmdldD4gaWYgdGhlIGxvY2FsaXplZCBhdHRyaWJ1dGUgaW4gdGhlIHRleHQKKyAqIG5vZGUgaXMgMSBvciBpZiA8ZGVmYXVsdExvY2FsaXplZD4gaXMgdHJ1ZS4KKyAqLworbXhTdGVuY2lsLnByb3RvdHlwZS5ldmFsdWF0ZVRleHRBdHRyaWJ1dGUgPSBmdW5jdGlvbihub2RlLCBhdHRyaWJ1dGUsIHNoYXBlKQoreworCXZhciByZXN1bHQgPSB0aGlzLmV2YWx1YXRlQXR0cmlidXRlKG5vZGUsIGF0dHJpYnV0ZSwgc2hhcGUpOworCXZhciBsb2MgPSBub2RlLmdldEF0dHJpYnV0ZSgnbG9jYWxpemVkJyk7CisJCisJaWYgKChteFN0ZW5jaWwuZGVmYXVsdExvY2FsaXplZCAmJiBsb2MgPT0gbnVsbCkgfHwgbG9jID09ICcxJykKKwl7CisJCXJlc3VsdCA9IG14UmVzb3VyY2VzLmdldChyZXN1bHQpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBldmFsdWF0ZUF0dHJpYnV0ZQorICoKKyAqIEdldHMgdGhlIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIG5hbWUgZnJvbSB0aGUgZ2l2ZW4gbm9kZS4gSWYgdGhlIGF0dHJpYnV0ZQorICogZG9lcyBub3QgZXhpc3QgdGhlbiB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBub2RlIGlzIGV2YWx1YXRlZCBhbmQgaWYgaXQgaXMKKyAqIGEgZnVuY3Rpb24gaXQgaXMgaW52b2tlZCB3aXRoIDxzaGFwZT4gYXMgdGhlIG9ubHkgYXJndW1lbnQgYW5kIHRoZSByZXR1cm4KKyAqIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBiZSByZXR1cm5lZC4KKyAqLworbXhTdGVuY2lsLnByb3RvdHlwZS5ldmFsdWF0ZUF0dHJpYnV0ZSA9IGZ1bmN0aW9uKG5vZGUsIGF0dHJpYnV0ZSwgc2hhcGUpCit7CisJdmFyIHJlc3VsdCA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7CisJCisJaWYgKHJlc3VsdCA9PSBudWxsKQorCXsKKwkJdmFyIHRleHQgPSBteFV0aWxzLmdldFRleHRDb250ZW50KG5vZGUpOworCQkKKwkJaWYgKHRleHQgIT0gbnVsbCAmJiBteFN0ZW5jaWwuYWxsb3dFdmFsKQorCQl7CisJCQl2YXIgZnVuY3QgPSBteFV0aWxzLmV2YWwodGV4dCk7CisJCQkKKwkJCWlmICh0eXBlb2YoZnVuY3QpID09ICdmdW5jdGlvbicpCisJCQl7CisJCQkJcmVzdWx0ID0gZnVuY3Qoc2hhcGUpOworCQkJfQorCQl9CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkcmF3U2hhcGUKKyAqCisgKiBEcmF3cyB0aGlzIHN0ZW5jaWwgaW5zaWRlIHRoZSBnaXZlbiBib3VuZHMuCisgKi8KK214U3RlbmNpbC5wcm90b3R5cGUuZHJhd1NoYXBlID0gZnVuY3Rpb24oY2FudmFzLCBzaGFwZSwgeCwgeSwgdywgaCkKK3sKKwkvLyBUT0RPOiBJbnRlcm5hbCBzdHJ1Y3R1cmUgKGFycmF5IG9mIHNwZWNpYWwgc3RydWN0cz8pLCByZWxhdGl2ZSBhbmQgYWJzb2x1dGUKKwkvLyBjb29yZGluYXRlcyAoZWcuIG5vdGUgc2hhcGUsIHByb2Nlc3MgdnMgc3RhciwgYWN0b3IgZXRjLiksIHRleHQgcmVuZGVyaW5nCisJLy8gYW5kIG5vbi1wcm9wb3J0aW9uYWwgc2NhbGluZywgaG93IHRvIGltcGxlbWVudCBwbHVnZ2FibGUgZWRnZSBzaGFwZXMKKwkvLyAoc3RhcnQsIHNlZ21lbnQsIGVuZCBibG9ja3MpLCBwbHVnZ2FibGUgbWFya2VycywgaG93IHRvIGltcGxlbWVudAorCS8vIHN3aW1sYW5lcyAodGl0bGUgYXJlYSkgd2l0aCB0aGlzIEFQSSwgYWRkIGljb24sIGhvcml6b250YWwvdmVydGljYWwKKwkvLyBsYWJlbCwgaW5kaWNhdG9yIGZvciBhbGwgc2hhcGVzLCByb3RhdGlvbgorCXZhciBkaXJlY3Rpb24gPSBteFV0aWxzLmdldFZhbHVlKHNoYXBlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9ESVJFQ1RJT04sIG51bGwpOworCXZhciBhc3BlY3QgPSB0aGlzLmNvbXB1dGVBc3BlY3Qoc2hhcGUuc3R5bGUsIHgsIHksIHcsIGgsIGRpcmVjdGlvbik7CisJdmFyIG1pblNjYWxlID0gTWF0aC5taW4oYXNwZWN0LndpZHRoLCBhc3BlY3QuaGVpZ2h0KTsKKwl2YXIgc3cgPSAodGhpcy5zdHJva2V3aWR0aCA9PSAnaW5oZXJpdCcpID8KKwkJCU51bWJlcihteFV0aWxzLmdldE51bWJlcihzaGFwZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfU1RST0tFV0lEVEgsIDEpKSA6CisJCQlOdW1iZXIodGhpcy5zdHJva2V3aWR0aCkgKiBtaW5TY2FsZTsKKwljYW52YXMuc2V0U3Ryb2tlV2lkdGgoc3cpOworCisJdGhpcy5kcmF3Q2hpbGRyZW4oY2FudmFzLCBzaGFwZSwgeCwgeSwgdywgaCwgdGhpcy5iZ05vZGUsIGFzcGVjdCwgZmFsc2UpOworCXRoaXMuZHJhd0NoaWxkcmVuKGNhbnZhcywgc2hhcGUsIHgsIHksIHcsIGgsIHRoaXMuZmdOb2RlLCBhc3BlY3QsIHRydWUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZHJhd0NoaWxkcmVuCisgKgorICogRHJhd3MgdGhpcyBzdGVuY2lsIGluc2lkZSB0aGUgZ2l2ZW4gYm91bmRzLgorICovCitteFN0ZW5jaWwucHJvdG90eXBlLmRyYXdDaGlsZHJlbiA9IGZ1bmN0aW9uKGNhbnZhcywgc2hhcGUsIHgsIHksIHcsIGgsIG5vZGUsIGFzcGVjdCwgZGlzYWJsZVNoYWRvdykKK3sKKwlpZiAobm9kZSAhPSBudWxsICYmIHcgPiAwICYmIGggPiAwKQorCXsKKwkJdmFyIHRtcCA9IG5vZGUuZmlyc3RDaGlsZDsKKwkJCisJCXdoaWxlICh0bXAgIT0gbnVsbCkKKwkJeworCQkJaWYgKHRtcC5ub2RlVHlwZSA9PSBteENvbnN0YW50cy5OT0RFVFlQRV9FTEVNRU5UKQorCQkJeworCQkJCXRoaXMuZHJhd05vZGUoY2FudmFzLCBzaGFwZSwgdG1wLCBhc3BlY3QsIGRpc2FibGVTaGFkb3cpOworCQkJfQorCQkJCisJCQl0bXAgPSB0bXAubmV4dFNpYmxpbmc7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjb21wdXRlQXNwZWN0CisgKgorICogUmV0dXJucyBhIHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBvZmZzZXQgaW4geCBhbmQgeSBhbmQgdGhlIGhvcml6b250YWwKKyAqIGFuZCB2ZXJ0aWNhbCBzY2FsZSBpbiB3aWR0aCBhbmQgaGVpZ2h0IHVzZWQgdG8gZHJhdyB0aGlzIHNoYXBlIGluc2lkZSB0aGUKKyAqIGdpdmVuIDxteFJlY3RhbmdsZT4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHNoYXBlIC0gPG14U2hhcGU+IHRvIGJlIGRyYXduLgorICogYm91bmRzIC0gPG14UmVjdGFuZ2xlPiB0aGF0IHNob3VsZCBjb250YWluIHRoZSBzdGVuY2lsLgorICogZGlyZWN0aW9uIC0gT3B0aW9uYWwgZGlyZWN0aW9uIG9mIHRoZSBzaGFwZSB0byBiZSBkYXJ3bi4KKyAqLworbXhTdGVuY2lsLnByb3RvdHlwZS5jb21wdXRlQXNwZWN0ID0gZnVuY3Rpb24oc2hhcGUsIHgsIHksIHcsIGgsIGRpcmVjdGlvbikKK3sKKwl2YXIgeDAgPSB4OworCXZhciB5MCA9IHk7CisJdmFyIHN4ID0gdyAvIHRoaXMudzA7CisJdmFyIHN5ID0gaCAvIHRoaXMuaDA7CisJCisJdmFyIGludmVyc2UgPSAoZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9OT1JUSCB8fCBkaXJlY3Rpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX1NPVVRIKTsKKworCWlmIChpbnZlcnNlKQorCXsKKwkJc3kgPSB3IC8gdGhpcy5oMDsKKwkJc3ggPSBoIC8gdGhpcy53MDsKKwkJCisJCXZhciBkZWx0YSA9ICh3IC0gaCkgLyAyOworCisJCXgwICs9IGRlbHRhOworCQl5MCAtPSBkZWx0YTsKKwl9CisKKwlpZiAodGhpcy5hc3BlY3QgPT0gJ2ZpeGVkJykKKwl7CisJCXN5ID0gTWF0aC5taW4oc3gsIHN5KTsKKwkJc3ggPSBzeTsKKwkJCisJCS8vIENlbnRlcnMgdGhlIHNoYXBlIGluc2lkZSB0aGUgYXZhaWxhYmxlIHNwYWNlCisJCWlmIChpbnZlcnNlKQorCQl7CisJCQl4MCArPSAoaCAtIHRoaXMudzAgKiBzeCkgLyAyOworCQkJeTAgKz0gKHcgLSB0aGlzLmgwICogc3kpIC8gMjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXgwICs9ICh3IC0gdGhpcy53MCAqIHN4KSAvIDI7CisJCQl5MCArPSAoaCAtIHRoaXMuaDAgKiBzeSkgLyAyOworCQl9CisJfQorCisJcmV0dXJuIG5ldyBteFJlY3RhbmdsZSh4MCwgeTAsIHN4LCBzeSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkcmF3Tm9kZQorICoKKyAqIERyYXdzIHRoaXMgc3RlbmNpbCBpbnNpZGUgdGhlIGdpdmVuIGJvdW5kcy4KKyAqLworbXhTdGVuY2lsLnByb3RvdHlwZS5kcmF3Tm9kZSA9IGZ1bmN0aW9uKGNhbnZhcywgc2hhcGUsIG5vZGUsIGFzcGVjdCwgZGlzYWJsZVNoYWRvdykKK3sKKwl2YXIgbmFtZSA9IG5vZGUubm9kZU5hbWU7CisJdmFyIHgwID0gYXNwZWN0Lng7CisJdmFyIHkwID0gYXNwZWN0Lnk7CisJdmFyIHN4ID0gYXNwZWN0LndpZHRoOworCXZhciBzeSA9IGFzcGVjdC5oZWlnaHQ7CisJdmFyIG1pblNjYWxlID0gTWF0aC5taW4oc3gsIHN5KTsKKworCWlmIChuYW1lID09ICdzYXZlJykKKwl7CisJCWNhbnZhcy5zYXZlKCk7CisJfQorCWVsc2UgaWYgKG5hbWUgPT0gJ3Jlc3RvcmUnKQorCXsKKwkJY2FudmFzLnJlc3RvcmUoKTsKKwl9CisJZWxzZSBpZiAobmFtZSA9PSAncGF0aCcpCisJeworCQljYW52YXMuYmVnaW4oKTsKKworCQkvLyBSZW5kZXJzIHRoZSBlbGVtZW50cyBpbnNpZGUgdGhlIGdpdmVuIHBhdGgKKwkJdmFyIGNoaWxkTm9kZSA9IG5vZGUuZmlyc3RDaGlsZDsKKwkJCisJCXdoaWxlIChjaGlsZE5vZGUgIT0gbnVsbCkKKwkJeworCQkJaWYgKGNoaWxkTm9kZS5ub2RlVHlwZSA9PSBteENvbnN0YW50cy5OT0RFVFlQRV9FTEVNRU5UKQorCQkJeworCQkJCXRoaXMuZHJhd05vZGUoY2FudmFzLCBzaGFwZSwgY2hpbGROb2RlLCBhc3BlY3QsIGRpc2FibGVTaGFkb3cpOworCQkJfQorCQkJCisJCQljaGlsZE5vZGUgPSBjaGlsZE5vZGUubmV4dFNpYmxpbmc7CisJCX0KKwl9CisJZWxzZSBpZiAobmFtZSA9PSAnY2xvc2UnKQorCXsKKwkJY2FudmFzLmNsb3NlKCk7CisJfQorCWVsc2UgaWYgKG5hbWUgPT0gJ21vdmUnKQorCXsKKwkJY2FudmFzLm1vdmVUbyh4MCArIE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgneCcpKSAqIHN4LCB5MCArIE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgneScpKSAqIHN5KTsKKwl9CisJZWxzZSBpZiAobmFtZSA9PSAnbGluZScpCisJeworCQljYW52YXMubGluZVRvKHgwICsgTnVtYmVyKG5vZGUuZ2V0QXR0cmlidXRlKCd4JykpICogc3gsIHkwICsgTnVtYmVyKG5vZGUuZ2V0QXR0cmlidXRlKCd5JykpICogc3kpOworCX0KKwllbHNlIGlmIChuYW1lID09ICdxdWFkJykKKwl7CisJCWNhbnZhcy5xdWFkVG8oeDAgKyBOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ3gxJykpICogc3gsCisJCQkJeTAgKyBOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ3kxJykpICogc3ksCisJCQkJeDAgKyBOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ3gyJykpICogc3gsCisJCQkJeTAgKyBOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ3kyJykpICogc3kpOworCX0KKwllbHNlIGlmIChuYW1lID09ICdjdXJ2ZScpCisJeworCQljYW52YXMuY3VydmVUbyh4MCArIE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgneDEnKSkgKiBzeCwKKwkJCQl5MCArIE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgneTEnKSkgKiBzeSwKKwkJCQl4MCArIE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgneDInKSkgKiBzeCwKKwkJCQl5MCArIE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgneTInKSkgKiBzeSwKKwkJCQl4MCArIE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgneDMnKSkgKiBzeCwKKwkJCQl5MCArIE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgneTMnKSkgKiBzeSk7CisJfQorCWVsc2UgaWYgKG5hbWUgPT0gJ2FyYycpCisJeworCQljYW52YXMuYXJjVG8oTnVtYmVyKG5vZGUuZ2V0QXR0cmlidXRlKCdyeCcpKSAqIHN4LAorCQkJCU51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgncnknKSkgKiBzeSwKKwkJCQlOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ3gtYXhpcy1yb3RhdGlvbicpKSwKKwkJCQlOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ2xhcmdlLWFyYy1mbGFnJykpLAorCQkJCU51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgnc3dlZXAtZmxhZycpKSwKKwkJCQl4MCArIE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgneCcpKSAqIHN4LAorCQkJCXkwICsgTnVtYmVyKG5vZGUuZ2V0QXR0cmlidXRlKCd5JykpICogc3kpOworCX0KKwllbHNlIGlmIChuYW1lID09ICdyZWN0JykKKwl7CisJCWNhbnZhcy5yZWN0KHgwICsgTnVtYmVyKG5vZGUuZ2V0QXR0cmlidXRlKCd4JykpICogc3gsCisJCQkJeTAgKyBOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ3knKSkgKiBzeSwKKwkJCQlOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ3cnKSkgKiBzeCwKKwkJCQlOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ2gnKSkgKiBzeSk7CisJfQorCWVsc2UgaWYgKG5hbWUgPT0gJ3JvdW5kcmVjdCcpCisJeworCQl2YXIgYXJjc2l6ZSA9IE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgnYXJjc2l6ZScpKTsKKworCQlpZiAoYXJjc2l6ZSA9PSAwKQorCQl7CisJCQlhcmNzaXplID0gbXhDb25zdGFudHMuUkVDVEFOR0xFX1JPVU5ESU5HX0ZBQ1RPUiAqIDEwMDsKKwkJfQorCQkKKwkJdmFyIHcgPSBOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ3cnKSkgKiBzeDsKKwkJdmFyIGggPSBOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ2gnKSkgKiBzeTsKKwkJdmFyIGZhY3RvciA9IE51bWJlcihhcmNzaXplKSAvIDEwMDsKKwkJdmFyIHIgPSBNYXRoLm1pbih3ICogZmFjdG9yLCBoICogZmFjdG9yKTsKKwkJCisJCWNhbnZhcy5yb3VuZHJlY3QoeDAgKyBOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ3gnKSkgKiBzeCwKKwkJCQl5MCArIE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgneScpKSAqIHN5LAorCQkJCXcsIGgsIHIsIHIpOworCX0KKwllbHNlIGlmIChuYW1lID09ICdlbGxpcHNlJykKKwl7CisJCWNhbnZhcy5lbGxpcHNlKHgwICsgTnVtYmVyKG5vZGUuZ2V0QXR0cmlidXRlKCd4JykpICogc3gsCisJCQl5MCArIE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgneScpKSAqIHN5LAorCQkJTnVtYmVyKG5vZGUuZ2V0QXR0cmlidXRlKCd3JykpICogc3gsCisJCQlOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ2gnKSkgKiBzeSk7CisJfQorCWVsc2UgaWYgKG5hbWUgPT0gJ2ltYWdlJykKKwl7CisJCWlmICghc2hhcGUub3V0bGluZSkKKwkJeworCQkJdmFyIHNyYyA9IHRoaXMuZXZhbHVhdGVBdHRyaWJ1dGUobm9kZSwgJ3NyYycsIHNoYXBlKTsKKwkJCQorCQkJY2FudmFzLmltYWdlKHgwICsgTnVtYmVyKG5vZGUuZ2V0QXR0cmlidXRlKCd4JykpICogc3gsCisJCQkJeTAgKyBOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ3knKSkgKiBzeSwKKwkJCQlOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ3cnKSkgKiBzeCwKKwkJCQlOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ2gnKSkgKiBzeSwKKwkJCQlzcmMsIGZhbHNlLCBub2RlLmdldEF0dHJpYnV0ZSgnZmxpcEgnKSA9PSAnMScsCisJCQkJbm9kZS5nZXRBdHRyaWJ1dGUoJ2ZsaXBWJykgPT0gJzEnKTsKKwkJfQorCX0KKwllbHNlIGlmIChuYW1lID09ICd0ZXh0JykKKwl7CisJCWlmICghc2hhcGUub3V0bGluZSkKKwkJeworCQkJdmFyIHN0ciA9IHRoaXMuZXZhbHVhdGVUZXh0QXR0cmlidXRlKG5vZGUsICdzdHInLCBzaGFwZSk7CisJCQl2YXIgcm90YXRpb24gPSBub2RlLmdldEF0dHJpYnV0ZSgndmVydGljYWwnKSA9PSAnMScgPyAtOTAgOiAwOworCQkJCisJCQlpZiAobm9kZS5nZXRBdHRyaWJ1dGUoJ2FsaWduLXNoYXBlJykgPT0gJzAnKQorCQkJeworCQkJCXZhciBkciA9IHNoYXBlLnJvdGF0aW9uOworCQorCQkJCS8vIERlcGVuZHMgb24gZmxpcHBpbmcKKwkJCQl2YXIgZmxpcEggPSBteFV0aWxzLmdldFZhbHVlKHNoYXBlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9GTElQSCwgMCkgPT0gMTsKKwkJCQl2YXIgZmxpcFYgPSBteFV0aWxzLmdldFZhbHVlKHNoYXBlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9GTElQViwgMCkgPT0gMTsKKwkJCQkKKwkJCQlpZiAoZmxpcEggJiYgZmxpcFYpCisJCQkJeworCQkJCQlyb3RhdGlvbiAtPSBkcjsKKwkJCQl9CisJCQkJZWxzZSBpZiAoZmxpcEggfHwgZmxpcFYpCisJCQkJeworCQkJCQlyb3RhdGlvbiArPSBkcjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcm90YXRpb24gLT0gZHI7CisJCQkJfQorCQkJfQorCQorCQkJcm90YXRpb24gLT0gbm9kZS5nZXRBdHRyaWJ1dGUoJ3JvdGF0aW9uJyk7CisJCisJCQljYW52YXMudGV4dCh4MCArIE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgneCcpKSAqIHN4LAorCQkJCQl5MCArIE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgneScpKSAqIHN5LAorCQkJCQkwLCAwLCBzdHIsIG5vZGUuZ2V0QXR0cmlidXRlKCdhbGlnbicpIHx8ICdsZWZ0JywKKwkJCQkJbm9kZS5nZXRBdHRyaWJ1dGUoJ3ZhbGlnbicpIHx8ICd0b3AnLCBmYWxzZSwgJycsCisJCQkJCW51bGwsIGZhbHNlLCByb3RhdGlvbik7CisJCX0KKwl9CisJZWxzZSBpZiAobmFtZSA9PSAnaW5jbHVkZS1zaGFwZScpCisJeworCQl2YXIgc3RlbmNpbCA9IG14U3RlbmNpbFJlZ2lzdHJ5LmdldFN0ZW5jaWwobm9kZS5nZXRBdHRyaWJ1dGUoJ25hbWUnKSk7CisJCQorCQlpZiAoc3RlbmNpbCAhPSBudWxsKQorCQl7CisJCQl2YXIgeCA9IHgwICsgTnVtYmVyKG5vZGUuZ2V0QXR0cmlidXRlKCd4JykpICogc3g7CisJCQl2YXIgeSA9IHkwICsgTnVtYmVyKG5vZGUuZ2V0QXR0cmlidXRlKCd5JykpICogc3k7CisJCQl2YXIgdyA9IE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgndycpKSAqIHN4OworCQkJdmFyIGggPSBOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ2gnKSkgKiBzeTsKKwkJCQorCQkJc3RlbmNpbC5kcmF3U2hhcGUoY2FudmFzLCBzaGFwZSwgeCwgeSwgdywgaCk7CisJCX0KKwl9CisJZWxzZSBpZiAobmFtZSA9PSAnZmlsbHN0cm9rZScpCisJeworCQljYW52YXMuZmlsbEFuZFN0cm9rZSgpOworCX0KKwllbHNlIGlmIChuYW1lID09ICdmaWxsJykKKwl7CisJCWNhbnZhcy5maWxsKCk7CisJfQorCWVsc2UgaWYgKG5hbWUgPT0gJ3N0cm9rZScpCisJeworCQljYW52YXMuc3Ryb2tlKCk7CisJfQorCWVsc2UgaWYgKG5hbWUgPT0gJ3N0cm9rZXdpZHRoJykKKwl7CisJCXZhciBzID0gKG5vZGUuZ2V0QXR0cmlidXRlKCdmaXhlZCcpID09ICcxJykgPyAxIDogbWluU2NhbGU7CisJCWNhbnZhcy5zZXRTdHJva2VXaWR0aChOdW1iZXIobm9kZS5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpICogcyk7CisJfQorCWVsc2UgaWYgKG5hbWUgPT0gJ2Rhc2hlZCcpCisJeworCQljYW52YXMuc2V0RGFzaGVkKG5vZGUuZ2V0QXR0cmlidXRlKCdkYXNoZWQnKSA9PSAnMScpOworCX0KKwllbHNlIGlmIChuYW1lID09ICdkYXNocGF0dGVybicpCisJeworCQl2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZSgncGF0dGVybicpOworCQkKKwkJaWYgKHZhbHVlICE9IG51bGwpCisJCXsKKwkJCXZhciB0bXAgPSB2YWx1ZS5zcGxpdCgnICcpOworCQkJdmFyIHBhdCA9IFtdOworCQkJCisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRtcC5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQlpZiAodG1wW2ldLmxlbmd0aCA+IDApCisJCQkJeworCQkJCQlwYXQucHVzaChOdW1iZXIodG1wW2ldKSAqIG1pblNjYWxlKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCXZhbHVlID0gcGF0LmpvaW4oJyAnKTsKKwkJCWNhbnZhcy5zZXREYXNoUGF0dGVybih2YWx1ZSk7CisJCX0KKwl9CisJZWxzZSBpZiAobmFtZSA9PSAnc3Ryb2tlY29sb3InKQorCXsKKwkJY2FudmFzLnNldFN0cm9rZUNvbG9yKG5vZGUuZ2V0QXR0cmlidXRlKCdjb2xvcicpKTsKKwl9CisJZWxzZSBpZiAobmFtZSA9PSAnbGluZWNhcCcpCisJeworCQljYW52YXMuc2V0TGluZUNhcChub2RlLmdldEF0dHJpYnV0ZSgnY2FwJykpOworCX0KKwllbHNlIGlmIChuYW1lID09ICdsaW5lam9pbicpCisJeworCQljYW52YXMuc2V0TGluZUpvaW4obm9kZS5nZXRBdHRyaWJ1dGUoJ2pvaW4nKSk7CisJfQorCWVsc2UgaWYgKG5hbWUgPT0gJ21pdGVybGltaXQnKQorCXsKKwkJY2FudmFzLnNldE1pdGVyTGltaXQoTnVtYmVyKG5vZGUuZ2V0QXR0cmlidXRlKCdsaW1pdCcpKSk7CisJfQorCWVsc2UgaWYgKG5hbWUgPT0gJ2ZpbGxjb2xvcicpCisJeworCQljYW52YXMuc2V0RmlsbENvbG9yKG5vZGUuZ2V0QXR0cmlidXRlKCdjb2xvcicpKTsKKwl9CisJZWxzZSBpZiAobmFtZSA9PSAnYWxwaGEnKQorCXsKKwkJY2FudmFzLnNldEFscGhhKG5vZGUuZ2V0QXR0cmlidXRlKCdhbHBoYScpKTsKKwl9CisJZWxzZSBpZiAobmFtZSA9PSAnZm9udGNvbG9yJykKKwl7CisJCWNhbnZhcy5zZXRGb250Q29sb3Iobm9kZS5nZXRBdHRyaWJ1dGUoJ2NvbG9yJykpOworCX0KKwllbHNlIGlmIChuYW1lID09ICdmb250c3R5bGUnKQorCXsKKwkJY2FudmFzLnNldEZvbnRTdHlsZShub2RlLmdldEF0dHJpYnV0ZSgnc3R5bGUnKSk7CisJfQorCWVsc2UgaWYgKG5hbWUgPT0gJ2ZvbnRmYW1pbHknKQorCXsKKwkJY2FudmFzLnNldEZvbnRGYW1pbHkobm9kZS5nZXRBdHRyaWJ1dGUoJ2ZhbWlseScpKTsKKwl9CisJZWxzZSBpZiAobmFtZSA9PSAnZm9udHNpemUnKQorCXsKKwkJY2FudmFzLnNldEZvbnRTaXplKE51bWJlcihub2RlLmdldEF0dHJpYnV0ZSgnc2l6ZScpKSAqIG1pblNjYWxlKTsKKwl9CisJCisJaWYgKGRpc2FibGVTaGFkb3cgJiYgKG5hbWUgPT0gJ2ZpbGxzdHJva2UnIHx8IG5hbWUgPT0gJ2ZpbGwnIHx8IG5hbWUgPT0gJ3N0cm9rZScpKQorCXsKKwkJZGlzYWJsZVNoYWRvdyA9IGZhbHNlOworCQljYW52YXMuc2V0U2hhZG93KGZhbHNlKTsKKwl9Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214U3RlbmNpbFJlZ2lzdHJ5LmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214U3RlbmNpbFJlZ2lzdHJ5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NDI3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhTdGVuY2lsUmVnaXN0cnkuanMKQEAgLTAsMCArMSw1MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqIAorICogQ29kZSB0byBhZGQgc3RlbmNpbHMuCisgKiAKKyAqIChjb2RlKQorICogdmFyIHJlcSA9IG14VXRpbHMubG9hZCgndGVzdC9zdGVuY2lscy54bWwnKTsKKyAqIHZhciByb290ID0gcmVxLmdldERvY3VtZW50RWxlbWVudCgpOworICogdmFyIHNoYXBlID0gcm9vdC5maXJzdENoaWxkOworICogCisgKiB3aGlsZSAoc2hhcGUgIT0gbnVsbCkKKyAqIHsKKyAqIAkgaWYgKHNoYXBlLm5vZGVUeXBlID09IG14Q29uc3RhbnRzLk5PREVUWVBFX0VMRU1FTlQpCisgKiAgIHsKKyAqICAgICBteFN0ZW5jaWxSZWdpc3RyeS5hZGRTdGVuY2lsKHNoYXBlLmdldEF0dHJpYnV0ZSgnbmFtZScpLCBuZXcgbXhTdGVuY2lsKHNoYXBlKSk7CisgKiAgIH0KKyAqICAgCisgKiAgIHNoYXBlID0gc2hhcGUubmV4dFNpYmxpbmc7CisgKiB9CisgKiAoZW5kKQorICovCit2YXIgbXhTdGVuY2lsUmVnaXN0cnkgPQoreworCS8qKgorCSAqIENsYXNzOiBteFN0ZW5jaWxSZWdpc3RyeQorCSAqIAorCSAqIEEgc2luZ2xldG9uIGNsYXNzIHRoYXQgcHJvdmlkZXMgYSByZWdpc3RyeSBmb3Igc3RlbmNpbHMgYW5kIHRoZSBtZXRob2RzCisJICogZm9yIHBhaW50aW5nIHRob3NlIHN0ZW5jaWxzIG9udG8gYSBjYW52YXMgb3IgaW50byBhIERPTS4KKwkgKi8KKwlzdGVuY2lsczoge30sCisJCisJLyoqCisJICogRnVuY3Rpb246IGFkZFN0ZW5jaWwKKwkgKiAKKwkgKiBBZGRzIHRoZSBnaXZlbiA8bXhTdGVuY2lsPi4KKwkgKi8KKwlhZGRTdGVuY2lsOiBmdW5jdGlvbihuYW1lLCBzdGVuY2lsKQorCXsKKwkJbXhTdGVuY2lsUmVnaXN0cnkuc3RlbmNpbHNbbmFtZV0gPSBzdGVuY2lsOworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IGdldFN0ZW5jaWwKKwkgKiAKKwkgKiBSZXR1cm5zIHRoZSA8bXhTdGVuY2lsPiBmb3IgdGhlIGdpdmVuIG5hbWUuCisJICovCisJZ2V0U3RlbmNpbDogZnVuY3Rpb24obmFtZSkKKwl7CisJCXJldHVybiBteFN0ZW5jaWxSZWdpc3RyeS5zdGVuY2lsc1tuYW1lXTsKKwl9CisKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhTd2ltbGFuZS5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teFN3aW1sYW5lLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYWJmODIKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhTd2ltbGFuZS5qcwpAQCAtMCwwICsxLDQxMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhTd2ltbGFuZQorICoKKyAqIEV4dGVuZHMgPG14U2hhcGU+IHRvIGltcGxlbWVudCBhIHN3aW1sYW5lIHNoYXBlLiBUaGlzIHNoYXBlIGlzIHJlZ2lzdGVyZWQKKyAqIHVuZGVyIDxteENvbnN0YW50cy5TSEFQRV9TV0lNTEFORT4gaW4gPG14Q2VsbFJlbmRlcmVyPi4gVXNlIHRoZQorICogPG14Q29uc3RhbnRzLlNUWUxFX1NUWUxFX1NUQVJUU0laRT4gdG8gZGVmaW5lIHRoZSBzaXplIG9mIHRoZSB0aXRsZQorICogcmVnaW9uLCA8bXhDb25zdGFudHMuU1RZTEVfU1dJTUxBTkVfRklMTENPTE9SPiBmb3IgdGhlIGNvbnRlbnQgYXJlYSBmaWxsLAorICogPG14Q29uc3RhbnRzLlNUWUxFX1NFUEFSQVRPUkNPTE9SPiB0byBkcmF3IGFuIGFkZGl0aW9uYWwgdmVydGljYWwgc2VwYXJhdG9yCisgKiBhbmQgPG14Q29uc3RhbnRzLlNUWUxFX1NXSU1MQU5FX0xJTkU+IHRvIGhpZGUgdGhlIGxpbmUgYmV0d2VlbiB0aGUgdGl0bGUKKyAqIHJlZ2lvbiBhbmQgdGhlIGNvbnRlbnQgYXJlYS4gVGhlIDxteENvbnN0YW50cy5TVFlMRV9IT1JJWk9OVEFMPiBhZmZlY3RzCisgKiB0aGUgb3JpZW50YXRpb24gb2YgdGhpcyBzaGFwZSwgbm90IG9ubHkgaXRzIGxhYmVsLgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhTd2ltbGFuZQorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgc3dpbWxhbmUgc2hhcGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGJvdW5kcyAtIDxteFJlY3RhbmdsZT4gdGhhdCBkZWZpbmVzIHRoZSBib3VuZHMuIFRoaXMgaXMgc3RvcmVkIGluCisgKiA8bXhTaGFwZS5ib3VuZHM+LgorICogZmlsbCAtIFN0cmluZyB0aGF0IGRlZmluZXMgdGhlIGZpbGwgY29sb3IuIFRoaXMgaXMgc3RvcmVkIGluIDxmaWxsPi4KKyAqIHN0cm9rZSAtIFN0cmluZyB0aGF0IGRlZmluZXMgdGhlIHN0cm9rZSBjb2xvci4gVGhpcyBpcyBzdG9yZWQgaW4gPHN0cm9rZT4uCisgKiBzdHJva2V3aWR0aCAtIE9wdGlvbmFsIGludGVnZXIgdGhhdCBkZWZpbmVzIHRoZSBzdHJva2Ugd2lkdGguIERlZmF1bHQgaXMKKyAqIDEuIFRoaXMgaXMgc3RvcmVkIGluIDxzdHJva2V3aWR0aD4uCisgKi8KK2Z1bmN0aW9uIG14U3dpbWxhbmUoYm91bmRzLCBmaWxsLCBzdHJva2UsIHN0cm9rZXdpZHRoKQoreworCW14U2hhcGUuY2FsbCh0aGlzKTsKKwl0aGlzLmJvdW5kcyA9IGJvdW5kczsKKwl0aGlzLmZpbGwgPSBmaWxsOworCXRoaXMuc3Ryb2tlID0gc3Ryb2tlOworCXRoaXMuc3Ryb2tld2lkdGggPSAoc3Ryb2tld2lkdGggIT0gbnVsbCkgPyBzdHJva2V3aWR0aCA6IDE7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhTaGFwZS4KKyAqLworbXhVdGlscy5leHRlbmQobXhTd2ltbGFuZSwgbXhTaGFwZSk7CisKKy8qKgorICogVmFyaWFibGU6IGltYWdlU2l6ZQorICoKKyAqIERlZmF1bHQgaW1hZ2V3aWR0aCBhbmQgaW1hZ2VoZWlnaHQgaWYgYW4gaW1hZ2UgYnV0IG5vIGltYWdld2lkdGgKKyAqIGFuZCBpbWFnZWhlaWdodCBhcmUgZGVmaW5lZCBpbiB0aGUgc3R5bGUuIFZhbHVlIGlzIDE2LgorICovCitteFN3aW1sYW5lLnByb3RvdHlwZS5pbWFnZVNpemUgPSAxNjsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0R3JhZGllbnRCb3VuZHMKKyAqIAorICogUmV0dXJucyB0aGUgYm91bmRpbmcgYm94IGZvciB0aGUgZ3JhZGllbnQgYm94IGZvciB0aGlzIHNoYXBlLgorICovCitteFN3aW1sYW5lLnByb3RvdHlwZS5nZXRUaXRsZVNpemUgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIE1hdGgubWF4KDAsIG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfU1RBUlRTSVpFLCBteENvbnN0YW50cy5ERUZBVUxUX1NUQVJUU0laRSkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0R3JhZGllbnRCb3VuZHMKKyAqIAorICogUmV0dXJucyB0aGUgYm91bmRpbmcgYm94IGZvciB0aGUgZ3JhZGllbnQgYm94IGZvciB0aGlzIHNoYXBlLgorICovCitteFN3aW1sYW5lLnByb3RvdHlwZS5nZXRMYWJlbEJvdW5kcyA9IGZ1bmN0aW9uKHJlY3QpCit7CisJdmFyIHN0YXJ0ID0gdGhpcy5nZXRUaXRsZVNpemUoKTsKKwl2YXIgYm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7CisJdmFyIGhvcml6b250YWwgPSB0aGlzLmlzSG9yaXpvbnRhbCgpOworCQorCXZhciBmbGlwSCA9IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfRkxJUEgsIDApID09IDE7CisJdmFyIGZsaXBWID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9GTElQViwgMCkgPT0gMTsJCisJCisJLy8gRWFzdCBpcyBkZWZhdWx0CisJdmFyIHNoYXBlVmVydGljYWwgPSAodGhpcy5kaXJlY3Rpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX05PUlRIIHx8CisJCQl0aGlzLmRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fU09VVEgpOworCXZhciByZWFsSG9yaXpvbnRhbCA9IGhvcml6b250YWwgPT0gIXNoYXBlVmVydGljYWw7CisJCisJdmFyIHJlYWxGbGlwSCA9ICFyZWFsSG9yaXpvbnRhbCAmJiBmbGlwSCAhPSAodGhpcy5kaXJlY3Rpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX1NPVVRIIHx8CisJCQl0aGlzLmRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fV0VTVCk7CisJdmFyIHJlYWxGbGlwViA9IHJlYWxIb3Jpem9udGFsICYmIGZsaXBWICE9ICh0aGlzLmRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fU09VVEggfHwKKwkJCXRoaXMuZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9XRVNUKTsKKworCS8vIFNoYXBlIGlzIGhvcml6b250YWwKKwlpZiAoIXNoYXBlVmVydGljYWwpCisJeworCQl2YXIgdG1wID0gTWF0aC5taW4oYm91bmRzLmhlaWdodCwgc3RhcnQgKiB0aGlzLnNjYWxlKTsKKworCQlpZiAocmVhbEZsaXBIIHx8IHJlYWxGbGlwVikKKwkJeworCQkJYm91bmRzLnkgKz0gYm91bmRzLmhlaWdodCAtIHRtcDsKKwkJfQorCisJCWJvdW5kcy5oZWlnaHQgPSB0bXA7CisJfQorCWVsc2UKKwl7CisJCXZhciB0bXAgPSBNYXRoLm1pbihib3VuZHMud2lkdGgsIHN0YXJ0ICogdGhpcy5zY2FsZSk7CisJCQorCQlpZiAocmVhbEZsaXBIIHx8IHJlYWxGbGlwVikKKwkJeworCQkJYm91bmRzLnggKz0gYm91bmRzLndpZHRoIC0gdG1wOwkKKwkJfQorCisJCWJvdW5kcy53aWR0aCA9IHRtcDsKKwl9CisJCisJcmV0dXJuIGJvdW5kczsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEdyYWRpZW50Qm91bmRzCisgKiAKKyAqIFJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBmb3IgdGhlIGdyYWRpZW50IGJveCBmb3IgdGhpcyBzaGFwZS4KKyAqLworbXhTd2ltbGFuZS5wcm90b3R5cGUuZ2V0R3JhZGllbnRCb3VuZHMgPSBmdW5jdGlvbihjLCB4LCB5LCB3LCBoKQoreworCXZhciBzdGFydCA9IHRoaXMuZ2V0VGl0bGVTaXplKCk7CisJCisJaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpCisJeworCQlzdGFydCA9IE1hdGgubWluKHN0YXJ0LCBoKTsKKwkJcmV0dXJuIG5ldyBteFJlY3RhbmdsZSh4LCB5LCB3LCBzdGFydCk7CisJfQorCWVsc2UKKwl7CisJCXN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsIHcpOworCQlyZXR1cm4gbmV3IG14UmVjdGFuZ2xlKHgsIHksIHN0YXJ0LCBoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRBcmNTaXplCisgKiAKKyAqIFJldHVybnMgdGhlIGFyY3NpemUgZm9yIHRoZSBzd2ltbGFuZS4KKyAqLworbXhTd2ltbGFuZS5wcm90b3R5cGUuZ2V0QXJjU2l6ZSA9IGZ1bmN0aW9uKHcsIGgsIHN0YXJ0KQoreworCXZhciBmID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9BUkNTSVpFLCBteENvbnN0YW50cy5SRUNUQU5HTEVfUk9VTkRJTkdfRkFDVE9SICogMTAwKSAvIDEwMDsKKworCXJldHVybiBzdGFydCAqIGYgKiAzOyAKK307CisKKy8qKgorICogRnVuY3Rpb246IHBhaW50VmVydGV4U2hhcGUKKyAqCisgKiBQYWludHMgdGhlIHN3aW1sYW5lIHZlcnRleCBzaGFwZS4KKyAqLworbXhTd2ltbGFuZS5wcm90b3R5cGUuaXNIb3Jpem9udGFsID0gZnVuY3Rpb24oKQoreworCXJldHVybiBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0hPUklaT05UQUwsIDEpID09IDE7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBwYWludFZlcnRleFNoYXBlCisgKgorICogUGFpbnRzIHRoZSBzd2ltbGFuZSB2ZXJ0ZXggc2hhcGUuCisgKi8KK214U3dpbWxhbmUucHJvdG90eXBlLnBhaW50VmVydGV4U2hhcGUgPSBmdW5jdGlvbihjLCB4LCB5LCB3LCBoKQoreworCXZhciBzdGFydCA9IHRoaXMuZ2V0VGl0bGVTaXplKCk7CisJdmFyIGZpbGwgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1NXSU1MQU5FX0ZJTExDT0xPUiwgbXhDb25zdGFudHMuTk9ORSk7CisJdmFyIHN3aW1sYW5lTGluZSA9IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfU1dJTUxBTkVfTElORSwgMSkgPT0gMTsKKwl2YXIgciA9IDA7CisJCisJaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpCisJeworCQlzdGFydCA9IE1hdGgubWluKHN0YXJ0LCBoKTsKKwl9CisJZWxzZQorCXsKKwkJc3RhcnQgPSBNYXRoLm1pbihzdGFydCwgdyk7CisJfQorCQorCWMudHJhbnNsYXRlKHgsIHkpOworCQorCWlmICghdGhpcy5pc1JvdW5kZWQpCisJeworCQl0aGlzLnBhaW50U3dpbWxhbmUoYywgeCwgeSwgdywgaCwgc3RhcnQsIGZpbGwsIHN3aW1sYW5lTGluZSk7CisJfQorCWVsc2UKKwl7CisJCXIgPSB0aGlzLmdldEFyY1NpemUodywgaCwgc3RhcnQpOworCQl0aGlzLnBhaW50Um91bmRlZFN3aW1sYW5lKGMsIHgsIHksIHcsIGgsIHN0YXJ0LCByLCBmaWxsLCBzd2ltbGFuZUxpbmUpOworCX0KKwkKKwl2YXIgc2VwID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9TRVBBUkFUT1JDT0xPUiwgbXhDb25zdGFudHMuTk9ORSk7CisJdGhpcy5wYWludFNlcGFyYXRvcihjLCB4LCB5LCB3LCBoLCBzdGFydCwgc2VwKTsKKworCWlmICh0aGlzLmltYWdlICE9IG51bGwpCisJeworCQl2YXIgYm91bmRzID0gdGhpcy5nZXRJbWFnZUJvdW5kcyh4LCB5LCB3LCBoKTsKKwkJYy5pbWFnZShib3VuZHMueCAtIHgsIGJvdW5kcy55IC0geSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LAorCQkJCXRoaXMuaW1hZ2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworCX0KKwkKKwlpZiAodGhpcy5nbGFzcykKKwl7CisJCWMuc2V0U2hhZG93KGZhbHNlKTsKKwkJdGhpcy5wYWludEdsYXNzRWZmZWN0KGMsIDAsIDAsIHcsIHN0YXJ0LCByKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBwYWludFN3aW1sYW5lCisgKgorICogUGFpbnRzIHRoZSBzd2ltbGFuZSB2ZXJ0ZXggc2hhcGUuCisgKi8KK214U3dpbWxhbmUucHJvdG90eXBlLnBhaW50U3dpbWxhbmUgPSBmdW5jdGlvbihjLCB4LCB5LCB3LCBoLCBzdGFydCwgZmlsbCwgc3dpbWxhbmVMaW5lKQoreworCWlmIChmaWxsICE9IG14Q29uc3RhbnRzLk5PTkUpCisJeworCQljLnNhdmUoKTsKKwkJYy5zZXRGaWxsQ29sb3IoZmlsbCk7CisJCWMucmVjdCgwLCAwLCB3LCBoKTsKKwkJYy5maWxsQW5kU3Ryb2tlKCk7CisJCWMucmVzdG9yZSgpOworCQljLnNldFNoYWRvdyhmYWxzZSk7CisJfQorCisJYy5iZWdpbigpOworCQorCWlmICh0aGlzLmlzSG9yaXpvbnRhbCgpKQorCXsKKwkJYy5tb3ZlVG8oMCwgc3RhcnQpOworCQljLmxpbmVUbygwLCAwKTsKKwkJYy5saW5lVG8odywgMCk7CisJCWMubGluZVRvKHcsIHN0YXJ0KTsKKwkJCisJCWlmIChzd2ltbGFuZUxpbmUgfHwgc3RhcnQgPj0gaCkKKwkJeworCQkJYy5jbG9zZSgpOworCQl9CisJCQorCQljLmZpbGxBbmRTdHJva2UoKTsKKwkJCisJCS8vIFRyYW5zcGFyZW50IGNvbnRlbnQgYXJlYQorCQlpZiAoc3RhcnQgPCBoICYmIGZpbGwgPT0gbXhDb25zdGFudHMuTk9ORSkKKwkJeworCQkJYy5wb2ludGVyRXZlbnRzID0gZmFsc2U7CisJCQkKKwkJCWMuYmVnaW4oKTsKKwkJCWMubW92ZVRvKDAsIHN0YXJ0KTsKKwkJCWMubGluZVRvKDAsIGgpOworCQkJYy5saW5lVG8odywgaCk7CisJCQljLmxpbmVUbyh3LCBzdGFydCk7CisJCQljLnN0cm9rZSgpOworCQl9CisJfQorCWVsc2UKKwl7CisJCWMubW92ZVRvKHN0YXJ0LCAwKTsKKwkJYy5saW5lVG8oMCwgMCk7CisJCWMubGluZVRvKDAsIGgpOworCQljLmxpbmVUbyhzdGFydCwgaCk7CisJCQorCQlpZiAoc3dpbWxhbmVMaW5lIHx8IHN0YXJ0ID49IHcpCisJCXsKKwkJCWMuY2xvc2UoKTsKKwkJfQorCQkKKwkJYy5maWxsQW5kU3Ryb2tlKCk7CisJCQorCQkvLyBUcmFuc3BhcmVudCBjb250ZW50IGFyZWEKKwkJaWYgKHN0YXJ0IDwgdyAmJiBmaWxsID09IG14Q29uc3RhbnRzLk5PTkUpCisJCXsKKwkJCWMucG9pbnRlckV2ZW50cyA9IGZhbHNlOworCQkJCisJCQljLmJlZ2luKCk7CisJCQljLm1vdmVUbyhzdGFydCwgMCk7CisJCQljLmxpbmVUbyh3LCAwKTsKKwkJCWMubGluZVRvKHcsIGgpOworCQkJYy5saW5lVG8oc3RhcnQsIGgpOworCQkJYy5zdHJva2UoKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHBhaW50Um91bmRlZFN3aW1sYW5lCisgKgorICogUGFpbnRzIHRoZSBzd2ltbGFuZSB2ZXJ0ZXggc2hhcGUuCisgKi8KK214U3dpbWxhbmUucHJvdG90eXBlLnBhaW50Um91bmRlZFN3aW1sYW5lID0gZnVuY3Rpb24oYywgeCwgeSwgdywgaCwgc3RhcnQsIHIsIGZpbGwsIHN3aW1sYW5lTGluZSkKK3sKKwlyID0gTWF0aC5taW4oaCAtIHN0YXJ0LCBNYXRoLm1pbihzdGFydCwgcikpOworCQorCWlmIChmaWxsICE9IG14Q29uc3RhbnRzLk5PTkUpCisJeworCQljLnNhdmUoKTsKKwkJYy5zZXRGaWxsQ29sb3IoZmlsbCk7CisJCWMucm91bmRyZWN0KDAsIDAsIHcsIGgsIHIsIHIpOworCQljLmZpbGxBbmRTdHJva2UoKTsKKwkJYy5yZXN0b3JlKCk7CisJCWMuc2V0U2hhZG93KGZhbHNlKTsKKwl9CisJCisJYy5iZWdpbigpOworCQorCWlmICh0aGlzLmlzSG9yaXpvbnRhbCgpKQorCXsKKwkJYy5tb3ZlVG8odywgc3RhcnQpOworCQljLmxpbmVUbyh3LCByKTsKKwkJYy5xdWFkVG8odywgMCwgdyAtIE1hdGgubWluKHcgLyAyLCByKSwgMCk7CisJCWMubGluZVRvKE1hdGgubWluKHcgLyAyLCByKSwgMCk7CisJCWMucXVhZFRvKDAsIDAsIDAsIHIpOworCQljLmxpbmVUbygwLCBzdGFydCk7CisJCQorCQlpZiAoc3dpbWxhbmVMaW5lIHx8IHN0YXJ0ID49IGgpCisJCXsKKwkJCWMuY2xvc2UoKTsKKwkJfQorCQorCQljLmZpbGxBbmRTdHJva2UoKTsKKwkJCisJCS8vIFRyYW5zcGFyZW50IGNvbnRlbnQgYXJlYQorCQlpZiAoc3RhcnQgPCBoICYmIGZpbGwgPT0gbXhDb25zdGFudHMuTk9ORSkKKwkJeworCQkJYy5wb2ludGVyRXZlbnRzID0gZmFsc2U7CisJCQkKKwkJCWMuYmVnaW4oKTsKKwkJCWMubW92ZVRvKDAsIHN0YXJ0KTsKKwkJCWMubGluZVRvKDAsIGggLSByKTsKKwkJCWMucXVhZFRvKDAsIGgsIE1hdGgubWluKHcgLyAyLCByKSwgaCk7CisJCQljLmxpbmVUbyh3IC0gTWF0aC5taW4odyAvIDIsIHIpLCBoKTsKKwkJCWMucXVhZFRvKHcsIGgsIHcsIGggLSByKTsKKwkJCWMubGluZVRvKHcsIHN0YXJ0KTsKKwkJCWMuc3Ryb2tlKCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJYy5tb3ZlVG8oc3RhcnQsIDApOworCQljLmxpbmVUbyhyLCAwKTsKKwkJYy5xdWFkVG8oMCwgMCwgMCwgTWF0aC5taW4oaCAvIDIsIHIpKTsKKwkJYy5saW5lVG8oMCwgaCAtIE1hdGgubWluKGggLyAyLCByKSk7CisJCWMucXVhZFRvKDAsIGgsIHIsIGgpOworCQljLmxpbmVUbyhzdGFydCwgaCk7CisJCQorCQlpZiAoc3dpbWxhbmVMaW5lIHx8IHN0YXJ0ID49IHcpCisJCXsKKwkJCWMuY2xvc2UoKTsKKwkJfQorCQorCQljLmZpbGxBbmRTdHJva2UoKTsKKwkJCisJCS8vIFRyYW5zcGFyZW50IGNvbnRlbnQgYXJlYQorCQlpZiAoc3RhcnQgPCB3ICYmIGZpbGwgPT0gbXhDb25zdGFudHMuTk9ORSkKKwkJeworCQkJYy5wb2ludGVyRXZlbnRzID0gZmFsc2U7CisJCQkKKwkJCWMuYmVnaW4oKTsKKwkJCWMubW92ZVRvKHN0YXJ0LCBoKTsKKwkJCWMubGluZVRvKHcgLSByLCBoKTsKKwkJCWMucXVhZFRvKHcsIGgsIHcsIGggLSBNYXRoLm1pbihoIC8gMiwgcikpOworCQkJYy5saW5lVG8odywgTWF0aC5taW4oaCAvIDIsIHIpKTsKKwkJCWMucXVhZFRvKHcsIDAsIHcgLSByLCAwKTsKKwkJCWMubGluZVRvKHN0YXJ0LCAwKTsKKwkJCWMuc3Ryb2tlKCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBwYWludFN3aW1sYW5lCisgKgorICogUGFpbnRzIHRoZSBzd2ltbGFuZSB2ZXJ0ZXggc2hhcGUuCisgKi8KK214U3dpbWxhbmUucHJvdG90eXBlLnBhaW50U2VwYXJhdG9yID0gZnVuY3Rpb24oYywgeCwgeSwgdywgaCwgc3RhcnQsIGNvbG9yKQoreworCWlmIChjb2xvciAhPSBteENvbnN0YW50cy5OT05FKQorCXsKKwkJYy5zZXRTdHJva2VDb2xvcihjb2xvcik7CisJCWMuc2V0RGFzaGVkKHRydWUpOworCQljLmJlZ2luKCk7CisJCQorCQlpZiAodGhpcy5pc0hvcml6b250YWwoKSkKKwkJeworCQkJYy5tb3ZlVG8odywgc3RhcnQpOworCQkJYy5saW5lVG8odywgaCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQljLm1vdmVUbyhzdGFydCwgMCk7CisJCQljLmxpbmVUbyh3LCAwKTsKKwkJfQorCQkKKwkJYy5zdHJva2UoKTsKKwkJYy5zZXREYXNoZWQoZmFsc2UpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEltYWdlQm91bmRzCisgKgorICogUGFpbnRzIHRoZSBzd2ltbGFuZSB2ZXJ0ZXggc2hhcGUuCisgKi8KK214U3dpbWxhbmUucHJvdG90eXBlLmdldEltYWdlQm91bmRzID0gZnVuY3Rpb24oeCwgeSwgdywgaCkKK3sKKwlpZiAodGhpcy5pc0hvcml6b250YWwoKSkKKwl7CisJCXJldHVybiBuZXcgbXhSZWN0YW5nbGUoeCArIHcgLSB0aGlzLmltYWdlU2l6ZSwgeSwgdGhpcy5pbWFnZVNpemUsIHRoaXMuaW1hZ2VTaXplKTsKKwl9CisJZWxzZQorCXsKKwkJcmV0dXJuIG5ldyBteFJlY3RhbmdsZSh4LCB5LCB0aGlzLmltYWdlU2l6ZSwgdGhpcy5pbWFnZVNpemUpOworCX0KK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhUZXh0LmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214VGV4dC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTc0OTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3NoYXBlL214VGV4dC5qcwpAQCAtMCwwICsxLDEyNjMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14VGV4dAorICoKKyAqIEV4dGVuZHMgPG14U2hhcGU+IHRvIGltcGxlbWVudCBhIHRleHQgc2hhcGUuIFRvIGNoYW5nZSB2ZXJ0aWNhbCB0ZXh0IGZyb20KKyAqIGJvdHRvbSB0byB0b3AgdG8gdG9wIHRvIGJvdHRvbSwgdGhlIGZvbGxvd2luZyBjb2RlIGNhbiBiZSB1c2VkOgorICogCisgKiAoY29kZSkKKyAqIG14VGV4dC5wcm90b3R5cGUudmVydGljYWxUZXh0Um90YXRpb24gPSA5MDsKKyAqIChlbmQpCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteFRleHQKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IHRleHQgc2hhcGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbHVlIC0gU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgdGV4dCB0byBiZSBkaXNwbGF5ZWQuIFRoaXMgaXMgc3RvcmVkIGluCisgKiA8dmFsdWU+LgorICogYm91bmRzIC0gPG14UmVjdGFuZ2xlPiB0aGF0IGRlZmluZXMgdGhlIGJvdW5kcy4gVGhpcyBpcyBzdG9yZWQgaW4KKyAqIDxteFNoYXBlLmJvdW5kcz4uCisgKiBhbGlnbiAtIFNwZWNpZmllcyB0aGUgaG9yaXpvbnRhbCBhbGlnbm1lbnQuIERlZmF1bHQgaXMgJycuIFRoaXMgaXMgc3RvcmVkIGluCisgKiA8YWxpZ24+LgorICogdmFsaWduIC0gU3BlY2lmaWVzIHRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQuIERlZmF1bHQgaXMgJycuIFRoaXMgaXMgc3RvcmVkIGluCisgKiA8dmFsaWduPi4KKyAqIGNvbG9yIC0gU3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSB0ZXh0IGNvbG9yLiBEZWZhdWx0IGlzICdibGFjaycuIFRoaXMgaXMKKyAqIHN0b3JlZCBpbiA8Y29sb3I+LgorICogZmFtaWx5IC0gU3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBmb250IGZhbWlseS4gRGVmYXVsdCBpcworICogPG14Q29uc3RhbnRzLkRFRkFVTFRfRk9OVEZBTUlMWT4uIFRoaXMgaXMgc3RvcmVkIGluIDxmYW1pbHk+LgorICogc2l6ZSAtIEludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIGZvbnQgc2l6ZS4gRGVmYXVsdCBpcworICogPG14Q29uc3RhbnRzLkRFRkFVTFRfRk9OVFNJWkU+LiBUaGlzIGlzIHN0b3JlZCBpbiA8c2l6ZT4uCisgKiBmb250U3R5bGUgLSBTcGVjaWZpZXMgdGhlIGZvbnQgc3R5bGUuIERlZmF1bHQgaXMgMC4gVGhpcyBpcyBzdG9yZWQgaW4KKyAqIDxmb250U3R5bGU+LgorICogc3BhY2luZyAtIEludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIGdsb2JhbCBzcGFjaW5nLiBEZWZhdWx0IGlzIDIuIFRoaXMgaXMKKyAqIHN0b3JlZCBpbiA8c3BhY2luZz4uCisgKiBzcGFjaW5nVG9wIC0gSW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgdG9wIHNwYWNpbmcuIERlZmF1bHQgaXMgMC4gVGhlCisgKiBzdW0gb2YgdGhlIHNwYWNpbmcgYW5kIHRoaXMgaXMgc3RvcmVkIGluIDxzcGFjaW5nVG9wPi4KKyAqIHNwYWNpbmdSaWdodCAtIEludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHJpZ2h0IHNwYWNpbmcuIERlZmF1bHQgaXMgMC4gVGhlCisgKiBzdW0gb2YgdGhlIHNwYWNpbmcgYW5kIHRoaXMgaXMgc3RvcmVkIGluIDxzcGFjaW5nUmlnaHQ+LgorICogc3BhY2luZ0JvdHRvbSAtIEludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIGJvdHRvbSBzcGFjaW5nLiBEZWZhdWx0IGlzIDAuVGhlCisgKiBzdW0gb2YgdGhlIHNwYWNpbmcgYW5kIHRoaXMgaXMgc3RvcmVkIGluIDxzcGFjaW5nQm90dG9tPi4KKyAqIHNwYWNpbmdMZWZ0IC0gSW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgbGVmdCBzcGFjaW5nLiBEZWZhdWx0IGlzIDAuIFRoZQorICogc3VtIG9mIHRoZSBzcGFjaW5nIGFuZCB0aGlzIGlzIHN0b3JlZCBpbiA8c3BhY2luZ0xlZnQ+LgorICogaG9yaXpvbnRhbCAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIGxhYmVsIGlzIGhvcml6b250YWwuIERlZmF1bHQgaXMKKyAqIHRydWUuIFRoaXMgaXMgc3RvcmVkIGluIDxob3Jpem9udGFsPi4KKyAqIGJhY2tncm91bmQgLSBTdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIGJhY2tncm91bmQgY29sb3IuIERlZmF1bHQgaXMgbnVsbC4KKyAqIFRoaXMgaXMgc3RvcmVkIGluIDxiYWNrZ3JvdW5kPi4KKyAqIGJvcmRlciAtIFN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgbGFiZWwgYm9yZGVyIGNvbG9yLiBEZWZhdWx0IGlzIG51bGwuCisgKiBUaGlzIGlzIHN0b3JlZCBpbiA8Ym9yZGVyPi4KKyAqIHdyYXAgLSBTcGVjaWZpZXMgaWYgd29yZC13cmFwcGluZyBzaG91bGQgYmUgZW5hYmxlZC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqIFRoaXMgaXMgc3RvcmVkIGluIDx3cmFwPi4KKyAqIGNsaXBwZWQgLSBTcGVjaWZpZXMgaWYgdGhlIGxhYmVsIHNob3VsZCBiZSBjbGlwcGVkLiBEZWZhdWx0IGlzIGZhbHNlLgorICogVGhpcyBpcyBzdG9yZWQgaW4gPGNsaXBwZWQ+LgorICogb3ZlcmZsb3cgLSBWYWx1ZSBvZiB0aGUgb3ZlcmZsb3cgc3R5bGUuIERlZmF1bHQgaXMgJ3Zpc2libGUnLgorICovCitmdW5jdGlvbiBteFRleHQodmFsdWUsIGJvdW5kcywgYWxpZ24sIHZhbGlnbiwgY29sb3IsCisJZmFtaWx5LAlzaXplLCBmb250U3R5bGUsIHNwYWNpbmcsIHNwYWNpbmdUb3AsIHNwYWNpbmdSaWdodCwKKwlzcGFjaW5nQm90dG9tLCBzcGFjaW5nTGVmdCwgaG9yaXpvbnRhbCwgYmFja2dyb3VuZCwgYm9yZGVyLAorCXdyYXAsIGNsaXBwZWQsIG92ZXJmbG93LCBsYWJlbFBhZGRpbmcsIHRleHREaXJlY3Rpb24pCit7CisJbXhTaGFwZS5jYWxsKHRoaXMpOworCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwl0aGlzLmJvdW5kcyA9IGJvdW5kczsKKwl0aGlzLmNvbG9yID0gKGNvbG9yICE9IG51bGwpID8gY29sb3IgOiAnYmxhY2snOworCXRoaXMuYWxpZ24gPSAoYWxpZ24gIT0gbnVsbCkgPyBhbGlnbiA6IG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUjsKKwl0aGlzLnZhbGlnbiA9ICh2YWxpZ24gIT0gbnVsbCkgPyB2YWxpZ24gOiBteENvbnN0YW50cy5BTElHTl9NSURETEU7CisJdGhpcy5mYW1pbHkgPSAoZmFtaWx5ICE9IG51bGwpID8gZmFtaWx5IDogbXhDb25zdGFudHMuREVGQVVMVF9GT05URkFNSUxZOworCXRoaXMuc2l6ZSA9IChzaXplICE9IG51bGwpID8gc2l6ZSA6IG14Q29uc3RhbnRzLkRFRkFVTFRfRk9OVFNJWkU7CisJdGhpcy5mb250U3R5bGUgPSAoZm9udFN0eWxlICE9IG51bGwpID8gZm9udFN0eWxlIDogbXhDb25zdGFudHMuREVGQVVMVF9GT05UU1RZTEU7CisJdGhpcy5zcGFjaW5nID0gcGFyc2VJbnQoc3BhY2luZyB8fCAyKTsKKwl0aGlzLnNwYWNpbmdUb3AgPSB0aGlzLnNwYWNpbmcgKyBwYXJzZUludChzcGFjaW5nVG9wIHx8IDApOworCXRoaXMuc3BhY2luZ1JpZ2h0ID0gdGhpcy5zcGFjaW5nICsgcGFyc2VJbnQoc3BhY2luZ1JpZ2h0IHx8IDApOworCXRoaXMuc3BhY2luZ0JvdHRvbSA9IHRoaXMuc3BhY2luZyArIHBhcnNlSW50KHNwYWNpbmdCb3R0b20gfHwgMCk7CisJdGhpcy5zcGFjaW5nTGVmdCA9IHRoaXMuc3BhY2luZyArIHBhcnNlSW50KHNwYWNpbmdMZWZ0IHx8IDApOworCXRoaXMuaG9yaXpvbnRhbCA9IChob3Jpem9udGFsICE9IG51bGwpID8gaG9yaXpvbnRhbCA6IHRydWU7CisJdGhpcy5iYWNrZ3JvdW5kID0gYmFja2dyb3VuZDsKKwl0aGlzLmJvcmRlciA9IGJvcmRlcjsKKwl0aGlzLndyYXAgPSAod3JhcCAhPSBudWxsKSA/IHdyYXAgOiBmYWxzZTsKKwl0aGlzLmNsaXBwZWQgPSAoY2xpcHBlZCAhPSBudWxsKSA/IGNsaXBwZWQgOiBmYWxzZTsKKwl0aGlzLm92ZXJmbG93ID0gKG92ZXJmbG93ICE9IG51bGwpID8gb3ZlcmZsb3cgOiAndmlzaWJsZSc7CisJdGhpcy5sYWJlbFBhZGRpbmcgPSAobGFiZWxQYWRkaW5nICE9IG51bGwpID8gbGFiZWxQYWRkaW5nIDogMDsKKwl0aGlzLnRleHREaXJlY3Rpb24gPSB0ZXh0RGlyZWN0aW9uOworCXRoaXMucm90YXRpb24gPSAwOworCXRoaXMudXBkYXRlTWFyZ2luKCk7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhTaGFwZS4KKyAqLworbXhVdGlscy5leHRlbmQobXhUZXh0LCBteFNoYXBlKTsKKworLyoqCisgKiBWYXJpYWJsZTogYmFzZVNwYWNpbmdUb3AKKyAqIAorICogU3BlY2lmaWVzIHRoZSBzcGFjaW5nIHRvIGJlIGFkZGVkIHRvIHRoZSB0b3Agc3BhY2luZy4gRGVmYXVsdCBpcyAwLiBVc2UgdGhlCisgKiB2YWx1ZSA1IGhlcmUgdG8gZ2V0IHRoZSBzYW1lIGxhYmVsIHBvc2l0aW9ucyBhcyBpbiBteEdyYXBoIDEueC4KKyAqLworbXhUZXh0LnByb3RvdHlwZS5iYXNlU3BhY2luZ1RvcCA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IGJhc2VTcGFjaW5nQm90dG9tCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgc3BhY2luZyB0byBiZSBhZGRlZCB0byB0aGUgYm90dG9tIHNwYWNpbmcuIERlZmF1bHQgaXMgMC4gVXNlIHRoZQorICogdmFsdWUgMSBoZXJlIHRvIGdldCB0aGUgc2FtZSBsYWJlbCBwb3NpdGlvbnMgYXMgaW4gbXhHcmFwaCAxLnguCisgKi8KK214VGV4dC5wcm90b3R5cGUuYmFzZVNwYWNpbmdCb3R0b20gPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBiYXNlU3BhY2luZ0xlZnQKKyAqIAorICogU3BlY2lmaWVzIHRoZSBzcGFjaW5nIHRvIGJlIGFkZGVkIHRvIHRoZSBsZWZ0IHNwYWNpbmcuIERlZmF1bHQgaXMgMC4KKyAqLworbXhUZXh0LnByb3RvdHlwZS5iYXNlU3BhY2luZ0xlZnQgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBiYXNlU3BhY2luZ1JpZ2h0CisgKiAKKyAqIFNwZWNpZmllcyB0aGUgc3BhY2luZyB0byBiZSBhZGRlZCB0byB0aGUgcmlnaHQgc3BhY2luZy4gRGVmYXVsdCBpcyAwLgorICovCitteFRleHQucHJvdG90eXBlLmJhc2VTcGFjaW5nUmlnaHQgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiByZXBsYWNlTGluZWZlZWRzCisgKiAKKyAqIFNwZWNpZmllcyBpZiBsaW5lZmVlZHMgaW4gSFRNTCBsYWJlbHMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggQlIgdGFncy4KKyAqIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhUZXh0LnByb3RvdHlwZS5yZXBsYWNlTGluZWZlZWRzID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogdmVydGljYWxUZXh0Um90YXRpb24KKyAqIAorICogUm90YXRpb24gZm9yIHZlcnRpY2FsIHRleHQuIERlZmF1bHQgaXMgLTkwIChib3R0b20gdG8gdG9wKS4KKyAqLworbXhUZXh0LnByb3RvdHlwZS52ZXJ0aWNhbFRleHRSb3RhdGlvbiA9IC05MDsKKworLyoqCisgKiBWYXJpYWJsZTogaWdub3JlQ2xpcHBlZFN0cmluZ1NpemUKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBzdHJpbmcgc2l6ZSBzaG91bGQgYmUgbWVhc3VyZWQgaW4gPHVwZGF0ZUJvdW5kaW5nQm94PiBpZgorICogdGhlIGxhYmVsIGlzIGNsaXBwZWQgYW5kIHRoZSBsYWJlbCBwb3NpdGlvbiBpcyBjZW50ZXIgYW5kIG1pZGRsZS4gSWYgdGhpcyBpcworICogdHJ1ZSwgdGhlbiB0aGUgYm91bmRpbmcgYm94IHdpbGwgYmUgc2V0IHRvIDxib3VuZHM+LiBEZWZhdWx0IGlzIHRydWUuCisgKiA8aWdub3JlU3RyaW5nU2l6ZT4gaGFzIHByZWNlZGVuY2Ugb3ZlciB0aGlzIHN3aXRjaC4KKyAqLworbXhUZXh0LnByb3RvdHlwZS5pZ25vcmVDbGlwcGVkU3RyaW5nU2l6ZSA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGlnbm9yZVN0cmluZ1NpemUKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBhY3R1YWwgc3RyaW5nIHNpemUgc2hvdWxkIGJlIG1lYXN1cmVkLiBJZiBkaXNhYmxlZCB0aGUKKyAqIGJvdW5kaW5nQm94IHdpbGwgbm90IGlnbm9yZSB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHN0cmluZywgb3RoZXJ3aXNlCisgKiA8Ym91bmRzPiB3aWxsIGJlIHVzZWQgaW5zdGVhZC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhUZXh0LnByb3RvdHlwZS5pZ25vcmVTdHJpbmdTaXplID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHRleHRXaWR0aFBhZGRpbmcKKyAqIAorICogU3BlY2lmaWVzIHRoZSBwYWRkaW5nIHRvIGJlIGFkZGVkIHRvIHRoZSB0ZXh0IHdpZHRoIGZvciB0aGUgYm91bmRpbmcgYm94LgorICogVGhpcyBpcyBuZWVkZWQgdG8gbWFrZSBzdXJlIG5vIGNsaXBwaW5nIGlzIGFwcGxpZWQgdG8gYm9yZGVycy4gRGVmYXVsdCBpcyA0CisgKiBmb3IgSUUgOCBzdGFuZGFyZHMgbW9kZSBhbmQgMyBmb3IgYWxsIG90aGVycy4KKyAqLworbXhUZXh0LnByb3RvdHlwZS50ZXh0V2lkdGhQYWRkaW5nID0gKGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSA4ICYmICFteENsaWVudC5JU19FTSkgPyA0IDogMzsKKworLyoqCisgKiBWYXJpYWJsZTogbGFzdFZhbHVlCisgKiAKKyAqIENvbnRhaW5zIHRoZSBsYXN0IHJlbmRlcmVkIHRleHQgdmFsdWUuIFVzZWQgZm9yIGNhY2hpbmcuCisgKi8KK214VGV4dC5wcm90b3R5cGUubGFzdFZhbHVlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogY2FjaGVFbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiBjYWNoaW5nIGZvciBIVE1MIGxhYmVscyBzaG91bGQgYmUgZW5hYmxlZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteFRleHQucHJvdG90eXBlLmNhY2hlRW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogRnVuY3Rpb246IGlzUGFyc2VWbWwKKyAqIAorICogVGV4dCBzaGFwZXMgZG8gbm90IGNvbnRhaW4gVk1MIG1hcmt1cCBhbmQgZG8gbm90IG5lZWQgdG8gYmUgcGFyc2VkLiBUaGlzCisgKiBtZXRob2QgcmV0dXJucyBmYWxzZSB0byBzcGVlZCB1cCByZW5kZXJpbmcgaW4gSUU4LgorICovCitteFRleHQucHJvdG90eXBlLmlzUGFyc2VWbWwgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNIdG1sQWxsb3dlZAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgSFRNTCBpcyBhbGxvd2VkIGZvciB0aGlzIHNoYXBlLiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMKKyAqIHRydWUgaWYgdGhlIGJyb3dzZXIgaXMgbm90IGluIElFOCBzdGFuZGFyZHMgbW9kZS4KKyAqLworbXhUZXh0LnByb3RvdHlwZS5pc0h0bWxBbGxvd2VkID0gZnVuY3Rpb24oKQoreworCXJldHVybiBkb2N1bWVudC5kb2N1bWVudE1vZGUgIT0gOCB8fCBteENsaWVudC5JU19FTTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFN2Z1NjcmVlbk9mZnNldAorICogCisgKiBEaXNhYmxlcyBvZmZzZXQgaW4gSUU5IGZvciBjcmlzcGVyIGltYWdlIG91dHB1dC4KKyAqLworbXhUZXh0LnByb3RvdHlwZS5nZXRTdmdTY3JlZW5PZmZzZXQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjaGVja0JvdW5kcworICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGJvdW5kcyBhcmUgbm90IG51bGwgYW5kIGFsbCBvZiBpdHMgdmFyaWFibGVzIGFyZSBudW1lcmljLgorICovCitteFRleHQucHJvdG90eXBlLmNoZWNrQm91bmRzID0gZnVuY3Rpb24oKQoreworCXJldHVybiAoIWlzTmFOKHRoaXMuc2NhbGUpICYmIGlzRmluaXRlKHRoaXMuc2NhbGUpICYmIHRoaXMuc2NhbGUgPiAwICYmCisJCQl0aGlzLmJvdW5kcyAhPSBudWxsICYmICFpc05hTih0aGlzLmJvdW5kcy54KSAmJiAhaXNOYU4odGhpcy5ib3VuZHMueSkgJiYKKwkJCSFpc05hTih0aGlzLmJvdW5kcy53aWR0aCkgJiYgIWlzTmFOKHRoaXMuYm91bmRzLmhlaWdodCkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcGFpbnQKKyAqIAorICogR2VuZXJpYyByZW5kZXJpbmcgY29kZS4KKyAqLworbXhUZXh0LnByb3RvdHlwZS5wYWludCA9IGZ1bmN0aW9uKGMsIHVwZGF0ZSkKK3sKKwkvLyBTY2FsZSBpcyBwYXNzZWQtdGhyb3VnaCB0byBjYW52YXMKKwl2YXIgcyA9IHRoaXMuc2NhbGU7CisJdmFyIHggPSB0aGlzLmJvdW5kcy54IC8gczsKKwl2YXIgeSA9IHRoaXMuYm91bmRzLnkgLyBzOworCXZhciB3ID0gdGhpcy5ib3VuZHMud2lkdGggLyBzOworCXZhciBoID0gdGhpcy5ib3VuZHMuaGVpZ2h0IC8gczsKKwkKKwl0aGlzLnVwZGF0ZVRyYW5zZm9ybShjLCB4LCB5LCB3LCBoKTsKKwl0aGlzLmNvbmZpZ3VyZUNhbnZhcyhjLCB4LCB5LCB3LCBoKTsKKworCXZhciB1bnNjYWxlZFdpZHRoID0gKHRoaXMuc3RhdGUgIT0gbnVsbCkgPyB0aGlzLnN0YXRlLnVuc2NhbGVkV2lkdGggOiBudWxsOworCisJaWYgKHVwZGF0ZSkKKwl7CisJCWlmICh0aGlzLm5vZGUuZmlyc3RDaGlsZCAhPSBudWxsICYmICh1bnNjYWxlZFdpZHRoID09IG51bGwgfHwKKwkJCXRoaXMubGFzdFVuc2NhbGVkV2lkdGggIT0gdW5zY2FsZWRXaWR0aCkpCisJCXsKKwkJCWMuaW52YWxpZGF0ZUNhY2hlZE9mZnNldFNpemUodGhpcy5ub2RlKTsKKwkJfQorCisJCWMudXBkYXRlVGV4dCh4LCB5LCB3LCBoLCB0aGlzLmFsaWduLCB0aGlzLnZhbGlnbiwgdGhpcy53cmFwLCB0aGlzLm92ZXJmbG93LAorCQkJCXRoaXMuY2xpcHBlZCwgdGhpcy5nZXRUZXh0Um90YXRpb24oKSwgdGhpcy5ub2RlKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gQ2hlY2tzIGlmIHRleHQgY29udGFpbnMgSFRNTCBtYXJrdXAKKwkJdmFyIHJlYWxIdG1sID0gbXhVdGlscy5pc05vZGUodGhpcy52YWx1ZSkgfHwgdGhpcy5kaWFsZWN0ID09IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1RSSUNUSFRNTDsKKwkJCisJCS8vIEFsd2F5cyByZW5kZXJzIGxhYmVscyBhcyBIVE1MIGluIFZNTAorCQl2YXIgZm10ID0gKHJlYWxIdG1sIHx8IGMgaW5zdGFuY2VvZiBteFZtbENhbnZhczJEKSA/ICdodG1sJyA6ICcnOworCQl2YXIgdmFsID0gdGhpcy52YWx1ZTsKKwkJCisJCWlmICghcmVhbEh0bWwgJiYgZm10ID09ICdodG1sJykKKwkJeworCQkJdmFsID0gIG14VXRpbHMuaHRtbEVudGl0aWVzKHZhbCwgZmFsc2UpOworCQl9CisJCQorCQlpZiAoZm10ID09ICdodG1sJyAmJiAhbXhVdGlscy5pc05vZGUodGhpcy52YWx1ZSkpCisJCXsKKwkJCXZhbCA9IG14VXRpbHMucmVwbGFjZVRyYWlsaW5nTmV3bGluZXModmFsLCAnPGRpdj48YnI+PC9kaXY+Jyk7CQkJCisJCX0KKwkJCisJCS8vIEhhbmRsZXMgdHJhaWxpbmcgbmV3bGluZXMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHZpc2libGUgaW4gcmVuZGVyaW5nIG91dHB1dAorCQl2YWwgPSAoIW14VXRpbHMuaXNOb2RlKHRoaXMudmFsdWUpICYmIHRoaXMucmVwbGFjZUxpbmVmZWVkcyAmJiBmbXQgPT0gJ2h0bWwnKSA/CisJCQl2YWwucmVwbGFjZSgvXG4vZywgJzxici8+JykgOiB2YWw7CisJCQkKKwkJdmFyIGRpciA9IHRoaXMudGV4dERpcmVjdGlvbjsKKwkKKwkJaWYgKGRpciA9PSBteENvbnN0YW50cy5URVhUX0RJUkVDVElPTl9BVVRPICYmICFyZWFsSHRtbCkKKwkJeworCQkJZGlyID0gdGhpcy5nZXRBdXRvRGlyZWN0aW9uKCk7CisJCX0KKwkJCisJCWlmIChkaXIgIT0gbXhDb25zdGFudHMuVEVYVF9ESVJFQ1RJT05fTFRSICYmIGRpciAhPSBteENvbnN0YW50cy5URVhUX0RJUkVDVElPTl9SVEwpCisJCXsKKwkJCWRpciA9IG51bGw7CisJCX0KKwkKKwkJYy50ZXh0KHgsIHksIHcsIGgsIHZhbCwgdGhpcy5hbGlnbiwgdGhpcy52YWxpZ24sIHRoaXMud3JhcCwgZm10LCB0aGlzLm92ZXJmbG93LAorCQkJdGhpcy5jbGlwcGVkLCB0aGlzLmdldFRleHRSb3RhdGlvbigpLCBkaXIpOworCX0KKwkKKwkvLyBOZWVkcyB0byBpbnZhbGlkYXRlIHRoZSBjYWNoZWQgb2Zmc2V0IHdpZHRocyBpZiB0aGUgZ2VvbWV0cnkgY2hhbmdlcworCXRoaXMubGFzdFVuc2NhbGVkV2lkdGggPSB1bnNjYWxlZFdpZHRoOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVkcmF3CisgKiAKKyAqIFJlbmRlcnMgdGhlIHRleHQgdXNpbmcgdGhlIGdpdmVuIERPTSBub2Rlcy4KKyAqLworbXhUZXh0LnByb3RvdHlwZS5yZWRyYXcgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMudmlzaWJsZSAmJiB0aGlzLmNoZWNrQm91bmRzKCkgJiYgdGhpcy5jYWNoZUVuYWJsZWQgJiYgdGhpcy5sYXN0VmFsdWUgPT0gdGhpcy52YWx1ZSAmJgorCQkobXhVdGlscy5pc05vZGUodGhpcy52YWx1ZSkgfHwgdGhpcy5kaWFsZWN0ID09IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1RSSUNUSFRNTCkpCisJeworCQlpZiAodGhpcy5ub2RlLm5vZGVOYW1lID09ICdESVYnICYmICh0aGlzLmlzSHRtbEFsbG93ZWQoKSB8fCAhbXhDbGllbnQuSVNfVk1MKSkKKwkJeworCQkJdGhpcy51cGRhdGVTaXplKHRoaXMubm9kZSwgKHRoaXMuc3RhdGUgPT0gbnVsbCB8fCB0aGlzLnN0YXRlLnZpZXcudGV4dERpdiA9PSBudWxsKSk7CisKKwkJCWlmIChteENsaWVudC5JU19JRSAmJiAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09IG51bGwgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDw9IDgpKQorCQkJeworCQkJCXRoaXMudXBkYXRlSHRtbEZpbHRlcigpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRoaXMudXBkYXRlSHRtbFRyYW5zZm9ybSgpOworCQkJfQorCQkJCisJCQl0aGlzLnVwZGF0ZUJvdW5kaW5nQm94KCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl2YXIgY2FudmFzID0gdGhpcy5jcmVhdGVDYW52YXMoKTsKKworCQkJaWYgKGNhbnZhcyAhPSBudWxsICYmIGNhbnZhcy51cGRhdGVUZXh0ICE9IG51bGwgJiYKKwkJCQljYW52YXMuaW52YWxpZGF0ZUNhY2hlZE9mZnNldFNpemUgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLnBhaW50KGNhbnZhcywgdHJ1ZSk7CisJCQkJdGhpcy5kZXN0cm95Q2FudmFzKGNhbnZhcyk7CisJCQkJdGhpcy51cGRhdGVCb3VuZGluZ0JveCgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIEZhbGxiYWNrIGlmIGNhbnZhcyBkb2VzIG5vdCBzdXBwb3J0IHVwZGF0ZVRleHQgKFZNTCkKKwkJCQlteFNoYXBlLnByb3RvdHlwZS5yZWRyYXcuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlteFNoYXBlLnByb3RvdHlwZS5yZWRyYXcuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJCisJCWlmIChteFV0aWxzLmlzTm9kZSh0aGlzLnZhbHVlKSB8fCB0aGlzLmRpYWxlY3QgPT0gbXhDb25zdGFudHMuRElBTEVDVF9TVFJJQ1RIVE1MKQorCQl7CisJCQl0aGlzLmxhc3RWYWx1ZSA9IHRoaXMudmFsdWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLmxhc3RWYWx1ZSA9IG51bGw7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZXNldFN0eWxlcworICogCisgKiBSZXNldHMgYWxsIHN0eWxlcy4KKyAqLworbXhUZXh0LnByb3RvdHlwZS5yZXNldFN0eWxlcyA9IGZ1bmN0aW9uKCkKK3sKKwlteFNoYXBlLnByb3RvdHlwZS5yZXNldFN0eWxlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQorCXRoaXMuY29sb3IgPSAnYmxhY2snOworCXRoaXMuYWxpZ24gPSBteENvbnN0YW50cy5BTElHTl9DRU5URVI7CisJdGhpcy52YWxpZ24gPSBteENvbnN0YW50cy5BTElHTl9NSURETEU7CisJdGhpcy5mYW1pbHkgPSBteENvbnN0YW50cy5ERUZBVUxUX0ZPTlRGQU1JTFk7CisJdGhpcy5zaXplID0gbXhDb25zdGFudHMuREVGQVVMVF9GT05UU0laRTsKKwl0aGlzLmZvbnRTdHlsZSA9IG14Q29uc3RhbnRzLkRFRkFVTFRfRk9OVFNUWUxFOworCXRoaXMuc3BhY2luZyA9IDI7CisJdGhpcy5zcGFjaW5nVG9wID0gMjsKKwl0aGlzLnNwYWNpbmdSaWdodCA9IDI7CisJdGhpcy5zcGFjaW5nQm90dG9tID0gMjsKKwl0aGlzLnNwYWNpbmdMZWZ0ID0gMjsKKwl0aGlzLmhvcml6b250YWwgPSB0cnVlOworCWRlbGV0ZSB0aGlzLmJhY2tncm91bmQ7CisJZGVsZXRlIHRoaXMuYm9yZGVyOworCXRoaXMudGV4dERpcmVjdGlvbiA9IG14Q29uc3RhbnRzLkRFRkFVTFRfVEVYVF9ESVJFQ1RJT047CisJZGVsZXRlIHRoaXMubWFyZ2luOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYXBwbHkKKyAqIAorICogRXh0ZW5kcyBteFNoYXBlIHRvIHVwZGF0ZSB0aGUgdGV4dCBzdHlsZXMuCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2VsbC4KKyAqLworbXhUZXh0LnByb3RvdHlwZS5hcHBseSA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXZhciBvbGQgPSB0aGlzLnNwYWNpbmc7CisJbXhTaGFwZS5wcm90b3R5cGUuYXBwbHkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkKKwlpZiAodGhpcy5zdHlsZSAhPSBudWxsKQorCXsKKwkJdGhpcy5mb250U3R5bGUgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0ZPTlRTVFlMRSwgdGhpcy5mb250U3R5bGUpOworCQl0aGlzLmZhbWlseSA9IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfRk9OVEZBTUlMWSwgdGhpcy5mYW1pbHkpOworCQl0aGlzLnNpemUgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0ZPTlRTSVpFLCB0aGlzLnNpemUpOworCQl0aGlzLmNvbG9yID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9GT05UQ09MT1IsIHRoaXMuY29sb3IpOworCQl0aGlzLmFsaWduID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9BTElHTiwgdGhpcy5hbGlnbik7CisJCXRoaXMudmFsaWduID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9WRVJUSUNBTF9BTElHTiwgdGhpcy52YWxpZ24pOworCQl0aGlzLnNwYWNpbmcgPSBwYXJzZUludChteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1NQQUNJTkcsIHRoaXMuc3BhY2luZykpOworCQl0aGlzLnNwYWNpbmdUb3AgPSBwYXJzZUludChteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1NQQUNJTkdfVE9QLCB0aGlzLnNwYWNpbmdUb3AgLSBvbGQpKSArIHRoaXMuc3BhY2luZzsKKwkJdGhpcy5zcGFjaW5nUmlnaHQgPSBwYXJzZUludChteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1NQQUNJTkdfUklHSFQsIHRoaXMuc3BhY2luZ1JpZ2h0IC0gb2xkKSkgKyB0aGlzLnNwYWNpbmc7CisJCXRoaXMuc3BhY2luZ0JvdHRvbSA9IHBhcnNlSW50KG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfU1BBQ0lOR19CT1RUT00sIHRoaXMuc3BhY2luZ0JvdHRvbSAtIG9sZCkpICsgdGhpcy5zcGFjaW5nOworCQl0aGlzLnNwYWNpbmdMZWZ0ID0gcGFyc2VJbnQobXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9TUEFDSU5HX0xFRlQsIHRoaXMuc3BhY2luZ0xlZnQgLSBvbGQpKSArIHRoaXMuc3BhY2luZzsKKwkJdGhpcy5ob3Jpem9udGFsID0gbXhVdGlscy5nZXRWYWx1ZSh0aGlzLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9IT1JJWk9OVEFMLCB0aGlzLmhvcml6b250YWwpOworCQl0aGlzLmJhY2tncm91bmQgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0xBQkVMX0JBQ0tHUk9VTkRDT0xPUiwgdGhpcy5iYWNrZ3JvdW5kKTsKKwkJdGhpcy5ib3JkZXIgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0xBQkVMX0JPUkRFUkNPTE9SLCB0aGlzLmJvcmRlcik7CisJCXRoaXMudGV4dERpcmVjdGlvbiA9IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfVEVYVF9ESVJFQ1RJT04sIG14Q29uc3RhbnRzLkRFRkFVTFRfVEVYVF9ESVJFQ1RJT04pOworCQl0aGlzLm9wYWNpdHkgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1RFWFRfT1BBQ0lUWSwgMTAwKTsKKwkJdGhpcy51cGRhdGVNYXJnaW4oKTsKKwl9CisJCisJdGhpcy5mbGlwViA9IG51bGw7CisJdGhpcy5mbGlwSCA9IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRBdXRvRGlyZWN0aW9uCisgKiAKKyAqIFVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhdXRvbWF0aWMgdGV4dCBkaXJlY3Rpb24uIFJldHVybnMKKyAqIDxteENvbnN0YW50cy5URVhUX0RJUkVDVElPTl9MVFI+IG9yIDxteENvbnN0YW50cy5URVhUX0RJUkVDVElPTl9SVEw+CisgKiBkZXBlbmRpbmcgb24gdGhlIGNvbnRlbnRzIG9mIDx2YWx1ZT4uIFRoaXMgaXMgbm90IGludm9rZWQgZm9yIEhUTUwsIHdyYXBwZWQKKyAqIGNvbnRlbnQgb3IgaWYgPHZhbHVlPiBpcyBhIERPTSBub2RlLgorICovCitteFRleHQucHJvdG90eXBlLmdldEF1dG9EaXJlY3Rpb24gPSBmdW5jdGlvbigpCit7CisJLy8gTG9va3MgZm9yIHN0cm9uZyAoZGlyZWN0aW9uYWwpIGNoYXJhY3RlcnMKKwl2YXIgdG1wID0gL1tBLVphLXpcdTA1ZDAtXHUwNjVmXHUwNjZhLVx1MDZlZlx1MDZmYS1cdTA3ZmZcdWZiMWQtXHVmZGZmXHVmZTcwLVx1ZmVmY10vLmV4ZWModGhpcy52YWx1ZSk7CisJCisJLy8gUmV0dXJucyB0aGUgZGlyZWN0aW9uIGRlZmluZWQgYnkgdGhlIGNoYXJhY3RlcgorCXJldHVybiAodG1wICE9IG51bGwgJiYgdG1wLmxlbmd0aCA+IDAgJiYgdG1wWzBdID4gJ3onKSA/CisJCW14Q29uc3RhbnRzLlRFWFRfRElSRUNUSU9OX1JUTCA6IG14Q29uc3RhbnRzLlRFWFRfRElSRUNUSU9OX0xUUjsKK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZUJvdW5kaW5nQm94CisgKgorICogVXBkYXRlcyB0aGUgPGJvdW5kaW5nQm94PiBmb3IgdGhpcyBzaGFwZSB1c2luZyB0aGUgZ2l2ZW4gbm9kZSBhbmQgcG9zaXRpb24uCisgKi8KK214VGV4dC5wcm90b3R5cGUudXBkYXRlQm91bmRpbmdCb3ggPSBmdW5jdGlvbigpCit7CisJdmFyIG5vZGUgPSB0aGlzLm5vZGU7CisJdGhpcy5ib3VuZGluZ0JveCA9IHRoaXMuYm91bmRzLmNsb25lKCk7CisJdmFyIHJvdCA9IHRoaXMuZ2V0VGV4dFJvdGF0aW9uKCk7CisJCisJdmFyIGggPSAodGhpcy5zdHlsZSAhPSBudWxsKSA/IG14VXRpbHMuZ2V0VmFsdWUodGhpcy5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfTEFCRUxfUE9TSVRJT04sIG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUikgOiBudWxsOworCXZhciB2ID0gKHRoaXMuc3R5bGUgIT0gbnVsbCkgPyBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1ZFUlRJQ0FMX0xBQkVMX1BPU0lUSU9OLCBteENvbnN0YW50cy5BTElHTl9NSURETEUpIDogbnVsbDsKKworCWlmICghdGhpcy5pZ25vcmVTdHJpbmdTaXplICYmIG5vZGUgIT0gbnVsbCAmJiB0aGlzLm92ZXJmbG93ICE9ICdmaWxsJyAmJiAoIXRoaXMuY2xpcHBlZCB8fAorCQkhdGhpcy5pZ25vcmVDbGlwcGVkU3RyaW5nU2l6ZSB8fCBoICE9IG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUiB8fCB2ICE9IG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSkpCisJeworCQl2YXIgb3cgPSBudWxsOworCQl2YXIgb2ggPSBudWxsOworCQkKKwkJaWYgKG5vZGUub3duZXJTVkdFbGVtZW50ICE9IG51bGwpCisJCXsKKwkJCWlmIChub2RlLmZpcnN0Q2hpbGQgIT0gbnVsbCAmJiBub2RlLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCAhPSBudWxsICYmCisJCQkJbm9kZS5maXJzdENoaWxkLmZpcnN0Q2hpbGQubm9kZU5hbWUgPT0gJ2ZvcmVpZ25PYmplY3QnKQorCQkJeworCQkJCW5vZGUgPSBub2RlLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDsKKwkJCQlvdyA9IHBhcnNlSW50KG5vZGUuZ2V0QXR0cmlidXRlKCd3aWR0aCcpKSAqIHRoaXMuc2NhbGU7CisJCQkJb2ggPSBwYXJzZUludChub2RlLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpICogdGhpcy5zY2FsZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCXZhciBiID0gbm9kZS5nZXRCQm94KCk7CisJCQkJCQorCQkJCQkvLyBXb3JrYXJvdW5kIGZvciBib3VuZGluZyBib3ggb2YgZW1wdHkgc3RyaW5nCisJCQkJCWlmICh0eXBlb2YodGhpcy52YWx1ZSkgPT0gJ3N0cmluZycgJiYgbXhVdGlscy50cmltKHRoaXMudmFsdWUpID09IDApCisJCQkJCXsKKwkJCQkJCXRoaXMuYm91bmRpbmdCb3ggPSBudWxsOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKGIud2lkdGggPT0gMCAmJiBiLmhlaWdodCA9PSAwKQorCQkJCQl7CisJCQkJCQl0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXRoaXMuYm91bmRpbmdCb3ggPSBuZXcgbXhSZWN0YW5nbGUoYi54LCBiLnksIGIud2lkdGgsIGIuaGVpZ2h0KTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQljYXRjaCAoZSkKKwkJCQl7CisJCQkJCS8vIElnbm9yZXMgTlNfRVJST1JfRkFJTFVSRSBpbiBGRiBpZiBjb250YWluZXIgZGlzcGxheSBpcyBub25lLgorCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXZhciB0ZCA9ICh0aGlzLnN0YXRlICE9IG51bGwpID8gdGhpcy5zdGF0ZS52aWV3LnRleHREaXYgOiBudWxsOworCisJCQkvLyBVc2UgY2FjaGVkIG9mZnNldCBzaXplCisJCQlpZiAodGhpcy5vZmZzZXRXaWR0aCAhPSBudWxsICYmIHRoaXMub2Zmc2V0SGVpZ2h0ICE9IG51bGwpCisJCQl7CisJCQkJb3cgPSB0aGlzLm9mZnNldFdpZHRoICogdGhpcy5zY2FsZTsKKwkJCQlvaCA9IHRoaXMub2Zmc2V0SGVpZ2h0ICogdGhpcy5zY2FsZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBDYW5ub3QgZ2V0IG5vZGUgc2l6ZSB3aGlsZSBjb250YWluZXIgaGlkZGVuIHNvIGEKKwkJCQkvLyBzaGFyZWQgdGVtcG9yYXJ5IERJViBpcyB1c2VkIGZvciB0ZXh0IG1lYXN1cmluZworCQkJCWlmICh0ZCAhPSBudWxsKQorCQkJCXsKKwkJCQkJdGhpcy51cGRhdGVGb250KHRkKTsKKwkJCQkJdGhpcy51cGRhdGVTaXplKHRkLCBmYWxzZSk7CisJCQkJCXRoaXMudXBkYXRlSW5uZXJIdG1sKHRkKTsKKworCQkJCQlub2RlID0gdGQ7CisJCQkJfQorCQkJCQorCQkJCXZhciBzaXplRGl2ID0gbm9kZTsKKworCQkJCWlmIChkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gOCAmJiAhbXhDbGllbnQuSVNfRU0pCisJCQkJeworCQkJCQl2YXIgdyA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMud2lkdGggLyB0aGlzLnNjYWxlKTsKKwkKKwkJCQkJaWYgKHRoaXMud3JhcCAmJiB3ID4gMCkKKwkJCQkJeworCQkJCQkJbm9kZS5zdHlsZS53b3JkV3JhcCA9IG14Q29uc3RhbnRzLldPUkRfV1JBUDsKKwkJCQkJCW5vZGUuc3R5bGUud2hpdGVTcGFjZSA9ICdub3JtYWwnOworCisJCQkJCQlpZiAobm9kZS5zdHlsZS53b3JkV3JhcCAhPSAnYnJlYWstd29yZCcpCisJCQkJCQl7CisJCQkJCQkJLy8gSW5uZXJtb3N0IERJViBpcyB1c2VkIGZvciBtZWFzdXJpbmcgdGV4dAorCQkJCQkJCXZhciBkaXZzID0gc2l6ZURpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZGl2Jyk7CisJCQkJCQkJCisJCQkJCQkJaWYgKGRpdnMubGVuZ3RoID4gMCkKKwkJCQkJCQl7CisJCQkJCQkJCXNpemVEaXYgPSBkaXZzW2RpdnMubGVuZ3RoIC0gMV07CisJCQkJCQkJfQorCQkJCQkJCQorCQkJCQkJCW93ID0gc2l6ZURpdi5vZmZzZXRXaWR0aCArIDI7CisJCQkJCQkJZGl2cyA9IHRoaXMubm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZGl2Jyk7CisJCQkJCQkJCisJCQkJCQkJaWYgKHRoaXMuY2xpcHBlZCkKKwkJCQkJCQl7CisJCQkJCQkJCW93ID0gTWF0aC5taW4odywgb3cpOworCQkJCQkJCX0KKwkJCQkJCQkKKwkJCQkJCQkvLyBTZWNvbmQgbGFzdCBESVYgd2lkdGggbXVzdCBiZSB1cGRhdGVkIGluIERPTSB0cmVlCisJCQkJCQkJaWYgKGRpdnMubGVuZ3RoID4gMSkKKwkJCQkJCQl7CisJCQkJCQkJCWRpdnNbZGl2cy5sZW5ndGggLSAyXS5zdHlsZS53aWR0aCA9IG93ICsgJ3B4JzsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlub2RlLnN0eWxlLndoaXRlU3BhY2UgPSAnbm93cmFwJzsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChzaXplRGl2LmZpcnN0Q2hpbGQgIT0gbnVsbCAmJiBzaXplRGl2LmZpcnN0Q2hpbGQubm9kZU5hbWUgPT0gJ0RJVicpCisJCQkJeworCQkJCQlzaXplRGl2ID0gc2l6ZURpdi5maXJzdENoaWxkOworCQkJCX0KKworCQkJCXRoaXMub2Zmc2V0V2lkdGggPSBzaXplRGl2Lm9mZnNldFdpZHRoICsgdGhpcy50ZXh0V2lkdGhQYWRkaW5nOworCQkJCXRoaXMub2Zmc2V0SGVpZ2h0ID0gc2l6ZURpdi5vZmZzZXRIZWlnaHQ7CisJCQkJCisJCQkJb3cgPSB0aGlzLm9mZnNldFdpZHRoICogdGhpcy5zY2FsZTsKKwkJCQlvaCA9IHRoaXMub2Zmc2V0SGVpZ2h0ICogdGhpcy5zY2FsZTsKKwkJCX0KKwkJfQorCisJCWlmIChvdyAhPSBudWxsICYmIG9oICE9IG51bGwpCisJCXsJCisJCQl0aGlzLmJvdW5kaW5nQm94ID0gbmV3IG14UmVjdGFuZ2xlKHRoaXMuYm91bmRzLngsCisJCQkJdGhpcy5ib3VuZHMueSwgb3csIG9oKTsKKwkJfQorCX0KKworCWlmICh0aGlzLmJvdW5kaW5nQm94ICE9IG51bGwpCisJeworCQlpZiAocm90ICE9IDApCisJCXsKKwkJCS8vIEFjY291bnRzIGZvciBwcmUtcm90YXRlZCB4IGFuZCB5CisJCQl2YXIgYmJveCA9IG14VXRpbHMuZ2V0Qm91bmRpbmdCb3gobmV3IG14UmVjdGFuZ2xlKAorCQkJCXRoaXMubWFyZ2luLnggKiB0aGlzLmJvdW5kaW5nQm94LndpZHRoLAorCQkJCXRoaXMubWFyZ2luLnkgKiB0aGlzLmJvdW5kaW5nQm94LmhlaWdodCwKKwkJCQl0aGlzLmJvdW5kaW5nQm94LndpZHRoLCB0aGlzLmJvdW5kaW5nQm94LmhlaWdodCksCisJCQkJcm90LCBuZXcgbXhQb2ludCgwLCAwKSk7CisJCQkKKwkJCXRoaXMudW5yb3RhdGVkQm91bmRpbmdCb3ggPSBteFJlY3RhbmdsZS5mcm9tUmVjdGFuZ2xlKHRoaXMuYm91bmRpbmdCb3gpOworCQkJdGhpcy51bnJvdGF0ZWRCb3VuZGluZ0JveC54ICs9IHRoaXMubWFyZ2luLnggKiB0aGlzLnVucm90YXRlZEJvdW5kaW5nQm94LndpZHRoOworCQkJdGhpcy51bnJvdGF0ZWRCb3VuZGluZ0JveC55ICs9IHRoaXMubWFyZ2luLnkgKiB0aGlzLnVucm90YXRlZEJvdW5kaW5nQm94LmhlaWdodDsKKwkJCQorCQkJdGhpcy5ib3VuZGluZ0JveC54ICs9IGJib3gueDsKKwkJCXRoaXMuYm91bmRpbmdCb3gueSArPSBiYm94Lnk7CisJCQl0aGlzLmJvdW5kaW5nQm94LndpZHRoID0gYmJveC53aWR0aDsKKwkJCXRoaXMuYm91bmRpbmdCb3guaGVpZ2h0ID0gYmJveC5oZWlnaHQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLmJvdW5kaW5nQm94LnggKz0gdGhpcy5tYXJnaW4ueCAqIHRoaXMuYm91bmRpbmdCb3gud2lkdGg7CisJCQl0aGlzLmJvdW5kaW5nQm94LnkgKz0gdGhpcy5tYXJnaW4ueSAqIHRoaXMuYm91bmRpbmdCb3guaGVpZ2h0OworCQkJdGhpcy51bnJvdGF0ZWRCb3VuZGluZ0JveCA9IG51bGw7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTaGFwZVJvdGF0aW9uCisgKiAKKyAqIFJldHVybnMgMCB0byBhdm9pZCB1c2luZyByb3RhdGlvbiBpbiB0aGUgY2FudmFzIHZpYSB1cGRhdGVUcmFuc2Zvcm0uCisgKi8KK214VGV4dC5wcm90b3R5cGUuZ2V0U2hhcGVSb3RhdGlvbiA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gMDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFRleHRSb3RhdGlvbgorICogCisgKiBSZXR1cm5zIHRoZSByb3RhdGlvbiBmb3IgdGhlIHRleHQgbGFiZWwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc2hhcGUuCisgKi8KK214VGV4dC5wcm90b3R5cGUuZ2V0VGV4dFJvdGF0aW9uID0gZnVuY3Rpb24oKQoreworCXJldHVybiAodGhpcy5zdGF0ZSAhPSBudWxsICYmIHRoaXMuc3RhdGUuc2hhcGUgIT0gbnVsbCkgPyB0aGlzLnN0YXRlLnNoYXBlLmdldFRleHRSb3RhdGlvbigpIDogMDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzUGFpbnRCb3VuZHNJbnZlcnRlZAorICogCisgKiBJbnZlcnRzIHRoZSBib3VuZHMgaWYgPG14U2hhcGUuaXNCb3VuZHNJbnZlcnRlZD4gcmV0dXJucyB0cnVlIG9yIGlmIHRoZQorICogaG9yaXpvbnRhbCBzdHlsZSBpcyBmYWxzZS4KKyAqLworbXhUZXh0LnByb3RvdHlwZS5pc1BhaW50Qm91bmRzSW52ZXJ0ZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuICF0aGlzLmhvcml6b250YWwgJiYgdGhpcy5zdGF0ZSAhPSBudWxsICYmIHRoaXMuc3RhdGUudmlldy5ncmFwaC5tb2RlbC5pc1ZlcnRleCh0aGlzLnN0YXRlLmNlbGwpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY29uZmlndXJlQ2FudmFzCisgKiAKKyAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBjYW52YXMgZm9yIGRyYXdpbmcgdGhlIHNoYXBlLgorICovCitteFRleHQucHJvdG90eXBlLmNvbmZpZ3VyZUNhbnZhcyA9IGZ1bmN0aW9uKGMsIHgsIHksIHcsIGgpCit7CisJbXhTaGFwZS5wcm90b3R5cGUuY29uZmlndXJlQ2FudmFzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCisJYy5zZXRGb250Q29sb3IodGhpcy5jb2xvcik7CisJYy5zZXRGb250QmFja2dyb3VuZENvbG9yKHRoaXMuYmFja2dyb3VuZCk7CisJYy5zZXRGb250Qm9yZGVyQ29sb3IodGhpcy5ib3JkZXIpOworCWMuc2V0Rm9udEZhbWlseSh0aGlzLmZhbWlseSk7CisJYy5zZXRGb250U2l6ZSh0aGlzLnNpemUpOworCWMuc2V0Rm9udFN0eWxlKHRoaXMuZm9udFN0eWxlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZVZtbENvbnRhaW5lcgorICogCisgKiBTZXRzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIgdG8gMXB4LgorICovCitteFRleHQucHJvdG90eXBlLnVwZGF0ZVZtbENvbnRhaW5lciA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLm5vZGUuc3R5bGUubGVmdCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMueCkgKyAncHgnOworCXRoaXMubm9kZS5zdHlsZS50b3AgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLnkpICsgJ3B4JzsKKwl0aGlzLm5vZGUuc3R5bGUud2lkdGggPSAnMXB4JzsKKwl0aGlzLm5vZGUuc3R5bGUuaGVpZ2h0ID0gJzFweCc7CisJdGhpcy5ub2RlLnN0eWxlLm92ZXJmbG93ID0gJ3Zpc2libGUnOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVkcmF3SHRtbFNoYXBlCisgKgorICogVXBkYXRlcyB0aGUgSFRNTCBub2RlKHMpIHRvIHJlZmxlY3QgdGhlIGxhdGVzdCBib3VuZHMgYW5kIHNjYWxlLgorICovCitteFRleHQucHJvdG90eXBlLnJlZHJhd0h0bWxTaGFwZSA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgc3R5bGUgPSB0aGlzLm5vZGUuc3R5bGU7CisKKwkvLyBSZXNldHMgQ1NTIHN0eWxlcworCXN0eWxlLndoaXRlU3BhY2UgPSAnbm9ybWFsJzsKKwlzdHlsZS5vdmVyZmxvdyA9ICcnOworCXN0eWxlLndpZHRoID0gJyc7CisJc3R5bGUuaGVpZ2h0ID0gJyc7CisJCisJdGhpcy51cGRhdGVWYWx1ZSgpOworCXRoaXMudXBkYXRlRm9udCh0aGlzLm5vZGUpOworCXRoaXMudXBkYXRlU2l6ZSh0aGlzLm5vZGUsICh0aGlzLnN0YXRlID09IG51bGwgfHwgdGhpcy5zdGF0ZS52aWV3LnRleHREaXYgPT0gbnVsbCkpOworCQorCXRoaXMub2Zmc2V0V2lkdGggPSBudWxsOworCXRoaXMub2Zmc2V0SGVpZ2h0ID0gbnVsbDsKKworCWlmIChteENsaWVudC5JU19JRSAmJiAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09IG51bGwgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDw9IDgpKQorCXsKKwkJdGhpcy51cGRhdGVIdG1sRmlsdGVyKCk7CisJfQorCWVsc2UKKwl7CisJCXRoaXMudXBkYXRlSHRtbFRyYW5zZm9ybSgpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZUh0bWxUcmFuc2Zvcm0KKyAqCisgKiBSZXR1cm5zIHRoZSBzcGFjaW5nIGFzIGFuIDxteFBvaW50Pi4KKyAqLworbXhUZXh0LnByb3RvdHlwZS51cGRhdGVIdG1sVHJhbnNmb3JtID0gZnVuY3Rpb24oKQoreworCXZhciB0aGV0YSA9IHRoaXMuZ2V0VGV4dFJvdGF0aW9uKCk7CisJdmFyIHN0eWxlID0gdGhpcy5ub2RlLnN0eWxlOworCXZhciBkeCA9IHRoaXMubWFyZ2luLng7CisJdmFyIGR5ID0gdGhpcy5tYXJnaW4ueTsKKwkKKwlpZiAodGhldGEgIT0gMCkKKwl7CisJCW14VXRpbHMuc2V0UHJlZml4ZWRTdHlsZShzdHlsZSwgJ3RyYW5zZm9ybU9yaWdpbicsICgtZHggKiAxMDApICsgJyUnICsgJyAnICsgKC1keSAqIDEwMCkgKyAnJScpOworCQlteFV0aWxzLnNldFByZWZpeGVkU3R5bGUoc3R5bGUsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyAoZHggKiAxMDApICsgJyUnICsgJywnICsgKGR5ICogMTAwKSArICclKScgKworCQkJJ3NjYWxlKCcgKyB0aGlzLnNjYWxlICsgJykgcm90YXRlKCcgKyB0aGV0YSArICdkZWcpJyk7CisJfQorCWVsc2UKKwl7CisJCW14VXRpbHMuc2V0UHJlZml4ZWRTdHlsZShzdHlsZSwgJ3RyYW5zZm9ybU9yaWdpbicsICcwJSAwJScpOworCQlteFV0aWxzLnNldFByZWZpeGVkU3R5bGUoc3R5bGUsICd0cmFuc2Zvcm0nLCAnc2NhbGUoJyArIHRoaXMuc2NhbGUgKyAnKScgKworCQkJJ3RyYW5zbGF0ZSgnICsgKGR4ICogMTAwKSArICclJyArICcsJyArIChkeSAqIDEwMCkgKyAnJSknKTsKKwl9CisKKwlzdHlsZS5sZWZ0ID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy54IC0gTWF0aC5jZWlsKGR4ICogKCh0aGlzLm92ZXJmbG93ICE9ICdmaWxsJyAmJgorCQl0aGlzLm92ZXJmbG93ICE9ICd3aWR0aCcpID8gMyA6IDEpKSkgKyAncHgnOworCXN0eWxlLnRvcCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMueSAtIGR5ICogKCh0aGlzLm92ZXJmbG93ICE9ICdmaWxsJykgPyAzIDogMSkpICsgJ3B4JzsKKwkKKwlpZiAodGhpcy5vcGFjaXR5IDwgMTAwKQorCXsKKwkJc3R5bGUub3BhY2l0eSA9IHRoaXMub3BhY2l0eSAvIDEwMDsKKwl9CisJZWxzZQorCXsKKwkJc3R5bGUub3BhY2l0eSA9ICcnOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHNldElubmVySHRtbAorICogCisgKiBTZXRzIHRoZSBpbm5lciBIVE1MIG9mIHRoZSBnaXZlbiBlbGVtZW50IHRvIHRoZSA8dmFsdWU+LgorICovCitteFRleHQucHJvdG90eXBlLnVwZGF0ZUlubmVySHRtbCA9IGZ1bmN0aW9uKGVsdCkKK3sKKwlpZiAobXhVdGlscy5pc05vZGUodGhpcy52YWx1ZSkpCisJeworCQllbHQuaW5uZXJIVE1MID0gdGhpcy52YWx1ZS5vdXRlckhUTUw7CisJfQorCWVsc2UKKwl7CisJCXZhciB2YWwgPSB0aGlzLnZhbHVlOworCQkKKwkJaWYgKHRoaXMuZGlhbGVjdCAhPSBteENvbnN0YW50cy5ESUFMRUNUX1NUUklDVEhUTUwpCisJCXsKKwkJCS8vIExBVEVSOiBDYW4gYmUgY2FjaGVkIGluIHVwZGF0ZVZhbHVlCisJCQl2YWwgPSBteFV0aWxzLmh0bWxFbnRpdGllcyh2YWwsIGZhbHNlKTsKKwkJfQorCQkKKwkJLy8gSGFuZGxlcyB0cmFpbGluZyBuZXdsaW5lcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgdmlzaWJsZSBpbiByZW5kZXJpbmcgb3V0cHV0CisJCXZhbCA9IG14VXRpbHMucmVwbGFjZVRyYWlsaW5nTmV3bGluZXModmFsLCAnPGRpdj4mbmJzcDs8L2Rpdj4nKTsKKwkJdmFsID0gKHRoaXMucmVwbGFjZUxpbmVmZWVkcykgPyB2YWwucmVwbGFjZSgvXG4vZywgJzxici8+JykgOiB2YWw7CisJCXZhbCA9ICc8ZGl2IHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jaztfZGlzcGxheTppbmxpbmU7Ij4nICsgdmFsICsgJzwvZGl2Pic7CisJCQorCQllbHQuaW5uZXJIVE1MID0gdmFsOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZUh0bWxGaWx0ZXIKKyAqCisgKiBSb3RhdGVkIHRleHQgcmVuZGVyaW5nIHF1YWxpdHkgaXMgYmFkIGZvciBJRTkgcXVpcmtzL0lFOCBzdGFuZGFyZHMKKyAqLworbXhUZXh0LnByb3RvdHlwZS51cGRhdGVIdG1sRmlsdGVyID0gZnVuY3Rpb24oKQoreworCXZhciBzdHlsZSA9IHRoaXMubm9kZS5zdHlsZTsKKwl2YXIgZHggPSB0aGlzLm1hcmdpbi54OworCXZhciBkeSA9IHRoaXMubWFyZ2luLnk7CisJdmFyIHMgPSB0aGlzLnNjYWxlOworCQorCS8vIFJlc2V0cyBmaWx0ZXIgYmVmb3JlIGdldHRpbmcgb2Zmc2V0V2lkdGgKKwlteFV0aWxzLnNldE9wYWNpdHkodGhpcy5ub2RlLCB0aGlzLm9wYWNpdHkpOworCQorCS8vIEFkZHMgMSB0byBtYXRjaCB0YWJsZSBoZWlnaHQgaW4gMS54CisJdmFyIG93ID0gMDsKKwl2YXIgb2ggPSAwOworCXZhciB0ZCA9ICh0aGlzLnN0YXRlICE9IG51bGwpID8gdGhpcy5zdGF0ZS52aWV3LnRleHREaXYgOiBudWxsOworCXZhciBzaXplRGl2ID0gdGhpcy5ub2RlOworCQorCS8vIEZhbGxiYWNrIGZvciBoaWRkZW4gdGV4dCByZW5kZXJpbmcgaW4gSUUgcXVpcmtzIG1vZGUKKwlpZiAodGQgIT0gbnVsbCkKKwl7CisJCXRkLnN0eWxlLm92ZXJmbG93ID0gJyc7CisJCXRkLnN0eWxlLmhlaWdodCA9ICcnOworCQl0ZC5zdHlsZS53aWR0aCA9ICcnOworCQkKKwkJdGhpcy51cGRhdGVGb250KHRkKTsKKwkJdGhpcy51cGRhdGVTaXplKHRkLCBmYWxzZSk7CisJCXRoaXMudXBkYXRlSW5uZXJIdG1sKHRkKTsKKwkJCisJCXZhciB3ID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy53aWR0aCAvIHRoaXMuc2NhbGUpOworCisJCWlmICh0aGlzLndyYXAgJiYgdyA+IDApCisJCXsKKwkJCXRkLnN0eWxlLndoaXRlU3BhY2UgPSAnbm9ybWFsJzsKKwkJCXRkLnN0eWxlLndvcmRXcmFwID0gbXhDb25zdGFudHMuV09SRF9XUkFQOworCQkJb3cgPSB3OworCQkJCisJCQlpZiAodGhpcy5jbGlwcGVkKQorCQkJeworCQkJCW93ID0gTWF0aC5taW4ob3csIHRoaXMuYm91bmRzLndpZHRoKTsKKwkJCX0KKworCQkJdGQuc3R5bGUud2lkdGggPSBvdyArICdweCc7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0ZC5zdHlsZS53aGl0ZVNwYWNlID0gJ25vd3JhcCc7CisJCX0KKwkJCisJCXNpemVEaXYgPSB0ZDsKKwkJCisJCWlmIChzaXplRGl2LmZpcnN0Q2hpbGQgIT0gbnVsbCAmJiBzaXplRGl2LmZpcnN0Q2hpbGQubm9kZU5hbWUgPT0gJ0RJVicpCisJCXsKKwkJCXNpemVEaXYgPSBzaXplRGl2LmZpcnN0Q2hpbGQ7CisJCQkKKwkJCWlmICh0aGlzLndyYXAgJiYgdGQuc3R5bGUud29yZFdyYXAgPT0gJ2JyZWFrLXdvcmQnKQorCQkJeworCQkJCXNpemVEaXYuc3R5bGUud2lkdGggPSAnMTAwJSc7CisJCQl9CisJCX0KKworCQkvLyBSZXF1aXJlZCB0byB1cGRhdGUgdGhlIGhlaWdodCBvZiB0aGUgdGV4dCBib3ggYWZ0ZXIgd3JhcHBpbmcgd2lkdGggaXMga25vd24gCisJCWlmICghdGhpcy5jbGlwcGVkICYmIHRoaXMud3JhcCAmJiB3ID4gMCkKKwkJeworCQkJb3cgPSBzaXplRGl2Lm9mZnNldFdpZHRoICsgdGhpcy50ZXh0V2lkdGhQYWRkaW5nOworCQkJdGQuc3R5bGUud2lkdGggPSBvdyArICdweCc7CisJCX0KKwkJCisJCW9oID0gc2l6ZURpdi5vZmZzZXRIZWlnaHQgKyAyOworCQkKKwkJaWYgKG14Q2xpZW50LklTX1FVSVJLUyAmJiB0aGlzLmJvcmRlciAhPSBudWxsICYmIHRoaXMuYm9yZGVyICE9IG14Q29uc3RhbnRzLk5PTkUpCisJCXsKKwkJCW9oICs9IDM7CisJCX0KKwl9CisJZWxzZSBpZiAoc2l6ZURpdi5maXJzdENoaWxkICE9IG51bGwgJiYgc2l6ZURpdi5maXJzdENoaWxkLm5vZGVOYW1lID09ICdESVYnKQorCXsKKwkJc2l6ZURpdiA9IHNpemVEaXYuZmlyc3RDaGlsZDsKKwkJb2ggPSBzaXplRGl2Lm9mZnNldEhlaWdodDsKKwl9CisKKwlvdyA9IHNpemVEaXYub2Zmc2V0V2lkdGggKyB0aGlzLnRleHRXaWR0aFBhZGRpbmc7CisJCisJaWYgKHRoaXMuY2xpcHBlZCkKKwl7CisJCW9oID0gTWF0aC5taW4ob2gsIHRoaXMuYm91bmRzLmhlaWdodCk7CisJfQorCisJdmFyIHcgPSB0aGlzLmJvdW5kcy53aWR0aCAvIHM7CisJdmFyIGggPSB0aGlzLmJvdW5kcy5oZWlnaHQgLyBzOworCisJLy8gSGFuZGxlcyBzcGVjaWFsIGNhc2UgZm9yIGxpdmUgcHJldmlldyB3aXRoIG5vIHdyYXBwZXIgRElWIGFuZCBubyB0ZXh0RGl2CisJaWYgKHRoaXMub3ZlcmZsb3cgPT0gJ2ZpbGwnKQorCXsKKwkJb2ggPSBoOworCQlvdyA9IHc7CisJfQorCWVsc2UgaWYgKHRoaXMub3ZlcmZsb3cgPT0gJ3dpZHRoJykKKwl7CisJCW9oID0gc2l6ZURpdi5zY3JvbGxIZWlnaHQ7CisJCW93ID0gdzsKKwl9CisJCisJLy8gU3RvcmVzIGZvciBsYXRlciB1c2UKKwl0aGlzLm9mZnNldFdpZHRoID0gb3c7CisJdGhpcy5vZmZzZXRIZWlnaHQgPSBvaDsKKwkKKwkvLyBTaW11bGF0ZXMgbWF4LWhlaWdodCBDU1MgaW4gcXVpcmtzIG1vZGUKKwlpZiAobXhDbGllbnQuSVNfUVVJUktTICYmICh0aGlzLmNsaXBwZWQgfHwgKHRoaXMub3ZlcmZsb3cgPT0gJ3dpZHRoJyAmJiBoID4gMCkpKQorCXsKKwkJaCA9IE1hdGgubWluKGgsIG9oKTsKKwkJc3R5bGUuaGVpZ2h0ID0gTWF0aC5yb3VuZChoKSArICdweCc7CisJfQorCWVsc2UKKwl7CisJCWggPSBvaDsKKwl9CisKKwlpZiAodGhpcy5vdmVyZmxvdyAhPSAnZmlsbCcgJiYgdGhpcy5vdmVyZmxvdyAhPSAnd2lkdGgnKQorCXsKKwkJaWYgKHRoaXMuY2xpcHBlZCkKKwkJeworCQkJb3cgPSBNYXRoLm1pbih3LCBvdyk7CisJCX0KKwkJCisJCXcgPSBvdzsKKworCQkvLyBTaW11bGF0ZXMgbWF4LXdpZHRoIENTUyBpbiBxdWlya3MgbW9kZQorCQlpZiAoKG14Q2xpZW50LklTX1FVSVJLUyAmJiB0aGlzLmNsaXBwZWQpIHx8IHRoaXMud3JhcCkKKwkJeworCQkJc3R5bGUud2lkdGggPSBNYXRoLnJvdW5kKHcpICsgJ3B4JzsKKwkJfQorCX0KKworCWggKj0gczsKKwl3ICo9IHM7CisJCisJLy8gUm90YXRpb24gY2FzZSBpcyBoYW5kbGVkIHZpYSBWTUwgY2FudmFzCisJdmFyIHJhZCA9IHRoaXMuZ2V0VGV4dFJvdGF0aW9uKCkgKiAoTWF0aC5QSSAvIDE4MCk7CisJCisJLy8gUHJlY2FsY3VsYXRlIGNvcyBhbmQgc2luIGZvciB0aGUgcm90YXRpb24KKwl2YXIgcmVhbF9jb3MgPSBwYXJzZUZsb2F0KHBhcnNlRmxvYXQoTWF0aC5jb3MocmFkKSkudG9GaXhlZCg4KSk7CisJdmFyIHJlYWxfc2luID0gcGFyc2VGbG9hdChwYXJzZUZsb2F0KE1hdGguc2luKC1yYWQpKS50b0ZpeGVkKDgpKTsKKworCXJhZCAlPSAyICogTWF0aC5QSTsKKwkKKwlpZiAocmFkIDwgMCkKKwl7CisJCXJhZCArPSAyICogTWF0aC5QSTsKKwl9CisJCisJcmFkICU9IE1hdGguUEk7CisJCisJaWYgKHJhZCA+IE1hdGguUEkgLyAyKQorCXsKKwkJcmFkID0gTWF0aC5QSSAtIHJhZDsKKwl9CisJCisJdmFyIGNvcyA9IE1hdGguY29zKHJhZCk7CisJdmFyIHNpbiA9IE1hdGguc2luKC1yYWQpOworCisJdmFyIHR4ID0gdyAqIC0oZHggKyAwLjUpOworCXZhciB0eSA9IGggKiAtKGR5ICsgMC41KTsKKworCXZhciB0b3BfZml4ID0gKGggLSBoICogY29zICsgdyAqIHNpbikgLyAyICsgcmVhbF9zaW4gKiB0eCAtIHJlYWxfY29zICogdHk7CisJdmFyIGxlZnRfZml4ID0gKHcgLSB3ICogY29zICsgaCAqIHNpbikgLyAyIC0gcmVhbF9jb3MgKiB0eCAtIHJlYWxfc2luICogdHk7CisJCisJaWYgKHJhZCAhPSAwKQorCXsKKwkJdmFyIGYgPSAncHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0Lk1hdHJpeChNMTE9JyArIHJlYWxfY29zICsgJywgTTEyPScrCisJCQlyZWFsX3NpbiArICcsIE0yMT0nICsgKC1yZWFsX3NpbikgKyAnLCBNMjI9JyArIHJlYWxfY29zICsgJywgc2l6aW5nTWV0aG9kPVwnYXV0byBleHBhbmRcJyknOworCQkKKwkJaWYgKHN0eWxlLmZpbHRlciAhPSBudWxsICYmIHN0eWxlLmZpbHRlci5sZW5ndGggPiAwKQorCQl7CisJCQlzdHlsZS5maWx0ZXIgKz0gJyAnICsgZjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXN0eWxlLmZpbHRlciA9IGY7CisJCX0KKwl9CisJCisJLy8gV29ya2Fyb3VuZCBmb3IgcmVuZGVyaW5nIG9mZnNldHMKKwl2YXIgZHkgPSAwOworCQorCWlmICh0aGlzLm92ZXJmbG93ICE9ICdmaWxsJyAmJiBteENsaWVudC5JU19RVUlSS1MpCisJeworCQlpZiAodGhpcy52YWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fVE9QKQorCQl7CisJCQlkeSAtPSAxOworCQl9CisJCWVsc2UgaWYgKHRoaXMudmFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX0JPVFRPTSkKKwkJeworCQkJZHkgKz0gMjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWR5ICs9IDE7CisJCX0KKwl9CisKKwlzdHlsZS56b29tID0gczsKKwlzdHlsZS5sZWZ0ID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy54ICsgbGVmdF9maXggLSB3IC8gMikgKyAncHgnOworCXN0eWxlLnRvcCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMueSArIHRvcF9maXggLSBoIC8gMiArIGR5KSArICdweCc7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1cGRhdGVWYWx1ZQorICoKKyAqIFVwZGF0ZXMgdGhlIEhUTUwgbm9kZShzKSB0byByZWZsZWN0IHRoZSBsYXRlc3QgYm91bmRzIGFuZCBzY2FsZS4KKyAqLworbXhUZXh0LnByb3RvdHlwZS51cGRhdGVWYWx1ZSA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAobXhVdGlscy5pc05vZGUodGhpcy52YWx1ZSkpCisJeworCQl0aGlzLm5vZGUuaW5uZXJIVE1MID0gJyc7CisJCXRoaXMubm9kZS5hcHBlbmRDaGlsZCh0aGlzLnZhbHVlKTsKKwl9CisJZWxzZQorCXsKKwkJdmFyIHZhbCA9IHRoaXMudmFsdWU7CisJCQorCQlpZiAodGhpcy5kaWFsZWN0ICE9IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1RSSUNUSFRNTCkKKwkJeworCQkJdmFsID0gbXhVdGlscy5odG1sRW50aXRpZXModmFsLCBmYWxzZSk7CisJCX0KKwkJCisJCS8vIEhhbmRsZXMgdHJhaWxpbmcgbmV3bGluZXMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHZpc2libGUgaW4gcmVuZGVyaW5nIG91dHB1dAorCQl2YWwgPSBteFV0aWxzLnJlcGxhY2VUcmFpbGluZ05ld2xpbmVzKHZhbCwgJzxkaXY+PGJyPjwvZGl2PicpOworCQl2YWwgPSAodGhpcy5yZXBsYWNlTGluZWZlZWRzKSA/IHZhbC5yZXBsYWNlKC9cbi9nLCAnPGJyLz4nKSA6IHZhbDsKKwkJdmFyIGJnID0gKHRoaXMuYmFja2dyb3VuZCAhPSBudWxsICYmIHRoaXMuYmFja2dyb3VuZCAhPSBteENvbnN0YW50cy5OT05FKSA/IHRoaXMuYmFja2dyb3VuZCA6IG51bGw7CisJCXZhciBiZCA9ICh0aGlzLmJvcmRlciAhPSBudWxsICYmIHRoaXMuYm9yZGVyICE9IG14Q29uc3RhbnRzLk5PTkUpID8gdGhpcy5ib3JkZXIgOiBudWxsOworCisJCWlmICh0aGlzLm92ZXJmbG93ID09ICdmaWxsJyB8fCB0aGlzLm92ZXJmbG93ID09ICd3aWR0aCcpCisJCXsKKwkJCWlmIChiZyAhPSBudWxsKQorCQkJeworCQkJCXRoaXMubm9kZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiZzsKKwkJCX0KKwkJCQorCQkJaWYgKGJkICE9IG51bGwpCisJCQl7CisJCQkJdGhpcy5ub2RlLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgJyArIGJkOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJdmFyIGNzcyA9ICcnOworCQkJCisJCQlpZiAoYmcgIT0gbnVsbCkKKwkJCXsKKwkJCQljc3MgKz0gJ2JhY2tncm91bmQtY29sb3I6JyArIGJnICsgJzsnOworCQkJfQorCQkJCisJCQlpZiAoYmQgIT0gbnVsbCkKKwkJCXsKKwkJCQljc3MgKz0gJ2JvcmRlcjoxcHggc29saWQgJyArIGJkICsgJzsnOworCQkJfQorCQkJCisJCQkvLyBXcmFwcGVyIERJViBmb3IgYmFja2dyb3VuZCwgem9vbSBuZWVkZWQgZm9yIGlubGluZSBpbiBxdWlya3MKKwkJCS8vIGFuZCB0byBtZWFzdXJlIHdyYXBwZWQgZm9udCBzaXplcyBpbiBhbGwgYnJvd3NlcnMKKwkJCS8vIEZJWE1FOiBCYWNrZ3JvdW5kIHNpemUgaW4gcXVpcmtzIG1vZGUgZm9yIHdyYXBwZWQgdGV4dAorCQkJdmFyIGxoID0gKG14Q29uc3RhbnRzLkFCU09MVVRFX0xJTkVfSEVJR0hUKSA/ICh0aGlzLnNpemUgKiBteENvbnN0YW50cy5MSU5FX0hFSUdIVCkgKyAncHgnIDoKKwkJCQlteENvbnN0YW50cy5MSU5FX0hFSUdIVDsKKwkJCXZhbCA9ICc8ZGl2IHN0eWxlPSJ6b29tOjE7JyArIGNzcyArICdkaXNwbGF5OmlubGluZS1ibG9jaztfZGlzcGxheTppbmxpbmU7dGV4dC1kZWNvcmF0aW9uOmluaGVyaXQ7JyArCisJCQkJJ3BhZGRpbmctYm90dG9tOjFweDtwYWRkaW5nLXJpZ2h0OjFweDtsaW5lLWhlaWdodDonICsgbGggKyAnIj4nICsgdmFsICsgJzwvZGl2Pic7CisJCX0KKworCQl0aGlzLm5vZGUuaW5uZXJIVE1MID0gdmFsOworCQkKKwkJLy8gU2V0cyB0ZXh0IGRpcmVjdGlvbgorCQl2YXIgZGl2cyA9IHRoaXMubm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZGl2Jyk7CisJCQorCQlpZiAoZGl2cy5sZW5ndGggPiAwKQorCQl7CisJCQl2YXIgZGlyID0gdGhpcy50ZXh0RGlyZWN0aW9uOworCisJCQlpZiAoZGlyID09IG14Q29uc3RhbnRzLlRFWFRfRElSRUNUSU9OX0FVVE8gJiYgdGhpcy5kaWFsZWN0ICE9IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1RSSUNUSFRNTCkKKwkJCXsKKwkJCQlkaXIgPSB0aGlzLmdldEF1dG9EaXJlY3Rpb24oKTsKKwkJCX0KKwkJCQorCQkJaWYgKGRpciA9PSBteENvbnN0YW50cy5URVhUX0RJUkVDVElPTl9MVFIgfHwgZGlyID09IG14Q29uc3RhbnRzLlRFWFRfRElSRUNUSU9OX1JUTCkKKwkJCXsKKwkJCQlkaXZzW2RpdnMubGVuZ3RoIC0gMV0uc2V0QXR0cmlidXRlKCdkaXInLCBkaXIpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWRpdnNbZGl2cy5sZW5ndGggLSAxXS5yZW1vdmVBdHRyaWJ1dGUoJ2RpcicpOworCQkJfQorCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlRm9udAorICoKKyAqIFVwZGF0ZXMgdGhlIEhUTUwgbm9kZShzKSB0byByZWZsZWN0IHRoZSBsYXRlc3QgYm91bmRzIGFuZCBzY2FsZS4KKyAqLworbXhUZXh0LnByb3RvdHlwZS51cGRhdGVGb250ID0gZnVuY3Rpb24obm9kZSkKK3sKKwl2YXIgc3R5bGUgPSBub2RlLnN0eWxlOworCQorCXN0eWxlLmxpbmVIZWlnaHQgPSAobXhDb25zdGFudHMuQUJTT0xVVEVfTElORV9IRUlHSFQpID8gKHRoaXMuc2l6ZSAqIG14Q29uc3RhbnRzLkxJTkVfSEVJR0hUKSArICdweCcgOiBteENvbnN0YW50cy5MSU5FX0hFSUdIVDsKKwlzdHlsZS5mb250U2l6ZSA9IHRoaXMuc2l6ZSArICdweCc7CisJc3R5bGUuZm9udEZhbWlseSA9IHRoaXMuZmFtaWx5OworCXN0eWxlLnZlcnRpY2FsQWxpZ24gPSAndG9wJzsKKwlzdHlsZS5jb2xvciA9IHRoaXMuY29sb3I7CisJCisJaWYgKCh0aGlzLmZvbnRTdHlsZSAmIG14Q29uc3RhbnRzLkZPTlRfQk9MRCkgPT0gbXhDb25zdGFudHMuRk9OVF9CT0xEKQorCXsKKwkJc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJzsKKwl9CisJZWxzZQorCXsKKwkJc3R5bGUuZm9udFdlaWdodCA9ICcnOworCX0KKworCWlmICgodGhpcy5mb250U3R5bGUgJiBteENvbnN0YW50cy5GT05UX0lUQUxJQykgPT0gbXhDb25zdGFudHMuRk9OVF9JVEFMSUMpCisJeworCQlzdHlsZS5mb250U3R5bGUgPSAnaXRhbGljJzsKKwl9CisJZWxzZQorCXsKKwkJc3R5bGUuZm9udFN0eWxlID0gJyc7CisJfQorCQorCWlmICgodGhpcy5mb250U3R5bGUgJiBteENvbnN0YW50cy5GT05UX1VOREVSTElORSkgPT0gbXhDb25zdGFudHMuRk9OVF9VTkRFUkxJTkUpCisJeworCQlzdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICd1bmRlcmxpbmUnOworCX0KKwllbHNlCisJeworCQlzdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICcnOworCX0KKwkKKwlpZiAodGhpcy5hbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9DRU5URVIpCisJeworCQlzdHlsZS50ZXh0QWxpZ24gPSAnY2VudGVyJzsKKwl9CisJZWxzZSBpZiAodGhpcy5hbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9SSUdIVCkKKwl7CisJCXN0eWxlLnRleHRBbGlnbiA9ICdyaWdodCc7CisJfQorCWVsc2UKKwl7CisJCXN0eWxlLnRleHRBbGlnbiA9ICdsZWZ0JzsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1cGRhdGVTaXplCisgKgorICogVXBkYXRlcyB0aGUgSFRNTCBub2RlKHMpIHRvIHJlZmxlY3QgdGhlIGxhdGVzdCBib3VuZHMgYW5kIHNjYWxlLgorICovCitteFRleHQucHJvdG90eXBlLnVwZGF0ZVNpemUgPSBmdW5jdGlvbihub2RlLCBlbmFibGVXcmFwKQoreworCXZhciB3ID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy53aWR0aCAvIHRoaXMuc2NhbGUpKTsKKwl2YXIgaCA9IE1hdGgubWF4KDAsIE1hdGgucm91bmQodGhpcy5ib3VuZHMuaGVpZ2h0IC8gdGhpcy5zY2FsZSkpOworCXZhciBzdHlsZSA9IG5vZGUuc3R5bGU7CisJCisJLy8gTk9URTogRG8gbm90IHVzZSBtYXhXaWR0aCBoZXJlIGJlY2F1c2Ugd3JhcHBpbmcgd2lsbAorCS8vIGdvIHdyb25nIGlmIHRoZSBjZWxsIGlzIG91dHNpZGUgb2YgdGhlIHZpZXdhYmxlIGFyZWEKKwlpZiAodGhpcy5jbGlwcGVkKQorCXsKKwkJc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKKwkJCisJCWlmICghbXhDbGllbnQuSVNfUVVJUktTKQorCQl7CisJCQlzdHlsZS5tYXhIZWlnaHQgPSBoICsgJ3B4JzsKKwkJCXN0eWxlLm1heFdpZHRoID0gdyArICdweCc7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdHlsZS53aWR0aCA9IHcgKyAncHgnOworCQl9CisJfQorCWVsc2UgaWYgKHRoaXMub3ZlcmZsb3cgPT0gJ2ZpbGwnKQorCXsKKwkJc3R5bGUud2lkdGggPSAodyArIDEpICsgJ3B4JzsKKwkJc3R5bGUuaGVpZ2h0ID0gKGggKyAxKSArICdweCc7CisJCXN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7CisJfQorCWVsc2UgaWYgKHRoaXMub3ZlcmZsb3cgPT0gJ3dpZHRoJykKKwl7CisJCXN0eWxlLndpZHRoID0gKHcgKyAxKSArICdweCc7CisJCXN0eWxlLm1heEhlaWdodCA9IChoICsgMSkgKyAncHgnOworCQlzdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOworCX0KKwkKKwlpZiAodGhpcy53cmFwICYmIHcgPiAwKQorCXsKKwkJc3R5bGUud29yZFdyYXAgPSBteENvbnN0YW50cy5XT1JEX1dSQVA7CisJCXN0eWxlLndoaXRlU3BhY2UgPSAnbm9ybWFsJzsKKwkJc3R5bGUud2lkdGggPSB3ICsgJ3B4JzsKKworCQlpZiAoZW5hYmxlV3JhcCAmJiB0aGlzLm92ZXJmbG93ICE9ICdmaWxsJyAmJiB0aGlzLm92ZXJmbG93ICE9ICd3aWR0aCcpCisJCXsKKwkJCXZhciBzaXplRGl2ID0gbm9kZTsKKwkJCQorCQkJaWYgKHNpemVEaXYuZmlyc3RDaGlsZCAhPSBudWxsICYmIHNpemVEaXYuZmlyc3RDaGlsZC5ub2RlTmFtZSA9PSAnRElWJykKKwkJCXsKKwkJCQlzaXplRGl2ID0gc2l6ZURpdi5maXJzdENoaWxkOworCQkJCQorCQkJCWlmIChub2RlLnN0eWxlLndvcmRXcmFwID09ICdicmVhay13b3JkJykKKwkJCQl7CisJCQkJCXNpemVEaXYuc3R5bGUud2lkdGggPSAnMTAwJSc7CisJCQkJfQorCQkJfQorCQkJCisJCQl2YXIgdG1wID0gc2l6ZURpdi5vZmZzZXRXaWR0aDsKKwkJCQorCQkJLy8gV29ya2Fyb3VuZCBmb3IgdGV4dCBtZWFzdXJpbmcgaW4gaGlkZGVuIGNvbnRhaW5lcnMKKwkJCWlmICh0bXAgPT0gMCkKKwkJCXsKKwkJCQl2YXIgcHJldiA9IG5vZGUucGFyZW50Tm9kZTsKKwkJCQlub2RlLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKKwkJCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG5vZGUpOworCQkJCXRtcCA9IHNpemVEaXYub2Zmc2V0V2lkdGg7CisJCQkJbm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gJyc7CisJCQkJcHJldi5hcHBlbmRDaGlsZChub2RlKTsKKwkJCX0KKworCQkJdG1wICs9IDM7CisJCQkKKwkJCWlmICh0aGlzLmNsaXBwZWQpCisJCQl7CisJCQkJdG1wID0gTWF0aC5taW4odG1wLCB3KTsKKwkJCX0KKwkJCQorCQkJc3R5bGUud2lkdGggPSB0bXAgKyAncHgnOworCQl9CisJfQorCWVsc2UKKwl7CisJCXN0eWxlLndoaXRlU3BhY2UgPSAnbm93cmFwJzsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRNYXJnaW4KKyAqCisgKiBSZXR1cm5zIHRoZSBzcGFjaW5nIGFzIGFuIDxteFBvaW50Pi4KKyAqLworbXhUZXh0LnByb3RvdHlwZS51cGRhdGVNYXJnaW4gPSBmdW5jdGlvbigpCit7CisJdGhpcy5tYXJnaW4gPSBteFV0aWxzLmdldEFsaWdubWVudEFzUG9pbnQodGhpcy5hbGlnbiwgdGhpcy52YWxpZ24pOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0U3BhY2luZworICoKKyAqIFJldHVybnMgdGhlIHNwYWNpbmcgYXMgYW4gPG14UG9pbnQ+LgorICovCitteFRleHQucHJvdG90eXBlLmdldFNwYWNpbmcgPSBmdW5jdGlvbigpCit7CisJdmFyIGR4ID0gMDsKKwl2YXIgZHkgPSAwOworCisJaWYgKHRoaXMuYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fQ0VOVEVSKQorCXsKKwkJZHggPSAodGhpcy5zcGFjaW5nTGVmdCAtIHRoaXMuc3BhY2luZ1JpZ2h0KSAvIDI7CisJfQorCWVsc2UgaWYgKHRoaXMuYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fUklHSFQpCisJeworCQlkeCA9IC10aGlzLnNwYWNpbmdSaWdodCAtIHRoaXMuYmFzZVNwYWNpbmdSaWdodDsKKwl9CisJZWxzZQorCXsKKwkJZHggPSB0aGlzLnNwYWNpbmdMZWZ0ICsgdGhpcy5iYXNlU3BhY2luZ0xlZnQ7CisJfQorCisJaWYgKHRoaXMudmFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSkKKwl7CisJCWR5ID0gKHRoaXMuc3BhY2luZ1RvcCAtIHRoaXMuc3BhY2luZ0JvdHRvbSkgLyAyOworCX0KKwllbHNlIGlmICh0aGlzLnZhbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9CT1RUT00pCisJeworCQlkeSA9IC10aGlzLnNwYWNpbmdCb3R0b20gLSB0aGlzLmJhc2VTcGFjaW5nQm90dG9tOzsKKwl9CisJZWxzZQorCXsKKwkJZHkgPSB0aGlzLnNwYWNpbmdUb3AgKyB0aGlzLmJhc2VTcGFjaW5nVG9wOworCX0KKwkKKwlyZXR1cm4gbmV3IG14UG9pbnQoZHgsIGR5KTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhUcmlhbmdsZS5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy9zaGFwZS9teFRyaWFuZ2xlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMzQ1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvc2hhcGUvbXhUcmlhbmdsZS5qcwpAQCAtMCwwICsxLDMzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFRyaWFuZ2xlCisgKiAKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0cmlhbmdsZSBzaGFwZS4KKyAqIAorICogQ29uc3RydWN0b3I6IG14VHJpYW5nbGUKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IHRyaWFuZ2xlIHNoYXBlLgorICovCitmdW5jdGlvbiBteFRyaWFuZ2xlKCkKK3sKKwlteEFjdG9yLmNhbGwodGhpcyk7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhBY3Rvci4KKyAqLworbXhVdGlscy5leHRlbmQobXhUcmlhbmdsZSwgbXhBY3Rvcik7CisKKy8qKgorICogRnVuY3Rpb246IHJlZHJhd1BhdGgKKyAqCisgKiBEcmF3cyB0aGUgcGF0aCBmb3IgdGhpcyBzaGFwZS4KKyAqLworbXhUcmlhbmdsZS5wcm90b3R5cGUucmVkcmF3UGF0aCA9IGZ1bmN0aW9uKGMsIHgsIHksIHcsIGgpCit7CisJdmFyIGFyY1NpemUgPSBteFV0aWxzLmdldFZhbHVlKHRoaXMuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0FSQ1NJWkUsIG14Q29uc3RhbnRzLkxJTkVfQVJDU0laRSkgLyAyOworCXRoaXMuYWRkUG9pbnRzKGMsIFtuZXcgbXhQb2ludCgwLCAwKSwgbmV3IG14UG9pbnQodywgMC41ICogaCksIG5ldyBteFBvaW50KDAsIGgpXSwgdGhpcy5pc1JvdW5kZWQsIGFyY1NpemUsIHRydWUpOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214QWJzdHJhY3RDYW52YXMyRC5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214QWJzdHJhY3RDYW52YXMyRC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTQ0N2YzCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhBYnN0cmFjdENhbnZhczJELmpzCkBAIC0wLDAgKzEsNjQyIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteEFic3RyYWN0Q2FudmFzMkQKKyAqCisgKiBCYXNlIGNsYXNzIGZvciBhbGwgY2FudmFzZXMuIEEgZGVzY3JpcHRpb24gb2YgdGhlIHB1YmxpYyBBUEkgaXMgYXZhaWxhYmxlIGluIDxteFhtbENhbnZhczJEPi4KKyAqIEFsbCBjb2xvciB2YWx1ZXMgb2YgPG14Q29uc3RhbnRzLk5PTkU+IHdpbGwgYmUgY29udmVydGVkIHRvIG51bGwgaW4gdGhlIHN0YXRlLgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhBYnN0cmFjdENhbnZhczJECisgKgorICogQ29uc3RydWN0cyBhIG5ldyBhYnN0cmFjdCBjYW52YXMuCisgKi8KK2Z1bmN0aW9uIG14QWJzdHJhY3RDYW52YXMyRCgpCit7CisJLyoqCisJICogVmFyaWFibGU6IGNvbnZlcnRlcgorCSAqIAorCSAqIEhvbGRzIHRoZSA8bXhVcmxDb252ZXJ0ZXI+IHRvIGNvbnZlcnQgaW1hZ2UgVVJMcy4KKwkgKi8KKwl0aGlzLmNvbnZlcnRlciA9IHRoaXMuY3JlYXRlVXJsQ29udmVydGVyKCk7CisJCisJdGhpcy5yZXNldCgpOworfTsKKworLyoqCisgKiBWYXJpYWJsZTogc3RhdGUKKyAqIAorICogSG9sZHMgdGhlIGN1cnJlbnQgc3RhdGUuCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuc3RhdGUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzdGF0ZXMKKyAqIAorICogU3RhY2sgb2Ygc3RhdGVzLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnN0YXRlcyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHBhdGgKKyAqIAorICogSG9sZHMgdGhlIGN1cnJlbnQgcGF0aCBhcyBhbiBhcnJheS4KKyAqLworbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5wYXRoID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogcm90YXRlSHRtbAorICogCisgKiBTd2l0Y2ggZm9yIHJvdGF0aW9uIG9mIEhUTUwuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUucm90YXRlSHRtbCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGxhc3RYCisgKiAKKyAqIEhvbGRzIHRoZSBsYXN0IHggY29vcmRpbmF0ZS4KKyAqLworbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5sYXN0WCA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IGxhc3RZCisgKiAKKyAqIEhvbGRzIHRoZSBsYXN0IHkgY29vcmRpbmF0ZS4KKyAqLworbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5sYXN0WSA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IG1vdmVPcAorICogCisgKiBDb250YWlucyB0aGUgc3RyaW5nIHVzZWQgZm9yIG1vdmluZyBpbiBwYXRocy4gRGVmYXVsdCBpcyAnTScuCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUubW92ZU9wID0gJ00nOworCisvKioKKyAqIFZhcmlhYmxlOiBsaW5lT3AKKyAqIAorICogQ29udGFpbnMgdGhlIHN0cmluZyB1c2VkIGZvciBtb3ZpbmcgaW4gcGF0aHMuIERlZmF1bHQgaXMgJ0wnLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLmxpbmVPcCA9ICdMJzsKKworLyoqCisgKiBWYXJpYWJsZTogcXVhZE9wCisgKiAKKyAqIENvbnRhaW5zIHRoZSBzdHJpbmcgdXNlZCBmb3IgcXVhZHJhdGljIHBhdGhzLiBEZWZhdWx0IGlzICdRJy4KKyAqLworbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5xdWFkT3AgPSAnUSc7CisKKy8qKgorICogVmFyaWFibGU6IGN1cnZlT3AKKyAqIAorICogQ29udGFpbnMgdGhlIHN0cmluZyB1c2VkIGZvciBiZXppZXIgY3VydmVzLiBEZWZhdWx0IGlzICdDJy4KKyAqLworbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5jdXJ2ZU9wID0gJ0MnOworCisvKioKKyAqIFZhcmlhYmxlOiBjbG9zZU9wCisgKiAKKyAqIEhvbGRzIHRoZSBvcGVyYXRvciBmb3IgY2xvc2luZyBjdXJ2ZXMuIERlZmF1bHQgaXMgJ1onLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLmNsb3NlT3AgPSAnWic7CisKKy8qKgorICogVmFyaWFibGU6IHBvaW50ZXJFdmVudHMKKyAqIAorICogQm9vbGVhbiB2YWx1ZSB0aGF0IHNwZWNpZmllcyBpZiBldmVudHMgc2hvdWxkIGJlIGhhbmRsZWQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUucG9pbnRlckV2ZW50cyA9IGZhbHNlOworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVVcmxDb252ZXJ0ZXIKKyAqIAorICogQ3JlYXRlIGEgbmV3IDxteFVybENvbnZlcnRlcj4gYW5kIHJldHVybnMgaXQuCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuY3JlYXRlVXJsQ29udmVydGVyID0gZnVuY3Rpb24oKQoreworCXJldHVybiBuZXcgbXhVcmxDb252ZXJ0ZXIoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlc2V0CisgKiAKKyAqIFJlc2V0cyB0aGUgc3RhdGUgb2YgdGhpcyBjYW52YXMuCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpCit7CisJdGhpcy5zdGF0ZSA9IHRoaXMuY3JlYXRlU3RhdGUoKTsKKwl0aGlzLnN0YXRlcyA9IFtdOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlU3RhdGUKKyAqIAorICogQ3JlYXRlcyB0aGUgc3RhdGUgb2YgdGhlIHRoaXMgY2FudmFzLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLmNyZWF0ZVN0YXRlID0gZnVuY3Rpb24oKQoreworCXJldHVybiB7CisJCWR4OiAwLAorCQlkeTogMCwKKwkJc2NhbGU6IDEsCisJCWFscGhhOiAxLAorCQlmaWxsQWxwaGE6IDEsCisJCXN0cm9rZUFscGhhOiAxLAorCQlmaWxsQ29sb3I6IG51bGwsCisJCWdyYWRpZW50RmlsbEFscGhhOiAxLAorCQlncmFkaWVudENvbG9yOiBudWxsLAorCQlncmFkaWVudEFscGhhOiAxLAorCQlncmFkaWVudERpcmVjdGlvbjogbnVsbCwKKwkJc3Ryb2tlQ29sb3I6IG51bGwsCisJCXN0cm9rZVdpZHRoOiAxLAorCQlkYXNoZWQ6IGZhbHNlLAorCQlkYXNoUGF0dGVybjogJzMgMycsCisJCWZpeERhc2g6IGZhbHNlLAorCQlsaW5lQ2FwOiAnZmxhdCcsCisJCWxpbmVKb2luOiAnbWl0ZXInLAorCQltaXRlckxpbWl0OiAxMCwKKwkJZm9udENvbG9yOiAnIzAwMDAwMCcsCisJCWZvbnRCYWNrZ3JvdW5kQ29sb3I6IG51bGwsCisJCWZvbnRCb3JkZXJDb2xvcjogbnVsbCwKKwkJZm9udFNpemU6IG14Q29uc3RhbnRzLkRFRkFVTFRfRk9OVFNJWkUsCisJCWZvbnRGYW1pbHk6IG14Q29uc3RhbnRzLkRFRkFVTFRfRk9OVEZBTUlMWSwKKwkJZm9udFN0eWxlOiAwLAorCQlzaGFkb3c6IGZhbHNlLAorCQlzaGFkb3dDb2xvcjogbXhDb25zdGFudHMuU0hBRE9XQ09MT1IsCisJCXNoYWRvd0FscGhhOiBteENvbnN0YW50cy5TSEFET1dfT1BBQ0lUWSwKKwkJc2hhZG93RHg6IG14Q29uc3RhbnRzLlNIQURPV19PRkZTRVRfWCwKKwkJc2hhZG93RHk6IG14Q29uc3RhbnRzLlNIQURPV19PRkZTRVRfWSwKKwkJcm90YXRpb246IDAsCisJCXJvdGF0aW9uQ3g6IDAsCisJCXJvdGF0aW9uQ3k6IDAKKwl9OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZm9ybWF0CisgKiAKKyAqIFJvdW5kcyBhbGwgbnVtYmVycyB0byBpbnRlZ2Vycy4KKyAqLworbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwlyZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KHZhbHVlKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRPcAorICogCisgKiBBZGRzIHRoZSBnaXZlbiBvcGVyYXRpb24gdG8gdGhlIHBhdGguCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuYWRkT3AgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMucGF0aCAhPSBudWxsKQorCXsKKwkJdGhpcy5wYXRoLnB1c2goYXJndW1lbnRzWzBdKTsKKwkJCisJCWlmIChhcmd1bWVudHMubGVuZ3RoID4gMikKKwkJeworCQkJdmFyIHMgPSB0aGlzLnN0YXRlOworCisJCQlmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKz0gMikKKwkJCXsKKwkJCQl0aGlzLmxhc3RYID0gYXJndW1lbnRzW2kgLSAxXTsKKwkJCQl0aGlzLmxhc3RZID0gYXJndW1lbnRzW2ldOworCQkJCQorCQkJCXRoaXMucGF0aC5wdXNoKHRoaXMuZm9ybWF0KCh0aGlzLmxhc3RYICsgcy5keCkgKiBzLnNjYWxlKSk7CisJCQkJdGhpcy5wYXRoLnB1c2godGhpcy5mb3JtYXQoKHRoaXMubGFzdFkgKyBzLmR5KSAqIHMuc2NhbGUpKTsKKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJvdGF0ZVBvaW50CisgKiAKKyAqIFJvdGF0ZXMgdGhlIGdpdmVuIHBvaW50IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYW4gPG14UG9pbnQ+LgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnJvdGF0ZVBvaW50ID0gZnVuY3Rpb24oeCwgeSwgdGhldGEsIGN4LCBjeSkKK3sKKwl2YXIgcmFkID0gdGhldGEgKiAoTWF0aC5QSSAvIDE4MCk7CisJCisJcmV0dXJuIG14VXRpbHMuZ2V0Um90YXRlZFBvaW50KG5ldyBteFBvaW50KHgsIHkpLCBNYXRoLmNvcyhyYWQpLAorCQlNYXRoLnNpbihyYWQpLCBuZXcgbXhQb2ludChjeCwgY3kpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNhdmUKKyAqIAorICogU2F2ZXMgdGhlIGN1cnJlbnQgc3RhdGUuCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuc2F2ZSA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnN0YXRlcy5wdXNoKHRoaXMuc3RhdGUpOworCXRoaXMuc3RhdGUgPSBteFV0aWxzLmNsb25lKHRoaXMuc3RhdGUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVzdG9yZQorICogCisgKiBSZXN0b3JlcyB0aGUgY3VycmVudCBzdGF0ZS4KKyAqLworbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5yZXN0b3JlID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLnN0YXRlcy5sZW5ndGggPiAwKQorCXsKKwkJdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGVzLnBvcCgpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHNldExpbmsKKyAqIAorICogU2V0cyB0aGUgY3VycmVudCBsaW5rLiBIb29rIGZvciBzdWJjbGFzc2Vycy4KKyAqLworbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5zZXRMaW5rID0gZnVuY3Rpb24obGluaykKK3sKKwkvLyBub3AKK307CisKKy8qKgorICogRnVuY3Rpb246IHNjYWxlCisgKiAKKyAqIFNjYWxlcyB0aGUgY3VycmVudCBzdGF0ZS4KKyAqLworbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5zY2FsZSA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuc3RhdGUuc2NhbGUgKj0gdmFsdWU7CisJdGhpcy5zdGF0ZS5zdHJva2VXaWR0aCAqPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHRyYW5zbGF0ZQorICogCisgKiBUcmFuc2xhdGVzIHRoZSBjdXJyZW50IHN0YXRlLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKGR4LCBkeSkKK3sKKwl0aGlzLnN0YXRlLmR4ICs9IGR4OworCXRoaXMuc3RhdGUuZHkgKz0gZHk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByb3RhdGUKKyAqIAorICogUm90YXRlcyB0aGUgY3VycmVudCBzdGF0ZS4KKyAqLworbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5yb3RhdGUgPSBmdW5jdGlvbih0aGV0YSwgZmxpcEgsIGZsaXBWLCBjeCwgY3kpCit7CisJLy8gbm9wCit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRBbHBoYQorICogCisgKiBTZXRzIHRoZSBjdXJyZW50IGFscGhhLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldEFscGhhID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5zdGF0ZS5hbHBoYSA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0RmlsbEFscGhhCisgKiAKKyAqIFNldHMgdGhlIGN1cnJlbnQgc29saWQgZmlsbCBhbHBoYS4KKyAqLworbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5zZXRGaWxsQWxwaGEgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLnN0YXRlLmZpbGxBbHBoYSA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0U3Ryb2tlQWxwaGEKKyAqIAorICogU2V0cyB0aGUgY3VycmVudCBzdHJva2UgYWxwaGEuCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuc2V0U3Ryb2tlQWxwaGEgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLnN0YXRlLnN0cm9rZUFscGhhID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRGaWxsQ29sb3IKKyAqIAorICogU2V0cyB0aGUgY3VycmVudCBmaWxsIGNvbG9yLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldEZpbGxDb2xvciA9IGZ1bmN0aW9uKHZhbHVlKQoreworCWlmICh2YWx1ZSA9PSBteENvbnN0YW50cy5OT05FKQorCXsKKwkJdmFsdWUgPSBudWxsOworCX0KKwkKKwl0aGlzLnN0YXRlLmZpbGxDb2xvciA9IHZhbHVlOworCXRoaXMuc3RhdGUuZ3JhZGllbnRDb2xvciA9IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRHcmFkaWVudAorICogCisgKiBTZXRzIHRoZSBjdXJyZW50IGdyYWRpZW50LgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldEdyYWRpZW50ID0gZnVuY3Rpb24oY29sb3IxLCBjb2xvcjIsIHgsIHksIHcsIGgsIGRpcmVjdGlvbiwgYWxwaGExLCBhbHBoYTIpCit7CisJdmFyIHMgPSB0aGlzLnN0YXRlOworCXMuZmlsbENvbG9yID0gY29sb3IxOworCXMuZ3JhZGllbnRGaWxsQWxwaGEgPSAoYWxwaGExICE9IG51bGwpID8gYWxwaGExIDogMTsKKwlzLmdyYWRpZW50Q29sb3IgPSBjb2xvcjI7CisJcy5ncmFkaWVudEFscGhhID0gKGFscGhhMiAhPSBudWxsKSA/IGFscGhhMiA6IDE7CisJcy5ncmFkaWVudERpcmVjdGlvbiA9IGRpcmVjdGlvbjsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFN0cm9rZUNvbG9yCisgKiAKKyAqIFNldHMgdGhlIGN1cnJlbnQgc3Ryb2tlIGNvbG9yLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldFN0cm9rZUNvbG9yID0gZnVuY3Rpb24odmFsdWUpCit7CisJaWYgKHZhbHVlID09IG14Q29uc3RhbnRzLk5PTkUpCisJeworCQl2YWx1ZSA9IG51bGw7CisJfQorCQorCXRoaXMuc3RhdGUuc3Ryb2tlQ29sb3IgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFN0cm9rZVdpZHRoCisgKiAKKyAqIFNldHMgdGhlIGN1cnJlbnQgc3Ryb2tlIHdpZHRoLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldFN0cm9rZVdpZHRoID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5zdGF0ZS5zdHJva2VXaWR0aCA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0RGFzaGVkCisgKiAKKyAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgZGFzaGVkIGxpbmVzLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldERhc2hlZCA9IGZ1bmN0aW9uKHZhbHVlLCBmaXhEYXNoKQoreworCXRoaXMuc3RhdGUuZGFzaGVkID0gdmFsdWU7CisJdGhpcy5zdGF0ZS5maXhEYXNoID0gZml4RGFzaDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldERhc2hQYXR0ZXJuCisgKiAKKyAqIFNldHMgdGhlIGN1cnJlbnQgZGFzaCBwYXR0ZXJuLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldERhc2hQYXR0ZXJuID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5zdGF0ZS5kYXNoUGF0dGVybiA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0TGluZUNhcAorICogCisgKiBTZXRzIHRoZSBjdXJyZW50IGxpbmUgY2FwLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldExpbmVDYXAgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLnN0YXRlLmxpbmVDYXAgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldExpbmVKb2luCisgKiAKKyAqIFNldHMgdGhlIGN1cnJlbnQgbGluZSBqb2luLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldExpbmVKb2luID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5zdGF0ZS5saW5lSm9pbiA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0TWl0ZXJMaW1pdAorICogCisgKiBTZXRzIHRoZSBjdXJyZW50IG1pdGVyIGxpbWl0LgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldE1pdGVyTGltaXQgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLnN0YXRlLm1pdGVyTGltaXQgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEZvbnRDb2xvcgorICogCisgKiBTZXRzIHRoZSBjdXJyZW50IGZvbnQgY29sb3IuCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuc2V0Rm9udENvbG9yID0gZnVuY3Rpb24odmFsdWUpCit7CisJaWYgKHZhbHVlID09IG14Q29uc3RhbnRzLk5PTkUpCisJeworCQl2YWx1ZSA9IG51bGw7CisJfQorCQorCXRoaXMuc3RhdGUuZm9udENvbG9yID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRGb250Q29sb3IKKyAqIAorICogU2V0cyB0aGUgY3VycmVudCBmb250IGNvbG9yLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldEZvbnRCYWNrZ3JvdW5kQ29sb3IgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwlpZiAodmFsdWUgPT0gbXhDb25zdGFudHMuTk9ORSkKKwl7CisJCXZhbHVlID0gbnVsbDsKKwl9CisJCisJdGhpcy5zdGF0ZS5mb250QmFja2dyb3VuZENvbG9yID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRGb250Q29sb3IKKyAqIAorICogU2V0cyB0aGUgY3VycmVudCBmb250IGNvbG9yLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldEZvbnRCb3JkZXJDb2xvciA9IGZ1bmN0aW9uKHZhbHVlKQoreworCWlmICh2YWx1ZSA9PSBteENvbnN0YW50cy5OT05FKQorCXsKKwkJdmFsdWUgPSBudWxsOworCX0KKwkKKwl0aGlzLnN0YXRlLmZvbnRCb3JkZXJDb2xvciA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0Rm9udFNpemUKKyAqIAorICogU2V0cyB0aGUgY3VycmVudCBmb250IHNpemUuCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuc2V0Rm9udFNpemUgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLnN0YXRlLmZvbnRTaXplID0gcGFyc2VGbG9hdCh2YWx1ZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRGb250RmFtaWx5CisgKiAKKyAqIFNldHMgdGhlIGN1cnJlbnQgZm9udCBmYW1pbHkuCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuc2V0Rm9udEZhbWlseSA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuc3RhdGUuZm9udEZhbWlseSA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0Rm9udFN0eWxlCisgKiAKKyAqIFNldHMgdGhlIGN1cnJlbnQgZm9udCBzdHlsZS4KKyAqLworbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5zZXRGb250U3R5bGUgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwlpZiAodmFsdWUgPT0gbnVsbCkKKwl7CisJCXZhbHVlID0gMDsKKwl9CisJCisJdGhpcy5zdGF0ZS5mb250U3R5bGUgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFNoYWRvdworICogCisgKiBFbmFibGVzIG9yIGRpc2FibGVzIGFuZCBjb25maWd1cmVzIHRoZSBjdXJyZW50IHNoYWRvdy4KKyAqLworbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5zZXRTaGFkb3cgPSBmdW5jdGlvbihlbmFibGVkKQoreworCXRoaXMuc3RhdGUuc2hhZG93ID0gZW5hYmxlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFNoYWRvd0NvbG9yCisgKiAKKyAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIGN1cnJlbnQgc2hhZG93LgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldFNoYWRvd0NvbG9yID0gZnVuY3Rpb24odmFsdWUpCit7CisJaWYgKHZhbHVlID09IG14Q29uc3RhbnRzLk5PTkUpCisJeworCQl2YWx1ZSA9IG51bGw7CisJfQorCQorCXRoaXMuc3RhdGUuc2hhZG93Q29sb3IgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFNoYWRvd0FscGhhCisgKiAKKyAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIGN1cnJlbnQgc2hhZG93LgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldFNoYWRvd0FscGhhID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5zdGF0ZS5zaGFkb3dBbHBoYSA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0U2hhZG93T2Zmc2V0CisgKiAKKyAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIGN1cnJlbnQgc2hhZG93LgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldFNoYWRvd09mZnNldCA9IGZ1bmN0aW9uKGR4LCBkeSkKK3sKKwl0aGlzLnN0YXRlLnNoYWRvd0R4ID0gZHg7CisJdGhpcy5zdGF0ZS5zaGFkb3dEeSA9IGR5OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYmVnaW4KKyAqIAorICogU3RhcnRzIGEgbmV3IHBhdGguCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuYmVnaW4gPSBmdW5jdGlvbigpCit7CisJdGhpcy5sYXN0WCA9IDA7CisJdGhpcy5sYXN0WSA9IDA7CisJdGhpcy5wYXRoID0gW107Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3ZlVG8KKyAqIAorICogIE1vdmVzIHRoZSBjdXJyZW50IHBhdGggdGhlIGdpdmVuIGNvb3JkaW5hdGVzLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLm1vdmVUbyA9IGZ1bmN0aW9uKHgsIHkpCit7CisJdGhpcy5hZGRPcCh0aGlzLm1vdmVPcCwgeCwgeSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBsaW5lVG8KKyAqIAorICogRHJhd3MgYSBsaW5lIHRvIHRoZSBnaXZlbiBjb29yZGluYXRlcy4gVXNlcyBtb3ZlVG8gd2l0aCB0aGUgb3AgYXJndW1lbnQuCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUubGluZVRvID0gZnVuY3Rpb24oeCwgeSkKK3sKKwl0aGlzLmFkZE9wKHRoaXMubGluZU9wLCB4LCB5KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHF1YWRUbworICogCisgKiBBZGRzIGEgcXVhZHJhdGljIGN1cnZlIHRvIHRoZSBjdXJyZW50IHBhdGguCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUucXVhZFRvID0gZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIpCit7CisJdGhpcy5hZGRPcCh0aGlzLnF1YWRPcCwgeDEsIHkxLCB4MiwgeTIpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3VydmVUbworICogCisgKiBBZGRzIGEgYmV6aWVyIGN1cnZlIHRvIHRoZSBjdXJyZW50IHBhdGguCisgKi8KK214QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuY3VydmVUbyA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpCit7CisJdGhpcy5hZGRPcCh0aGlzLmN1cnZlT3AsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJjVG8KKyAqIAorICogQWRkcyB0aGUgZ2l2ZW4gYXJjIHRvIHRoZSBjdXJyZW50IHBhdGguIFRoaXMgaXMgYSBzeW50aGV0aWMgb3BlcmF0aW9uIHRoYXQKKyAqIGlzIGJyb2tlbiBkb3duIGludG8gY3VydmVzLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLmFyY1RvID0gZnVuY3Rpb24ocngsIHJ5LCBhbmdsZSwgbGFyZ2VBcmNGbGFnLCBzd2VlcEZsYWcsIHgsIHkpCit7CisJdmFyIGN1cnZlcyA9IG14VXRpbHMuYXJjVG9DdXJ2ZXModGhpcy5sYXN0WCwgdGhpcy5sYXN0WSwgcngsIHJ5LCBhbmdsZSwgbGFyZ2VBcmNGbGFnLCBzd2VlcEZsYWcsIHgsIHkpOworCQorCWlmIChjdXJ2ZXMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgY3VydmVzLmxlbmd0aDsgaSArPSA2KSAKKwkJeworCQkJdGhpcy5jdXJ2ZVRvKGN1cnZlc1tpXSwgY3VydmVzW2kgKyAxXSwgY3VydmVzW2kgKyAyXSwKKwkJCQljdXJ2ZXNbaSArIDNdLCBjdXJ2ZXNbaSArIDRdLCBjdXJ2ZXNbaSArIDVdKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGNsb3NlCisgKiAKKyAqIENsb3NlcyB0aGUgY3VycmVudCBwYXRoLgorICovCitteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHgzLCB5MykKK3sKKwl0aGlzLmFkZE9wKHRoaXMuY2xvc2VPcCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBlbmQKKyAqIAorICogRW1wdHkgaW1wbGVtZW50YXRpb24gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGlzIHdpbGwgYmUgcmVtb3ZlZC4KKyAqLworbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHsgfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214QW5pbWF0aW9uLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhBbmltYXRpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiZDljMwotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214QW5pbWF0aW9uLmpzCkBAIC0wLDAgKzEsOTIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICoKKyAqIENsYXNzOiBteEFuaW1hdGlvbgorICogCisgKiBJbXBsZW1lbnRzIGEgYmFzaWMgYW5pbWF0aW9uIGluIEphdmFTY3JpcHQuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteEFuaW1hdGlvbgorICogCisgKiBDb25zdHJ1Y3RzIGFuIGFuaW1hdGlvbi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZ3JhcGggLSBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKi8KK2Z1bmN0aW9uIG14QW5pbWF0aW9uKGRlbGF5KQoreworCXRoaXMuZGVsYXkgPSAoZGVsYXkgIT0gbnVsbCkgPyBkZWxheSA6IDIwOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14RXZlbnRTb3VyY2UuCisgKi8KK214QW5pbWF0aW9uLnByb3RvdHlwZSA9IG5ldyBteEV2ZW50U291cmNlKCk7CitteEFuaW1hdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBteEFuaW1hdGlvbjsKKworLyoqCisgKiBWYXJpYWJsZTogZGVsYXkKKyAqIAorICogU3BlY2lmaWVzIHRoZSBkZWxheSBiZXR3ZWVuIHRoZSBhbmltYXRpb24gc3RlcHMuIERlZmF1bCBpcyAzMG1zLgorICovCitteEFuaW1hdGlvbi5wcm90b3R5cGUuZGVsYXkgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB0aHJlYWQKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSB0aHJlYWQgd2hpbGUgdGhlIGFuaW1hdGlvbiBpcyBydW5uaW5nLgorICovCitteEFuaW1hdGlvbi5wcm90b3R5cGUudGhyZWFkID0gbnVsbDsKKworLyoqCisgKiBGdW5jdGlvbjogaXNSdW5uaW5nCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYW5pbWF0aW9uIGlzIHJ1bm5pbmcuCisgKi8KK214QW5pbWF0aW9uLnByb3RvdHlwZS5pc1J1bm5pbmcgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMudGhyZWFkICE9IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzdGFydEFuaW1hdGlvbgorICoKKyAqIFN0YXJ0cyB0aGUgYW5pbWF0aW9uIGJ5IHJlcGVhdGVkbHkgaW52b2tpbmcgdXBkYXRlQW5pbWF0aW9uLgorICovCitteEFuaW1hdGlvbi5wcm90b3R5cGUuc3RhcnRBbmltYXRpb24gPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMudGhyZWFkID09IG51bGwpCisJeworCQl0aGlzLnRocmVhZCA9IHdpbmRvdy5zZXRJbnRlcnZhbChteFV0aWxzLmJpbmQodGhpcywgdGhpcy51cGRhdGVBbmltYXRpb24pLCB0aGlzLmRlbGF5KTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1cGRhdGVBbmltYXRpb24KKyAqCisgKiBIb29rIGZvciBzdWJjbGFzc2VycyB0byBpbXBsZW1lbnQgdGhlIGFuaW1hdGlvbi4gSW52b2tlIHN0b3BBbmltYXRpb24KKyAqIHdoZW4gZmluaXNoZWQsIHN0YXJ0QW5pbWF0aW9uIHRvIHJlc3VtZS4gVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlCisgKiB0aW1lciBmaXJlcyBhbmQgZmlyZXMgYW4gbXhFdmVudC5FWEVDVVRFIGV2ZW50IHdpdGggbm8gcHJvcGVydGllcy4KKyAqLworbXhBbmltYXRpb24ucHJvdG90eXBlLnVwZGF0ZUFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LkVYRUNVVEUpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHN0b3BBbmltYXRpb24KKyAqCisgKiBTdG9wcyB0aGUgYW5pbWF0aW9uIGJ5IGRlbGV0aW5nIHRoZSB0aW1lciBhbmQgZmlyZXMgYW4gPG14RXZlbnQuRE9ORT4uCisgKi8KK214QW5pbWF0aW9uLnByb3RvdHlwZS5zdG9wQW5pbWF0aW9uID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLnRocmVhZCAhPSBudWxsKQorCXsKKwkJd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy50aHJlYWQpOworCQl0aGlzLnRocmVhZCA9IG51bGw7CisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuRE9ORSkpOworCX0KK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teEF1dG9TYXZlTWFuYWdlci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214QXV0b1NhdmVNYW5hZ2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOWE0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teEF1dG9TYXZlTWFuYWdlci5qcwpAQCAtMCwwICsxLDIxMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhBdXRvU2F2ZU1hbmFnZXIKKyAqIAorICogTWFuYWdlciBmb3IgYXV0b21hdGljYWxseSBzYXZpbmcgZGlhZ3JhbXMuIFRoZSA8c2F2ZT4gaG9vayBtdXN0IGJlCisgKiBpbXBsZW1lbnRlZC4KKyAqIAorICogRXhhbXBsZToKKyAqIAorICogKGNvZGUpCisgKiB2YXIgbWdyID0gbmV3IG14QXV0b1NhdmVNYW5hZ2VyKGVkaXRvci5ncmFwaCk7CisgKiBtZ3Iuc2F2ZSA9IGZ1bmN0aW9uKCkKKyAqIHsKKyAqICAgbXhMb2cuc2hvdygpOworICogICBteExvZy5kZWJ1Zygnc2F2ZScpOworICogfTsKKyAqIChlbmQpCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteEF1dG9TYXZlTWFuYWdlcgorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgYXV0b21hdGljIGxheW91dCBmb3IgdGhlIGdpdmVuIGdyYXBoLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIAorICogZ3JhcGggLSBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyBncmFwaC4gCisgKi8KK2Z1bmN0aW9uIG14QXV0b1NhdmVNYW5hZ2VyKGdyYXBoKQoreworCS8vIE5vdGlmaWVzIHRoZSBtYW5hZ2VyIG9mIGEgY2hhbmdlCisJdGhpcy5jaGFuZ2VIYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorCXsKKwkJaWYgKHRoaXMuaXNFbmFibGVkKCkpCisJCXsKKwkJCXRoaXMuZ3JhcGhNb2RlbENoYW5nZWQoZXZ0LmdldFByb3BlcnR5KCdlZGl0JykuY2hhbmdlcyk7CisJCX0KKwl9KTsKKworCXRoaXMuc2V0R3JhcGgoZ3JhcGgpOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14RXZlbnRTb3VyY2UuCisgKi8KK214QXV0b1NhdmVNYW5hZ2VyLnByb3RvdHlwZSA9IG5ldyBteEV2ZW50U291cmNlKCk7CitteEF1dG9TYXZlTWFuYWdlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBteEF1dG9TYXZlTWFuYWdlcjsKKworLyoqCisgKiBWYXJpYWJsZTogZ3JhcGgKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgPG14R3JhcGg+LgorICovCitteEF1dG9TYXZlTWFuYWdlci5wcm90b3R5cGUuZ3JhcGggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBhdXRvU2F2ZURlbGF5CisgKiAKKyAqIE1pbmltdW0gYW1vdW50IG9mIHNlY29uZHMgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgYXV0b3NhdmVzLiBFZy4gYQorICogdmFsdWUgb2YgMSAocykgbWVhbnMgdGhlIGdyYXBoIGlzIG5vdCBzdG9yZWQgbW9yZSB0aGFuIG9uY2UgcGVyIHNlY29uZC4KKyAqIERlZmF1bHQgaXMgMTAuCisgKi8KK214QXV0b1NhdmVNYW5hZ2VyLnByb3RvdHlwZS5hdXRvU2F2ZURlbGF5ID0gMTA7CisKKy8qKgorICogVmFyaWFibGU6IGF1dG9TYXZlVGhyb3R0bGUKKyAqIAorICogTWluaW11bSBhbW91bnQgb2Ygc2Vjb25kcyBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBhdXRvc2F2ZXMgdHJpZ2dlcmVkIGJ5CisgKiBtb3JlIHRoYW4gPGF1dG9TYXZlVGhyZXNoaG9sZD4gY2hhbmdlcyB3aXRoaW4gYSB0aW1lc3BhbiBvZiBsZXNzIHRoYW4KKyAqIDxhdXRvU2F2ZURlbGF5PiBzZWNvbmRzLiBFZy4gYSB2YWx1ZSBvZiAxIChzKSBtZWFucyB0aGUgZ3JhcGggaXMgbm90CisgKiBzdG9yZWQgbW9yZSB0aGFuIG9uY2UgcGVyIHNlY29uZCBldmVuIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4KKyAqIDxhdXRvU2F2ZVRocmVzaG9sZD4gY2hhbmdlcyB3aXRoaW4gdGhhdCB0aW1lc3Bhbi4gRGVmYXVsdCBpcyAyLgorICovCitteEF1dG9TYXZlTWFuYWdlci5wcm90b3R5cGUuYXV0b1NhdmVUaHJvdHRsZSA9IDI7CisKKy8qKgorICogVmFyaWFibGU6IGF1dG9TYXZlVGhyZXNob2xkCisgKiAKKyAqIE1pbmltdW0gYW1vdW50IG9mIGlnbm9yZWQgY2hhbmdlcyBiZWZvcmUgYW4gYXV0b3NhdmUuIEVnLiBhIHZhbHVlIG9mIDIKKyAqIG1lYW5zIGFmdGVyIDIgY2hhbmdlIG9mIHRoZSBncmFwaCBtb2RlbCB0aGUgYXV0b3NhdmUgd2lsbCB0cmlnZ2VyIGlmIHRoZQorICogY29uZGl0aW9uIGJlbG93IGlzIHRydWUuIERlZmF1bHQgaXMgNS4KKyAqLworbXhBdXRvU2F2ZU1hbmFnZXIucHJvdG90eXBlLmF1dG9TYXZlVGhyZXNob2xkID0gNTsKKworLyoqCisgKiBWYXJpYWJsZTogaWdub3JlZENoYW5nZXMKKyAqIAorICogQ291bnRlciBmb3IgaWdub3JlZCBjaGFuZ2VzIGluIGF1dG9zYXZlLgorICovCitteEF1dG9TYXZlTWFuYWdlci5wcm90b3R5cGUuaWdub3JlZENoYW5nZXMgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBsYXN0U25hcHNob3QKKyAqIAorICogVXNlZCBmb3IgYXV0b3NhdmluZy4gU2VlIDxhdXRvc2F2ZT4uCisgKi8KK214QXV0b1NhdmVNYW5hZ2VyLnByb3RvdHlwZS5sYXN0U25hcHNob3QgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBlbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiBldmVudCBoYW5kbGluZyBpcyBlbmFibGVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214QXV0b1NhdmVNYW5hZ2VyLnByb3RvdHlwZS5lbmFibGVkID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogY2hhbmdlSGFuZGxlcgorICogCisgKiBIb2xkcyB0aGUgZnVuY3Rpb24gdGhhdCBoYW5kbGVzIGdyYXBoIG1vZGVsIGNoYW5nZXMuCisgKi8KK214QXV0b1NhdmVNYW5hZ2VyLnByb3RvdHlwZS5jaGFuZ2VIYW5kbGVyID0gbnVsbDsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFbmFibGVkCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiBldmVudHMgYXJlIGhhbmRsZWQuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIHJldHVybnMgPGVuYWJsZWQ+LgorICovCitteEF1dG9TYXZlTWFuYWdlci5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmVuYWJsZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRFbmFibGVkCisgKiAKKyAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgZXZlbnQgaGFuZGxpbmcuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIHVwZGF0ZXMgPGVuYWJsZWQ+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlbmFibGVkIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyB0aGUgbmV3IGVuYWJsZWQgc3RhdGUuCisgKi8KK214QXV0b1NhdmVNYW5hZ2VyLnByb3RvdHlwZS5zZXRFbmFibGVkID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5lbmFibGVkID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRHcmFwaAorICogCisgKiBTZXRzIHRoZSBncmFwaCB0aGF0IHRoZSBsYXlvdXRzIG9wZXJhdGUgb24uCisgKi8KK214QXV0b1NhdmVNYW5hZ2VyLnByb3RvdHlwZS5zZXRHcmFwaCA9IGZ1bmN0aW9uKGdyYXBoKQoreworCWlmICh0aGlzLmdyYXBoICE9IG51bGwpCisJeworCQl0aGlzLmdyYXBoLmdldE1vZGVsKCkucmVtb3ZlTGlzdGVuZXIodGhpcy5jaGFuZ2VIYW5kbGVyKTsKKwl9CisJCisJdGhpcy5ncmFwaCA9IGdyYXBoOworCQorCWlmICh0aGlzLmdyYXBoICE9IG51bGwpCisJeworCQl0aGlzLmdyYXBoLmdldE1vZGVsKCkuYWRkTGlzdGVuZXIobXhFdmVudC5DSEFOR0UsIHRoaXMuY2hhbmdlSGFuZGxlcik7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2F2ZQorICogCisgKiBFbXB0eSBob29rIHRoYXQgaXMgY2FsbGVkIGlmIHRoZSBncmFwaCBzaG91bGQgYmUgc2F2ZWQuCisgKi8KK214QXV0b1NhdmVNYW5hZ2VyLnByb3RvdHlwZS5zYXZlID0gZnVuY3Rpb24oKQoreworCS8vIGVtcHR5Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBncmFwaE1vZGVsQ2hhbmdlZAorICogCisgKiBJbnZva2VkIHdoZW4gdGhlIGdyYXBoIG1vZGVsIGhhcyBjaGFuZ2VkLgorICovCitteEF1dG9TYXZlTWFuYWdlci5wcm90b3R5cGUuZ3JhcGhNb2RlbENoYW5nZWQgPSBmdW5jdGlvbihjaGFuZ2VzKQoreworCXZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKKwl2YXIgZHQgPSAobm93IC0gdGhpcy5sYXN0U25hcHNob3QpIC8gMTAwMDsKKwkKKwlpZiAoZHQgPiB0aGlzLmF1dG9TYXZlRGVsYXkgfHwKKwkJKHRoaXMuaWdub3JlZENoYW5nZXMgPj0gdGhpcy5hdXRvU2F2ZVRocmVzaG9sZCAmJgorCQkgZHQgPiB0aGlzLmF1dG9TYXZlVGhyb3R0bGUpKQorCXsKKwkJdGhpcy5zYXZlKCk7CisJCXRoaXMucmVzZXQoKTsKKwl9CisJZWxzZQorCXsKKwkJLy8gSW5jcmVtZW50cyB0aGUgbnVtYmVyIG9mIGlnbm9yZWQgY2hhbmdlcworCQl0aGlzLmlnbm9yZWRDaGFuZ2VzKys7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVzZXQKKyAqIAorICogUmVzZXRzIGFsbCBjb3VudGVycy4KKyAqLworbXhBdXRvU2F2ZU1hbmFnZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKQoreworCXRoaXMubGFzdFNuYXBzaG90ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisJdGhpcy5pZ25vcmVkQ2hhbmdlcyA9IDA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZXN0cm95CisgKiAKKyAqIFJlbW92ZXMgYWxsIGhhbmRsZXJzIGZyb20gdGhlIDxncmFwaD4gYW5kIGRlbGV0ZXMgdGhlIHJlZmVyZW5jZSB0byBpdC4KKyAqLworbXhBdXRvU2F2ZU1hbmFnZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpCit7CisJdGhpcy5zZXRHcmFwaChudWxsKTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teENsaXBib2FyZC5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214Q2xpcGJvYXJkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NGUyZTcKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teENsaXBib2FyZC5qcwpAQCAtMCwwICsxLDIyMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLwordmFyIG14Q2xpcGJvYXJkID0KK3sKKwkvKioKKwkgKiBDbGFzczogbXhDbGlwYm9hcmQKKwkgKiAKKwkgKiBTaW5nbGV0b24gdGhhdCBpbXBsZW1lbnRzIGEgY2xpcGJvYXJkIGZvciBncmFwaCBjZWxscy4KKwkgKgorCSAqIEV4YW1wbGU6CisJICogCisJICogKGNvZGUpCisJICogbXhDbGlwYm9hcmQuY29weShncmFwaCk7CisJICogbXhDbGlwYm9hcmQucGFzdGUoZ3JhcGgyKTsKKwkgKiAoZW5kKQorCSAqCisJICogVGhpcyBjb3BpZXMgdGhlIHNlbGVjdGlvbiBjZWxscyBmcm9tIHRoZSBncmFwaCB0byB0aGUgY2xpcGJvYXJkIGFuZAorCSAqIHBhc3RlcyB0aGVtIGludG8gZ3JhcGgyLgorCSAqIAorCSAqIEZvciBmaW5lLWdyYWluZWQgY29udHJvbCBvZiB0aGUgY2xpcGJvYXJkIGRhdGEgdGhlIDxteEdyYXBoLmNhbkV4cG9ydENlbGw+CisJICogYW5kIDxteEdyYXBoLmNhbkltcG9ydENlbGw+IGZ1bmN0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbi4KKwkgKiAKKwkgKiBUbyByZXN0b3JlIHByZXZpb3VzIHBhcmVudHMgZm9yIHBhc3RlZCBjZWxscywgdGhlIGltcGxlbWVudGF0aW9uIGZvcgorCSAqIDxjb3B5PiBhbmQgPHBhc3RlPiBjYW4gYmUgY2hhbmdlZCBhcyBmb2xsb3dzLgorCSAqIAorCSAqIChjb2RlKQorCSAqIG14Q2xpcGJvYXJkLmNvcHkgPSBmdW5jdGlvbihncmFwaCwgY2VsbHMpCisJICogeworCSAqICAgY2VsbHMgPSBjZWxscyB8fCBncmFwaC5nZXRTZWxlY3Rpb25DZWxscygpOworCSAqICAgdmFyIHJlc3VsdCA9IGdyYXBoLmdldEV4cG9ydGFibGVDZWxscyhjZWxscyk7CisJICogICAKKwkgKiAgIG14Q2xpcGJvYXJkLnBhcmVudHMgPSBuZXcgT2JqZWN0KCk7CisJICogICAKKwkgKiAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQorCSAqICAgeworCSAqICAgICBteENsaXBib2FyZC5wYXJlbnRzW2ldID0gZ3JhcGgubW9kZWwuZ2V0UGFyZW50KGNlbGxzW2ldKTsKKwkgKiAgIH0KKwkgKiAgIAorCSAqICAgbXhDbGlwYm9hcmQuaW5zZXJ0Q291bnQgPSAxOworCSAqICAgbXhDbGlwYm9hcmQuc2V0Q2VsbHMoZ3JhcGguY2xvbmVDZWxscyhyZXN1bHQpKTsKKwkgKiAgIAorCSAqICAgcmV0dXJuIHJlc3VsdDsKKwkgKiB9OworCSAqIAorCSAqIG14Q2xpcGJvYXJkLnBhc3RlID0gZnVuY3Rpb24oZ3JhcGgpCisJICogeworCSAqICAgaWYgKCFteENsaXBib2FyZC5pc0VtcHR5KCkpCisJICogICB7CisJICogICAgIHZhciBjZWxscyA9IGdyYXBoLmdldEltcG9ydGFibGVDZWxscyhteENsaXBib2FyZC5nZXRDZWxscygpKTsKKwkgKiAgICAgdmFyIGRlbHRhID0gbXhDbGlwYm9hcmQuaW5zZXJ0Q291bnQgKiBteENsaXBib2FyZC5TVEVQU0laRTsKKwkgKiAgICAgdmFyIHBhcmVudCA9IGdyYXBoLmdldERlZmF1bHRQYXJlbnQoKTsKKwkgKiAgICAgCisJICogICAgIGdyYXBoLm1vZGVsLmJlZ2luVXBkYXRlKCk7CisJICogICAgIHRyeQorCSAqICAgICB7CisJICogICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkgKiAgICAgICB7CisJICogICAgICAgICB2YXIgdG1wID0gKG14Q2xpcGJvYXJkLnBhcmVudHMgIT0gbnVsbCAmJiBncmFwaC5tb2RlbC5jb250YWlucyhteENsaXBib2FyZC5wYXJlbnRzW2ldKSkgPworCSAqICAgICAgICAgICAgICBteENsaXBib2FyZC5wYXJlbnRzW2ldIDogcGFyZW50OworCSAqICAgICAgICAgY2VsbHNbaV0gPSBncmFwaC5pbXBvcnRDZWxscyhbY2VsbHNbaV1dLCBkZWx0YSwgZGVsdGEsIHRtcClbMF07CisJICogICAgICAgfQorCSAqICAgICB9CisJICogICAgIGZpbmFsbHkKKwkgKiAgICAgeworCSAqICAgICAgIGdyYXBoLm1vZGVsLmVuZFVwZGF0ZSgpOworCSAqICAgICB9CisJICogICAgIAorCSAqICAgICAvLyBJbmNyZW1lbnRzIHRoZSBjb3VudGVyIGFuZCBzZWxlY3RzIHRoZSBpbnNlcnRlZCBjZWxscworCSAqICAgICBteENsaXBib2FyZC5pbnNlcnRDb3VudCsrOworCSAqICAgICBncmFwaC5zZXRTZWxlY3Rpb25DZWxscyhjZWxscyk7CisJICogICB9CisJICogfTsKKwkgKiAoZW5kKQorCSAqIAorCSAqIFZhcmlhYmxlOiBTVEVQU0laRQorCSAqIAorCSAqIERlZmluZXMgdGhlIHN0ZXAgc2l6ZSB0byBvZmZzZXQgdGhlIGNlbGxzIGFmdGVyIGVhY2ggcGFzdGUgb3BlcmF0aW9uLgorCSAqIERlZmF1bHQgaXMgMTAuCisJICovCisJU1RFUFNJWkU6IDEwLAorCisJLyoqCisJICogVmFyaWFibGU6IGluc2VydENvdW50CisJICogCisJICogQ291bnRzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGNsaXBib2FyZCBkYXRhIGhhcyBiZWVuIGluc2VydGVkLgorCSAqLworCWluc2VydENvdW50OiAxLAorCisJLyoqCisJICogVmFyaWFibGU6IGNlbGxzCisJICogCisJICogSG9sZHMgdGhlIGFycmF5IG9mIDxteENlbGxzPiBjdXJyZW50bHkgaW4gdGhlIGNsaXBib2FyZC4KKwkgKi8KKwljZWxsczogbnVsbCwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBzZXRDZWxscworCSAqIAorCSAqIFNldHMgdGhlIGNlbGxzIGluIHRoZSBjbGlwYm9hcmQuIEZpcmVzIGEgPG14RXZlbnQuQ0hBTkdFPiBldmVudC4KKwkgKi8KKwlzZXRDZWxsczogZnVuY3Rpb24oY2VsbHMpCisJeworCQlteENsaXBib2FyZC5jZWxscyA9IGNlbGxzOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0Q2VsbHMKKwkgKiAKKwkgKiBSZXR1cm5zICB0aGUgY2VsbHMgaW4gdGhlIGNsaXBib2FyZC4KKwkgKi8KKwlnZXRDZWxsczogZnVuY3Rpb24oKQorCXsKKwkJcmV0dXJuIG14Q2xpcGJvYXJkLmNlbGxzOworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IGlzRW1wdHkKKwkgKiAKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaXBib2FyZCBjdXJyZW50bHkgaGFzIG5vdCBkYXRhIHN0b3JlZC4KKwkgKi8KKwlpc0VtcHR5OiBmdW5jdGlvbigpCisJeworCQlyZXR1cm4gbXhDbGlwYm9hcmQuZ2V0Q2VsbHMoKSA9PSBudWxsOworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IGN1dAorCSAqIAorCSAqIEN1dHMgdGhlIGdpdmVuIGFycmF5IG9mIDxteENlbGxzPiBmcm9tIHRoZSBzcGVjaWZpZWQgZ3JhcGguCisJICogSWYgY2VsbHMgaXMgbnVsbCB0aGVuIHRoZSBzZWxlY3Rpb24gY2VsbHMgb2YgdGhlIGdyYXBoIHdpbGwKKwkgKiBiZSB1c2VkLiBSZXR1cm5zIHRoZSBjZWxscyB0aGF0IGhhdmUgYmVlbiBjdXQgZnJvbSB0aGUgZ3JhcGguCisJICoKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGdyYXBoIC0gPG14R3JhcGg+IHRoYXQgY29udGFpbnMgdGhlIGNlbGxzIHRvIGJlIGN1dC4KKwkgKiBjZWxscyAtIE9wdGlvbmFsIGFycmF5IG9mIDxteENlbGxzPiB0byBiZSBjdXQuCisJICovCisJY3V0OiBmdW5jdGlvbihncmFwaCwgY2VsbHMpCisJeworCQljZWxscyA9IG14Q2xpcGJvYXJkLmNvcHkoZ3JhcGgsIGNlbGxzKTsKKwkJbXhDbGlwYm9hcmQuaW5zZXJ0Q291bnQgPSAwOworCQlteENsaXBib2FyZC5yZW1vdmVDZWxscyhncmFwaCwgY2VsbHMpOworCQkKKwkJcmV0dXJuIGNlbGxzOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogcmVtb3ZlQ2VsbHMKKwkgKiAKKwkgKiBIb29rIHRvIHJlbW92ZSB0aGUgZ2l2ZW4gY2VsbHMgZnJvbSB0aGUgZ2l2ZW4gZ3JhcGggYWZ0ZXIKKwkgKiBhIGN1dCBvcGVyYXRpb24uCisJICoKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGdyYXBoIC0gPG14R3JhcGg+IHRoYXQgY29udGFpbnMgdGhlIGNlbGxzIHRvIGJlIGN1dC4KKwkgKiBjZWxscyAtIEFycmF5IG9mIDxteENlbGxzPiB0byBiZSBjdXQuCisJICovCisJcmVtb3ZlQ2VsbHM6IGZ1bmN0aW9uKGdyYXBoLCBjZWxscykKKwl7CisJCWdyYXBoLnJlbW92ZUNlbGxzKGNlbGxzKTsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGNvcHkKKwkgKiAKKwkgKiBDb3BpZXMgdGhlIGdpdmVuIGFycmF5IG9mIDxteENlbGxzPiBmcm9tIHRoZSBzcGVjaWZpZWQKKwkgKiBncmFwaCB0byA8Y2VsbHM+LiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBhcnJheSBvZiBjZWxscyB0aGF0IGhhcworCSAqIGJlZW4gY2xvbmVkLiBEZXNjZW5kYW50cyBvZiBjZWxscyBpbiB0aGUgYXJyYXkgYXJlIGlnbm9yZWQuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBncmFwaCAtIDxteEdyYXBoPiB0aGF0IGNvbnRhaW5zIHRoZSBjZWxscyB0byBiZSBjb3BpZWQuCisJICogY2VsbHMgLSBPcHRpb25hbCBhcnJheSBvZiA8bXhDZWxscz4gdG8gYmUgY29waWVkLgorCSAqLworCWNvcHk6IGZ1bmN0aW9uKGdyYXBoLCBjZWxscykKKwl7CisJCWNlbGxzID0gY2VsbHMgfHwgZ3JhcGguZ2V0U2VsZWN0aW9uQ2VsbHMoKTsKKwkJdmFyIHJlc3VsdCA9IGdyYXBoLmdldEV4cG9ydGFibGVDZWxscyhncmFwaC5tb2RlbC5nZXRUb3Btb3N0Q2VsbHMoY2VsbHMpKTsKKwkJbXhDbGlwYm9hcmQuaW5zZXJ0Q291bnQgPSAxOworCQlteENsaXBib2FyZC5zZXRDZWxscyhncmFwaC5jbG9uZUNlbGxzKHJlc3VsdCkpOworCisJCXJldHVybiByZXN1bHQ7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBwYXN0ZQorCSAqIAorCSAqIFBhc3RlcyB0aGUgPGNlbGxzPiBpbnRvIHRoZSBzcGVjaWZpZWQgZ3JhcGggcmVzdG9yaW5nCisJICogdGhlIHJlbGF0aW9uIHRvIDxwYXJlbnRzPiwgaWYgcG9zc2libGUuIElmIHRoZSBwYXJlbnRzCisJICogYXJlIG5vIGxvbmdlciBpbiB0aGUgZ3JhcGggb3IgaW52aXNpYmxlIHRoZW4gdGhlCisJICogY2VsbHMgYXJlIGFkZGVkIHRvIHRoZSBncmFwaCdzIGRlZmF1bHQgb3IgaW50byB0aGUKKwkgKiBzd2ltbGFuZSB1bmRlciB0aGUgY2VsbCdzIG5ldyBsb2NhdGlvbiBpZiBvbmUgZXhpc3RzLgorCSAqIFRoZSBjZWxscyBhcmUgYWRkZWQgdG8gdGhlIGdyYXBoIHVzaW5nIDxteEdyYXBoLmltcG9ydENlbGxzPgorCSAqIGFuZCByZXR1cm5lZC4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGdyYXBoIC0gPG14R3JhcGg+IHRvIHBhc3RlIHRoZSA8Y2VsbHM+IGludG8uCisJICovCisJcGFzdGU6IGZ1bmN0aW9uKGdyYXBoKQorCXsKKwkJdmFyIGNlbGxzID0gbnVsbDsKKwkJCisJCWlmICghbXhDbGlwYm9hcmQuaXNFbXB0eSgpKQorCQl7CisJCQljZWxscyA9IGdyYXBoLmdldEltcG9ydGFibGVDZWxscyhteENsaXBib2FyZC5nZXRDZWxscygpKTsKKwkJCXZhciBkZWx0YSA9IG14Q2xpcGJvYXJkLmluc2VydENvdW50ICogbXhDbGlwYm9hcmQuU1RFUFNJWkU7CisJCQl2YXIgcGFyZW50ID0gZ3JhcGguZ2V0RGVmYXVsdFBhcmVudCgpOworCQkJY2VsbHMgPSBncmFwaC5pbXBvcnRDZWxscyhjZWxscywgZGVsdGEsIGRlbHRhLCBwYXJlbnQpOworCQkJCisJCQkvLyBJbmNyZW1lbnRzIHRoZSBjb3VudGVyIGFuZCBzZWxlY3RzIHRoZSBpbnNlcnRlZCBjZWxscworCQkJbXhDbGlwYm9hcmQuaW5zZXJ0Q291bnQrKzsKKwkJCWdyYXBoLnNldFNlbGVjdGlvbkNlbGxzKGNlbGxzKTsKKwkJfQorCQkKKwkJcmV0dXJuIGNlbGxzOworCX0KKworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214Q29uc3RhbnRzLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhDb25zdGFudHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0ODY0NAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214Q29uc3RhbnRzLmpzCkBAIC0wLDAgKzEsMjI3NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworIHZhciBteENvbnN0YW50cyA9CisgeworCS8qKgorCSAqIENsYXNzOiBteENvbnN0YW50cworCSAqIAorCSAqIERlZmluZXMgdmFyaW91cyBnbG9iYWwgY29uc3RhbnRzLgorCSAqIAorCSAqIFZhcmlhYmxlOiBERUZBVUxUX0hPVFNQT1QKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBwb3J0aW9uIG9mIHRoZSBjZWxsIHdoaWNoIGlzIHRvIGJlIHVzZWQgYXMgYSBjb25uZWN0YWJsZQorCSAqIHJlZ2lvbi4gRGVmYXVsdCBpcyAwLjMuIFBvc3NpYmxlIHZhbHVlcyBhcmUgMCA8IHggPD0gMS4gCisJICovCisJREVGQVVMVF9IT1RTUE9UOiAwLjMsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogTUlOX0hPVFNQT1RfU0laRQorCSAqIAorCSAqIERlZmluZXMgdGhlIG1pbmltdW0gc2l6ZSBpbiBwaXhlbHMgb2YgdGhlIHBvcnRpb24gb2YgdGhlIGNlbGwgd2hpY2ggaXMKKwkgKiB0byBiZSB1c2VkIGFzIGEgY29ubmVjdGFibGUgcmVnaW9uLiBEZWZhdWx0IGlzIDguCisJICovCisJTUlOX0hPVFNQT1RfU0laRTogOCwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBNQVhfSE9UU1BPVF9TSVpFCisJICogCisJICogRGVmaW5lcyB0aGUgbWF4aW11bSBzaXplIGluIHBpeGVscyBvZiB0aGUgcG9ydGlvbiBvZiB0aGUgY2VsbCB3aGljaCBpcworCSAqIHRvIGJlIHVzZWQgYXMgYSBjb25uZWN0YWJsZSByZWdpb24uIFVzZSAwIGZvciBubyBtYXhpbXVtLiBEZWZhdWx0IGlzIDAuCisJICovCisJTUFYX0hPVFNQT1RfU0laRTogMCwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBSRU5ERVJJTkdfSElOVF9FWEFDVAorCSAqIAorCSAqIERlZmluZXMgdGhlIGV4YWN0IHJlbmRlcmluZyBoaW50LgorCSAqLworCVJFTkRFUklOR19ISU5UX0VYQUNUOiAnZXhhY3QnLAorCisJLyoqCisJICogVmFyaWFibGU6IFJFTkRFUklOR19ISU5UX0ZBU1RFUgorCSAqIAorCSAqIERlZmluZXMgdGhlIGZhc3RlciByZW5kZXJpbmcgaGludC4KKwkgKi8KKwlSRU5ERVJJTkdfSElOVF9GQVNURVI6ICdmYXN0ZXInLAorCisJLyoqCisJICogVmFyaWFibGU6IFJFTkRFUklOR19ISU5UX0ZBU1RFU1QKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBmYXN0ZXN0IHJlbmRlcmluZyBoaW50LgorCSAqLworCVJFTkRFUklOR19ISU5UX0ZBU1RFU1Q6ICdmYXN0ZXN0JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBESUFMRUNUX1NWRworCSAqIAorCSAqIERlZmluZXMgdGhlIFNWRyBkaXNwbGF5IGRpYWxlY3QgbmFtZS4KKwkgKi8KKwlESUFMRUNUX1NWRzogJ3N2ZycsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRElBTEVDVF9WTUwKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBWTUwgZGlzcGxheSBkaWFsZWN0IG5hbWUuCisJICovCisJRElBTEVDVF9WTUw6ICd2bWwnLAorCisJLyoqCisJICogVmFyaWFibGU6IERJQUxFQ1RfTUlYRURIVE1MCisJICogCisJICogRGVmaW5lcyB0aGUgbWl4ZWQgSFRNTCBkaXNwbGF5IGRpYWxlY3QgbmFtZS4KKwkgKi8KKwlESUFMRUNUX01JWEVESFRNTDogJ21peGVkSHRtbCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRElBTEVDVF9QUkVGRVJIVE1MCisJICogCisJICogRGVmaW5lcyB0aGUgcHJlZmVycmVkIEhUTUwgZGlzcGxheSBkaWFsZWN0IG5hbWUuCisJICovCisJRElBTEVDVF9QUkVGRVJIVE1MOiAncHJlZmVySHRtbCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRElBTEVDVF9TVFJJQ1RIVE1MCisJICogCisJICogRGVmaW5lcyB0aGUgc3RyaWN0IEhUTUwgZGlzcGxheSBkaWFsZWN0LgorCSAqLworCURJQUxFQ1RfU1RSSUNUSFRNTDogJ3N0cmljdEh0bWwnLAorCisJLyoqCisJICogVmFyaWFibGU6IE5TX1NWRworCSAqIAorCSAqIERlZmluZXMgdGhlIFNWRyBuYW1lc3BhY2UuCisJICovCisJTlNfU1ZHOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLAorCisJLyoqCisJICogVmFyaWFibGU6IE5TX1hIVE1MCisJICogCisJICogRGVmaW5lcyB0aGUgWEhUTUwgbmFtZXNwYWNlLgorCSAqLworCU5TX1hIVE1MOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogTlNfWExJTksKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBYTGluayBuYW1lc3BhY2UuCisJICovCisJTlNfWExJTks6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTSEFET1dDT0xPUgorCSAqIAorCSAqIERlZmluZXMgdGhlIGNvbG9yIHRvIGJlIHVzZWQgdG8gZHJhdyBzaGFkb3dzIGluIHNoYXBlcyBhbmQgd2luZG93cy4KKwkgKiBEZWZhdWx0IGlzIGdyYXkuCisJICovCisJU0hBRE9XQ09MT1I6ICdncmF5JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBWTUxfU0hBRE9XQ09MT1IKKwkgKiAKKwkgKiBVc2VkIGZvciBzaGFkb3cgY29sb3IgaW4gZmlsdGVycyB3aGVyZSB0cmFuc3BhcmVuY3kgaXMgbm90IHN1cHBvcnRlZAorCSAqIChNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIpLiBEZWZhdWx0IGlzIGdyYXkuCisJICovCisJVk1MX1NIQURPV0NPTE9SOiAnZ3JheScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU0hBRE9XX09GRlNFVF9YCisJICogCisJICogU3BlY2lmaWVzIHRoZSB4LW9mZnNldCBvZiB0aGUgc2hhZG93LiBEZWZhdWx0IGlzIDIuCisJICovCisJU0hBRE9XX09GRlNFVF9YOiAyLAorCisJLyoqCisJICogVmFyaWFibGU6IFNIQURPV19PRkZTRVRfWQorCSAqIAorCSAqIFNwZWNpZmllcyB0aGUgeS1vZmZzZXQgb2YgdGhlIHNoYWRvdy4gRGVmYXVsdCBpcyAzLgorCSAqLworCVNIQURPV19PRkZTRVRfWTogMywKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogU0hBRE9XX09QQUNJVFkKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBvcGFjaXR5IGZvciBzaGFkb3dzLiBEZWZhdWx0IGlzIDEuCisJICovCisJU0hBRE9XX09QQUNJVFk6IDEsCisgCisJLyoqCisJICogVmFyaWFibGU6IE5PREVUWVBFX0VMRU1FTlQKKwkgKiAKKwkgKiBET00gbm9kZSBvZiB0eXBlIEVMRU1FTlQuCisJICovCisJTk9ERVRZUEVfRUxFTUVOVDogMSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBOT0RFVFlQRV9BVFRSSUJVVEUKKwkgKiAKKwkgKiBET00gbm9kZSBvZiB0eXBlIEFUVFJJQlVURS4KKwkgKi8KKwlOT0RFVFlQRV9BVFRSSUJVVEU6IDIsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogTk9ERVRZUEVfVEVYVAorCSAqIAorCSAqIERPTSBub2RlIG9mIHR5cGUgVEVYVC4KKwkgKi8KKwlOT0RFVFlQRV9URVhUOiAzLAorCisJLyoqCisJICogVmFyaWFibGU6IE5PREVUWVBFX0NEQVRBCisJICogCisJICogRE9NIG5vZGUgb2YgdHlwZSBDREFUQS4KKwkgKi8KKwlOT0RFVFlQRV9DREFUQTogNCwKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogTk9ERVRZUEVfRU5USVRZX1JFRkVSRU5DRQorCSAqIAorCSAqIERPTSBub2RlIG9mIHR5cGUgRU5USVRZX1JFRkVSRU5DRS4KKwkgKi8KKwlOT0RFVFlQRV9FTlRJVFlfUkVGRVJFTkNFOiA1LAorCisJLyoqCisJICogVmFyaWFibGU6IE5PREVUWVBFX0VOVElUWQorCSAqIAorCSAqIERPTSBub2RlIG9mIHR5cGUgRU5USVRZLgorCSAqLworCU5PREVUWVBFX0VOVElUWTogNiwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBOT0RFVFlQRV9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OCisJICogCisJICogRE9NIG5vZGUgb2YgdHlwZSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OLgorCSAqLworCU5PREVUWVBFX1BST0NFU1NJTkdfSU5TVFJVQ1RJT046IDcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogTk9ERVRZUEVfQ09NTUVOVAorCSAqIAorCSAqIERPTSBub2RlIG9mIHR5cGUgQ09NTUVOVC4KKwkgKi8KKwlOT0RFVFlQRV9DT01NRU5UOiA4LAorCQkKKwkvKioKKwkgKiBWYXJpYWJsZTogTk9ERVRZUEVfRE9DVU1FTlQKKwkgKiAKKwkgKiBET00gbm9kZSBvZiB0eXBlIERPQ1VNRU5ULgorCSAqLworCU5PREVUWVBFX0RPQ1VNRU5UOiA5LAorCisJLyoqCisJICogVmFyaWFibGU6IE5PREVUWVBFX0RPQ1VNRU5UVFlQRQorCSAqIAorCSAqIERPTSBub2RlIG9mIHR5cGUgRE9DVU1FTlRUWVBFLgorCSAqLworCU5PREVUWVBFX0RPQ1VNRU5UVFlQRTogMTAsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogTk9ERVRZUEVfRE9DVU1FTlRfRlJBR01FTlQKKwkgKiAKKwkgKiBET00gbm9kZSBvZiB0eXBlIERPQ1VNRU5UX0ZSQUdNRU5ULgorCSAqLworCU5PREVUWVBFX0RPQ1VNRU5UX0ZSQUdNRU5UOiAxMSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBOT0RFVFlQRV9OT1RBVElPTgorCSAqIAorCSAqIERPTSBub2RlIG9mIHR5cGUgTk9UQVRJT04uCisJICovCisJTk9ERVRZUEVfTk9UQVRJT046IDEyLAorCQorCS8qKgorCSAqIFZhcmlhYmxlOiBUT09MVElQX1ZFUlRJQ0FMX09GRlNFVAorCSAqIAorCSAqIERlZmluZXMgdGhlIHZlcnRpY2FsIG9mZnNldCBmb3IgdGhlIHRvb2x0aXAuCisJICogRGVmYXVsdCBpcyAxNi4KKwkgKi8KKwlUT09MVElQX1ZFUlRJQ0FMX09GRlNFVDogMTYsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogREVGQVVMVF9WQUxJRF9DT0xPUgorCSAqIAorCSAqIFNwZWNpZmllcyB0aGUgZGVmYXVsdCB2YWxpZCBjb2xvci4gRGVmYXVsdCBpcyAjMDAwMEZGLgorCSAqLworCURFRkFVTFRfVkFMSURfQ09MT1I6ICcjMDBGRjAwJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBERUZBVUxUX0lOVkFMSURfQ09MT1IKKwkgKiAKKwkgKiBTcGVjaWZpZXMgdGhlIGRlZmF1bHQgaW52YWxpZCBjb2xvci4gRGVmYXVsdCBpcyAjRkYwMDAwLgorCSAqLworCURFRkFVTFRfSU5WQUxJRF9DT0xPUjogJyNGRjAwMDAnLAorCisJLyoqCisJICogVmFyaWFibGU6IE9VVExJTkVfSElHSExJR0hUX0NPTE9SCisJICogCisJICogU3BlY2lmaWVzIHRoZSBkZWZhdWx0IGhpZ2hsaWdodCBjb2xvciBmb3Igc2hhcGUgb3V0bGluZXMuCisJICogRGVmYXVsdCBpcyAjMDAwMEZGLiBUaGlzIGlzIHVzZWQgaW4gPG14RWRnZUhhbmRsZXI+LgorCSAqLworCU9VVExJTkVfSElHSExJR0hUX0NPTE9SOiAnIzAwRkYwMCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogT1VUTElORV9ISUdITElHSFRfQ09MT1IKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBzdHJva2V3aWR0aCB0byBiZSB1c2VkIGZvciBzaGFwZSBvdXRsaW5lcy4KKwkgKiBEZWZhdWx0IGlzIDUuIFRoaXMgaXMgdXNlZCBpbiA8bXhFZGdlSGFuZGxlcj4uCisJICovCisJT1VUTElORV9ISUdITElHSFRfU1RST0tFV0lEVEg6IDUsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogSElHSExJR0hUX1NUUk9LRVdJRFRICisJICogCisJICogRGVmaW5lcyB0aGUgc3Ryb2tld2lkdGggdG8gYmUgdXNlZCBmb3IgdGhlIGhpZ2hsaWdodHMuCisJICogRGVmYXVsdCBpcyAzLgorCSAqLworCUhJR0hMSUdIVF9TVFJPS0VXSURUSDogMywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBDT05TVFJBSU5UX0hJR0hMSUdIVF9TSVpFCisJICogCisJICogU2l6ZSBvZiB0aGUgY29uc3RyYWludCBoaWdobGlnaHQgKGluIHB4KS4gRGVmYXVsdCBpcyAyLgorCSAqLworCUhJR0hMSUdIVF9TSVpFOiAyLAorCQorCS8qKgorCSAqIFZhcmlhYmxlOiBISUdITElHSFRfT1BBQ0lUWQorCSAqIAorCSAqIE9wYWNpdHkgKGluICUpIHVzZWQgZm9yIHRoZSBoaWdobGlnaHRzIChpbmNsdWRpbmcgb3V0bGluZSkuCisJICogRGVmYXVsdCBpcyAxMDAuCisJICovCisJSElHSExJR0hUX09QQUNJVFk6IDEwMCwKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogQ1VSU09SX01PVkFCTEVfVkVSVEVYCisJICogCisJICogRGVmaW5lcyB0aGUgY3Vyc29yIGZvciBhIG1vdmFibGUgdmVydGV4LiBEZWZhdWx0IGlzICdtb3ZlJy4KKwkgKi8KKwlDVVJTT1JfTU9WQUJMRV9WRVJURVg6ICdtb3ZlJywKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogQ1VSU09SX01PVkFCTEVfRURHRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGN1cnNvciBmb3IgYSBtb3ZhYmxlIGVkZ2UuIERlZmF1bHQgaXMgJ21vdmUnLgorCSAqLworCUNVUlNPUl9NT1ZBQkxFX0VER0U6ICdtb3ZlJywKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogQ1VSU09SX0xBQkVMX0hBTkRMRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGN1cnNvciBmb3IgYSBtb3ZhYmxlIGxhYmVsLiBEZWZhdWx0IGlzICdkZWZhdWx0Jy4KKwkgKi8KKwlDVVJTT1JfTEFCRUxfSEFORExFOiAnZGVmYXVsdCcsCisJCisJLyoqCisJICogVmFyaWFibGU6IENVUlNPUl9URVJNSU5BTF9IQU5ETEUKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBjdXJzb3IgZm9yIGEgdGVybWluYWwgaGFuZGxlLiBEZWZhdWx0IGlzICdwb2ludGVyJy4KKwkgKi8KKwlDVVJTT1JfVEVSTUlOQUxfSEFORExFOiAncG9pbnRlcicsCisJCisJLyoqCisJICogVmFyaWFibGU6IENVUlNPUl9CRU5EX0hBTkRMRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGN1cnNvciBmb3IgYSBtb3ZhYmxlIGJlbmQuIERlZmF1bHQgaXMgJ2Nyb3NzaGFpcicuCisJICovCisJQ1VSU09SX0JFTkRfSEFORExFOiAnY3Jvc3NoYWlyJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBDVVJTT1JfVklSVFVBTF9CRU5EX0hBTkRMRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGN1cnNvciBmb3IgYSBtb3ZhYmxlIGJlbmQuIERlZmF1bHQgaXMgJ2Nyb3NzaGFpcicuCisJICovCisJQ1VSU09SX1ZJUlRVQUxfQkVORF9IQU5ETEU6ICdjcm9zc2hhaXInLAorCQorCS8qKgorCSAqIFZhcmlhYmxlOiBDVVJTT1JfQ09OTkVDVAorCSAqIAorCSAqIERlZmluZXMgdGhlIGN1cnNvciBmb3IgYSBjb25uZWN0YWJsZSBzdGF0ZS4gRGVmYXVsdCBpcyAncG9pbnRlcicuCisJICovCisJQ1VSU09SX0NPTk5FQ1Q6ICdwb2ludGVyJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBISUdITElHSFRfQ09MT1IKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBjb2xvciB0byBiZSB1c2VkIGZvciB0aGUgY2VsbCBoaWdobGlnaHRpbmcuCisJICogVXNlICdub25lJyBmb3Igbm8gY29sb3IuIERlZmF1bHQgaXMgIzAwRkYwMC4KKwkgKi8KKwlISUdITElHSFRfQ09MT1I6ICcjMDBGRjAwJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBUQVJHRVRfSElHSExJR0hUX0NPTE9SCisJICogCisJICogRGVmaW5lcyB0aGUgY29sb3IgdG8gYmUgdXNlZCBmb3IgaGlnaGxpZ2h0aW5nIGEgdGFyZ2V0IGNlbGwgZm9yIGEgbmV3CisJICogb3IgY2hhbmdlZCBjb25uZWN0aW9uLiBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgZWl0aGVyIGEgc291cmNlIG9yCisJICogdGFyZ2V0IHRlcm1pbmFsIGluIHRoZSBncmFwaC4gVXNlICdub25lJyBmb3Igbm8gY29sb3IuCisJICogRGVmYXVsdCBpcyAjMDAwMEZGLgorCSAqLworCUNPTk5FQ1RfVEFSR0VUX0NPTE9SOiAnIzAwMDBGRicsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogSU5WQUxJRF9DT05ORUNUX1RBUkdFVF9DT0xPUgorCSAqIAorCSAqIERlZmluZXMgdGhlIGNvbG9yIHRvIGJlIHVzZWQgZm9yIGhpZ2hsaWdodGluZyBhIGludmFsaWQgdGFyZ2V0IGNlbGxzCisJICogZm9yIGEgbmV3IG9yIGNoYW5nZWQgY29ubmVjdGlvbnMuIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBlaXRoZXIgYSBzb3VyY2UKKwkgKiBvciB0YXJnZXQgdGVybWluYWwgaW4gdGhlIGdyYXBoLiBVc2UgJ25vbmUnIGZvciBubyBjb2xvci4gRGVmYXVsdCBpcworCSAqICNGRjAwMDAuCisJICovCisJSU5WQUxJRF9DT05ORUNUX1RBUkdFVF9DT0xPUjogJyNGRjAwMDAnLAorCisJLyoqCisJICogVmFyaWFibGU6IERST1BfVEFSR0VUX0NPTE9SCisJICogCisJICogRGVmaW5lcyB0aGUgY29sb3IgdG8gYmUgdXNlZCBmb3IgdGhlIGhpZ2hsaWdodGluZyB0YXJnZXQgcGFyZW50IGNlbGxzCisJICogKGZvciBkcmFnIGFuZCBkcm9wKS4gVXNlICdub25lJyBmb3Igbm8gY29sb3IuIERlZmF1bHQgaXMgIzAwMDBGRi4KKwkgKi8KKwlEUk9QX1RBUkdFVF9DT0xPUjogJyMwMDAwRkYnLAorCisJLyoqCisJICogVmFyaWFibGU6IFZBTElEX0NPTE9SCisJICogCisJICogRGVmaW5lcyB0aGUgY29sb3IgdG8gYmUgdXNlZCBmb3IgdGhlIGNvbG9yaW5nIHZhbGlkIGNvbm5lY3Rpb24KKwkgKiBwcmV2aWV3cy4gVXNlICdub25lJyBmb3Igbm8gY29sb3IuIERlZmF1bHQgaXMgI0ZGMDAwMC4KKwkgKi8KKwlWQUxJRF9DT0xPUjogJyMwMEZGMDAnLAorCisJLyoqCisJICogVmFyaWFibGU6IElOVkFMSURfQ09MT1IKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBjb2xvciB0byBiZSB1c2VkIGZvciB0aGUgY29sb3JpbmcgaW52YWxpZCBjb25uZWN0aW9uCisJICogcHJldmlld3MuIFVzZSAnbm9uZScgZm9yIG5vIGNvbG9yLiBEZWZhdWx0IGlzICNGRjAwMDAuCisJICovCisJSU5WQUxJRF9DT0xPUjogJyNGRjAwMDAnLAorCisJLyoqCisJICogVmFyaWFibGU6IEVER0VfU0VMRUNUSU9OX0NPTE9SCisJICogCisJICogRGVmaW5lcyB0aGUgY29sb3IgdG8gYmUgdXNlZCBmb3IgdGhlIHNlbGVjdGlvbiBib3JkZXIgb2YgZWRnZXMuIFVzZQorCSAqICdub25lJyBmb3Igbm8gY29sb3IuIERlZmF1bHQgaXMgIzAwRkYwMC4KKwkgKi8KKwlFREdFX1NFTEVDVElPTl9DT0xPUjogJyMwMEZGMDAnLAorCisJLyoqCisJICogVmFyaWFibGU6IFZFUlRFWF9TRUxFQ1RJT05fQ09MT1IKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBjb2xvciB0byBiZSB1c2VkIGZvciB0aGUgc2VsZWN0aW9uIGJvcmRlciBvZiB2ZXJ0aWNlcy4gVXNlCisJICogJ25vbmUnIGZvciBubyBjb2xvci4gRGVmYXVsdCBpcyAjMDBGRjAwLgorCSAqLworCVZFUlRFWF9TRUxFQ1RJT05fQ09MT1I6ICcjMDBGRjAwJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBWRVJURVhfU0VMRUNUSU9OX1NUUk9LRVdJRFRICisJICogCisJICogRGVmaW5lcyB0aGUgc3Ryb2tld2lkdGggdG8gYmUgdXNlZCBmb3IgdmVydGV4IHNlbGVjdGlvbnMuCisJICogRGVmYXVsdCBpcyAxLgorCSAqLworCVZFUlRFWF9TRUxFQ1RJT05fU1RST0tFV0lEVEg6IDEsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRURHRV9TRUxFQ1RJT05fU1RST0tFV0lEVEgKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBzdHJva2V3aWR0aCB0byBiZSB1c2VkIGZvciBlZGdlIHNlbGVjdGlvbnMuCisJICogRGVmYXVsdCBpcyAxLgorCSAqLworCUVER0VfU0VMRUNUSU9OX1NUUk9LRVdJRFRIOiAxLAorCisJLyoqCisJICogVmFyaWFibGU6IFNFTEVDVElPTl9EQVNIRUQKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBkYXNoZWQgc3RhdGUgdG8gYmUgdXNlZCBmb3IgdGhlIHZlcnRleCBzZWxlY3Rpb24KKwkgKiBib3JkZXIuIERlZmF1bHQgaXMgdHJ1ZS4KKwkgKi8KKwlWRVJURVhfU0VMRUNUSU9OX0RBU0hFRDogdHJ1ZSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTRUxFQ1RJT05fREFTSEVECisJICogCisJICogRGVmaW5lcyB0aGUgZGFzaGVkIHN0YXRlIHRvIGJlIHVzZWQgZm9yIHRoZSBlZGdlIHNlbGVjdGlvbgorCSAqIGJvcmRlci4gRGVmYXVsdCBpcyB0cnVlLgorCSAqLworCUVER0VfU0VMRUNUSU9OX0RBU0hFRDogdHJ1ZSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBHVUlERV9DT0xPUgorCSAqIAorCSAqIERlZmluZXMgdGhlIGNvbG9yIHRvIGJlIHVzZWQgZm9yIHRoZSBndWlkZWxpbmVzIGluIG14R3JhcGhIYW5kbGVyLgorCSAqIERlZmF1bHQgaXMgI0ZGMDAwMC4KKwkgKi8KKwlHVUlERV9DT0xPUjogJyNGRjAwMDAnLAorCisJLyoqCisJICogVmFyaWFibGU6IEdVSURFX1NUUk9LRVdJRFRICisJICogCisJICogRGVmaW5lcyB0aGUgc3Ryb2tld2lkdGggdG8gYmUgdXNlZCBmb3IgdGhlIGd1aWRlbGluZXMgaW4gbXhHcmFwaEhhbmRsZXIuCisJICogRGVmYXVsdCBpcyAxLgorCSAqLworCUdVSURFX1NUUk9LRVdJRFRIOiAxLAorCisJLyoqCisJICogVmFyaWFibGU6IE9VVExJTkVfQ09MT1IKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBjb2xvciB0byBiZSB1c2VkIGZvciB0aGUgb3V0bGluZSByZWN0YW5nbGUKKwkgKiBib3JkZXIuICBVc2UgJ25vbmUnIGZvciBubyBjb2xvci4gRGVmYXVsdCBpcyAjMDA5OUZGLgorCSAqLworCU9VVExJTkVfQ09MT1I6ICcjMDA5OUZGJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBPVVRMSU5FX1NUUk9LRVdJRFRICisJICogCisJICogRGVmaW5lcyB0aGUgc3Ryb2tld2lkdGggdG8gYmUgdXNlZCBmb3IgdGhlIG91dGxpbmUgcmVjdGFuZ2xlCisJICogc3Ryb2tlIHdpZHRoLiBEZWZhdWx0IGlzIDMuCisJICovCisJT1VUTElORV9TVFJPS0VXSURUSDogKG14Q2xpZW50LklTX0lFKSA/IDIgOiAzLAorCisJLyoqCisJICogVmFyaWFibGU6IEhBTkRMRV9TSVpFCisJICogCisJICogRGVmaW5lcyB0aGUgZGVmYXVsdCBzaXplIGZvciBoYW5kbGVzLiBEZWZhdWx0IGlzIDYuCisJICovCisJSEFORExFX1NJWkU6IDYsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogTEFCRUxfSEFORExFX1NJWkUKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHNpemUgZm9yIGxhYmVsIGhhbmRsZXMuIERlZmF1bHQgaXMgNC4KKwkgKi8KKwlMQUJFTF9IQU5ETEVfU0laRTogNCwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBIQU5ETEVfRklMTENPTE9SCisJICogCisJICogRGVmaW5lcyB0aGUgY29sb3IgdG8gYmUgdXNlZCBmb3IgdGhlIGhhbmRsZSBmaWxsIGNvbG9yLiBVc2UgJ25vbmUnIGZvcgorCSAqIG5vIGNvbG9yLiBEZWZhdWx0IGlzICMwMEZGMDAgKGdyZWVuKS4KKwkgKi8KKwlIQU5ETEVfRklMTENPTE9SOiAnIzAwRkYwMCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogSEFORExFX1NUUk9LRUNPTE9SCisJICogCisJICogRGVmaW5lcyB0aGUgY29sb3IgdG8gYmUgdXNlZCBmb3IgdGhlIGhhbmRsZSBzdHJva2UgY29sb3IuIFVzZSAnbm9uZScgZm9yCisJICogbm8gY29sb3IuIERlZmF1bHQgaXMgYmxhY2suCisJICovCisJSEFORExFX1NUUk9LRUNPTE9SOiAnYmxhY2snLAorCisJLyoqCisJICogVmFyaWFibGU6IExBQkVMX0hBTkRMRV9GSUxMQ09MT1IKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBjb2xvciB0byBiZSB1c2VkIGZvciB0aGUgbGFiZWwgaGFuZGxlIGZpbGwgY29sb3IuIFVzZSAnbm9uZScKKwkgKiBmb3Igbm8gY29sb3IuIERlZmF1bHQgaXMgeWVsbG93LgorCSAqLworCUxBQkVMX0hBTkRMRV9GSUxMQ09MT1I6ICd5ZWxsb3cnLAorCisJLyoqCisJICogVmFyaWFibGU6IENPTk5FQ1RfSEFORExFX0ZJTExDT0xPUgorCSAqIAorCSAqIERlZmluZXMgdGhlIGNvbG9yIHRvIGJlIHVzZWQgZm9yIHRoZSBjb25uZWN0IGhhbmRsZSBmaWxsIGNvbG9yLiBVc2UKKwkgKiAnbm9uZScgZm9yIG5vIGNvbG9yLiBEZWZhdWx0IGlzICMwMDAwRkYgKGJsdWUpLgorCSAqLworCUNPTk5FQ1RfSEFORExFX0ZJTExDT0xPUjogJyMwMDAwRkYnLAorCisJLyoqCisJICogVmFyaWFibGU6IExPQ0tFRF9IQU5ETEVfRklMTENPTE9SCisJICogCisJICogRGVmaW5lcyB0aGUgY29sb3IgdG8gYmUgdXNlZCBmb3IgdGhlIGxvY2tlZCBoYW5kbGUgZmlsbCBjb2xvci4gVXNlCisJICogJ25vbmUnIGZvciBubyBjb2xvci4gRGVmYXVsdCBpcyAjRkYwMDAwIChyZWQpLgorCSAqLworCUxPQ0tFRF9IQU5ETEVfRklMTENPTE9SOiAnI0ZGMDAwMCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogT1VUTElORV9IQU5ETEVfRklMTENPTE9SCisJICogCisJICogRGVmaW5lcyB0aGUgY29sb3IgdG8gYmUgdXNlZCBmb3IgdGhlIG91dGxpbmUgc2l6ZXIgZmlsbCBjb2xvci4gVXNlCisJICogJ25vbmUnIGZvciBubyBjb2xvci4gRGVmYXVsdCBpcyAjMDBGRkZGLgorCSAqLworCU9VVExJTkVfSEFORExFX0ZJTExDT0xPUjogJyMwMEZGRkYnLAorCisJLyoqCisJICogVmFyaWFibGU6IE9VVExJTkVfSEFORExFX1NUUk9LRUNPTE9SCisJICogCisJICogRGVmaW5lcyB0aGUgY29sb3IgdG8gYmUgdXNlZCBmb3IgdGhlIG91dGxpbmUgc2l6ZXIgc3Ryb2tlIGNvbG9yLiBVc2UKKwkgKiAnbm9uZScgZm9yIG5vIGNvbG9yLiBEZWZhdWx0IGlzICMwMDMzRkYuCisJICovCisJT1VUTElORV9IQU5ETEVfU1RST0tFQ09MT1I6ICcjMDAzM0ZGJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBERUZBVUxUX0ZPTlRGQU1JTFkKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IGZhbWlseSBmb3IgYWxsIGZvbnRzLiBEZWZhdWx0IGlzIEFyaWFsLEhlbHZldGljYS4KKwkgKi8KKwlERUZBVUxUX0ZPTlRGQU1JTFk6ICdBcmlhbCxIZWx2ZXRpY2EnLAorCisJLyoqCisJICogVmFyaWFibGU6IERFRkFVTFRfRk9OVFNJWkUKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHNpemUgKGluIHB4KS4gRGVmYXVsdCBpcyAxMS4KKwkgKi8KKwlERUZBVUxUX0ZPTlRTSVpFOiAxMSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBERUZBVUxUX1RFWFRfRElSRUNUSU9OCisJICogCisJICogRGVmaW5lcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIDxTVFlMRV9URVhUX0RJUkVDVElPTj4gaWYgbm8gdmFsdWUgaXMKKwkgKiBkZWZpbmVkIGZvciBpdCBpbiB0aGUgc3R5bGUuIERlZmF1bHQgdmFsdWUgaXMgYW4gZW1wdHkgc3RyaW5nIHdoaWNoIG1lYW5zCisJICogdGhlIGRlZmF1bHQgc3lzdGVtIHNldHRpbmcgaXMgdXNlZCBhbmQgbm8gZGlyZWN0aW9uIGlzIHNldC4KKwkgKi8KKwlERUZBVUxUX1RFWFRfRElSRUNUSU9OOiAnJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBMSU5FX0hFSUdIVAorCSAqIAorCSAqIERlZmluZXMgdGhlIGRlZmF1bHQgbGluZSBoZWlnaHQgZm9yIHRleHQgbGFiZWxzLiBEZWZhdWx0IGlzIDEuMi4KKwkgKi8KKwlMSU5FX0hFSUdIVDogMS4yLAorCisJLyoqCisJICogVmFyaWFibGU6IFdPUkRfV1JBUAorCSAqIAorCSAqIERlZmluZXMgdGhlIENTUyB2YWx1ZSBmb3IgdGhlIHdvcmQtd3JhcCBwcm9wZXJ0eS4gRGVmYXVsdCBpcyAibm9ybWFsIi4KKwkgKiBDaGFuZ2UgdGhpcyB0byAiYnJlYWstd29yZCIgdG8gYWxsb3cgbG9uZyB3b3JkcyB0byBiZSBhYmxlIHRvIGJlIGJyb2tlbgorCSAqIGFuZCB3cmFwIG9udG8gdGhlIG5leHQgbGluZS4KKwkgKi8KKwlXT1JEX1dSQVA6ICdub3JtYWwnLAorCisJLyoqCisJICogVmFyaWFibGU6IEFCU09MVVRFX0xJTkVfSEVJR0hUCisJICogCisJICogU3BlY2lmaWVzIGlmIGFic29sdXRlIGxpbmUgaGVpZ2h0cyBzaG91bGQgYmUgdXNlZCAocHgpIGluIENTUy4gRGVmYXVsdAorCSAqIGlzIGZhbHNlLiBTZXQgdGhpcyB0byB0cnVlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKwkgKi8KKwlBQlNPTFVURV9MSU5FX0hFSUdIVDogZmFsc2UsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogREVGQVVMVF9GT05UU1RZTEUKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHN0eWxlIGZvciBhbGwgZm9udHMuIERlZmF1bHQgaXMgMC4gVGhpcyBjYW4gYmUgc2V0CisJICogdG8gYW55IGNvbWJpbmF0aW9uIG9mIGZvbnQgc3R5bGVzIGFzIGZvbGxvd3MuCisJICogCisJICogKGNvZGUpCisJICogbXhDb25zdGFudHMuREVGQVVMVF9GT05UU1RZTEUgPSBteENvbnN0YW50cy5GT05UX0JPTEQgfCBteENvbnN0YW50cy5GT05UX0lUQUxJQzsKKwkgKiAoZW5kKQorCSAqLworCURFRkFVTFRfRk9OVFNUWUxFOiAwLAorCisJLyoqCisJICogVmFyaWFibGU6IERFRkFVTFRfU1RBUlRTSVpFCisJICogCisJICogRGVmaW5lcyB0aGUgZGVmYXVsdCBzdGFydCBzaXplIGZvciBzd2ltbGFuZXMuIERlZmF1bHQgaXMgNDAuCisJICovCisJREVGQVVMVF9TVEFSVFNJWkU6IDQwLAorCisJLyoqCisJICogVmFyaWFibGU6IERFRkFVTFRfTUFSS0VSU0laRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGRlZmF1bHQgc2l6ZSBmb3IgYWxsIG1hcmtlcnMuIERlZmF1bHQgaXMgNi4KKwkgKi8KKwlERUZBVUxUX01BUktFUlNJWkU6IDYsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogREVGQVVMVF9JTUFHRVNJWkUKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHdpZHRoIGFuZCBoZWlnaHQgZm9yIGltYWdlcyB1c2VkIGluIHRoZQorCSAqIGxhYmVsIHNoYXBlLiBEZWZhdWx0IGlzIDI0LgorCSAqLworCURFRkFVTFRfSU1BR0VTSVpFOiAyNCwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBFTlRJVFlfU0VHTUVOVAorCSAqIAorCSAqIERlZmluZXMgdGhlIGxlbmd0aCBvZiB0aGUgaG9yaXpvbnRhbCBzZWdtZW50IG9mIGFuIEVudGl0eSBSZWxhdGlvbi4KKwkgKiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIDxteENvbnN0YW50cy5TVFlMRV9TRUdNRU5UPiBzdHlsZS4KKwkgKiBEZWZhdWx0IGlzIDMwLgorCSAqLworCUVOVElUWV9TRUdNRU5UOiAzMCwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBSRUNUQU5HTEVfUk9VTkRJTkdfRkFDVE9SCisJICogCisJICogRGVmaW5lcyB0aGUgcm91bmRpbmcgZmFjdG9yIGZvciByb3VuZGVkIHJlY3RhbmdsZXMgaW4gcGVyY2VudCBiZXR3ZWVuCisJICogMCBhbmQgMS4gVmFsdWVzIHNob3VsZCBiZSBzbWFsbGVyIHRoYW4gMC41LiBEZWZhdWx0IGlzIDAuMTUuCisJICovCisJUkVDVEFOR0xFX1JPVU5ESU5HX0ZBQ1RPUjogMC4xNSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBMSU5FX0FSQ1NJWkUKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBzaXplIG9mIHRoZSBhcmNzIGZvciByb3VuZGVkIGVkZ2VzLiBEZWZhdWx0IGlzIDIwLgorCSAqLworCUxJTkVfQVJDU0laRTogMjAsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogQVJST1dfU1BBQ0lORworCSAqIAorCSAqIERlZmluZXMgdGhlIHNwYWNpbmcgYmV0d2VlbiB0aGUgYXJyb3cgc2hhcGUgYW5kIGl0cyB0ZXJtaW5hbHMuIERlZmF1bHQgaXMgMC4KKwkgKi8KKwlBUlJPV19TUEFDSU5HOiAwLAorCisJLyoqCisJICogVmFyaWFibGU6IEFSUk9XX1dJRFRICisJICogCisJICogRGVmaW5lcyB0aGUgd2lkdGggb2YgdGhlIGFycm93IHNoYXBlLiBEZWZhdWx0IGlzIDMwLgorCSAqLworCUFSUk9XX1dJRFRIOiAzMCwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBUlJPV19TSVpFCisJICogCisJICogRGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgYXJyb3doZWFkIGluIHRoZSBhcnJvdyBzaGFwZS4gRGVmYXVsdCBpcyAzMC4KKwkgKi8KKwlBUlJPV19TSVpFOiAzMCwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBQQUdFX0ZPUk1BVF9BNF9QT1JUUkFJVAorCSAqIAorCSAqIERlZmluZXMgdGhlIHJlY3RhbmdsZSBmb3IgdGhlIEE0IHBvcnRyYWl0IHBhZ2UgZm9ybWF0LiBUaGUgZGltZW5zaW9ucworCSAqIG9mIHRoaXMgcGFnZSBmb3JtYXQgYXJlIDgyNngxMTY5IHBpeGVscy4KKwkgKi8KKwlQQUdFX0ZPUk1BVF9BNF9QT1JUUkFJVDogbmV3IG14UmVjdGFuZ2xlKDAsIDAsIDgyNywgMTE2OSksCisKKwkvKioKKwkgKiBWYXJpYWJsZTogUEFHRV9GT1JNQVRfQTRfUE9SVFJBSVQKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSByZWN0YW5nbGUgZm9yIHRoZSBBNCBwb3J0cmFpdCBwYWdlIGZvcm1hdC4gVGhlIGRpbWVuc2lvbnMKKwkgKiBvZiB0aGlzIHBhZ2UgZm9ybWF0IGFyZSA4MjZ4MTE2OSBwaXhlbHMuCisJICovCisJUEFHRV9GT1JNQVRfQTRfTEFORFNDQVBFOiBuZXcgbXhSZWN0YW5nbGUoMCwgMCwgMTE2OSwgODI3KSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBQQUdFX0ZPUk1BVF9MRVRURVJfUE9SVFJBSVQKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSByZWN0YW5nbGUgZm9yIHRoZSBMZXR0ZXIgcG9ydHJhaXQgcGFnZSBmb3JtYXQuIFRoZQorCSAqIGRpbWVuc2lvbnMgb2YgdGhpcyBwYWdlIGZvcm1hdCBhcmUgODUweDExMDAgcGl4ZWxzLgorCSAqLworCVBBR0VfRk9STUFUX0xFVFRFUl9QT1JUUkFJVDogbmV3IG14UmVjdGFuZ2xlKDAsIDAsIDg1MCwgMTEwMCksCisKKwkvKioKKwkgKiBWYXJpYWJsZTogUEFHRV9GT1JNQVRfTEVUVEVSX1BPUlRSQUlUCisJICogCisJICogRGVmaW5lcyB0aGUgcmVjdGFuZ2xlIGZvciB0aGUgTGV0dGVyIHBvcnRyYWl0IHBhZ2UgZm9ybWF0LiBUaGUgZGltZW5zaW9ucworCSAqIG9mIHRoaXMgcGFnZSBmb3JtYXQgYXJlIDg1MHgxMTAwIHBpeGVscy4KKwkgKi8KKwlQQUdFX0ZPUk1BVF9MRVRURVJfTEFORFNDQVBFOiBuZXcgbXhSZWN0YW5nbGUoMCwgMCwgMTEwMCwgODUwKSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBOT05FCisJICogCisJICogRGVmaW5lcyB0aGUgdmFsdWUgZm9yIG5vbmUuIERlZmF1bHQgaXMgIm5vbmUiLgorCSAqLworCU5PTkU6ICdub25lJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9QRVJJTUVURVIKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBwZXJpbWV0ZXIgc3R5bGUuIFRoaXMgaXMgYSBmdW5jdGlvbiB0aGF0IGRlZmluZXMKKwkgKiB0aGUgcGVyaW1ldGVyIGFyb3VuZCBhIHBhcnRpY3VsYXIgc2hhcGUuIFBvc3NpYmxlIHZhbHVlcyBhcmUgdGhlCisJICogZnVuY3Rpb25zIGRlZmluZWQgaW4gPG14UGVyaW1ldGVyPi4gQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnN0YW50cyBpbiB0aGlzCisJICogY2xhc3MgdGhhdCBzdGFydCB3aXRoICJQRVJJTUVURVJfIiBtYXkgYmUgdXNlZCB0byBhY2Nlc3MKKwkgKiBwZXJpbWV0ZXIgc3R5bGVzIGluIDxteFN0eWxlUmVnaXN0cnk+LiBWYWx1ZSBpcyAicGVyaW1ldGVyIi4KKwkgKi8KKwlTVFlMRV9QRVJJTUVURVI6ICdwZXJpbWV0ZXInLAorCQorCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9TT1VSQ0VfUE9SVAorCSAqIAorCSAqIERlZmluZXMgdGhlIElEIG9mIHRoZSBjZWxsIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGNvbXB1dGluZyB0aGUKKwkgKiBwZXJpbWV0ZXIgcG9pbnQgb2YgdGhlIHNvdXJjZSBmb3IgYW4gZWRnZS4gVGhpcyBhbGxvd3MgZm9yIGdyYXBoaWNhbGx5CisJICogY29ubmVjdGluZyB0byBhIGNlbGwgd2hpbGUga2VlcGluZyB0aGUgYWN0dWFsIHRlcm1pbmFsIG9mIHRoZSBlZGdlLgorCSAqIFZhbHVlIGlzICJzb3VyY2VQb3J0Ii4KKwkgKi8KKwlTVFlMRV9TT1VSQ0VfUE9SVDogJ3NvdXJjZVBvcnQnLAorCQorCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9UQVJHRVRfUE9SVAorCSAqIAorCSAqIERlZmluZXMgdGhlIElEIG9mIHRoZSBjZWxsIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGNvbXB1dGluZyB0aGUKKwkgKiBwZXJpbWV0ZXIgcG9pbnQgb2YgdGhlIHRhcmdldCBmb3IgYW4gZWRnZS4gVGhpcyBhbGxvd3MgZm9yIGdyYXBoaWNhbGx5CisJICogY29ubmVjdGluZyB0byBhIGNlbGwgd2hpbGUga2VlcGluZyB0aGUgYWN0dWFsIHRlcm1pbmFsIG9mIHRoZSBlZGdlLgorCSAqIFZhbHVlIGlzICJ0YXJnZXRQb3J0Ii4KKwkgKi8KKwlTVFlMRV9UQVJHRVRfUE9SVDogJ3RhcmdldFBvcnQnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1BPUlRfQ09OU1RSQUlOVAorCSAqIAorCSAqIERlZmluZXMgdGhlIGRpcmVjdGlvbihzKSB0aGF0IGVkZ2VzIGFyZSBhbGxvd2VkIHRvIGNvbm5lY3QgdG8gY2VsbHMgaW4uCisJICogUG9zc2libGUgdmFsdWVzIGFyZSAiRElSRUNUSU9OX05PUlRILCBESVJFQ1RJT05fU09VVEgsIAorCSAqIERJUkVDVElPTl9FQVNUIiBhbmQgIkRJUkVDVElPTl9XRVNUIi4gVmFsdWUgaXMKKwkgKiAicG9ydENvbnN0cmFpbnQiLgorCSAqLworCVNUWUxFX1BPUlRfQ09OU1RSQUlOVDogJ3BvcnRDb25zdHJhaW50JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9QT1JUX0NPTlNUUkFJTlRfUk9UQVRJT04KKwkgKiAKKwkgKiBEZWZpbmUgd2hldGhlciBwb3J0IGNvbnN0cmFpbnQgZGlyZWN0aW9ucyBhcmUgcm90YXRlZCB3aXRoIHZlcnRleAorCSAqIHJvdGF0aW9uLiAwIChkZWZhdWx0KSBjYXVzZXMgcG9ydCBjb25zdHJhaW50cyB0byByZW1haW4gYWJzb2x1dGUsIAorCSAqIHJlbGF0aXZlIHRvIHRoZSBncmFwaCwgMSBjYXVzZXMgdGhlIGNvbnN0cmFpbnRzIHRvIHJvdGF0ZSB3aXRoCisJICogdGhlIHZlcnRleC4gVmFsdWUgaXMgInBvcnRDb25zdHJhaW50Um90YXRpb24iLgorCSAqLworCVNUWUxFX1BPUlRfQ09OU1RSQUlOVF9ST1RBVElPTjogJ3BvcnRDb25zdHJhaW50Um90YXRpb24nLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1NPVVJDRV9QT1JUX0NPTlNUUkFJTlQKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBkaXJlY3Rpb24ocykgdGhhdCBlZGdlcyBhcmUgYWxsb3dlZCB0byBjb25uZWN0IHRvIHNvdXJjZXMgaW4uCisJICogUG9zc2libGUgdmFsdWVzIGFyZSAiRElSRUNUSU9OX05PUlRILCBESVJFQ1RJT05fU09VVEgsIERJUkVDVElPTl9FQVNUIgorCSAqIGFuZCAiRElSRUNUSU9OX1dFU1QiLiBWYWx1ZSBpcyAic291cmNlUG9ydENvbnN0cmFpbnQiLgorCSAqLworCVNUWUxFX1NPVVJDRV9QT1JUX0NPTlNUUkFJTlQ6ICdzb3VyY2VQb3J0Q29uc3RyYWludCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfVEFSR0VUX1BPUlRfQ09OU1RSQUlOVAorCSAqIAorCSAqIERlZmluZXMgdGhlIGRpcmVjdGlvbihzKSB0aGF0IGVkZ2VzIGFyZSBhbGxvd2VkIHRvIGNvbm5lY3QgdG8gdGFyZ2V0cyBpbi4KKwkgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlICJESVJFQ1RJT05fTk9SVEgsIERJUkVDVElPTl9TT1VUSCwgRElSRUNUSU9OX0VBU1QiCisJICogYW5kICJESVJFQ1RJT05fV0VTVCIuIFZhbHVlIGlzICJ0YXJnZXRQb3J0Q29uc3RyYWludCIuCisJICovCisJU1RZTEVfVEFSR0VUX1BPUlRfQ09OU1RSQUlOVDogJ3RhcmdldFBvcnRDb25zdHJhaW50JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9PUEFDSVRZCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgb3BhY2l0eSBzdHlsZS4gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGlzIAorCSAqIG51bWVyaWMgYW5kIHRoZSBwb3NzaWJsZSByYW5nZSBpcyAwLTEwMC4gVmFsdWUgaXMgIm9wYWNpdHkiLgorCSAqLworCVNUWUxFX09QQUNJVFk6ICdvcGFjaXR5JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9GSUxMX09QQUNJVFkKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBmaWxsIG9wYWNpdHkgc3R5bGUuIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBpcyAKKwkgKiBudW1lcmljIGFuZCB0aGUgcG9zc2libGUgcmFuZ2UgaXMgMC0xMDAuIFZhbHVlIGlzICJmaWxsT3BhY2l0eSIuCisJICovCisJU1RZTEVfRklMTF9PUEFDSVRZOiAnZmlsbE9wYWNpdHknLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1NUUk9LRV9PUEFDSVRZCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgc3Ryb2tlIG9wYWNpdHkgc3R5bGUuIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBpcyAKKwkgKiBudW1lcmljIGFuZCB0aGUgcG9zc2libGUgcmFuZ2UgaXMgMC0xMDAuIFZhbHVlIGlzICJzdHJva2VPcGFjaXR5Ii4KKwkgKi8KKwlTVFlMRV9TVFJPS0VfT1BBQ0lUWTogJ3N0cm9rZU9wYWNpdHknLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1RFWFRfT1BBQ0lUWQorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIHRleHQgb3BhY2l0eSBzdHlsZS4gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGlzIAorCSAqIG51bWVyaWMgYW5kIHRoZSBwb3NzaWJsZSByYW5nZSBpcyAwLTEwMC4gVmFsdWUgaXMgInRleHRPcGFjaXR5Ii4KKwkgKi8KKwlTVFlMRV9URVhUX09QQUNJVFk6ICd0ZXh0T3BhY2l0eScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfVEVYVF9ESVJFQ1RJT04KKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSB0ZXh0IGRpcmVjdGlvbiBzdHlsZS4gUG9zc2libGUgdmFsdWVzIGFyZQorCSAqICJURVhUX0RJUkVDVElPTl9ERUZBVUxULCBURVhUX0RJUkVDVElPTl9BVVRPLCBURVhUX0RJUkVDVElPTl9MVFIiCisJICogYW5kICJURVhUX0RJUkVDVElPTl9SVEwiLiBWYWx1ZSBpcyAidGV4dERpcmVjdGlvbiIuCisJICogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzdHlsZSBpcyBkZWZpbmVkIGluIDxERUZBVUxUX1RFWFRfRElSRUNUSU9OPi4KKwkgKiBJdCBpcyB1c2VkIGlzIG5vIHZhbHVlIGlzIGRlZmluZWQgZm9yIHRoaXMga2V5IGluIGEgZ2l2ZW4gc3R5bGUuIFRoaXMgaXMKKwkgKiBhbiBleHBlcmltZW50YWwgc3R5bGUgdGhhdCBpcyBjdXJyZW50bHkgaWdub3JlZCBpbiB0aGUgYmFja2VuZHMuCisJICovCisJU1RZTEVfVEVYVF9ESVJFQ1RJT046ICd0ZXh0RGlyZWN0aW9uJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9PVkVSRkxPVworCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIG92ZXJmbG93IHN0eWxlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICd2aXNpYmxlJywKKwkgKiAnaGlkZGVuJywgJ2ZpbGwnIGFuZCAnd2lkdGgnLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAndmlzaWJsZScuIFRoaXMgdmFsdWUKKwkgKiBzcGVjaWZpZXMgaG93IG92ZXJsYXBwaW5nIHZlcnRleCBsYWJlbHMgYXJlIGhhbmRsZWQuIEEgdmFsdWUgb2YKKwkgKiAndmlzaWJsZScgd2lsbCBzaG93IHRoZSBjb21wbGV0ZSBsYWJlbC4gQSB2YWx1ZSBvZiAnaGlkZGVuJyB3aWxsIGNsaXAKKwkgKiB0aGUgbGFiZWwgc28gdGhhdCBpdCBkb2VzIG5vdCBvdmVybGFwIHRoZSB2ZXJ0ZXggYm91bmRzLiBBIHZhbHVlIG9mCisJICogJ2ZpbGwnIHdpbGwgdXNlIHRoZSB2ZXJ0ZXggYm91bmRzIGFuZCBhIHZhbHVlIG9mICd3aWR0aCcgd2lsbCB1c2UgdGhlCisJICogdGhlIHZlcnRleCB3aWR0aCBmb3IgdGhlIGxhYmVsLiBTZWUgPG14R3JhcGguaXNMYWJlbENsaXBwZWQ+LiBOb3RlIHRoYXQKKwkgKiB0aGUgdmVydGljYWwgYWxpZ25tZW50IGlzIGlnbm9yZWQgZm9yIG92ZXJmbG93IGZpbGwgYW5kIGZvciBob3Jpem9udGFsCisJICogYWxpZ25tZW50LCBsZWZ0IHNob3VsZCBiZSB1c2VkIHRvIGF2b2lkIHBpeGVsIG9mZnNldHMgaW4gSW50ZXJuZXQgRXhwbG9yZXIKKwkgKiAxMSBhbmQgZWFybGllciBvciBpZiBmb3JlaWduT2JqZWN0cyBhcmUgZGlzYWJsZWQuIFZhbHVlIGlzICJvdmVyZmxvdyIuCisJICovCisJU1RZTEVfT1ZFUkZMT1c6ICdvdmVyZmxvdycsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfT1JUSE9HT05BTAorCSAqIAorCSAqIERlZmluZXMgaWYgdGhlIGNvbm5lY3Rpb24gcG9pbnRzIG9uIGVpdGhlciBlbmQgb2YgdGhlIGVkZ2Ugc2hvdWxkIGJlCisJICogY29tcHV0ZWQgc28gdGhhdCB0aGUgZWRnZSBpcyB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIGlmIHBvc3NpYmxlIGFuZAorCSAqIGlmIHRoZSBwb2ludCBpcyBub3QgYXQgYSBmaXhlZCBsb2NhdGlvbi4gRGVmYXVsdCBpcyBmYWxzZS4gVGhpcyBpcworCSAqIHVzZWQgaW4gPG14R3JhcGguaXNPcnRob2dvbmFsPiwgd2hpY2ggYWxzbyByZXR1cm5zIHRydWUgaWYgdGhlIGVkZ2VTdHlsZQorCSAqIG9mIHRoZSBlZGdlIGlzIGFuIGVsYm93IG9yIGVudGl0eS4gVmFsdWUgaXMgIm9ydGhvZ29uYWwiLgorCSAqLworCVNUWUxFX09SVEhPR09OQUw6ICdvcnRob2dvbmFsJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9FWElUX1gKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBob3Jpem9udGFsIHJlbGF0aXZlIGNvb3JkaW5hdGUgY29ubmVjdGlvbiBwb2ludAorCSAqIG9mIGFuIGVkZ2Ugd2l0aCBpdHMgc291cmNlIHRlcm1pbmFsLiBWYWx1ZSBpcyAiZXhpdFgiLgorCSAqLworCVNUWUxFX0VYSVRfWDogJ2V4aXRYJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9FWElUX1kKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSB2ZXJ0aWNhbCByZWxhdGl2ZSBjb29yZGluYXRlIGNvbm5lY3Rpb24gcG9pbnQKKwkgKiBvZiBhbiBlZGdlIHdpdGggaXRzIHNvdXJjZSB0ZXJtaW5hbC4gVmFsdWUgaXMgImV4aXRZIi4KKwkgKi8KKwlTVFlMRV9FWElUX1k6ICdleGl0WScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfRVhJVF9QRVJJTUVURVIKKwkgKiAKKwkgKiBEZWZpbmVzIGlmIHRoZSBwZXJpbWV0ZXIgc2hvdWxkIGJlIHVzZWQgdG8gZmluZCB0aGUgZXhhY3QgZW50cnkgcG9pbnQKKwkgKiBhbG9uZyB0aGUgcGVyaW1ldGVyIG9mIHRoZSBzb3VyY2UuIFBvc3NpYmxlIHZhbHVlcyBhcmUgMCAoZmFsc2UpIGFuZAorCSAqIDEgKHRydWUpLiBEZWZhdWx0IGlzIDEgKHRydWUpLiBWYWx1ZSBpcyAiZXhpdFBlcmltZXRlciIuCisJICovCisJU1RZTEVfRVhJVF9QRVJJTUVURVI6ICdleGl0UGVyaW1ldGVyJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9FTlRSWV9YCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgaG9yaXpvbnRhbCByZWxhdGl2ZSBjb29yZGluYXRlIGNvbm5lY3Rpb24gcG9pbnQKKwkgKiBvZiBhbiBlZGdlIHdpdGggaXRzIHRhcmdldCB0ZXJtaW5hbC4gVmFsdWUgaXMgImVudHJ5WCIuCisJICovCisJU1RZTEVfRU5UUllfWDogJ2VudHJ5WCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfRU5UUllfWQorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIHZlcnRpY2FsIHJlbGF0aXZlIGNvb3JkaW5hdGUgY29ubmVjdGlvbiBwb2ludAorCSAqIG9mIGFuIGVkZ2Ugd2l0aCBpdHMgdGFyZ2V0IHRlcm1pbmFsLiBWYWx1ZSBpcyAiZW50cnlZIi4KKwkgKi8KKwlTVFlMRV9FTlRSWV9ZOiAnZW50cnlZJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9FTlRSWV9QRVJJTUVURVIKKwkgKiAKKwkgKiBEZWZpbmVzIGlmIHRoZSBwZXJpbWV0ZXIgc2hvdWxkIGJlIHVzZWQgdG8gZmluZCB0aGUgZXhhY3QgZW50cnkgcG9pbnQKKwkgKiBhbG9uZyB0aGUgcGVyaW1ldGVyIG9mIHRoZSB0YXJnZXQuIFBvc3NpYmxlIHZhbHVlcyBhcmUgMCAoZmFsc2UpIGFuZAorCSAqIDEgKHRydWUpLiBEZWZhdWx0IGlzIDEgKHRydWUpLiBWYWx1ZSBpcyAiZW50cnlQZXJpbWV0ZXIiLgorCSAqLworCVNUWUxFX0VOVFJZX1BFUklNRVRFUjogJ2VudHJ5UGVyaW1ldGVyJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9XSElURV9TUEFDRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIHdoaXRlLXNwYWNlIHN0eWxlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlICdub3dyYXAnCisJICogYW5kICd3cmFwJy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgJ25vd3JhcCcuIFRoaXMgdmFsdWUgc3BlY2lmaWVzIGhvdworCSAqIHdoaXRlLXNwYWNlIGluc2lkZSBhIEhUTUwgdmVydGV4IGxhYmVsIHNob3VsZCBiZSBoYW5kbGVkLiBBIHZhbHVlIG9mCisJICogJ25vd3JhcCcgbWVhbnMgdGhlIHRleHQgd2lsbCBuZXZlciB3cmFwIHRvIHRoZSBuZXh0IGxpbmUgdW50aWwgYQorCSAqIGxpbmVmZWVkIGlzIGVuY291bnRlcmVkLiBBIHZhbHVlIG9mICd3cmFwJyBtZWFucyB0ZXh0IHdpbGwgd3JhcCB3aGVuCisJICogbmVjZXNzYXJ5LiBUaGlzIHN0eWxlIGlzIG9ubHkgdXNlZCBmb3IgSFRNTCBsYWJlbHMuCisJICogU2VlIDxteEdyYXBoLmlzV3JhcHBpbmc+LiBWYWx1ZSBpcyAid2hpdGVTcGFjZSIuCisJICovCisJU1RZTEVfV0hJVEVfU1BBQ0U6ICd3aGl0ZVNwYWNlJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9ST1RBVElPTgorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIHJvdGF0aW9uIHN0eWxlLiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgaXMgCisJICogbnVtZXJpYyBhbmQgdGhlIHBvc3NpYmxlIHJhbmdlIGlzIDAtMzYwLiBWYWx1ZSBpcyAicm90YXRpb24iLgorCSAqLworCVNUWUxFX1JPVEFUSU9OOiAncm90YXRpb24nLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0ZJTExDT0xPUgorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGZpbGwgY29sb3IuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYWxsIEhUTUwgY29sb3IKKwkgKiBuYW1lcyBvciBIRVggY29kZXMsIGFzIHdlbGwgYXMgc3BlY2lhbCBrZXl3b3JkcyBzdWNoIGFzICdzd2ltbGFuZSwKKwkgKiAnaW5oZXJpdCcgb3IgJ2luZGljYXRlZCcgdG8gdXNlIHRoZSBjb2xvciBjb2RlIG9mIGEgcmVsYXRlZCBjZWxsIG9yIHRoZQorCSAqIGluZGljYXRvciBzaGFwZS4gVmFsdWUgaXMgImZpbGxDb2xvciIuCisJICovCisJU1RZTEVfRklMTENPTE9SOiAnZmlsbENvbG9yJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9QT0lOVEVSX0VWRU5UUworCSAqIAorCSAqIFNwZWNpZmllcyBpZiBwb2ludGVyIGV2ZW50cyBzaG91bGQgYmUgZmlyZWQgb24gdHJhbnNwYXJlbnQgYmFja2dyb3VuZHMuCisJICogVGhpcyBzdHlsZSBpcyBjdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgaW4gPG14UmVjdGFuZ2xlU2hhcGU+LiBEZWZhdWx0CisJICogaXMgdHJ1ZS4gVmFsdWUgaXMgInBvaW50ZXJFdmVudHMiLiBUaGlzIGlzIHR5cGljYWxseSBzZXQgdG8KKwkgKiBmYWxzZSBpbiBncm91cHMgd2hlcmUgdGhlIHRyYW5zcGFyZW50IHBhcnQgc2hvdWxkIGFsbG93IGFueSB1bmRlcmx5aW5nCisJICogY2VsbHMgdG8gYmUgY2xpY2thYmxlLgorCSAqLworCVNUWUxFX1BPSU5URVJfRVZFTlRTOiAncG9pbnRlckV2ZW50cycsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfU1dJTUxBTkVfRklMTENPTE9SCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgZmlsbCBjb2xvciBvZiB0aGUgc3dpbWxhbmUgYmFja2dyb3VuZC4gUG9zc2libGUKKwkgKiB2YWx1ZXMgYXJlIGFsbCBIVE1MIGNvbG9yIG5hbWVzIG9yIEhFWCBjb2Rlcy4gRGVmYXVsdCBpcyBubyBiYWNrZ3JvdW5kLgorCSAqIFZhbHVlIGlzICJzd2ltbGFuZUZpbGxDb2xvciIuCisJICovCisJU1RZTEVfU1dJTUxBTkVfRklMTENPTE9SOiAnc3dpbWxhbmVGaWxsQ29sb3InLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX01BUkdJTgorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIG1hcmdpbiBiZXR3ZWVuIHRoZSBlbGxpcHNlcyBpbiB0aGUgZG91YmxlIGVsbGlwc2Ugc2hhcGUuCisJICogUG9zc2libGUgdmFsdWVzIGFyZSBhbGwgcG9zaXRpdmUgbnVtYmVycy4gVmFsdWUgaXMgIm1hcmdpbiIuCisJICovCisJU1RZTEVfTUFSR0lOOiAnbWFyZ2luJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9HUkFESUVOVENPTE9SCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgZ3JhZGllbnQgY29sb3IuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYWxsIEhUTUwgY29sb3IKKwkgKiBuYW1lcyBvciBIRVggY29kZXMsIGFzIHdlbGwgYXMgc3BlY2lhbCBrZXl3b3JkcyBzdWNoIGFzICdzd2ltbGFuZSwKKwkgKiAnaW5oZXJpdCcgb3IgJ2luZGljYXRlZCcgdG8gdXNlIHRoZSBjb2xvciBjb2RlIG9mIGEgcmVsYXRlZCBjZWxsIG9yIHRoZQorCSAqIGluZGljYXRvciBzaGFwZS4gVGhpcyBpcyBpZ25vcmVkIGlmIG5vIGZpbGwgY29sb3IgaXMgZGVmaW5lZC4gVmFsdWUgaXMKKwkgKiAiZ3JhZGllbnRDb2xvciIuCisJICovCisJU1RZTEVfR1JBRElFTlRDT0xPUjogJ2dyYWRpZW50Q29sb3InLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0dSQURJRU5UX0RJUkVDVElPTgorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGdyYWRpZW50IGRpcmVjdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZQorCSAqIDxESVJFQ1RJT05fRUFTVD4sIDxESVJFQ1RJT05fV0VTVD4sIDxESVJFQ1RJT05fTk9SVEg+IGFuZAorCSAqIDxESVJFQ1RJT05fU09VVEg+LiBEZWZhdWx0IGlzIDxESVJFQ1RJT05fU09VVEg+LiBHZW5lcmFsbHksIGFuZCBieQorCSAqIGRlZmF1bHQgaW4gbXhHcmFwaCwgZ3JhZGllbnQgcGFpbnRpbmcgaXMgZG9uZSBmcm9tIHRoZSB2YWx1ZSBvZgorCSAqIDxTVFlMRV9GSUxMQ09MT1I+IHRvIHRoZSB2YWx1ZSBvZiA8U1RZTEVfR1JBRElFTlRDT0xPUj4uIFRha2luZyB0aGUKKwkgKiBleGFtcGxlIG9mIDxESVJFQ1RJT05fTk9SVEg+LCB0aGlzIG1lYW5zIDxTVFlMRV9GSUxMQ09MT1I+IGNvbG9yIGF0IHRoZSAKKwkgKiBib3R0b20gb2YgcGFpbnQgcGF0dGVybiBhbmQgPFNUWUxFX0dSQURJRU5UQ09MT1I+IGF0IHRvcCwgd2l0aCBhCisJICogZ3JhZGllbnQgaW4tYmV0d2Vlbi4gVmFsdWUgaXMgImdyYWRpZW50RGlyZWN0aW9uIi4KKwkgKi8KKwlTVFlMRV9HUkFESUVOVF9ESVJFQ1RJT046ICdncmFkaWVudERpcmVjdGlvbicsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfU1RST0tFQ09MT1IKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBzdHJva2VDb2xvciBzdHlsZS4gUG9zc2libGUgdmFsdWVzIGFyZSBhbGwgSFRNTAorCSAqIGNvbG9yIG5hbWVzIG9yIEhFWCBjb2RlcywgYXMgd2VsbCBhcyBzcGVjaWFsIGtleXdvcmRzIHN1Y2ggYXMgJ3N3aW1sYW5lLAorCSAqICdpbmhlcml0JywgJ2luZGljYXRlZCcgdG8gdXNlIHRoZSBjb2xvciBjb2RlIG9mIGEgcmVsYXRlZCBjZWxsIG9yIHRoZQorCSAqIGluZGljYXRvciBzaGFwZSBvciAnbm9uZScgZm9yIG5vIGNvbG9yLiBWYWx1ZSBpcyAic3Ryb2tlQ29sb3IiLgorCSAqLworCVNUWUxFX1NUUk9LRUNPTE9SOiAnc3Ryb2tlQ29sb3InLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1NFUEFSQVRPUkNPTE9SCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgc2VwYXJhdG9yQ29sb3Igc3R5bGUuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYWxsCisJICogSFRNTCBjb2xvciBuYW1lcyBvciBIRVggY29kZXMuIFRoaXMgc3R5bGUgaXMgb25seSB1c2VkIGZvcgorCSAqIDxTSEFQRV9TV0lNTEFORT4gc2hhcGVzLiBWYWx1ZSBpcyAic2VwYXJhdG9yQ29sb3IiLgorCSAqLworCVNUWUxFX1NFUEFSQVRPUkNPTE9SOiAnc2VwYXJhdG9yQ29sb3InLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1NUUk9LRVdJRFRICisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgc3Ryb2tlV2lkdGggc3R5bGUuIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBpcyAKKwkgKiBudW1lcmljIGFuZCB0aGUgcG9zc2libGUgcmFuZ2UgaXMgYW55IG5vbi1uZWdhdGl2ZSB2YWx1ZSBsYXJnZXIgb3IgZXF1YWwKKwkgKiB0byAxLiBUaGUgdmFsdWUgZGVmaW5lcyB0aGUgc3Ryb2tlIHdpZHRoIGluIHBpeGVscy4gTm90ZTogVG8gaGlkZSBhCisJICogc3Ryb2tlIHVzZSBzdHJva2VDb2xvciBub25lLiBWYWx1ZSBpcyAic3Ryb2tlV2lkdGgiLgorCSAqLworCVNUWUxFX1NUUk9LRVdJRFRIOiAnc3Ryb2tlV2lkdGgnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0FMSUdOCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgYWxpZ24gc3R5bGUuIFBvc3NpYmxlIHZhbHVlcyBhcmUgPEFMSUdOX0xFRlQ+LAorCSAqIDxBTElHTl9DRU5URVI+IGFuZCA8QUxJR05fUklHSFQ+LiBUaGlzIHZhbHVlIGRlZmluZXMgaG93IHRoZSBsaW5lcyBvZgorCSAqIHRoZSBsYWJlbCBhcmUgaG9yaXpvbnRhbGx5IGFsaWduZWQuIDxBTElHTl9MRUZUPiBtZWFuIGxhYmVsIHRleHQgbGluZXMKKwkgKiBhcmUgYWxpZ25lZCB0byBsZWZ0IG9mIHRoZSBsYWJlbCBib3VuZHMsIDxBTElHTl9SSUdIVD4gdG8gdGhlIHJpZ2h0IG9mCisJICogdGhlIGxhYmVsIGJvdW5kcyBhbmQgPEFMSUdOX0NFTlRFUj4gbWVhbnMgdGhlIGNlbnRlciBvZiB0aGUgdGV4dCBsaW5lcworCSAqIGFyZSBhbGlnbmVkIGluIHRoZSBjZW50ZXIgb2YgdGhlIGxhYmVsIGJvdW5kcy4gTm90ZSB0aGlzIHZhbHVlIGRvZXNuJ3QKKwkgKiBhZmZlY3QgdGhlIHBvc2l0aW9uaW5nIG9mIHRoZSBvdmVyYWxsIGxhYmVsIGJvdW5kcyByZWxhdGl2ZSB0byB0aGUKKwkgKiB2ZXJ0ZXgsIHRvIG1vdmUgdGhlIGxhYmVsIGJvdW5kcyBob3Jpem9udGFsbHksIHVzZQorCSAqIDxTVFlMRV9MQUJFTF9QT1NJVElPTj4uIFZhbHVlIGlzICJhbGlnbiIuCisJICovCisJU1RZTEVfQUxJR046ICdhbGlnbicsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfVkVSVElDQUxfQUxJR04KKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSB2ZXJ0aWNhbEFsaWduIHN0eWxlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlCisJICogPEFMSUdOX1RPUD4sIDxBTElHTl9NSURETEU+IGFuZCA8QUxJR05fQk9UVE9NPi4gVGhpcyB2YWx1ZSBkZWZpbmVzIGhvdworCSAqIHRoZSBsaW5lcyBvZiB0aGUgbGFiZWwgYXJlIHZlcnRpY2FsbHkgYWxpZ25lZC4gPEFMSUdOX1RPUD4gbWVhbnMgdGhlCisJICogdG9wbW9zdCBsYWJlbCB0ZXh0IGxpbmUgaXMgYWxpZ25lZCBhZ2FpbnN0IHRoZSB0b3Agb2YgdGhlIGxhYmVsIGJvdW5kcywKKwkgKiA8QUxJR05fQk9UVE9NPiBtZWFucyB0aGUgYm90dG9tLW1vc3QgbGFiZWwgdGV4dCBsaW5lIGlzIGFsaWduZWQgYWdhaW5zdAorCSAqIHRoZSBib3R0b20gb2YgdGhlIGxhYmVsIGJvdW5kcyBhbmQgPEFMSUdOX01JRERMRT4gbWVhbnMgdGhlcmUgaXMgZXF1YWwKKwkgKiBzcGFjaW5nIGJldHdlZW4gdGhlIHRvcG1vc3QgdGV4dCBsYWJlbCBsaW5lIGFuZCB0aGUgdG9wIG9mIHRoZSBsYWJlbAorCSAqIGJvdW5kcyBhbmQgdGhlIGJvdHRvbS1tb3N0IHRleHQgbGFiZWwgbGluZSBhbmQgdGhlIGJvdHRvbSBvZiB0aGUgbGFiZWwKKwkgKiBib3VuZHMuIE5vdGUgdGhpcyB2YWx1ZSBkb2Vzbid0IGFmZmVjdCB0aGUgcG9zaXRpb25pbmcgb2YgdGhlIG92ZXJhbGwKKwkgKiBsYWJlbCBib3VuZHMgcmVsYXRpdmUgdG8gdGhlIHZlcnRleCwgdG8gbW92ZSB0aGUgbGFiZWwgYm91bmRzCisJICogdmVydGljYWxseSwgdXNlIDxTVFlMRV9WRVJUSUNBTF9MQUJFTF9QT1NJVElPTj4uIFZhbHVlIGlzICJ2ZXJ0aWNhbEFsaWduIi4KKwkgKi8KKwlTVFlMRV9WRVJUSUNBTF9BTElHTjogJ3ZlcnRpY2FsQWxpZ24nLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0xBQkVMX1dJRFRICisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgd2lkdGggb2YgdGhlIGxhYmVsIGlmIHRoZSBsYWJlbCBwb3NpdGlvbiBpcyBub3QKKwkgKiBjZW50ZXIuIFZhbHVlIGlzICJsYWJlbFdpZHRoIi4KKwkgKi8KKwlTVFlMRV9MQUJFTF9XSURUSDogJ2xhYmVsV2lkdGgnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0xBQkVMX1BPU0lUSU9OCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgaG9yaXpvbnRhbCBsYWJlbCBwb3NpdGlvbiBvZiB2ZXJ0aWNlcy4gUG9zc2libGUKKwkgKiB2YWx1ZXMgYXJlIDxBTElHTl9MRUZUPiwgPEFMSUdOX0NFTlRFUj4gYW5kIDxBTElHTl9SSUdIVD4uIERlZmF1bHQgaXMKKwkgKiA8QUxJR05fQ0VOVEVSPi4gVGhlIGxhYmVsIGFsaWduIGRlZmluZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYWJlbAorCSAqIHJlbGF0aXZlIHRvIHRoZSBjZWxsLiA8QUxJR05fTEVGVD4gbWVhbnMgdGhlIGVudGlyZSBsYWJlbCBib3VuZHMgaXMKKwkgKiBwbGFjZWQgY29tcGxldGVseSBqdXN0IHRvIHRoZSBsZWZ0IG9mIHRoZSB2ZXJ0ZXgsIDxBTElHTl9SSUdIVD4gbWVhbnMKKwkgKiBhZGp1c3QgdG8gdGhlIHJpZ2h0IGFuZCA8QUxJR05fQ0VOVEVSPiBtZWFucyB0aGUgbGFiZWwgYm91bmRzIGFyZQorCSAqIHZlcnRpY2FsbHkgYWxpZ25lZCB3aXRoIHRoZSBib3VuZHMgb2YgdGhlIHZlcnRleC4gTm90ZSB0aGlzIHZhbHVlCisJICogZG9lc24ndCBhZmZlY3QgdGhlIHBvc2l0aW9uaW5nIG9mIGxhYmVsIHdpdGhpbiB0aGUgbGFiZWwgYm91bmRzLCB0byBtb3ZlCisJICogdGhlIGxhYmVsIGhvcml6b250YWxseSB3aXRoaW4gdGhlIGxhYmVsIGJvdW5kcywgdXNlIDxTVFlMRV9BTElHTj4uCisJICogVmFsdWUgaXMgImxhYmVsUG9zaXRpb24iLgorCSAqLworCVNUWUxFX0xBQkVMX1BPU0lUSU9OOiAnbGFiZWxQb3NpdGlvbicsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfVkVSVElDQUxfTEFCRUxfUE9TSVRJT04KKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSB2ZXJ0aWNhbCBsYWJlbCBwb3NpdGlvbiBvZiB2ZXJ0aWNlcy4gUG9zc2libGUKKwkgKiB2YWx1ZXMgYXJlIDxBTElHTl9UT1A+LCA8QUxJR05fQk9UVE9NPiBhbmQgPEFMSUdOX01JRERMRT4uIERlZmF1bHQgaXMKKwkgKiA8QUxJR05fTUlERExFPi4gVGhlIGxhYmVsIGFsaWduIGRlZmluZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYWJlbAorCSAqIHJlbGF0aXZlIHRvIHRoZSBjZWxsLiA8QUxJR05fVE9QPiBtZWFucyB0aGUgZW50aXJlIGxhYmVsIGJvdW5kcyBpcworCSAqIHBsYWNlZCBjb21wbGV0ZWx5IGp1c3Qgb24gdGhlIHRvcCBvZiB0aGUgdmVydGV4LCA8QUxJR05fQk9UVE9NPiBtZWFucworCSAqIGFkanVzdCBvbiB0aGUgYm90dG9tIGFuZCA8QUxJR05fTUlERExFPiBtZWFucyB0aGUgbGFiZWwgYm91bmRzIGFyZQorCSAqIGhvcml6b250YWxseSBhbGlnbmVkIHdpdGggdGhlIGJvdW5kcyBvZiB0aGUgdmVydGV4LiBOb3RlIHRoaXMgdmFsdWUKKwkgKiBkb2Vzbid0IGFmZmVjdCB0aGUgcG9zaXRpb25pbmcgb2YgbGFiZWwgd2l0aGluIHRoZSBsYWJlbCBib3VuZHMsIHRvIG1vdmUKKwkgKiB0aGUgbGFiZWwgdmVydGljYWxseSB3aXRoaW4gdGhlIGxhYmVsIGJvdW5kcywgdXNlCisJICogPFNUWUxFX1ZFUlRJQ0FMX0FMSUdOPi4gVmFsdWUgaXMgInZlcnRpY2FsTGFiZWxQb3NpdGlvbiIuCisJICovCisJU1RZTEVfVkVSVElDQUxfTEFCRUxfUE9TSVRJT046ICd2ZXJ0aWNhbExhYmVsUG9zaXRpb24nLAorCQorCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9JTUFHRV9BU1BFQ1QKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBpbWFnZSBhc3BlY3Qgc3R5bGUuIFBvc3NpYmxlIHZhbHVlcyBhcmUgMCAoZG8KKwkgKiBub3QgcHJlc2VydmUgYXNwZWN0KSBvciAxIChrZWVwIGFzcGVjdCkuIFRoaXMgaXMgb25seSB1c2VkIGluCisJICogPG14SW1hZ2VTaGFwZT4uIERlZmF1bHQgaXMgMS4gVmFsdWUgaXMgImltYWdlQXNwZWN0Ii4KKwkgKi8KKwlTVFlMRV9JTUFHRV9BU1BFQ1Q6ICdpbWFnZUFzcGVjdCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfSU1BR0VfQUxJR04KKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBhbGlnbiBzdHlsZS4gUG9zc2libGUgdmFsdWVzIGFyZSA8QUxJR05fTEVGVD4sCisJICogPEFMSUdOX0NFTlRFUj4gYW5kIDxBTElHTl9SSUdIVD4uIFRoZSB2YWx1ZSBkZWZpbmVzIGhvdyBhbnkgaW1hZ2UgaW4gdGhlCisJICogdmVydGV4IGxhYmVsIGlzIGFsaWduZWQgaG9yaXpvbnRhbGx5IHdpdGhpbiB0aGUgbGFiZWwgYm91bmRzIG9mIGEKKwkgKiA8U0hBUEVfTEFCRUw+IHNoYXBlLiBWYWx1ZSBpcyAiaW1hZ2VBbGlnbiIuCisJICovCisJU1RZTEVfSU1BR0VfQUxJR046ICdpbWFnZUFsaWduJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9JTUFHRV9WRVJUSUNBTF9BTElHTgorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIHZlcnRpY2FsQWxpZ24gc3R5bGUuIFBvc3NpYmxlIHZhbHVlcyBhcmUKKwkgKiA8QUxJR05fVE9QPiwgPEFMSUdOX01JRERMRT4gYW5kIDxBTElHTl9CT1RUT00+LiBUaGUgdmFsdWUgZGVmaW5lcyBob3cKKwkgKiBhbnkgaW1hZ2UgaW4gdGhlIHZlcnRleCBsYWJlbCBpcyBhbGlnbmVkIHZlcnRpY2FsbHkgd2l0aGluIHRoZSBsYWJlbAorCSAqIGJvdW5kcyBvZiBhIDxTSEFQRV9MQUJFTD4gc2hhcGUuIFZhbHVlIGlzICJpbWFnZVZlcnRpY2FsQWxpZ24iLgorCSAqLworCVNUWUxFX0lNQUdFX1ZFUlRJQ0FMX0FMSUdOOiAnaW1hZ2VWZXJ0aWNhbEFsaWduJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9HTEFTUworCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGdsYXNzIHN0eWxlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIDAgKGRpc2FibGVkKSBhbmQKKwkgKiAxKGVuYWJsZWQpLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLiBUaGlzIGlzIHVzZWQgaW4gPG14TGFiZWw+LiBWYWx1ZSBpcworCSAqICJnbGFzcyIuCisJICovCisJU1RZTEVfR0xBU1M6ICdnbGFzcycsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfSU1BR0UKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBpbWFnZSBzdHlsZS4gUG9zc2libGUgdmFsdWVzIGFyZSBhbnkgaW1hZ2UgVVJMLAorCSAqIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBpcyBTdHJpbmcuIFRoaXMgaXMgdGhlIHBhdGggdG8gdGhlIGltYWdlIHRoYXQgaXMKKwkgKiB0byBiZSBkaXNwbGF5ZWQgd2l0aGluIHRoZSBsYWJlbCBvZiBhIHZlcnRleC4gRGF0YSBVUkxzIHNob3VsZCB1c2UgdGhlCisJICogZm9sbG93aW5nIGZvcm1hdDogZGF0YTppbWFnZS9wbmcseHl6IHdoZXJlIHh5eiBpcyB0aGUgYmFzZTY0IGVuY29kZWQKKwkgKiBkYXRhICh3aXRob3V0IHRoZSAiYmFzZTY0Ii1wcmVmaXgpLiBOb3RlIHRoYXQgRGF0YSBVUkxzIGFyZSBvbmx5CisJICogc3VwcG9ydGVkIGluIG1vZGVybiBicm93c2Vycy4gVmFsdWUgaXMgImltYWdlIi4KKwkgKi8KKwlTVFlMRV9JTUFHRTogJ2ltYWdlJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9JTUFHRV9XSURUSAorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGltYWdlV2lkdGggc3R5bGUuIFRoZSB0eXBlIG9mIHRoaXMgdmFsdWUgaXMKKwkgKiBpbnQsIHRoZSB2YWx1ZSBpcyB0aGUgaW1hZ2Ugd2lkdGggaW4gcGl4ZWxzIGFuZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgorCSAqIFZhbHVlIGlzICJpbWFnZVdpZHRoIi4KKwkgKi8KKwlTVFlMRV9JTUFHRV9XSURUSDogJ2ltYWdlV2lkdGgnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0lNQUdFX0hFSUdIVAorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGltYWdlSGVpZ2h0IHN0eWxlLiBUaGUgdHlwZSBvZiB0aGlzIHZhbHVlIGlzCisJICogaW50LCB0aGUgdmFsdWUgaXMgdGhlIGltYWdlIGhlaWdodCBpbiBwaXhlbHMgYW5kIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCisJICogVmFsdWUgaXMgImltYWdlSGVpZ2h0Ii4KKwkgKi8KKwlTVFlMRV9JTUFHRV9IRUlHSFQ6ICdpbWFnZUhlaWdodCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfSU1BR0VfQkFDS0dST1VORAorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGltYWdlIGJhY2tncm91bmQgY29sb3IuIFRoaXMgc3R5bGUgaXMgb25seSB1c2VkCisJICogaW4gPG14SW1hZ2VTaGFwZT4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgYWxsIEhUTUwgY29sb3IgbmFtZXMgb3IgSEVYCisJICogY29kZXMuIFZhbHVlIGlzICJpbWFnZUJhY2tncm91bmQiLgorCSAqLworCVNUWUxFX0lNQUdFX0JBQ0tHUk9VTkQ6ICdpbWFnZUJhY2tncm91bmQnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0lNQUdFX0JPUkRFUgorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGltYWdlIGJvcmRlciBjb2xvci4gVGhpcyBzdHlsZSBpcyBvbmx5IHVzZWQgaW4KKwkgKiA8bXhJbWFnZVNoYXBlPi4gUG9zc2libGUgdmFsdWVzIGFyZSBhbGwgSFRNTCBjb2xvciBuYW1lcyBvciBIRVggY29kZXMuCisJICogVmFsdWUgaXMgImltYWdlQm9yZGVyIi4KKwkgKi8KKwlTVFlMRV9JTUFHRV9CT1JERVI6ICdpbWFnZUJvcmRlcicsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfRkxJUEgKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBob3Jpem9udGFsIGltYWdlIGZsaXAuIFRoaXMgc3R5bGUgaXMgb25seSB1c2VkCisJICogaW4gPG14SW1hZ2VTaGFwZT4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgMCBhbmQgMS4gRGVmYXVsdCBpcyAwLiBWYWx1ZSBpcworCSAqICJmbGlwSCIuCisJICovCisJU1RZTEVfRkxJUEg6ICdmbGlwSCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfRkxJUFYKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSB2ZXJ0aWNhbCBmbGlwLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIDAgYW5kIDEuCisJICogRGVmYXVsdCBpcyAwLiBWYWx1ZSBpcyAiZmxpcFYiLgorCSAqLworCVNUWUxFX0ZMSVBWOiAnZmxpcFYnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX05PTEFCRUwKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBub0xhYmVsIHN0eWxlLiBJZiB0aGlzIGlzIHRydWUgdGhlbiBubyBsYWJlbCBpcworCSAqIHZpc2libGUgZm9yIGEgZ2l2ZW4gY2VsbC4gUG9zc2libGUgdmFsdWVzIGFyZSB0cnVlIG9yIGZhbHNlICgxIG9yIDApLgorCSAqIERlZmF1bHQgaXMgZmFsc2UuIFZhbHVlIGlzICJub0xhYmVsIi4KKwkgKi8KKwlTVFlMRV9OT0xBQkVMOiAnbm9MYWJlbCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfTk9FREdFU1RZTEUKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBub0VkZ2VTdHlsZSBzdHlsZS4gSWYgdGhpcyBpcyB0cnVlIHRoZW4gbm8gZWRnZQorCSAqIHN0eWxlIGlzIGFwcGxpZWQgZm9yIGEgZ2l2ZW4gZWRnZS4gUG9zc2libGUgdmFsdWVzIGFyZSB0cnVlIG9yIGZhbHNlCisJICogKDEgb3IgMCkuIERlZmF1bHQgaXMgZmFsc2UuIFZhbHVlIGlzICJub0VkZ2VTdHlsZSIuCisJICovCisJU1RZTEVfTk9FREdFU1RZTEU6ICdub0VkZ2VTdHlsZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfTEFCRUxfQkFDS0dST1VORENPTE9SCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgbGFiZWwgYmFja2dyb3VuZCBjb2xvci4gUG9zc2libGUgdmFsdWVzIGFyZSBhbGwKKwkgKiBIVE1MIGNvbG9yIG5hbWVzIG9yIEhFWCBjb2Rlcy4gVmFsdWUgaXMgImxhYmVsQmFja2dyb3VuZENvbG9yIi4KKwkgKi8KKwlTVFlMRV9MQUJFTF9CQUNLR1JPVU5EQ09MT1I6ICdsYWJlbEJhY2tncm91bmRDb2xvcicsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfTEFCRUxfQk9SREVSQ09MT1IKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBsYWJlbCBib3JkZXIgY29sb3IuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYWxsCisJICogSFRNTCBjb2xvciBuYW1lcyBvciBIRVggY29kZXMuIFZhbHVlIGlzICJsYWJlbEJvcmRlckNvbG9yIi4KKwkgKi8KKwlTVFlMRV9MQUJFTF9CT1JERVJDT0xPUjogJ2xhYmVsQm9yZGVyQ29sb3InLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0xBQkVMX1BBRERJTkcKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBsYWJlbCBwYWRkaW5nLCBpZS4gdGhlIHNwYWNlIGJldHdlZW4gdGhlIGxhYmVsCisJICogYm9yZGVyIGFuZCB0aGUgbGFiZWwuIFZhbHVlIGlzICJsYWJlbFBhZGRpbmciLgorCSAqLworCVNUWUxFX0xBQkVMX1BBRERJTkc6ICdsYWJlbFBhZGRpbmcnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0lORElDQVRPUl9TSEFQRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGluZGljYXRvciBzaGFwZSB1c2VkIHdpdGhpbiBhbiA8bXhMYWJlbD4uCisJICogUG9zc2libGUgdmFsdWVzIGFyZSBhbGwgU0hBUEVfKiBjb25zdGFudHMgb3IgdGhlIG5hbWVzIG9mIGFueSBuZXcKKwkgKiBzaGFwZXMuIFRoZSBpbmRpY2F0b3JTaGFwZSBoYXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBpbmRpY2F0b3JJbWFnZS4KKwkgKiBWYWx1ZSBpcyAiaW5kaWNhdG9yU2hhcGUiLgorCSAqLworCVNUWUxFX0lORElDQVRPUl9TSEFQRTogJ2luZGljYXRvclNoYXBlJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9JTkRJQ0FUT1JfSU1BR0UKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBpbmRpY2F0b3IgaW1hZ2UgdXNlZCB3aXRoaW4gYW4gPG14TGFiZWw+LgorCSAqIFBvc3NpYmxlIHZhbHVlcyBhcmUgYWxsIGltYWdlIFVSTHMuIFRoZSBpbmRpY2F0b3JTaGFwZSBoYXMKKwkgKiBwcmVjZWRlbmNlIG92ZXIgdGhlIGluZGljYXRvckltYWdlLiBWYWx1ZSBpcyAiaW5kaWNhdG9ySW1hZ2UiLgorCSAqLworCVNUWUxFX0lORElDQVRPUl9JTUFHRTogJ2luZGljYXRvckltYWdlJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9JTkRJQ0FUT1JfQ09MT1IKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBpbmRpY2F0b3JDb2xvciBzdHlsZS4gUG9zc2libGUgdmFsdWVzIGFyZSBhbGwKKwkgKiBIVE1MIGNvbG9yIG5hbWVzIG9yIEhFWCBjb2RlcywgYXMgd2VsbCBhcyB0aGUgc3BlY2lhbCAnc3dpbWxhbmUnIGtleXdvcmQKKwkgKiB0byByZWZlciB0byB0aGUgY29sb3Igb2YgdGhlIHBhcmVudCBzd2ltbGFuZSBpZiBvbmUgZXhpc3RzLiBWYWx1ZSBpcworCSAqICJpbmRpY2F0b3JDb2xvciIuCisJICovCisJU1RZTEVfSU5ESUNBVE9SX0NPTE9SOiAnaW5kaWNhdG9yQ29sb3InLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0lORElDQVRPUl9TVFJPS0VDT0xPUgorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGluZGljYXRvciBzdHJva2UgY29sb3IgaW4gPG14TGFiZWw+LgorCSAqIFBvc3NpYmxlIHZhbHVlcyBhcmUgYWxsIGNvbG9yIGNvZGVzLiBWYWx1ZSBpcyAiaW5kaWNhdG9yU3Ryb2tlQ29sb3IiLgorCSAqLworCVNUWUxFX0lORElDQVRPUl9TVFJPS0VDT0xPUjogJ2luZGljYXRvclN0cm9rZUNvbG9yJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9JTkRJQ0FUT1JfR1JBRElFTlRDT0xPUgorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGluZGljYXRvckdyYWRpZW50Q29sb3Igc3R5bGUuIFBvc3NpYmxlIHZhbHVlcworCSAqIGFyZSBhbGwgSFRNTCBjb2xvciBuYW1lcyBvciBIRVggY29kZXMuIFRoaXMgc3R5bGUgaXMgb25seSBzdXBwb3J0ZWQgaW4KKwkgKiA8U0hBUEVfTEFCRUw+IHNoYXBlcy4gVmFsdWUgaXMgImluZGljYXRvckdyYWRpZW50Q29sb3IiLgorCSAqLworCVNUWUxFX0lORElDQVRPUl9HUkFESUVOVENPTE9SOiAnaW5kaWNhdG9yR3JhZGllbnRDb2xvcicsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfSU5ESUNBVE9SX1NQQUNJTkcKKwkgKiAKKwkgKiBUaGUgZGVmaW5lcyB0aGUga2V5IGZvciB0aGUgc3BhY2luZyBiZXR3ZWVuIHRoZSBsYWJlbCBhbmQgdGhlCisJICogaW5kaWNhdG9yIGluIDxteExhYmVsPi4gUG9zc2libGUgdmFsdWVzIGFyZSBpbiBwaXhlbHMuIFZhbHVlIGlzCisJICogImluZGljYXRvclNwYWNpbmciLgorCSAqLworCVNUWUxFX0lORElDQVRPUl9TUEFDSU5HOiAnaW5kaWNhdG9yU3BhY2luZycsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfSU5ESUNBVE9SX1dJRFRICisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgaW5kaWNhdG9yIHdpZHRoLiBQb3NzaWJsZSB2YWx1ZXMgc3RhcnQgYXQgMCAoaW4KKwkgKiBwaXhlbHMpLiBWYWx1ZSBpcyAiaW5kaWNhdG9yV2lkdGgiLgorCSAqLworCVNUWUxFX0lORElDQVRPUl9XSURUSDogJ2luZGljYXRvcldpZHRoJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9JTkRJQ0FUT1JfSEVJR0hUCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgaW5kaWNhdG9yIGhlaWdodC4gUG9zc2libGUgdmFsdWVzIHN0YXJ0IGF0IDAgKGluCisJICogcGl4ZWxzKS4gVmFsdWUgaXMgImluZGljYXRvckhlaWdodCIuCisJICovCisJU1RZTEVfSU5ESUNBVE9SX0hFSUdIVDogJ2luZGljYXRvckhlaWdodCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfSU5ESUNBVE9SX0RJUkVDVElPTgorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGluZGljYXRvckRpcmVjdGlvbiBzdHlsZS4gVGhlIGRpcmVjdGlvbiBzdHlsZSBpcworCSAqIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIGNlcnRhaW4gc2hhcGVzIChlZy4gPG14VHJpYW5nbGU+KS4KKwkgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlIDxESVJFQ1RJT05fRUFTVD4gKGRlZmF1bHQpLCA8RElSRUNUSU9OX1dFU1Q+LAorCSAqIDxESVJFQ1RJT05fTk9SVEg+IGFuZCA8RElSRUNUSU9OX1NPVVRIPi4gVmFsdWUgaXMgImluZGljYXRvckRpcmVjdGlvbiIuCisJICovCisJU1RZTEVfSU5ESUNBVE9SX0RJUkVDVElPTjogJ2luZGljYXRvckRpcmVjdGlvbicsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfU0hBRE9XCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgc2hhZG93IHN0eWxlLiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgaXMgQm9vbGVhbi4KKwkgKiBWYWx1ZSBpcyAic2hhZG93Ii4KKwkgKi8KKwlTVFlMRV9TSEFET1c6ICdzaGFkb3cnLAorCQorCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9TRUdNRU5UCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgc2VnbWVudCBzdHlsZS4gVGhlIHR5cGUgb2YgdGhpcyB2YWx1ZSBpcyBmbG9hdAorCSAqIGFuZCB0aGUgdmFsdWUgcmVwcmVzZW50cyB0aGUgc2l6ZSBvZiB0aGUgaG9yaXpvbnRhbCBzZWdtZW50IG9mIHRoZQorCSAqIGVudGl0eSByZWxhdGlvbiBzdHlsZS4gRGVmYXVsdCBpcyBFTlRJVFlfU0VHTUVOVC4gVmFsdWUgaXMgInNlZ21lbnQiLgorCSAqLworCVNUWUxFX1NFR01FTlQ6ICdzZWdtZW50JywKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfRU5EQVJST1cKKwkgKgorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGVuZCBhcnJvdyBtYXJrZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYWxsCisJICogY29uc3RhbnRzIHdpdGggYW4gQVJST1ctcHJlZml4LiBUaGlzIGlzIG9ubHkgdXNlZCBpbiA8bXhDb25uZWN0b3I+LgorCSAqIFZhbHVlIGlzICJlbmRBcnJvdyIuCisJICoKKwkgKiBFeGFtcGxlOgorCSAqIChjb2RlKQorCSAqIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0VOREFSUk9XXSA9IG14Q29uc3RhbnRzLkFSUk9XX0NMQVNTSUM7CisJICogKGVuZCkKKwkgKi8KKwlTVFlMRV9FTkRBUlJPVzogJ2VuZEFycm93JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9TVEFSVEFSUk9XCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgc3RhcnQgYXJyb3cgbWFya2VyLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGFsbAorCSAqIGNvbnN0YW50cyB3aXRoIGFuIEFSUk9XLXByZWZpeC4gVGhpcyBpcyBvbmx5IHVzZWQgaW4gPG14Q29ubmVjdG9yPi4KKwkgKiBTZWUgPFNUWUxFX0VOREFSUk9XPi4gVmFsdWUgaXMgInN0YXJ0QXJyb3ciLgorCSAqLworCVNUWUxFX1NUQVJUQVJST1c6ICdzdGFydEFycm93JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9FTkRTSVpFCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgZW5kU2l6ZSBzdHlsZS4gVGhlIHR5cGUgb2YgdGhpcyB2YWx1ZSBpcyBudW1lcmljCisJICogYW5kIHRoZSB2YWx1ZSByZXByZXNlbnRzIHRoZSBzaXplIG9mIHRoZSBlbmQgbWFya2VyIGluIHBpeGVscy4gVmFsdWUgaXMKKwkgKiAiZW5kU2l6ZSIuCisJICovCisJU1RZTEVfRU5EU0laRTogJ2VuZFNpemUnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1NUQVJUU0laRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIHN0YXJ0U2l6ZSBzdHlsZS4gVGhlIHR5cGUgb2YgdGhpcyB2YWx1ZSBpcworCSAqIG51bWVyaWMgYW5kIHRoZSB2YWx1ZSByZXByZXNlbnRzIHRoZSBzaXplIG9mIHRoZSBzdGFydCBtYXJrZXIgb3IgdGhlCisJICogc2l6ZSBvZiB0aGUgc3dpbWxhbmUgdGl0bGUgcmVnaW9uIGRlcGVuZGluZyBvbiB0aGUgc2hhcGUgaXQgaXMgdXNlZCBmb3IuCisJICogVmFsdWUgaXMgInN0YXJ0U2l6ZSIuCisJICovCisJU1RZTEVfU1RBUlRTSVpFOiAnc3RhcnRTaXplJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9TV0lNTEFORV9MSU5FCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgc3dpbWxhbmVMaW5lIHN0eWxlLiBUaGlzIHN0eWxlIHNwZWNpZmllcyB3aGV0aGVyCisJICogdGhlIGxpbmUgYmV0d2VlbiB0aGUgdGl0bGUgcmVnaW8gb2YgYSBzd2ltbGFuZSBzaG91bGQgYmUgdmlzaWJsZS4gVXNlIDAKKwkgKiBmb3IgaGlkZGVuIG9yIDEgKGRlZmF1bHQpIGZvciB2aXNpYmxlLiBWYWx1ZSBpcyAic3dpbWxhbmVMaW5lIi4KKwkgKi8KKwlTVFlMRV9TV0lNTEFORV9MSU5FOiAnc3dpbWxhbmVMaW5lJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9FTkRGSUxMCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgZW5kRmlsbCBzdHlsZS4gVXNlIDAgZm9yIG5vIGZpbGwgb3IgMSAoZGVmYXVsdCkKKwkgKiBmb3IgZmlsbC4gKFRoaXMgc3R5bGUgaXMgb25seSBleHBvcnRlZCB2aWEgPG14SW1hZ2VFeHBvcnQ+LikgVmFsdWUgaXMKKwkgKiAiZW5kRmlsbCIuCisJICovCisJU1RZTEVfRU5ERklMTDogJ2VuZEZpbGwnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1NUQVJURklMTAorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIHN0YXJ0RmlsbCBzdHlsZS4gVXNlIDAgZm9yIG5vIGZpbGwgb3IgMSAoZGVmYXVsdCkKKwkgKiBmb3IgZmlsbC4gKFRoaXMgc3R5bGUgaXMgb25seSBleHBvcnRlZCB2aWEgPG14SW1hZ2VFeHBvcnQ+LikgVmFsdWUgaXMKKwkgKiAic3RhcnRGaWxsIi4KKwkgKi8KKwlTVFlMRV9TVEFSVEZJTEw6ICdzdGFydEZpbGwnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0RBU0hFRAorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGRhc2hlZCBzdHlsZS4gVXNlIDAgKGRlZmF1bHQpIGZvciBub24tZGFzaGVkIG9yIDEKKwkgKiBmb3IgZGFzaGVkLiBWYWx1ZSBpcyAiZGFzaGVkIi4KKwkgKi8KKwlTVFlMRV9EQVNIRUQ6ICdkYXNoZWQnLAorCisJLyoqCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgZGFzaGVkIHBhdHRlcm4gc3R5bGUgaW4gU1ZHIGFuZCBpbWFnZSBleHBvcnRzLgorCSAqIFRoZSB0eXBlIG9mIHRoaXMgdmFsdWUgaXMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBudW1iZXJzIHRoYXQgc3BlY2lmeQorCSAqIGEgY3VzdG9tLWRlZmluZWQgZGFzaCBwYXR0ZXJuLiBEYXNoIHN0eWxlcyBhcmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiB0aGUKKwkgKiBsZW5ndGggb2YgdGhlIGRhc2ggKHRoZSBkcmF3biBwYXJ0IG9mIHRoZSBzdHJva2UpIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZQorCSAqIHNwYWNlIGJldHdlZW4gdGhlIGRhc2hlcy4gVGhlIGxlbmd0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBsaW5lIHdpZHRoOiBhCisJICogbGVuZ3RoIG9mICIxIiBpcyBlcXVhbCB0byB0aGUgbGluZSB3aWR0aC4gVk1MIGlnbm9yZXMgdGhpcyBzdHlsZSBhbmQKKwkgKiB1c2VzIGRhc2hTdHlsZSBpbnN0ZWFkIGFzIGRlZmluZWQgaW4gdGhlIFZNTCBzcGVjaWZpY2F0aW9uLiBUaGlzIHN0eWxlCisJICogaXMgb25seSB1c2VkIGluIHRoZSA8bXhDb25uZWN0b3I+IHNoYXBlLiBWYWx1ZSBpcyAiZGFzaFBhdHRlcm4iLgorCSAqLworCVNUWUxFX0RBU0hfUEFUVEVSTjogJ2Rhc2hQYXR0ZXJuJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9GSVhfREFTSAorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGZpeERhc2ggc3R5bGUuIFVzZSAwIChkZWZhdWx0KSBmb3IgZGFzaCBwYXR0ZXJucworCSAqIHRoYXQgZGVwZW5kIG9uIHRoZSBsaW5ld2lkdGggYW5kIDEgZm9yIGRhc2ggcGF0dGVybnMgdGhhdCBpZ25vcmUgdGhlCisJICogbGluZSB3aWR0aC4gVmFsdWUgaXMgImZpeERhc2giLgorCSAqLworCVNUWUxFX0ZJWF9EQVNIOiAnZml4RGFzaCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfUk9VTkRFRAorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIHJvdW5kZWQgc3R5bGUuIFRoZSB0eXBlIG9mIHRoaXMgdmFsdWUgaXMKKwkgKiBCb29sZWFuLiBGb3IgZWRnZXMgdGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGpvaW5zIGJldHdlZW4gZWRnZXMKKwkgKiBzZWdtZW50cyBhcmUgc21vb3RoZWQgdG8gYSByb3VuZGVkIGZpbmlzaC4gRm9yIHZlcnRpY2VzIHRoYXQgaGF2ZSB0aGUKKwkgKiByZWN0YW5nbGUgc2hhcGUsIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgcmVjdGFuZ2xlIGlzCisJICogcm91bmRlZC4gVXNlIDAgKGRlZmF1bHQpIGZvciBub24tcm91bmRlZCBvciAxIGZvciByb3VuZGVkLiBWYWx1ZSBpcworCSAqICJyb3VuZGVkIi4KKwkgKi8KKwlTVFlMRV9ST1VOREVEOiAncm91bmRlZCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfQ1VSVkVECisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgY3VydmVkIHN0eWxlLiBUaGUgdHlwZSBvZiB0aGlzIHZhbHVlIGlzCisJICogQm9vbGVhbi4gSXQgaXMgb25seSBhcHBsaWNhYmxlIGZvciBjb25uZWN0b3Igc2hhcGVzLiBVc2UgMCAoZGVmYXVsdCkKKwkgKiBmb3Igbm9uLWN1cnZlZCBvciAxIGZvciBjdXJ2ZWQuIFZhbHVlIGlzICJjdXJ2ZWQiLgorCSAqLworCVNUWUxFX0NVUlZFRDogJ2N1cnZlZCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfQVJDU0laRQorCSAqIAorCSAqIERlZmluZXMgdGhlIHJvdW5kaW5nIGZhY3RvciBmb3IgYSByb3VuZGVkIHJlY3RhbmdsZSBpbiBwZXJjZW50ICh3aXRob3V0CisJICogdGhlIHBlcmNlbnQgc2lnbikuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYmV0d2VlbiAwIGFuZCAxMDAuIElmIHRoaXMgdmFsdWUKKwkgKiBpcyBub3Qgc3BlY2lmaWVkIHRoZW4gUkVDVEFOR0xFX1JPVU5ESU5HX0ZBQ1RPUiAqIDEwMCBpcyB1c2VkLiBGb3IKKwkgKiBlZGdlcywgdGhpcyBkZWZpbmVzIHRoZSBhYnNvbHV0ZSBzaXplIG9mIHJvdW5kZWQgY29ybmVycyBpbiBwaXhlbHMuIElmCisJICogdGhpcyB2YWx1ZXMgaXMgbm90IHNwZWNpZmllZCB0aGVuIExJTkVfQVJDU0laRSBpcyB1c2VkLgorCSAqIChUaGlzIHN0eWxlIGlzIG9ubHkgZXhwb3J0ZWQgdmlhIDxteEltYWdlRXhwb3J0Pi4pIFZhbHVlIGlzICJhcmNTaXplIi4KKwkgKi8KKwlTVFlMRV9BUkNTSVpFOiAnYXJjU2l6ZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfQUJTT0xVVEVfQVJDU0laRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGFic29sdXRlIGFyYyBzaXplIHN0eWxlLiBUaGlzIHNwZWNpZmllcyBpZgorCSAqIGFyY1NpemUgZm9yIHJlY3RhbmdsZXMgaXMgYWJvbHV0ZSBvciByZWxhdGl2ZS4gUG9zc2libGUgdmFsdWVzIGFyZSAxCisJICogYW5kIDAgKGRlZmF1bHQpLiBWYWx1ZSBpcyAiYWJzb2x1dGVBcmNTaXplIi4KKwkgKi8KKwlTVFlMRV9BQlNPTFVURV9BUkNTSVpFOiAnYWJzb2x1dGVBcmNTaXplJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9TT1VSQ0VfUEVSSU1FVEVSX1NQQUNJTkcKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBzb3VyY2UgcGVyaW1ldGVyIHNwYWNpbmcuIFRoZSB0eXBlIG9mIHRoaXMgdmFsdWUKKwkgKiBpcyBudW1lcmljLiBUaGlzIGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzb3VyY2UgY29ubmVjdGlvbiBwb2ludCBvZgorCSAqIGFuIGVkZ2UgYW5kIHRoZSBwZXJpbWV0ZXIgb2YgdGhlIHNvdXJjZSB2ZXJ0ZXggaW4gcGl4ZWxzLiBUaGlzIHN0eWxlCisJICogb25seSBhcHBsaWVzIHRvIGVkZ2VzLiBWYWx1ZSBpcyAic291cmNlUGVyaW1ldGVyU3BhY2luZyIuCisJICovCisJU1RZTEVfU09VUkNFX1BFUklNRVRFUl9TUEFDSU5HOiAnc291cmNlUGVyaW1ldGVyU3BhY2luZycsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfVEFSR0VUX1BFUklNRVRFUl9TUEFDSU5HCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgdGFyZ2V0IHBlcmltZXRlciBzcGFjaW5nLiBUaGUgdHlwZSBvZiB0aGlzIHZhbHVlCisJICogaXMgbnVtZXJpYy4gVGhpcyBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdGFyZ2V0IGNvbm5lY3Rpb24gcG9pbnQgb2YKKwkgKiBhbiBlZGdlIGFuZCB0aGUgcGVyaW1ldGVyIG9mIHRoZSB0YXJnZXQgdmVydGV4IGluIHBpeGVscy4gVGhpcyBzdHlsZQorCSAqIG9ubHkgYXBwbGllcyB0byBlZGdlcy4gVmFsdWUgaXMgInRhcmdldFBlcmltZXRlclNwYWNpbmciLgorCSAqLworCVNUWUxFX1RBUkdFVF9QRVJJTUVURVJfU1BBQ0lORzogJ3RhcmdldFBlcmltZXRlclNwYWNpbmcnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1BFUklNRVRFUl9TUEFDSU5HCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgcGVyaW1ldGVyIHNwYWNpbmcuIFRoaXMgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4KKwkgKiB0aGUgY29ubmVjdGlvbiBwb2ludCBhbmQgdGhlIHBlcmltZXRlciBpbiBwaXhlbHMuIFdoZW4gdXNlZCBpbiBhIHZlcnRleAorCSAqIHN0eWxlLCB0aGlzIGFwcGxpZXMgdG8gYWxsIGluY29taW5nIGVkZ2VzIHRvIGZsb2F0aW5nIHBvcnRzIChlZGdlcyB0aGF0CisJICogdGVybWluYXRlIG9uIHRoZSBwZXJpbWV0ZXIgb2YgdGhlIHZlcnRleCkuIFdoZW4gdXNlZCBpbiBhbiBlZGdlIHN0eWxlLAorCSAqIHRoaXMgc3BhY2luZyBhcHBsaWVzIHRvIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBzZXBhcmF0ZWx5LCBpZiB0aGV5CisJICogdGVybWluYXRlIGluIGZsb2F0aW5nIHBvcnRzIChvbiB0aGUgcGVyaW1ldGVyIG9mIHRoZSB2ZXJ0ZXgpLiBWYWx1ZSBpcworCSAqICJwZXJpbWV0ZXJTcGFjaW5nIi4KKwkgKi8KKwlTVFlMRV9QRVJJTUVURVJfU1BBQ0lORzogJ3BlcmltZXRlclNwYWNpbmcnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1NQQUNJTkcKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBzcGFjaW5nLiBUaGUgdmFsdWUgcmVwcmVzZW50cyB0aGUgc3BhY2luZywgaW4KKwkgKiBwaXhlbHMsIGFkZGVkIHRvIGVhY2ggc2lkZSBvZiBhIGxhYmVsIGluIGEgdmVydGV4IChzdHlsZSBhcHBsaWVzIHRvCisJICogdmVydGljZXMgb25seSkuIFZhbHVlIGlzICJzcGFjaW5nIi4KKwkgKi8KKwlTVFlMRV9TUEFDSU5HOiAnc3BhY2luZycsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfU1BBQ0lOR19UT1AKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBzcGFjaW5nVG9wIHN0eWxlLiBUaGUgdmFsdWUgcmVwcmVzZW50cyB0aGUKKwkgKiBzcGFjaW5nLCBpbiBwaXhlbHMsIGFkZGVkIHRvIHRoZSB0b3Agc2lkZSBvZiBhIGxhYmVsIGluIGEgdmVydGV4IChzdHlsZQorCSAqIGFwcGxpZXMgdG8gdmVydGljZXMgb25seSkuIFZhbHVlIGlzICJzcGFjaW5nVG9wIi4KKwkgKi8KKwlTVFlMRV9TUEFDSU5HX1RPUDogJ3NwYWNpbmdUb3AnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1NQQUNJTkdfTEVGVAorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIHNwYWNpbmdMZWZ0IHN0eWxlLiBUaGUgdmFsdWUgcmVwcmVzZW50cyB0aGUKKwkgKiBzcGFjaW5nLCBpbiBwaXhlbHMsIGFkZGVkIHRvIHRoZSBsZWZ0IHNpZGUgb2YgYSBsYWJlbCBpbiBhIHZlcnRleCAoc3R5bGUKKwkgKiBhcHBsaWVzIHRvIHZlcnRpY2VzIG9ubHkpLiBWYWx1ZSBpcyAic3BhY2luZ0xlZnQiLgorCSAqLworCVNUWUxFX1NQQUNJTkdfTEVGVDogJ3NwYWNpbmdMZWZ0JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9TUEFDSU5HX0JPVFRPTQorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIHNwYWNpbmdCb3R0b20gc3R5bGUgVGhlIHZhbHVlIHJlcHJlc2VudHMgdGhlCisJICogc3BhY2luZywgaW4gcGl4ZWxzLCBhZGRlZCB0byB0aGUgYm90dG9tIHNpZGUgb2YgYSBsYWJlbCBpbiBhIHZlcnRleAorCSAqIChzdHlsZSBhcHBsaWVzIHRvIHZlcnRpY2VzIG9ubHkpLiBWYWx1ZSBpcyAic3BhY2luZ0JvdHRvbSIuCisJICovCisJU1RZTEVfU1BBQ0lOR19CT1RUT006ICdzcGFjaW5nQm90dG9tJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9TUEFDSU5HX1JJR0hUCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgc3BhY2luZ1JpZ2h0IHN0eWxlIFRoZSB2YWx1ZSByZXByZXNlbnRzIHRoZQorCSAqIHNwYWNpbmcsIGluIHBpeGVscywgYWRkZWQgdG8gdGhlIHJpZ2h0IHNpZGUgb2YgYSBsYWJlbCBpbiBhIHZlcnRleCAoc3R5bGUKKwkgKiBhcHBsaWVzIHRvIHZlcnRpY2VzIG9ubHkpLiBWYWx1ZSBpcyAic3BhY2luZ1JpZ2h0Ii4KKwkgKi8KKwlTVFlMRV9TUEFDSU5HX1JJR0hUOiAnc3BhY2luZ1JpZ2h0JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9IT1JJWk9OVEFMCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgaG9yaXpvbnRhbCBzdHlsZS4gUG9zc2libGUgdmFsdWVzIGFyZQorCSAqIHRydWUgb3IgZmFsc2UuIFRoaXMgdmFsdWUgb25seSBhcHBsaWVzIHRvIHZlcnRpY2VzLiBJZiB0aGUgPFNUWUxFX1NIQVBFPgorCSAqIGlzICJTSEFQRV9TV0lNTEFORSIgYSB2YWx1ZSBvZiBmYWxzZSBpbmRpY2F0ZXMgdGhhdCB0aGUKKwkgKiBzd2ltbGFuZSBzaG91bGQgYmUgZHJhd24gdmVydGljYWxseSwgdHJ1ZSBpbmRpY2F0ZXMgdG8gZHJhdyBpdAorCSAqIGhvcml6b250YWxseS4gSWYgdGhlIHNoYXBlIHN0eWxlIGRvZXMgbm90IGluZGljYXRlIHRoYXQgdGhpcyB2ZXJ0ZXggaXMgYQorCSAqIHN3aW1sYW5lLCB0aGlzIHZhbHVlIGFmZmVjdHMgb25seSB3aGV0aGVyIHRoZSBsYWJlbCBpcyBkcmF3bgorCSAqIGhvcml6b250YWxseSBvciB2ZXJ0aWNhbGx5LiBWYWx1ZSBpcyAiaG9yaXpvbnRhbCIuCisJICovCisJU1RZTEVfSE9SSVpPTlRBTDogJ2hvcml6b250YWwnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0RJUkVDVElPTgorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGRpcmVjdGlvbiBzdHlsZS4gVGhlIGRpcmVjdGlvbiBzdHlsZSBpcyB1c2VkCisJICogdG8gc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIGNlcnRhaW4gc2hhcGVzIChlZy4gPG14VHJpYW5nbGU+KS4KKwkgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlIDxESVJFQ1RJT05fRUFTVD4gKGRlZmF1bHQpLCA8RElSRUNUSU9OX1dFU1Q+LAorCSAqIDxESVJFQ1RJT05fTk9SVEg+IGFuZCA8RElSRUNUSU9OX1NPVVRIPi4gVmFsdWUgaXMgImRpcmVjdGlvbiIuCisJICovCisJU1RZTEVfRElSRUNUSU9OOiAnZGlyZWN0aW9uJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9FTEJPVworCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGVsYm93IHN0eWxlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlCisJICogPEVMQk9XX0hPUklaT05UQUw+IGFuZCA8RUxCT1dfVkVSVElDQUw+LiBEZWZhdWx0IGlzIDxFTEJPV19IT1JJWk9OVEFMPi4KKwkgKiBUaGlzIGRlZmluZXMgaG93IHRoZSB0aHJlZSBzZWdtZW50IG9ydGhvZ29uYWwgZWRnZSBzdHlsZSBsZWF2ZXMgaXRzCisJICogdGVybWluYWwgdmVydGljZXMuIFRoZSB2ZXJ0aWNhbCBzdHlsZSBsZWF2ZXMgdGhlIHRlcm1pbmFsIHZlcnRpY2VzIGF0CisJICogdGhlIHRvcCBhbmQgYm90dG9tIHNpZGVzLiBWYWx1ZSBpcyAiZWxib3ciLgorCSAqLworCVNUWUxFX0VMQk9XOiAnZWxib3cnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0ZPTlRDT0xPUgorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGZvbnRDb2xvciBzdHlsZS4gUG9zc2libGUgdmFsdWVzIGFyZSBhbGwgSFRNTAorCSAqIGNvbG9yIG5hbWVzIG9yIEhFWCBjb2Rlcy4gVmFsdWUgaXMgImZvbnRDb2xvciIuCisJICovCisJU1RZTEVfRk9OVENPTE9SOiAnZm9udENvbG9yJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9GT05URkFNSUxZCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgZm9udEZhbWlseSBzdHlsZS4gUG9zc2libGUgdmFsdWVzIGFyZSBuYW1lcyBzdWNoCisJICogYXMgQXJpYWw7IERpYWxvZzsgVmVyZGFuYTsgVGltZXMgTmV3IFJvbWFuLiBUaGUgdmFsdWUgaXMgb2YgdHlwZSBTdHJpbmcuCisJICogVmFsdWUgaXMgZm9udEZhbWlseS4KKwkgKi8KKwlTVFlMRV9GT05URkFNSUxZOiAnZm9udEZhbWlseScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfRk9OVFNJWkUKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBmb250U2l6ZSBzdHlsZSAoaW4gcHgpLiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUKKwkgKiBpcyBpbnQuIFZhbHVlIGlzICJmb250U2l6ZSIuCisJICovCisJU1RZTEVfRk9OVFNJWkU6ICdmb250U2l6ZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfRk9OVFNUWUxFCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgZm9udFN0eWxlIHN0eWxlLiBWYWx1ZXMgbWF5IGJlIGFueSBsb2dpY2FsIEFORAorCSAqIChzdW0pIG9mIDxGT05UX0JPTEQ+LCA8Rk9OVF9JVEFMSUM+IGFuZCA8Rk9OVF9VTkRFUkxJTkU+LgorCSAqIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBpcyBpbnQuIFZhbHVlIGlzICJmb250U3R5bGUiLgorCSAqLworCVNUWUxFX0ZPTlRTVFlMRTogJ2ZvbnRTdHlsZScsCisJCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0FTUEVDVAorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGFzcGVjdCBzdHlsZS4gUG9zc2libGUgdmFsdWVzIGFyZSBlbXB0eSBvciBmaXhlZC4KKwkgKiBJZiBmaXhlZCBpcyB1c2VkIHRoZW4gdGhlIGFzcGVjdCByYXRpbyBvZiB0aGUgY2VsbCB3aWxsIGJlIG1haW50YWluZWQKKwkgKiB3aGVuIHJlc2l6aW5nLiBEZWZhdWx0IGlzIGVtcHR5LiBWYWx1ZSBpcyAiYXNwZWN0Ii4KKwkgKi8KKwlTVFlMRV9BU1BFQ1Q6ICdhc3BlY3QnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0FVVE9TSVpFCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgYXV0b3NpemUgc3R5bGUuIFRoaXMgc3BlY2lmaWVzIGlmIGEgY2VsbCBzaG91bGQgYmUKKwkgKiByZXNpemVkIGF1dG9tYXRpY2FsbHkgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIDAgb3IgMS4KKwkgKiBEZWZhdWx0IGlzIDAuIFNlZSA8bXhHcmFwaC5pc0F1dG9TaXplQ2VsbD4uIFRoaXMgaXMgbm9ybWFsbHkgY29tYmluZWQgd2l0aAorCSAqIDxTVFlMRV9SRVNJWkFCTEU+IHRvIGRpc2FibGUgbWFudWFsIHNpemluZy4gVmFsdWUgaXMgImF1dG9zaXplIi4KKwkgKi8KKwlTVFlMRV9BVVRPU0laRTogJ2F1dG9zaXplJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9GT0xEQUJMRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGZvbGRhYmxlIHN0eWxlLiBUaGlzIHNwZWNpZmllcyBpZiBhIGNlbGwgaXMgZm9sZGFibGUKKwkgKiB1c2luZyBhIGZvbGRpbmcgaWNvbi4gUG9zc2libGUgdmFsdWVzIGFyZSAwIG9yIDEuIERlZmF1bHQgaXMgMS4gU2VlCisJICogPG14R3JhcGguaXNDZWxsRm9sZGFibGU+LiBWYWx1ZSBpcyAiZm9sZGFibGUiLgorCSAqLworCVNUWUxFX0ZPTERBQkxFOiAnZm9sZGFibGUnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0VESVRBQkxFCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgZWRpdGFibGUgc3R5bGUuIFRoaXMgc3BlY2lmaWVzIGlmIHRoZSB2YWx1ZSBvZgorCSAqIGEgY2VsbCBjYW4gYmUgZWRpdGVkIHVzaW5nIHRoZSBpbi1wbGFjZSBlZGl0b3IuIFBvc3NpYmxlIHZhbHVlcyBhcmUgMCBvcgorCSAqIDEuIERlZmF1bHQgaXMgMS4gU2VlIDxteEdyYXBoLmlzQ2VsbEVkaXRhYmxlPi4gVmFsdWUgaXMgImVkaXRhYmxlIi4KKwkgKi8KKwlTVFlMRV9FRElUQUJMRTogJ2VkaXRhYmxlJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9CRU5EQUJMRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGJlbmRhYmxlIHN0eWxlLiBUaGlzIHNwZWNpZmllcyBpZiB0aGUgY29udHJvbAorCSAqIHBvaW50cyBvZiBhbiBlZGdlIGNhbiBiZSBtb3ZlZC4gUG9zc2libGUgdmFsdWVzIGFyZSAwIG9yIDEuIERlZmF1bHQgaXMKKwkgKiAxLiBTZWUgPG14R3JhcGguaXNDZWxsQmVuZGFibGU+LiBWYWx1ZSBpcyAiYmVuZGFibGUiLgorCSAqLworCVNUWUxFX0JFTkRBQkxFOiAnYmVuZGFibGUnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX01PVkFCTEUKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBtb3ZhYmxlIHN0eWxlLiBUaGlzIHNwZWNpZmllcyBpZiBhIGNlbGwgY2FuCisJICogYmUgbW92ZWQuIFBvc3NpYmxlIHZhbHVlcyBhcmUgMCBvciAxLiBEZWZhdWx0IGlzIDEuIFNlZQorCSAqIDxteEdyYXBoLmlzQ2VsbE1vdmFibGU+LiBWYWx1ZSBpcyAibW92YWJsZSIuCisJICovCisJU1RZTEVfTU9WQUJMRTogJ21vdmFibGUnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1JFU0laQUJMRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIHJlc2l6YWJsZSBzdHlsZS4gVGhpcyBzcGVjaWZpZXMgaWYgYSBjZWxsIGNhbgorCSAqIGJlIHJlc2l6ZWQuIFBvc3NpYmxlIHZhbHVlcyBhcmUgMCBvciAxLiBEZWZhdWx0IGlzIDEuIFNlZQorCSAqIDxteEdyYXBoLmlzQ2VsbFJlc2l6YWJsZT4uIFZhbHVlIGlzICJyZXNpemFibGUiLgorCSAqLworCVNUWUxFX1JFU0laQUJMRTogJ3Jlc2l6YWJsZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfUkVTSVpFX1dJRFRICisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgcmVzaXplV2lkdGggc3R5bGUuIFRoaXMgc3BlY2lmaWVzIGlmIGEgY2VsbCdzCisJICogd2lkdGggaXMgcmVzaXplZCBpZiB0aGUgcGFyZW50IGlzIHJlc2l6ZWQuIElmIHRoaXMgaXMgMSB0aGVuIHRoZSB3aWR0aAorCSAqIHdpbGwgYmUgcmVzaXplZCBldmVuIGlmIHRoZSBjZWxsJ3MgZ2VvbWV0cnkgaXMgcmVsYXRpdmUuIElmIHRoaXMgaXMgMAorCSAqIHRoZW4gdGhlIGNlbGwncyB3aWR0aCB3aWxsIG5vdCBiZSByZXNpemVkLiBEZWZhdWx0IGlzIG5vdCBkZWZpbmVkLiBWYWx1ZQorCSAqIGlzICJyZXNpemVXaWR0aCIuCisJICovCisJU1RZTEVfUkVTSVpFX1dJRFRIOiAncmVzaXplV2lkdGgnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1JFU0laRV9XSURUSAorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIHJlc2l6ZUhlaWdodCBzdHlsZS4gVGhpcyBzcGVjaWZpZXMgaWYgYSBjZWxsJ3MKKwkgKiBoZWlnaHQgaWYgcmVzaXplIGlmIHRoZSBwYXJlbnQgaXMgcmVzaXplZC4gSWYgdGhpcyBpcyAxIHRoZW4gdGhlIGhlaWdodAorCSAqIHdpbGwgYmUgcmVzaXplZCBldmVuIGlmIHRoZSBjZWxsJ3MgZ2VvbWV0cnkgaXMgcmVsYXRpdmUuIElmIHRoaXMgaXMgMAorCSAqIHRoZW4gdGhlIGNlbGwncyBoZWlnaHQgd2lsbCBub3QgYmUgcmVzaXplZC4gRGVmYXVsdCBpcyBub3QgZGVmaW5lZC4gVmFsdWUKKwkgKiBpcyAicmVzaXplSGVpZ2h0Ii4KKwkgKi8KKwlTVFlMRV9SRVNJWkVfSEVJR0hUOiAncmVzaXplSGVpZ2h0JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9ST1RBVEFCTEUKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSByb3RhdGFibGUgc3R5bGUuIFRoaXMgc3BlY2lmaWVzIGlmIGEgY2VsbCBjYW4KKwkgKiBiZSByb3RhdGVkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIDAgb3IgMS4gRGVmYXVsdCBpcyAxLiBTZWUKKwkgKiA8bXhHcmFwaC5pc0NlbGxSb3RhdGFibGU+LiBWYWx1ZSBpcyAicm90YXRhYmxlIi4KKwkgKi8KKwlTVFlMRV9ST1RBVEFCTEU6ICdyb3RhdGFibGUnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX0NMT05FQUJMRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGNsb25lYWJsZSBzdHlsZS4gVGhpcyBzcGVjaWZpZXMgaWYgYSBjZWxsIGNhbgorCSAqIGJlIGNsb25lZC4gUG9zc2libGUgdmFsdWVzIGFyZSAwIG9yIDEuIERlZmF1bHQgaXMgMS4gU2VlCisJICogPG14R3JhcGguaXNDZWxsQ2xvbmVhYmxlPi4gVmFsdWUgaXMgImNsb25lYWJsZSIuCisJICovCisJU1RZTEVfQ0xPTkVBQkxFOiAnY2xvbmVhYmxlJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9ERUxFVEFCTEUKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBkZWxldGFibGUgc3R5bGUuIFRoaXMgc3BlY2lmaWVzIGlmIGEgY2VsbCBjYW4gYmUKKwkgKiBkZWxldGVkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIDAgb3IgMS4gRGVmYXVsdCBpcyAxLiBTZWUKKwkgKiA8bXhHcmFwaC5pc0NlbGxEZWxldGFibGU+LiBWYWx1ZSBpcyAiZGVsZXRhYmxlIi4KKwkgKi8KKwlTVFlMRV9ERUxFVEFCTEU6ICdkZWxldGFibGUnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1NIQVBFCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgc2hhcGUuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYWxsIGNvbnN0YW50cyB3aXRoCisJICogYSBTSEFQRS1wcmVmaXggb3IgYW55IG5ld2x5IGRlZmluZWQgc2hhcGUgbmFtZXMuIFZhbHVlIGlzICJzaGFwZSIuCisJICovCisJU1RZTEVfU0hBUEU6ICdzaGFwZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfRURHRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGVkZ2Ugc3R5bGUuIFBvc3NpYmxlIHZhbHVlcyBhcmUgdGhlIGZ1bmN0aW9ucworCSAqIGRlZmluZWQgaW4gPG14RWRnZVN0eWxlPi4gVmFsdWUgaXMgImVkZ2VTdHlsZSIuCisJICovCisJU1RZTEVfRURHRTogJ2VkZ2VTdHlsZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfSkVUVFlfU0laRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGpldHR5IHNpemUgaW4gPG14RWRnZVN0eWxlLk9ydGhDb25uZWN0b3I+LgorCSAqIERlZmF1bHQgaXMgMTAuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYWxsIG51bWVyaWMgdmFsdWVzIG9yICJhdXRvIi4KKwkgKiBWYWx1ZSBpcyAiamV0dHlTaXplIi4KKwkgKi8KKwlTVFlMRV9KRVRUWV9TSVpFOiAnamV0dHlTaXplJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVFlMRV9TT1VSQ0VfSkVUVFlfU0laRQorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGpldHR5IHNpemUgaW4gPG14RWRnZVN0eWxlLk9ydGhDb25uZWN0b3I+LgorCSAqIERlZmF1bHQgaXMgMTAuIFBvc3NpYmxlIHZhbHVlcyBhcmUgbnVtZXJpYyB2YWx1ZXMgb3IgImF1dG8iLiBUaGlzIGhhcworCSAqIHByZWNlZGVuY2Ugb3ZlciA8U1RZTEVfSkVUVFlfU0laRT4uIFZhbHVlIGlzICJzb3VyY2VKZXR0eVNpemUiLgorCSAqLworCVNUWUxFX1NPVVJDRV9KRVRUWV9TSVpFOiAnc291cmNlSmV0dHlTaXplJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiB0YXJnZXRKZXR0eVNpemUKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBqZXR0eSBzaXplIGluIDxteEVkZ2VTdHlsZS5PcnRoQ29ubmVjdG9yPi4KKwkgKiBEZWZhdWx0IGlzIDEwLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIG51bWVyaWMgdmFsdWVzIG9yICJhdXRvIi4gVGhpcyBoYXMKKwkgKiBwcmVjZWRlbmNlIG92ZXIgPFNUWUxFX0pFVFRZX1NJWkU+LiBWYWx1ZSBpcyAidGFyZ2V0SmV0dHlTaXplIi4KKwkgKi8KKwlTVFlMRV9UQVJHRVRfSkVUVFlfU0laRTogJ3RhcmdldEpldHR5U2l6ZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfTE9PUAorCSAqIAorCSAqIERlZmluZXMgdGhlIGtleSBmb3IgdGhlIGxvb3Agc3R5bGUuIFBvc3NpYmxlIHZhbHVlcyBhcmUgdGhlIGZ1bmN0aW9ucworCSAqIGRlZmluZWQgaW4gPG14RWRnZVN0eWxlPi4gVmFsdWUgaXMgImxvb3BTdHlsZSIuCisJICovCisJU1RZTEVfTE9PUDogJ2xvb3BTdHlsZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RZTEVfT1JUSE9HT05BTF9MT09QCisJICogCisJICogRGVmaW5lcyB0aGUga2V5IGZvciB0aGUgb3J0aG9nb25hbCBsb29wIHN0eWxlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIDAgYW5kCisJICogMS4gRGVmYXVsdCBpcyAwLiBWYWx1ZSBpcyAib3J0aG9nb25hbExvb3AiLiBVc2UgdGhpcyBzdHlsZSB0byBzcGVjaWZ5CisJICogaWYgbG9vcHMgc2hvdWxkIGJlIHJvdXRlZCB1c2luZyBhbiBvcnRob2dvbmFsIHJvdXRlci4gQ3VycmVudGx5LCB0aGlzCisJICogdXNlcyA8bXhFZGdlU3R5bGUuT3J0aENvbm5lY3Rvcj4gYnV0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBhIGRlZGljYXRlZAorCSAqIG9ydGhvZ29uYWwgbG9vcCByb3V0ZXIgaW4gbGF0ZXIgcmVsZWFzZXMuCisJICovCisJU1RZTEVfT1JUSE9HT05BTF9MT09QOiAnb3J0aG9nb25hbExvb3AnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1JPVVRJTkdfQ0VOVEVSX1gKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBob3Jpem9udGFsIHJvdXRpbmcgY2VudGVyLiBQb3NzaWJsZSB2YWx1ZXMgYXJlCisJICogYmV0d2VlbiAtMC41IGFuZCAwLjUuIFRoaXMgaXMgdGhlIHJlbGF0aXZlIG9mZnNldCBmcm9tIHRoZSBjZW50ZXIgdXNlZAorCSAqIGZvciBjb25uZWN0aW5nIGVkZ2VzLiBUaGUgdHlwZSBvZiB0aGlzIHZhbHVlIGlzIG51bWVyaWMuIFZhbHVlIGlzCisJICogInJvdXRpbmdDZW50ZXJYIi4KKwkgKi8KKwlTVFlMRV9ST1VUSU5HX0NFTlRFUl9YOiAncm91dGluZ0NlbnRlclgnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNUWUxFX1JPVVRJTkdfQ0VOVEVSX1kKKwkgKiAKKwkgKiBEZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSB2ZXJ0aWNhbCByb3V0aW5nIGNlbnRlci4gUG9zc2libGUgdmFsdWVzIGFyZQorCSAqIGJldHdlZW4gLTAuNSBhbmQgMC41LiBUaGlzIGlzIHRoZSByZWxhdGl2ZSBvZmZzZXQgZnJvbSB0aGUgY2VudGVyIHVzZWQKKwkgKiBmb3IgY29ubmVjdGluZyBlZGdlcy4gVGhlIHR5cGUgb2YgdGhpcyB2YWx1ZSBpcyBudW1lcmljLiBWYWx1ZSBpcworCSAqICJyb3V0aW5nQ2VudGVyWSIuCisJICovCisJU1RZTEVfUk9VVElOR19DRU5URVJfWTogJ3JvdXRpbmdDZW50ZXJZJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBGT05UX0JPTEQKKwkgKiAKKwkgKiBDb25zdGFudCBmb3IgYm9sZCBmb250cy4gRGVmYXVsdCBpcyAxLgorCSAqLworCUZPTlRfQk9MRDogMSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBGT05UX0lUQUxJQworCSAqIAorCSAqIENvbnN0YW50IGZvciBpdGFsaWMgZm9udHMuIERlZmF1bHQgaXMgMi4KKwkgKi8KKwlGT05UX0lUQUxJQzogMiwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBGT05UX1VOREVSTElORQorCSAqIAorCSAqIENvbnN0YW50IGZvciB1bmRlcmxpbmVkIGZvbnRzLiBEZWZhdWx0IGlzIDQuCisJICovCisJRk9OVF9VTkRFUkxJTkU6IDQsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU0hBUEVfUkVDVEFOR0xFCisJICogCisJICogTmFtZSB1bmRlciB3aGljaCA8bXhSZWN0YW5nbGVTaGFwZT4gaXMgcmVnaXN0ZXJlZCBpbiA8bXhDZWxsUmVuZGVyZXI+LgorCSAqIERlZmF1bHQgaXMgcmVjdGFuZ2xlLgorCSAqLworCVNIQVBFX1JFQ1RBTkdMRTogJ3JlY3RhbmdsZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU0hBUEVfRUxMSVBTRQorCSAqIAorCSAqIE5hbWUgdW5kZXIgd2hpY2ggPG14RWxsaXBzZT4gaXMgcmVnaXN0ZXJlZCBpbiA8bXhDZWxsUmVuZGVyZXI+LgorCSAqIERlZmF1bHQgaXMgZWxsaXBzZS4KKwkgKi8KKwlTSEFQRV9FTExJUFNFOiAnZWxsaXBzZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU0hBUEVfRE9VQkxFX0VMTElQU0UKKwkgKiAKKwkgKiBOYW1lIHVuZGVyIHdoaWNoIDxteERvdWJsZUVsbGlwc2U+IGlzIHJlZ2lzdGVyZWQgaW4gPG14Q2VsbFJlbmRlcmVyPi4KKwkgKiBEZWZhdWx0IGlzIGRvdWJsZUVsbGlwc2UuCisJICovCisJU0hBUEVfRE9VQkxFX0VMTElQU0U6ICdkb3VibGVFbGxpcHNlJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTSEFQRV9SSE9NQlVTCisJICogCisJICogTmFtZSB1bmRlciB3aGljaCA8bXhSaG9tYnVzPiBpcyByZWdpc3RlcmVkIGluIDxteENlbGxSZW5kZXJlcj4uCisJICogRGVmYXVsdCBpcyByaG9tYnVzLgorCSAqLworCVNIQVBFX1JIT01CVVM6ICdyaG9tYnVzJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTSEFQRV9MSU5FCisJICogCisJICogTmFtZSB1bmRlciB3aGljaCA8bXhMaW5lPiBpcyByZWdpc3RlcmVkIGluIDxteENlbGxSZW5kZXJlcj4uCisJICogRGVmYXVsdCBpcyBsaW5lLgorCSAqLworCVNIQVBFX0xJTkU6ICdsaW5lJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTSEFQRV9JTUFHRQorCSAqIAorCSAqIE5hbWUgdW5kZXIgd2hpY2ggPG14SW1hZ2VTaGFwZT4gaXMgcmVnaXN0ZXJlZCBpbiA8bXhDZWxsUmVuZGVyZXI+LgorCSAqIERlZmF1bHQgaXMgaW1hZ2UuCisJICovCisJU0hBUEVfSU1BR0U6ICdpbWFnZScsCisJCisJLyoqCisJICogVmFyaWFibGU6IFNIQVBFX0FSUk9XCisJICogCisJICogTmFtZSB1bmRlciB3aGljaCA8bXhBcnJvdz4gaXMgcmVnaXN0ZXJlZCBpbiA8bXhDZWxsUmVuZGVyZXI+LgorCSAqIERlZmF1bHQgaXMgYXJyb3cuCisJICovCisJU0hBUEVfQVJST1c6ICdhcnJvdycsCisJCisJLyoqCisJICogVmFyaWFibGU6IFNIQVBFX0FSUk9XX0NPTk5FQ1RPUgorCSAqIAorCSAqIE5hbWUgdW5kZXIgd2hpY2ggPG14QXJyb3dDb25uZWN0b3I+IGlzIHJlZ2lzdGVyZWQgaW4gPG14Q2VsbFJlbmRlcmVyPi4KKwkgKiBEZWZhdWx0IGlzIGFycm93Q29ubmVjdG9yLgorCSAqLworCVNIQVBFX0FSUk9XX0NPTk5FQ1RPUjogJ2Fycm93Q29ubmVjdG9yJywKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogU0hBUEVfTEFCRUwKKwkgKiAKKwkgKiBOYW1lIHVuZGVyIHdoaWNoIDxteExhYmVsPiBpcyByZWdpc3RlcmVkIGluIDxteENlbGxSZW5kZXJlcj4uCisJICogRGVmYXVsdCBpcyBsYWJlbC4KKwkgKi8KKwlTSEFQRV9MQUJFTDogJ2xhYmVsJywKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogU0hBUEVfQ1lMSU5ERVIKKwkgKiAKKwkgKiBOYW1lIHVuZGVyIHdoaWNoIDxteEN5bGluZGVyPiBpcyByZWdpc3RlcmVkIGluIDxteENlbGxSZW5kZXJlcj4uCisJICogRGVmYXVsdCBpcyBjeWxpbmRlci4KKwkgKi8KKwlTSEFQRV9DWUxJTkRFUjogJ2N5bGluZGVyJywKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogU0hBUEVfU1dJTUxBTkUKKwkgKiAKKwkgKiBOYW1lIHVuZGVyIHdoaWNoIDxteFN3aW1sYW5lPiBpcyByZWdpc3RlcmVkIGluIDxteENlbGxSZW5kZXJlcj4uCisJICogRGVmYXVsdCBpcyBzd2ltbGFuZS4KKwkgKi8KKwlTSEFQRV9TV0lNTEFORTogJ3N3aW1sYW5lJywKKwkJCisJLyoqCisJICogVmFyaWFibGU6IFNIQVBFX0NPTk5FQ1RPUgorCSAqIAorCSAqIE5hbWUgdW5kZXIgd2hpY2ggPG14Q29ubmVjdG9yPiBpcyByZWdpc3RlcmVkIGluIDxteENlbGxSZW5kZXJlcj4uCisJICogRGVmYXVsdCBpcyBjb25uZWN0b3IuCisJICovCisJU0hBUEVfQ09OTkVDVE9SOiAnY29ubmVjdG9yJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTSEFQRV9BQ1RPUgorCSAqIAorCSAqIE5hbWUgdW5kZXIgd2hpY2ggPG14QWN0b3I+IGlzIHJlZ2lzdGVyZWQgaW4gPG14Q2VsbFJlbmRlcmVyPi4KKwkgKiBEZWZhdWx0IGlzIGFjdG9yLgorCSAqLworCVNIQVBFX0FDVE9SOiAnYWN0b3InLAorCQkKKwkvKioKKwkgKiBWYXJpYWJsZTogU0hBUEVfQ0xPVUQKKwkgKiAKKwkgKiBOYW1lIHVuZGVyIHdoaWNoIDxteENsb3VkPiBpcyByZWdpc3RlcmVkIGluIDxteENlbGxSZW5kZXJlcj4uCisJICogRGVmYXVsdCBpcyBjbG91ZC4KKwkgKi8KKwlTSEFQRV9DTE9VRDogJ2Nsb3VkJywKKwkJCisJLyoqCisJICogVmFyaWFibGU6IFNIQVBFX1RSSUFOR0xFCisJICogCisJICogTmFtZSB1bmRlciB3aGljaCA8bXhUcmlhbmdsZT4gaXMgcmVnaXN0ZXJlZCBpbiA8bXhDZWxsUmVuZGVyZXI+LgorCSAqIERlZmF1bHQgaXMgdHJpYW5nbGUuCisJICovCisJU0hBUEVfVFJJQU5HTEU6ICd0cmlhbmdsZScsCisJCQorCS8qKgorCSAqIFZhcmlhYmxlOiBTSEFQRV9IRVhBR09OCisJICogCisJICogTmFtZSB1bmRlciB3aGljaCA8bXhIZXhhZ29uPiBpcyByZWdpc3RlcmVkIGluIDxteENlbGxSZW5kZXJlcj4uCisJICogRGVmYXVsdCBpcyBoZXhhZ29uLgorCSAqLworCVNIQVBFX0hFWEFHT046ICdoZXhhZ29uJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBUlJPV19DTEFTU0lDCisJICogCisJICogQ29uc3RhbnQgZm9yIGNsYXNzaWMgYXJyb3cgbWFya2Vycy4KKwkgKi8KKwlBUlJPV19DTEFTU0lDOiAnY2xhc3NpYycsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogQVJST1dfQ0xBU1NJQ19USElOCisJICogCisJICogQ29uc3RhbnQgZm9yIHRoaW4gY2xhc3NpYyBhcnJvdyBtYXJrZXJzLgorCSAqLworCUFSUk9XX0NMQVNTSUNfVEhJTjogJ2NsYXNzaWNUaGluJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBUlJPV19CTE9DSworCSAqIAorCSAqIENvbnN0YW50IGZvciBibG9jayBhcnJvdyBtYXJrZXJzLgorCSAqLworCUFSUk9XX0JMT0NLOiAnYmxvY2snLAorCisJLyoqCisJICogVmFyaWFibGU6IEFSUk9XX0JMT0NLX1RISU4KKwkgKiAKKwkgKiBDb25zdGFudCBmb3IgdGhpbiBibG9jayBhcnJvdyBtYXJrZXJzLgorCSAqLworCUFSUk9XX0JMT0NLX1RISU46ICdibG9ja1RoaW4nLAorCisJLyoqCisJICogVmFyaWFibGU6IEFSUk9XX09QRU4KKwkgKiAKKwkgKiBDb25zdGFudCBmb3Igb3BlbiBhcnJvdyBtYXJrZXJzLgorCSAqLworCUFSUk9XX09QRU46ICdvcGVuJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBUlJPV19PUEVOX1RISU4KKwkgKiAKKwkgKiBDb25zdGFudCBmb3IgdGhpbiBvcGVuIGFycm93IG1hcmtlcnMuCisJICovCisJQVJST1dfT1BFTl9USElOOiAnb3BlblRoaW4nLAorCisJLyoqCisJICogVmFyaWFibGU6IEFSUk9XX09WQUwKKwkgKiAKKwkgKiBDb25zdGFudCBmb3Igb3ZhbCBhcnJvdyBtYXJrZXJzLgorCSAqLworCUFSUk9XX09WQUw6ICdvdmFsJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBUlJPV19ESUFNT05ECisJICogCisJICogQ29uc3RhbnQgZm9yIGRpYW1vbmQgYXJyb3cgbWFya2Vycy4KKwkgKi8KKwlBUlJPV19ESUFNT05EOiAnZGlhbW9uZCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogQVJST1dfRElBTU9ORF9USElOCisJICogCisJICogQ29uc3RhbnQgZm9yIHRoaW4gZGlhbW9uZCBhcnJvdyBtYXJrZXJzLgorCSAqLworCUFSUk9XX0RJQU1PTkRfVEhJTjogJ2RpYW1vbmRUaGluJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBTElHTl9MRUZUCisJICogCisJICogQ29uc3RhbnQgZm9yIGxlZnQgaG9yaXpvbnRhbCBhbGlnbm1lbnQuIERlZmF1bHQgaXMgbGVmdC4KKwkgKi8KKwlBTElHTl9MRUZUOiAnbGVmdCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogQUxJR05fQ0VOVEVSCisJICogCisJICogQ29uc3RhbnQgZm9yIGNlbnRlciBob3Jpem9udGFsIGFsaWdubWVudC4gRGVmYXVsdCBpcyBjZW50ZXIuCisJICovCisJQUxJR05fQ0VOVEVSOiAnY2VudGVyJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBTElHTl9SSUdIVAorCSAqIAorCSAqIENvbnN0YW50IGZvciByaWdodCBob3Jpem9udGFsIGFsaWdubWVudC4gRGVmYXVsdCBpcyByaWdodC4KKwkgKi8KKwlBTElHTl9SSUdIVDogJ3JpZ2h0JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBTElHTl9UT1AKKwkgKiAKKwkgKiBDb25zdGFudCBmb3IgdG9wIHZlcnRpY2FsIGFsaWdubWVudC4gRGVmYXVsdCBpcyB0b3AuCisJICovCisJQUxJR05fVE9QOiAndG9wJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBTElHTl9NSURETEUKKwkgKiAKKwkgKiBDb25zdGFudCBmb3IgbWlkZGxlIHZlcnRpY2FsIGFsaWdubWVudC4gRGVmYXVsdCBpcyBtaWRkbGUuCisJICovCisJQUxJR05fTUlERExFOiAnbWlkZGxlJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBTElHTl9CT1RUT00KKwkgKiAKKwkgKiBDb25zdGFudCBmb3IgYm90dG9tIHZlcnRpY2FsIGFsaWdubWVudC4gRGVmYXVsdCBpcyBib3R0b20uCisJICovCisJQUxJR05fQk9UVE9NOiAnYm90dG9tJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBESVJFQ1RJT05fTk9SVEgKKwkgKiAKKwkgKiBDb25zdGFudCBmb3IgZGlyZWN0aW9uIG5vcnRoLiBEZWZhdWx0IGlzIG5vcnRoLgorCSAqLworCURJUkVDVElPTl9OT1JUSDogJ25vcnRoJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBESVJFQ1RJT05fU09VVEgKKwkgKiAKKwkgKiBDb25zdGFudCBmb3IgZGlyZWN0aW9uIHNvdXRoLiBEZWZhdWx0IGlzIHNvdXRoLgorCSAqLworCURJUkVDVElPTl9TT1VUSDogJ3NvdXRoJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBESVJFQ1RJT05fRUFTVAorCSAqIAorCSAqIENvbnN0YW50IGZvciBkaXJlY3Rpb24gZWFzdC4gRGVmYXVsdCBpcyBlYXN0LgorCSAqLworCURJUkVDVElPTl9FQVNUOiAnZWFzdCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRElSRUNUSU9OX1dFU1QKKwkgKiAKKwkgKiBDb25zdGFudCBmb3IgZGlyZWN0aW9uIHdlc3QuIERlZmF1bHQgaXMgd2VzdC4KKwkgKi8KKwlESVJFQ1RJT05fV0VTVDogJ3dlc3QnLAorCisJLyoqCisJICogVmFyaWFibGU6IFRFWFRfRElSRUNUSU9OX0RFRkFVTFQKKwkgKiAKKwkgKiBDb25zdGFudCBmb3IgdGV4dCBkaXJlY3Rpb24gZGVmYXVsdC4gRGVmYXVsdCBpcyBhbiBlbXB0eSBzdHJpbmcuIFVzZQorCSAqIHRoaXMgdmFsdWUgdG8gdXNlIHRoZSBkZWZhdWx0IHRleHQgZGlyZWN0aW9uIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAKKwkgKi8KKwlURVhUX0RJUkVDVElPTl9ERUZBVUxUOiAnJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBURVhUX0RJUkVDVElPTl9BVVRPCisJICogCisJICogQ29uc3RhbnQgZm9yIHRleHQgZGlyZWN0aW9uIGF1dG9tYXRpYy4gRGVmYXVsdCBpcyBhdXRvLiBVc2UgdGhpcyB2YWx1ZQorCSAqIHRvIGZpbmQgdGhlIGRpcmVjdGlvbiBmb3IgYSBnaXZlbiB0ZXh0IHdpdGggPG14VGV4dC5nZXRBdXRvRGlyZWN0aW9uPi4gCisJICovCisJVEVYVF9ESVJFQ1RJT05fQVVUTzogJ2F1dG8nLAorCisJLyoqCisJICogVmFyaWFibGU6IFRFWFRfRElSRUNUSU9OX0xUUgorCSAqIAorCSAqIENvbnN0YW50IGZvciB0ZXh0IGRpcmVjdGlvbiBsZWZ0IHRvIHJpZ2h0LiBEZWZhdWx0IGlzIGx0ci4gVXNlIHRoaXMKKwkgKiB2YWx1ZSBmb3IgbGVmdCB0byByaWdodCB0ZXh0IGRpcmVjdGlvbi4KKwkgKi8KKwlURVhUX0RJUkVDVElPTl9MVFI6ICdsdHInLAorCisJLyoqCisJICogVmFyaWFibGU6IFRFWFRfRElSRUNUSU9OX1JUTAorCSAqIAorCSAqIENvbnN0YW50IGZvciB0ZXh0IGRpcmVjdGlvbiByaWdodCB0byBsZWZ0LiBEZWZhdWx0IGlzIHJ0bC4gVXNlIHRoaXMKKwkgKiB2YWx1ZSBmb3IgcmlnaHQgdG8gbGVmdCB0ZXh0IGRpcmVjdGlvbi4KKwkgKi8KKwlURVhUX0RJUkVDVElPTl9SVEw6ICdydGwnLAorCisJLyoqCisJICogVmFyaWFibGU6IERJUkVDVElPTl9NQVNLX05PTkUKKwkgKiAKKwkgKiBDb25zdGFudCBmb3Igbm8gZGlyZWN0aW9uLgorCSAqLworCURJUkVDVElPTl9NQVNLX05PTkU6IDAsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRElSRUNUSU9OX01BU0tfV0VTVAorCSAqIAorCSAqIEJpdHdpc2UgbWFzayBmb3Igd2VzdCBkaXJlY3Rpb24uCisJICovCisJRElSRUNUSU9OX01BU0tfV0VTVDogMSwKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogRElSRUNUSU9OX01BU0tfTk9SVEgKKwkgKiAKKwkgKiBCaXR3aXNlIG1hc2sgZm9yIG5vcnRoIGRpcmVjdGlvbi4KKwkgKi8KKwlESVJFQ1RJT05fTUFTS19OT1JUSDogMiwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBESVJFQ1RJT05fTUFTS19TT1VUSAorCSAqIAorCSAqIEJpdHdpc2UgbWFzayBmb3Igc291dGggZGlyZWN0aW9uLgorCSAqLworCURJUkVDVElPTl9NQVNLX1NPVVRIOiA0LAorCisJLyoqCisJICogVmFyaWFibGU6IERJUkVDVElPTl9NQVNLX0VBU1QKKwkgKiAKKwkgKiBCaXR3aXNlIG1hc2sgZm9yIGVhc3QgZGlyZWN0aW9uLgorCSAqLworCURJUkVDVElPTl9NQVNLX0VBU1Q6IDgsCisJCisJLyoqCisJICogVmFyaWFibGU6IERJUkVDVElPTl9NQVNLX0FMTAorCSAqIAorCSAqIEJpdHdpc2UgbWFzayBmb3IgYWxsIGRpcmVjdGlvbnMuCisJICovCisJRElSRUNUSU9OX01BU0tfQUxMOiAxNSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBFTEJPV19WRVJUSUNBTAorCSAqIAorCSAqIENvbnN0YW50IGZvciBlbGJvdyB2ZXJ0aWNhbC4gRGVmYXVsdCBpcyBob3Jpem9udGFsLgorCSAqLworCUVMQk9XX1ZFUlRJQ0FMOiAndmVydGljYWwnLAorCisJLyoqCisJICogVmFyaWFibGU6IEVMQk9XX0hPUklaT05UQUwKKwkgKiAKKwkgKiBDb25zdGFudCBmb3IgZWxib3cgaG9yaXpvbnRhbC4gRGVmYXVsdCBpcyBob3Jpem9udGFsLgorCSAqLworCUVMQk9XX0hPUklaT05UQUw6ICdob3Jpem9udGFsJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBFREdFU1RZTEVfRUxCT1cKKwkgKiAKKwkgKiBOYW1lIG9mIHRoZSBlbGJvdyBlZGdlIHN0eWxlLiBDYW4gYmUgdXNlZCBhcyBhIHN0cmluZyB2YWx1ZQorCSAqIGZvciB0aGUgU1RZTEVfRURHRSBzdHlsZS4KKwkgKi8KKwlFREdFU1RZTEVfRUxCT1c6ICdlbGJvd0VkZ2VTdHlsZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRURHRVNUWUxFX0VOVElUWV9SRUxBVElPTgorCSAqIAorCSAqIE5hbWUgb2YgdGhlIGVudGl0eSByZWxhdGlvbiBlZGdlIHN0eWxlLiBDYW4gYmUgdXNlZCBhcyBhIHN0cmluZyB2YWx1ZQorCSAqIGZvciB0aGUgU1RZTEVfRURHRSBzdHlsZS4KKwkgKi8KKwlFREdFU1RZTEVfRU5USVRZX1JFTEFUSU9OOiAnZW50aXR5UmVsYXRpb25FZGdlU3R5bGUnLAorCisJLyoqCisJICogVmFyaWFibGU6IEVER0VTVFlMRV9MT09QCisJICogCisJICogTmFtZSBvZiB0aGUgbG9vcCBlZGdlIHN0eWxlLiBDYW4gYmUgdXNlZCBhcyBhIHN0cmluZyB2YWx1ZQorCSAqIGZvciB0aGUgU1RZTEVfRURHRSBzdHlsZS4KKwkgKi8KKwlFREdFU1RZTEVfTE9PUDogJ2xvb3BFZGdlU3R5bGUnLAorCisJLyoqCisJICogVmFyaWFibGU6IEVER0VTVFlMRV9TSURFVE9TSURFCisJICogCisJICogTmFtZSBvZiB0aGUgc2lkZSB0byBzaWRlIGVkZ2Ugc3R5bGUuIENhbiBiZSB1c2VkIGFzIGEgc3RyaW5nIHZhbHVlCisJICogZm9yIHRoZSBTVFlMRV9FREdFIHN0eWxlLgorCSAqLworCUVER0VTVFlMRV9TSURFVE9TSURFOiAnc2lkZVRvU2lkZUVkZ2VTdHlsZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRURHRVNUWUxFX1RPUFRPQk9UVE9NCisJICogCisJICogTmFtZSBvZiB0aGUgdG9wIHRvIGJvdHRvbSBlZGdlIHN0eWxlLiBDYW4gYmUgdXNlZCBhcyBhIHN0cmluZyB2YWx1ZQorCSAqIGZvciB0aGUgU1RZTEVfRURHRSBzdHlsZS4KKwkgKi8KKwlFREdFU1RZTEVfVE9QVE9CT1RUT006ICd0b3BUb0JvdHRvbUVkZ2VTdHlsZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRURHRVNUWUxFX09SVEhPR09OQUwKKwkgKiAKKwkgKiBOYW1lIG9mIHRoZSBnZW5lcmljIG9ydGhvZ29uYWwgZWRnZSBzdHlsZS4gQ2FuIGJlIHVzZWQgYXMgYSBzdHJpbmcgdmFsdWUKKwkgKiBmb3IgdGhlIFNUWUxFX0VER0Ugc3R5bGUuCisJICovCisJRURHRVNUWUxFX09SVEhPR09OQUw6ICdvcnRob2dvbmFsRWRnZVN0eWxlJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBFREdFU1RZTEVfU0VHTUVOVAorCSAqIAorCSAqIE5hbWUgb2YgdGhlIGdlbmVyaWMgc2VnbWVudCBlZGdlIHN0eWxlLiBDYW4gYmUgdXNlZCBhcyBhIHN0cmluZyB2YWx1ZQorCSAqIGZvciB0aGUgU1RZTEVfRURHRSBzdHlsZS4KKwkgKi8KKwlFREdFU1RZTEVfU0VHTUVOVDogJ3NlZ21lbnRFZGdlU3R5bGUnLAorIAorCS8qKgorCSAqIFZhcmlhYmxlOiBQRVJJTUVURVJfRUxMSVBTRQorCSAqIAorCSAqIE5hbWUgb2YgdGhlIGVsbGlwc2UgcGVyaW1ldGVyLiBDYW4gYmUgdXNlZCBhcyBhIHN0cmluZyB2YWx1ZQorCSAqIGZvciB0aGUgU1RZTEVfUEVSSU1FVEVSIHN0eWxlLgorCSAqLworCVBFUklNRVRFUl9FTExJUFNFOiAnZWxsaXBzZVBlcmltZXRlcicsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogUEVSSU1FVEVSX1JFQ1RBTkdMRQorCSAqCisJICogTmFtZSBvZiB0aGUgcmVjdGFuZ2xlIHBlcmltZXRlci4gQ2FuIGJlIHVzZWQgYXMgYSBzdHJpbmcgdmFsdWUKKwkgKiBmb3IgdGhlIFNUWUxFX1BFUklNRVRFUiBzdHlsZS4KKwkgKi8KKwlQRVJJTUVURVJfUkVDVEFOR0xFOiAncmVjdGFuZ2xlUGVyaW1ldGVyJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBQRVJJTUVURVJfUkhPTUJVUworCSAqIAorCSAqIE5hbWUgb2YgdGhlIHJob21idXMgcGVyaW1ldGVyLiBDYW4gYmUgdXNlZCBhcyBhIHN0cmluZyB2YWx1ZQorCSAqIGZvciB0aGUgU1RZTEVfUEVSSU1FVEVSIHN0eWxlLgorCSAqLworCVBFUklNRVRFUl9SSE9NQlVTOiAncmhvbWJ1c1BlcmltZXRlcicsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogUEVSSU1FVEVSX0hFWEFHT04KKwkgKiAKKwkgKiBOYW1lIG9mIHRoZSBoZXhhZ29uIHBlcmltZXRlci4gQ2FuIGJlIHVzZWQgYXMgYSBzdHJpbmcgdmFsdWUgCisJICogZm9yIHRoZSBTVFlMRV9QRVJJTUVURVIgc3R5bGUuCisJICovCisJUEVSSU1FVEVSX0hFWEFHT046ICdoZXhhZ29uUGVyaW1ldGVyJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBQRVJJTUVURVJfVFJJQU5HTEUKKwkgKiAKKwkgKiBOYW1lIG9mIHRoZSB0cmlhbmdsZSBwZXJpbWV0ZXIuIENhbiBiZSB1c2VkIGFzIGEgc3RyaW5nIHZhbHVlCisJICogZm9yIHRoZSBTVFlMRV9QRVJJTUVURVIgc3R5bGUuCisJICovCisJUEVSSU1FVEVSX1RSSUFOR0xFOiAndHJpYW5nbGVQZXJpbWV0ZXInCisKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teERpY3Rpb25hcnkuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teERpY3Rpb25hcnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2ZGFmYQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214RGljdGlvbmFyeS5qcwpAQCAtMCwwICsxLDEzMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhEaWN0aW9uYXJ5CisgKgorICogQSB3cmFwcGVyIGNsYXNzIGZvciBhbiBhc3NvY2lhdGl2ZSBhcnJheSB3aXRoIG9iamVjdCBrZXlzLiBOb3RlOiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiB1c2VzIDxteE9iamVjdElkZW50aXRpeT4gdG8gdHVybiBvYmplY3Qga2V5cyBpbnRvIHN0cmluZ3MuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteEV2ZW50U291cmNlCisgKgorICogQ29uc3RydWN0cyBhIG5ldyBkaWN0aW9uYXJ5IHdoaWNoIGFsbG93cyBvYmplY3QgdG8gYmUgdXNlZCBhcyBrZXlzLgorICovCitmdW5jdGlvbiBteERpY3Rpb25hcnkoKQoreworCXRoaXMuY2xlYXIoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IG1hcAorICoKKyAqIFN0b3JlcyB0aGUgKGtleSwgdmFsdWUpIHBhaXJzIGluIHRoaXMgZGljdGlvbmFyeS4KKyAqLworbXhEaWN0aW9uYXJ5LnByb3RvdHlwZS5tYXAgPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiBjbGVhcgorICoKKyAqIENsZWFycyB0aGUgZGljdGlvbmFyeS4KKyAqLworbXhEaWN0aW9uYXJ5LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLm1hcCA9IHt9OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0CisgKgorICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkuCisgKi8KK214RGljdGlvbmFyeS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oa2V5KQoreworCXZhciBpZCA9IG14T2JqZWN0SWRlbnRpdHkuZ2V0KGtleSk7CisJCisJcmV0dXJuIHRoaXMubWFwW2lkXTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHB1dAorICoKKyAqIFN0b3JlcyB0aGUgdmFsdWUgdW5kZXIgdGhlIGdpdmVuIGtleSBhbmQgcmV0dXJucyB0aGUgcHJldmlvdXMKKyAqIHZhbHVlIGZvciB0aGF0IGtleS4KKyAqLworbXhEaWN0aW9uYXJ5LnByb3RvdHlwZS5wdXQgPSBmdW5jdGlvbihrZXksIHZhbHVlKQoreworCXZhciBpZCA9IG14T2JqZWN0SWRlbnRpdHkuZ2V0KGtleSk7CisJdmFyIHByZXZpb3VzID0gdGhpcy5tYXBbaWRdOworCXRoaXMubWFwW2lkXSA9IHZhbHVlOworCQorCXJldHVybiBwcmV2aW91czsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlbW92ZQorICoKKyAqIFJlbW92ZXMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGFuZCByZXR1cm5zIHRoZSB2YWx1ZSB0aGF0CisgKiBoYXMgYmVlbiByZW1vdmVkLgorICovCitteERpY3Rpb25hcnkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKGtleSkKK3sKKwl2YXIgaWQgPSBteE9iamVjdElkZW50aXR5LmdldChrZXkpOworCXZhciBwcmV2aW91cyA9IHRoaXMubWFwW2lkXTsKKwlkZWxldGUgdGhpcy5tYXBbaWRdOworCQorCXJldHVybiBwcmV2aW91czsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEtleXMKKyAqCisgKiBSZXR1cm5zIGFsbCBrZXlzIGFzIGFuIGFycmF5LgorICovCitteERpY3Rpb25hcnkucHJvdG90eXBlLmdldEtleXMgPSBmdW5jdGlvbigpCit7CisJdmFyIHJlc3VsdCA9IFtdOworCQorCWZvciAodmFyIGtleSBpbiB0aGlzLm1hcCkKKwl7CisJCXJlc3VsdC5wdXNoKGtleSk7CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRWYWx1ZXMKKyAqCisgKiBSZXR1cm5zIGFsbCB2YWx1ZXMgYXMgYW4gYXJyYXkuCisgKi8KK214RGljdGlvbmFyeS5wcm90b3R5cGUuZ2V0VmFsdWVzID0gZnVuY3Rpb24oKQoreworCXZhciByZXN1bHQgPSBbXTsKKwkKKwlmb3IgKHZhciBrZXkgaW4gdGhpcy5tYXApCisJeworCQlyZXN1bHQucHVzaCh0aGlzLm1hcFtrZXldKTsKKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHZpc2l0CisgKgorICogVmlzaXRzIGFsbCBlbnRyaWVzIGluIHRoZSBkaWN0aW9uYXJ5IHVzaW5nIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIHRoZQorICogZm9sbG93aW5nIHNpZ25hdHVyZTogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgd2hlcmUga2V5IGlzIGEgc3RyaW5nIGFuZAorICogdmFsdWUgaXMgYW4gb2JqZWN0LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2aXNpdG9yIC0gQSBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBrZXkgYW5kIHZhbHVlIGFzIGFyZ3VtZW50cy4KKyAqLworbXhEaWN0aW9uYXJ5LnByb3RvdHlwZS52aXNpdCA9IGZ1bmN0aW9uKHZpc2l0b3IpCit7CisJZm9yICh2YXIga2V5IGluIHRoaXMubWFwKQorCXsKKwkJdmlzaXRvcihrZXksIHRoaXMubWFwW2tleV0pOworCX0KK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teERpdlJlc2l6ZXIuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teERpdlJlc2l6ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4OTc5NgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214RGl2UmVzaXplci5qcwpAQCAtMCwwICsxLDE1MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhEaXZSZXNpemVyCisgKiAKKyAqIE1haW50YWlucyB0aGUgc2l6ZSBvZiBhIGRpdiBlbGVtZW50IGluIEludGVybmV0IEV4cGxvcmVyLiBUaGlzIGlzIGEKKyAqIHdvcmthcm91bmQgZm9yIHRoZSByaWdodCBhbmQgYm90dG9tIHN0eWxlIGJlaW5nIGlnbm9yZWQgaW4gSUUuCisgKiAKKyAqIElmIHlvdSBuZWVkIGEgZGl2IHRvIGNvdmVyIHRoZSBzY3JvbGx3aWR0aCBhbmQgLWhlaWdodCBvZiBhIGRvY3VtZW50LAorICogdGhlbiB5b3UgY2FuIHVzZSB0aGlzIGNsYXNzIGFzIGZvbGxvd3M6CisgKiAKKyAqIChjb2RlKQorICogdmFyIHJlc2l6ZXIgPSBuZXcgbXhEaXZSZXNpemVyKGJhY2tncm91bmQpOworICogcmVzaXplci5nZXREb2N1bWVudEhlaWdodCA9IGZ1bmN0aW9uKCkKKyAqIHsKKyAqICAgcmV0dXJuIGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0OworICogfQorICogcmVzaXplci5nZXREb2N1bWVudFdpZHRoID0gZnVuY3Rpb24oKQorICogeworICogICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxXaWR0aDsKKyAqIH0KKyAqIHJlc2l6ZXIucmVzaXplKCk7CisgKiAoZW5kKQorICogCisgKiBDb25zdHJ1Y3RvcjogbXhEaXZSZXNpemVyCisgKiAKKyAqIENvbnN0cnVjdHMgYW4gb2JqZWN0IHRoYXQgbWFpbnRhaW5zIHRoZSBzaXplIG9mIGEgZGl2CisgKiBlbGVtZW50IHdoZW4gdGhlIHdpbmRvdyBpcyBiZWluZyByZXNpemVkLiBUaGlzIGlzIG9ubHkKKyAqIHJlcXVpcmVkIGZvciBJbnRlcm5ldCBFeHBsb3JlciBhcyBpdCBpZ25vcmVzIHRoZSByZXNwZWN0aXZlCisgKiBzdHlsZXNoZWV0IGluZm9ybWF0aW9uIGZvciBESVYgZWxlbWVudHMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGRpdiAtIFJlZmVyZW5jZSB0byB0aGUgRE9NIG5vZGUgd2hvc2Ugc2l6ZSBzaG91bGQgYmUgbWFpbnRhaW5lZC4KKyAqIGNvbnRhaW5lciAtIE9wdGlvbmFsIENvbnRhaW5lciB0aGF0IGNvbnRhaW5zIHRoZSBkaXYuIERlZmF1bHQgaXMgdGhlCisgKiB3aW5kb3cuCisgKi8KK2Z1bmN0aW9uIG14RGl2UmVzaXplcihkaXYsIGNvbnRhaW5lcikKK3sKKwlpZiAoZGl2Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2RpdicpCisJeworCQlpZiAoY29udGFpbmVyID09IG51bGwpCisJCXsKKwkJCWNvbnRhaW5lciA9IHdpbmRvdzsKKwkJfQorCisJCXRoaXMuZGl2ID0gZGl2OworCQl2YXIgc3R5bGUgPSBteFV0aWxzLmdldEN1cnJlbnRTdHlsZShkaXYpOworCQkKKwkJaWYgKHN0eWxlICE9IG51bGwpCisJCXsKKwkJCXRoaXMucmVzaXplV2lkdGggPSBzdHlsZS53aWR0aCA9PSAnYXV0byc7CisJCQl0aGlzLnJlc2l6ZUhlaWdodCA9IHN0eWxlLmhlaWdodCA9PSAnYXV0byc7CisJCX0KKwkJCisJCW14RXZlbnQuYWRkTGlzdGVuZXIoY29udGFpbmVyLCAncmVzaXplJywKKwkJCW14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJCQl7CisJCQkJaWYgKCF0aGlzLmhhbmRsaW5nUmVzaXplKQorCQkJCXsKKwkJCQkJdGhpcy5oYW5kbGluZ1Jlc2l6ZSA9IHRydWU7CisJCQkJCXRoaXMucmVzaXplKCk7CisJCQkJCXRoaXMuaGFuZGxpbmdSZXNpemUgPSBmYWxzZTsKKwkJCQl9CisJCQl9KQorCQkpOworCQkKKwkJdGhpcy5yZXNpemUoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZXNpemVXaWR0aAorICogCisgKiBCb29sZWFuIHNwZWNpZnlpbmcgaWYgdGhlIHdpZHRoIHNob3VsZCBiZSB1cGRhdGVkLgorICovCitteERpdlJlc2l6ZXIucHJvdG90eXBlLnJlc2l6ZVdpZHRoID0gdHJ1ZTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVzaXplSGVpZ2h0CisgKiAKKyAqIEJvb2xlYW4gc3BlY2lmeWluZyBpZiB0aGUgaGVpZ2h0IHNob3VsZCBiZSB1cGRhdGVkLgorICovCitteERpdlJlc2l6ZXIucHJvdG90eXBlLnJlc2l6ZUhlaWdodCA9IHRydWU7CisKKy8qKgorICogRnVuY3Rpb246IGhhbmRsaW5nUmVzaXplCisgKiAKKyAqIEJvb2xlYW4gc3BlY2lmeWluZyBpZiB0aGUgd2lkdGggc2hvdWxkIGJlIHVwZGF0ZWQuCisgKi8KK214RGl2UmVzaXplci5wcm90b3R5cGUuaGFuZGxpbmdSZXNpemUgPSBmYWxzZTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVzaXplCisgKiAKKyAqIFVwZGF0ZXMgdGhlIHN0eWxlIG9mIHRoZSBESVYgYWZ0ZXIgdGhlIHdpbmRvdyBoYXMgYmVlbiByZXNpemVkLgorICovCitteERpdlJlc2l6ZXIucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgdyA9IHRoaXMuZ2V0RG9jdW1lbnRXaWR0aCgpOworCXZhciBoID0gdGhpcy5nZXREb2N1bWVudEhlaWdodCgpOworCisJdmFyIGwgPSBwYXJzZUludCh0aGlzLmRpdi5zdHlsZS5sZWZ0KTsKKwl2YXIgciA9IHBhcnNlSW50KHRoaXMuZGl2LnN0eWxlLnJpZ2h0KTsKKwl2YXIgdCA9IHBhcnNlSW50KHRoaXMuZGl2LnN0eWxlLnRvcCk7CisJdmFyIGIgPSBwYXJzZUludCh0aGlzLmRpdi5zdHlsZS5ib3R0b20pOworCQorCWlmICh0aGlzLnJlc2l6ZVdpZHRoICYmCisJCSFpc05hTihsKSAmJgorCQkhaXNOYU4ocikgJiYKKwkJbCA+PSAwICYmCisJCXIgPj0gMCAmJgorCQl3IC0gciAtIGwgPiAwKQorCXsKKwkJdGhpcy5kaXYuc3R5bGUud2lkdGggPSAodyAtIHIgLSBsKSsncHgnOworCX0KKwkKKwlpZiAodGhpcy5yZXNpemVIZWlnaHQgJiYKKwkJIWlzTmFOKHQpICYmCisJCSFpc05hTihiKSAmJgorCQl0ID49IDAgJiYKKwkJYiA+PSAwICYmCisJCWggLSB0IC0gYiA+IDApCisJeworCQl0aGlzLmRpdi5zdHlsZS5oZWlnaHQgPSAoaCAtIHQgLSBiKSsncHgnOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldERvY3VtZW50V2lkdGgKKyAqIAorICogSG9vayBmb3Igc3ViY2xhc3NlcnMgdG8gcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgZG9jdW1lbnQgKHdpdGhvdXQKKyAqIHNjcm9sbGJhcnMpLgorICovCitteERpdlJlc2l6ZXIucHJvdG90eXBlLmdldERvY3VtZW50V2lkdGggPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXREb2N1bWVudEhlaWdodAorICogCisgKiBIb29rIGZvciBzdWJjbGFzc2VycyB0byByZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgZG9jdW1lbnQgKHdpdGhvdXQKKyAqIHNjcm9sbGJhcnMpLgorICovCitteERpdlJlc2l6ZXIucHJvdG90eXBlLmdldERvY3VtZW50SGVpZ2h0ID0gZnVuY3Rpb24oKQoreworCXJldHVybiBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodDsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teERyYWdTb3VyY2UuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teERyYWdTb3VyY2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3MDQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214RHJhZ1NvdXJjZS5qcwpAQCAtMCwwICsxLDY3OSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhEcmFnU291cmNlCisgKiAKKyAqIFdyYXBwZXIgdG8gY3JlYXRlIGEgZHJhZyBzb3VyY2UgZnJvbSBhIERPTSBlbGVtZW50IHNvIHRoYXQgdGhlIGVsZW1lbnQgY2FuCisgKiBiZSBkcmFnZ2VkIG92ZXIgYSBncmFwaCBhbmQgZHJvcHBlZCBpbnRvIHRoZSBncmFwaCBhcyBhIG5ldyBjZWxsLgorICogCisgKiBQcm9ibGVtIGlzIHRoYXQgaW4gdGhlIGRyb3BIYW5kbGVyIHRoZSBjdXJyZW50IHByZXZpZXcgbG9jYXRpb24gaXMgbm90CisgKiBhdmFpbGFibGUsIHNvIHRoZSBwcmV2aWV3IGFuZCB0aGUgZHJvcEhhbmRsZXIgbXVzdCBtYXRjaC4KKyAqIAorICogQ29uc3RydWN0b3I6IG14RHJhZ1NvdXJjZQorICogCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGRyYWcgc291cmNlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4KKyAqLworZnVuY3Rpb24gbXhEcmFnU291cmNlKGVsZW1lbnQsIGRyb3BIYW5kbGVyKQoreworCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CisJdGhpcy5kcm9wSGFuZGxlciA9IGRyb3BIYW5kbGVyOworCQorCS8vIEhhbmRsZXMgYSBkcmFnIGdlc3R1cmUgb24gdGhlIGVsZW1lbnQKKwlteEV2ZW50LmFkZEdlc3R1cmVMaXN0ZW5lcnMoZWxlbWVudCwgbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwl7CisJCXRoaXMubW91c2VEb3duKGV2dCk7CisJfSkpOworCQorCS8vIFByZXZlbnRzIG5hdGl2ZSBkcmFnIGFuZCBkcm9wCisJbXhFdmVudC5hZGRMaXN0ZW5lcihlbGVtZW50LCAnZHJhZ3N0YXJ0JywgZnVuY3Rpb24oZXZ0KQorCXsKKwkJbXhFdmVudC5jb25zdW1lKGV2dCk7CisJfSk7CisJCisJdGhpcy5ldmVudENvbnN1bWVyID0gZnVuY3Rpb24oc2VuZGVyLCBldnQpCisJeworCQl2YXIgZXZ0TmFtZSA9IGV2dC5nZXRQcm9wZXJ0eSgnZXZlbnROYW1lJyk7CisJCXZhciBtZSA9IGV2dC5nZXRQcm9wZXJ0eSgnZXZlbnQnKTsKKwkJCisJCWlmIChldnROYW1lICE9IG14RXZlbnQuTU9VU0VfRE9XTikKKwkJeworCQkJbWUuY29uc3VtZSgpOworCQl9CisJfTsKK307CisKKy8qKgorICogVmFyaWFibGU6IGVsZW1lbnQKKyAqCisgKiBSZWZlcmVuY2UgdG8gdGhlIERPTSBub2RlIHdoaWNoIHdhcyBtYWRlIGRyYWdnYWJsZS4KKyAqLworbXhEcmFnU291cmNlLnByb3RvdHlwZS5lbGVtZW50ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZHJvcEhhbmRsZXIKKyAqCisgKiBIb2xkcyB0aGUgRE9NIG5vZGUgdGhhdCBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZHJhZyBwcmV2aWV3LiBJZiB0aGlzIGlzCisgKiBudWxsIHRoZW4gdGhlIHNvdXJjZSBlbGVtZW50IHdpbGwgYmUgY2xvbmVkIGFuZCB1c2VkIGZvciB0aGUgZHJhZyBwcmV2aWV3LgorICovCitteERyYWdTb3VyY2UucHJvdG90eXBlLmRyb3BIYW5kbGVyID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZHJhZ09mZnNldAorICoKKyAqIDxteFBvaW50PiB0aGF0IHNwZWNpZmllcyB0aGUgb2Zmc2V0IG9mIHRoZSA8ZHJhZ0VsZW1lbnQ+LiBEZWZhdWx0IGlzIG51bGwuCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuZHJhZ09mZnNldCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGRyYWdFbGVtZW50CisgKgorICogSG9sZHMgdGhlIERPTSBub2RlIHRoYXQgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGRyYWcgcHJldmlldy4gSWYgdGhpcyBpcworICogbnVsbCB0aGVuIHRoZSBzb3VyY2UgZWxlbWVudCB3aWxsIGJlIGNsb25lZCBhbmQgdXNlZCBmb3IgdGhlIGRyYWcgcHJldmlldy4KKyAqLworbXhEcmFnU291cmNlLnByb3RvdHlwZS5kcmFnRWxlbWVudCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHByZXZpZXdFbGVtZW50CisgKgorICogT3B0aW9uYWwgPG14UmVjdGFuZ2xlPiB0aGF0IHNwZWNpZmllcyB0aGUgdW5zY2FsZWQgc2l6ZSBvZiB0aGUgcHJldmlldy4KKyAqLworbXhEcmFnU291cmNlLnByb3RvdHlwZS5wcmV2aWV3RWxlbWVudCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGVuYWJsZWQKKyAqCisgKiBTcGVjaWZpZXMgaWYgdGhpcyBkcmFnIHNvdXJjZSBpcyBlbmFibGVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuZW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGN1cnJlbnRHcmFwaAorICoKKyAqIFJlZmVyZW5jZSB0byB0aGUgPG14R3JhcGg+IHRoYXQgaXMgdGhlIGN1cnJlbnQgZHJvcCB0YXJnZXQuCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuY3VycmVudEdyYXBoID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogY3VycmVudERyb3BUYXJnZXQKKyAqCisgKiBIb2xkcyB0aGUgY3VycmVudCBkcm9wIHRhcmdldCB1bmRlciB0aGUgbW91c2UuCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuY3VycmVudERyb3BUYXJnZXQgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjdXJyZW50UG9pbnQKKyAqCisgKiBIb2xkcyB0aGUgY3VycmVudCBkcm9wIGxvY2F0aW9uLgorICovCitteERyYWdTb3VyY2UucHJvdG90eXBlLmN1cnJlbnRQb2ludCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGN1cnJlbnRHdWlkZQorICoKKyAqIEhvbGRzIGFuIDxteEd1aWRlPiBmb3IgdGhlIDxjdXJyZW50R3JhcGg+IGlmIDxkcmFnUHJldmlldz4gaXMgbm90IG51bGwuCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuY3VycmVudEd1aWRlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogY3VycmVudEd1aWRlCisgKgorICogSG9sZHMgYW4gPG14R3VpZGU+IGZvciB0aGUgPGN1cnJlbnRHcmFwaD4gaWYgPGRyYWdQcmV2aWV3PiBpcyBub3QgbnVsbC4KKyAqLworbXhEcmFnU291cmNlLnByb3RvdHlwZS5jdXJyZW50SGlnaGxpZ2h0ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogYXV0b3Njcm9sbAorICoKKyAqIFNwZWNpZmllcyBpZiB0aGUgZ3JhcGggc2hvdWxkIHNjcm9sbCBhdXRvbWF0aWNhbGx5LiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuYXV0b3Njcm9sbCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGd1aWRlc0VuYWJsZWQKKyAqCisgKiBTcGVjaWZpZXMgaWYgPG14R3VpZGU+IHNob3VsZCBiZSBlbmFibGVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuZ3VpZGVzRW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGdyaWRFbmFibGVkCisgKgorICogU3BlY2lmaWVzIGlmIHRoZSBncmlkIHNob3VsZCBiZSBhbGxvd2VkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuZ3JpZEVuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBoaWdobGlnaHREcm9wVGFyZ2V0cworICoKKyAqIFNwZWNpZmllcyBpZiBkcm9wIHRhcmdldHMgc2hvdWxkIGJlIGhpZ2hsaWdodGVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuaGlnaGxpZ2h0RHJvcFRhcmdldHMgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBkcmFnRWxlbWVudFpJbmRleAorICogCisgKiBaSW5kZXggZm9yIHRoZSBkcmFnIGVsZW1lbnQuIERlZmF1bHQgaXMgMTAwLgorICovCitteERyYWdTb3VyY2UucHJvdG90eXBlLmRyYWdFbGVtZW50WkluZGV4ID0gMTAwOworCisvKioKKyAqIFZhcmlhYmxlOiBkcmFnRWxlbWVudE9wYWNpdHkKKyAqIAorICogT3BhY2l0eSBvZiB0aGUgZHJhZyBlbGVtZW50IGluICUuIERlZmF1bHQgaXMgNzAuCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuZHJhZ0VsZW1lbnRPcGFjaXR5ID0gNzA7CisKKy8qKgorICogRnVuY3Rpb246IGlzRW5hYmxlZAorICogCisgKiBSZXR1cm5zIDxlbmFibGVkPi4KKyAqLworbXhEcmFnU291cmNlLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuZW5hYmxlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEVuYWJsZWQKKyAqIAorICogU2V0cyA8ZW5hYmxlZD4uCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuc2V0RW5hYmxlZCA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuZW5hYmxlZCA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNHdWlkZXNFbmFibGVkCisgKiAKKyAqIFJldHVybnMgPGd1aWRlc0VuYWJsZWQ+LgorICovCitteERyYWdTb3VyY2UucHJvdG90eXBlLmlzR3VpZGVzRW5hYmxlZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5ndWlkZXNFbmFibGVkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0R3VpZGVzRW5hYmxlZAorICogCisgKiBTZXRzIDxndWlkZXNFbmFibGVkPi4KKyAqLworbXhEcmFnU291cmNlLnByb3RvdHlwZS5zZXRHdWlkZXNFbmFibGVkID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5ndWlkZXNFbmFibGVkID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0dyaWRFbmFibGVkCisgKiAKKyAqIFJldHVybnMgPGdyaWRFbmFibGVkPi4KKyAqLworbXhEcmFnU291cmNlLnByb3RvdHlwZS5pc0dyaWRFbmFibGVkID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmdyaWRFbmFibGVkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0R3JpZEVuYWJsZWQKKyAqIAorICogU2V0cyA8Z3JpZEVuYWJsZWQ+LgorICovCitteERyYWdTb3VyY2UucHJvdG90eXBlLnNldEdyaWRFbmFibGVkID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5ncmlkRW5hYmxlZCA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0R3JhcGhGb3JFdmVudAorICogCisgKiBSZXR1cm5zIHRoZSBncmFwaCBmb3IgdGhlIGdpdmVuIG1vdXNlIGV2ZW50LiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMKKyAqIG51bGwuCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuZ2V0R3JhcGhGb3JFdmVudCA9IGZ1bmN0aW9uKGV2dCkKK3sKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldERyb3BUYXJnZXQKKyAqIAorICogUmV0dXJucyB0aGUgZHJvcCB0YXJnZXQgZm9yIHRoZSBnaXZlbiBncmFwaCBhbmQgY29vcmRpbmF0ZXMuIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIHVzZXMgPG14R3JhcGguZ2V0Q2VsbEF0Pi4KKyAqLworbXhEcmFnU291cmNlLnByb3RvdHlwZS5nZXREcm9wVGFyZ2V0ID0gZnVuY3Rpb24oZ3JhcGgsIHgsIHksIGV2dCkKK3sKKwlyZXR1cm4gZ3JhcGguZ2V0Q2VsbEF0KHgsIHkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlRHJhZ0VsZW1lbnQKKyAqIAorICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGNsb25lIG9mIHRoZSA8ZHJhZ0VsZW1lbnRQcm90b3R5cGU+IG9yIHRoZSA8ZWxlbWVudD4KKyAqIGlmIHRoZSBmb3JtZXIgaXMgbm90IGRlZmluZWQuCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuY3JlYXRlRHJhZ0VsZW1lbnQgPSBmdW5jdGlvbihldnQpCit7CisJcmV0dXJuIHRoaXMuZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVQcmV2aWV3RWxlbWVudAorICogCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIGVsZW1lbnQgd2hpY2ggY2FuIGJlIHVzZWQgYXMgYSBwcmV2aWV3IGluIHRoZSBnaXZlbgorICogZ3JhcGguCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuY3JlYXRlUHJldmlld0VsZW1lbnQgPSBmdW5jdGlvbihncmFwaCkKK3sKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQWN0aXZlCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRyYWcgc291cmNlIGlzIGFjdGl2ZS4KKyAqLworbXhEcmFnU291cmNlLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5tb3VzZU1vdmVIYW5kbGVyICE9IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZXNldAorICogCisgKiBTdG9wcyBhbmQgcmVtb3ZlcyBldmVyeXRoaW5nIGFuZCByZXN0b3JlcyB0aGUgc3RhdGUgb2YgdGhlIG9iamVjdC4KKyAqLworbXhEcmFnU291cmNlLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAodGhpcy5jdXJyZW50R3JhcGggIT0gbnVsbCkKKwl7CisJCXRoaXMuZHJhZ0V4aXQodGhpcy5jdXJyZW50R3JhcGgpOworCQl0aGlzLmN1cnJlbnRHcmFwaCA9IG51bGw7CisJfQorCQorCXRoaXMucmVtb3ZlRHJhZ0VsZW1lbnQoKTsKKwl0aGlzLnJlbW92ZUxpc3RlbmVycygpOworCXRoaXMuc3RvcERyYWcoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdXNlRG93bgorICogCisgKiBSZXR1cm5zIHRoZSBkcm9wIHRhcmdldCBmb3IgdGhlIGdpdmVuIGdyYXBoIGFuZCBjb29yZGluYXRlcy4gVGhpcworICogaW1wbGVtZW50YXRpb24gdXNlcyA8bXhHcmFwaC5nZXRDZWxsQXQ+LgorICogCisgKiBUbyBpZ25vcmUgcG9wdXAgbWVudSBldmVudHMgZm9yIGEgZHJhZyBzb3VyY2UsIHRoaXMgZnVuY3Rpb24gY2FuIGJlCisgKiBvdmVycmlkZGVuIGFzIGZvbGxvd3MuCisgKiAKKyAqIChjb2RlKQorICogdmFyIG1vdXNlRG93biA9IGRyYWdTb3VyY2UubW91c2VEb3duOworICogCisgKiBkcmFnU291cmNlLm1vdXNlRG93biA9IGZ1bmN0aW9uKGV2dCkKKyAqIHsKKyAqICAgaWYgKCFteEV2ZW50LmlzUG9wdXBUcmlnZ2VyKGV2dCkpCisgKiAgIHsKKyAqICAgICBtb3VzZURvd24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAqICAgfQorICogfTsKKyAqIChlbmQpCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUubW91c2VEb3duID0gZnVuY3Rpb24oZXZ0KQoreworCWlmICh0aGlzLmVuYWJsZWQgJiYgIW14RXZlbnQuaXNDb25zdW1lZChldnQpICYmIHRoaXMubW91c2VNb3ZlSGFuZGxlciA9PSBudWxsKQorCXsKKwkJdGhpcy5zdGFydERyYWcoZXZ0KTsKKwkJdGhpcy5tb3VzZU1vdmVIYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIHRoaXMubW91c2VNb3ZlKTsKKwkJdGhpcy5tb3VzZVVwSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCB0aGlzLm1vdXNlVXApOwkJCisJCW14RXZlbnQuYWRkR2VzdHVyZUxpc3RlbmVycyhkb2N1bWVudCwgbnVsbCwgdGhpcy5tb3VzZU1vdmVIYW5kbGVyLCB0aGlzLm1vdXNlVXBIYW5kbGVyKTsKKwkJCisJCWlmIChteENsaWVudC5JU19UT1VDSCAmJiAhbXhFdmVudC5pc01vdXNlRXZlbnQoZXZ0KSkKKwkJeworCQkJdGhpcy5ldmVudFNvdXJjZSA9IG14RXZlbnQuZ2V0U291cmNlKGV2dCk7CisJCQlteEV2ZW50LmFkZEdlc3R1cmVMaXN0ZW5lcnModGhpcy5ldmVudFNvdXJjZSwgbnVsbCwgdGhpcy5tb3VzZU1vdmVIYW5kbGVyLCB0aGlzLm1vdXNlVXBIYW5kbGVyKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHN0YXJ0RHJhZworICogCisgKiBDcmVhdGVzIHRoZSA8ZHJhZ0VsZW1lbnQ+IHVzaW5nIDxjcmVhdGVEcmFnRWxlbWVudD4uCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuc3RhcnREcmFnID0gZnVuY3Rpb24oZXZ0KQoreworCXRoaXMuZHJhZ0VsZW1lbnQgPSB0aGlzLmNyZWF0ZURyYWdFbGVtZW50KGV2dCk7CisJdGhpcy5kcmFnRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisJdGhpcy5kcmFnRWxlbWVudC5zdHlsZS56SW5kZXggPSB0aGlzLmRyYWdFbGVtZW50WkluZGV4OworCW14VXRpbHMuc2V0T3BhY2l0eSh0aGlzLmRyYWdFbGVtZW50LCB0aGlzLmRyYWdFbGVtZW50T3BhY2l0eSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzdG9wRHJhZworICogCisgKiBJbnZva2VzIDxyZW1vdmVEcmFnRWxlbWVudD4uCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuc3RvcERyYWcgPSBmdW5jdGlvbigpCit7CisJLy8gTEFURVI6IFRoaXMgdXNlZCB0byBoYXZlIGEgbW91c2UgZXZlbnQuIElmIHRoYXQgaXMgc3RpbGwgbmVlZGVkIHdlIG5lZWQgdG8gYWRkIGFub3RoZXIKKwkvLyBmaW5hbCBjYWxsIHRvIHRoZSBEbkQgcHJvdG9jb2wgdG8gYWRkIGEgY2xlYW51cCBzdGVwIGluIHRoZSBjYXNlIG9mIGVzY2FwZSBwcmVzcywgd2hpY2gKKwkvLyBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgbW91c2UgZXZlbnQgYW5kIHdoaWNoIGN1cnJlbnRseSBjYWxsZXMgdGhpcyBtZXRob2QuCisJdGhpcy5yZW1vdmVEcmFnRWxlbWVudCgpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVtb3ZlRHJhZ0VsZW1lbnQKKyAqIAorICogUmVtb3ZlcyBhbmQgZGVzdHJveXMgdGhlIDxkcmFnRWxlbWVudD4uCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUucmVtb3ZlRHJhZ0VsZW1lbnQgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMuZHJhZ0VsZW1lbnQgIT0gbnVsbCkKKwl7CisJCWlmICh0aGlzLmRyYWdFbGVtZW50LnBhcmVudE5vZGUgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5kcmFnRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZHJhZ0VsZW1lbnQpOworCQl9CisJCQorCQl0aGlzLmRyYWdFbGVtZW50ID0gbnVsbDsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBncmFwaENvbnRhaW5zRXZlbnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBncmFwaCBjb250YWlucyB0aGUgZ2l2ZW4gZXZlbnQuCisgKi8KK214RHJhZ1NvdXJjZS5wcm90b3R5cGUuZ3JhcGhDb250YWluc0V2ZW50ID0gZnVuY3Rpb24oZ3JhcGgsIGV2dCkKK3sKKwl2YXIgeCA9IG14RXZlbnQuZ2V0Q2xpZW50WChldnQpOworCXZhciB5ID0gbXhFdmVudC5nZXRDbGllbnRZKGV2dCk7CisJdmFyIG9mZnNldCA9IG14VXRpbHMuZ2V0T2Zmc2V0KGdyYXBoLmNvbnRhaW5lcik7CisJdmFyIG9yaWdpbiA9IG14VXRpbHMuZ2V0U2Nyb2xsT3JpZ2luKCk7CisKKwkvLyBDaGVja3MgaWYgZXZlbnQgaXMgaW5zaWRlIHRoZSBib3VuZHMgb2YgdGhlIGdyYXBoIGNvbnRhaW5lcgorCXJldHVybiB4ID49IG9mZnNldC54IC0gb3JpZ2luLnggJiYgeSA+PSBvZmZzZXQueSAtIG9yaWdpbi55ICYmCisJCXggPD0gb2Zmc2V0LnggLSBvcmlnaW4ueCArIGdyYXBoLmNvbnRhaW5lci5vZmZzZXRXaWR0aCAmJgorCQl5IDw9IG9mZnNldC55IC0gb3JpZ2luLnkgKyBncmFwaC5jb250YWluZXIub2Zmc2V0SGVpZ2h0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogbW91c2VNb3ZlCisgKiAKKyAqIEdldHMgdGhlIGdyYXBoIGZvciB0aGUgZ2l2ZW4gZXZlbnQgdXNpbmcgPGdldEdyYXBoRm9yRXZlbnQ+LCB1cGRhdGVzIHRoZQorICogPGN1cnJlbnRHcmFwaD4sIGNhbGxpbmcgPGRyYWdFbnRlcj4gYW5kIDxkcmFnRXhpdD4gb24gdGhlIG5ldyBhbmQgb2xkIGdyYXBoLAorICogcmVzcGVjdGl2ZWx5LCBhbmQgaW52b2tlcyA8ZHJhZ092ZXI+IGlmIDxjdXJyZW50R3JhcGg+IGlzIG5vdCBudWxsLgorICovCitteERyYWdTb3VyY2UucHJvdG90eXBlLm1vdXNlTW92ZSA9IGZ1bmN0aW9uKGV2dCkKK3sKKwl2YXIgZ3JhcGggPSB0aGlzLmdldEdyYXBoRm9yRXZlbnQoZXZ0KTsKKwkKKwkvLyBDaGVja3MgaWYgZXZlbnQgaXMgaW5zaWRlIHRoZSBib3VuZHMgb2YgdGhlIGdyYXBoIGNvbnRhaW5lcgorCWlmIChncmFwaCAhPSBudWxsICYmICF0aGlzLmdyYXBoQ29udGFpbnNFdmVudChncmFwaCwgZXZ0KSkKKwl7CisJCWdyYXBoID0gbnVsbDsKKwl9CisKKwlpZiAoZ3JhcGggIT0gdGhpcy5jdXJyZW50R3JhcGgpCisJeworCQlpZiAodGhpcy5jdXJyZW50R3JhcGggIT0gbnVsbCkKKwkJeworCQkJdGhpcy5kcmFnRXhpdCh0aGlzLmN1cnJlbnRHcmFwaCwgZXZ0KTsKKwkJfQorCQkKKwkJdGhpcy5jdXJyZW50R3JhcGggPSBncmFwaDsKKwkJCisJCWlmICh0aGlzLmN1cnJlbnRHcmFwaCAhPSBudWxsKQorCQl7CisJCQl0aGlzLmRyYWdFbnRlcih0aGlzLmN1cnJlbnRHcmFwaCwgZXZ0KTsKKwkJfQorCX0KKwkKKwlpZiAodGhpcy5jdXJyZW50R3JhcGggIT0gbnVsbCkKKwl7CisJCXRoaXMuZHJhZ092ZXIodGhpcy5jdXJyZW50R3JhcGgsIGV2dCk7CisJfQorCisJaWYgKHRoaXMuZHJhZ0VsZW1lbnQgIT0gbnVsbCAmJiAodGhpcy5wcmV2aWV3RWxlbWVudCA9PSBudWxsIHx8IHRoaXMucHJldmlld0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSAhPSAndmlzaWJsZScpKQorCXsKKwkJdmFyIHggPSBteEV2ZW50LmdldENsaWVudFgoZXZ0KTsKKwkJdmFyIHkgPSBteEV2ZW50LmdldENsaWVudFkoZXZ0KTsKKwkJCisJCWlmICh0aGlzLmRyYWdFbGVtZW50LnBhcmVudE5vZGUgPT0gbnVsbCkKKwkJeworCQkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmRyYWdFbGVtZW50KTsKKwkJfQorCisJCXRoaXMuZHJhZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsKKwkJCisJCWlmICh0aGlzLmRyYWdPZmZzZXQgIT0gbnVsbCkKKwkJeworCQkJeCArPSB0aGlzLmRyYWdPZmZzZXQueDsKKwkJCXkgKz0gdGhpcy5kcmFnT2Zmc2V0Lnk7CisJCX0KKwkJCisJCXZhciBvZmZzZXQgPSBteFV0aWxzLmdldERvY3VtZW50U2Nyb2xsT3JpZ2luKGRvY3VtZW50KTsKKwkJCisJCXRoaXMuZHJhZ0VsZW1lbnQuc3R5bGUubGVmdCA9ICh4ICsgb2Zmc2V0LngpICsgJ3B4JzsKKwkJdGhpcy5kcmFnRWxlbWVudC5zdHlsZS50b3AgPSAoeSArIG9mZnNldC55KSArICdweCc7CisJfQorCWVsc2UgaWYgKHRoaXMuZHJhZ0VsZW1lbnQgIT0gbnVsbCkKKwl7CisJCXRoaXMuZHJhZ0VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOworCX0KKwkKKwlteEV2ZW50LmNvbnN1bWUoZXZ0KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdXNlVXAKKyAqIAorICogUHJvY2Vzc2VzIHRoZSBtb3VzZSB1cCBldmVudCBhbmQgaW52b2tlcyA8ZHJvcD4sIDxkcmFnRXhpdD4gYW5kIDxzdG9wRHJhZz4KKyAqIGFzIHJlcXVpcmVkLgorICovCitteERyYWdTb3VyY2UucHJvdG90eXBlLm1vdXNlVXAgPSBmdW5jdGlvbihldnQpCit7CisJaWYgKHRoaXMuY3VycmVudEdyYXBoICE9IG51bGwpCisJeworCQlpZiAodGhpcy5jdXJyZW50UG9pbnQgIT0gbnVsbCAmJiAodGhpcy5wcmV2aWV3RWxlbWVudCA9PSBudWxsIHx8CisJCQl0aGlzLnByZXZpZXdFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgIT0gJ2hpZGRlbicpKQorCQl7CisJCQl2YXIgc2NhbGUgPSB0aGlzLmN1cnJlbnRHcmFwaC52aWV3LnNjYWxlOworCQkJdmFyIHRyID0gdGhpcy5jdXJyZW50R3JhcGgudmlldy50cmFuc2xhdGU7CisJCQl2YXIgeCA9IHRoaXMuY3VycmVudFBvaW50LnggLyBzY2FsZSAtIHRyLng7CisJCQl2YXIgeSA9IHRoaXMuY3VycmVudFBvaW50LnkgLyBzY2FsZSAtIHRyLnk7CisJCQkKKwkJCXRoaXMuZHJvcCh0aGlzLmN1cnJlbnRHcmFwaCwgZXZ0LCB0aGlzLmN1cnJlbnREcm9wVGFyZ2V0LCB4LCB5KTsKKwkJfQorCQkKKwkJdGhpcy5kcmFnRXhpdCh0aGlzLmN1cnJlbnRHcmFwaCk7CisJCXRoaXMuY3VycmVudEdyYXBoID0gbnVsbDsKKwl9CisKKwl0aGlzLnN0b3BEcmFnKCk7CisJdGhpcy5yZW1vdmVMaXN0ZW5lcnMoKTsKKwkKKwlteEV2ZW50LmNvbnN1bWUoZXZ0KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlbW92ZUxpc3RlbmVycworICogCisgKiBBY3RpdmVzIHRoZSBnaXZlbiBncmFwaCBhcyBhIGRyb3AgdGFyZ2V0LgorICovCitteERyYWdTb3VyY2UucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVycyA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAodGhpcy5ldmVudFNvdXJjZSAhPSBudWxsKQorCXsKKwkJbXhFdmVudC5yZW1vdmVHZXN0dXJlTGlzdGVuZXJzKHRoaXMuZXZlbnRTb3VyY2UsIG51bGwsIHRoaXMubW91c2VNb3ZlSGFuZGxlciwgdGhpcy5tb3VzZVVwSGFuZGxlcik7CisJCXRoaXMuZXZlbnRTb3VyY2UgPSBudWxsOworCX0KKwkKKwlteEV2ZW50LnJlbW92ZUdlc3R1cmVMaXN0ZW5lcnMoZG9jdW1lbnQsIG51bGwsIHRoaXMubW91c2VNb3ZlSGFuZGxlciwgdGhpcy5tb3VzZVVwSGFuZGxlcik7CisJdGhpcy5tb3VzZU1vdmVIYW5kbGVyID0gbnVsbDsKKwl0aGlzLm1vdXNlVXBIYW5kbGVyID0gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGRyYWdFbnRlcgorICogCisgKiBBY3RpdmVzIHRoZSBnaXZlbiBncmFwaCBhcyBhIGRyb3AgdGFyZ2V0LgorICovCitteERyYWdTb3VyY2UucHJvdG90eXBlLmRyYWdFbnRlciA9IGZ1bmN0aW9uKGdyYXBoLCBldnQpCit7CisJZ3JhcGguaXNNb3VzZURvd24gPSB0cnVlOworCWdyYXBoLmlzTW91c2VUcmlnZ2VyID0gbXhFdmVudC5pc01vdXNlRXZlbnQoZXZ0KTsKKwl0aGlzLnByZXZpZXdFbGVtZW50ID0gdGhpcy5jcmVhdGVQcmV2aWV3RWxlbWVudChncmFwaCk7CisJCisJLy8gR3VpZGUgaXMgb25seSBuZWVkZWQgaWYgcHJldmlldyBlbGVtZW50IGlzIHVzZWQKKwlpZiAodGhpcy5pc0d1aWRlc0VuYWJsZWQoKSAmJiB0aGlzLnByZXZpZXdFbGVtZW50ICE9IG51bGwpCisJeworCQl0aGlzLmN1cnJlbnRHdWlkZSA9IG5ldyBteEd1aWRlKGdyYXBoLCBncmFwaC5ncmFwaEhhbmRsZXIuZ2V0R3VpZGVTdGF0ZXMoKSk7CisJfQorCQorCWlmICh0aGlzLmhpZ2hsaWdodERyb3BUYXJnZXRzKQorCXsKKwkJdGhpcy5jdXJyZW50SGlnaGxpZ2h0ID0gbmV3IG14Q2VsbEhpZ2hsaWdodChncmFwaCwgbXhDb25zdGFudHMuRFJPUF9UQVJHRVRfQ09MT1IpOworCX0KKwkKKwkvLyBDb25zdW1lcyBhbGwgZXZlbnRzIGluIHRoZSBjdXJyZW50IGdyYXBoIGJlZm9yZSB0aGV5IGFyZSBmaXJlZAorCWdyYXBoLmFkZExpc3RlbmVyKG14RXZlbnQuRklSRV9NT1VTRV9FVkVOVCwgdGhpcy5ldmVudENvbnN1bWVyKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGRyYWdFeGl0CisgKiAKKyAqIERlYWN0aXZhdGVzIHRoZSBnaXZlbiBncmFwaCBhcyBhIGRyb3AgdGFyZ2V0LgorICovCitteERyYWdTb3VyY2UucHJvdG90eXBlLmRyYWdFeGl0ID0gZnVuY3Rpb24oZ3JhcGgsIGV2dCkKK3sKKwl0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gbnVsbDsKKwl0aGlzLmN1cnJlbnRQb2ludCA9IG51bGw7CisJZ3JhcGguaXNNb3VzZURvd24gPSBmYWxzZTsKKwkKKwkvLyBDb25zdW1lcyBhbGwgZXZlbnRzIGluIHRoZSBjdXJyZW50IGdyYXBoIGJlZm9yZSB0aGV5IGFyZSBmaXJlZAorCWdyYXBoLnJlbW92ZUxpc3RlbmVyKHRoaXMuZXZlbnRDb25zdW1lcik7CisJCisJaWYgKHRoaXMucHJldmlld0VsZW1lbnQgIT0gbnVsbCkKKwl7CisJCWlmICh0aGlzLnByZXZpZXdFbGVtZW50LnBhcmVudE5vZGUgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5wcmV2aWV3RWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMucHJldmlld0VsZW1lbnQpOworCQl9CisJCQorCQl0aGlzLnByZXZpZXdFbGVtZW50ID0gbnVsbDsKKwl9CisJCisJaWYgKHRoaXMuY3VycmVudEd1aWRlICE9IG51bGwpCisJeworCQl0aGlzLmN1cnJlbnRHdWlkZS5kZXN0cm95KCk7CisJCXRoaXMuY3VycmVudEd1aWRlID0gbnVsbDsKKwl9CisJCisJaWYgKHRoaXMuY3VycmVudEhpZ2hsaWdodCAhPSBudWxsKQorCXsKKwkJdGhpcy5jdXJyZW50SGlnaGxpZ2h0LmRlc3Ryb3koKTsKKwkJdGhpcy5jdXJyZW50SGlnaGxpZ2h0ID0gbnVsbDsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkcmFnT3ZlcgorICogCisgKiBJbXBsZW1lbnRzIGF1dG9zY3JvbGwsIHVwZGF0ZXMgdGhlIDxjdXJyZW50UG9pbnQ+LCBoaWdobGlnaHRzIGFueSBkcm9wCisgKiB0YXJnZXRzIGFuZCB1cGRhdGVzIHRoZSBwcmV2aWV3LgorICovCitteERyYWdTb3VyY2UucHJvdG90eXBlLmRyYWdPdmVyID0gZnVuY3Rpb24oZ3JhcGgsIGV2dCkKK3sKKwl2YXIgb2Zmc2V0ID0gbXhVdGlscy5nZXRPZmZzZXQoZ3JhcGguY29udGFpbmVyKTsKKwl2YXIgb3JpZ2luID0gbXhVdGlscy5nZXRTY3JvbGxPcmlnaW4oZ3JhcGguY29udGFpbmVyKTsKKwl2YXIgeCA9IG14RXZlbnQuZ2V0Q2xpZW50WChldnQpIC0gb2Zmc2V0LnggKyBvcmlnaW4ueCAtIGdyYXBoLnBhbkR4OworCXZhciB5ID0gbXhFdmVudC5nZXRDbGllbnRZKGV2dCkgLSBvZmZzZXQueSArIG9yaWdpbi55IC0gZ3JhcGgucGFuRHk7CisKKwlpZiAoZ3JhcGguYXV0b1Njcm9sbCAmJiAodGhpcy5hdXRvc2Nyb2xsID09IG51bGwgfHwgdGhpcy5hdXRvc2Nyb2xsKSkKKwl7CisJCWdyYXBoLnNjcm9sbFBvaW50VG9WaXNpYmxlKHgsIHksIGdyYXBoLmF1dG9FeHRlbmQpOworCX0KKworCS8vIEhpZ2hsaWdodHMgdGhlIGRyb3AgdGFyZ2V0IHVuZGVyIHRoZSBtb3VzZQorCWlmICh0aGlzLmN1cnJlbnRIaWdobGlnaHQgIT0gbnVsbCAmJiBncmFwaC5pc0Ryb3BFbmFibGVkKCkpCisJeworCQl0aGlzLmN1cnJlbnREcm9wVGFyZ2V0ID0gdGhpcy5nZXREcm9wVGFyZ2V0KGdyYXBoLCB4LCB5LCBldnQpOworCQl2YXIgc3RhdGUgPSBncmFwaC5nZXRWaWV3KCkuZ2V0U3RhdGUodGhpcy5jdXJyZW50RHJvcFRhcmdldCk7CisJCXRoaXMuY3VycmVudEhpZ2hsaWdodC5oaWdobGlnaHQoc3RhdGUpOworCX0KKworCS8vIFVwZGF0ZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBwcmV2aWV3CisJaWYgKHRoaXMucHJldmlld0VsZW1lbnQgIT0gbnVsbCkKKwl7CisJCWlmICh0aGlzLnByZXZpZXdFbGVtZW50LnBhcmVudE5vZGUgPT0gbnVsbCkKKwkJeworCQkJZ3JhcGguY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucHJldmlld0VsZW1lbnQpOworCQkJCisJCQl0aGlzLnByZXZpZXdFbGVtZW50LnN0eWxlLnpJbmRleCA9ICczJzsKKwkJCXRoaXMucHJldmlld0VsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOworCQl9CisJCQorCQl2YXIgZ3JpZEVuYWJsZWQgPSB0aGlzLmlzR3JpZEVuYWJsZWQoKSAmJiBncmFwaC5pc0dyaWRFbmFibGVkRXZlbnQoZXZ0KTsKKwkJdmFyIGhpZGVHdWlkZSA9IHRydWU7CisKKwkJLy8gR3JpZCBhbmQgZ3VpZGVzCisJCWlmICh0aGlzLmN1cnJlbnRHdWlkZSAhPSBudWxsICYmIHRoaXMuY3VycmVudEd1aWRlLmlzRW5hYmxlZEZvckV2ZW50KGV2dCkpCisJCXsKKwkJCS8vIExBVEVSOiBIVE1MIHByZXZpZXcgYXBwZWFycyBzbWFsbGVyIHRoYW4gU1ZHIHByZXZpZXcKKwkJCXZhciB3ID0gcGFyc2VJbnQodGhpcy5wcmV2aWV3RWxlbWVudC5zdHlsZS53aWR0aCk7CisJCQl2YXIgaCA9IHBhcnNlSW50KHRoaXMucHJldmlld0VsZW1lbnQuc3R5bGUuaGVpZ2h0KTsKKwkJCXZhciBib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUoMCwgMCwgdywgaCk7CisJCQl2YXIgZGVsdGEgPSBuZXcgbXhQb2ludCh4LCB5KTsKKwkJCWRlbHRhID0gdGhpcy5jdXJyZW50R3VpZGUubW92ZShib3VuZHMsIGRlbHRhLCBncmlkRW5hYmxlZCk7CisJCQloaWRlR3VpZGUgPSBmYWxzZTsKKwkJCXggPSBkZWx0YS54OworCQkJeSA9IGRlbHRhLnk7CisJCX0KKwkJZWxzZSBpZiAoZ3JpZEVuYWJsZWQpCisJCXsKKwkJCXZhciBzY2FsZSA9IGdyYXBoLnZpZXcuc2NhbGU7CisJCQl2YXIgdHIgPSBncmFwaC52aWV3LnRyYW5zbGF0ZTsKKwkJCXZhciBvZmYgPSBncmFwaC5ncmlkU2l6ZSAvIDI7CisJCQl4ID0gKGdyYXBoLnNuYXAoeCAvIHNjYWxlIC0gdHIueCAtIG9mZikgKyB0ci54KSAqIHNjYWxlOworCQkJeSA9IChncmFwaC5zbmFwKHkgLyBzY2FsZSAtIHRyLnkgLSBvZmYpICsgdHIueSkgKiBzY2FsZTsKKwkJfQorCQkKKwkJaWYgKHRoaXMuY3VycmVudEd1aWRlICE9IG51bGwgJiYgaGlkZUd1aWRlKQorCQl7CisJCQl0aGlzLmN1cnJlbnRHdWlkZS5oaWRlKCk7CisJCX0KKwkJCisJCWlmICh0aGlzLnByZXZpZXdPZmZzZXQgIT0gbnVsbCkKKwkJeworCQkJeCArPSB0aGlzLnByZXZpZXdPZmZzZXQueDsKKwkJCXkgKz0gdGhpcy5wcmV2aWV3T2Zmc2V0Lnk7CisJCX0KKworCQl0aGlzLnByZXZpZXdFbGVtZW50LnN0eWxlLmxlZnQgPSBNYXRoLnJvdW5kKHgpICsgJ3B4JzsKKwkJdGhpcy5wcmV2aWV3RWxlbWVudC5zdHlsZS50b3AgPSBNYXRoLnJvdW5kKHkpICsgJ3B4JzsKKwkJdGhpcy5wcmV2aWV3RWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnOworCX0KKwkKKwl0aGlzLmN1cnJlbnRQb2ludCA9IG5ldyBteFBvaW50KHgsIHkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZHJvcAorICogCisgKiBSZXR1cm5zIHRoZSBkcm9wIHRhcmdldCBmb3IgdGhlIGdpdmVuIGdyYXBoIGFuZCBjb29yZGluYXRlcy4gVGhpcworICogaW1wbGVtZW50YXRpb24gdXNlcyA8bXhHcmFwaC5nZXRDZWxsQXQ+LgorICovCitteERyYWdTb3VyY2UucHJvdG90eXBlLmRyb3AgPSBmdW5jdGlvbihncmFwaCwgZXZ0LCBkcm9wVGFyZ2V0LCB4LCB5KQoreworCXRoaXMuZHJvcEhhbmRsZXIoZ3JhcGgsIGV2dCwgZHJvcFRhcmdldCwgeCwgeSk7CisJCisJLy8gSGFkIHRvIG1vdmUgdGhpcyB0byBhZnRlciB0aGUgaW5zZXJ0IGJlY2F1c2UgaXQgd2lsbAorCS8vIGFmZmVjdCB0aGUgc2Nyb2xsYmFycyBvZiB0aGUgd2luZG93IGluIElFIHRvIHRyeSBhbmQKKwkvLyBtYWtlIHRoZSBjb21wbGV0ZSBjb250YWluZXIgdmlzaWJsZS4KKwkvLyBMQVRFUjogU2hvdWxkIGJlIG1hZGUgb3B0aW9uYWwuCisJaWYgKGdyYXBoLmNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ICE9ICdoaWRkZW4nKQorCXsKKwkJZ3JhcGguY29udGFpbmVyLmZvY3VzKCk7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214RWZmZWN0cy5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214RWZmZWN0cy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2ExODkxCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhFZmZlY3RzLmpzCkBAIC0wLDAgKzEsMjExIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCit2YXIgbXhFZmZlY3RzID0KK3sKKworCS8qKgorCSAqIENsYXNzOiBteEVmZmVjdHMKKwkgKiAKKwkgKiBQcm92aWRlcyBhbmltYXRpb24gZWZmZWN0cy4KKwkgKi8KKworCS8qKgorCSAqIEZ1bmN0aW9uOiBhbmltYXRlQ2hhbmdlcworCSAqIAorCSAqIEFzeW5jaHJvbm91cyBhbmltYXRlZCBtb3ZlIG9wZXJhdGlvbi4gU2VlIGFsc286IDxteE1vcnBoaW5nPi4KKwkgKiAKKwkgKiBFeGFtcGxlOgorCSAqIAorCSAqIChjb2RlKQorCSAqIGdyYXBoLm1vZGVsLmFkZExpc3RlbmVyKG14RXZlbnQuQ0hBTkdFLCBmdW5jdGlvbihzZW5kZXIsIGV2dCkKKwkgKiB7CisJICogICB2YXIgY2hhbmdlcyA9IGV2dC5nZXRQcm9wZXJ0eSgnZWRpdCcpLmNoYW5nZXM7CisJICogCisJICogICBpZiAoY2hhbmdlcy5sZW5ndGggPCAxMCkKKwkgKiAgIHsKKwkgKiAgICAgbXhFZmZlY3RzLmFuaW1hdGVDaGFuZ2VzKGdyYXBoLCBjaGFuZ2VzKTsKKwkgKiAgIH0KKwkgKiB9KTsKKwkgKiAoZW5kKQorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogZ3JhcGggLSA8bXhHcmFwaD4gdGhhdCByZWNlaXZlZCB0aGUgY2hhbmdlcy4KKwkgKiBjaGFuZ2VzIC0gQXJyYXkgb2YgY2hhbmdlcyB0byBiZSBhbmltYXRlZC4KKwkgKiBkb25lIC0gT3B0aW9uYWwgZnVuY3Rpb24gYXJndW1lbnQgdGhhdCBpcyBpbnZva2VkIGFmdGVyIHRoZQorCSAqIGxhc3Qgc3RlcCBvZiB0aGUgYW5pbWF0aW9uLgorCSAqLworCWFuaW1hdGVDaGFuZ2VzOiBmdW5jdGlvbihncmFwaCwgY2hhbmdlcywgZG9uZSkKKwl7CisJCXZhciBtYXhTdGVwID0gMTA7CisJCXZhciBzdGVwID0gMDsKKworCQl2YXIgYW5pbWF0ZSA9IGZ1bmN0aW9uKCkgCisJCXsKKwkJCXZhciBpc1JlcXVpcmVkID0gZmFsc2U7CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQl2YXIgY2hhbmdlID0gY2hhbmdlc1tpXTsKKwkJCQkKKwkJCQlpZiAoY2hhbmdlIGluc3RhbmNlb2YgbXhHZW9tZXRyeUNoYW5nZSB8fAorCQkJCQljaGFuZ2UgaW5zdGFuY2VvZiBteFRlcm1pbmFsQ2hhbmdlIHx8CisJCQkJCWNoYW5nZSBpbnN0YW5jZW9mIG14VmFsdWVDaGFuZ2UgfHwKKwkJCQkJY2hhbmdlIGluc3RhbmNlb2YgbXhDaGlsZENoYW5nZSB8fAorCQkJCQljaGFuZ2UgaW5zdGFuY2VvZiBteFN0eWxlQ2hhbmdlKQorCQkJCXsKKwkJCQkJdmFyIHN0YXRlID0gZ3JhcGguZ2V0VmlldygpLmdldFN0YXRlKGNoYW5nZS5jZWxsIHx8IGNoYW5nZS5jaGlsZCwgZmFsc2UpOworCQkJCQkKKwkJCQkJaWYgKHN0YXRlICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCWlzUmVxdWlyZWQgPSB0cnVlOworCQkJCQkKKwkJCQkJCWlmIChjaGFuZ2UuY29uc3RydWN0b3IgIT0gbXhHZW9tZXRyeUNoYW5nZSB8fCBncmFwaC5tb2RlbC5pc0VkZ2UoY2hhbmdlLmNlbGwpKQorCQkJCQkJeworCQkJCQkJCW14VXRpbHMuc2V0T3BhY2l0eShzdGF0ZS5zaGFwZS5ub2RlLCAxMDAgKiBzdGVwIC8gbWF4U3RlcCk7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJdmFyIHNjYWxlID0gZ3JhcGguZ2V0VmlldygpLnNjYWxlOwkJCQkJCisKKwkJCQkJCQl2YXIgZHggPSAoY2hhbmdlLmdlb21ldHJ5LnggLSBjaGFuZ2UucHJldmlvdXMueCkgKiBzY2FsZTsKKwkJCQkJCQl2YXIgZHkgPSAoY2hhbmdlLmdlb21ldHJ5LnkgLSBjaGFuZ2UucHJldmlvdXMueSkgKiBzY2FsZTsKKwkJCQkJCQkKKwkJCQkJCQl2YXIgc3ggPSAoY2hhbmdlLmdlb21ldHJ5LndpZHRoIC0gY2hhbmdlLnByZXZpb3VzLndpZHRoKSAqIHNjYWxlOworCQkJCQkJCXZhciBzeSA9IChjaGFuZ2UuZ2VvbWV0cnkuaGVpZ2h0IC0gY2hhbmdlLnByZXZpb3VzLmhlaWdodCkgKiBzY2FsZTsKKwkJCQkJCQkKKwkJCQkJCQlpZiAoc3RlcCA9PSAwKQorCQkJCQkJCXsKKwkJCQkJCQkJc3RhdGUueCAtPSBkeDsKKwkJCQkJCQkJc3RhdGUueSAtPSBkeTsKKwkJCQkJCQkJc3RhdGUud2lkdGggLT0gc3g7CisJCQkJCQkJCXN0YXRlLmhlaWdodCAtPSBzeTsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJc3RhdGUueCArPSBkeCAvIG1heFN0ZXA7CisJCQkJCQkJCXN0YXRlLnkgKz0gZHkgLyBtYXhTdGVwOworCQkJCQkJCQlzdGF0ZS53aWR0aCArPSBzeCAvIG1heFN0ZXA7CisJCQkJCQkJCXN0YXRlLmhlaWdodCArPSBzeSAvIG1heFN0ZXA7CisJCQkJCQkJfQorCQkJCQkJCQorCQkJCQkJCWdyYXBoLmNlbGxSZW5kZXJlci5yZWRyYXcoc3RhdGUpOworCQkJCQkJCQorCQkJCQkJCS8vIEZhZGVzIGFsbCBjb25uZWN0ZWQgZWRnZXMgYW5kIGNoaWxkcmVuCisJCQkJCQkJbXhFZmZlY3RzLmNhc2NhZGVPcGFjaXR5KGdyYXBoLCBjaGFuZ2UuY2VsbCwgMTAwICogc3RlcCAvIG1heFN0ZXApOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoc3RlcCA8IG1heFN0ZXAgJiYgaXNSZXF1aXJlZCkKKwkJCXsKKwkJCQlzdGVwKys7CisJCQkJd2luZG93LnNldFRpbWVvdXQoYW5pbWF0ZSwgZGVsYXkpOworCQkJfQorCQkJZWxzZSBpZiAoZG9uZSAhPSBudWxsKQorCQkJeworCQkJCWRvbmUoKTsKKwkJCX0KKwkJfTsKKwkJCisJCXZhciBkZWxheSA9IDMwOworCQlhbmltYXRlKCk7CisJfSwKKyAgICAKKwkvKioKKwkgKiBGdW5jdGlvbjogY2FzY2FkZU9wYWNpdHkKKwkgKiAKKwkgKiBTZXRzIHRoZSBvcGFjaXR5IG9uIHRoZSBnaXZlbiBjZWxsIGFuZCBpdHMgZGVzY2VuZGFudHMuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBncmFwaCAtIDxteEdyYXBoPiB0aGF0IGNvbnRhaW5zIHRoZSBjZWxscy4KKwkgKiBjZWxsIC0gPG14Q2VsbD4gdG8gc2V0IHRoZSBvcGFjaXR5IGZvci4KKwkgKiBvcGFjaXR5IC0gTmV3IHZhbHVlIGZvciB0aGUgb3BhY2l0eSBpbiAlLgorCSAqLworICAgIGNhc2NhZGVPcGFjaXR5OiBmdW5jdGlvbihncmFwaCwgY2VsbCwgb3BhY2l0eSkKKwl7CisJCS8vIEZhZGVzIGFsbCBjaGlsZHJlbgorCQl2YXIgY2hpbGRDb3VudCA9IGdyYXBoLm1vZGVsLmdldENoaWxkQ291bnQoY2VsbCk7CisJCQorCQlmb3IgKHZhciBpPTA7IGk8Y2hpbGRDb3VudDsgaSsrKQorCQl7CisJCQl2YXIgY2hpbGQgPSBncmFwaC5tb2RlbC5nZXRDaGlsZEF0KGNlbGwsIGkpOworCQkJdmFyIGNoaWxkU3RhdGUgPSBncmFwaC5nZXRWaWV3KCkuZ2V0U3RhdGUoY2hpbGQpOworCQkJCisJCQlpZiAoY2hpbGRTdGF0ZSAhPSBudWxsKQorCQkJeworCQkJCW14VXRpbHMuc2V0T3BhY2l0eShjaGlsZFN0YXRlLnNoYXBlLm5vZGUsIG9wYWNpdHkpOworCQkJCW14RWZmZWN0cy5jYXNjYWRlT3BhY2l0eShncmFwaCwgY2hpbGQsIG9wYWNpdHkpOworCQkJfQorCQl9CisJCQorCQkvLyBGYWRlcyBhbGwgY29ubmVjdGVkIGVkZ2VzCisJCXZhciBlZGdlcyA9IGdyYXBoLm1vZGVsLmdldEVkZ2VzKGNlbGwpOworCQkKKwkJaWYgKGVkZ2VzICE9IG51bGwpCisJCXsKKwkJCWZvciAodmFyIGk9MDsgaTxlZGdlcy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQl2YXIgZWRnZVN0YXRlID0gZ3JhcGguZ2V0VmlldygpLmdldFN0YXRlKGVkZ2VzW2ldKTsKKwkJCQkKKwkJCQlpZiAoZWRnZVN0YXRlICE9IG51bGwpCisJCQkJeworCQkJCQlteFV0aWxzLnNldE9wYWNpdHkoZWRnZVN0YXRlLnNoYXBlLm5vZGUsIG9wYWNpdHkpOworCQkJCX0KKwkJCX0KKwkJfQorCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZmFkZU91dAorCSAqIAorCSAqIEFzeW5jaHJvbm91cyBmYWRlLW91dCBvcGVyYXRpb24uCisJICovCisJZmFkZU91dDogZnVuY3Rpb24obm9kZSwgZnJvbSwgcmVtb3ZlLCBzdGVwLCBkZWxheSwgaXNFbmFibGVkKQorCXsKKwkJc3RlcCA9IHN0ZXAgfHwgNDA7CisJCWRlbGF5ID0gZGVsYXkgfHwgMzA7CisJCQorCQl2YXIgb3BhY2l0eSA9IGZyb20gfHwgMTAwOworCQkKKwkJbXhVdGlscy5zZXRPcGFjaXR5KG5vZGUsIG9wYWNpdHkpOworCQkKKwkJaWYgKGlzRW5hYmxlZCB8fCBpc0VuYWJsZWQgPT0gbnVsbCkKKwkJeworCQkJdmFyIGYgPSBmdW5jdGlvbigpCisJCQl7CisJCQkgICAgb3BhY2l0eSA9IE1hdGgubWF4KG9wYWNpdHktc3RlcCwgMCk7CisJCQkJbXhVdGlscy5zZXRPcGFjaXR5KG5vZGUsIG9wYWNpdHkpOworCQkJCQorCQkJCWlmIChvcGFjaXR5ID4gMCkKKwkJCQl7CisJCQkJCXdpbmRvdy5zZXRUaW1lb3V0KGYsIGRlbGF5KTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CisJCQkJCQorCQkJCQlpZiAocmVtb3ZlICYmIG5vZGUucGFyZW50Tm9kZSkKKwkJCQkJeworCQkJCQkJbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOworCQkJCQl9CisJCQkJfQorCQkJfTsKKwkJCXdpbmRvdy5zZXRUaW1lb3V0KGYsIGRlbGF5KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW5vZGUuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOworCQkJCisJCQlpZiAocmVtb3ZlICYmIG5vZGUucGFyZW50Tm9kZSkKKwkJCXsKKwkJCQlub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7CisJCQl9CisJCX0KKwl9CisKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teEV2ZW50LmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhFdmVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTExNDNmCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhFdmVudC5qcwpAQCAtMCwwICsxLDE0MDYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KK3ZhciBteEV2ZW50ID0KK3sKKworCS8qKgorCSAqIENsYXNzOiBteEV2ZW50CisJICogCisJICogQ3Jvc3MtYnJvd3NlciBET00gZXZlbnQgc3VwcG9ydC4gRm9yIGludGVybmFsIGV2ZW50IGhhbmRsaW5nLAorCSAqIDxteEV2ZW50U291cmNlPiBhbmQgdGhlIGdyYXBoIGV2ZW50IGRpc3BhdGNoIGxvb3AgaW4gPG14R3JhcGg+IGFyZSB1c2VkLgorCSAqIAorCSAqIE1lbW9yeSBMZWFrczoKKwkgKiAKKwkgKiBVc2UgdGhpcyBjbGFzcyBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyBsaXN0ZW5lcnMgdG8vZnJvbSBET00gbm9kZXMuIFRoZQorCSAqIDxyZW1vdmVBbGxMaXN0ZW5lcnM+IGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHJlbW92ZSBhbGwgbGlzdGVuZXJzIHRoYXQKKwkgKiBoYXZlIGJlZW4gYWRkZWQgdXNpbmcgPGFkZExpc3RlbmVyPi4gVGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBpbnZva2VkIHdoZW4KKwkgKiB0aGUgbGFzdCByZWZlcmVuY2UgaXMgcmVtb3ZlZCBpbiB0aGUgSmF2YVNjcmlwdCBjb2RlLCB0eXBpY2FsbHkgd2hlbiB0aGUKKwkgKiByZWZlcmVuY2VkIERPTSBub2RlIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCBhbmQgaGVscHMgdG8gcmVkdWNlIG1lbW9yeQorCSAqIGxlYWtzIGluIElFNi4KKwkgKiAKKwkgKiBWYXJpYWJsZTogb2JqZWN0cworCSAqIAorCSAqIENvbnRhaW5zIGFsbCBvYmplY3RzIHdoZXJlIGFueSBsaXN0ZW5lciB3YXMgYWRkZWQgdXNpbmcgPGFkZExpc3RlbmVyPi4KKwkgKiBUaGlzIGlzIHVzZWQgdG8gcmVkdWNlIG1lbW9yeSBsZWFrcyBpbiBJRSwgc2VlIDxteENsaWVudC5kaXNwb3NlPi4KKwkgKi8KKwlvYmplY3RzOiBbXSwKKworCSAvKioKKwkgICogRnVuY3Rpb246IGFkZExpc3RlbmVyCisJICAqIAorCSAgKiBCaW5kcyB0aGUgZnVuY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBldmVudCBvbiB0aGUgZ2l2ZW4gZWxlbWVudC4gVXNlCisJICAqIDxteFV0aWxzLmJpbmQ+IGluIG9yZGVyIHRvIGJpbmQgdGhlICJ0aGlzIiBrZXl3b3JkIGluc2lkZSB0aGUgZnVuY3Rpb24KKwkgICogdG8gYSBnaXZlbiBleGVjdXRpb24gc2NvcGUuCisJICAqLworCWFkZExpc3RlbmVyOiBmdW5jdGlvbigpCisJeworCQl2YXIgdXBkYXRlTGlzdGVuZXJMaXN0ID0gZnVuY3Rpb24oZWxlbWVudCwgZXZlbnROYW1lLCBmdW5jdCkKKwkJeworCQkJaWYgKGVsZW1lbnQubXhMaXN0ZW5lckxpc3QgPT0gbnVsbCkKKwkJCXsKKwkJCQllbGVtZW50Lm14TGlzdGVuZXJMaXN0ID0gW107CisJCQkJbXhFdmVudC5vYmplY3RzLnB1c2goZWxlbWVudCk7CisJCQl9CisJCQkKKwkJCXZhciBlbnRyeSA9IHtuYW1lOiBldmVudE5hbWUsIGY6IGZ1bmN0fTsKKwkJCWVsZW1lbnQubXhMaXN0ZW5lckxpc3QucHVzaChlbnRyeSk7CisJCX07CisJCQorCQlpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpCisJCXsKKwkJCXJldHVybiBmdW5jdGlvbihlbGVtZW50LCBldmVudE5hbWUsIGZ1bmN0KQorCQkJeworCQkJCWVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0LCBmYWxzZSk7CisJCQkJdXBkYXRlTGlzdGVuZXJMaXN0KGVsZW1lbnQsIGV2ZW50TmFtZSwgZnVuY3QpOworCQkJfTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiBmdW5jdGlvbihlbGVtZW50LCBldmVudE5hbWUsIGZ1bmN0KQorCQkJeworCQkJCWVsZW1lbnQuYXR0YWNoRXZlbnQoJ29uJyArIGV2ZW50TmFtZSwgZnVuY3QpOworCQkJCXVwZGF0ZUxpc3RlbmVyTGlzdChlbGVtZW50LCBldmVudE5hbWUsIGZ1bmN0KTsJCQkJCisJCQl9OworCQl9CisJfSgpLAorCisJLyoqCisJICogRnVuY3Rpb246IHJlbW92ZUxpc3RlbmVyCisJICoKKwkgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudC4KKwkgKi8KKwlyZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24oKQorCXsKKwkJdmFyIHVwZGF0ZUxpc3RlbmVyID0gZnVuY3Rpb24oZWxlbWVudCwgZXZlbnROYW1lLCBmdW5jdCkKKwkJeworCQkJaWYgKGVsZW1lbnQubXhMaXN0ZW5lckxpc3QgIT0gbnVsbCkKKwkJCXsKKwkJCQl2YXIgbGlzdGVuZXJDb3VudCA9IGVsZW1lbnQubXhMaXN0ZW5lckxpc3QubGVuZ3RoOworCQkJCQorCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJDb3VudDsgaSsrKQorCQkJCXsKKwkJCQkJdmFyIGVudHJ5ID0gZWxlbWVudC5teExpc3RlbmVyTGlzdFtpXTsKKwkJCQkJCisJCQkJCWlmIChlbnRyeS5mID09IGZ1bmN0KQorCQkJCQl7CisJCQkJCQllbGVtZW50Lm14TGlzdGVuZXJMaXN0LnNwbGljZShpLCAxKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCWlmIChlbGVtZW50Lm14TGlzdGVuZXJMaXN0Lmxlbmd0aCA9PSAwKQorCQkJCXsKKwkJCQkJZWxlbWVudC5teExpc3RlbmVyTGlzdCA9IG51bGw7CisJCQkJCQorCQkJCQl2YXIgaWR4ID0gbXhVdGlscy5pbmRleE9mKG14RXZlbnQub2JqZWN0cywgZWxlbWVudCk7CisJCQkJCQorCQkJCQlpZiAoaWR4ID49IDApCisJCQkJCXsKKwkJCQkJCW14RXZlbnQub2JqZWN0cy5zcGxpY2UoaWR4LCAxKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfTsKKwkJCisJCWlmICh3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcikKKwkJeworCQkJcmV0dXJuIGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50TmFtZSwgZnVuY3QpCisJCQl7CisJCQkJZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3QsIGZhbHNlKTsKKwkJCQl1cGRhdGVMaXN0ZW5lcihlbGVtZW50LCBldmVudE5hbWUsIGZ1bmN0KTsKKwkJCX07CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gZnVuY3Rpb24oZWxlbWVudCwgZXZlbnROYW1lLCBmdW5jdCkKKwkJCXsKKwkJCQllbGVtZW50LmRldGFjaEV2ZW50KCdvbicgKyBldmVudE5hbWUsIGZ1bmN0KTsKKwkJCQl1cGRhdGVMaXN0ZW5lcihlbGVtZW50LCBldmVudE5hbWUsIGZ1bmN0KTsKKwkJCX07CisJCX0KKwl9KCksCisKKwkvKioKKwkgKiBGdW5jdGlvbjogcmVtb3ZlQWxsTGlzdGVuZXJzCisJICogCisJICogUmVtb3ZlcyBhbGwgbGlzdGVuZXJzIGZyb20gdGhlIGdpdmVuIGVsZW1lbnQuCisJICovCisJcmVtb3ZlQWxsTGlzdGVuZXJzOiBmdW5jdGlvbihlbGVtZW50KQorCXsKKwkJdmFyIGxpc3QgPSBlbGVtZW50Lm14TGlzdGVuZXJMaXN0OworCisJCWlmIChsaXN0ICE9IG51bGwpCisJCXsKKwkJCXdoaWxlIChsaXN0Lmxlbmd0aCA+IDApCisJCQl7CisJCQkJdmFyIGVudHJ5ID0gbGlzdFswXTsKKwkJCQlteEV2ZW50LnJlbW92ZUxpc3RlbmVyKGVsZW1lbnQsIGVudHJ5Lm5hbWUsIGVudHJ5LmYpOworCQkJfQorCQl9CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogYWRkR2VzdHVyZUxpc3RlbmVycworCSAqIAorCSAqIEFkZHMgdGhlIGdpdmVuIGxpc3RlbmVycyBmb3IgdG91Y2gsIG1vdXNlIGFuZC9vciBwb2ludGVyIGV2ZW50cy4gSWYKKwkgKiA8bXhDbGllbnQuSVNfUE9JTlRFUj4gaXMgdHJ1ZSB0aGVuIHBvaW50ZXIgZXZlbnRzIHdpbGwgYmUgcmVnaXN0ZXJlZCwKKwkgKiBlbHNlIHRoZSByZXNwZWN0aXZlIG1vdXNlIGV2ZW50cyB3aWxsIGJlIHJlZ2lzdGVyZWQuIElmIDxteENsaWVudC5JU19QT0lOVEVSPgorCSAqIGlzIGZhbHNlIGFuZCA8bXhDbGllbnQuSVNfVE9VQ0g+IGlzIHRydWUgdGhlbiB0aGUgcmVzcGVjdGl2ZSB0b3VjaCBldmVudHMKKwkgKiB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgd2VsbCBhcyB0aGUgbW91c2UgZXZlbnRzLgorCSAqLworCWFkZEdlc3R1cmVMaXN0ZW5lcnM6IGZ1bmN0aW9uKG5vZGUsIHN0YXJ0TGlzdGVuZXIsIG1vdmVMaXN0ZW5lciwgZW5kTGlzdGVuZXIpCisJeworCQlpZiAoc3RhcnRMaXN0ZW5lciAhPSBudWxsKQorCQl7CisJCQlteEV2ZW50LmFkZExpc3RlbmVyKG5vZGUsIChteENsaWVudC5JU19QT0lOVEVSKSA/ICdwb2ludGVyZG93bicgOiAnbW91c2Vkb3duJywgc3RhcnRMaXN0ZW5lcik7CisJCX0KKwkJCisJCWlmIChtb3ZlTGlzdGVuZXIgIT0gbnVsbCkKKwkJeworCQkJbXhFdmVudC5hZGRMaXN0ZW5lcihub2RlLCAobXhDbGllbnQuSVNfUE9JTlRFUikgPyAncG9pbnRlcm1vdmUnIDogJ21vdXNlbW92ZScsIG1vdmVMaXN0ZW5lcik7CisJCX0KKwkJCisJCWlmIChlbmRMaXN0ZW5lciAhPSBudWxsKQorCQl7CisJCQlteEV2ZW50LmFkZExpc3RlbmVyKG5vZGUsIChteENsaWVudC5JU19QT0lOVEVSKSA/ICdwb2ludGVydXAnIDogJ21vdXNldXAnLCBlbmRMaXN0ZW5lcik7CisJCX0KKwkJCisJCWlmICghbXhDbGllbnQuSVNfUE9JTlRFUiAmJiBteENsaWVudC5JU19UT1VDSCkKKwkJeworCQkJaWYgKHN0YXJ0TGlzdGVuZXIgIT0gbnVsbCkKKwkJCXsKKwkJCQlteEV2ZW50LmFkZExpc3RlbmVyKG5vZGUsICd0b3VjaHN0YXJ0Jywgc3RhcnRMaXN0ZW5lcik7CisJCQl9CisJCQkKKwkJCWlmIChtb3ZlTGlzdGVuZXIgIT0gbnVsbCkKKwkJCXsKKwkJCQlteEV2ZW50LmFkZExpc3RlbmVyKG5vZGUsICd0b3VjaG1vdmUnLCBtb3ZlTGlzdGVuZXIpOworCQkJfQorCQkJCisJCQlpZiAoZW5kTGlzdGVuZXIgIT0gbnVsbCkKKwkJCXsKKwkJCQlteEV2ZW50LmFkZExpc3RlbmVyKG5vZGUsICd0b3VjaGVuZCcsIGVuZExpc3RlbmVyKTsKKwkJCX0KKwkJfQorCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IHJlbW92ZUdlc3R1cmVMaXN0ZW5lcnMKKwkgKiAKKwkgKiBSZW1vdmVzIHRoZSBnaXZlbiBsaXN0ZW5lcnMgZnJvbSBtb3VzZWRvd24sIG1vdXNlbW92ZSwgbW91c2V1cCBhbmQgdGhlCisJICogcmVzcGVjdGl2ZSB0b3VjaCBldmVudHMgaWYgPG14Q2xpZW50LklTX1RPVUNIPiBpcyB0cnVlLgorCSAqLworCXJlbW92ZUdlc3R1cmVMaXN0ZW5lcnM6IGZ1bmN0aW9uKG5vZGUsIHN0YXJ0TGlzdGVuZXIsIG1vdmVMaXN0ZW5lciwgZW5kTGlzdGVuZXIpCisJeworCQlpZiAoc3RhcnRMaXN0ZW5lciAhPSBudWxsKQorCQl7CisJCQlteEV2ZW50LnJlbW92ZUxpc3RlbmVyKG5vZGUsIChteENsaWVudC5JU19QT0lOVEVSKSA/ICdwb2ludGVyZG93bicgOiAnbW91c2Vkb3duJywgc3RhcnRMaXN0ZW5lcik7CisJCX0KKwkJCisJCWlmIChtb3ZlTGlzdGVuZXIgIT0gbnVsbCkKKwkJeworCQkJbXhFdmVudC5yZW1vdmVMaXN0ZW5lcihub2RlLCAobXhDbGllbnQuSVNfUE9JTlRFUikgPyAncG9pbnRlcm1vdmUnIDogJ21vdXNlbW92ZScsIG1vdmVMaXN0ZW5lcik7CisJCX0KKwkJCisJCWlmIChlbmRMaXN0ZW5lciAhPSBudWxsKQorCQl7CisJCQlteEV2ZW50LnJlbW92ZUxpc3RlbmVyKG5vZGUsIChteENsaWVudC5JU19QT0lOVEVSKSA/ICdwb2ludGVydXAnIDogJ21vdXNldXAnLCBlbmRMaXN0ZW5lcik7CisJCX0KKwkJCisJCWlmICghbXhDbGllbnQuSVNfUE9JTlRFUiAmJiBteENsaWVudC5JU19UT1VDSCkKKwkJeworCQkJaWYgKHN0YXJ0TGlzdGVuZXIgIT0gbnVsbCkKKwkJCXsKKwkJCQlteEV2ZW50LnJlbW92ZUxpc3RlbmVyKG5vZGUsICd0b3VjaHN0YXJ0Jywgc3RhcnRMaXN0ZW5lcik7CisJCQl9CisJCQkKKwkJCWlmIChtb3ZlTGlzdGVuZXIgIT0gbnVsbCkKKwkJCXsKKwkJCQlteEV2ZW50LnJlbW92ZUxpc3RlbmVyKG5vZGUsICd0b3VjaG1vdmUnLCBtb3ZlTGlzdGVuZXIpOworCQkJfQorCQkJCisJCQlpZiAoZW5kTGlzdGVuZXIgIT0gbnVsbCkKKwkJCXsKKwkJCQlteEV2ZW50LnJlbW92ZUxpc3RlbmVyKG5vZGUsICd0b3VjaGVuZCcsIGVuZExpc3RlbmVyKTsKKwkJCX0KKwkJfQorCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IHJlZGlyZWN0TW91c2VFdmVudHMKKwkgKgorCSAqIFJlZGlyZWN0cyB0aGUgbW91c2UgZXZlbnRzIGZyb20gdGhlIGdpdmVuIERPTSBub2RlIHRvIHRoZSBncmFwaCBkaXNwYXRjaAorCSAqIGxvb3AgdXNpbmcgdGhlIGV2ZW50IGFuZCBnaXZlbiBzdGF0ZSBhcyBldmVudCBhcmd1bWVudHMuIFN0YXRlIGNhbgorCSAqIGVpdGhlciBiZSBhbiBpbnN0YW5jZSBvZiA8bXhDZWxsU3RhdGU+IG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuCisJICogPG14Q2VsbFN0YXRlPi4gVGhlIGRvd24sIG1vdmUsIHVwIGFuZCBkYmxDbGljayBhcmd1bWVudHMgYXJlIG9wdGlvbmFsCisJICogZnVuY3Rpb25zIHRoYXQgdGFrZSB0aGUgdHJpZ2dlciBldmVudCBhcyBhcmd1bWVudHMgYW5kIHJlcGxhY2UgdGhlCisJICogZGVmYXVsdCBiZWhhdmlvdXIuCisJICovCisJcmVkaXJlY3RNb3VzZUV2ZW50czogZnVuY3Rpb24obm9kZSwgZ3JhcGgsIHN0YXRlLCBkb3duLCBtb3ZlLCB1cCwgZGJsQ2xpY2spCisJeworCQl2YXIgZ2V0U3RhdGUgPSBmdW5jdGlvbihldnQpCisJCXsKKwkJCXJldHVybiAodHlwZW9mKHN0YXRlKSA9PSAnZnVuY3Rpb24nKSA/IHN0YXRlKGV2dCkgOiBzdGF0ZTsKKwkJfTsKKwkJCisJCW14RXZlbnQuYWRkR2VzdHVyZUxpc3RlbmVycyhub2RlLCBmdW5jdGlvbiAoZXZ0KQorCQl7CisJCQlpZiAoZG93biAhPSBudWxsKQorCQkJeworCQkJCWRvd24oZXZ0KTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFteEV2ZW50LmlzQ29uc3VtZWQoZXZ0KSkKKwkJCXsKKwkJCQlncmFwaC5maXJlTW91c2VFdmVudChteEV2ZW50Lk1PVVNFX0RPV04sIG5ldyBteE1vdXNlRXZlbnQoZXZ0LCBnZXRTdGF0ZShldnQpKSk7CisJCQl9CisJCX0sCisJCWZ1bmN0aW9uIChldnQpCisJCXsKKwkJCWlmIChtb3ZlICE9IG51bGwpCisJCQl7CisJCQkJbW92ZShldnQpOworCQkJfQorCQkJZWxzZSBpZiAoIW14RXZlbnQuaXNDb25zdW1lZChldnQpKQorCQkJeworCQkJCWdyYXBoLmZpcmVNb3VzZUV2ZW50KG14RXZlbnQuTU9VU0VfTU9WRSwgbmV3IG14TW91c2VFdmVudChldnQsIGdldFN0YXRlKGV2dCkpKTsKKwkJCX0KKwkJfSwKKwkJZnVuY3Rpb24gKGV2dCkKKwkJeworCQkJaWYgKHVwICE9IG51bGwpCisJCQl7CisJCQkJdXAoZXZ0KTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFteEV2ZW50LmlzQ29uc3VtZWQoZXZ0KSkKKwkJCXsKKwkJCQlncmFwaC5maXJlTW91c2VFdmVudChteEV2ZW50Lk1PVVNFX1VQLCBuZXcgbXhNb3VzZUV2ZW50KGV2dCwgZ2V0U3RhdGUoZXZ0KSkpOworCQkJfQorCQl9KTsKKworCQlteEV2ZW50LmFkZExpc3RlbmVyKG5vZGUsICdkYmxjbGljaycsIGZ1bmN0aW9uIChldnQpCisJCXsKKwkJCWlmIChkYmxDbGljayAhPSBudWxsKQorCQkJeworCQkJCWRibENsaWNrKGV2dCk7CisJCQl9CisJCQllbHNlIGlmICghbXhFdmVudC5pc0NvbnN1bWVkKGV2dCkpCisJCQl7CisJCQkJdmFyIHRtcCA9IGdldFN0YXRlKGV2dCk7CisJCQkJZ3JhcGguZGJsQ2xpY2soZXZ0LCAodG1wICE9IG51bGwpID8gdG1wLmNlbGwgOiBudWxsKTsKKwkJCX0KKwkJfSk7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiByZWxlYXNlCisJICogCisJICogUmVtb3ZlcyB0aGUga25vd24gbGlzdGVuZXJzIGZyb20gdGhlIGdpdmVuIERPTSBub2RlIGFuZCBpdHMgZGVzY2VuZGFudHMuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBlbGVtZW50IC0gRE9NIG5vZGUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lcnMgZnJvbS4KKwkgKi8KKwlyZWxlYXNlOiBmdW5jdGlvbihlbGVtZW50KQorCXsKKwkJaWYgKGVsZW1lbnQgIT0gbnVsbCkKKwkJeworCQkJbXhFdmVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoZWxlbWVudCk7CisJCQkKKwkJCXZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGROb2RlczsKKwkJCQorCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpCisJCQl7CisJCSAgICAgICAgdmFyIGNoaWxkQ291bnQgPSBjaGlsZHJlbi5sZW5ndGg7CisJCSAgICAgICAgCisJCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpICs9IDEpCisJCSAgICAgICAgeworCQkgICAgICAgIAlteEV2ZW50LnJlbGVhc2UoY2hpbGRyZW5baV0pOworCQkgICAgICAgIH0KKwkJICAgIH0KKwkJfQorCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogYWRkTW91c2VXaGVlbExpc3RlbmVyCisJICogCisJICogSW5zdGFsbHMgdGhlIGdpdmVuIGZ1bmN0aW9uIGFzIGEgaGFuZGxlciBmb3IgbW91c2Ugd2hlZWwgZXZlbnRzLiBUaGUKKwkgKiBmdW5jdGlvbiBoYXMgdHdvIGFyZ3VtZW50czogdGhlIG1vdXNlIGV2ZW50IGFuZCBhIGJvb2xlYW4gdGhhdCBzcGVjaWZpZXMKKwkgKiBpZiB0aGUgd2hlZWwgd2FzIG1vdmVkIHVwIG9yIGRvd24uCisJICogCisJICogVGhpcyBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBJRSA2IGFuZCA3LCBGaXJlZm94IChhbGwgdmVyc2lvbnMpLCBPcGVyYSBhbmQKKwkgKiBTYWZhcmkuIEl0IGRvZXMgY3VycmVudGx5IG5vdCB3b3JrIG9uIFNhZmFyaSBmb3IgTWFjLgorCSAqIAorCSAqIEV4YW1wbGU6CisJICogCisJICogKGNvZGUpCisJICogbXhFdmVudC5hZGRNb3VzZVdoZWVsTGlzdGVuZXIoZnVuY3Rpb24gKGV2dCwgdXApCisJICogeworCSAqICAgbXhMb2cuc2hvdygpOworCSAqICAgbXhMb2cuZGVidWcoJ21vdXNlV2hlZWw6IHVwPScrdXApOworCSAqIH0pOworCSAqKGVuZCkKKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGZ1bmN0IC0gSGFuZGxlciBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBldmVudCBhcmd1bWVudCBhbmQgYSBib29sZWFuIHVwCisJICogYXJndW1lbnQgZm9yIHRoZSBtb3VzZXdoZWVsIGRpcmVjdGlvbi4KKwkgKi8KKwlhZGRNb3VzZVdoZWVsTGlzdGVuZXI6IGZ1bmN0aW9uKGZ1bmN0KQorCXsKKwkJaWYgKGZ1bmN0ICE9IG51bGwpCisJCXsKKwkJCXZhciB3aGVlbEhhbmRsZXIgPSBmdW5jdGlvbihldnQpCisJCQl7CisJCQkJLy8gSUUgZG9lcyBub3QgZ2l2ZSBhbiBldmVudCBvYmplY3QgYnV0IHRoZQorCQkJCS8vIGdsb2JhbCBldmVudCBvYmplY3QgaXMgdGhlIG1vdXNld2hlZWwgZXZlbnQKKwkJCQkvLyBhdCB0aGlzIHBvaW50IGluIHRpbWUuCisJCQkJaWYgKGV2dCA9PSBudWxsKQorCQkJCXsKKwkJCQkJZXZ0ID0gd2luZG93LmV2ZW50OworCQkJCX0KKwkJCQorCQkJCXZhciBkZWx0YSA9IDA7CisJCQkJCisJCQkJaWYgKG14Q2xpZW50LklTX0ZGKQorCQkJCXsKKwkJCQkJZGVsdGEgPSAtZXZ0LmRldGFpbCAvIDI7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWRlbHRhID0gZXZ0LndoZWVsRGVsdGEgLyAxMjA7CisJCQkJfQorCQkJCQorCQkJCS8vIEhhbmRsZXMgdGhlIGV2ZW50IHVzaW5nIHRoZSBnaXZlbiBmdW5jdGlvbgorCQkJCWlmIChkZWx0YSAhPSAwKQorCQkJCXsKKwkJCQkJZnVuY3QoZXZ0LCBkZWx0YSA+IDApOworCQkJCX0KKwkJCX07CisJCisJCQkvLyBXZWJraXQgaGFzIE5TIGV2ZW50IEFQSSwgYnV0IElFIGV2ZW50IG5hbWUgYW5kIGRldGFpbHMgCisJCQlpZiAobXhDbGllbnQuSVNfTlMgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09IG51bGwpCisJCQl7CisJCQkJdmFyIGV2ZW50TmFtZSA9IChteENsaWVudC5JU19TRiB8fCAJbXhDbGllbnQuSVNfR0MpID8gJ21vdXNld2hlZWwnIDogJ0RPTU1vdXNlU2Nyb2xsJzsKKwkJCQlteEV2ZW50LmFkZExpc3RlbmVyKHdpbmRvdywgZXZlbnROYW1lLCB3aGVlbEhhbmRsZXIpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW14RXZlbnQuYWRkTGlzdGVuZXIoZG9jdW1lbnQsICdtb3VzZXdoZWVsJywgd2hlZWxIYW5kbGVyKTsKKwkJCX0KKwkJfQorCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IGRpc2FibGVDb250ZXh0TWVudQorCSAqCisJICogRGlzYWJsZXMgdGhlIGNvbnRleHQgbWVudSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCisJICovCisJZGlzYWJsZUNvbnRleHRNZW51OiBmdW5jdGlvbigpCisJeworCQlpZiAobXhDbGllbnQuSVNfSUUgJiYgKHR5cGVvZihkb2N1bWVudC5kb2N1bWVudE1vZGUpID09PSAndW5kZWZpbmVkJyB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPCA5KSkKKwkJeworCQkJcmV0dXJuIGZ1bmN0aW9uKGVsZW1lbnQpCisJCQl7CisJCQkJbXhFdmVudC5hZGRMaXN0ZW5lcihlbGVtZW50LCAnY29udGV4dG1lbnUnLCBmdW5jdGlvbigpCisJCQkJeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfSk7CisJCQl9OworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuIGZ1bmN0aW9uKGVsZW1lbnQpCisJCQl7CisJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ29uY29udGV4dG1lbnUnLCAncmV0dXJuIGZhbHNlOycpOworCQkJfTsJCQorCQl9CisJfSgpLAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBnZXRTb3VyY2UKKwkgKiAKKwkgKiBSZXR1cm5zIHRoZSBldmVudCdzIHRhcmdldCBvciBzcmNFbGVtZW50IGRlcGVuZGluZyBvbiB0aGUgYnJvd3Nlci4KKwkgKi8KKwlnZXRTb3VyY2U6IGZ1bmN0aW9uKGV2dCkKKwl7CisJCXJldHVybiAoZXZ0LnNyY0VsZW1lbnQgIT0gbnVsbCkgPyBldnQuc3JjRWxlbWVudCA6IGV2dC50YXJnZXQ7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBpc0NvbnN1bWVkCisJICogCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBoYXMgYmVlbiBjb25zdW1lZCB1c2luZyA8Y29uc3VtZT4uCisJICovCisJaXNDb25zdW1lZDogZnVuY3Rpb24oZXZ0KQorCXsKKwkJcmV0dXJuIGV2dC5pc0NvbnN1bWVkICE9IG51bGwgJiYgZXZ0LmlzQ29uc3VtZWQ7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBpc1RvdWNoRXZlbnQKKwkgKiAKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IHdhcyBnZW5lcmF0ZWQgdXNpbmcgYSB0b3VjaCBkZXZpY2UgKG5vdCBhIHBlbiBvciBtb3VzZSkuCisJICovCisJaXNUb3VjaEV2ZW50OiBmdW5jdGlvbihldnQpCisJeworCQlyZXR1cm4gKGV2dC5wb2ludGVyVHlwZSAhPSBudWxsKSA/IChldnQucG9pbnRlclR5cGUgPT0gJ3RvdWNoJyB8fCBldnQucG9pbnRlclR5cGUgPT09CisJCQlldnQuTVNQT0lOVEVSX1RZUEVfVE9VQ0gpIDogKChldnQubW96SW5wdXRTb3VyY2UgIT0gbnVsbCkgPworCQkJCQlldnQubW96SW5wdXRTb3VyY2UgPT0gNSA6IGV2dC50eXBlLmluZGV4T2YoJ3RvdWNoJykgPT0gMCk7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBpc1BlbkV2ZW50CisJICogCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCB3YXMgZ2VuZXJhdGVkIHVzaW5nIGEgcGVuIChub3QgYSB0b3VjaCBkZXZpY2Ugb3IgbW91c2UpLgorCSAqLworCWlzUGVuRXZlbnQ6IGZ1bmN0aW9uKGV2dCkKKwl7CisJCXJldHVybiAoZXZ0LnBvaW50ZXJUeXBlICE9IG51bGwpID8gKGV2dC5wb2ludGVyVHlwZSA9PSAncGVuJyB8fCBldnQucG9pbnRlclR5cGUgPT09CisJCQlldnQuTVNQT0lOVEVSX1RZUEVfUEVOKSA6ICgoZXZ0Lm1veklucHV0U291cmNlICE9IG51bGwpID8KKwkJCQkJZXZ0Lm1veklucHV0U291cmNlID09IDIgOiBldnQudHlwZS5pbmRleE9mKCdwZW4nKSA9PSAwKTsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGlzTXVsdGlUb3VjaEV2ZW50CisJICogCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCB3YXMgZ2VuZXJhdGVkIHVzaW5nIGEgdG91Y2ggZGV2aWNlIChub3QgYSBwZW4gb3IgbW91c2UpLgorCSAqLworCWlzTXVsdGlUb3VjaEV2ZW50OiBmdW5jdGlvbihldnQpCisJeworCQlyZXR1cm4gKGV2dC50eXBlICE9IG51bGwgJiYgZXZ0LnR5cGUuaW5kZXhPZigndG91Y2gnKSA9PSAwICYmIGV2dC50b3VjaGVzICE9IG51bGwgJiYgZXZ0LnRvdWNoZXMubGVuZ3RoID4gMSk7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBpc01vdXNlRXZlbnQKKwkgKiAKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IHdhcyBnZW5lcmF0ZWQgdXNpbmcgYSBtb3VzZSAobm90IGEgcGVuIG9yIHRvdWNoIGRldmljZSkuCisJICovCisJaXNNb3VzZUV2ZW50OiBmdW5jdGlvbihldnQpCisJeworCQlyZXR1cm4gKGV2dC5wb2ludGVyVHlwZSAhPSBudWxsKSA/IChldnQucG9pbnRlclR5cGUgPT0gJ21vdXNlJyB8fCBldnQucG9pbnRlclR5cGUgPT09CisJCQlldnQuTVNQT0lOVEVSX1RZUEVfTU9VU0UpIDogKChldnQubW96SW5wdXRTb3VyY2UgIT0gbnVsbCkgPworCQkJCWV2dC5tb3pJbnB1dFNvdXJjZSA9PSAxIDogZXZ0LnR5cGUuaW5kZXhPZignbW91c2UnKSA9PSAwKTsKKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBpc0xlZnRNb3VzZUJ1dHRvbgorCSAqIAorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdCBtb3VzZSBidXR0b24gaXMgcHJlc3NlZCBmb3IgdGhlIGdpdmVuIGV2ZW50LgorCSAqIFRvIGNoZWNrIGlmIGEgYnV0dG9uIGlzIHByZXNzZWQgZHVyaW5nIGEgbW91c2VNb3ZlIHlvdSBzaG91bGQgdXNlIHRoZQorCSAqIDxteEdyYXBoLmlzTW91c2VEb3duPiBwcm9wZXJ0eS4gTm90ZSB0aGF0IHRoaXMgcmV0dXJucyB0cnVlIGluIEZpcmVmb3gKKwkgKiBmb3IgY29udHJvbCtsZWZ0LWNsaWNrIG9uIHRoZSBNYWMuCisJICovCisJaXNMZWZ0TW91c2VCdXR0b246IGZ1bmN0aW9uKGV2dCkKKwl7CisJCS8vIFNwZWNpYWwgY2FzZSBmb3IgbW91c2Vtb3ZlIGFuZCBtb3VzZWRvd24gd2UgY2hlY2sgdGhlIGJ1dHRvbnMKKwkJLy8gaWYgaXQgZXhpc3RzIGJlY2F1c2Ugd2hpY2ggaXMgMCBldmVuIGlmIG5vIGJ1dHRvbiBpcyBwcmVzc2VkCisJCWlmICgnYnV0dG9ucycgaW4gZXZ0ICYmIChldnQudHlwZSA9PSAnbW91c2Vkb3duJyB8fCBldnQudHlwZSA9PSAnbW91c2Vtb3ZlJykpCisJCXsKKwkJCXJldHVybiBldnQuYnV0dG9ucyA9PSAxOworCQl9CisJCWVsc2UgaWYgKCd3aGljaCcgaW4gZXZ0KQorCQl7CisJICAgICAgICByZXR1cm4gZXZ0LndoaWNoID09PSAxOworCSAgICB9CisJCWVsc2UKKwkJeworCSAgICAgICAgcmV0dXJuIGV2dC5idXR0b24gPT09IDE7CisJICAgIH0KKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBpc01pZGRsZU1vdXNlQnV0dG9uCisJICogCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBtaWRkbGUgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQgZm9yIHRoZSBnaXZlbiBldmVudC4KKwkgKiBUbyBjaGVjayBpZiBhIGJ1dHRvbiBpcyBwcmVzc2VkIGR1cmluZyBhIG1vdXNlTW92ZSB5b3Ugc2hvdWxkIHVzZSB0aGUKKwkgKiA8bXhHcmFwaC5pc01vdXNlRG93bj4gcHJvcGVydHkuCisJICovCisJaXNNaWRkbGVNb3VzZUJ1dHRvbjogZnVuY3Rpb24oZXZ0KQorCXsKKwkJaWYgKCd3aGljaCcgaW4gZXZ0KQorCQl7CisJICAgICAgICByZXR1cm4gZXZ0LndoaWNoID09PSAyOworCSAgICB9CisJCWVsc2UKKwkJeworCSAgICAgICAgcmV0dXJuIGV2dC5idXR0b24gPT09IDQ7CisJICAgIH0KKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBpc1JpZ2h0TW91c2VCdXR0b24KKwkgKiAKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiB3YXMgcHJlc3NlZC4gTm90ZSB0aGF0IHRoaXMKKwkgKiBidXR0b24gbWlnaHQgbm90IGJlIGF2YWlsYWJsZSBvbiBzb21lIHN5c3RlbXMuIEZvciBoYW5kbGluZyBhIHBvcHVwCisJICogdHJpZ2dlciA8aXNQb3B1cFRyaWdnZXI+IHNob3VsZCBiZSB1c2VkLgorCSAqLworCWlzUmlnaHRNb3VzZUJ1dHRvbjogZnVuY3Rpb24oZXZ0KQorCXsKKwkJaWYgKCd3aGljaCcgaW4gZXZ0KQorCQl7CisJICAgICAgICByZXR1cm4gZXZ0LndoaWNoID09PSAzOworCSAgICB9CisJCWVsc2UKKwkJeworCSAgICAgICAgcmV0dXJuIGV2dC5idXR0b24gPT09IDI7CisJICAgIH0KKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGlzUG9wdXBUcmlnZ2VyCisJICogCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBpcyBhIHBvcHVwIHRyaWdnZXIuIFRoaXMgaW1wbGVtZW50YXRpb24KKwkgKiByZXR1cm5zIHRydWUgaWYgdGhlIHJpZ2h0IGJ1dHRvbiBvciB0aGUgbGVmdCBidXR0b24gYW5kIGNvbnRyb2wgd2FzCisJICogcHJlc3NlZCBvbiBhIE1hYy4KKwkgKi8KKwlpc1BvcHVwVHJpZ2dlcjogZnVuY3Rpb24oZXZ0KQorCXsKKwkJcmV0dXJuIG14RXZlbnQuaXNSaWdodE1vdXNlQnV0dG9uKGV2dCkgfHwgKG14Q2xpZW50LklTX01BQyAmJiBteEV2ZW50LmlzQ29udHJvbERvd24oZXZ0KSAmJgorCQkJIW14RXZlbnQuaXNTaGlmdERvd24oZXZ0KSAmJiAhbXhFdmVudC5pc01ldGFEb3duKGV2dCkgJiYgIW14RXZlbnQuaXNBbHREb3duKGV2dCkpOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogaXNTaGlmdERvd24KKwkgKiAKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNoaWZ0IGtleSBpcyBwcmVzc2VkIGZvciB0aGUgZ2l2ZW4gZXZlbnQuCisJICovCisJaXNTaGlmdERvd246IGZ1bmN0aW9uKGV2dCkKKwl7CisJCXJldHVybiAoZXZ0ICE9IG51bGwpID8gZXZ0LnNoaWZ0S2V5IDogZmFsc2U7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBpc0FsdERvd24KKwkgKiAKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFsdCBrZXkgaXMgcHJlc3NlZCBmb3IgdGhlIGdpdmVuIGV2ZW50LgorCSAqLworCWlzQWx0RG93bjogZnVuY3Rpb24oZXZ0KQorCXsKKwkJcmV0dXJuIChldnQgIT0gbnVsbCkgPyBldnQuYWx0S2V5IDogZmFsc2U7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBpc0NvbnRyb2xEb3duCisJICogCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb250cm9sIGtleSBpcyBwcmVzc2VkIGZvciB0aGUgZ2l2ZW4gZXZlbnQuCisJICovCisJaXNDb250cm9sRG93bjogZnVuY3Rpb24oZXZ0KQorCXsKKwkJcmV0dXJuIChldnQgIT0gbnVsbCkgPyBldnQuY3RybEtleSA6IGZhbHNlOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogaXNNZXRhRG93bgorCSAqIAorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0YSBrZXkgaXMgcHJlc3NlZCBmb3IgdGhlIGdpdmVuIGV2ZW50LgorCSAqLworCWlzTWV0YURvd246IGZ1bmN0aW9uKGV2dCkKKwl7CisJCXJldHVybiAoZXZ0ICE9IG51bGwpID8gZXZ0Lm1ldGFLZXkgOiBmYWxzZTsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGdldE1haW5FdmVudAorCSAqIAorCSAqIFJldHVybnMgdGhlIHRvdWNoIG9yIG1vdXNlIGV2ZW50IHRoYXQgY29udGFpbnMgdGhlIG1vdXNlIGNvb3JkaW5hdGVzLgorCSAqLworCWdldE1haW5FdmVudDogZnVuY3Rpb24oZSkKKwl7CisJCWlmICgoZS50eXBlID09ICd0b3VjaHN0YXJ0JyB8fCBlLnR5cGUgPT0gJ3RvdWNobW92ZScpICYmIGUudG91Y2hlcyAhPSBudWxsICYmIGUudG91Y2hlc1swXSAhPSBudWxsKQorCQl7CisJCQllID0gZS50b3VjaGVzWzBdOworCQl9CisJCWVsc2UgaWYgKGUudHlwZSA9PSAndG91Y2hlbmQnICYmIGUuY2hhbmdlZFRvdWNoZXMgIT0gbnVsbCAmJiBlLmNoYW5nZWRUb3VjaGVzWzBdICE9IG51bGwpCisJCXsKKwkJCWUgPSBlLmNoYW5nZWRUb3VjaGVzWzBdOworCQl9CisJCQorCQlyZXR1cm4gZTsKKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBnZXRDbGllbnRYCisJICogCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBtZXRhIGtleSBpcyBwcmVzc2VkIGZvciB0aGUgZ2l2ZW4gZXZlbnQuCisJICovCisJZ2V0Q2xpZW50WDogZnVuY3Rpb24oZSkKKwl7CisJCXJldHVybiBteEV2ZW50LmdldE1haW5FdmVudChlKS5jbGllbnRYOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0Q2xpZW50WQorCSAqIAorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0YSBrZXkgaXMgcHJlc3NlZCBmb3IgdGhlIGdpdmVuIGV2ZW50LgorCSAqLworCWdldENsaWVudFk6IGZ1bmN0aW9uKGUpCisJeworCQlyZXR1cm4gbXhFdmVudC5nZXRNYWluRXZlbnQoZSkuY2xpZW50WTsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGNvbnN1bWUKKwkgKiAKKwkgKiBDb25zdW1lcyB0aGUgZ2l2ZW4gZXZlbnQuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBldnQgLSBOYXRpdmUgZXZlbnQgdG8gYmUgY29uc3VtZWQuCisJICogcHJldmVudERlZmF1bHQgLSBPcHRpb25hbCBib29sZWFuIHRvIHByZXZlbnQgdGhlIGRlZmF1bHQgZm9yIHRoZSBldmVudC4KKwkgKiBEZWZhdWx0IGlzIHRydWUuCisJICogc3RvcFByb3BhZ2F0aW9uIC0gT3B0aW9uIGJvb2xlYW4gdG8gc3RvcCBldmVudCBwcm9wYWdhdGlvbi4gRGVmYXVsdCBpcworCSAqIHRydWUuCisJICovCisJY29uc3VtZTogZnVuY3Rpb24oZXZ0LCBwcmV2ZW50RGVmYXVsdCwgc3RvcFByb3BhZ2F0aW9uKQorCXsKKwkJcHJldmVudERlZmF1bHQgPSAocHJldmVudERlZmF1bHQgIT0gbnVsbCkgPyBwcmV2ZW50RGVmYXVsdCA6IHRydWU7CisJCXN0b3BQcm9wYWdhdGlvbiA9IChzdG9wUHJvcGFnYXRpb24gIT0gbnVsbCkgPyBzdG9wUHJvcGFnYXRpb24gOiB0cnVlOworCQkKKwkJaWYgKHByZXZlbnREZWZhdWx0KQorCQl7CisJCQlpZiAoZXZ0LnByZXZlbnREZWZhdWx0KQorCQkJeworCQkJCWlmIChzdG9wUHJvcGFnYXRpb24pCisJCQkJeworCQkJCQlldnQuc3RvcFByb3BhZ2F0aW9uKCk7CisJCQkJfQorCQkJCQorCQkJCWV2dC5wcmV2ZW50RGVmYXVsdCgpOworCQkJfQorCQkJZWxzZSBpZiAoc3RvcFByb3BhZ2F0aW9uKQorCQkJeworCQkJCWV2dC5jYW5jZWxCdWJibGUgPSB0cnVlOworCQkJfQorCQl9CisKKwkJLy8gT3BlcmEKKwkJZXZ0LmlzQ29uc3VtZWQgPSB0cnVlOworCisJCS8vIE90aGVyIGJyb3dzZXJzCisJCWlmICghZXZ0LnByZXZlbnREZWZhdWx0KQorCQl7CisJCQlldnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKKwkJfQorCX0sCisJCisJLy8KKwkvLyBTcGVjaWFsIGhhbmRsZXMgaW4gbW91c2UgZXZlbnRzCisJLy8KKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogTEFCRUxfSEFORExFCisJICogCisJICogSW5kZXggZm9yIHRoZSBsYWJlbCBoYW5kbGUgaW4gYW4gbXhNb3VzZUV2ZW50LiBUaGlzIHNob3VsZCBiZSBhIG5lZ2F0aXZlCisJICogdmFsdWUgdGhhdCBkb2VzIG5vdCBpbnRlcmZlcmUgd2l0aCBhbnkgcG9zc2libGUgaGFuZGxlIGluZGljZXMuIERlZmF1bHQKKwkgKiBpcyAtMS4KKwkgKi8KKwlMQUJFTF9IQU5ETEU6IC0xLAorCQorCS8qKgorCSAqIFZhcmlhYmxlOiBST1RBVElPTl9IQU5ETEUKKwkgKiAKKwkgKiBJbmRleCBmb3IgdGhlIHJvdGF0aW9uIGhhbmRsZSBpbiBhbiBteE1vdXNlRXZlbnQuIFRoaXMgc2hvdWxkIGJlIGEKKwkgKiBuZWdhdGl2ZSB2YWx1ZSB0aGF0IGRvZXMgbm90IGludGVyZmVyZSB3aXRoIGFueSBwb3NzaWJsZSBoYW5kbGUgaW5kaWNlcy4KKwkgKiBEZWZhdWx0IGlzIC0yLgorCSAqLworCVJPVEFUSU9OX0hBTkRMRTogLTIsCisJCisJLyoqCisJICogVmFyaWFibGU6IENVU1RPTV9IQU5ETEUKKwkgKiAKKwkgKiBTdGFydCBpbmRleCBmb3IgdGhlIGN1c3RvbSBoYW5kbGVzIGluIGFuIG14TW91c2VFdmVudC4gVGhpcyBzaG91bGQgYmUgYQorCSAqIG5lZ2F0aXZlIHZhbHVlIGFuZCBpcyB0aGUgc3RhcnQgaW5kZXggd2hpY2ggaXMgZGVjcmVtZW50ZWQgZm9yIGVhY2gKKwkgKiBjdXN0b20gaGFuZGxlLiBEZWZhdWx0IGlzIC0xMDAuCisJICovCisJQ1VTVE9NX0hBTkRMRTogLTEwMCwKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogVklSVFVBTF9IQU5ETEUKKwkgKiAKKwkgKiBTdGFydCBpbmRleCBmb3IgdGhlIHZpcnR1YWwgaGFuZGxlcyBpbiBhbiBteE1vdXNlRXZlbnQuIFRoaXMgc2hvdWxkIGJlIGEKKwkgKiBuZWdhdGl2ZSB2YWx1ZSBhbmQgaXMgdGhlIHN0YXJ0IGluZGV4IHdoaWNoIGlzIGRlY3JlbWVudGVkIGZvciBlYWNoCisJICogdmlydHVhbCBoYW5kbGUuIERlZmF1bHQgaXMgLTEwMDAwMC4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUKKwkgKiB0aGFuIFZJUlRVQUxfSEFORExFIC0gQ1VTVE9NX0hBTkRMRSBjdXN0b20gaGFuZGxlcy4KKwkgKiAKKwkgKi8KKwlWSVJUVUFMX0hBTkRMRTogLTEwMDAwMCwKKwkKKwkvLworCS8vIEV2ZW50IG5hbWVzCisJLy8KKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogTU9VU0VfRE9XTgorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBtb3VzZURvd24uCisJICovCisJTU9VU0VfRE9XTjogJ21vdXNlRG93bicsCisJCisJLyoqCisJICogVmFyaWFibGU6IE1PVVNFX01PVkUKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgbW91c2VNb3ZlLiAKKwkgKi8KKwlNT1VTRV9NT1ZFOiAnbW91c2VNb3ZlJywKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogTU9VU0VfVVAKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgbW91c2VVcC4gCisJICovCisJTU9VU0VfVVA6ICdtb3VzZVVwJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBQ1RJVkFURQorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBhY3RpdmF0ZS4KKwkgKi8KKwlBQ1RJVkFURTogJ2FjdGl2YXRlJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBSRVNJWkVfU1RBUlQKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgcmVzaXplU3RhcnQuCisJICovCisJUkVTSVpFX1NUQVJUOiAncmVzaXplU3RhcnQnLAorCisJLyoqCisJICogVmFyaWFibGU6IFJFU0laRQorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciByZXNpemUuCisJICovCisJUkVTSVpFOiAncmVzaXplJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBSRVNJWkVfRU5ECisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIHJlc2l6ZUVuZC4KKwkgKi8KKwlSRVNJWkVfRU5EOiAncmVzaXplRW5kJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBNT1ZFX1NUQVJUCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIG1vdmVTdGFydC4KKwkgKi8KKwlNT1ZFX1NUQVJUOiAnbW92ZVN0YXJ0JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBNT1ZFCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIG1vdmUuCisJICovCisJTU9WRTogJ21vdmUnLAorCisJLyoqCisJICogVmFyaWFibGU6IE1PVkVfRU5ECisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIG1vdmVFbmQuCisJICovCisJTU9WRV9FTkQ6ICdtb3ZlRW5kJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBQQU5fU1RBUlQKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgcGFuU3RhcnQuCisJICovCisJUEFOX1NUQVJUOiAncGFuU3RhcnQnLAorCisJLyoqCisJICogVmFyaWFibGU6IFBBTgorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBwYW4uCisJICovCisJUEFOOiAncGFuJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBQQU5fRU5ECisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIHBhbkVuZC4KKwkgKi8KKwlQQU5fRU5EOiAncGFuRW5kJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBNSU5JTUlaRQorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBtaW5pbWl6ZS4KKwkgKi8KKwlNSU5JTUlaRTogJ21pbmltaXplJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBOT1JNQUxJWkUKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3Igbm9ybWFsaXplLgorCSAqLworCU5PUk1BTElaRTogJ25vcm1hbGl6ZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogTUFYSU1JWkUKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgbWF4aW1pemUuCisJICovCisJTUFYSU1JWkU6ICdtYXhpbWl6ZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogSElERQorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBoaWRlLgorCSAqLworCUhJREU6ICdoaWRlJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTSE9XCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIHNob3cuCisJICovCisJU0hPVzogJ3Nob3cnLAorCisJLyoqCisJICogVmFyaWFibGU6IENMT1NFCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGNsb3NlLgorCSAqLworCUNMT1NFOiAnY2xvc2UnLAorCisJLyoqCisJICogVmFyaWFibGU6IERFU1RST1kKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgZGVzdHJveS4KKwkgKi8KKwlERVNUUk9ZOiAnZGVzdHJveScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogUkVGUkVTSAorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciByZWZyZXNoLgorCSAqLworCVJFRlJFU0g6ICdyZWZyZXNoJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTSVpFCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIHNpemUuCisJICovCisJU0laRTogJ3NpemUnLAorCQorCS8qKgorCSAqIFZhcmlhYmxlOiBTRUxFQ1QKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3Igc2VsZWN0LgorCSAqLworCVNFTEVDVDogJ3NlbGVjdCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRklSRUQKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgZmlyZWQuCisJICovCisJRklSRUQ6ICdmaXJlZCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRklSRV9NT1VTRV9FVkVOVAorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBmaXJlTW91c2VFdmVudC4KKwkgKi8KKwlGSVJFX01PVVNFX0VWRU5UOiAnZmlyZU1vdXNlRXZlbnQnLAorCisJLyoqCisJICogVmFyaWFibGU6IEdFU1RVUkUKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgZ2VzdHVyZS4KKwkgKi8KKwlHRVNUVVJFOiAnZ2VzdHVyZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogVEFQX0FORF9IT0xECisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIHRhcEFuZEhvbGQuCisJICovCisJVEFQX0FORF9IT0xEOiAndGFwQW5kSG9sZCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogR0VUCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGdldC4KKwkgKi8KKwlHRVQ6ICdnZXQnLAorCisJLyoqCisJICogVmFyaWFibGU6IFJFQ0VJVkUKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgcmVjZWl2ZS4KKwkgKi8KKwlSRUNFSVZFOiAncmVjZWl2ZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogQ09OTkVDVAorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBjb25uZWN0LgorCSAqLworCUNPTk5FQ1Q6ICdjb25uZWN0JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBESVNDT05ORUNUCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGRpc2Nvbm5lY3QuCisJICovCisJRElTQ09OTkVDVDogJ2Rpc2Nvbm5lY3QnLAorCisJLyoqCisJICogVmFyaWFibGU6IFNVU1BFTkQKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3Igc3VzcGVuZC4KKwkgKi8KKwlTVVNQRU5EOiAnc3VzcGVuZCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogUkVTVU1FCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIHN1c3BlbmQuCisJICovCisJUkVTVU1FOiAncmVzdW1lJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBNQVJLCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIG1hcmsuCisJICovCisJTUFSSzogJ21hcmsnLAorCisJLyoqCisJICogVmFyaWFibGU6IFJPT1QKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3Igcm9vdC4KKwkgKi8KKwlST09UOiAncm9vdCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogUE9TVAorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBwb3N0LgorCSAqLworCVBPU1Q6ICdwb3N0JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBPUEVOCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIG9wZW4uCisJICovCisJT1BFTjogJ29wZW4nLAorCisJLyoqCisJICogVmFyaWFibGU6IFNBVkUKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3Igb3Blbi4KKwkgKi8KKwlTQVZFOiAnc2F2ZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogQkVGT1JFX0FERF9WRVJURVgKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgYmVmb3JlQWRkVmVydGV4LgorCSAqLworCUJFRk9SRV9BRERfVkVSVEVYOiAnYmVmb3JlQWRkVmVydGV4JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBRERfVkVSVEVYCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGFkZFZlcnRleC4KKwkgKi8KKwlBRERfVkVSVEVYOiAnYWRkVmVydGV4JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBRlRFUl9BRERfVkVSVEVYCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGFmdGVyQWRkVmVydGV4LgorCSAqLworCUFGVEVSX0FERF9WRVJURVg6ICdhZnRlckFkZFZlcnRleCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRE9ORQorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBkb25lLgorCSAqLworCURPTkU6ICdkb25lJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBFWEVDVVRFCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGV4ZWN1dGUuCisJICovCisJRVhFQ1VURTogJ2V4ZWN1dGUnLAorCisJLyoqCisJICogVmFyaWFibGU6IEVYRUNVVEVECisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGV4ZWN1dGVkLgorCSAqLworCUVYRUNVVEVEOiAnZXhlY3V0ZWQnLAorCisJLyoqCisJICogVmFyaWFibGU6IEJFR0lOX1VQREFURQorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBiZWdpblVwZGF0ZS4KKwkgKi8KKwlCRUdJTl9VUERBVEU6ICdiZWdpblVwZGF0ZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RBUlRfRURJVAorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBzdGFydEVkaXQuCisJICovCisJU1RBUlRfRURJVDogJ3N0YXJ0RWRpdCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRU5EX1VQREFURQorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBlbmRVcGRhdGUuCisJICovCisJRU5EX1VQREFURTogJ2VuZFVwZGF0ZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRU5EX0VESVQKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgZW5kRWRpdC4KKwkgKi8KKwlFTkRfRURJVDogJ2VuZEVkaXQnLAorCisJLyoqCisJICogVmFyaWFibGU6IEJFRk9SRV9VTkRPCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGJlZm9yZVVuZG8uCisJICovCisJQkVGT1JFX1VORE86ICdiZWZvcmVVbmRvJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBVTkRPCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIHVuZG8uCisJICovCisJVU5ETzogJ3VuZG8nLAorCisJLyoqCisJICogVmFyaWFibGU6IFJFRE8KKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgcmVkby4KKwkgKi8KKwlSRURPOiAncmVkbycsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogQ0hBTkdFCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGNoYW5nZS4KKwkgKi8KKwlDSEFOR0U6ICdjaGFuZ2UnLAorCisJLyoqCisJICogVmFyaWFibGU6IE5PVElGWQorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBub3RpZnkuCisJICovCisJTk9USUZZOiAnbm90aWZ5JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBMQVlPVVRfQ0VMTFMKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgbGF5b3V0Q2VsbHMuCisJICovCisJTEFZT1VUX0NFTExTOiAnbGF5b3V0Q2VsbHMnLAorCisJLyoqCisJICogVmFyaWFibGU6IENMSUNLCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGNsaWNrLgorCSAqLworCUNMSUNLOiAnY2xpY2snLAorCisJLyoqCisJICogVmFyaWFibGU6IFNDQUxFCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIHNjYWxlLgorCSAqLworCVNDQUxFOiAnc2NhbGUnLAorCisJLyoqCisJICogVmFyaWFibGU6IFRSQU5TTEFURQorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciB0cmFuc2xhdGUuCisJICovCisJVFJBTlNMQVRFOiAndHJhbnNsYXRlJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTQ0FMRV9BTkRfVFJBTlNMQVRFCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIHNjYWxlQW5kVHJhbnNsYXRlLgorCSAqLworCVNDQUxFX0FORF9UUkFOU0xBVEU6ICdzY2FsZUFuZFRyYW5zbGF0ZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogVVAKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgdXAuCisJICovCisJVVA6ICd1cCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRE9XTgorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBkb3duLgorCSAqLworCURPV046ICdkb3duJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBREQKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgYWRkLgorCSAqLworCUFERDogJ2FkZCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogUkVNT1ZFCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIHJlbW92ZS4KKwkgKi8KKwlSRU1PVkU6ICdyZW1vdmUnLAorCQorCS8qKgorCSAqIFZhcmlhYmxlOiBDTEVBUgorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBjbGVhci4KKwkgKi8KKwlDTEVBUjogJ2NsZWFyJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBRERfQ0VMTFMKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgYWRkQ2VsbHMuCisJICovCisJQUREX0NFTExTOiAnYWRkQ2VsbHMnLAorCisJLyoqCisJICogVmFyaWFibGU6IENFTExTX0FEREVECisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGNlbGxzQWRkZWQuCisJICovCisJQ0VMTFNfQURERUQ6ICdjZWxsc0FkZGVkJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBNT1ZFX0NFTExTCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIG1vdmVDZWxscy4KKwkgKi8KKwlNT1ZFX0NFTExTOiAnbW92ZUNlbGxzJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBDRUxMU19NT1ZFRAorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBjZWxsc01vdmVkLgorCSAqLworCUNFTExTX01PVkVEOiAnY2VsbHNNb3ZlZCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogUkVTSVpFX0NFTExTCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIHJlc2l6ZUNlbGxzLgorCSAqLworCVJFU0laRV9DRUxMUzogJ3Jlc2l6ZUNlbGxzJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBDRUxMU19SRVNJWkVECisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGNlbGxzUmVzaXplZC4KKwkgKi8KKwlDRUxMU19SRVNJWkVEOiAnY2VsbHNSZXNpemVkJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBUT0dHTEVfQ0VMTFMKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgdG9nZ2xlQ2VsbHMuCisJICovCisJVE9HR0xFX0NFTExTOiAndG9nZ2xlQ2VsbHMnLAorCisJLyoqCisJICogVmFyaWFibGU6IENFTExTX1RPR0dMRUQKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgY2VsbHNUb2dnbGVkLgorCSAqLworCUNFTExTX1RPR0dMRUQ6ICdjZWxsc1RvZ2dsZWQnLAorCisJLyoqCisJICogVmFyaWFibGU6IE9SREVSX0NFTExTCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIG9yZGVyQ2VsbHMuCisJICovCisJT1JERVJfQ0VMTFM6ICdvcmRlckNlbGxzJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBDRUxMU19PUkRFUkVECisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGNlbGxzT3JkZXJlZC4KKwkgKi8KKwlDRUxMU19PUkRFUkVEOiAnY2VsbHNPcmRlcmVkJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBSRU1PVkVfQ0VMTFMKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgcmVtb3ZlQ2VsbHMuCisJICovCisJUkVNT1ZFX0NFTExTOiAncmVtb3ZlQ2VsbHMnLAorCisJLyoqCisJICogVmFyaWFibGU6IENFTExTX1JFTU9WRUQKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgY2VsbHNSZW1vdmVkLgorCSAqLworCUNFTExTX1JFTU9WRUQ6ICdjZWxsc1JlbW92ZWQnLAorCisJLyoqCisJICogVmFyaWFibGU6IEdST1VQX0NFTExTCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGdyb3VwQ2VsbHMuCisJICovCisJR1JPVVBfQ0VMTFM6ICdncm91cENlbGxzJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBVTkdST1VQX0NFTExTCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIHVuZ3JvdXBDZWxscy4KKwkgKi8KKwlVTkdST1VQX0NFTExTOiAndW5ncm91cENlbGxzJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBSRU1PVkVfQ0VMTFNfRlJPTV9QQVJFTlQKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgcmVtb3ZlQ2VsbHNGcm9tUGFyZW50LgorCSAqLworCVJFTU9WRV9DRUxMU19GUk9NX1BBUkVOVDogJ3JlbW92ZUNlbGxzRnJvbVBhcmVudCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRk9MRF9DRUxMUworCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBmb2xkQ2VsbHMuCisJICovCisJRk9MRF9DRUxMUzogJ2ZvbGRDZWxscycsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogQ0VMTFNfRk9MREVECisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGNlbGxzRm9sZGVkLgorCSAqLworCUNFTExTX0ZPTERFRDogJ2NlbGxzRm9sZGVkJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBBTElHTl9DRUxMUworCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBhbGlnbkNlbGxzLgorCSAqLworCUFMSUdOX0NFTExTOiAnYWxpZ25DZWxscycsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogTEFCRUxfQ0hBTkdFRAorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBsYWJlbENoYW5nZWQuCisJICovCisJTEFCRUxfQ0hBTkdFRDogJ2xhYmVsQ2hhbmdlZCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogQ09OTkVDVF9DRUxMCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGNvbm5lY3RDZWxsLgorCSAqLworCUNPTk5FQ1RfQ0VMTDogJ2Nvbm5lY3RDZWxsJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBDRUxMX0NPTk5FQ1RFRAorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBjZWxsQ29ubmVjdGVkLgorCSAqLworCUNFTExfQ09OTkVDVEVEOiAnY2VsbENvbm5lY3RlZCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1BMSVRfRURHRQorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBzcGxpdEVkZ2UuCisJICovCisJU1BMSVRfRURHRTogJ3NwbGl0RWRnZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRkxJUF9FREdFCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGZsaXBFZGdlLgorCSAqLworCUZMSVBfRURHRTogJ2ZsaXBFZGdlJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBTVEFSVF9FRElUSU5HCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIHN0YXJ0RWRpdGluZy4KKwkgKi8KKwlTVEFSVF9FRElUSU5HOiAnc3RhcnRFZGl0aW5nJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBFRElUSU5HX1NUQVJURUQKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgZWRpdGluZ1N0YXJ0ZWQuCisJICovCisJRURJVElOR19TVEFSVEVEOiAnZWRpdGluZ1N0YXJ0ZWQnLAorCisJLyoqCisJICogVmFyaWFibGU6IEVESVRJTkdfU1RPUFBFRAorCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBlZGl0aW5nU3RvcHBlZC4KKwkgKi8KKwlFRElUSU5HX1NUT1BQRUQ6ICdlZGl0aW5nU3RvcHBlZCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogQUREX09WRVJMQVkKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgYWRkT3ZlcmxheS4KKwkgKi8KKwlBRERfT1ZFUkxBWTogJ2FkZE92ZXJsYXknLAorCisJLyoqCisJICogVmFyaWFibGU6IFJFTU9WRV9PVkVSTEFZCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIHJlbW92ZU92ZXJsYXkuCisJICovCisJUkVNT1ZFX09WRVJMQVk6ICdyZW1vdmVPdmVybGF5JywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBVUERBVEVfQ0VMTF9TSVpFCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIHVwZGF0ZUNlbGxTaXplLgorCSAqLworCVVQREFURV9DRUxMX1NJWkU6ICd1cGRhdGVDZWxsU2l6ZScsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogRVNDQVBFCisJICoKKwkgKiBTcGVjaWZpZXMgdGhlIGV2ZW50IG5hbWUgZm9yIGVzY2FwZS4KKwkgKi8KKwlFU0NBUEU6ICdlc2NhcGUnLAorCisJLyoqCisJICogVmFyaWFibGU6IERPVUJMRV9DTElDSworCSAqCisJICogU3BlY2lmaWVzIHRoZSBldmVudCBuYW1lIGZvciBkb3VibGVDbGljay4KKwkgKi8KKwlET1VCTEVfQ0xJQ0s6ICdkb3VibGVDbGljaycsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogU1RBUlQKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3Igc3RhcnQuCisJICovCisJU1RBUlQ6ICdzdGFydCcsCisKKwkvKioKKwkgKiBWYXJpYWJsZTogUkVTRVQKKwkgKgorCSAqIFNwZWNpZmllcyB0aGUgZXZlbnQgbmFtZSBmb3IgcmVzZXQuCisJICovCisJUkVTRVQ6ICdyZXNldCcKKworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214RXZlbnRPYmplY3QuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teEV2ZW50T2JqZWN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkN2NiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teEV2ZW50T2JqZWN0LmpzCkBAIC0wLDAgKzEsMTExIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteEV2ZW50T2JqZWN0CisgKiAKKyAqIFRoZSBteEV2ZW50T2JqZWN0IGlzIGEgd3JhcHBlciBmb3IgYWxsIHByb3BlcnRpZXMgb2YgYSBzaW5nbGUgZXZlbnQuCisgKiBBZGRpdGlvbmFsbHksIGl0IGFsc28gb2ZmZXJzIGZ1bmN0aW9ucyB0byBjb25zdW1lIHRoZSBldmVudCBhbmQgY2hlY2sgaWYgaXQKKyAqIHdhcyBjb25zdW1lZCBhcyBmb2xsb3dzOgorICogCisgKiAoY29kZSkKKyAqIGV2dC5jb25zdW1lKCk7CisgKiBJTlY6IGV2dC5pc0NvbnN1bWVkKCkgPT0gdHJ1ZQorICogKGVuZCkKKyAqIAorICogQ29uc3RydWN0b3I6IG14RXZlbnRPYmplY3QKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGV2ZW50IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gQW4gb3B0aW9uYWwKKyAqIHNlcXVlbmNlIG9mIGtleSwgdmFsdWUgcGFpcnMgY2FuIGJlIGFwcGVuZGVkIHRvIGRlZmluZSBwcm9wZXJ0aWVzLgorICogCisgKiBFeGFtcGxlOgorICoKKyAqIChjb2RlKQorICogbmV3IG14RXZlbnRPYmplY3QoImV2ZW50TmFtZSIsIGtleTEsIHZhbDEsIC4uLCBrZXlOLCB2YWxOKQorICogKGVuZCkKKyAqLworZnVuY3Rpb24gbXhFdmVudE9iamVjdChuYW1lKQoreworCXRoaXMubmFtZSA9IG5hbWU7CisJdGhpcy5wcm9wZXJ0aWVzID0gW107CisJCisJZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICs9IDIpCisJeworCQlpZiAoYXJndW1lbnRzW2kgKyAxXSAhPSBudWxsKQorCQl7CisJCQl0aGlzLnByb3BlcnRpZXNbYXJndW1lbnRzW2ldXSA9IGFyZ3VtZW50c1tpICsgMV07CisJCX0KKwl9Cit9OworCisvKioKKyAqIFZhcmlhYmxlOiBuYW1lCisgKgorICogSG9sZHMgdGhlIG5hbWUuCisgKi8KK214RXZlbnRPYmplY3QucHJvdG90eXBlLm5hbWUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBwcm9wZXJ0aWVzCisgKgorICogSG9sZHMgdGhlIHByb3BlcnRpZXMgYXMgYW4gYXNzb2NpYXRpdmUgYXJyYXkuCisgKi8KK214RXZlbnRPYmplY3QucHJvdG90eXBlLnByb3BlcnRpZXMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjb25zdW1lZAorICoKKyAqIEhvbGRzIHRoZSBjb25zdW1lZCBzdGF0ZS4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhFdmVudE9iamVjdC5wcm90b3R5cGUuY29uc3VtZWQgPSBmYWxzZTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0TmFtZQorICogCisgKiBSZXR1cm5zIDxuYW1lPi4KKyAqLworbXhFdmVudE9iamVjdC5wcm90b3R5cGUuZ2V0TmFtZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5uYW1lOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0UHJvcGVydGllcworICogCisgKiBSZXR1cm5zIDxwcm9wZXJ0aWVzPi4KKyAqLworbXhFdmVudE9iamVjdC5wcm90b3R5cGUuZ2V0UHJvcGVydGllcyA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5wcm9wZXJ0aWVzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0UHJvcGVydHkKKyAqIAorICogUmV0dXJucyB0aGUgcHJvcGVydHkgZm9yIHRoZSBnaXZlbiBrZXkuCisgKi8KK214RXZlbnRPYmplY3QucHJvdG90eXBlLmdldFByb3BlcnR5ID0gZnVuY3Rpb24oa2V5KQoreworCXJldHVybiB0aGlzLnByb3BlcnRpZXNba2V5XTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQ29uc3VtZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IGhhcyBiZWVuIGNvbnN1bWVkLgorICovCitteEV2ZW50T2JqZWN0LnByb3RvdHlwZS5pc0NvbnN1bWVkID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmNvbnN1bWVkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY29uc3VtZQorICoKKyAqIENvbnN1bWVzIHRoZSBldmVudC4KKyAqLworbXhFdmVudE9iamVjdC5wcm90b3R5cGUuY29uc3VtZSA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLmNvbnN1bWVkID0gdHJ1ZTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teEV2ZW50U291cmNlLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhFdmVudFNvdXJjZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjQ2ZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhFdmVudFNvdXJjZS5qcwpAQCAtMCwwICsxLDE4OSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhFdmVudFNvdXJjZQorICoKKyAqIEJhc2UgY2xhc3MgZm9yIG9iamVjdHMgdGhhdCBkaXNwYXRjaCBuYW1lZCBldmVudHMuIFRvIGNyZWF0ZSBhIHN1YmNsYXNzIHRoYXQKKyAqIGluaGVyaXRzIGZyb20gbXhFdmVudFNvdXJjZSwgdGhlIGZvbGxvd2luZyBjb2RlIGlzIHVzZWQuCisgKgorICogKGNvZGUpCisgKiBmdW5jdGlvbiBNeUNsYXNzKCkgeyB9OworICoKKyAqIE15Q2xhc3MucHJvdG90eXBlID0gbmV3IG14RXZlbnRTb3VyY2UoKTsKKyAqIE15Q2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXlDbGFzczsKKyAqIChlbmQpCisgKgorICogS25vd24gU3ViY2xhc3NlczoKKyAqCisgKiA8bXhHcmFwaE1vZGVsPiwgPG14R3JhcGg+LCA8bXhHcmFwaFZpZXc+LCA8bXhFZGl0b3I+LCA8bXhDZWxsT3ZlcmxheT4sCisgKiA8bXhUb29sYmFyPiwgPG14V2luZG93PgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhFdmVudFNvdXJjZQorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgZXZlbnQgc291cmNlLgorICovCitmdW5jdGlvbiBteEV2ZW50U291cmNlKGV2ZW50U291cmNlKQoreworCXRoaXMuc2V0RXZlbnRTb3VyY2UoZXZlbnRTb3VyY2UpOworfTsKKworLyoqCisgKiBWYXJpYWJsZTogZXZlbnRMaXN0ZW5lcnMKKyAqCisgKiBIb2xkcyB0aGUgZXZlbnQgbmFtZXMgYW5kIGFzc29jaWF0ZWQgbGlzdGVuZXJzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkKKyAqIGNvbnRhaW5zIHRoZSBldmVudCBuYW1lIGZvbGxvd2VkIGJ5IHRoZSByZXNwZWN0aXZlIGxpc3RlbmVyIGZvciBlYWNoCisgKiByZWdpc3RlcmVkIGxpc3RlbmVyLgorICovCitteEV2ZW50U291cmNlLnByb3RvdHlwZS5ldmVudExpc3RlbmVycyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGV2ZW50c0VuYWJsZWQKKyAqCisgKiBTcGVjaWZpZXMgaWYgZXZlbnRzIGNhbiBiZSBmaXJlZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEV2ZW50U291cmNlLnByb3RvdHlwZS5ldmVudHNFbmFibGVkID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogZXZlbnRTb3VyY2UKKyAqCisgKiBPcHRpb25hbCBzb3VyY2UgZm9yIGV2ZW50cy4gRGVmYXVsdCBpcyBudWxsLgorICovCitteEV2ZW50U291cmNlLnByb3RvdHlwZS5ldmVudFNvdXJjZSA9IG51bGw7CisKKy8qKgorICogRnVuY3Rpb246IGlzRXZlbnRzRW5hYmxlZAorICogCisgKiBSZXR1cm5zIDxldmVudHNFbmFibGVkPi4KKyAqLworbXhFdmVudFNvdXJjZS5wcm90b3R5cGUuaXNFdmVudHNFbmFibGVkID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmV2ZW50c0VuYWJsZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRFdmVudHNFbmFibGVkCisgKiAKKyAqIFNldHMgPGV2ZW50c0VuYWJsZWQ+LgorICovCitteEV2ZW50U291cmNlLnByb3RvdHlwZS5zZXRFdmVudHNFbmFibGVkID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5ldmVudHNFbmFibGVkID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRFdmVudFNvdXJjZQorICogCisgKiBSZXR1cm5zIDxldmVudFNvdXJjZT4uCisgKi8KK214RXZlbnRTb3VyY2UucHJvdG90eXBlLmdldEV2ZW50U291cmNlID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmV2ZW50U291cmNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0RXZlbnRTb3VyY2UKKyAqIAorICogU2V0cyA8ZXZlbnRTb3VyY2U+LgorICovCitteEV2ZW50U291cmNlLnByb3RvdHlwZS5zZXRFdmVudFNvdXJjZSA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuZXZlbnRTb3VyY2UgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZExpc3RlbmVyCisgKgorICogQmluZHMgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiB0byB0aGUgZ2l2ZW4gZXZlbnQgbmFtZS4gSWYgbm8gZXZlbnQgbmFtZQorICogaXMgZ2l2ZW4sIHRoZW4gdGhlIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQgZm9yIGFsbCBldmVudHMuCisgKiAKKyAqIFRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBsaXN0ZW5lciBhcmUgdGhlIHNlbmRlciBhbmQgYW4gPG14RXZlbnRPYmplY3Q+LgorICovCitteEV2ZW50U291cmNlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKG5hbWUsIGZ1bmN0KQoreworCWlmICh0aGlzLmV2ZW50TGlzdGVuZXJzID09IG51bGwpCisJeworCQl0aGlzLmV2ZW50TGlzdGVuZXJzID0gW107CisJfQorCQorCXRoaXMuZXZlbnRMaXN0ZW5lcnMucHVzaChuYW1lKTsKKwl0aGlzLmV2ZW50TGlzdGVuZXJzLnB1c2goZnVuY3QpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVtb3ZlTGlzdGVuZXIKKyAqCisgKiBSZW1vdmVzIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgZ2l2ZW4gbGlzdGVuZXIgZnJvbSA8ZXZlbnRMaXN0ZW5lcnM+LgorICovCitteEV2ZW50U291cmNlLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKGZ1bmN0KQoreworCWlmICh0aGlzLmV2ZW50TGlzdGVuZXJzICE9IG51bGwpCisJeworCQl2YXIgaSA9IDA7CisJCQorCQl3aGlsZSAoaSA8IHRoaXMuZXZlbnRMaXN0ZW5lcnMubGVuZ3RoKQorCQl7CisJCQlpZiAodGhpcy5ldmVudExpc3RlbmVyc1tpKzFdID09IGZ1bmN0KQorCQkJeworCQkJCXRoaXMuZXZlbnRMaXN0ZW5lcnMuc3BsaWNlKGksIDIpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWkgKz0gMjsKKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGZpcmVFdmVudAorICoKKyAqIERpc3BhdGNoZXMgdGhlIGdpdmVuIGV2ZW50IHRvIHRoZSBsaXN0ZW5lcnMgd2hpY2ggYXJlIHJlZ2lzdGVyZWQgZm9yCisgKiB0aGUgZXZlbnQuIFRoZSBzZW5kZXIgYXJndW1lbnQgaXMgb3B0aW9uYWwuIFRoZSBjdXJyZW50IGV4ZWN1dGlvbiBzY29wZQorICogKCJ0aGlzIikgaXMgdXNlZCBmb3IgdGhlIGxpc3RlbmVyIGludm9jYXRpb24gKHNlZSA8bXhVdGlscy5iaW5kPikuCisgKgorICogRXhhbXBsZToKKyAqCisgKiAoY29kZSkKKyAqIGZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdCgiZXZlbnROYW1lIiwga2V5MSwgdmFsMSwgLi4sIGtleU4sIHZhbE4pKQorICogKGVuZCkKKyAqIAorICogUGFyYW1ldGVyczoKKyAqCisgKiBldnQgLSA8bXhFdmVudE9iamVjdD4gdGhhdCByZXByZXNlbnRzIHRoZSBldmVudC4KKyAqIHNlbmRlciAtIE9wdGlvbmFsIHNlbmRlciB0byBiZSBwYXNzZWQgdG8gdGhlIGxpc3RlbmVyLiBEZWZhdWx0IHZhbHVlIGlzCisgKiB0aGUgcmV0dXJuIHZhbHVlIG9mIDxnZXRFdmVudFNvdXJjZT4uCisgKi8KK214RXZlbnRTb3VyY2UucHJvdG90eXBlLmZpcmVFdmVudCA9IGZ1bmN0aW9uKGV2dCwgc2VuZGVyKQoreworCWlmICh0aGlzLmV2ZW50TGlzdGVuZXJzICE9IG51bGwgJiYgdGhpcy5pc0V2ZW50c0VuYWJsZWQoKSkKKwl7CisJCWlmIChldnQgPT0gbnVsbCkKKwkJeworCQkJZXZ0ID0gbmV3IG14RXZlbnRPYmplY3QoKTsKKwkJfQorCQkKKwkJaWYgKHNlbmRlciA9PSBudWxsKQorCQl7CisJCQlzZW5kZXIgPSB0aGlzLmdldEV2ZW50U291cmNlKCk7CisJCX0KKworCQlpZiAoc2VuZGVyID09IG51bGwpCisJCXsKKwkJCXNlbmRlciA9IHRoaXM7CisJCX0KKworCQl2YXIgYXJncyA9IFtzZW5kZXIsIGV2dF07CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZXZlbnRMaXN0ZW5lcnMubGVuZ3RoOyBpICs9IDIpCisJCXsKKwkJCXZhciBsaXN0ZW4gPSB0aGlzLmV2ZW50TGlzdGVuZXJzW2ldOworCQkJCisJCQlpZiAobGlzdGVuID09IG51bGwgfHwgbGlzdGVuID09IGV2dC5nZXROYW1lKCkpCisJCQl7CisJCQkJdGhpcy5ldmVudExpc3RlbmVyc1tpKzFdLmFwcGx5KHRoaXMsIGFyZ3MpOworCQkJfQorCQl9CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214Rm9ybS5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214Rm9ybS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmIwYTZkCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhGb3JtLmpzCkBAIC0wLDAgKzEsMjAyIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteEZvcm0KKyAqIAorICogQSBzaW1wbGUgY2xhc3MgZm9yIGNyZWF0aW5nIEhUTUwgZm9ybXMuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteEZvcm0KKyAqIAorICogQ3JlYXRlcyBhIEhUTUwgdGFibGUgdXNpbmcgdGhlIHNwZWNpZmllZCBjbGFzc25hbWUuCisgKi8KK2Z1bmN0aW9uIG14Rm9ybShjbGFzc05hbWUpCit7CisJdGhpcy50YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyk7CisJdGhpcy50YWJsZS5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisJdGhpcy5ib2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGJvZHknKTsKKwkKKwl0aGlzLnRhYmxlLmFwcGVuZENoaWxkKHRoaXMuYm9keSk7Cit9OworCisvKioKKyAqIFZhcmlhYmxlOiB0YWJsZQorICogCisgKiBIb2xkcyB0aGUgRE9NIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSB0YWJsZS4KKyAqLworbXhGb3JtLnByb3RvdHlwZS50YWJsZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGJvZHkKKyAqIAorICogSG9sZHMgdGhlIERPTSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgdGJvZHkgKHRhYmxlIGJvZHkpLiBOZXcgcm93cworICogY2FuIGJlIGFkZGVkIHRvIHRoaXMgb2JqZWN0IHVzaW5nIERPTSBBUEkuCisgKi8KK214Rm9ybS5wcm90b3R5cGUuYm9keSA9IGZhbHNlOworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRUYWJsZQorICogCisgKiBSZXR1cm5zIHRoZSB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoaXMgZm9ybS4KKyAqLworbXhGb3JtLnByb3RvdHlwZS5nZXRUYWJsZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy50YWJsZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZEJ1dHRvbnMKKyAqIAorICogSGVscGVyIG1ldGhvZCB0byBhZGQgYW4gT0sgYW5kIENhbmNlbCBidXR0b24gdXNpbmcgdGhlIHJlc3BlY3RpdmUKKyAqIGZ1bmN0aW9ucy4KKyAqLworbXhGb3JtLnByb3RvdHlwZS5hZGRCdXR0b25zID0gZnVuY3Rpb24ob2tGdW5jdCwgY2FuY2VsRnVuY3QpCit7CisJdmFyIHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKKwl2YXIgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOworCXRyLmFwcGVuZENoaWxkKHRkKTsKKwl0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CisKKwkvLyBBZGRzIHRoZSBvayBidXR0b24KKwl2YXIgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CisJbXhVdGlscy53cml0ZShidXR0b24sIG14UmVzb3VyY2VzLmdldCgnb2snKSB8fCAnT0snKTsKKwl0ZC5hcHBlbmRDaGlsZChidXR0b24pOworCisJbXhFdmVudC5hZGRMaXN0ZW5lcihidXR0b24sICdjbGljaycsIGZ1bmN0aW9uKCkKKwl7CisJCW9rRnVuY3QoKTsKKwl9KTsKKwkKKwkvLyBBZGRzIHRoZSBjYW5jZWwgYnV0dG9uCisJYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CisJbXhVdGlscy53cml0ZShidXR0b24sIG14UmVzb3VyY2VzLmdldCgnY2FuY2VsJykgfHwgJ0NhbmNlbCcpOworCXRkLmFwcGVuZENoaWxkKGJ1dHRvbik7CisJCisJbXhFdmVudC5hZGRMaXN0ZW5lcihidXR0b24sICdjbGljaycsIGZ1bmN0aW9uKCkKKwl7CisJCWNhbmNlbEZ1bmN0KCk7CisJfSk7CisJCisJdHIuYXBwZW5kQ2hpbGQodGQpOworCXRoaXMuYm9keS5hcHBlbmRDaGlsZCh0cik7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRUZXh0CisgKiAKKyAqIEFkZHMgYW4gaW5wdXQgZm9yIHRoZSBnaXZlbiBuYW1lLCB0eXBlIGFuZCB2YWx1ZSBhbmQgcmV0dXJucyBpdC4KKyAqLworbXhGb3JtLnByb3RvdHlwZS5hZGRUZXh0ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHR5cGUpCit7CisJdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKKwkKKwlpbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCB0eXBlIHx8ICd0ZXh0Jyk7CisJaW5wdXQudmFsdWUgPSB2YWx1ZTsKKwkKKwlyZXR1cm4gdGhpcy5hZGRGaWVsZChuYW1lLCBpbnB1dCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRDaGVja2JveAorICogCisgKiBBZGRzIGEgY2hlY2tib3ggZm9yIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgdGV4dGZpZWxkLgorICovCitteEZvcm0ucHJvdG90eXBlLmFkZENoZWNrYm94ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpCit7CisJdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKKwkKKwlpbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnY2hlY2tib3gnKTsKKwl0aGlzLmFkZEZpZWxkKG5hbWUsIGlucHV0KTsKKworCS8vIElFIGNhbiBvbmx5IGNoYW5nZSB0aGUgY2hlY2tlZCB2YWx1ZSBpZiB0aGUgaW5wdXQgaXMgaW5zaWRlIHRoZSBET00KKwlpZiAodmFsdWUpCisJeworCQlpbnB1dC5jaGVja2VkID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gaW5wdXQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRUZXh0YXJlYQorICogCisgKiBBZGRzIGEgdGV4dGFyZWEgZm9yIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgdGV4dGFyZWEuCisgKi8KK214Rm9ybS5wcm90b3R5cGUuYWRkVGV4dGFyZWEgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcm93cykKK3sKKwl2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOworCQorCWlmIChteENsaWVudC5JU19OUykKKwl7CisJCXJvd3MtLTsKKwl9CisJCisJaW5wdXQuc2V0QXR0cmlidXRlKCdyb3dzJywgcm93cyB8fCAyKTsKKwlpbnB1dC52YWx1ZSA9IHZhbHVlOworCQorCXJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsIGlucHV0KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZENvbWJvCisgKiAKKyAqIEFkZHMgYSBjb21ibyBmb3IgdGhlIGdpdmVuIG5hbWUgYW5kIHJldHVybnMgdGhlIGNvbWJvLgorICovCitteEZvcm0ucHJvdG90eXBlLmFkZENvbWJvID0gZnVuY3Rpb24obmFtZSwgaXNNdWx0aVNlbGVjdCwgc2l6ZSkKK3sKKwl2YXIgc2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VsZWN0Jyk7CisJCisJaWYgKHNpemUgIT0gbnVsbCkKKwl7CisJCXNlbGVjdC5zZXRBdHRyaWJ1dGUoJ3NpemUnLCBzaXplKTsKKwl9CisJCisJaWYgKGlzTXVsdGlTZWxlY3QpCisJeworCQlzZWxlY3Quc2V0QXR0cmlidXRlKCdtdWx0aXBsZScsICd0cnVlJyk7CisJfQorCQorCXJldHVybiB0aGlzLmFkZEZpZWxkKG5hbWUsIHNlbGVjdCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRPcHRpb24KKyAqIAorICogQWRkcyBhbiBvcHRpb24gZm9yIHRoZSBnaXZlbiBsYWJlbCB0byB0aGUgc3BlY2lmaWVkIGNvbWJvLgorICovCitteEZvcm0ucHJvdG90eXBlLmFkZE9wdGlvbiA9IGZ1bmN0aW9uKGNvbWJvLCBsYWJlbCwgdmFsdWUsIGlzU2VsZWN0ZWQpCit7CisJdmFyIG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpOworCQorCW14VXRpbHMud3JpdGVsbihvcHRpb24sIGxhYmVsKTsKKwlvcHRpb24uc2V0QXR0cmlidXRlKCd2YWx1ZScsIHZhbHVlKTsKKwkKKwlpZiAoaXNTZWxlY3RlZCkKKwl7CisJCW9wdGlvbi5zZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJywgaXNTZWxlY3RlZCk7CisJfQorCQorCWNvbWJvLmFwcGVuZENoaWxkKG9wdGlvbik7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRGaWVsZAorICogCisgKiBBZGRzIGEgbmV3IHJvdyB3aXRoIHRoZSBuYW1lIGFuZCB0aGUgaW5wdXQgZmllbGQgaW4gdHdvIGNvbHVtbnMgYW5kCisgKiByZXR1cm5zIHRoZSBnaXZlbiBpbnB1dC4KKyAqLworbXhGb3JtLnByb3RvdHlwZS5hZGRGaWVsZCA9IGZ1bmN0aW9uKG5hbWUsIGlucHV0KQoreworCXZhciB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CisJdmFyIHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKKwlteFV0aWxzLndyaXRlKHRkLCBuYW1lKTsKKwl0ci5hcHBlbmRDaGlsZCh0ZCk7CisJCisJdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOworCXRkLmFwcGVuZENoaWxkKGlucHV0KTsKKwl0ci5hcHBlbmRDaGlsZCh0ZCk7CisJdGhpcy5ib2R5LmFwcGVuZENoaWxkKHRyKTsKKwkKKwlyZXR1cm4gaW5wdXQ7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhHdWlkZS5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214R3VpZGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczYWZmYwotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214R3VpZGUuanMKQEAgLTAsMCArMSw0MDEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14R3VpZGUKKyAqCisgKiBJbXBsZW1lbnRzIHRoZSBhbGlnbm1lbnQgb2Ygc2VsZWN0aW9uIGNlbGxzIHRvIG90aGVyIGNlbGxzIGluIHRoZSBncmFwaC4KKyAqIAorICogQ29uc3RydWN0b3I6IG14R3VpZGUKKyAqIAorICogQ29uc3RydWN0cyBhIG5ldyBndWlkZSBvYmplY3QuCisgKi8KK2Z1bmN0aW9uIG14R3VpZGUoZ3JhcGgsIHN0YXRlcykKK3sKKwl0aGlzLmdyYXBoID0gZ3JhcGg7CisJdGhpcy5zZXRTdGF0ZXMoc3RhdGVzKTsKK307CisKKy8qKgorICogVmFyaWFibGU6IGdyYXBoCisgKgorICogUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgPG14R3JhcGg+IGluc3RhbmNlLgorICovCitteEd1aWRlLnByb3RvdHlwZS5ncmFwaCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHN0YXRlcworICogCisgKiBDb250YWlucyB0aGUgPG14Q2VsbFN0YXRlcz4gdGhhdCBhcmUgdXNlZCBmb3IgYWxpZ25tZW50LgorICovCitteEd1aWRlLnByb3RvdHlwZS5zdGF0ZXMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBob3Jpem9udGFsCisgKgorICogU3BlY2lmaWVzIGlmIGhvcml6b250YWwgZ3VpZGVzIGFyZSBlbmFibGVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3VpZGUucHJvdG90eXBlLmhvcml6b250YWwgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiB2ZXJ0aWNhbAorICoKKyAqIFNwZWNpZmllcyBpZiB2ZXJ0aWNhbCBndWlkZXMgYXJlIGVuYWJsZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHdWlkZS5wcm90b3R5cGUudmVydGljYWwgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiB2ZXJ0aWNhbAorICoKKyAqIEhvbGRzIHRoZSA8bXhTaGFwZT4gZm9yIHRoZSBob3Jpem9udGFsIGd1aWRlLgorICovCitteEd1aWRlLnByb3RvdHlwZS5ndWlkZVggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB2ZXJ0aWNhbAorICoKKyAqIEhvbGRzIHRoZSA8bXhTaGFwZT4gZm9yIHRoZSB2ZXJ0aWNhbCBndWlkZS4KKyAqLworbXhHdWlkZS5wcm90b3R5cGUuZ3VpZGVZID0gbnVsbDsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0U3RhdGVzCisgKiAKKyAqIFNldHMgdGhlIDxteENlbGxTdGF0ZXM+IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGFsaWdubWVudC4KKyAqLworbXhHdWlkZS5wcm90b3R5cGUuc2V0U3RhdGVzID0gZnVuY3Rpb24oc3RhdGVzKQoreworCXRoaXMuc3RhdGVzID0gc3RhdGVzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFbmFibGVkRm9yRXZlbnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBndWlkZSBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhlIGdpdmVuIG5hdGl2ZSBldmVudC4gVGhpcworICogaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgdHJ1ZS4KKyAqLworbXhHdWlkZS5wcm90b3R5cGUuaXNFbmFibGVkRm9yRXZlbnQgPSBmdW5jdGlvbihldnQpCit7CisJcmV0dXJuIHRydWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRHdWlkZVRvbGVyYW5jZQorICogCisgKiBSZXR1cm5zIHRoZSB0b2xlcmFuY2UgZm9yIHRoZSBndWlkZXMuIERlZmF1bHQgdmFsdWUgaXMgZ3JpZFNpemUgLyAyLgorICovCitteEd1aWRlLnByb3RvdHlwZS5nZXRHdWlkZVRvbGVyYW5jZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5ncmFwaC5ncmlkU2l6ZSAvIDI7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVHdWlkZVNoYXBlCisgKiAKKyAqIFJldHVybnMgdGhlIG14U2hhcGUgdG8gYmUgdXNlZCBmb3IgcGFpbnRpbmcgdGhlIHJlc3BlY3RpdmUgZ3VpZGUuIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgYSBuZXcsIGRhc2hlZCBhbmQgY3Jpc3AgPG14UG9seWxpbmU+IHVzaW5nCisgKiA8bXhDb25zdGFudHMuR1VJREVfQ09MT1I+IGFuZCA8bXhDb25zdGFudHMuR1VJREVfU1RST0tFV0lEVEg+IGFzIHRoZSBmb3JtYXQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGhvcml6b250YWwgLSBCb29sZWFuIHRoYXQgc3BlY2lmaWVzIHdoaWNoIGd1aWRlIHNob3VsZCBiZSBjcmVhdGVkLgorICovCitteEd1aWRlLnByb3RvdHlwZS5jcmVhdGVHdWlkZVNoYXBlID0gZnVuY3Rpb24oaG9yaXpvbnRhbCkKK3sKKwl2YXIgZ3VpZGUgPSBuZXcgbXhQb2x5bGluZShbXSwgbXhDb25zdGFudHMuR1VJREVfQ09MT1IsIG14Q29uc3RhbnRzLkdVSURFX1NUUk9LRVdJRFRIKTsKKwlndWlkZS5pc0Rhc2hlZCA9IHRydWU7CisJCisJcmV0dXJuIGd1aWRlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogbW92ZQorICogCisgKiBNb3ZlcyB0aGUgPGJvdW5kcz4gYnkgdGhlIGdpdmVuIDxteFBvaW50PiBhbmQgcmV0dXJudCB0aGUgc25hcHBlZCBwb2ludC4KKyAqLworbXhHdWlkZS5wcm90b3R5cGUubW92ZSA9IGZ1bmN0aW9uKGJvdW5kcywgZGVsdGEsIGdyaWRFbmFibGVkKQoreworCWlmICh0aGlzLnN0YXRlcyAhPSBudWxsICYmICh0aGlzLmhvcml6b250YWwgfHwgdGhpcy52ZXJ0aWNhbCkgJiYgYm91bmRzICE9IG51bGwgJiYgZGVsdGEgIT0gbnVsbCkKKwl7CisJCXZhciB0cnggPSB0aGlzLmdyYXBoLmdldFZpZXcoKS50cmFuc2xhdGU7CisJCXZhciBzY2FsZSA9IHRoaXMuZ3JhcGguZ2V0VmlldygpLnNjYWxlOworCQl2YXIgZHggPSBkZWx0YS54OworCQl2YXIgZHkgPSBkZWx0YS55OworCQkKKwkJdmFyIG92ZXJyaWRlWCA9IGZhbHNlOworCQl2YXIgc3RhdGVYID0gbnVsbDsKKwkJdmFyIHZhbHVlWCA9IG51bGw7CisJCXZhciBvdmVycmlkZVkgPSBmYWxzZTsKKwkJdmFyIHN0YXRlWSA9IG51bGw7CisJCXZhciB2YWx1ZVkgPSBudWxsOworCQkKKwkJdmFyIHR0ID0gdGhpcy5nZXRHdWlkZVRvbGVyYW5jZSgpOworCQl2YXIgdHRYID0gdHQ7CisJCXZhciB0dFkgPSB0dDsKKwkJCisJCXZhciBiID0gYm91bmRzLmNsb25lKCk7CisJCWIueCArPSBkZWx0YS54OworCQliLnkgKz0gZGVsdGEueTsKKwkJCisJCXZhciBsZWZ0ID0gYi54OworCQl2YXIgcmlnaHQgPSBiLnggKyBiLndpZHRoOworCQl2YXIgY2VudGVyID0gYi5nZXRDZW50ZXJYKCk7CisJCXZhciB0b3AgPSBiLnk7CisJCXZhciBib3R0b20gPSBiLnkgKyBiLmhlaWdodDsKKwkJdmFyIG1pZGRsZSA9IGIuZ2V0Q2VudGVyWSgpOworCQorCQkvLyBTbmFwcyB0aGUgbGVmdCwgY2VudGVyIGFuZCByaWdodCB0byB0aGUgZ2l2ZW4geC1jb29yZGluYXRlCisJCWZ1bmN0aW9uIHNuYXBYKHgsIHN0YXRlKQorCQl7CisJCQl4ICs9IHRoaXMuZ3JhcGgucGFuRHg7CisJCQl2YXIgb3ZlcnJpZGUgPSBmYWxzZTsKKwkJCQorCQkJaWYgKE1hdGguYWJzKHggLSBjZW50ZXIpIDwgdHRYKQorCQkJeworCQkJCWR4ID0geCAtIGJvdW5kcy5nZXRDZW50ZXJYKCk7CisJCQkJdHRYID0gTWF0aC5hYnMoeCAtIGNlbnRlcik7CisJCQkJb3ZlcnJpZGUgPSB0cnVlOworCQkJfQorCQkJZWxzZSBpZiAoTWF0aC5hYnMoeCAtIGxlZnQpIDwgdHRYKQorCQkJeworCQkJCWR4ID0geCAtIGJvdW5kcy54OworCQkJCXR0WCA9IE1hdGguYWJzKHggLSBsZWZ0KTsKKwkJCQlvdmVycmlkZSA9IHRydWU7CisJCQl9CisJCQllbHNlIGlmIChNYXRoLmFicyh4IC0gcmlnaHQpIDwgdHRYKQorCQkJeworCQkJCWR4ID0geCAtIGJvdW5kcy54IC0gYm91bmRzLndpZHRoOworCQkJCXR0WCA9IE1hdGguYWJzKHggLSByaWdodCk7CisJCQkJb3ZlcnJpZGUgPSB0cnVlOworCQkJfQorCQkJCisJCQlpZiAob3ZlcnJpZGUpCisJCQl7CisJCQkJc3RhdGVYID0gc3RhdGU7CisJCQkJdmFsdWVYID0gTWF0aC5yb3VuZCh4IC0gdGhpcy5ncmFwaC5wYW5EeCk7CisJCQkJCisJCQkJaWYgKHRoaXMuZ3VpZGVYID09IG51bGwpCisJCQkJeworCQkJCQl0aGlzLmd1aWRlWCA9IHRoaXMuY3JlYXRlR3VpZGVTaGFwZSh0cnVlKTsKKwkJCQkJCisJCQkJCS8vIE1ha2VzIHN1cmUgdG8gdXNlIGVpdGhlciBWTUwgb3IgU1ZHIHNoYXBlcyBpbiBvcmRlciB0byBpbXBsZW1lbnQKKwkJCQkJLy8gZXZlbnQtdHJhbnNwYXJlbmN5IG9uIHRoZSBiYWNrZ3JvdW5kIGFyZWEgb2YgdGhlIHJlY3RhbmdsZSBzaW5jZQorCQkJCQkvLyBIVE1MIHNoYXBlcyBkbyBub3QgbGV0IG1vdXNlZXZlbnRzIHRocm91Z2ggZXZlbiB3aGVuIHRyYW5zcGFyZW50CisJCQkJCXRoaXMuZ3VpZGVYLmRpYWxlY3QgPSAodGhpcy5ncmFwaC5kaWFsZWN0ICE9IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHKSA/CisJCQkJCQlteENvbnN0YW50cy5ESUFMRUNUX1ZNTCA6IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHOworCQkJCQl0aGlzLmd1aWRlWC5wb2ludGVyRXZlbnRzID0gZmFsc2U7CisJCQkJCXRoaXMuZ3VpZGVYLmluaXQodGhpcy5ncmFwaC5nZXRWaWV3KCkuZ2V0T3ZlcmxheVBhbmUoKSk7CisJCQkJfQorCQkJfQorCQkJCisJCQlvdmVycmlkZVggPSBvdmVycmlkZVggfHwgb3ZlcnJpZGU7CisJCX07CisJCQorCQkvLyBTbmFwcyB0aGUgdG9wLCBtaWRkbGUgb3IgYm90dG9tIHRvIHRoZSBnaXZlbiB5LWNvb3JkaW5hdGUKKwkJZnVuY3Rpb24gc25hcFkoeSkKKwkJeworCQkJeSArPSB0aGlzLmdyYXBoLnBhbkR5OworCQkJdmFyIG92ZXJyaWRlID0gZmFsc2U7CisJCQkKKwkJCWlmIChNYXRoLmFicyh5IC0gbWlkZGxlKSA8IHR0WSkKKwkJCXsKKwkJCQlkeSA9IHkgLSBib3VuZHMuZ2V0Q2VudGVyWSgpOworCQkJCXR0WSA9IE1hdGguYWJzKHkgLSAgbWlkZGxlKTsKKwkJCQlvdmVycmlkZSA9IHRydWU7CisJCQl9CisJCQllbHNlIGlmIChNYXRoLmFicyh5IC0gdG9wKSA8IHR0WSkKKwkJCXsKKwkJCQlkeSA9IHkgLSBib3VuZHMueTsKKwkJCQl0dFkgPSBNYXRoLmFicyh5IC0gdG9wKTsKKwkJCQlvdmVycmlkZSA9IHRydWU7CisJCQl9CisJCQllbHNlIGlmIChNYXRoLmFicyh5IC0gYm90dG9tKSA8IHR0WSkKKwkJCXsKKwkJCQlkeSA9IHkgLSBib3VuZHMueSAtIGJvdW5kcy5oZWlnaHQ7CisJCQkJdHRZID0gTWF0aC5hYnMoeSAtIGJvdHRvbSk7CisJCQkJb3ZlcnJpZGUgPSB0cnVlOworCQkJfQorCQkJCisJCQlpZiAob3ZlcnJpZGUpCisJCQl7CisJCQkJc3RhdGVZID0gc3RhdGU7CisJCQkJdmFsdWVZID0gTWF0aC5yb3VuZCh5IC0gdGhpcy5ncmFwaC5wYW5EeSk7CisJCQkJCisJCQkJaWYgKHRoaXMuZ3VpZGVZID09IG51bGwpCisJCQkJeworCQkJCQl0aGlzLmd1aWRlWSA9IHRoaXMuY3JlYXRlR3VpZGVTaGFwZShmYWxzZSk7CisJCQkJCQorCQkJCQkvLyBNYWtlcyBzdXJlIHRvIHVzZSBlaXRoZXIgVk1MIG9yIFNWRyBzaGFwZXMgaW4gb3JkZXIgdG8gaW1wbGVtZW50CisJCQkJCS8vIGV2ZW50LXRyYW5zcGFyZW5jeSBvbiB0aGUgYmFja2dyb3VuZCBhcmVhIG9mIHRoZSByZWN0YW5nbGUgc2luY2UKKwkJCQkJLy8gSFRNTCBzaGFwZXMgZG8gbm90IGxldCBtb3VzZWV2ZW50cyB0aHJvdWdoIGV2ZW4gd2hlbiB0cmFuc3BhcmVudAorCQkJCQl0aGlzLmd1aWRlWS5kaWFsZWN0ID0gKHRoaXMuZ3JhcGguZGlhbGVjdCAhPSBteENvbnN0YW50cy5ESUFMRUNUX1NWRykgPworCQkJCQkJbXhDb25zdGFudHMuRElBTEVDVF9WTUwgOiBteENvbnN0YW50cy5ESUFMRUNUX1NWRzsKKwkJCQkJdGhpcy5ndWlkZVkucG9pbnRlckV2ZW50cyA9IGZhbHNlOworCQkJCQl0aGlzLmd1aWRlWS5pbml0KHRoaXMuZ3JhcGguZ2V0VmlldygpLmdldE92ZXJsYXlQYW5lKCkpOworCQkJCX0KKwkJCX0KKwkJCQorCQkJb3ZlcnJpZGVZID0gb3ZlcnJpZGVZIHx8IG92ZXJyaWRlOworCQl9OworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0YXRlcy5sZW5ndGg7IGkrKykKKwkJeworCQkJdmFyIHN0YXRlID0gIHRoaXMuc3RhdGVzW2ldOworCQkJCisJCQlpZiAoc3RhdGUgIT0gbnVsbCkKKwkJCXsKKwkJCQkvLyBBbGlnbiB4CisJCQkJaWYgKHRoaXMuaG9yaXpvbnRhbCkKKwkJCQl7CisJCQkJCXNuYXBYLmNhbGwodGhpcywgc3RhdGUuZ2V0Q2VudGVyWCgpLCBzdGF0ZSk7CisJCQkJCXNuYXBYLmNhbGwodGhpcywgc3RhdGUueCwgc3RhdGUpOworCQkJCQlzbmFwWC5jYWxsKHRoaXMsIHN0YXRlLnggKyBzdGF0ZS53aWR0aCwgc3RhdGUpOworCQkJCX0KKwkKKwkJCQkvLyBBbGlnbiB5CisJCQkJaWYgKHRoaXMudmVydGljYWwpCisJCQkJeworCQkJCQlzbmFwWS5jYWxsKHRoaXMsIHN0YXRlLmdldENlbnRlclkoKSwgc3RhdGUpOworCQkJCQlzbmFwWS5jYWxsKHRoaXMsIHN0YXRlLnksIHN0YXRlKTsKKwkJCQkJc25hcFkuY2FsbCh0aGlzLCBzdGF0ZS55ICsgc3RhdGUuaGVpZ2h0LCBzdGF0ZSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gTW92ZXMgY2VsbHMgdGhhdCBhcmUgb2ZmLWdyaWQgYmFjayB0byB0aGUgZ3JpZCBvbiBtb3ZlCisJCWlmIChncmlkRW5hYmxlZCkKKwkJeworCQkJaWYgKCFvdmVycmlkZVgpCisJCQl7CisJCQkJdmFyIHR4ID0gYm91bmRzLnggLSAodGhpcy5ncmFwaC5zbmFwKGJvdW5kcy54IC8KKwkJCQkJc2NhbGUgLSB0cngueCkgKyB0cngueCkgKiBzY2FsZTsKKwkJCQlkeCA9IHRoaXMuZ3JhcGguc25hcChkeCAvIHNjYWxlKSAqIHNjYWxlIC0gdHg7CisJCQl9CisJCQkKKwkJCWlmICghb3ZlcnJpZGVZKQorCQkJeworCQkJCXZhciB0eSA9IGJvdW5kcy55IC0gKHRoaXMuZ3JhcGguc25hcChib3VuZHMueSAvCisJCQkJCXNjYWxlIC0gdHJ4LnkpICsgdHJ4LnkpICogc2NhbGU7CisJCQkJZHkgPSB0aGlzLmdyYXBoLnNuYXAoZHkgLyBzY2FsZSkgKiBzY2FsZSAtIHR5OworCQkJfQorCQl9CisJCQorCQkvLyBSZWRyYXdzIHRoZSBndWlkZXMKKwkJdmFyIGMgPSB0aGlzLmdyYXBoLmNvbnRhaW5lcjsKKwkJCisJCWlmICghb3ZlcnJpZGVYICYmIHRoaXMuZ3VpZGVYICE9IG51bGwpCisJCXsKKwkJCXRoaXMuZ3VpZGVYLm5vZGUuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOworCQl9CisJCWVsc2UgaWYgKHRoaXMuZ3VpZGVYICE9IG51bGwpCisJCXsKKwkJCWlmIChzdGF0ZVggIT0gbnVsbCAmJiBib3VuZHMgIT0gbnVsbCkKKwkJCXsKKwkJCQltaW5ZID0gTWF0aC5taW4oYm91bmRzLnkgKyBkeSAtIHRoaXMuZ3JhcGgucGFuRHksIHN0YXRlWC55KTsKKwkJCQltYXhZID0gTWF0aC5tYXgoYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0ICsgZHkgLSB0aGlzLmdyYXBoLnBhbkR5LCBzdGF0ZVgueSArIHN0YXRlWC5oZWlnaHQpOworCQkJfQorCQkJCisJCQlpZiAobWluWSAhPSBudWxsICYmIG1heFkgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLmd1aWRlWC5wb2ludHMgPSBbbmV3IG14UG9pbnQodmFsdWVYLCBtaW5ZKSwgbmV3IG14UG9pbnQodmFsdWVYLCBtYXhZKV07CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdGhpcy5ndWlkZVgucG9pbnRzID0gW25ldyBteFBvaW50KHZhbHVlWCwgLXRoaXMuZ3JhcGgucGFuRHkpLCBuZXcgbXhQb2ludCh2YWx1ZVgsIGMuc2Nyb2xsSGVpZ2h0IC0gMyAtIHRoaXMuZ3JhcGgucGFuRHkpXTsKKwkJCX0KKwkJCQorCQkJdGhpcy5ndWlkZVguc3Ryb2tlID0gdGhpcy5nZXRHdWlkZUNvbG9yKHN0YXRlWCwgdHJ1ZSk7CisJCQl0aGlzLmd1aWRlWC5ub2RlLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7CisJCQl0aGlzLmd1aWRlWC5yZWRyYXcoKTsKKwkJfQorCQkKKwkJaWYgKCFvdmVycmlkZVkgJiYgdGhpcy5ndWlkZVkgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5ndWlkZVkubm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5ndWlkZVkgIT0gbnVsbCkKKwkJeworCQkJaWYgKHN0YXRlWSAhPSBudWxsICYmIGJvdW5kcyAhPSBudWxsKQorCQkJeworCQkJCW1pblggPSBNYXRoLm1pbihib3VuZHMueCArIGR4IC0gdGhpcy5ncmFwaC5wYW5EeCwgc3RhdGVZLngpOworCQkJCW1heFggPSBNYXRoLm1heChib3VuZHMueCArIGJvdW5kcy53aWR0aCArIGR4IC0gdGhpcy5ncmFwaC5wYW5EeCwgc3RhdGVZLnggKyBzdGF0ZVkud2lkdGgpOworCQkJfQorCQkJCisJCQlpZiAobWluWCAhPSBudWxsICYmIG1heFggIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLmd1aWRlWS5wb2ludHMgPSBbbmV3IG14UG9pbnQobWluWCwgdmFsdWVZKSwgbmV3IG14UG9pbnQobWF4WCwgdmFsdWVZKV07CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdGhpcy5ndWlkZVkucG9pbnRzID0gW25ldyBteFBvaW50KC10aGlzLmdyYXBoLnBhbkR4LCB2YWx1ZVkpLCBuZXcgbXhQb2ludChjLnNjcm9sbFdpZHRoIC0gMyAtIHRoaXMuZ3JhcGgucGFuRHgsIHZhbHVlWSldOworCQkJfQorCQkJCisJCQl0aGlzLmd1aWRlWS5zdHJva2UgPSB0aGlzLmdldEd1aWRlQ29sb3Ioc3RhdGVZLCBmYWxzZSk7CisJCQl0aGlzLmd1aWRlWS5ub2RlLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7CisJCQl0aGlzLmd1aWRlWS5yZWRyYXcoKTsKKwkJfQorCQkKKwkJZGVsdGEgPSBuZXcgbXhQb2ludChkeCwgZHkpOworCX0KKwkKKwlyZXR1cm4gZGVsdGE7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBoaWRlCisgKiAKKyAqIEhpZGVzIGFsbCBjdXJyZW50IGd1aWRlcy4KKyAqLworbXhHdWlkZS5wcm90b3R5cGUuZ2V0R3VpZGVDb2xvciA9IGZ1bmN0aW9uKHN0YXRlLCBob3Jpem9udGFsKQoreworCXJldHVybiBteENvbnN0YW50cy5HVUlERV9DT0xPUjsKK307CisKKy8qKgorICogRnVuY3Rpb246IGhpZGUKKyAqIAorICogSGlkZXMgYWxsIGN1cnJlbnQgZ3VpZGVzLgorICovCitteEd1aWRlLnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oKQoreworCXRoaXMuc2V0VmlzaWJsZShmYWxzZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRWaXNpYmxlCisgKiAKKyAqIFNob3dzIG9yIGhpZGVzIHRoZSBjdXJyZW50IGd1aWRlcy4KKyAqLworbXhHdWlkZS5wcm90b3R5cGUuc2V0VmlzaWJsZSA9IGZ1bmN0aW9uKHZpc2libGUpCit7CisJaWYgKHRoaXMuZ3VpZGVYICE9IG51bGwpCisJeworCQl0aGlzLmd1aWRlWC5ub2RlLnN0eWxlLnZpc2liaWxpdHkgPSAodmlzaWJsZSkgPyAndmlzaWJsZScgOiAnaGlkZGVuJzsKKwl9CisJCisJaWYgKHRoaXMuZ3VpZGVZICE9IG51bGwpCisJeworCQl0aGlzLmd1aWRlWS5ub2RlLnN0eWxlLnZpc2liaWxpdHkgPSAodmlzaWJsZSkgPyAndmlzaWJsZScgOiAnaGlkZGVuJzsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZXN0cm95CisgKiAKKyAqIERlc3Ryb3lzIGFsbCByZXNvdXJjZXMgdGhhdCB0aGlzIG9iamVjdCB1c2VzLgorICovCitteEd1aWRlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLmd1aWRlWCAhPSBudWxsKQorCXsKKwkJdGhpcy5ndWlkZVguZGVzdHJveSgpOworCQl0aGlzLmd1aWRlWCA9IG51bGw7CisJfQorCQorCWlmICh0aGlzLmd1aWRlWSAhPSBudWxsKQorCXsKKwkJdGhpcy5ndWlkZVkuZGVzdHJveSgpOworCQl0aGlzLmd1aWRlWSA9IG51bGw7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214SW1hZ2UuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teEltYWdlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYmZjMDMKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teEltYWdlLmpzCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14SW1hZ2UKKyAqCisgKiBFbmNhcHN1bGF0ZXMgdGhlIFVSTCwgd2lkdGggYW5kIGhlaWdodCBvZiBhbiBpbWFnZS4KKyAqIAorICogQ29uc3RydWN0b3I6IG14SW1hZ2UKKyAqIAorICogQ29uc3RydWN0cyBhIG5ldyBpbWFnZS4KKyAqLworZnVuY3Rpb24gbXhJbWFnZShzcmMsIHdpZHRoLCBoZWlnaHQpCit7CisJdGhpcy5zcmMgPSBzcmM7CisJdGhpcy53aWR0aCA9IHdpZHRoOworCXRoaXMuaGVpZ2h0ID0gaGVpZ2h0OworfTsKKworLyoqCisgKiBWYXJpYWJsZTogc3JjCisgKgorICogU3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBVUkwgb2YgdGhlIGltYWdlLgorICovCitteEltYWdlLnByb3RvdHlwZS5zcmMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB3aWR0aAorICoKKyAqIEludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZS4KKyAqLworbXhJbWFnZS5wcm90b3R5cGUud2lkdGggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBoZWlnaHQKKyAqCisgKiBJbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLgorICovCitteEltYWdlLnByb3RvdHlwZS5oZWlnaHQgPSBudWxsOwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhJbWFnZUJ1bmRsZS5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214SW1hZ2VCdW5kbGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliYjNhNQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214SW1hZ2VCdW5kbGUuanMKQEAgLTAsMCArMSwxMDMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14SW1hZ2VCdW5kbGUKKyAqCisgKiBNYXBzIGZyb20ga2V5cyB0byBiYXNlNjQgZW5jb2RlZCBpbWFnZXMgb3IgZmlsZSBsb2NhdGlvbnMuIEFsbCB2YWx1ZXMgbXVzdAorICogYmUgVVJMcyBvciB1c2UgdGhlIGZvcm1hdCBkYXRhOmltYWdlL2Zvcm1hdCBmb2xsb3dlZCBieSBhIGNvbW1hIGFuZCB0aGUgYmFzZTY0CisgKiBlbmNvZGVkIGltYWdlIGRhdGEsIGVnLiAiZGF0YTppbWFnZS9naWYsWFlaIiwgd2hlcmUgWFlaIGlzIHRoZSBiYXNlNjQgZW5jb2RlZAorICogaW1hZ2UgZGF0YS4KKyAqIAorICogVG8gYWRkIGEgbmV3IGltYWdlIGJ1bmRsZSB0byBhbiBleGlzdGluZyBncmFwaCwgdGhlIGZvbGxvd2luZyBjb2RlIGlzIHVzZWQ6CisgKiAKKyAqIChjb2RlKQorICogdmFyIGJ1bmRsZSA9IG5ldyBteEltYWdlQnVuZGxlKGFsdCk7CisgKiBidW5kbGUucHV0SW1hZ2UoJ215SW1hZ2UnLCAnZGF0YTppbWFnZS9naWYsUjBsR09EbGhFQUFRQU1JR0FBQUFBSUNBQUlDQWdQJyArCisgKiAgICcvL0FPenAyTzNyMi8vLy8vLy8veUgrRlVOeVpXRjBaV1FnZDJsMGFDQlVhR1VnUjBsTlVBQWgrUVFCQ2dBSEFDd0FBQUFBJyArCisgKiAgICdFQUFRQUFBRFRYaTYzQW93eW5uQU1EZmpQVURsbkFBSmhtZUJGeEFFbG9saUtsdFdtaVlDUXZmVnI2bEJQQjFnZ3hOMWhpJyArCisgKiAgICdsYVNTQVNGUXBJVjVISkJEeUhwcUsyZWpWUm0yQUFnWkNkbUNHTzlDSUJBRHM9JywgZmFsbGJhY2spOworICogYnVuZGxlLnB1dEltYWdlKCdteVN2Z0ltYWdlJywgJ2RhdGE6aW1hZ2Uvc3ZnK3htbCwnICsgZW5jb2RlVVJJQ29tcG9uZW50KAorICogICAnPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiPicgKworICogICAnPGxpbmVhckdyYWRpZW50IGlkPSJncmFkaWVudCI+PHN0b3Agb2Zmc2V0PSIxMCUiIHN0b3AtY29sb3I9IiNGMDAiLz4nICsKKyAqICAgJzxzdG9wIG9mZnNldD0iOTAlIiBzdG9wLWNvbG9yPSIjZmNjIi8+PC9saW5lYXJHcmFkaWVudD4nICsKKyAqICAgJzxyZWN0IGZpbGw9InVybCgjZ3JhZGllbnQpIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIi8+PC9zdmc+JyksIGZhbGxiYWNrKTsKKyAqIGdyYXBoLmFkZEltYWdlQnVuZGxlKGJ1bmRsZSk7CisgKiAoZW5kKTsKKyAqIAorICogQWx0IGlzIGFuIG9wdGlvbmFsIGJvb2xlYW4gKGRlZmF1bHQgaXMgZmFsc2UpIHRoYXQgc3BlY2lmaWVzIGlmIHRoZSB2YWx1ZQorICogb3IgdGhlIGZhbGxiYWNrIHNob3VsZCBiZSByZXR1cm5lZCBpbiA8Z2V0SW1hZ2U+LgorICogCisgKiBUaGUgaW1hZ2UgY2FuIHRoZW4gYmUgcmVmZXJlbmNlZCBpbiBhbnkgY2VsbCBzdHlsZSB1c2luZyBpbWFnZT1teUltYWdlLgorICogSWYgeW91IGFyZSB1c2luZyBteE91dGxpbmUsIHlvdSBzaG91bGQgdXNlIHRoZSBzYW1lIGltYWdlIGJ1bmRsZXMgaW4gdGhlCisgKiBncmFwaCB0aGF0IHJlbmRlcnMgdGhlIG91dGxpbmUuCisgKiAKKyAqIFRoZSBrZXlzIGZvciBpbWFnZXMgYXJlIHJlc29sdmVkIGluIDxteEdyYXBoLnBvc3RQcm9jZXNzQ2VsbFN0eWxlPiBhbmQKKyAqIHR1cm5lZCBpbnRvIGEgZGF0YSBVUkkgaWYgdGhlIHJldHVybmVkIHZhbHVlIGhhcyBhIHNob3J0IGRhdGEgVVJJIGZvcm1hdAorICogYXMgc3BlY2lmaWVkIGFib3ZlLgorICogCisgKiBBIHR5cGljYWwgdmFsdWUgZm9yIHRoZSBmYWxsYmFjayBpcyBhIE1USE1MIGxpbmsgYXMgZGVmaW5lZCBpbiBSRkMgMjU1Ny4KKyAqIE5vdGUgdGhhdCB0aGlzIGZvcm1hdCByZXF1aXJlcyBhIGZpbGUgdG8gYmUgZHluYW1pY2FsbHkgY3JlYXRlZCBvbiB0aGUKKyAqIHNlcnZlci1zaWRlLCBvciB0aGUgcGFnZSB0aGF0IGNvbnRhaW5zIHRoZSBncmFwaCB0byBiZSBtb2RpZmllZCB0byBjb250YWluCisgKiB0aGUgcmVzb3VyY2VzLCB0aGlzIGNhbiBiZSBkb25lIGJ5IGFkZGluZyBhIGNvbW1lbnQgdGhhdCBjb250YWlucyB0aGUKKyAqIHJlc291cmNlIGluIHRoZSBIRUFEIHNlY3Rpb24gb2YgdGhlIHBhZ2UgYWZ0ZXIgdGhlIHRpdGxlIHRhZy4KKyAqIAorICogVGhpcyB0eXBlIG9mIGZhbGxiYWNrIG1lY2hhbmlzbSBzaG91bGQgYmUgdXNlZCBpbiBJRTYgYW5kIElFNy4gSUU4IGRvZXMKKyAqIHN1cHBvcnQgZGF0YSBVUklzLCBidXQgdGhlIG1heGltdW0gc2l6ZSBpcyBsaW1pdGVkIHRvIDMyIEtCLCB3aGljaCBtZWFucworICogYWxsIGRhdGEgVVJJcyBzaG91bGQgYmUgbGltaXRlZCB0byAzMiBLQi4KKyAqLworZnVuY3Rpb24gbXhJbWFnZUJ1bmRsZShhbHQpCit7CisJdGhpcy5pbWFnZXMgPSBbXTsKKwl0aGlzLmFsdCA9IChhbHQgIT0gbnVsbCkgPyBhbHQgOiBmYWxzZTsKK307CisKKy8qKgorICogVmFyaWFibGU6IGltYWdlcworICogCisgKiBNYXBzIGZyb20ga2V5cyB0byBpbWFnZXMuCisgKi8KK214SW1hZ2VCdW5kbGUucHJvdG90eXBlLmltYWdlcyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGFsdAorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIGZhbGxiYWNrIHJlcHJlc2VudGF0aW9uIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhJbWFnZUJ1bmRsZS5wcm90b3R5cGUuaW1hZ2VzID0gbnVsbDsKKworLyoqCisgKiBGdW5jdGlvbjogcHV0SW1hZ2UKKyAqIAorICogQWRkcyB0aGUgc3BlY2lmaWVkIGVudHJ5IHRvIHRoZSBtYXAuIFRoZSBlbnRyeSBpcyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIGFuZAorICogZmFsbGJhY2sgcHJvcGVydHkgYXMgc3BlY2lmaWVkIGluIHRoZSBhcmd1bWVudHMuCisgKi8KK214SW1hZ2VCdW5kbGUucHJvdG90eXBlLnB1dEltYWdlID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSwgZmFsbGJhY2spCit7CisJdGhpcy5pbWFnZXNba2V5XSA9IHt2YWx1ZTogdmFsdWUsIGZhbGxiYWNrOiBmYWxsYmFja307Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRJbWFnZQorICogCisgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleS4gVGhpcyByZXR1cm5zIHRoZSB2YWx1ZQorICogb3IgZmFsbGJhY2ssIGRlcGVuZGluZyBvbiA8YWx0Pi4gVGhlIGZhbGxiYWNrIGlzIHJldHVybmVkIGlmCisgKiA8YWx0PiBpcyB0cnVlLCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgb3RoZXJ3aXNlLgorICovCitteEltYWdlQnVuZGxlLnByb3RvdHlwZS5nZXRJbWFnZSA9IGZ1bmN0aW9uKGtleSkKK3sKKwl2YXIgcmVzdWx0ID0gbnVsbDsKKwkKKwlpZiAoa2V5ICE9IG51bGwpCisJeworCQl2YXIgaW1nID0gdGhpcy5pbWFnZXNba2V5XTsKKwkJCisJCWlmIChpbWcgIT0gbnVsbCkKKwkJeworCQkJcmVzdWx0ID0gKHRoaXMuYWx0KSA/IGltZy5mYWxsYmFjayA6IGltZy52YWx1ZTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gcmVzdWx0OworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214SW1hZ2VFeHBvcnQuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teEltYWdlRXhwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OGY4YzAKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teEltYWdlRXhwb3J0LmpzCkBAIC0wLDAgKzEsMTc1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteEltYWdlRXhwb3J0CisgKiAKKyAqIENyZWF0ZXMgYSBuZXcgaW1hZ2UgZXhwb3J0IGluc3RhbmNlIHRvIGJlIHVzZWQgd2l0aCBhbiBleHBvcnQgY2FudmFzLiBIZXJlCisgKiBpcyBhbiBleGFtcGxlIHRoYXQgdXNlcyB0aGlzIGNsYXNzIHRvIGNyZWF0ZSBhbiBpbWFnZSB2aWEgYSBiYWNrZW5kIHVzaW5nCisgKiA8bXhYbWxFeHBvcnRDYW52YXM+LgorICogCisgKiAoY29kZSkKKyAqIHZhciB4bWxEb2MgPSBteFV0aWxzLmNyZWF0ZVhtbERvY3VtZW50KCk7CisgKiB2YXIgcm9vdCA9IHhtbERvYy5jcmVhdGVFbGVtZW50KCdvdXRwdXQnKTsKKyAqIHhtbERvYy5hcHBlbmRDaGlsZChyb290KTsKKyAqIAorICogdmFyIHhtbENhbnZhcyA9IG5ldyBteFhtbENhbnZhczJEKHJvb3QpOworICogdmFyIGltZ0V4cG9ydCA9IG5ldyBteEltYWdlRXhwb3J0KCk7CisgKiBpbWdFeHBvcnQuZHJhd1N0YXRlKGdyYXBoLmdldFZpZXcoKS5nZXRTdGF0ZShncmFwaC5tb2RlbC5yb290KSwgeG1sQ2FudmFzKTsKKyAqIAorICogdmFyIGJvdW5kcyA9IGdyYXBoLmdldEdyYXBoQm91bmRzKCk7CisgKiB2YXIgdyA9IE1hdGguY2VpbChib3VuZHMueCArIGJvdW5kcy53aWR0aCk7CisgKiB2YXIgaCA9IE1hdGguY2VpbChib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpOworICogCisgKiB2YXIgeG1sID0gbXhVdGlscy5nZXRYbWwocm9vdCk7CisgKiBuZXcgbXhYbWxSZXF1ZXN0KCdleHBvcnQnLCAnZm9ybWF0PXBuZyZ3PScgKyB3ICsKKyAqIAkJJyZoPScgKyBoICsgJyZiZz0jRjlGN0VEJnhtbD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHhtbCkpCisgKiAJCS5zaW11bGF0ZShkb2N1bWVudCwgJ19ibGFuaycpOworICogKGVuZCkKKyAqIAorICogQ29uc3RydWN0b3I6IG14SW1hZ2VFeHBvcnQKKyAqIAorICogQ29uc3RydWN0cyBhIG5ldyBpbWFnZSBleHBvcnQuCisgKi8KK2Z1bmN0aW9uIG14SW1hZ2VFeHBvcnQoKSB7IH07CisKKy8qKgorICogVmFyaWFibGU6IGluY2x1ZGVPdmVybGF5cworICogCisgKiBTcGVjaWZpZXMgaWYgb3ZlcmxheXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBleHBvcnQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214SW1hZ2VFeHBvcnQucHJvdG90eXBlLmluY2x1ZGVPdmVybGF5cyA9IGZhbHNlOworCisvKioKKyAqIEZ1bmN0aW9uOiBkcmF3U3RhdGUKKyAqIAorICogRHJhd3MgdGhlIGdpdmVuIHN0YXRlIGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIHRvIHRoZSBnaXZlbiBjYW52YXMuCisgKi8KK214SW1hZ2VFeHBvcnQucHJvdG90eXBlLmRyYXdTdGF0ZSA9IGZ1bmN0aW9uKHN0YXRlLCBjYW52YXMpCit7CisJaWYgKHN0YXRlICE9IG51bGwpCisJeworCQl0aGlzLnZpc2l0U3RhdGVzUmVjdXJzaXZlKHN0YXRlLCBjYW52YXMsIG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbigpCisJCXsKKwkJCXRoaXMuZHJhd0NlbGxTdGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQl9KSk7CisJCQkJCisJCS8vIFBhaW50cyB0aGUgb3ZlcmxheXMKKwkJaWYgKHRoaXMuaW5jbHVkZU92ZXJsYXlzKQorCQl7CisJCQl0aGlzLnZpc2l0U3RhdGVzUmVjdXJzaXZlKHN0YXRlLCBjYW52YXMsIG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbigpCisJCQl7CisJCQkJdGhpcy5kcmF3T3ZlcmxheXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJCX0pKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGRyYXdTdGF0ZQorICogCisgKiBEcmF3cyB0aGUgZ2l2ZW4gc3RhdGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgdG8gdGhlIGdpdmVuIGNhbnZhcy4KKyAqLworbXhJbWFnZUV4cG9ydC5wcm90b3R5cGUudmlzaXRTdGF0ZXNSZWN1cnNpdmUgPSBmdW5jdGlvbihzdGF0ZSwgY2FudmFzLCB2aXNpdG9yKQoreworCWlmIChzdGF0ZSAhPSBudWxsKQorCXsKKwkJdmlzaXRvcihzdGF0ZSwgY2FudmFzKTsKKwkJCisJCXZhciBncmFwaCA9IHN0YXRlLnZpZXcuZ3JhcGg7CisJCXZhciBjaGlsZENvdW50ID0gZ3JhcGgubW9kZWwuZ2V0Q2hpbGRDb3VudChzdGF0ZS5jZWxsKTsKKwkJCisJCWZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKQorCQl7CisJCQl2YXIgY2hpbGRTdGF0ZSA9IGdyYXBoLnZpZXcuZ2V0U3RhdGUoZ3JhcGgubW9kZWwuZ2V0Q2hpbGRBdChzdGF0ZS5jZWxsLCBpKSk7CisJCQl0aGlzLnZpc2l0U3RhdGVzUmVjdXJzaXZlKGNoaWxkU3RhdGUsIGNhbnZhcywgdmlzaXRvcik7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRMaW5rRm9yQ2VsbFN0YXRlCisgKiAKKyAqIFJldHVybnMgdGhlIGxpbmsgZm9yIHRoZSBnaXZlbiBjZWxsIHN0YXRlIGFuZCBjYW52YXMuIFRoaXMgcmV0dXJucyBudWxsLgorICovCitteEltYWdlRXhwb3J0LnByb3RvdHlwZS5nZXRMaW5rRm9yQ2VsbFN0YXRlID0gZnVuY3Rpb24oc3RhdGUsIGNhbnZhcykKK3sKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGRyYXdDZWxsU3RhdGUKKyAqIAorICogRHJhd3MgdGhlIGdpdmVuIHN0YXRlIHRvIHRoZSBnaXZlbiBjYW52YXMuCisgKi8KK214SW1hZ2VFeHBvcnQucHJvdG90eXBlLmRyYXdDZWxsU3RhdGUgPSBmdW5jdGlvbihzdGF0ZSwgY2FudmFzKQoreworCS8vIEV4cGVyaW1lbnRhbCBmZWF0dXJlCisJdmFyIGxpbmsgPSB0aGlzLmdldExpbmtGb3JDZWxsU3RhdGUoc3RhdGUsIGNhbnZhcyk7CisJCisJaWYgKGxpbmsgIT0gbnVsbCkKKwl7CisJCWNhbnZhcy5zZXRMaW5rKGxpbmspOworCX0KKwkKKwkvLyBQYWludHMgdGhlIHNoYXBlIGFuZCB0ZXh0CisJdGhpcy5kcmF3U2hhcGUoc3RhdGUsIGNhbnZhcyk7CisJdGhpcy5kcmF3VGV4dChzdGF0ZSwgY2FudmFzKTsKKworCWlmIChsaW5rICE9IG51bGwpCisJeworCQljYW52YXMuc2V0TGluayhudWxsKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkcmF3U2hhcGUKKyAqIAorICogRHJhd3MgdGhlIHNoYXBlIG9mIHRoZSBnaXZlbiBzdGF0ZS4KKyAqLworbXhJbWFnZUV4cG9ydC5wcm90b3R5cGUuZHJhd1NoYXBlID0gZnVuY3Rpb24oc3RhdGUsIGNhbnZhcykKK3sKKwlpZiAoc3RhdGUuc2hhcGUgaW5zdGFuY2VvZiBteFNoYXBlICYmIHN0YXRlLnNoYXBlLmNoZWNrQm91bmRzKCkpCisJeworCQljYW52YXMuc2F2ZSgpOworCQlzdGF0ZS5zaGFwZS5wYWludChjYW52YXMpOworCQljYW52YXMucmVzdG9yZSgpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGRyYXdUZXh0CisgKiAKKyAqIERyYXdzIHRoZSB0ZXh0IG9mIHRoZSBnaXZlbiBzdGF0ZS4KKyAqLworbXhJbWFnZUV4cG9ydC5wcm90b3R5cGUuZHJhd1RleHQgPSBmdW5jdGlvbihzdGF0ZSwgY2FudmFzKQoreworCWlmIChzdGF0ZS50ZXh0ICE9IG51bGwgJiYgc3RhdGUudGV4dC5jaGVja0JvdW5kcygpKQorCXsKKwkJY2FudmFzLnNhdmUoKTsKKwkJc3RhdGUudGV4dC5wYWludChjYW52YXMpOworCQljYW52YXMucmVzdG9yZSgpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGRyYXdPdmVybGF5cworICogCisgKiBEcmF3cyB0aGUgb3ZlcmxheXMgZm9yIHRoZSBnaXZlbiBzdGF0ZS4gVGhpcyBpcyBjYWxsZWQgaWYgPGluY2x1ZGVPdmVybGF5cz4KKyAqIGlzIHRydWUuCisgKi8KK214SW1hZ2VFeHBvcnQucHJvdG90eXBlLmRyYXdPdmVybGF5cyA9IGZ1bmN0aW9uKHN0YXRlLCBjYW52YXMpCit7CisJaWYgKHN0YXRlLm92ZXJsYXlzICE9IG51bGwpCisJeworCQlzdGF0ZS5vdmVybGF5cy52aXNpdChmdW5jdGlvbihpZCwgc2hhcGUpCisJCXsKKwkJCWlmIChzaGFwZSBpbnN0YW5jZW9mIG14U2hhcGUpCisJCQl7CisJCQkJc2hhcGUucGFpbnQoY2FudmFzKTsKKwkJCX0KKwkJfSk7CisJfQorfTsKKwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhMb2cuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teExvZy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODU5NWZkCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhMb2cuanMKQEAgLTAsMCArMSw0MTMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KK3ZhciBteExvZyA9Cit7CisJLyoqCisJICogQ2xhc3M6IG14TG9nCisJICogCisJICogQSBzaW5nbGV0b24gY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgc2ltcGxlIGNvbnNvbGUuCisJICogCisJICogVmFyaWFibGU6IGNvbnNvbGVOYW1lCisJICogCisJICogU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBjb25zb2xlIHdpbmRvdy4gRGVmYXVsdCBpcyAnQ29uc29sZScuCisJICovCisJY29uc29sZU5hbWU6ICdDb25zb2xlJywKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogVFJBQ0UKKwkgKiAKKwkgKiBTcGVjaWZpZWQgaWYgdGhlIG91dHB1dCBmb3IgPGVudGVyPiBhbmQgPGxlYXZlPiBzaG91bGQgYmUgdmlzaWJsZSBpbiB0aGUKKwkgKiBjb25zb2xlLiBEZWZhdWx0IGlzIGZhbHNlLgorCSAqLworCVRSQUNFOiBmYWxzZSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBERUJVRworCSAqIAorCSAqIFNwZWNpZmllcyBpZiB0aGUgb3V0cHV0IGZvciA8ZGVidWc+IHNob3VsZCBiZSB2aXNpYmxlIGluIHRoZSBjb25zb2xlLgorCSAqIERlZmF1bHQgaXMgdHJ1ZS4KKwkgKi8KKwlERUJVRzogdHJ1ZSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBXQVJOCisJICogCisJICogU3BlY2lmaWVzIGlmIHRoZSBvdXRwdXQgZm9yIDx3YXJuPiBzaG91bGQgYmUgdmlzaWJsZSBpbiB0aGUgY29uc29sZS4KKwkgKiBEZWZhdWx0IGlzIHRydWUuCisJICovCisJV0FSTjogdHJ1ZSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBidWZmZXIKKwkgKiAKKwkgKiBCdWZmZXIgZm9yIHByZS1pbml0aWFsaXplZCBjb250ZW50LgorCSAqLworCWJ1ZmZlcjogJycsCisJCisJLyoqCisJICogRnVuY3Rpb246IGluaXQKKwkgKgorCSAqIEluaXRpYWxpemVzIHRoZSBET00gbm9kZSBmb3IgdGhlIGNvbnNvbGUuIFRoaXMgcmVxdWlyZXMgZG9jdW1lbnQuYm9keSB0bworCSAqIHBvaW50IHRvIGEgbm9uLW51bGwgdmFsdWUuIFRoaXMgaXMgY2FsbGVkIGZyb20gd2l0aGluIDxzZXRWaXNpYmxlPiBpZiB0aGUKKwkgKiBsb2cgaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZC4KKwkgKi8KKwlpbml0OiBmdW5jdGlvbigpCisJeworCQlpZiAobXhMb2cud2luZG93ID09IG51bGwgJiYgZG9jdW1lbnQuYm9keSAhPSBudWxsKQorCQl7CisJCQl2YXIgdGl0bGUgPSBteExvZy5jb25zb2xlTmFtZSArICcgLSBteEdyYXBoICcgKyBteENsaWVudC5WRVJTSU9OOworCisJCQkvLyBDcmVhdGVzIGEgdGFibGUgdGhhdCBtYWludGFpbnMgdGhlIGxheW91dAorCQkJdmFyIHRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGFibGUnKTsKKwkJCXRhYmxlLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMTAwJScpOworCQkJdGFibGUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnMTAwJScpOworCisJCQl2YXIgdGJvZHkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Ym9keScpOworCQkJdmFyIHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKKwkJCXZhciB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CisJCQl0ZC5zdHlsZS52ZXJ0aWNhbEFsaWduID0gJ3RvcCc7CisJCQkJCisJCQkvLyBBZGRzIHRoZSBhY3R1YWwgY29uc29sZSBhcyBhIHRleHRhcmVhCisJCQlteExvZy50ZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CisJCQlteExvZy50ZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ3dyYXAnLCAnb2ZmJyk7CisJCQlteExvZy50ZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ3JlYWRPbmx5JywgJ3RydWUnKTsKKwkJCW14TG9nLnRleHRhcmVhLnN0eWxlLmhlaWdodCA9ICcxMDAlJzsKKwkJCW14TG9nLnRleHRhcmVhLnN0eWxlLnJlc2l6ZSA9ICdub25lJzsKKwkJCW14TG9nLnRleHRhcmVhLnZhbHVlID0gbXhMb2cuYnVmZmVyOworCisJCQkvLyBXb3JrYXJvdW5kIGZvciB3cm9uZyB3aWR0aCBpbiBzdGFuZGFyZHMgbW9kZQorCQkJaWYgKG14Q2xpZW50LklTX05TICYmIGRvY3VtZW50LmNvbXBhdE1vZGUgIT0gJ0JhY2tDb21wYXQnKQorCQkJeworCQkJCW14TG9nLnRleHRhcmVhLnN0eWxlLndpZHRoID0gJzk5JSc7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXhMb2cudGV4dGFyZWEuc3R5bGUud2lkdGggPSAnMTAwJSc7CisJCQl9CisJCQkKKwkJCXRkLmFwcGVuZENoaWxkKG14TG9nLnRleHRhcmVhKTsKKwkJCXRyLmFwcGVuZENoaWxkKHRkKTsKKwkJCXRib2R5LmFwcGVuZENoaWxkKHRyKTsKKworCQkJLy8gQ3JlYXRlcyB0aGUgY29udGFpbmVyIGRpdgorCQkJdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOworCQkJbXhMb2cudGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOworCQkJbXhMb2cudGQuc3R5bGUudmVydGljYWxBbGlnbiA9ICd0b3AnOworCQkJbXhMb2cudGQuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnMzBweCcpOworCQkJCisJCQl0ci5hcHBlbmRDaGlsZChteExvZy50ZCk7CisJCQl0Ym9keS5hcHBlbmRDaGlsZCh0cik7CisJCQl0YWJsZS5hcHBlbmRDaGlsZCh0Ym9keSk7CisKKwkJCS8vIEFkZHMgdmFyaW91cyBkZWJ1Z2dpbmcgYnV0dG9ucworCQkJbXhMb2cuYWRkQnV0dG9uKCdJbmZvJywgZnVuY3Rpb24gKGV2dCkKKwkJCXsKKwkJCQlteExvZy5pbmZvKCk7CisJCQl9KTsKKwkJCisJCQlteExvZy5hZGRCdXR0b24oJ0RPTScsIGZ1bmN0aW9uIChldnQpCisJCQl7CisJCQkJdmFyIGNvbnRlbnQgPSBteFV0aWxzLmdldElubmVySHRtbChkb2N1bWVudC5ib2R5KTsKKwkJCQlteExvZy5kZWJ1Zyhjb250ZW50KTsKKwkJCX0pOworCQorCQkJbXhMb2cuYWRkQnV0dG9uKCdUcmFjZScsIGZ1bmN0aW9uIChldnQpCisJCQl7CisJCQkJbXhMb2cuVFJBQ0UgPSAhbXhMb2cuVFJBQ0U7CisJCQkJCisJCQkJaWYgKG14TG9nLlRSQUNFKQorCQkJCXsKKwkJCQkJbXhMb2cuZGVidWcoJ1RyYWNpbmcgZW5hYmxlZCcpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlteExvZy5kZWJ1ZygnVHJhY2luZyBkaXNhYmxlZCcpOworCQkJCX0KKwkJCX0pOwkKKworCQkJbXhMb2cuYWRkQnV0dG9uKCdDb3B5JywgZnVuY3Rpb24gKGV2dCkKKwkJCXsKKwkJCQl0cnkKKwkJCQl7CisJCQkJCW14VXRpbHMuY29weShteExvZy50ZXh0YXJlYS52YWx1ZSk7CisJCQkJfQorCQkJCWNhdGNoIChlcnIpCisJCQkJeworCQkJCQlteFV0aWxzLmFsZXJ0KGVycik7CisJCQkJfQorCQkJfSk7CQkJCisKKwkJCW14TG9nLmFkZEJ1dHRvbignU2hvdycsIGZ1bmN0aW9uIChldnQpCisJCQl7CisJCQkJdHJ5CisJCQkJeworCQkJCQlteFV0aWxzLnBvcHVwKG14TG9nLnRleHRhcmVhLnZhbHVlKTsKKwkJCQl9CisJCQkJY2F0Y2ggKGVycikKKwkJCQl7CisJCQkJCW14VXRpbHMuYWxlcnQoZXJyKTsKKwkJCQl9CisJCQl9KTsJCisJCQkKKwkJCW14TG9nLmFkZEJ1dHRvbignQ2xlYXInLCBmdW5jdGlvbiAoZXZ0KQorCQkJeworCQkJCW14TG9nLnRleHRhcmVhLnZhbHVlID0gJyc7CisJCQl9KTsKKworCQkJLy8gQ3Jvc3MtYnJvd3NlciBjb2RlIHRvIGdldCB3aW5kb3cgc2l6ZQorCQkJdmFyIGggPSAwOworCQkJdmFyIHcgPSAwOworCQkJCisJCQlpZiAodHlwZW9mKHdpbmRvdy5pbm5lcldpZHRoKSA9PT0gJ251bWJlcicpCisJCQl7CisJCQkJaCA9IHdpbmRvdy5pbm5lckhlaWdodDsKKwkJCQl3ID0gd2luZG93LmlubmVyV2lkdGg7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaCA9IChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0KTsKKwkJCQl3ID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDsKKwkJCX0KKworCQkJbXhMb2cud2luZG93ID0gbmV3IG14V2luZG93KHRpdGxlLCB0YWJsZSwgTWF0aC5tYXgoMCwgdyAtIDMyMCksIE1hdGgubWF4KDAsIGggLSAyMTApLCAzMDAsIDE2MCk7CisJCQlteExvZy53aW5kb3cuc2V0TWF4aW1pemFibGUodHJ1ZSk7CisJCQlteExvZy53aW5kb3cuc2V0U2Nyb2xsYWJsZShmYWxzZSk7CisJCQlteExvZy53aW5kb3cuc2V0UmVzaXphYmxlKHRydWUpOworCQkJbXhMb2cud2luZG93LnNldENsb3NhYmxlKHRydWUpOworCQkJbXhMb2cud2luZG93LmRlc3Ryb3lPbkNsb3NlID0gZmFsc2U7CisJCQkKKwkJCS8vIFdvcmthcm91bmQgZm9yIGlnbm9yZWQgdGV4dGFyZWEgaGVpZ2h0IGluIHZhcmlvdXMgc2V0dXBzCisJCQlpZiAoKChteENsaWVudC5JU19OUyB8fCBteENsaWVudC5JU19JRSkgJiYgIW14Q2xpZW50LklTX0dDICYmCisJCQkJIW14Q2xpZW50LklTX1NGICYmIGRvY3VtZW50LmNvbXBhdE1vZGUgIT0gJ0JhY2tDb21wYXQnKSB8fAorCQkJCWRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSAxMSkKKwkJCXsKKwkJCQl2YXIgZWx0ID0gbXhMb2cud2luZG93LmdldEVsZW1lbnQoKTsKKwkJCQkKKwkJCQl2YXIgcmVzaXplSGFuZGxlciA9IGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorCQkJCXsKKwkJCQkJbXhMb2cudGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gTWF0aC5tYXgoMCwgZWx0Lm9mZnNldEhlaWdodCAtIDcwKSArICdweCc7CisJCQkJfTsgCisJCQkJCisJCQkJbXhMb2cud2luZG93LmFkZExpc3RlbmVyKG14RXZlbnQuUkVTSVpFX0VORCwgcmVzaXplSGFuZGxlcik7CisJCQkJbXhMb2cud2luZG93LmFkZExpc3RlbmVyKG14RXZlbnQuTUFYSU1JWkUsIHJlc2l6ZUhhbmRsZXIpOworCQkJCW14TG9nLndpbmRvdy5hZGRMaXN0ZW5lcihteEV2ZW50Lk5PUk1BTElaRSwgcmVzaXplSGFuZGxlcik7CisKKwkJCQlteExvZy50ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSAnOTJweCc7CisJCQl9CisJCX0KKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBpbmZvCisJICogCisJICogV3JpdGVzIHRoZSBjdXJyZW50IG5hdmlnYXRvciBpbmZvcm1hdGlvbiB0byB0aGUgY29uc29sZS4KKwkgKi8KKwlpbmZvOiBmdW5jdGlvbigpCisJeworCQlteExvZy53cml0ZWxuKG14VXRpbHMudG9TdHJpbmcobmF2aWdhdG9yKSk7CisJfSwKKwkJCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBhZGRCdXR0b24KKwkgKiAKKwkgKiBBZGRzIGEgYnV0dG9uIHRvIHRoZSBjb25zb2xlIHVzaW5nIHRoZSBnaXZlbiBsYWJlbCBhbmQgZnVuY3Rpb24uCisJICovCisJYWRkQnV0dG9uOiBmdW5jdGlvbihsYWIsIGZ1bmN0KQorCXsKKwkJdmFyIGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOworCQlteFV0aWxzLndyaXRlKGJ1dHRvbiwgbGFiKTsKKwkJbXhFdmVudC5hZGRMaXN0ZW5lcihidXR0b24sICdjbGljaycsIGZ1bmN0KTsKKwkJbXhMb2cudGQuYXBwZW5kQ2hpbGQoYnV0dG9uKTsKKwl9LAorCQkJCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBpc1Zpc2libGUKKwkgKiAKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnNvbGUgaXMgdmlzaWJsZS4KKwkgKi8KKwlpc1Zpc2libGU6IGZ1bmN0aW9uKCkKKwl7CisJCWlmIChteExvZy53aW5kb3cgIT0gbnVsbCkKKwkJeworCQkJcmV0dXJuIG14TG9nLndpbmRvdy5pc1Zpc2libGUoKTsKKwkJfQorCQkKKwkJcmV0dXJuIGZhbHNlOworCX0sCisJCisKKwkvKioKKwkgKiBGdW5jdGlvbjogc2hvdworCSAqIAorCSAqIFNob3dzIHRoZSBjb25zb2xlLgorCSAqLworCXNob3c6IGZ1bmN0aW9uKCkKKwl7CisJCW14TG9nLnNldFZpc2libGUodHJ1ZSk7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBzZXRWaXNpYmxlCisJICogCisJICogU2hvd3Mgb3IgaGlkZXMgdGhlIGNvbnNvbGUuCisJICovCisJc2V0VmlzaWJsZTogZnVuY3Rpb24odmlzaWJsZSkKKwl7CisJCWlmIChteExvZy53aW5kb3cgPT0gbnVsbCkKKwkJeworCQkJbXhMb2cuaW5pdCgpOworCQl9CisKKwkJaWYgKG14TG9nLndpbmRvdyAhPSBudWxsKQorCQl7CisJCQlteExvZy53aW5kb3cuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKwkJfQorCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZW50ZXIKKwkgKiAKKwkgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIGNvbnNvbGUKKwkgKiBpZiA8VFJBQ0U+IGlzIHRydWUgYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgCisJICogdGltZSBpbiBtaWxsaXNlY29uZHMuCisJICoKKwkgKiBFeGFtcGxlOgorCSAqIAorCSAqIChjb2RlKQorCSAqIG14TG9nLnNob3coKTsKKwkgKiB2YXIgdDAgPSBteExvZy5lbnRlcignSGVsbG8nKTsKKwkgKiAvLyBEbyBzb21ldGhpbmcKKwkgKiBteExvZy5sZWF2ZSgnV29ybGQhJywgdDApOworCSAqIChlbmQpCisJICovCisJZW50ZXI6IGZ1bmN0aW9uKHN0cmluZykKKwl7CisJCWlmIChteExvZy5UUkFDRSkKKwkJeworCQkJbXhMb2cud3JpdGVsbignRW50ZXJpbmcgJytzdHJpbmcpOworCQkJCisJCQlyZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisJCX0KKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGxlYXZlCisJICogCisJICogV3JpdGVzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBjb25zb2xlCisJICogaWYgPFRSQUNFPiBpcyB0cnVlIGFuZCBjb21wdXRlcyB0aGUgZGlmZmVyZW5jZQorCSAqIGJldHdlZW4gdGhlIGN1cnJlbnQgdGltZSBhbmQgdDAgaW4gbWlsbGlzZWNvbmRzLgorCSAqIFNlZSA8ZW50ZXI+IGZvciBhbiBleGFtcGxlLgorCSAqLworCWxlYXZlOiBmdW5jdGlvbihzdHJpbmcsIHQwKQorCXsKKwkJaWYgKG14TG9nLlRSQUNFKQorCQl7CisJCQl2YXIgZHQgPSAodDAgIT0gMCkgPyAnICgnKyhuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHQwKSsnIG1zKScgOiAnJzsKKwkJCW14TG9nLndyaXRlbG4oJ0xlYXZpbmcgJytzdHJpbmcrZHQpOworCQl9CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogZGVidWcKKwkgKiAKKwkgKiBBZGRzIGFsbCBhcmd1bWVudHMgdG8gdGhlIGNvbnNvbGUgaWYgPERFQlVHPiBpcyBlbmFibGVkLgorCSAqCisJICogRXhhbXBsZToKKwkgKiAKKwkgKiAoY29kZSkKKwkgKiBteExvZy5zaG93KCk7CisJICogbXhMb2cuZGVidWcoJ0hlbGxvLCBXb3JsZCEnKTsKKwkgKiAoZW5kKQorCSAqLworCWRlYnVnOiBmdW5jdGlvbigpCisJeworCQlpZiAobXhMb2cuREVCVUcpCisJCXsKKwkJCW14TG9nLndyaXRlbG4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJfQorCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IHdhcm4KKwkgKiAKKwkgKiBBZGRzIGFsbCBhcmd1bWVudHMgdG8gdGhlIGNvbnNvbGUgaWYgPFdBUk4+IGlzIGVuYWJsZWQuCisJICoKKwkgKiBFeGFtcGxlOgorCSAqIAorCSAqIChjb2RlKQorCSAqIG14TG9nLnNob3coKTsKKwkgKiBteExvZy53YXJuKCdIZWxsbywgV29ybGQhJyk7CisJICogKGVuZCkKKwkgKi8KKwl3YXJuOiBmdW5jdGlvbigpCisJeworCQlpZiAobXhMb2cuV0FSTikKKwkJeworCQkJbXhMb2cud3JpdGVsbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQl9CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiB3cml0ZQorCSAqIAorCSAqIEFkZHMgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHRvIHRoZSBjb25zb2xlLgorCSAqLworCXdyaXRlOiBmdW5jdGlvbigpCisJeworCQl2YXIgc3RyaW5nID0gJyc7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykKKwkJeworCQkJc3RyaW5nICs9IGFyZ3VtZW50c1tpXTsKKwkJCQorCQkJaWYgKGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMSkKKwkJCXsKKwkJCQlzdHJpbmcgKz0gJyAnOworCQkJfQorCQl9CisJCQorCQlpZiAobXhMb2cudGV4dGFyZWEgIT0gbnVsbCkKKwkJeworCQkJbXhMb2cudGV4dGFyZWEudmFsdWUgPSBteExvZy50ZXh0YXJlYS52YWx1ZSArIHN0cmluZzsKKworCQkJLy8gV29ya2Fyb3VuZCBmb3Igbm8gdXBkYXRlIGluIFByZXN0byAyLjUuMjIgKE9wZXJhIDEwLjUpCisJCQlpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdQcmVzdG8vMi41JykgPj0gMCkKKwkJCXsKKwkJCQlteExvZy50ZXh0YXJlYS5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CisJCQkJbXhMb2cudGV4dGFyZWEuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsKKwkJCX0KKwkJCQorCQkJbXhMb2cudGV4dGFyZWEuc2Nyb2xsVG9wID0gbXhMb2cudGV4dGFyZWEuc2Nyb2xsSGVpZ2h0OworCQl9CisJCWVsc2UKKwkJeworCQkJbXhMb2cuYnVmZmVyICs9IHN0cmluZzsKKwkJfQorCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IHdyaXRlbG4KKwkgKiAKKwkgKiBBZGRzIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB0byB0aGUgY29uc29sZSwgYXBwZW5kaW5nIGEgbGluZWZlZWQgYXQgdGhlCisJICogZW5kIG9mIGVhY2ggc3RyaW5nLgorCSAqLworCXdyaXRlbG46IGZ1bmN0aW9uKCkKKwl7CisJCXZhciBzdHJpbmcgPSAnJzsKKwkJCisJCWZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKQorCQl7CisJCQlzdHJpbmcgKz0gYXJndW1lbnRzW2ldOworCQkJCisJCQlpZiAoaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxKQorCQkJeworCQkJCXN0cmluZyArPSAnICc7CisJCQl9CisJCX0KKworCQlteExvZy53cml0ZShzdHJpbmcgKyAnXG4nKTsKKwl9CisJCit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhNb3JwaGluZy5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214TW9ycGhpbmcuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiZGM3MAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214TW9ycGhpbmcuanMKQEAgLTAsMCArMSwyNDggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICoKKyAqIENsYXNzOiBteE1vcnBoaW5nCisgKiAKKyAqIEltcGxlbWVudHMgYW5pbWF0aW9uIGZvciBtb3JwaGluZyBjZWxscy4gSGVyZSBpcyBhbiBleGFtcGxlIG9mCisgKiB1c2luZyB0aGlzIGNsYXNzIGZvciBhbmltYXRpbmcgdGhlIHJlc3VsdCBvZiBhIGxheW91dCBhbGdvcml0aG06CisgKiAKKyAqIChjb2RlKQorICogZ3JhcGguZ2V0TW9kZWwoKS5iZWdpblVwZGF0ZSgpOworICogdHJ5CisgKiB7CisgKiAgIHZhciBjaXJjbGVMYXlvdXQgPSBuZXcgbXhDaXJjbGVMYXlvdXQoZ3JhcGgpOworICogICBjaXJjbGVMYXlvdXQuZXhlY3V0ZShncmFwaC5nZXREZWZhdWx0UGFyZW50KCkpOworICogfQorICogZmluYWxseQorICogeworICogICB2YXIgbW9ycGggPSBuZXcgbXhNb3JwaGluZyhncmFwaCk7CisgKiAgIG1vcnBoLmFkZExpc3RlbmVyKG14RXZlbnQuRE9ORSwgZnVuY3Rpb24oKQorICogICB7CisgKiAgICAgZ3JhcGguZ2V0TW9kZWwoKS5lbmRVcGRhdGUoKTsKKyAqICAgfSk7CisgKiAgIAorICogICBtb3JwaC5zdGFydEFuaW1hdGlvbigpOworICogfQorICogKGVuZCkKKyAqIAorICogQ29uc3RydWN0b3I6IG14TW9ycGhpbmcKKyAqIAorICogQ29uc3RydWN0cyBhbiBhbmltYXRpb24uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGdyYXBoIC0gUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgPG14R3JhcGg+LgorICogc3RlcHMgLSBPcHRpb25hbCBudW1iZXIgb2Ygc3RlcHMgaW4gdGhlIG1vcnBoaW5nIGFuaW1hdGlvbi4gRGVmYXVsdCBpcyA2LgorICogZWFzZSAtIE9wdGlvbmFsIGVhc2luZyBjb25zdGFudCBmb3IgdGhlIGFuaW1hdGlvbi4gRGVmYXVsdCBpcyAxLjUuCisgKiBkZWxheSAtIE9wdGlvbmFsIGRlbGF5IGJldHdlZW4gdGhlIGFuaW1hdGlvbiBzdGVwcy4gUGFzc2VkIHRvIDxteEFuaW1hdGlvbj4uCisgKi8KK2Z1bmN0aW9uIG14TW9ycGhpbmcoZ3JhcGgsIHN0ZXBzLCBlYXNlLCBkZWxheSkKK3sKKwlteEFuaW1hdGlvbi5jYWxsKHRoaXMsIGRlbGF5KTsKKwl0aGlzLmdyYXBoID0gZ3JhcGg7CisJdGhpcy5zdGVwcyA9IChzdGVwcyAhPSBudWxsKSA/IHN0ZXBzIDogNjsKKwl0aGlzLmVhc2UgPSAoZWFzZSAhPSBudWxsKSA/IGVhc2UgOiAxLjU7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhFdmVudFNvdXJjZS4KKyAqLworbXhNb3JwaGluZy5wcm90b3R5cGUgPSBuZXcgbXhBbmltYXRpb24oKTsKK214TW9ycGhpbmcucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhNb3JwaGluZzsKKworLyoqCisgKiBWYXJpYWJsZTogZ3JhcGgKKyAqIAorICogU3BlY2lmaWVzIHRoZSBkZWxheSBiZXR3ZWVuIHRoZSBhbmltYXRpb24gc3RlcHMuIERlZmF1bCBpcyAzMG1zLgorICovCitteE1vcnBoaW5nLnByb3RvdHlwZS5ncmFwaCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHN0ZXBzCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RlcHMgZm9yIHRoZSBtb3JwaGluZy4KKyAqLworbXhNb3JwaGluZy5wcm90b3R5cGUuc3RlcHMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzdGVwCisgKiAKKyAqIENvbnRhaW5zIHRoZSBjdXJyZW50IHN0ZXAuCisgKi8KK214TW9ycGhpbmcucHJvdG90eXBlLnN0ZXAgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBlYXNlCisgKiAKKyAqIEVhc2Utb2ZmIGZvciBtb3ZlbWVudCB0b3dhcmRzIHRoZSBnaXZlbiB2ZWN0b3IuIExhcmdlciB2YWx1ZXMgYXJlCisgKiBzbG93ZXIgYW5kIHNtb290aGVyLiBEZWZhdWx0IGlzIDQuCisgKi8KK214TW9ycGhpbmcucHJvdG90eXBlLmVhc2UgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjZWxscworICogCisgKiBPcHRpb25hbCBhcnJheSBvZiBjZWxscyB0byBiZSBhbmltYXRlZC4gSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkCisgKiB0aGVuIGFsbCBjZWxscyBhcmUgY2hlY2tlZCBhbmQgYW5pbWF0ZWQgaWYgdGhleSBoYXZlIGJlZW4gbW92ZWQKKyAqIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgorICovCitteE1vcnBoaW5nLnByb3RvdHlwZS5jZWxscyA9IG51bGw7CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZUFuaW1hdGlvbgorICoKKyAqIEFuaW1hdGlvbiBzdGVwLgorICovCitteE1vcnBoaW5nLnByb3RvdHlwZS51cGRhdGVBbmltYXRpb24gPSBmdW5jdGlvbigpCit7CisJdmFyIG1vdmUgPSBuZXcgbXhDZWxsU3RhdGVQcmV2aWV3KHRoaXMuZ3JhcGgpOworCisJaWYgKHRoaXMuY2VsbHMgIT0gbnVsbCkKKwl7CisJCS8vIEFuaW1hdGVzIHRoZSBnaXZlbiBjZWxscyBpbmRpdmlkdWFsbHkgd2l0aG91dCByZWN1cnNpb24KKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNlbGxzLmxlbmd0aDsgaSsrKQorCQl7CisJCQl0aGlzLmFuaW1hdGVDZWxsKHRoaXMuY2VsbHNbaV0sIG1vdmUsIGZhbHNlKTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvLyBBbmltYXRlcyBhbGwgY2hhbmdlZCBjZWxscyBieSB1c2luZyByZWN1cnNpb24gdG8gZmluZAorCQkvLyB0aGUgY2hhbmdlZCBjZWxscyBidXQgbm90IGZvciB0aGUgYW5pbWF0aW9uIGl0c2VsZgorCQl0aGlzLmFuaW1hdGVDZWxsKHRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5nZXRSb290KCksIG1vdmUsIHRydWUpOworCX0KKwkKKwl0aGlzLnNob3cobW92ZSk7CisJCisJaWYgKG1vdmUuaXNFbXB0eSgpIHx8IHRoaXMuc3RlcCsrID49IHRoaXMuc3RlcHMpCisJeworCQl0aGlzLnN0b3BBbmltYXRpb24oKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzaG93CisgKgorICogU2hvd3MgdGhlIGNoYW5nZXMgaW4gdGhlIGdpdmVuIDxteENlbGxTdGF0ZVByZXZpZXc+LgorICovCitteE1vcnBoaW5nLnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24obW92ZSkKK3sKKwltb3ZlLnNob3coKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFuaW1hdGVDZWxsCisgKgorICogQW5pbWF0ZXMgdGhlIGdpdmVuIGNlbGwgc3RhdGUgdXNpbmcgPG14Q2VsbFN0YXRlUHJldmlldy5tb3ZlU3RhdGU+LgorICovCitteE1vcnBoaW5nLnByb3RvdHlwZS5hbmltYXRlQ2VsbCA9IGZ1bmN0aW9uKGNlbGwsIG1vdmUsIHJlY3Vyc2UpCit7CisJdmFyIHN0YXRlID0gdGhpcy5ncmFwaC5nZXRWaWV3KCkuZ2V0U3RhdGUoY2VsbCk7CisJdmFyIGRlbHRhID0gbnVsbDsKKworCWlmIChzdGF0ZSAhPSBudWxsKQorCXsKKwkJLy8gTW92ZXMgdGhlIGFuaW1hdGVkIHN0YXRlIGZyb20gd2hlcmUgaXQgd2lsbCBiZSBhZnRlciB0aGUgbW9kZWwKKwkJLy8gY2hhbmdlIGJ5IHN1YnRyYWN0aW5nIHRoZSBnaXZlbiBkZWx0YSB2ZWN0b3IgZnJvbSB0aGF0IGxvY2F0aW9uCisJCWRlbHRhID0gdGhpcy5nZXREZWx0YShzdGF0ZSk7CisKKwkJaWYgKHRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5pc1ZlcnRleChjZWxsKSAmJiAoZGVsdGEueCAhPSAwIHx8IGRlbHRhLnkgIT0gMCkpCisJCXsKKwkJCXZhciB0cmFuc2xhdGUgPSB0aGlzLmdyYXBoLnZpZXcuZ2V0VHJhbnNsYXRlKCk7CisJCQl2YXIgc2NhbGUgPSB0aGlzLmdyYXBoLnZpZXcuZ2V0U2NhbGUoKTsKKwkJCQorCQkJZGVsdGEueCArPSB0cmFuc2xhdGUueCAqIHNjYWxlOworCQkJZGVsdGEueSArPSB0cmFuc2xhdGUueSAqIHNjYWxlOworCQkJCisJCQltb3ZlLm1vdmVTdGF0ZShzdGF0ZSwgLWRlbHRhLnggLyB0aGlzLmVhc2UsIC1kZWx0YS55IC8gdGhpcy5lYXNlKTsKKwkJfQorCX0KKwkKKwlpZiAocmVjdXJzZSAmJiAhdGhpcy5zdG9wUmVjdXJzaW9uKHN0YXRlLCBkZWx0YSkpCisJeworCQl2YXIgY2hpbGRDb3VudCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5nZXRDaGlsZENvdW50KGNlbGwpOworCisJCWZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKQorCQl7CisJCQl0aGlzLmFuaW1hdGVDZWxsKHRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5nZXRDaGlsZEF0KGNlbGwsIGkpLCBtb3ZlLCByZWN1cnNlKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHN0b3BSZWN1cnNpb24KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFuaW1hdGlvbiBzaG91bGQgbm90IHJlY3Vyc2l2ZWx5IGZpbmQgbW9yZQorICogZGVsdGFzIGZvciBjaGlsZHJlbiBpZiB0aGUgZ2l2ZW4gcGFyZW50IHN0YXRlIGhhcyBiZWVuIGFuaW1hdGVkLgorICovCitteE1vcnBoaW5nLnByb3RvdHlwZS5zdG9wUmVjdXJzaW9uID0gZnVuY3Rpb24oc3RhdGUsIGRlbHRhKQoreworCXJldHVybiBkZWx0YSAhPSBudWxsICYmIChkZWx0YS54ICE9IDAgfHwgZGVsdGEueSAhPSAwKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldERlbHRhCisgKgorICogUmV0dXJucyB0aGUgdmVjdG9yIGJldHdlZW4gdGhlIGN1cnJlbnQgcmVuZGVyZWQgc3RhdGUgYW5kIHRoZSBmdXR1cmUKKyAqIGxvY2F0aW9uIG9mIHRoZSBzdGF0ZSBhZnRlciB0aGUgZGlzcGxheSB3aWxsIGJlIHVwZGF0ZWQuCisgKi8KK214TW9ycGhpbmcucHJvdG90eXBlLmdldERlbHRhID0gZnVuY3Rpb24oc3RhdGUpCit7CisJdmFyIG9yaWdpbiA9IHRoaXMuZ2V0T3JpZ2luRm9yQ2VsbChzdGF0ZS5jZWxsKTsKKwl2YXIgdHJhbnNsYXRlID0gdGhpcy5ncmFwaC5nZXRWaWV3KCkuZ2V0VHJhbnNsYXRlKCk7CisJdmFyIHNjYWxlID0gdGhpcy5ncmFwaC5nZXRWaWV3KCkuZ2V0U2NhbGUoKTsKKwl2YXIgeCA9IHN0YXRlLnggLyBzY2FsZSAtIHRyYW5zbGF0ZS54OworCXZhciB5ID0gc3RhdGUueSAvIHNjYWxlIC0gdHJhbnNsYXRlLnk7CisKKwlyZXR1cm4gbmV3IG14UG9pbnQoKG9yaWdpbi54IC0geCkgKiBzY2FsZSwgKG9yaWdpbi55IC0geSkgKiBzY2FsZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRPcmlnaW5Gb3JDZWxsCisgKgorICogUmV0dXJucyB0aGUgdG9wLCBsZWZ0IGNvcm5lciBvZiB0aGUgZ2l2ZW4gY2VsbC4gVE9ETzogSW1wcm92ZSBwZXJmb3JtYW5jZQorICogYnkgdXNpbmcgY2FjaGluZyBpbnNpZGUgdGhpcyBtZXRob2QgYXMgdGhlIHJlc3VsdCBwZXIgY2VsbCBuZXZlciBjaGFuZ2VzCisgKiBkdXJpbmcgdGhlIGxpZmVjeWNsZSBvZiB0aGlzIG9iamVjdC4KKyAqLworbXhNb3JwaGluZy5wcm90b3R5cGUuZ2V0T3JpZ2luRm9yQ2VsbCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJdmFyIHJlc3VsdCA9IG51bGw7CisJCisJaWYgKGNlbGwgIT0gbnVsbCkKKwl7CisJCXZhciBwYXJlbnQgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCkuZ2V0UGFyZW50KGNlbGwpOworCQl2YXIgZ2VvID0gdGhpcy5ncmFwaC5nZXRDZWxsR2VvbWV0cnkoY2VsbCk7CisJCXJlc3VsdCA9IHRoaXMuZ2V0T3JpZ2luRm9yQ2VsbChwYXJlbnQpOworCQkKKwkJLy8gVE9ETzogSGFuZGxlIG9mZnNldHMKKwkJaWYgKGdlbyAhPSBudWxsKQorCQl7CisJCQlpZiAoZ2VvLnJlbGF0aXZlKQorCQkJeworCQkJCXZhciBwZ2VvID0gdGhpcy5ncmFwaC5nZXRDZWxsR2VvbWV0cnkocGFyZW50KTsKKwkJCQkKKwkJCQlpZiAocGdlbyAhPSBudWxsKQorCQkJCXsKKwkJCQkJcmVzdWx0LnggKz0gZ2VvLnggKiBwZ2VvLndpZHRoOworCQkJCQlyZXN1bHQueSArPSBnZW8ueSAqIHBnZW8uaGVpZ2h0OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXN1bHQueCArPSBnZW8ueDsKKwkJCQlyZXN1bHQueSArPSBnZW8ueTsKKwkJCX0KKwkJfQorCX0KKwkKKwlpZiAocmVzdWx0ID09IG51bGwpCisJeworCQl2YXIgdCA9IHRoaXMuZ3JhcGgudmlldy5nZXRUcmFuc2xhdGUoKTsKKwkJcmVzdWx0ID0gbmV3IG14UG9pbnQoLXQueCwgLXQueSk7CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhNb3VzZUV2ZW50LmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhNb3VzZUV2ZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NWJhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teE1vdXNlRXZlbnQuanMKQEAgLTAsMCArMSwyNDQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14TW91c2VFdmVudAorICogCisgKiBCYXNlIGNsYXNzIGZvciBhbGwgbW91c2UgZXZlbnRzIGluIG14R3JhcGguIEEgbGlzdGVuZXIgZm9yIHRoaXMgZXZlbnQgc2hvdWxkCisgKiBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorICogCisgKiAoY29kZSkKKyAqIGdyYXBoLmFkZE1vdXNlTGlzdGVuZXIoCisgKiB7CisgKiAgIG1vdXNlRG93bjogZnVuY3Rpb24oc2VuZGVyLCBldnQpCisgKiAgIHsKKyAqICAgICBteExvZy5kZWJ1ZygnbW91c2VEb3duJyk7CisgKiAgIH0sCisgKiAgIG1vdXNlTW92ZTogZnVuY3Rpb24oc2VuZGVyLCBldnQpCisgKiAgIHsKKyAqICAgICBteExvZy5kZWJ1ZygnbW91c2VNb3ZlJyk7CisgKiAgIH0sCisgKiAgIG1vdXNlVXA6IGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorICogICB7CisgKiAgICAgbXhMb2cuZGVidWcoJ21vdXNlVXAnKTsKKyAqICAgfQorICogfSk7CisgKiAoZW5kKQorICogCisgKiBDb25zdHJ1Y3RvcjogbXhNb3VzZUV2ZW50CisgKgorICogQ29uc3RydWN0cyBhIG5ldyBldmVudCBvYmplY3QgZm9yIHRoZSBnaXZlbiBhcmd1bWVudHMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGV2dCAtIE5hdGl2ZSBtb3VzZSBldmVudC4KKyAqIHN0YXRlIC0gT3B0aW9uYWwgPG14Q2VsbFN0YXRlPiB1bmRlciB0aGUgbW91c2UuCisgKiAKKyAqLworZnVuY3Rpb24gbXhNb3VzZUV2ZW50KGV2dCwgc3RhdGUpCit7CisJdGhpcy5ldnQgPSBldnQ7CisJdGhpcy5zdGF0ZSA9IHN0YXRlOworCXRoaXMuc291cmNlU3RhdGUgPSBzdGF0ZTsKK307CisKKy8qKgorICogVmFyaWFibGU6IGNvbnN1bWVkCisgKgorICogSG9sZHMgdGhlIGNvbnN1bWVkIHN0YXRlIG9mIHRoaXMgZXZlbnQuCisgKi8KK214TW91c2VFdmVudC5wcm90b3R5cGUuY29uc3VtZWQgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogZXZ0CisgKgorICogSG9sZHMgdGhlIGlubmVyIGV2ZW50IG9iamVjdC4KKyAqLworbXhNb3VzZUV2ZW50LnByb3RvdHlwZS5ldnQgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBncmFwaFgKKyAqCisgKiBIb2xkcyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBldmVudCBpbiB0aGUgZ3JhcGguIFRoaXMgdmFsdWUgaXMgc2V0IGluCisgKiA8bXhHcmFwaC5maXJlTW91c2VFdmVudD4uCisgKi8KK214TW91c2VFdmVudC5wcm90b3R5cGUuZ3JhcGhYID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogZ3JhcGhZCisgKgorICogSG9sZHMgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgZXZlbnQgaW4gdGhlIGdyYXBoLiBUaGlzIHZhbHVlIGlzIHNldCBpbgorICogPG14R3JhcGguZmlyZU1vdXNlRXZlbnQ+LgorICovCitteE1vdXNlRXZlbnQucHJvdG90eXBlLmdyYXBoWSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHN0YXRlCisgKgorICogSG9sZHMgdGhlIG9wdGlvbmFsIDxteENlbGxTdGF0ZT4gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQuCisgKi8KK214TW91c2VFdmVudC5wcm90b3R5cGUuc3RhdGUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzb3VyY2VTdGF0ZQorICogCisgKiBIb2xkcyB0aGUgPG14Q2VsbFN0YXRlPiB0aGF0IHdhcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLiBUaGlzIGNhbiBiZQorICogZGlmZmVyZW50IGZyb20gPHN0YXRlPiBkZXBlbmRpbmcgb24gdGhlIHJlc3VsdCBvZiA8bXhHcmFwaC5nZXRFdmVudFN0YXRlPi4KKyAqLworbXhNb3VzZUV2ZW50LnByb3RvdHlwZS5zb3VyY2VTdGF0ZSA9IG51bGw7CisKKy8qKgorICogRnVuY3Rpb246IGdldEV2ZW50CisgKiAKKyAqIFJldHVybnMgPGV2dD4uCisgKi8KK214TW91c2VFdmVudC5wcm90b3R5cGUuZ2V0RXZlbnQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuZXZ0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0U291cmNlCisgKiAKKyAqIFJldHVybnMgdGhlIHRhcmdldCBET00gZWxlbWVudCB1c2luZyA8bXhFdmVudC5nZXRTb3VyY2U+IGZvciA8ZXZ0Pi4KKyAqLworbXhNb3VzZUV2ZW50LnByb3RvdHlwZS5nZXRTb3VyY2UgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIG14RXZlbnQuZ2V0U291cmNlKHRoaXMuZXZ0KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzU291cmNlCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gPG14U2hhcGU+IGlzIHRoZSBzb3VyY2Ugb2YgPGV2dD4uCisgKi8KK214TW91c2VFdmVudC5wcm90b3R5cGUuaXNTb3VyY2UgPSBmdW5jdGlvbihzaGFwZSkKK3sKKwlpZiAoc2hhcGUgIT0gbnVsbCkKKwl7CisJCXJldHVybiBteFV0aWxzLmlzQW5jZXN0b3JOb2RlKHNoYXBlLm5vZGUsIHRoaXMuZ2V0U291cmNlKCkpOworCX0KKwkKKwlyZXR1cm4gZmFsc2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRYCisgKiAKKyAqIFJldHVybnMgPGV2dC5jbGllbnRYPi4KKyAqLworbXhNb3VzZUV2ZW50LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24oKQoreworCXJldHVybiBteEV2ZW50LmdldENsaWVudFgodGhpcy5nZXRFdmVudCgpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFkKKyAqIAorICogUmV0dXJucyA8ZXZ0LmNsaWVudFk+LgorICovCitteE1vdXNlRXZlbnQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIG14RXZlbnQuZ2V0Q2xpZW50WSh0aGlzLmdldEV2ZW50KCkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0R3JhcGhYCisgKiAKKyAqIFJldHVybnMgPGdyYXBoWD4uCisgKi8KK214TW91c2VFdmVudC5wcm90b3R5cGUuZ2V0R3JhcGhYID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmdyYXBoWDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEdyYXBoWQorICogCisgKiBSZXR1cm5zIDxncmFwaFk+LgorICovCitteE1vdXNlRXZlbnQucHJvdG90eXBlLmdldEdyYXBoWSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5ncmFwaFk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTdGF0ZQorICogCisgKiBSZXR1cm5zIDxzdGF0ZT4uCisgKi8KK214TW91c2VFdmVudC5wcm90b3R5cGUuZ2V0U3RhdGUgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuc3RhdGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDZWxsCisgKiAKKyAqIFJldHVybnMgdGhlIDxteENlbGw+IGluIDxzdGF0ZT4gaXMgbm90IG51bGwuCisgKi8KK214TW91c2VFdmVudC5wcm90b3R5cGUuZ2V0Q2VsbCA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7CisJCisJaWYgKHN0YXRlICE9IG51bGwpCisJeworCQlyZXR1cm4gc3RhdGUuY2VsbDsKKwl9CisJCisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1BvcHVwVHJpZ2dlcgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXZlbnQgaXMgYSBwb3B1cCB0cmlnZ2VyLgorICovCitteE1vdXNlRXZlbnQucHJvdG90eXBlLmlzUG9wdXBUcmlnZ2VyID0gZnVuY3Rpb24oKQoreworCXJldHVybiBteEV2ZW50LmlzUG9wdXBUcmlnZ2VyKHRoaXMuZ2V0RXZlbnQoKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NvbnN1bWVkCisgKgorICogUmV0dXJucyA8Y29uc3VtZWQ+LgorICovCitteE1vdXNlRXZlbnQucHJvdG90eXBlLmlzQ29uc3VtZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuY29uc3VtZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjb25zdW1lCisgKgorICogU2V0cyA8Y29uc3VtZWQ+IHRvIHRydWUgYW5kIGludm9rZXMgcHJldmVudERlZmF1bHQgb24gdGhlIG5hdGl2ZSBldmVudAorICogaWYgc3VjaCBhIG1ldGhvZCBpcyBkZWZpbmVkLiBUaGlzIGlzIHVzZWQgbWFpbmx5IHRvIGF2b2lkIHRoZSBjdXJzb3IgZnJvbQorICogYmVpbmcgY2hhbmdlZCB0byBhIHRleHQgY3Vyc29yIGluIFdlYmtpdC4gWW91IGNhbiB1c2UgdGhlIHByZXZlbnREZWZhdWx0CisgKiBmbGFnIHRvIGRpc2FibGUgdGhpcyBmdW5jdGlvbmFsaXR5LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwcmV2ZW50RGVmYXVsdCAtIFNwZWNpZmllcyBpZiB0aGUgbmF0aXZlIGV2ZW50IHNob3VsZCBiZSBjYW5jZWxlZC4gRGVmYXVsdAorICogaXMgdHJ1ZS4KKyAqLworbXhNb3VzZUV2ZW50LnByb3RvdHlwZS5jb25zdW1lID0gZnVuY3Rpb24ocHJldmVudERlZmF1bHQpCit7CisJcHJldmVudERlZmF1bHQgPSAocHJldmVudERlZmF1bHQgIT0gbnVsbCkgPyBwcmV2ZW50RGVmYXVsdCA6IHRydWU7CisJCisJaWYgKHByZXZlbnREZWZhdWx0ICYmIHRoaXMuZXZ0LnByZXZlbnREZWZhdWx0KQorCXsKKwkJdGhpcy5ldnQucHJldmVudERlZmF1bHQoKTsKKwl9CisKKwkvLyBXb3JrYXJvdW5kIGZvciBpbWFnZXMgYmVpbmcgZHJhZ2dlZCBpbiBJRQorCS8vIERvZXMgbm90IGNoYW5nZSByZXR1cm5WYWx1ZSBpbiBPcGVyYQorCWlmIChteENsaWVudC5JU19JRSkKKwl7CisJCXRoaXMuZXZ0LnJldHVyblZhbHVlID0gdHJ1ZTsKKwl9CisKKwkvLyBTZXRzIGxvY2FsIGNvbnN1bWVkIHN0YXRlCisJdGhpcy5jb25zdW1lZCA9IHRydWU7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhPYmplY3RJZGVudGl0eS5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214T2JqZWN0SWRlbnRpdHkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3ZWVlOAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214T2JqZWN0SWRlbnRpdHkuanMKQEAgLTAsMCArMSw3MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLwordmFyIG14T2JqZWN0SWRlbnRpdHkgPQoreworCS8qKgorCSAqIENsYXNzOiBteE9iamVjdElkZW50aXR5CisJICogCisJICogSWRlbnRpdHkgZm9yIEphdmFTY3JpcHQgb2JqZWN0cyBhbmQgZnVuY3Rpb25zLiBUaGlzIGlzIGltcGxlbWVudGVkIHVzaW5nCisJICogYSBzaW1wbGUgaW5jcmVtZW50aW5nIGNvdW50ZXIgd2hpY2ggaXMgc3RvcmVkIGluIGVhY2ggb2JqZWN0IHVuZGVyCisJICogPEZJRUxEX05BTUU+LgorCSAqIAorCSAqIFRoZSBpZGVudGl0eSBmb3IgYW4gb2JqZWN0IGRvZXMgbm90IGNoYW5nZSBkdXJpbmcgaXRzIGxpZmVjeWNsZS4KKwkgKiAKKwkgKiBWYXJpYWJsZTogRklFTERfTkFNRQorCSAqIAorCSAqIE5hbWUgb2YgdGhlIGZpZWxkIHRvIGJlIHVzZWQgdG8gc3RvcmUgdGhlIG9iamVjdCBJRC4gRGVmYXVsdCBpcworCSAqIDxjb2RlPm14T2JqZWN0SWQ8L2NvZGU+LgorCSAqLworCUZJRUxEX05BTUU6ICdteE9iamVjdElkJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBjb3VudGVyCisJICogCisJICogQ3VycmVudCBjb3VudGVyLgorCSAqLworCWNvdW50ZXI6IDAsCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0CisJICogCisJICogUmV0dXJucyB0aGUgSUQgZm9yIHRoZSBnaXZlbiBvYmplY3Qgb3IgZnVuY3Rpb24gb3IgbnVsbCBpZiBubyBvYmplY3QKKwkgKiBpcyBzcGVjaWZpZWQuCisJICovCisJZ2V0OiBmdW5jdGlvbihvYmopCisJeworCQlpZiAob2JqICE9IG51bGwpCisJCXsKKwkJCWlmIChvYmpbbXhPYmplY3RJZGVudGl0eS5GSUVMRF9OQU1FXSA9PSBudWxsKQorCQkJeworCQkJCWlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JykKKwkJCQl7CisJCQkJCXZhciBjdG9yID0gbXhVdGlscy5nZXRGdW5jdGlvbk5hbWUob2JqLmNvbnN0cnVjdG9yKTsKKwkJCQkJb2JqW214T2JqZWN0SWRlbnRpdHkuRklFTERfTkFNRV0gPSBjdG9yICsgJyMnICsgbXhPYmplY3RJZGVudGl0eS5jb3VudGVyKys7CisJCQkJfQorCQkJCWVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpCisJCQkJeworCQkJCQlvYmpbbXhPYmplY3RJZGVudGl0eS5GSUVMRF9OQU1FXSA9ICdGdW5jdGlvbiMnICsgbXhPYmplY3RJZGVudGl0eS5jb3VudGVyKys7CisJCQkJfQorCQkJfQorCQkJCisJCQlyZXR1cm4gb2JqW214T2JqZWN0SWRlbnRpdHkuRklFTERfTkFNRV07CisJCX0KKwkJCisJCXJldHVybiBudWxsOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogY2xlYXIKKwkgKiAKKwkgKiBEZWxldGVzIHRoZSBJRCBmcm9tIHRoZSBnaXZlbiBvYmplY3Qgb3IgZnVuY3Rpb24uCisJICovCisJY2xlYXI6IGZ1bmN0aW9uKG9iaikKKwl7CisJCWlmICh0eXBlb2Yob2JqKSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykKKwkJeworCQkJZGVsZXRlIG9ialtteE9iamVjdElkZW50aXR5LkZJRUxEX05BTUVdOworCQl9CisJfQorCit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhQYW5uaW5nTWFuYWdlci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214UGFubmluZ01hbmFnZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzZjgxNQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214UGFubmluZ01hbmFnZXIuanMKQEAgLTAsMCArMSwyNjIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14UGFubmluZ01hbmFnZXIKKyAqCisgKiBJbXBsZW1lbnRzIGEgaGFuZGxlciBmb3IgcGFubmluZy4KKyAqLworZnVuY3Rpb24gbXhQYW5uaW5nTWFuYWdlcihncmFwaCkKK3sKKwl0aGlzLnRocmVhZCA9IG51bGw7CisJdGhpcy5hY3RpdmUgPSBmYWxzZTsKKwl0aGlzLnRkeCA9IDA7CisJdGhpcy50ZHkgPSAwOworCXRoaXMudDB4ID0gMDsKKwl0aGlzLnQweSA9IDA7CisJdGhpcy5keCA9IDA7CisJdGhpcy5keSA9IDA7CisJdGhpcy5zY3JvbGxiYXJzID0gZmFsc2U7CisJdGhpcy5zY3JvbGxMZWZ0ID0gMDsKKwl0aGlzLnNjcm9sbFRvcCA9IDA7CisJCisJdGhpcy5tb3VzZUxpc3RlbmVyID0KKwl7CisJICAgIG1vdXNlRG93bjogZnVuY3Rpb24oc2VuZGVyLCBtZSkgeyB9LAorCSAgICBtb3VzZU1vdmU6IGZ1bmN0aW9uKHNlbmRlciwgbWUpIHsgfSwKKwkgICAgbW91c2VVcDogbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKHNlbmRlciwgbWUpCisJICAgIHsKKwkgICAgCWlmICh0aGlzLmFjdGl2ZSkKKwkgICAgCXsKKwkgICAgCQl0aGlzLnN0b3AoKTsKKwkgICAgCX0KKwkgICAgfSkKKwl9OworCQorCWdyYXBoLmFkZE1vdXNlTGlzdGVuZXIodGhpcy5tb3VzZUxpc3RlbmVyKTsKKwkKKwkvLyBTdG9wcyBzY3JvbGxpbmcgb24gZXZlcnkgbW91c2V1cCBhbnl3aGVyZSBpbiB0aGUgZG9jdW1lbnQKKwlteEV2ZW50LmFkZExpc3RlbmVyKGRvY3VtZW50LCAnbW91c2V1cCcsIG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbigpCisJeworICAgIAlpZiAodGhpcy5hY3RpdmUpCisgICAgCXsKKyAgICAJCXRoaXMuc3RvcCgpOworICAgIAl9CisJfSkpOworCQorCXZhciBjcmVhdGVUaHJlYWQgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCXsKKyAgICAJdGhpcy5zY3JvbGxiYXJzID0gbXhVdGlscy5oYXNTY3JvbGxiYXJzKGdyYXBoLmNvbnRhaW5lcik7CisgICAgCXRoaXMuc2Nyb2xsTGVmdCA9IGdyYXBoLmNvbnRhaW5lci5zY3JvbGxMZWZ0OworICAgIAl0aGlzLnNjcm9sbFRvcCA9IGdyYXBoLmNvbnRhaW5lci5zY3JvbGxUb3A7CisKKyAgICAJcmV0dXJuIHdpbmRvdy5zZXRJbnRlcnZhbChteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCQl7CisJCQl0aGlzLnRkeCAtPSB0aGlzLmR4OworCQkJdGhpcy50ZHkgLT0gdGhpcy5keTsKKworCQkJaWYgKHRoaXMuc2Nyb2xsYmFycykKKwkJCXsKKwkJCQl2YXIgbGVmdCA9IC1ncmFwaC5jb250YWluZXIuc2Nyb2xsTGVmdCAtIE1hdGguY2VpbCh0aGlzLmR4KTsKKwkJCQl2YXIgdG9wID0gLWdyYXBoLmNvbnRhaW5lci5zY3JvbGxUb3AgLSBNYXRoLmNlaWwodGhpcy5keSk7CisJCQkJZ3JhcGgucGFuR3JhcGgobGVmdCwgdG9wKTsKKwkJCQlncmFwaC5wYW5EeCA9IHRoaXMuc2Nyb2xsTGVmdCAtIGdyYXBoLmNvbnRhaW5lci5zY3JvbGxMZWZ0OworCQkJCWdyYXBoLnBhbkR5ID0gdGhpcy5zY3JvbGxUb3AgLSBncmFwaC5jb250YWluZXIuc2Nyb2xsVG9wOworCQkJCWdyYXBoLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LlBBTikpOworCQkJCS8vIFRPRE86IEltcGxlbWVudCBncmFwaC5hdXRvRXh0ZW5kCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZ3JhcGgucGFuR3JhcGgodGhpcy5nZXREeCgpLCB0aGlzLmdldER5KCkpOworCQkJfQorCQl9KSwgdGhpcy5kZWxheSk7CisJfSk7CisJCisJdGhpcy5pc0FjdGl2ZSA9IGZ1bmN0aW9uKCkKKwl7CisJCXJldHVybiBhY3RpdmU7CisJfTsKKwkKKwl0aGlzLmdldER4ID0gZnVuY3Rpb24oKQorCXsKKwkJcmV0dXJuIE1hdGgucm91bmQodGhpcy50ZHgpOworCX07CisJCisJdGhpcy5nZXREeSA9IGZ1bmN0aW9uKCkKKwl7CisJCXJldHVybiBNYXRoLnJvdW5kKHRoaXMudGR5KTsKKwl9OworCQorCXRoaXMuc3RhcnQgPSBmdW5jdGlvbigpCisJeworCQl0aGlzLnQweCA9IGdyYXBoLnZpZXcudHJhbnNsYXRlLng7CisJCXRoaXMudDB5ID0gZ3JhcGgudmlldy50cmFuc2xhdGUueTsKKwkJdGhpcy5hY3RpdmUgPSB0cnVlOworCX07CisJCisJdGhpcy5wYW5UbyA9IGZ1bmN0aW9uKHgsIHksIHcsIGgpCisJeworCQlpZiAoIXRoaXMuYWN0aXZlKQorCQl7CisJCQl0aGlzLnN0YXJ0KCk7CisJCX0KKwkJCisgICAgCXRoaXMuc2Nyb2xsTGVmdCA9IGdyYXBoLmNvbnRhaW5lci5zY3JvbGxMZWZ0OworICAgIAl0aGlzLnNjcm9sbFRvcCA9IGdyYXBoLmNvbnRhaW5lci5zY3JvbGxUb3A7CisJCQorCQl3ID0gKHcgIT0gbnVsbCkgPyB3IDogMDsKKwkJaCA9IChoICE9IG51bGwpID8gaCA6IDA7CisJCQorCQl2YXIgYyA9IGdyYXBoLmNvbnRhaW5lcjsKKwkJdGhpcy5keCA9IHggKyB3IC0gYy5zY3JvbGxMZWZ0IC0gYy5jbGllbnRXaWR0aDsKKwkJCisJCWlmICh0aGlzLmR4IDwgMCAmJiBNYXRoLmFicyh0aGlzLmR4KSA8IHRoaXMuYm9yZGVyKQorCQl7CisJCQl0aGlzLmR4ID0gdGhpcy5ib3JkZXIgKyB0aGlzLmR4OworCQl9CisJCWVsc2UgaWYgKHRoaXMuaGFuZGxlTW91c2VPdXQpCisJCXsKKwkJCXRoaXMuZHggPSBNYXRoLm1heCh0aGlzLmR4LCAwKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRoaXMuZHggPSAwOworCQl9CisJCQorCQlpZiAodGhpcy5keCA9PSAwKQorCQl7CisJCQl0aGlzLmR4ID0geCAtIGMuc2Nyb2xsTGVmdDsKKwkJCQorCQkJaWYgKHRoaXMuZHggPiAwICYmIHRoaXMuZHggPCB0aGlzLmJvcmRlcikKKwkJCXsKKwkJCQl0aGlzLmR4ID0gdGhpcy5keCAtIHRoaXMuYm9yZGVyOworCQkJfQorCQkJZWxzZSBpZiAodGhpcy5oYW5kbGVNb3VzZU91dCkKKwkJCXsKKwkJCQl0aGlzLmR4ID0gTWF0aC5taW4oMCwgdGhpcy5keCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdGhpcy5keCA9IDA7CisJCQl9CisJCX0KKwkJCisJCXRoaXMuZHkgPSB5ICsgaCAtIGMuc2Nyb2xsVG9wIC0gYy5jbGllbnRIZWlnaHQ7CisKKwkJaWYgKHRoaXMuZHkgPCAwICYmIE1hdGguYWJzKHRoaXMuZHkpIDwgdGhpcy5ib3JkZXIpCisJCXsKKwkJCXRoaXMuZHkgPSB0aGlzLmJvcmRlciArIHRoaXMuZHk7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5oYW5kbGVNb3VzZU91dCkKKwkJeworCQkJdGhpcy5keSA9IE1hdGgubWF4KHRoaXMuZHksIDApOworCQl9CisJCWVsc2UKKwkJeworCQkJdGhpcy5keSA9IDA7CisJCX0KKwkJCisJCWlmICh0aGlzLmR5ID09IDApCisJCXsKKwkJCXRoaXMuZHkgPSB5IC0gYy5zY3JvbGxUb3A7CisJCQkKKwkJCWlmICh0aGlzLmR5ID4gMCAmJiB0aGlzLmR5IDwgdGhpcy5ib3JkZXIpCisJCQl7CisJCQkJdGhpcy5keSA9IHRoaXMuZHkgLSB0aGlzLmJvcmRlcjsKKwkJCX0KKwkJCWVsc2UgaWYgKHRoaXMuaGFuZGxlTW91c2VPdXQpCisJCQl7CisJCQkJdGhpcy5keSA9IE1hdGgubWluKDAsIHRoaXMuZHkpOworCQkJfSAKKwkJCWVsc2UKKwkJCXsKKwkJCQl0aGlzLmR5ID0gMDsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKHRoaXMuZHggIT0gMCB8fCB0aGlzLmR5ICE9IDApCisJCXsKKwkJCXRoaXMuZHggKj0gdGhpcy5kYW1wZXI7CisJCQl0aGlzLmR5ICo9IHRoaXMuZGFtcGVyOworCQkJCisJCQlpZiAodGhpcy50aHJlYWQgPT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLnRocmVhZCA9IGNyZWF0ZVRocmVhZCgpOworCQkJfQorCQl9CisJCWVsc2UgaWYgKHRoaXMudGhyZWFkICE9IG51bGwpCisJCXsKKwkJCXdpbmRvdy5jbGVhckludGVydmFsKHRoaXMudGhyZWFkKTsKKwkJCXRoaXMudGhyZWFkID0gbnVsbDsKKwkJfQorCX07CisJCisJdGhpcy5zdG9wID0gZnVuY3Rpb24oKQorCXsKKwkJaWYgKHRoaXMuYWN0aXZlKQorCQl7CisJCQl0aGlzLmFjdGl2ZSA9IGZhbHNlOworCQkKKwkJCWlmICh0aGlzLnRocmVhZCAhPSBudWxsKQorCSAgICAJeworCQkJCXdpbmRvdy5jbGVhckludGVydmFsKHRoaXMudGhyZWFkKTsKKwkJCQl0aGlzLnRocmVhZCA9IG51bGw7CisJICAgIAl9CisJCQkKKwkJCXRoaXMudGR4ID0gMDsKKwkJCXRoaXMudGR5ID0gMDsKKwkJCQorCQkJaWYgKCF0aGlzLnNjcm9sbGJhcnMpCisJCQl7CisJCQkJdmFyIHB4ID0gZ3JhcGgucGFuRHg7CisJCQkJdmFyIHB5ID0gZ3JhcGgucGFuRHk7CisJCSAgICAJCisJCSAgICAJaWYgKHB4ICE9IDAgfHwgcHkgIT0gMCkKKwkJICAgIAl7CisJCSAgICAJCWdyYXBoLnBhbkdyYXBoKDAsIDApOworCQkJICAgIAlncmFwaC52aWV3LnNldFRyYW5zbGF0ZSh0aGlzLnQweCArIHB4IC8gZ3JhcGgudmlldy5zY2FsZSwgdGhpcy50MHkgKyBweSAvIGdyYXBoLnZpZXcuc2NhbGUpOworCQkgICAgCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlncmFwaC5wYW5EeCA9IDA7CisJCQkJZ3JhcGgucGFuRHkgPSAwOworCQkJCWdyYXBoLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LlBBTikpOworCQkJfQorCQl9CisJfTsKKwkKKwl0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbigpCisJeworCQlncmFwaC5yZW1vdmVNb3VzZUxpc3RlbmVyKHRoaXMubW91c2VMaXN0ZW5lcik7CisJfTsKK307CisKKy8qKgorICogVmFyaWFibGU6IGRhbXBlcgorICogCisgKiBEYW1wZXIgdmFsdWUgZm9yIHRoZSBwYW5uaW5nLiBEZWZhdWx0IGlzIDEvNi4KKyAqLworbXhQYW5uaW5nTWFuYWdlci5wcm90b3R5cGUuZGFtcGVyID0gMS82OworCisvKioKKyAqIFZhcmlhYmxlOiBkZWxheQorICogCisgKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBwYW5uaW5nLiBEZWZhdWx0IGlzIDEwLgorICovCitteFBhbm5pbmdNYW5hZ2VyLnByb3RvdHlwZS5kZWxheSA9IDEwOworCisvKioKKyAqIFZhcmlhYmxlOiBoYW5kbGVNb3VzZU91dAorICogCisgKiBTcGVjaWZpZXMgaWYgbW91c2UgZXZlbnRzIG91dHNpZGUgb2YgdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgaGFuZGxlZC4gRGVmYXVsdCBpcyB0cnVlLiAKKyAqLworbXhQYW5uaW5nTWFuYWdlci5wcm90b3R5cGUuaGFuZGxlTW91c2VPdXQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBib3JkZXIKKyAqIAorICogQm9yZGVyIHRvIGhhbmRsZSBhdXRvbWF0aWMgcGFubmluZyBpbnNpZGUgdGhlIGNvbXBvbmVudC4gRGVmYXVsdCBpcyAwIChkaXNhYmxlZCkuCisgKi8KK214UGFubmluZ01hbmFnZXIucHJvdG90eXBlLmJvcmRlciA9IDA7CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teFBvaW50LmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhQb2ludC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2QzMDBhCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhQb2ludC5qcwpAQCAtMCwwICsxLDU0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFBvaW50CisgKgorICogSW1wbGVtZW50cyBhIDItZGltZW5zaW9uYWwgdmVjdG9yIHdpdGggZG91YmxlIHByZWNpc2lvbiBjb29yZGluYXRlcy4KKyAqIAorICogQ29uc3RydWN0b3I6IG14UG9pbnQKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IHBvaW50IGZvciB0aGUgb3B0aW9uYWwgeCBhbmQgeSBjb29yZGluYXRlcy4gSWYgbm8KKyAqIGNvb3JkaW5hdGVzIGFyZSBnaXZlbiwgdGhlbiB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIDx4PiBhbmQgPHk+IGFyZSB1c2VkLgorICovCitmdW5jdGlvbiBteFBvaW50KHgsIHkpCit7CisJdGhpcy54ID0gKHggIT0gbnVsbCkgPyB4IDogMDsKKwl0aGlzLnkgPSAoeSAhPSBudWxsKSA/IHkgOiAwOworfTsKKworLyoqCisgKiBWYXJpYWJsZTogeAorICoKKyAqIEhvbGRzIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LiBEZWZhdWx0IGlzIDAuCisgKi8KK214UG9pbnQucHJvdG90eXBlLnggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB5CisgKgorICogSG9sZHMgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuIERlZmF1bHQgaXMgMC4KKyAqLworbXhQb2ludC5wcm90b3R5cGUueSA9IG51bGw7CisKKy8qKgorICogRnVuY3Rpb246IGVxdWFscworICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG9iamVjdCBlcXVhbHMgdGhpcyBwb2ludC4KKyAqLworbXhQb2ludC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24ob2JqKQoreworCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmoueCA9PSB0aGlzLnggJiYgb2JqLnkgPT0gdGhpcy55OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY2xvbmUKKyAqCisgKiBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyA8bXhQb2ludD4uCisgKi8KK214UG9pbnQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKQoreworCS8vIEhhbmRsZXMgc3ViY2xhc3NlcyBhcyB3ZWxsCisJcmV0dXJuIG14VXRpbHMuY2xvbmUodGhpcyk7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhQb3B1cE1lbnUuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teFBvcHVwTWVudS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjc3N2EyCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhQb3B1cE1lbnUuanMKQEAgLTAsMCArMSw2MTMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14UG9wdXBNZW51CisgKiAKKyAqIEJhc2ljIHBvcHVwIG1lbnUuIFRvIGFkZCBhIHZlcnRpY2FsIHNjcm9sbGJhciB0byBhIGdpdmVuIHN1Ym1lbnUsIHRoZQorICogZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQuCisgKiAKKyAqIChjb2RlKQorICogdmFyIG14UG9wdXBNZW51U2hvd01lbnUgPSBteFBvcHVwTWVudS5wcm90b3R5cGUuc2hvd01lbnU7CisgKiBteFBvcHVwTWVudS5wcm90b3R5cGUuc2hvd01lbnUgPSBmdW5jdGlvbigpCisgKiB7CisgKiAgIG14UG9wdXBNZW51U2hvd01lbnUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAqICAgCisgKiAgIHRoaXMuZGl2LnN0eWxlLm92ZXJmbG93WSA9ICdhdXRvJzsKKyAqICAgdGhpcy5kaXYuc3R5bGUub3ZlcmZsb3dYID0gJ2hpZGRlbic7CisgKiAgIHRoaXMuZGl2LnN0eWxlLm1heEhlaWdodCA9ICcxNjBweCc7CisgKiB9OworICogKGVuZCkKKyAqIAorICogQ29uc3RydWN0b3I6IG14UG9wdXBNZW51CisgKiAKKyAqIENvbnN0cnVjdHMgYSBwb3B1cG1lbnUuCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LlNIT1cKKyAqCisgKiBGaXJlcyBhZnRlciB0aGUgbWVudSBoYXMgYmVlbiBzaG93biBpbiA8cG9wdXA+LgorICovCitmdW5jdGlvbiBteFBvcHVwTWVudShmYWN0b3J5TWV0aG9kKQoreworCXRoaXMuZmFjdG9yeU1ldGhvZCA9IGZhY3RvcnlNZXRob2Q7CisJCisJaWYgKGZhY3RvcnlNZXRob2QgIT0gbnVsbCkKKwl7CisJCXRoaXMuaW5pdCgpOworCX0KK307CisKKy8qKgorICogRXh0ZW5kcyBteEV2ZW50U291cmNlLgorICovCitteFBvcHVwTWVudS5wcm90b3R5cGUgPSBuZXcgbXhFdmVudFNvdXJjZSgpOworbXhQb3B1cE1lbnUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhQb3B1cE1lbnU7CisKKy8qKgorICogVmFyaWFibGU6IHN1Ym1lbnVJbWFnZQorICogCisgKiBVUkwgb2YgdGhlIGltYWdlIHRvIGJlIHVzZWQgZm9yIHRoZSBzdWJtZW51IGljb24uCisgKi8KK214UG9wdXBNZW51LnByb3RvdHlwZS5zdWJtZW51SW1hZ2UgPSBteENsaWVudC5pbWFnZUJhc2VQYXRoICsgJy9zdWJtZW51LmdpZic7CisKKy8qKgorICogVmFyaWFibGU6IHpJbmRleAorICogCisgKiBTcGVjaWZpZXMgdGhlIHpJbmRleCBmb3IgdGhlIHBvcHVwbWVudSBhbmQgaXRzIHNoYWRvdy4gRGVmYXVsdCBpcyAxMDA2LgorICovCitteFBvcHVwTWVudS5wcm90b3R5cGUuekluZGV4ID0gMTAwMDY7CisKKy8qKgorICogVmFyaWFibGU6IGZhY3RvcnlNZXRob2QKKyAqIAorICogRnVuY3Rpb24gdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcG9wdXAgbWVudS4gVGhlIGZ1bmN0aW9uIHRha2VzIHRoZQorICogY3VycmVudCBwYW5uaW5nIGhhbmRsZXIsIHRoZSA8bXhDZWxsPiB1bmRlciB0aGUgbW91c2UgYW5kIHRoZSBtb3VzZQorICogZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIGNhbGwgYXMgYXJndW1lbnRzLgorICovCitteFBvcHVwTWVudS5wcm90b3R5cGUuZmFjdG9yeU1ldGhvZCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHVzZUxlZnRCdXR0b25Gb3JQb3B1cAorICogCisgKiBTcGVjaWZpZXMgaWYgcG9wdXBtZW51cyBzaG91bGQgYmUgYWN0aXZhdGVkIGJ5IGNsaWNraW5nIHRoZSBsZWZ0IG1vdXNlCisgKiBidXR0b24uIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214UG9wdXBNZW51LnByb3RvdHlwZS51c2VMZWZ0QnV0dG9uRm9yUG9wdXAgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogZW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgZXZlbnRzIGFyZSBoYW5kbGVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214UG9wdXBNZW51LnByb3RvdHlwZS5lbmFibGVkID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogaXRlbUNvdW50CisgKiAKKyAqIENvbnRhaW5zIHRoZSBudW1iZXIgb2YgdGltZXMgPGFkZEl0ZW0+IGhhcyBiZWVuIGNhbGxlZCBmb3IgYSBuZXcgbWVudS4KKyAqLworbXhQb3B1cE1lbnUucHJvdG90eXBlLml0ZW1Db3VudCA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IGF1dG9FeHBhbmQKKyAqIAorICogU3BlY2lmaWVzIGlmIHN1Ym1lbnVzIHNob3VsZCBiZSBleHBhbmRlZCBvbiBtb3VzZW92ZXIuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214UG9wdXBNZW51LnByb3RvdHlwZS5hdXRvRXhwYW5kID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHNtYXJ0U2VwYXJhdG9ycworICogCisgKiBTcGVjaWZpZXMgaWYgc2VwYXJhdG9ycyBzaG91bGQgb25seSBiZSBhZGRlZCBpZiBhIG1lbnUgaXRlbSBmb2xsb3dzIHRoZW0uCisgKiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteFBvcHVwTWVudS5wcm90b3R5cGUuc21hcnRTZXBhcmF0b3JzID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGxhYmVscworICogCisgKiBTcGVjaWZpZXMgaWYgYW55IGxhYmVscyBzaG91bGQgYmUgdmlzaWJsZS4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteFBvcHVwTWVudS5wcm90b3R5cGUubGFiZWxzID0gdHJ1ZTsKKworLyoqCisgKiBGdW5jdGlvbjogaW5pdAorICogCisgKiBJbml0aWFsaXplcyB0aGUgc2hhcGVzIHJlcXVpcmVkIGZvciB0aGlzIHZlcnRleCBoYW5kbGVyLgorICovCitteFBvcHVwTWVudS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKCkKK3sKKwkvLyBBZGRzIHRoZSBpbm5lciB0YWJsZQorCXRoaXMudGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0YWJsZScpOworCXRoaXMudGFibGUuY2xhc3NOYW1lID0gJ214UG9wdXBNZW51JzsKKwkKKwl0aGlzLnRib2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGJvZHknKTsKKwl0aGlzLnRhYmxlLmFwcGVuZENoaWxkKHRoaXMudGJvZHkpOworCisJLy8gQWRkcyB0aGUgb3V0ZXIgZGl2CisJdGhpcy5kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKwl0aGlzLmRpdi5jbGFzc05hbWUgPSAnbXhQb3B1cE1lbnUnOworCXRoaXMuZGl2LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJzsKKwl0aGlzLmRpdi5zdHlsZS56SW5kZXggPSB0aGlzLnpJbmRleDsKKwl0aGlzLmRpdi5hcHBlbmRDaGlsZCh0aGlzLnRhYmxlKTsKKworCS8vIERpc2FibGVzIHRoZSBjb250ZXh0IG1lbnUgb24gdGhlIG91dGVyIGRpdgorCW14RXZlbnQuZGlzYWJsZUNvbnRleHRNZW51KHRoaXMuZGl2KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzRW5hYmxlZAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgZXZlbnRzIGFyZSBoYW5kbGVkLiBUaGlzIGltcGxlbWVudGF0aW9uCisgKiByZXR1cm5zIDxlbmFibGVkPi4KKyAqLworbXhQb3B1cE1lbnUucHJvdG90eXBlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5lbmFibGVkOworfTsKKwkKKy8qKgorICogRnVuY3Rpb246IHNldEVuYWJsZWQKKyAqIAorICogRW5hYmxlcyBvciBkaXNhYmxlcyBldmVudCBoYW5kbGluZy4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICogdXBkYXRlcyA8ZW5hYmxlZD4uCisgKi8KK214UG9wdXBNZW51LnByb3RvdHlwZS5zZXRFbmFibGVkID0gZnVuY3Rpb24oZW5hYmxlZCkKK3sKKwl0aGlzLmVuYWJsZWQgPSBlbmFibGVkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNQb3B1cFRyaWdnZXIKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBldmVudCBpcyBhIHBvcHVwbWVudSB0cmlnZ2VyIGZvciB0aGUgb3B0aW9uYWwKKyAqIGdpdmVuIGNlbGwuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIG1lIC0gPG14TW91c2VFdmVudD4gdGhhdCByZXByZXNlbnRzIHRoZSBtb3VzZSBldmVudC4KKyAqLworbXhQb3B1cE1lbnUucHJvdG90eXBlLmlzUG9wdXBUcmlnZ2VyID0gZnVuY3Rpb24obWUpCit7CisJcmV0dXJuIG1lLmlzUG9wdXBUcmlnZ2VyKCkgfHwgKHRoaXMudXNlTGVmdEJ1dHRvbkZvclBvcHVwICYmIG14RXZlbnQuaXNMZWZ0TW91c2VCdXR0b24obWUuZ2V0RXZlbnQoKSkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYWRkSXRlbQorICogCisgKiBBZGRzIHRoZSBnaXZlbiBpdGVtIHRvIHRoZSBnaXZlbiBwYXJlbnQgaXRlbS4gSWYgbm8gcGFyZW50IGl0ZW0gaXMgc3BlY2lmaWVkCisgKiB0aGVuIHRoZSBpdGVtIGlzIGFkZGVkIHRvIHRoZSB0b3AtbGV2ZWwgbWVudS4gVGhlIHJldHVybiB2YWx1ZSBtYXkgYmUgdXNlZAorICogYXMgdGhlIHBhcmVudCBhcmd1bWVudCwgaWUuIGFzIGEgc3VibWVudSBpdGVtLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB0YWJsZQorICogcm93IHRoYXQgcmVwcmVzZW50cyB0aGUgaXRlbS4KKyAqIAorICogUGFyYW10ZXJzOgorICogCisgKiB0aXRsZSAtIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHRpdGxlIG9mIHRoZSBtZW51IGl0ZW0uCisgKiBpbWFnZSAtIE9wdGlvbmFsIFVSTCBmb3IgdGhlIGltYWdlIGljb24uCisgKiBmdW5jdCAtIEZ1bmN0aW9uIGFzc29jaWF0ZWQgdGhhdCB0YWtlcyBhIG1vdXNldXAgb3IgdG91Y2hlbmQgZXZlbnQuCisgKiBwYXJlbnQgLSBPcHRpb25hbCBpdGVtIHJldHVybmVkIGJ5IDxhZGRJdGVtPi4KKyAqIGljb25DbHMgLSBPcHRpb25hbCBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBDU1MgY2xhc3MgZm9yIHRoZSBpbWFnZSBpY29uLgorICogSWNvbnNDbHMgaXMgaWdub3JlZCBpZiBpbWFnZSBpcyBnaXZlbi4KKyAqIGVuYWJsZWQgLSBPcHRpb25hbCBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGl0ZW0gaXMgZW5hYmxlZC4gRGVmYXVsdCBpcyB0cnVlLgorICogYWN0aXZlIC0gT3B0aW9uYWwgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBtZW51IHNob3VsZCBpbXBsZW1lbnQgYW55IGV2ZW50IGhhbmRsaW5nLgorICogRGVmYXVsdCBpcyB0cnVlLgorICovCitteFBvcHVwTWVudS5wcm90b3R5cGUuYWRkSXRlbSA9IGZ1bmN0aW9uKHRpdGxlLCBpbWFnZSwgZnVuY3QsIHBhcmVudCwgaWNvbkNscywgZW5hYmxlZCwgYWN0aXZlKQoreworCXBhcmVudCA9IHBhcmVudCB8fCB0aGlzOworCXRoaXMuaXRlbUNvdW50Kys7CisJCisJLy8gU21hcnQgc2VwYXJhdG9ycyBvbmx5IGFkZGVkIGlmIGVsZW1lbnQgY29udGFpbnMgaXRlbXMKKwlpZiAocGFyZW50LndpbGxBZGRTZXBhcmF0b3IpCisJeworCQlpZiAocGFyZW50LmNvbnRhaW5zSXRlbXMpCisJCXsKKwkJCXRoaXMuYWRkU2VwYXJhdG9yKHBhcmVudCwgdHJ1ZSk7CisJCX0KKworCQlwYXJlbnQud2lsbEFkZFNlcGFyYXRvciA9IGZhbHNlOworCX0KKworCXBhcmVudC5jb250YWluc0l0ZW1zID0gdHJ1ZTsKKwl2YXIgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOworCXRyLmNsYXNzTmFtZSA9ICdteFBvcHVwTWVudUl0ZW0nOworCXZhciBjb2wxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKKwljb2wxLmNsYXNzTmFtZSA9ICdteFBvcHVwTWVudUljb24nOworCisJLy8gQWRkcyB0aGUgZ2l2ZW4gaW1hZ2UgaW50byB0aGUgZmlyc3QgY29sdW1uCisJaWYgKGltYWdlICE9IG51bGwpCisJeworCQl2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CisJCWltZy5zcmMgPSBpbWFnZTsKKwkJY29sMS5hcHBlbmRDaGlsZChpbWcpOworCX0KKwllbHNlIGlmIChpY29uQ2xzICE9IG51bGwpCisJeworCQl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCWRpdi5jbGFzc05hbWUgPSBpY29uQ2xzOworCQljb2wxLmFwcGVuZENoaWxkKGRpdik7CisJfQorCQorCXRyLmFwcGVuZENoaWxkKGNvbDEpOworCQorCWlmICh0aGlzLmxhYmVscykKKwl7CisJCXZhciBjb2wyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKKwkJY29sMi5jbGFzc05hbWUgPSAnbXhQb3B1cE1lbnVJdGVtJyArCisJCQkoKGVuYWJsZWQgIT0gbnVsbCAmJiAhZW5hYmxlZCkgPyAnIG14RGlzYWJsZWQnIDogJycpOworCQkKKwkJbXhVdGlscy53cml0ZShjb2wyLCB0aXRsZSk7CisJCWNvbDIuYWxpZ24gPSAnbGVmdCc7CisJCXRyLmFwcGVuZENoaWxkKGNvbDIpOworCQorCQl2YXIgY29sMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CisJCWNvbDMuY2xhc3NOYW1lID0gJ214UG9wdXBNZW51SXRlbScgKworCQkJKChlbmFibGVkICE9IG51bGwgJiYgIWVuYWJsZWQpID8gJyBteERpc2FibGVkJyA6ICcnKTsKKwkJY29sMy5zdHlsZS5wYWRkaW5nUmlnaHQgPSAnNnB4JzsKKwkJY29sMy5zdHlsZS50ZXh0QWxpZ24gPSAncmlnaHQnOworCQkKKwkJdHIuYXBwZW5kQ2hpbGQoY29sMyk7CisJCQorCQlpZiAocGFyZW50LmRpdiA9PSBudWxsKQorCQl7CisJCQl0aGlzLmNyZWF0ZVN1Ym1lbnUocGFyZW50KTsKKwkJfQorCX0KKwkKKwlwYXJlbnQudGJvZHkuYXBwZW5kQ2hpbGQodHIpOworCisJaWYgKGFjdGl2ZSAhPSBmYWxzZSAmJiBlbmFibGVkICE9IGZhbHNlKQorCXsKKwkJdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBudWxsOworCQkKKwkJbXhFdmVudC5hZGRHZXN0dXJlTGlzdGVuZXJzKHRyLAorCQkJbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwkJCXsKKwkJCQl0aGlzLmV2ZW50UmVjZWl2ZXIgPSB0cjsKKwkJCQkKKwkJCQlpZiAocGFyZW50LmFjdGl2ZVJvdyAhPSB0ciAmJiBwYXJlbnQuYWN0aXZlUm93ICE9IHBhcmVudCkKKwkJCQl7CisJCQkJCWlmIChwYXJlbnQuYWN0aXZlUm93ICE9IG51bGwgJiYgcGFyZW50LmFjdGl2ZVJvdy5kaXYucGFyZW50Tm9kZSAhPSBudWxsKQorCQkJCQl7CisJCQkJCQl0aGlzLmhpZGVTdWJtZW51KHBhcmVudCk7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmICh0ci5kaXYgIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJdGhpcy5zaG93U3VibWVudShwYXJlbnQsIHRyKTsKKwkJCQkJCXBhcmVudC5hY3RpdmVSb3cgPSB0cjsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQkvLyBXb3JrYXJvdW5kIGZvciBsb3N0IGN1cnJlbnQgc2VsZWN0aW9uIGluIHBhZ2UgYmVjYXVzZSBvZiBmb2N1cyBpbiBJRQorCQkJCWlmIChteENsaWVudC5JU19RVUlSS1MgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09IDgpCisJCQkJeworCQkJCQljdXJyZW50U2VsZWN0aW9uID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7CisJCQkJfQorCQkJCQorCQkJCW14RXZlbnQuY29uc3VtZShldnQpOworCQkJfSksCisJCQlteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQkJeworCQkJCWlmIChwYXJlbnQuYWN0aXZlUm93ICE9IHRyICYmIHBhcmVudC5hY3RpdmVSb3cgIT0gcGFyZW50KQorCQkJCXsKKwkJCQkJaWYgKHBhcmVudC5hY3RpdmVSb3cgIT0gbnVsbCAmJiBwYXJlbnQuYWN0aXZlUm93LmRpdi5wYXJlbnROb2RlICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCXRoaXMuaGlkZVN1Ym1lbnUocGFyZW50KTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKHRoaXMuYXV0b0V4cGFuZCAmJiB0ci5kaXYgIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJdGhpcy5zaG93U3VibWVudShwYXJlbnQsIHRyKTsKKwkJCQkJCXBhcmVudC5hY3RpdmVSb3cgPSB0cjsKKwkJCQkJfQorCQkJCX0KKwkJCisJCQkJLy8gU2V0cyBob3ZlciBzdHlsZSBiZWNhdXNlIFRSIGluIElFIGRvZXNuJ3QgaGF2ZSBob3ZlcgorCQkJCXRyLmNsYXNzTmFtZSA9ICdteFBvcHVwTWVudUl0ZW1Ib3Zlcic7CisJCQl9KSwKKwkJCW14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJCQl7CisJCQkJLy8gRXZlbnRSZWNlaXZlciBhdm9pZHMgY2xpY2tzIG9uIGEgc3VibWVudSBpdGVtCisJCQkJLy8gd2hpY2ggaGFzIGp1c3QgYmVlbiBzaG93biBpbiB0aGUgbW91c2Vkb3duCisJCQkJaWYgKHRoaXMuZXZlbnRSZWNlaXZlciA9PSB0cikKKwkJCQl7CisJCQkJCWlmIChwYXJlbnQuYWN0aXZlUm93ICE9IHRyKQorCQkJCQl7CisJCQkJCQl0aGlzLmhpZGVNZW51KCk7CisJCQkJCX0KKwkJCQkJCisJCQkJCS8vIFdvcmthcm91bmQgZm9yIGxvc3QgY3VycmVudCBzZWxlY3Rpb24gaW4gcGFnZSBiZWNhdXNlIG9mIGZvY3VzIGluIElFCisJCQkJCWlmIChjdXJyZW50U2VsZWN0aW9uICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCS8vIFdvcmthcm91bmQgZm9yICJ1bnNwZWNpZmllZCBlcnJvciIgaW4gSUU4IHN0YW5kYXJkcworCQkJCQkJdHJ5CisJCQkJCQl7CisJCQkJCQkJY3VycmVudFNlbGVjdGlvbi5zZWxlY3QoKTsKKwkJCQkJCX0KKwkJCQkJCWNhdGNoIChlKQorCQkJCQkJeworCQkJCQkJCS8vIGlnbm9yZQorCQkJCQkJfQorCisJCQkJCQljdXJyZW50U2VsZWN0aW9uID0gbnVsbDsKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKGZ1bmN0ICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCWZ1bmN0KGV2dCk7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJdGhpcy5ldmVudFJlY2VpdmVyID0gbnVsbDsKKwkJCQlteEV2ZW50LmNvbnN1bWUoZXZ0KTsKKwkJCX0pCisJCSk7CisJCisJCS8vIFJlc2V0cyBob3ZlciBzdHlsZSBiZWNhdXNlIFRSIGluIElFIGRvZXNuJ3QgaGF2ZSBob3ZlcgorCQlteEV2ZW50LmFkZExpc3RlbmVyKHRyLCAnbW91c2VvdXQnLAorCQkJbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwkJCXsKKwkJCQl0ci5jbGFzc05hbWUgPSAnbXhQb3B1cE1lbnVJdGVtJzsKKwkJCX0pCisJCSk7CisJfQorCQorCXJldHVybiB0cjsKK307CisKKy8qKgorICogQWRkcyBhIGNoZWNrbWFyayB0byB0aGUgZ2l2ZW4gbWVudWl0ZW0uCisgKi8KK214UG9wdXBNZW51LnByb3RvdHlwZS5hZGRDaGVja21hcmsgPSBmdW5jdGlvbihpdGVtLCBpbWcpCit7CisJdmFyIHRkID0gaXRlbS5maXJzdENoaWxkLm5leHRTaWJsaW5nOworCXRkLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICd1cmwoXCcnICsgaW1nICsgJ1wnKSc7CisJdGQuc3R5bGUuYmFja2dyb3VuZFJlcGVhdCA9ICduby1yZXBlYXQnOworCXRkLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9ICcycHggNTAlJzsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVN1Ym1lbnUKKyAqIAorICogQ3JlYXRlcyB0aGUgbm9kZXMgcmVxdWlyZWQgdG8gYWRkIHN1Ym1lbnUgaXRlbXMgaW5zaWRlIHRoZSBnaXZlbiBwYXJlbnQKKyAqIGl0ZW0uIFRoaXMgaXMgY2FsbGVkIGluIDxhZGRJdGVtPiBpZiBhIHBhcmVudCBpdGVtIGlzIHVzZWQgZm9yIHRoZSBmaXJzdAorICogdGltZS4gVGhpcyBhZGRzIHZhcmlvdXMgRE9NIG5vZGVzIGFuZCBhIDxzdWJtZW51SW1hZ2U+IHRvIHRoZSBwYXJlbnQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHBhcmVudCAtIEFuIGl0ZW0gcmV0dXJuZWQgYnkgPGFkZEl0ZW0+LgorICovCitteFBvcHVwTWVudS5wcm90b3R5cGUuY3JlYXRlU3VibWVudSA9IGZ1bmN0aW9uKHBhcmVudCkKK3sKKwlwYXJlbnQudGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0YWJsZScpOworCXBhcmVudC50YWJsZS5jbGFzc05hbWUgPSAnbXhQb3B1cE1lbnUnOworCisJcGFyZW50LnRib2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGJvZHknKTsKKwlwYXJlbnQudGFibGUuYXBwZW5kQ2hpbGQocGFyZW50LnRib2R5KTsKKworCXBhcmVudC5kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKwlwYXJlbnQuZGl2LmNsYXNzTmFtZSA9ICdteFBvcHVwTWVudSc7CisKKwlwYXJlbnQuZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKwlwYXJlbnQuZGl2LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJzsKKwlwYXJlbnQuZGl2LnN0eWxlLnpJbmRleCA9IHRoaXMuekluZGV4OworCQorCXBhcmVudC5kaXYuYXBwZW5kQ2hpbGQocGFyZW50LnRhYmxlKTsKKwkKKwl2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CisJaW1nLnNldEF0dHJpYnV0ZSgnc3JjJywgdGhpcy5zdWJtZW51SW1hZ2UpOworCQorCS8vIExhc3QgY29sdW1uIG9mIHRoZSBzdWJtZW51IGl0ZW0gaW4gdGhlIHBhcmVudCBtZW51CisJdGQgPSBwYXJlbnQuZmlyc3RDaGlsZC5uZXh0U2libGluZy5uZXh0U2libGluZzsKKwl0ZC5hcHBlbmRDaGlsZChpbWcpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2hvd1N1Ym1lbnUKKyAqIAorICogU2hvd3MgdGhlIHN1Ym1lbnUgaW5zaWRlIHRoZSBnaXZlbiBwYXJlbnQgcm93LgorICovCitteFBvcHVwTWVudS5wcm90b3R5cGUuc2hvd1N1Ym1lbnUgPSBmdW5jdGlvbihwYXJlbnQsIHJvdykKK3sKKwlpZiAocm93LmRpdiAhPSBudWxsKQorCXsKKwkJcm93LmRpdi5zdHlsZS5sZWZ0ID0gKHBhcmVudC5kaXYub2Zmc2V0TGVmdCArCisJCQlyb3cub2Zmc2V0TGVmdCtyb3cub2Zmc2V0V2lkdGggLSAxKSArICdweCc7CisJCXJvdy5kaXYuc3R5bGUudG9wID0gKHBhcmVudC5kaXYub2Zmc2V0VG9wK3Jvdy5vZmZzZXRUb3ApICsgJ3B4JzsKKwkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyb3cuZGl2KTsKKwkJCisJCS8vIE1vdmVzIHRoZSBzdWJtZW51IHRvIHRoZSBsZWZ0IHNpZGUgaWYgdGhlcmUgaXMgbm8gc3BhY2UKKwkJdmFyIGxlZnQgPSBwYXJzZUludChyb3cuZGl2Lm9mZnNldExlZnQpOworCQl2YXIgd2lkdGggPSBwYXJzZUludChyb3cuZGl2Lm9mZnNldFdpZHRoKTsKKwkJdmFyIG9mZnNldCA9IG14VXRpbHMuZ2V0RG9jdW1lbnRTY3JvbGxPcmlnaW4oZG9jdW1lbnQpOworCQkKKwkJdmFyIGIgPSBkb2N1bWVudC5ib2R5OworCQl2YXIgZCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKKwkJCisJCXZhciByaWdodCA9IG9mZnNldC54ICsgKGIuY2xpZW50V2lkdGggfHwgZC5jbGllbnRXaWR0aCk7CisJCQorCQlpZiAobGVmdCArIHdpZHRoID4gcmlnaHQpCisJCXsKKwkJCXJvdy5kaXYuc3R5bGUubGVmdCA9IE1hdGgubWF4KDAsIChwYXJlbnQuZGl2Lm9mZnNldExlZnQgLSB3aWR0aCArICgobXhDbGllbnQuSVNfSUUpID8gNiA6IC02KSkpICsgJ3B4JzsKKwkJfQorCQkKKwkJbXhVdGlscy5maXQocm93LmRpdik7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogYWRkU2VwYXJhdG9yCisgKiAKKyAqIEFkZHMgYSBob3Jpem9udGFsIHNlcGFyYXRvciBpbiB0aGUgZ2l2ZW4gcGFyZW50IGl0ZW0gb3IgdGhlIHRvcC1sZXZlbCBtZW51CisgKiBpZiBubyBwYXJlbnQgaXMgc3BlY2lmaWVkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwYXJlbnQgLSBPcHRpb25hbCBpdGVtIHJldHVybmVkIGJ5IDxhZGRJdGVtPi4KKyAqIGZvcmNlIC0gT3B0aW9uYWwgYm9vbGVhbiB0byBpZ25vcmUgPHNtYXJ0U2VwYXJhdG9ycz4uIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214UG9wdXBNZW51LnByb3RvdHlwZS5hZGRTZXBhcmF0b3IgPSBmdW5jdGlvbihwYXJlbnQsIGZvcmNlKQoreworCXBhcmVudCA9IHBhcmVudCB8fCB0aGlzOworCQorCWlmICh0aGlzLnNtYXJ0U2VwYXJhdG9ycyAmJiAhZm9yY2UpCisJeworCQlwYXJlbnQud2lsbEFkZFNlcGFyYXRvciA9IHRydWU7CisJfQorCWVsc2UgaWYgKHBhcmVudC50Ym9keSAhPSBudWxsKQorCXsKKwkJcGFyZW50LndpbGxBZGRTZXBhcmF0b3IgPSBmYWxzZTsKKwkJdmFyIHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKKwkJCisJCXZhciBjb2wxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKKwkJY29sMS5jbGFzc05hbWUgPSAnbXhQb3B1cE1lbnVJY29uJzsKKwkJY29sMS5zdHlsZS5wYWRkaW5nID0gJzAgMCAwIDBweCc7CisJCQorCQl0ci5hcHBlbmRDaGlsZChjb2wxKTsKKwkJCisJCXZhciBjb2wyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKKwkJY29sMi5zdHlsZS5wYWRkaW5nID0gJzAgMCAwIDBweCc7CisJCWNvbDIuc2V0QXR0cmlidXRlKCdjb2xTcGFuJywgJzInKTsKKwkKKwkJdmFyIGhyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHInKTsKKwkJaHIuc2V0QXR0cmlidXRlKCdzaXplJywgJzEnKTsKKwkJY29sMi5hcHBlbmRDaGlsZChocik7CisJCQorCQl0ci5hcHBlbmRDaGlsZChjb2wyKTsKKwkJCisJCXBhcmVudC50Ym9keS5hcHBlbmRDaGlsZCh0cik7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcG9wdXAKKyAqIAorICogU2hvd3MgdGhlIHBvcHVwIG1lbnUgZm9yIHRoZSBnaXZlbiBldmVudCBhbmQgY2VsbC4KKyAqIAorICogRXhhbXBsZToKKyAqIAorICogKGNvZGUpCisgKiBncmFwaC5wYW5uaW5nSGFuZGxlci5wb3B1cCA9IGZ1bmN0aW9uKHgsIHksIGNlbGwsIGV2dCkKKyAqIHsKKyAqICAgbXhVdGlscy5hbGVydCgnSGVsbG8sIFdvcmxkIScpOworICogfQorICogKGVuZCkKKyAqLworbXhQb3B1cE1lbnUucHJvdG90eXBlLnBvcHVwID0gZnVuY3Rpb24oeCwgeSwgY2VsbCwgZXZ0KQoreworCWlmICh0aGlzLmRpdiAhPSBudWxsICYmIHRoaXMudGJvZHkgIT0gbnVsbCAmJiB0aGlzLmZhY3RvcnlNZXRob2QgIT0gbnVsbCkKKwl7CisJCXRoaXMuZGl2LnN0eWxlLmxlZnQgPSB4ICsgJ3B4JzsKKwkJdGhpcy5kaXYuc3R5bGUudG9wID0geSArICdweCc7CisJCQorCQkvLyBSZW1vdmVzIGFsbCBjaGlsZCBub2RlcyBmcm9tIHRoZSBleGlzdGluZyBtZW51CisJCXdoaWxlICh0aGlzLnRib2R5LmZpcnN0Q2hpbGQgIT0gbnVsbCkKKwkJeworCQkJbXhFdmVudC5yZWxlYXNlKHRoaXMudGJvZHkuZmlyc3RDaGlsZCk7CisJCQl0aGlzLnRib2R5LnJlbW92ZUNoaWxkKHRoaXMudGJvZHkuZmlyc3RDaGlsZCk7CisJCX0KKwkJCisJCXRoaXMuaXRlbUNvdW50ID0gMDsKKwkJdGhpcy5mYWN0b3J5TWV0aG9kKHRoaXMsIGNlbGwsIGV2dCk7CisJCQorCQlpZiAodGhpcy5pdGVtQ291bnQgPiAwKQorCQl7CisJCQl0aGlzLnNob3dNZW51KCk7CisJCQl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LlNIT1cpKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGlzTWVudVNob3dpbmcKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBtZW51IGlzIHNob3dpbmcuCisgKi8KK214UG9wdXBNZW51LnByb3RvdHlwZS5pc01lbnVTaG93aW5nID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmRpdiAhPSBudWxsICYmIHRoaXMuZGl2LnBhcmVudE5vZGUgPT0gZG9jdW1lbnQuYm9keTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNob3dNZW51CisgKiAKKyAqIFNob3dzIHRoZSBtZW51LgorICovCitteFBvcHVwTWVudS5wcm90b3R5cGUuc2hvd01lbnUgPSBmdW5jdGlvbigpCit7CisJLy8gRGlzYWJsZXMgZmlsdGVyLWJhc2VkIHNoYWRvdyBpbiBJRTkgc3RhbmRhcmRzIG1vZGUKKwlpZiAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlID49IDkpCisJeworCQl0aGlzLmRpdi5zdHlsZS5maWx0ZXIgPSAnbm9uZSc7CisJfQorCQorCS8vIEZpdHMgdGhlIGRpdiBpbnNpZGUgdGhlIHZpZXdwb3J0CisJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmRpdik7CisJbXhVdGlscy5maXQodGhpcy5kaXYpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaGlkZU1lbnUKKyAqIAorICogUmVtb3ZlcyB0aGUgbWVudSBhbmQgYWxsIHN1Ym1lbnVzLgorICovCitteFBvcHVwTWVudS5wcm90b3R5cGUuaGlkZU1lbnUgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMuZGl2ICE9IG51bGwpCisJeworCQlpZiAodGhpcy5kaXYucGFyZW50Tm9kZSAhPSBudWxsKQorCQl7CisJCQl0aGlzLmRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZGl2KTsKKwkJfQorCQkKKwkJdGhpcy5oaWRlU3VibWVudSh0aGlzKTsKKwkJdGhpcy5jb250YWluc0l0ZW1zID0gZmFsc2U7CisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuSElERSkpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGhpZGVTdWJtZW51CisgKiAKKyAqIFJlbW92ZXMgYWxsIHN1Ym1lbnVzIGluc2lkZSB0aGUgZ2l2ZW4gcGFyZW50LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwYXJlbnQgLSBBbiBpdGVtIHJldHVybmVkIGJ5IDxhZGRJdGVtPi4KKyAqLworbXhQb3B1cE1lbnUucHJvdG90eXBlLmhpZGVTdWJtZW51ID0gZnVuY3Rpb24ocGFyZW50KQoreworCWlmIChwYXJlbnQuYWN0aXZlUm93ICE9IG51bGwpCisJeworCQl0aGlzLmhpZGVTdWJtZW51KHBhcmVudC5hY3RpdmVSb3cpOworCQkKKwkJaWYgKHBhcmVudC5hY3RpdmVSb3cuZGl2LnBhcmVudE5vZGUgIT0gbnVsbCkKKwkJeworCQkJcGFyZW50LmFjdGl2ZVJvdy5kaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwYXJlbnQuYWN0aXZlUm93LmRpdik7CisJCX0KKwkJCisJCXBhcmVudC5hY3RpdmVSb3cgPSBudWxsOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqIAorICogRGVzdHJveXMgdGhlIGhhbmRsZXIgYW5kIGFsbCBpdHMgcmVzb3VyY2VzIGFuZCBET00gbm9kZXMuCisgKi8KK214UG9wdXBNZW51LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLmRpdiAhPSBudWxsKQorCXsKKwkJbXhFdmVudC5yZWxlYXNlKHRoaXMuZGl2KTsKKwkJCisJCWlmICh0aGlzLmRpdi5wYXJlbnROb2RlICE9IG51bGwpCisJCXsKKwkJCXRoaXMuZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kaXYpOworCQl9CisJCQorCQl0aGlzLmRpdiA9IG51bGw7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214UmVjdGFuZ2xlLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhSZWN0YW5nbGUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzNWU1YQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214UmVjdGFuZ2xlLmpzCkBAIC0wLDAgKzEsMTc5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFJlY3RhbmdsZQorICoKKyAqIEV4dGVuZHMgPG14UG9pbnQ+IHRvIGltcGxlbWVudCBhIDItZGltZW5zaW9uYWwgcmVjdGFuZ2xlIHdpdGggZG91YmxlCisgKiBwcmVjaXNpb24gY29vcmRpbmF0ZXMuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteFJlY3RhbmdsZQorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgcmVjdGFuZ2xlIGZvciB0aGUgb3B0aW9uYWwgcGFyYW1ldGVycy4gSWYgbm8gcGFyYW1ldGVycworICogYXJlIGdpdmVuIHRoZW4gdGhlIHJlc3BlY3RpdmUgZGVmYXVsdCB2YWx1ZXMgYXJlIHVzZWQuCisgKi8KK2Z1bmN0aW9uIG14UmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpCit7CisJbXhQb2ludC5jYWxsKHRoaXMsIHgsIHkpOworCisJdGhpcy53aWR0aCA9ICh3aWR0aCAhPSBudWxsKSA/IHdpZHRoIDogMDsKKwl0aGlzLmhlaWdodCA9IChoZWlnaHQgIT0gbnVsbCkgPyBoZWlnaHQgOiAwOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14UG9pbnQuCisgKi8KK214UmVjdGFuZ2xlLnByb3RvdHlwZSA9IG5ldyBteFBvaW50KCk7CitteFJlY3RhbmdsZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBteFJlY3RhbmdsZTsKKworLyoqCisgKiBWYXJpYWJsZTogd2lkdGgKKyAqCisgKiBIb2xkcyB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4gRGVmYXVsdCBpcyAwLgorICovCitteFJlY3RhbmdsZS5wcm90b3R5cGUud2lkdGggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBoZWlnaHQKKyAqCisgKiBIb2xkcyB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuIERlZmF1bHQgaXMgMC4KKyAqLworbXhSZWN0YW5nbGUucHJvdG90eXBlLmhlaWdodCA9IG51bGw7CisKKy8qKgorICogRnVuY3Rpb246IHNldFJlY3QKKyAqIAorICogU2V0cyB0aGlzIHJlY3RhbmdsZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlcworICovCitteFJlY3RhbmdsZS5wcm90b3R5cGUuc2V0UmVjdCA9IGZ1bmN0aW9uKHgsIHksIHcsIGgpCit7CisgICAgdGhpcy54ID0geDsKKyAgICB0aGlzLnkgPSB5OworICAgIHRoaXMud2lkdGggPSB3OworICAgIHRoaXMuaGVpZ2h0ID0gaDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldENlbnRlclgKKyAqIAorICogUmV0dXJucyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBjZW50ZXIgcG9pbnQuCisgKi8KK214UmVjdGFuZ2xlLnByb3RvdHlwZS5nZXRDZW50ZXJYID0gZnVuY3Rpb24gKCkKK3sKKwlyZXR1cm4gdGhpcy54ICsgdGhpcy53aWR0aC8yOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q2VudGVyWQorICogCisgKiBSZXR1cm5zIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBwb2ludC4KKyAqLworbXhSZWN0YW5nbGUucHJvdG90eXBlLmdldENlbnRlclkgPSBmdW5jdGlvbiAoKQoreworCXJldHVybiB0aGlzLnkgKyB0aGlzLmhlaWdodC8yOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYWRkCisgKgorICogQWRkcyB0aGUgZ2l2ZW4gcmVjdGFuZ2xlIHRvIHRoaXMgcmVjdGFuZ2xlLgorICovCitteFJlY3RhbmdsZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24ocmVjdCkKK3sKKwlpZiAocmVjdCAhPSBudWxsKQorCXsKKwkJdmFyIG1pblggPSBNYXRoLm1pbih0aGlzLngsIHJlY3QueCk7CisJCXZhciBtaW5ZID0gTWF0aC5taW4odGhpcy55LCByZWN0LnkpOworCQl2YXIgbWF4WCA9IE1hdGgubWF4KHRoaXMueCArIHRoaXMud2lkdGgsIHJlY3QueCArIHJlY3Qud2lkdGgpOworCQl2YXIgbWF4WSA9IE1hdGgubWF4KHRoaXMueSArIHRoaXMuaGVpZ2h0LCByZWN0LnkgKyByZWN0LmhlaWdodCk7CisJCQorCQl0aGlzLnggPSBtaW5YOworCQl0aGlzLnkgPSBtaW5ZOworCQl0aGlzLndpZHRoID0gbWF4WCAtIG1pblg7CisJCXRoaXMuaGVpZ2h0ID0gbWF4WSAtIG1pblk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogaW50ZXJzZWN0CisgKiAKKyAqIENoYW5nZXMgdGhpcyByZWN0YW5nbGUgdG8gd2hlcmUgaXQgb3ZlcmxhcHMgd2l0aCB0aGUgZ2l2ZW4gcmVjdGFuZ2xlLgorICovCitteFJlY3RhbmdsZS5wcm90b3R5cGUuaW50ZXJzZWN0ID0gZnVuY3Rpb24ocmVjdCkKK3sKKwlpZiAocmVjdCAhPSBudWxsKQorCXsKKwkJdmFyIHIxID0gdGhpcy54ICsgdGhpcy53aWR0aDsKKwkJdmFyIHIyID0gcmVjdC54ICsgcmVjdC53aWR0aDsKKwkJCisJCXZhciBiMSA9IHRoaXMueSArIHRoaXMuaGVpZ2h0OworCQl2YXIgYjIgPSByZWN0LnkgKyByZWN0LmhlaWdodDsKKwkJCisJCXRoaXMueCA9IE1hdGgubWF4KHRoaXMueCwgcmVjdC54KTsKKwkJdGhpcy55ID0gTWF0aC5tYXgodGhpcy55LCByZWN0LnkpOworCQl0aGlzLndpZHRoID0gTWF0aC5taW4ocjEsIHIyKSAtIHRoaXMueDsKKwkJdGhpcy5oZWlnaHQgPSBNYXRoLm1pbihiMSwgYjIpIC0gdGhpcy55OworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdyb3cKKyAqCisgKiBHcm93cyB0aGUgcmVjdGFuZ2xlIGJ5IHRoZSBnaXZlbiBhbW91bnQsIHRoYXQgaXMsIHRoaXMgbWV0aG9kIHN1YnRyYWN0cworICogdGhlIGdpdmVuIGFtb3VudCBmcm9tIHRoZSB4LSBhbmQgeS1jb29yZGluYXRlcyBhbmQgYWRkcyB0d2ljZSB0aGUgYW1vdW50CisgKiB0byB0aGUgd2lkdGggYW5kIGhlaWdodC4KKyAqLworbXhSZWN0YW5nbGUucHJvdG90eXBlLmdyb3cgPSBmdW5jdGlvbihhbW91bnQpCit7CisJdGhpcy54IC09IGFtb3VudDsKKwl0aGlzLnkgLT0gYW1vdW50OworCXRoaXMud2lkdGggKz0gMiAqIGFtb3VudDsKKwl0aGlzLmhlaWdodCArPSAyICogYW1vdW50OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0UG9pbnQKKyAqIAorICogUmV0dXJucyB0aGUgdG9wLCBsZWZ0IGNvcm5lciBhcyBhIG5ldyA8bXhQb2ludD4uCisgKi8KK214UmVjdGFuZ2xlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gbmV3IG14UG9pbnQodGhpcy54LCB0aGlzLnkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcm90YXRlOTAKKyAqIAorICogUm90YXRlcyB0aGlzIHJlY3RhbmdsZSBieSA5MCBkZWdyZWUgYXJvdW5kIGl0cyBjZW50ZXIgcG9pbnQuCisgKi8KK214UmVjdGFuZ2xlLnByb3RvdHlwZS5yb3RhdGU5MCA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgdCA9ICh0aGlzLndpZHRoIC0gdGhpcy5oZWlnaHQpIC8gMjsKKwl0aGlzLnggKz0gdDsKKwl0aGlzLnkgLT0gdDsKKwl2YXIgdG1wID0gdGhpcy53aWR0aDsKKwl0aGlzLndpZHRoID0gdGhpcy5oZWlnaHQ7CisJdGhpcy5oZWlnaHQgPSB0bXA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBlcXVhbHMKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgZXF1YWxzIHRoaXMgcmVjdGFuZ2xlLgorICovCitteFJlY3RhbmdsZS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24ob2JqKQoreworCXJldHVybiBvYmogIT0gbnVsbCAmJiBvYmoueCA9PSB0aGlzLnggJiYgb2JqLnkgPT0gdGhpcy55ICYmCisJCW9iai53aWR0aCA9PSB0aGlzLndpZHRoICYmIG9iai5oZWlnaHQgPT0gdGhpcy5oZWlnaHQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBmcm9tUmVjdGFuZ2xlCisgKiAKKyAqIFJldHVybnMgYSBuZXcgPG14UmVjdGFuZ2xlPiB3aGljaCBpcyBhIGNvcHkgb2YgdGhlIGdpdmVuIHJlY3RhbmdsZS4KKyAqLworbXhSZWN0YW5nbGUuZnJvbVJlY3RhbmdsZSA9IGZ1bmN0aW9uKHJlY3QpCit7CisJcmV0dXJuIG5ldyBteFJlY3RhbmdsZShyZWN0LngsIHJlY3QueSwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214UmVzb3VyY2VzLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhSZXNvdXJjZXMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2MTJiNgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214UmVzb3VyY2VzLmpzCkBAIC0wLDAgKzEsNDUwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE2LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNiwgR2F1ZGVueiBBbGRlcgorICovCit2YXIgbXhSZXNvdXJjZXMgPQoreworCS8qKgorCSAqIENsYXNzOiBteFJlc291cmNlcworCSAqIAorCSAqIEltcGxlbWVudHMgaW50ZXJuYXRpb25hbGl6YXRpb24uIFlvdSBjYW4gcHJvdmlkZSBhbnkgbnVtYmVyIG9mIAorCSAqIHJlc291cmNlIGZpbGVzIG9uIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtYXQgZm9yIHRoZSAKKwkgKiBmaWxlbmFtZTogbmFtZVstZW5dLnByb3BlcnRpZXMuIFRoZSBlbiBzdGFuZHMgZm9yIGFueSBsb3dlcmNhc2UgCisJICogMi1jaGFyYWN0ZXIgbGFuZ3VhZ2Ugc2hvcnRjdXQgKGVnLiBkZSBmb3IgZ2VybWFuLCBmciBmb3IgZnJlbmNoKS4KKwkgKgorCSAqIElmIHRoZSBvcHRpb25hbCBsYW5ndWFnZSBleHRlbnNpb24gaXMgb21pdHRlZCwgdGhlbiB0aGUgZmlsZSBpcyB1c2VkIGFzIGEgCisJICogZGVmYXVsdCByZXNvdXJjZSB3aGljaCBpcyBsb2FkZWQgaW4gYWxsIGNhc2VzLiBJZiBhIHByb3BlcnRpZXMgZmlsZSBmb3IgYSAKKwkgKiBzcGVjaWZpYyBsYW5ndWFnZSBleGlzdHMsIHRoZW4gaXQgaXMgdXNlZCB0byBvdmVycmlkZSB0aGUgc2V0dGluZ3MgaW4gdGhlIAorCSAqIGRlZmF1bHQgcmVzb3VyY2UuIEFsbCBlbnRyaWVzIGluIHRoZSBmaWxlIGFyZSBvZiB0aGUgZm9ybSBrZXk9dmFsdWUuIFRoZQorCSAqIHZhbHVlcyBtYXkgdGhlbiBiZSBhY2Nlc3NlZCBpbiBjb2RlIHZpYSA8Z2V0Pi4gTGluZXMgd2l0aG91dCAKKwkgKiBlcXVhbCBzaWducyBpbiB0aGUgcHJvcGVydGllcyBmaWxlcyBhcmUgaWdub3JlZC4KKwkgKgorCSAqIFJlc291cmNlIGZpbGVzIG1heSBlaXRoZXIgYmUgYWRkZWQgcHJvZ3JhbW1hdGljYWxseSB1c2luZworCSAqIDxhZGQ+IG9yIHZpYSBhIHJlc291cmNlIHRhZyBpbiB0aGUgVUkgc2VjdGlvbiBvZiB0aGUgCisJICogZWRpdG9yIGNvbmZpZ3VyYXRpb24gZmlsZSwgZWc6CisJICogCisJICogKGNvZGUpCisJICogPG14RWRpdG9yPgorCSAqICAgPHVpPgorCSAqICAgICA8cmVzb3VyY2UgYmFzZW5hbWU9ImV4YW1wbGVzL3Jlc291cmNlcy9teFdvcmtmbG93Ii8+CisJICogKGVuZCkKKwkgKiAKKwkgKiBUaGUgYWJvdmUgZWxlbWVudCB3aWxsIGxvYWQgZXhhbXBsZXMvcmVzb3VyY2VzL214V29ya2Zsb3cucHJvcGVydGllcyBhcyB3ZWxsCisJICogYXMgdGhlIGxhbmd1YWdlIHNwZWNpZmljIGZpbGUgZm9yIHRoZSBjdXJyZW50IGxhbmd1YWdlLCBpZiBpdCBleGlzdHMuCisJICogCisJICogVmFsdWVzIG1heSBjb250YWluIHBsYWNlaG9sZGVycyBvZiB0aGUgZm9ybSB7MX0uLi57bn0gd2hlcmUgZWFjaCBwbGFjZWhvbGRlcgorCSAqIGlzIHJlcGxhY2VkIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IGVsZW1lbnQgaW4gdGhlIHBhcmFtcworCSAqIGFyZ3VtZW50IHBhc3NlZCB0byA8bXhSZXNvdXJjZXMuZ2V0Pi4gVGhlIHBsYWNlaG9sZGVyIHsxfSBtYXBzIHRvIHRoZSBmaXJzdAorCSAqIGVsZW1lbnQgaW4gdGhlIGFycmF5IChhdCBpbmRleCAwKS4KKwkgKiAKKwkgKiBTZWUgPG14Q2xpZW50Lmxhbmd1YWdlPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzcGVjaWZ5aW5nIHRoZSBkZWZhdWx0CisJICogbGFuZ3VhZ2Ugb3IgZGlzYWJsaW5nIGFsbCBsb2FkaW5nIG9mIHJlc291cmNlcy4KKwkgKiAKKwkgKiBMaW5lcyB0aGF0IHN0YXJ0IHdpdGggYSAjIHNpZ24gd2lsbCBiZSBpZ25vcmVkLgorCSAqIAorCSAqIFNwZWNpYWwgY2hhcmFjdGVycworCSAqIAorCSAqIFRvIHVzZSB1bmljb2RlIGNoYXJhY3RlcnMsIHVzZSB0aGUgc3RhbmRhcmQgbm90YXRpb24gKGVnLiBcdThmZDEpIG9yICV1IGFzIGEKKwkgKiBwcmVmaXggKGVnLiAldTIwQUMgd2lsbCBkaXNwbGF5IGEgRXVybyBzaWduKS4gRm9yIG5vcm1hbCBoZXggZW5jb2RlZCBzdHJpbmdzLAorCSAqIHVzZSAlIGFzIGEgcHJlZml4LCBlZy4gJUY2IHdpbGwgZGlzcGxheSBhICJvIHVtbGF1dCIgKCZvdW1sOykuCisJICogCisJICogU2VlIDxyZXNvdXJjZXNFbmNvZGVkPiB0byBkaXNhYmxlIHRoaXMuIElmIHlvdSBkaXNhYmxlIHRoaXMsIG1ha2Ugc3VyZSB0aGF0CisJICogeW91ciBmaWxlcyBhcmUgVVRGLTggZW5jb2RlZC4KKwkgKiAKKwkgKiBBc3luY2hyb25vdXMgbG9hZGluZworCSAqIAorCSAqIEJ5IGRlZmF1bHQsIHRoZSBjb3JlIGFkZHMgdHdvIHJlc291cmNlIGZpbGVzIHN5bmNocm9ub3VzbHkgYXQgbG9hZCB0aW1lLgorCSAqIFRvIGxvYWQgdGhlc2UgZmlsZXMgYXN5bmNocm9ub3VzbHksIHNldCA8bXhMb2FkUmVzb3VyY2VzPiB0byBmYWxzZQorCSAqIGJlZm9yZSBsb2FkaW5nIG14Q2xpZW50LmpzIGFuZCB1c2UgPG14UmVzb3VyY2VzLmxvYWRSZXNvdXJjZXM+IGluc3RlYWQuCisJICogCisJICogVmFyaWFibGU6IHJlc291cmNlcworCSAqIAorCSAqIEFzc29jaWF0aXZlIGFycmF5IHRoYXQgbWFwcyBmcm9tIGtleXMgdG8gdmFsdWVzLgorCSAqLworCXJlc291cmNlczogW10sCisKKwkvKioKKwkgKiBWYXJpYWJsZTogZXh0ZW5zaW9uCisJICogCisJICogU3BlY2lmaWVzIHRoZSBleHRlbnNpb24gdXNlZCBmb3IgbGFuZ3VhZ2UgZmlsZXMuIERlZmF1bHQgaXMgPG14UmVzb3VyY2VFeHRlbnNpb24+LgorCSAqLworCWV4dGVuc2lvbjogbXhSZXNvdXJjZUV4dGVuc2lvbiwKKworCS8qKgorCSAqIFZhcmlhYmxlOiByZXNvdXJjZXNFbmNvZGVkCisJICogCisJICogU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHZhbHVlcyBpbiByZXNvdXJjZSBmaWxlcyBhcmUgZW5jb2RlZCB3aXRoIFx1IG9yCisJICogcGVyY2VudGFnZS4gRGVmYXVsdCBpcyBmYWxzZS4KKwkgKi8KKwlyZXNvdXJjZXNFbmNvZGVkOiBmYWxzZSwKKworCS8qKgorCSAqIFZhcmlhYmxlOiBsb2FkRGVmYXVsdEJ1bmRsZQorCSAqIAorCSAqIFNwZWNpZmllcyBpZiB0aGUgZGVmYXVsdCBmaWxlIGZvciBhIGdpdmVuIGJhc2VuYW1lIHNob3VsZCBiZSBsb2FkZWQuCisJICogRGVmYXVsdCBpcyB0cnVlLgorCSAqLworCWxvYWREZWZhdWx0QnVuZGxlOiB0cnVlLAorCisJLyoqCisJICogVmFyaWFibGU6IGxvYWREZWZhdWx0QnVuZGxlCisJICogCisJICogU3BlY2lmaWVzIGlmIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBmaWxlIGZpbGUgZm9yIGEgZ2l2ZW4gYmFzZW5hbWUgc2hvdWxkCisJICogYmUgbG9hZGVkLiBEZWZhdWx0IGlzIHRydWUuCisJICovCisJbG9hZFNwZWNpYWxCdW5kbGU6IHRydWUsCisKKwkvKioKKwkgKiBGdW5jdGlvbjogaXNMYW5ndWFnZVN1cHBvcnRlZAorCSAqIAorCSAqIEhvb2sgZm9yIHN1YmNsYXNzZXJzIHRvIGRpc2FibGUgc3VwcG9ydCBmb3IgYSBnaXZlbiBsYW5ndWFnZS4gVGhpcworCSAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZSBpZiBsYW4gaXMgaW4gPG14Q2xpZW50Lmxhbmd1YWdlcz4uCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKgorCSAqIGxhbiAtIFRoZSBjdXJyZW50IGxhbmd1YWdlLgorCSAqLworCWlzTGFuZ3VhZ2VTdXBwb3J0ZWQ6IGZ1bmN0aW9uKGxhbikKKwl7CisJCWlmIChteENsaWVudC5sYW5ndWFnZXMgIT0gbnVsbCkKKwkJeworCQkJcmV0dXJuIG14VXRpbHMuaW5kZXhPZihteENsaWVudC5sYW5ndWFnZXMsIGxhbikgPj0gMDsKKwkJfQorCQkKKwkJcmV0dXJuIHRydWU7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBnZXREZWZhdWx0QnVuZGxlCisJICogCisJICogSG9vayBmb3Igc3ViY2xhc3NlcnMgdG8gcmV0dXJuIHRoZSBVUkwgZm9yIHRoZSBzcGVjaWFsIGJ1bmRsZS4gVGhpcworCSAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgYmFzZW5hbWUgKyA8ZXh0ZW5zaW9uPiBvciBudWxsIGlmCisJICogPGxvYWREZWZhdWx0QnVuZGxlPiBpcyBmYWxzZS4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGJhc2VuYW1lIC0gVGhlIGJhc2VuYW1lIGZvciB3aGljaCB0aGUgZmlsZSBzaG91bGQgYmUgbG9hZGVkLgorCSAqIGxhbiAtIFRoZSBjdXJyZW50IGxhbmd1YWdlLgorCSAqLworCWdldERlZmF1bHRCdW5kbGU6IGZ1bmN0aW9uKGJhc2VuYW1lLCBsYW4pCisJeworCQlpZiAobXhSZXNvdXJjZXMubG9hZERlZmF1bHRCdW5kbGUgfHwgIW14UmVzb3VyY2VzLmlzTGFuZ3VhZ2VTdXBwb3J0ZWQobGFuKSkKKwkJeworCQkJcmV0dXJuIGJhc2VuYW1lICsgbXhSZXNvdXJjZXMuZXh0ZW5zaW9uOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGdldFNwZWNpYWxCdW5kbGUKKwkgKiAKKwkgKiBIb29rIGZvciBzdWJjbGFzc2VycyB0byByZXR1cm4gdGhlIFVSTCBmb3IgdGhlIHNwZWNpYWwgYnVuZGxlLiBUaGlzCisJICogaW1wbGVtZW50YXRpb24gcmV0dXJucyBiYXNlbmFtZSArICdfJyArIGxhbiArIDxleHRlbnNpb24+IG9yIG51bGwgaWYKKwkgKiA8bG9hZFNwZWNpYWxCdW5kbGU+IGlzIGZhbHNlIG9yIGxhbiBlcXVhbHMgPG14Q2xpZW50LmRlZmF1bHRMYW5ndWFnZT4uCisJICogCisJICogSWYgPG14UmVzb3VyY2VzLmxhbmd1YWdlcz4gaXMgbm90IG51bGwgYW5kIDxteENsaWVudC5sYW5ndWFnZT4gY29udGFpbnMKKwkgKiBhIGRhc2gsIHRoZW4gdGhpcyBtZXRob2QgY2hlY2tzIGlmIDxpc0xhbmd1YWdlU3VwcG9ydGVkPiByZXR1cm5zIHRydWUKKwkgKiBmb3IgdGhlIGZ1bGwgbGFuZ3VhZ2UgKGluY2x1ZGluZyB0aGUgZGFzaCkuIElmIHRoYXQgcmV0dXJucyBmYWxzZSB0aGUKKwkgKiBmaXJzdCBwYXJ0IG9mIHRoZSBsYW5ndWFnZSAodXAgdG8gdGhlIGRhc2gpIHdpbGwgYmUgdHJpZWQgYXMgYW4gZXh0ZW5zaW9uLgorCSAqIAorCSAqIElmIDxteFJlc291cmNlcy5sYW5ndWFnZT4gaXMgbnVsbCB0aGVuIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBsYW5ndWFnZSBpcworCSAqIHVzZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBiYXNlbmFtZSAtIFRoZSBiYXNlbmFtZSBmb3Igd2hpY2ggdGhlIGZpbGUgc2hvdWxkIGJlIGxvYWRlZC4KKwkgKiBsYW4gLSBUaGUgbGFuZ3VhZ2UgZm9yIHdoaWNoIHRoZSBmaWxlIHNob3VsZCBiZSBsb2FkZWQuCisJICovCisJZ2V0U3BlY2lhbEJ1bmRsZTogZnVuY3Rpb24oYmFzZW5hbWUsIGxhbikKKwl7CisJCWlmIChteENsaWVudC5sYW5ndWFnZXMgPT0gbnVsbCB8fCAhdGhpcy5pc0xhbmd1YWdlU3VwcG9ydGVkKGxhbikpCisJCXsKKwkJCXZhciBkYXNoID0gbGFuLmluZGV4T2YoJy0nKTsKKwkJCQorCQkJaWYgKGRhc2ggPiAwKQorCQkJeworCQkJCWxhbiA9IGxhbi5zdWJzdHJpbmcoMCwgZGFzaCk7CisJCQl9CisJCX0KKworCQlpZiAobXhSZXNvdXJjZXMubG9hZFNwZWNpYWxCdW5kbGUgJiYgbXhSZXNvdXJjZXMuaXNMYW5ndWFnZVN1cHBvcnRlZChsYW4pICYmIGxhbiAhPSBteENsaWVudC5kZWZhdWx0TGFuZ3VhZ2UpCisJCXsKKwkJCXJldHVybiBiYXNlbmFtZSArICdfJyArIGxhbiArIG14UmVzb3VyY2VzLmV4dGVuc2lvbjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiBudWxsOworCQl9CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBhZGQKKwkgKiAKKwkgKiBBZGRzIHRoZSBkZWZhdWx0IGFuZCBjdXJyZW50IGxhbmd1YWdlIHByb3BlcnRpZXMgZmlsZSBmb3IgdGhlIHNwZWNpZmllZAorCSAqIGJhc2VuYW1lLiBFeGlzdGluZyBrZXlzIGFyZSBvdmVycmlkZGVuIGFzIG5ldyBmaWxlcyBhcmUgYWRkZWQuIElmIG5vCisJICogY2FsbGJhY2sgaXMgdXNlZCB0aGVuIHRoZSByZXF1ZXN0IGlzIHN5bmNocm9ub3VzLgorCSAqCisJICogRXhhbXBsZToKKwkgKiAKKwkgKiBBdCBhcHBsaWNhdGlvbiBzdGFydHVwLCBhZGRpdGlvbmFsIHJlc291cmNlcyBtYXkgYmUgCisJICogYWRkZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb2RlOgorCSAqIAorCSAqIChjb2RlKQorCSAqIG14UmVzb3VyY2VzLmFkZCgncmVzb3VyY2VzL2VkaXRvcicpOworCSAqIChlbmQpCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBiYXNlbmFtZSAtIFRoZSBiYXNlbmFtZSBmb3Igd2hpY2ggdGhlIGZpbGUgc2hvdWxkIGJlIGxvYWRlZC4KKwkgKiBsYW4gLSBUaGUgbGFuZ3VhZ2UgZm9yIHdoaWNoIHRoZSBmaWxlIHNob3VsZCBiZSBsb2FkZWQuCisJICogY2FsbGJhY2sgLSBPcHRpb25hbCBjYWxsYmFjayBmb3IgYXN5bmNocm9ub3VzIGxvYWRpbmcuCisJICovCisJYWRkOiBmdW5jdGlvbihiYXNlbmFtZSwgbGFuLCBjYWxsYmFjaykKKwl7CisJCWxhbiA9IChsYW4gIT0gbnVsbCkgPyBsYW4gOiAoKG14Q2xpZW50Lmxhbmd1YWdlICE9IG51bGwpID8KKwkJCW14Q2xpZW50Lmxhbmd1YWdlLnRvTG93ZXJDYXNlKCkgOiBteENvbnN0YW50cy5OT05FKTsKKwkJCisJCWlmIChsYW4gIT0gbXhDb25zdGFudHMuTk9ORSkKKwkJeworCQkJdmFyIGRlZmF1bHRCdW5kbGUgPSBteFJlc291cmNlcy5nZXREZWZhdWx0QnVuZGxlKGJhc2VuYW1lLCBsYW4pOworCQkJdmFyIHNwZWNpYWxCdW5kbGUgPSBteFJlc291cmNlcy5nZXRTcGVjaWFsQnVuZGxlKGJhc2VuYW1lLCBsYW4pOworCQkJCisJCQl2YXIgbG9hZFNwZWNpYWxCdW5kbGUgPSBmdW5jdGlvbigpCisJCQl7CisJCQkJaWYgKHNwZWNpYWxCdW5kbGUgIT0gbnVsbCkKKwkJCQl7CisJCQkJCWlmIChjYWxsYmFjaykKKwkJCQkJeworCQkJCQkJbXhVdGlscy5nZXQoc3BlY2lhbEJ1bmRsZSwgZnVuY3Rpb24ocmVxKQorCQkJCQkJeworCQkJCQkJCW14UmVzb3VyY2VzLnBhcnNlKHJlcS5nZXRUZXh0KCkpOworCQkJCQkJCWNhbGxiYWNrKCk7CisJCQkJCQl9LCBmdW5jdGlvbigpCisJCQkJCQl7CisJCQkJCQkJY2FsbGJhY2soKTsKKwkJCQkJCX0pOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJdHJ5CisJCQkJCQl7CisJCQkJCSAgIAkJdmFyIHJlcSA9IG14VXRpbHMubG9hZChzcGVjaWFsQnVuZGxlKTsKKwkJCQkJICAgCQkKKwkJCQkJICAgCQlpZiAocmVxLmlzUmVhZHkoKSkKKwkJCQkJICAgCQl7CisJCQkJCSAJICAgCQlteFJlc291cmNlcy5wYXJzZShyZXEuZ2V0VGV4dCgpKTsKKwkJCQkJICAgCQl9CisJCQkJICAgCQl9CisJCQkJICAgCQljYXRjaCAoZSkKKwkJCQkgICAJCXsKKwkJCQkgICAJCQkvLyBpZ25vcmUKKwkJCQkJICAgCX0KKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChjYWxsYmFjayAhPSBudWxsKQorCQkJCXsKKwkJCQkJY2FsbGJhY2soKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmIChkZWZhdWx0QnVuZGxlICE9IG51bGwpCisJCQl7CisJCQkJaWYgKGNhbGxiYWNrKQorCQkJCXsKKwkJCQkJbXhVdGlscy5nZXQoZGVmYXVsdEJ1bmRsZSwgZnVuY3Rpb24ocmVxKQorCQkJCQl7CisJCQkJCQlteFJlc291cmNlcy5wYXJzZShyZXEuZ2V0VGV4dCgpKTsKKwkJCQkJCWxvYWRTcGVjaWFsQnVuZGxlKCk7CisJCQkJCX0sIGZ1bmN0aW9uKCkKKwkJCQkJeworCQkJCQkJbG9hZFNwZWNpYWxCdW5kbGUoKTsKKwkJCQkJfSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXRyeQorCQkJCQl7CisJCQkJICAgCQl2YXIgcmVxID0gbXhVdGlscy5sb2FkKGRlZmF1bHRCdW5kbGUpOworCQkJCSAgIAkJCisJCQkJICAgCQlpZiAocmVxLmlzUmVhZHkoKSkKKwkJCQkgICAJCXsKKwkJCQkgCSAgIAkJbXhSZXNvdXJjZXMucGFyc2UocmVxLmdldFRleHQoKSk7CisJCQkJICAgCQl9CisJCQkJICAgCQkKKwkJCQkgICAJCWxvYWRTcGVjaWFsQnVuZGxlKCk7CisJCQkJICAJfQorCQkJCSAgCWNhdGNoIChlKQorCQkJCSAgCXsKKwkJCQkgIAkJLy8gaWdub3JlCisJCQkJICAJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBPdmVybGF5cyB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgZmlsZSAoX2xhbi1leHRlbnNpb24pCisJCQkJbG9hZFNwZWNpYWxCdW5kbGUoKTsKKwkJCX0KKwkJfQorCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogcGFyc2UKKwkgKiAKKwkgKiBQYXJzZXMgdGhlIGtleSwgdmFsdWUgcGFpcnMgaW4gdGhlIHNwZWNpZmllZAorCSAqIHRleHQgYW5kIHN0b3JlcyB0aGVtIGFzIGxvY2FsIHJlc291cmNlcy4KKwkgKi8KKwlwYXJzZTogZnVuY3Rpb24odGV4dCkKKwl7CisJCWlmICh0ZXh0ICE9IG51bGwpCisJCXsKKwkJCXZhciBsaW5lcyA9IHRleHQuc3BsaXQoJ1xuJyk7CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJaWYgKGxpbmVzW2ldLmNoYXJBdCgwKSAhPSAnIycpCisJCQkJeworCQkJCQl2YXIgaW5kZXggPSBsaW5lc1tpXS5pbmRleE9mKCc9Jyk7CisJCQkJCQorCQkJCQlpZiAoaW5kZXggPiAwKQorCQkJCQl7CisJCQkJCQl2YXIga2V5ID0gbGluZXNbaV0uc3Vic3RyaW5nKDAsIGluZGV4KTsKKwkJCQkJCXZhciBpZHggPSBsaW5lc1tpXS5sZW5ndGg7CisJCQkJCQkKKwkJCQkJCWlmIChsaW5lc1tpXS5jaGFyQ29kZUF0KGlkeCAtIDEpID09IDEzKQorCQkJCQkJeworCQkJCQkJCWlkeC0tOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQl2YXIgdmFsdWUgPSBsaW5lc1tpXS5zdWJzdHJpbmcoaW5kZXggKyAxLCBpZHgpOworCQkJCQkJCisJCQkJCQlpZiAodGhpcy5yZXNvdXJjZXNFbmNvZGVkKQorCQkJCQkJeworCQkJCQkJCXZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFwoPz11W2EtZkEtRlxkXXs0fSkvZywiJSIpOworCQkJCQkJCW14UmVzb3VyY2VzLnJlc291cmNlc1trZXldID0gdW5lc2NhcGUodmFsdWUpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCW14UmVzb3VyY2VzLnJlc291cmNlc1trZXldID0gdmFsdWU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGdldAorCSAqIAorCSAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGtleS4KKwkgKgorCSAqIEV4YW1wbGU6CisJICogVG8gcmVhZCB0aGUgdmFsdWUgZm9yICd3ZWxvbWVNZXNzYWdlJywgdXNlIHRoZSBmb2xsb3dpbmc6CisJICogKGNvZGUpCisJICogdmFyIHJlc3VsdCA9IG14UmVzb3VyY2VzLmdldCgnd2VsY29tZU1lc3NhZ2UnKSB8fCAnJzsKKwkgKiAoZW5kKQorCSAqCisJICogVGhpcyB3b3VsZCByZXF1aXJlIGFuIGVudHJ5IG9mIHRoZSBmb2xsb3dpbmcgZm9ybSBpbgorCSAqIG9uZSBvZiB0aGUgRW5nbGlzaCBsYW5ndWFnZSByZXNvdXJjZSBmaWxlczoKKwkgKiAoY29kZSkKKwkgKiB3ZWxjb21lTWVzc2FnZT1XZWxjb21lIHRvIG14R3JhcGghCisJICogKGVuZCkKKwkgKiAKKwkgKiBUaGUgcGFydCBiZWhpbmQgdGhlIHx8IGlzIHRoZSBzdHJpbmcgdmFsdWUgdG8gYmUgdXNlZCBpZiB0aGUgZ2l2ZW4KKwkgKiByZXNvdXJjZSBpcyBub3QgYXZhaWxhYmxlLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICoga2V5IC0gU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUga2V5IG9mIHRoZSByZXNvdXJjZSB0byBiZSByZXR1cm5lZC4KKwkgKiBwYXJhbXMgLSBBcnJheSBvZiB0aGUgdmFsdWVzIGZvciB0aGUgcGxhY2Vob2xkZXJzIG9mIHRoZSBmb3JtIHsxfS4uLntufQorCSAqIHRvIGJlIHJlcGxhY2VkIHdpdGggaW4gdGhlIHJlc3VsdGluZyBzdHJpbmcuCisJICogZGVmYXVsdFZhbHVlIC0gT3B0aW9uYWwgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBkZWZhdWx0IHJldHVybiB2YWx1ZS4KKwkgKi8KKwlnZXQ6IGZ1bmN0aW9uKGtleSwgcGFyYW1zLCBkZWZhdWx0VmFsdWUpCisJeworCQl2YXIgdmFsdWUgPSBteFJlc291cmNlcy5yZXNvdXJjZXNba2V5XTsKKwkJCisJCS8vIEFwcGxpZXMgdGhlIGRlZmF1bHQgdmFsdWUgaWYgbm8gcmVzb3VyY2Ugd2FzIGZvdW5kCisJCWlmICh2YWx1ZSA9PSBudWxsKQorCQl7CisJCQl2YWx1ZSA9IGRlZmF1bHRWYWx1ZTsKKwkJfQorCQkKKwkJLy8gUmVwbGFjZXMgdGhlIHBsYWNlaG9sZGVycyB3aXRoIHRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5CisJCWlmICh2YWx1ZSAhPSBudWxsICYmIHBhcmFtcyAhPSBudWxsKQorCQl7CisJCQl2YWx1ZSA9IG14UmVzb3VyY2VzLnJlcGxhY2VQbGFjZWhvbGRlcnModmFsdWUsIHBhcmFtcyk7CisJCX0KKwkJCisJCXJldHVybiB2YWx1ZTsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IHJlcGxhY2VQbGFjZWhvbGRlcnMKKwkgKiAKKwkgKiBSZXBsYWNlcyB0aGUgZ2l2ZW4gcGxhY2Vob2xkZXJzIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiB2YWx1ZSAtIFN0cmluZyB0aGF0IGNvbnRhaW5zIHRoZSBwbGFjZWhvbGRlcnMuCisJICogcGFyYW1zIC0gQXJyYXkgb2YgdGhlIHZhbHVlcyBmb3IgdGhlIHBsYWNlaG9sZGVycyBvZiB0aGUgZm9ybSB7MX0uLi57bn0KKwkgKiB0byBiZSByZXBsYWNlZCB3aXRoIGluIHRoZSByZXN1bHRpbmcgc3RyaW5nLgorCSAqLworCXJlcGxhY2VQbGFjZWhvbGRlcnM6IGZ1bmN0aW9uKHZhbHVlLCBwYXJhbXMpCisJeworCQl2YXIgcmVzdWx0ID0gW107CisJCXZhciBpbmRleCA9IG51bGw7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKQorCQl7CisJCQl2YXIgYyA9IHZhbHVlLmNoYXJBdChpKTsKKworCQkJaWYgKGMgPT0gJ3snKQorCQkJeworCQkJCWluZGV4ID0gJyc7CisJCQl9CisJCQllbHNlIGlmIChpbmRleCAhPSBudWxsICYmIAljID09ICd9JykKKwkJCXsKKwkJCQlpbmRleCA9IHBhcnNlSW50KGluZGV4KS0xOworCQkJCQorCQkJCWlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgcGFyYW1zLmxlbmd0aCkKKwkJCQl7CisJCQkJCXJlc3VsdC5wdXNoKHBhcmFtc1tpbmRleF0pOworCQkJCX0KKwkJCQkKKwkJCQlpbmRleCA9IG51bGw7CisJCQl9CisJCQllbHNlIGlmIChpbmRleCAhPSBudWxsKQorCQkJeworCQkJCWluZGV4ICs9IGM7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmVzdWx0LnB1c2goYyk7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiByZXN1bHQuam9pbignJyk7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBsb2FkUmVzb3VyY2VzCisJICogCisJICogTG9hZHMgYWxsIHJlcXVpcmVkIHJlc291cmNlcyBhc3luY2hyb25vdXNseS4gVXNlIHRoaXMgdG8gbG9hZCB0aGUgZ3JhcGggYW5kCisJICogZWRpdG9yIHJlc291cmNlcyBpZiA8bXhMb2FkUmVzb3VyY2VzPiBpcyBmYWxzZS4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIGFzeW5jaHJvbm91cyBsb2FkaW5nLgorCSAqLworCWxvYWRSZXNvdXJjZXM6IGZ1bmN0aW9uKGNhbGxiYWNrKQorCXsKKwkJbXhSZXNvdXJjZXMuYWRkKG14Q2xpZW50LmJhc2VQYXRoKycvcmVzb3VyY2VzL2VkaXRvcicsIG51bGwsIGZ1bmN0aW9uKCkKKwkJeworCQkJbXhSZXNvdXJjZXMuYWRkKG14Q2xpZW50LmJhc2VQYXRoKycvcmVzb3VyY2VzL2dyYXBoJywgbnVsbCwgY2FsbGJhY2spOworCQl9KTsKKwl9CisKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teFN2Z0NhbnZhczJELmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhTdmdDYW52YXMyRC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGFlNmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhTdmdDYW52YXMyRC5qcwpAQCAtMCwwICsxLDIxNzkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14U3ZnQ2FudmFzMkQKKyAqCisgKiBFeHRlbmRzIDxteEFic3RyYWN0Q2FudmFzMkQ+IHRvIGltcGxlbWVudCBhIGNhbnZhcyBmb3IgU1ZHLiBUaGlzIGNhbnZhcyB3cml0ZXMgYWxsCisgKiBjYWxscyBhcyBTVkcgb3V0cHV0IHRvIHRoZSBnaXZlbiBTVkcgcm9vdCBub2RlLgorICogCisgKiAoY29kZSkKKyAqIHZhciBzdmdEb2MgPSBteFV0aWxzLmNyZWF0ZVhtbERvY3VtZW50KCk7CisgKiB2YXIgcm9vdCA9IChzdmdEb2MuY3JlYXRlRWxlbWVudE5TICE9IG51bGwpID8KKyAqIAkJc3ZnRG9jLmNyZWF0ZUVsZW1lbnROUyhteENvbnN0YW50cy5OU19TVkcsICdzdmcnKSA6IHN2Z0RvYy5jcmVhdGVFbGVtZW50KCdzdmcnKTsKKyAqIAorICogaWYgKHN2Z0RvYy5jcmVhdGVFbGVtZW50TlMgPT0gbnVsbCkKKyAqIHsKKyAqICAgcm9vdC5zZXRBdHRyaWJ1dGUoJ3htbG5zJywgbXhDb25zdGFudHMuTlNfU1ZHKTsKKyAqICAgcm9vdC5zZXRBdHRyaWJ1dGUoJ3htbG5zOnhsaW5rJywgbXhDb25zdGFudHMuTlNfWExJTkspOworICogfQorICogZWxzZQorICogeworICogICByb290LnNldEF0dHJpYnV0ZU5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLycsICd4bWxuczp4bGluaycsIG14Q29uc3RhbnRzLk5TX1hMSU5LKTsKKyAqIH0KKyAqIAorICogdmFyIGJvdW5kcyA9IGdyYXBoLmdldEdyYXBoQm91bmRzKCk7CisgKiByb290LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAoYm91bmRzLnggKyBib3VuZHMud2lkdGggKyA0KSArICdweCcpOworICogcm9vdC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIChib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgKyA0KSArICdweCcpOworICogcm9vdC5zZXRBdHRyaWJ1dGUoJ3ZlcnNpb24nLCAnMS4xJyk7CisgKiAKKyAqIHN2Z0RvYy5hcHBlbmRDaGlsZChyb290KTsKKyAqIAorICogdmFyIHN2Z0NhbnZhcyA9IG5ldyBteFN2Z0NhbnZhczJEKHJvb3QpOworICogKGVuZCkKKyAqIAorICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHVibGljIEFQSSBpcyBhdmFpbGFibGUgaW4gPG14WG1sQ2FudmFzMkQ+LgorICogCisgKiBUbyBkaXNhYmxlIGFudGktYWxpYXNpbmcgaW4gdGhlIG91dHB1dCwgdXNlIHRoZSBmb2xsb3dpbmcgY29kZS4KKyAqIAorICogKGNvZGUpCisgKiBncmFwaC52aWV3LmNhbnZhcy5vd25lclNWR0VsZW1lbnQuc2V0QXR0cmlidXRlKCdzaGFwZS1yZW5kZXJpbmcnLCAnY3Jpc3BFZGdlcycpOworICogKGVuZCkKKyAqIAorICogT3Igc2V0IHRoZSByZXNwZWN0aXZlIGF0dHJpYnV0ZSBpbiB0aGUgU1ZHIGVsZW1lbnQgZGlyZWN0bHkuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteFN2Z0NhbnZhczJECisgKgorICogQ29uc3RydWN0cyBhIG5ldyBTVkcgY2FudmFzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiByb290IC0gU1ZHIGNvbnRhaW5lciBmb3IgdGhlIG91dHB1dC4KKyAqIHN0eWxlRW5hYmxlZCAtIE9wdGlvbmFsIGJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgYSBzdHlsZSBzZWN0aW9uIHNob3VsZCBiZQorICogYWRkZWQuIFRoZSBzdHlsZSBzZWN0aW9uIHNldHMgdGhlIGRlZmF1bHQgZm9udC1zaXplLCBmb250LWZhbWlseSBhbmQKKyAqIHN0cm9rZS1taXRlcmxpbWl0IGdsb2JhbGx5LiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitmdW5jdGlvbiBteFN2Z0NhbnZhczJEKHJvb3QsIHN0eWxlRW5hYmxlZCkKK3sKKwlteEFic3RyYWN0Q2FudmFzMkQuY2FsbCh0aGlzKTsKKworCS8qKgorCSAqIFZhcmlhYmxlOiByb290CisJICogCisJICogUmVmZXJlbmNlIHRvIHRoZSBjb250YWluZXIgZm9yIHRoZSBTVkcgY29udGVudC4KKwkgKi8KKwl0aGlzLnJvb3QgPSByb290OworCisJLyoqCisJICogVmFyaWFibGU6IGdyYWRpZW50cworCSAqIAorCSAqIExvY2FsIGNhY2hlIG9mIGdyYWRpZW50cyBmb3IgcXVpY2sgbG9va3Vwcy4KKwkgKi8KKwl0aGlzLmdyYWRpZW50cyA9IFtdOworCisJLyoqCisJICogVmFyaWFibGU6IGRlZnMKKwkgKiAKKwkgKiBSZWZlcmVuY2UgdG8gdGhlIGRlZnMgc2VjdGlvbiBvZiB0aGUgU1ZHIGRvY3VtZW50LiBPbmx5IGZvciBleHBvcnQuCisJICovCisJdGhpcy5kZWZzID0gbnVsbDsKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogc3R5bGVFbmFibGVkCisJICogCisJICogU3RvcmVzIHRoZSB2YWx1ZSBvZiBzdHlsZUVuYWJsZWQgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKwkgKi8KKwl0aGlzLnN0eWxlRW5hYmxlZCA9IChzdHlsZUVuYWJsZWQgIT0gbnVsbCkgPyBzdHlsZUVuYWJsZWQgOiBmYWxzZTsKKwkKKwl2YXIgc3ZnID0gbnVsbDsKKwkKKwkvLyBBZGRzIG9wdGlvbmFsIGRlZnMgc2VjdGlvbiBmb3IgZXhwb3J0CisJaWYgKHJvb3Qub3duZXJEb2N1bWVudCAhPSBkb2N1bWVudCkKKwl7CisJCXZhciBub2RlID0gcm9vdDsKKworCQkvLyBGaW5kcyBvd25lciBTVkcgZWxlbWVudCBpbiBYTUwgRE9NCisJCXdoaWxlIChub2RlICE9IG51bGwgJiYgbm9kZS5ub2RlTmFtZSAhPSAnc3ZnJykKKwkJeworCQkJbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKKwkJfQorCQkKKwkJc3ZnID0gbm9kZTsKKwl9CisKKwlpZiAoc3ZnICE9IG51bGwpCisJeworCQkvLyBUcmllcyB0byBnZXQgZXhpc3RpbmcgZGVmcyBzZWN0aW9uCisJCXZhciB0bXAgPSBzdmcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RlZnMnKTsKKwkJCisJCWlmICh0bXAubGVuZ3RoID4gMCkKKwkJeworCQkJdGhpcy5kZWZzID0gc3ZnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdkZWZzJylbMF07CisJCX0KKwkJCisJCS8vIEFkZHMgZGVmcyBzZWN0aW9uIGlmIG5vbmUgZXhpc3RzCisJCWlmICh0aGlzLmRlZnMgPT0gbnVsbCkKKwkJeworCQkJdGhpcy5kZWZzID0gdGhpcy5jcmVhdGVFbGVtZW50KCdkZWZzJyk7CisJCQkKKwkJCWlmIChzdmcuZmlyc3RDaGlsZCAhPSBudWxsKQorCQkJeworCQkJCXN2Zy5pbnNlcnRCZWZvcmUodGhpcy5kZWZzLCBzdmcuZmlyc3RDaGlsZCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc3ZnLmFwcGVuZENoaWxkKHRoaXMuZGVmcyk7CisJCQl9CisJCX0KKworCQkvLyBBZGRzIHN0eWxlc2hlZXQKKwkJaWYgKHRoaXMuc3R5bGVFbmFibGVkKQorCQl7CisJCQl0aGlzLmRlZnMuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVTdHlsZSgpKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRXh0ZW5kcyBteEFic3RyYWN0Q2FudmFzMkQKKyAqLworbXhVdGlscy5leHRlbmQobXhTdmdDYW52YXMyRCwgbXhBYnN0cmFjdENhbnZhczJEKTsKKworLyoqCisgKiBDYXBhYmlsaXR5IGNoZWNrIGZvciBET00gcGFyc2VyLgorICovCisoZnVuY3Rpb24oKQoreworCW14U3ZnQ2FudmFzMkQucHJvdG90eXBlLnVzZURvbVBhcnNlciA9ICFteENsaWVudC5JU19JRSAmJiB0eXBlb2YgRE9NUGFyc2VyID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBYTUxTZXJpYWxpemVyID09PSAnZnVuY3Rpb24nOworCQorCWlmIChteFN2Z0NhbnZhczJELnByb3RvdHlwZS51c2VEb21QYXJzZXIpCisJeworCQkvLyBDaGVja3MgdXNpbmcgYSBnZW5lcmljIHRlc3QgdGV4dCBpZiB0aGUgcGFyc2luZyBhY3R1YWxseSB3b3Jrcy4gVGhpcyBpcyBhIHdvcmthcm91bmQKKwkJLy8gZm9yIG9sZGVyIGJyb3dzZXJzIHdoZXJlIHRoZSBjYXBhYmlsaXR5IGNoZWNrIHJldHVybnMgdHJ1ZSBidXQgdGhlIHBhcnNpbmcgZmFpbHMuCisJCXRyeQorCQl7CisJCQl2YXIgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZygndGVzdCB0ZXh0JywgJ3RleHQvaHRtbCcpOworCQkJbXhTdmdDYW52YXMyRC5wcm90b3R5cGUudXNlRG9tUGFyc2VyID0gZG9jICE9IG51bGw7CisJCX0KKwkJY2F0Y2ggKGUpCisJCXsKKwkJCW14U3ZnQ2FudmFzMkQucHJvdG90eXBlLnVzZURvbVBhcnNlciA9IGZhbHNlOworCQl9CisJfQorfSkoKTsKKworLyoqCisgKiBWYXJpYWJsZTogcGF0aAorICogCisgKiBIb2xkcyB0aGUgY3VycmVudCBET00gbm9kZS4KKyAqLworbXhTdmdDYW52YXMyRC5wcm90b3R5cGUubm9kZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IG1hdGNoSHRtbEFsaWdubWVudAorICogCisgKiBTcGVjaWZpZXMgaWYgcGxhaW4gdGV4dCBvdXRwdXQgc2hvdWxkIG1hdGNoIHRoZSB2ZXJ0aWNhbCBIVE1MIGFsaWdubWVudC4KKyAqIERlZmF1bCBpcyB0cnVlLgorICovCitteFN2Z0NhbnZhczJELnByb3RvdHlwZS5tYXRjaEh0bWxBbGlnbm1lbnQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiB0ZXh0RW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgdGV4dCBvdXRwdXQgc2hvdWxkIGJlIGVuYWJsZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhTdmdDYW52YXMyRC5wcm90b3R5cGUudGV4dEVuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBmb0VuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIHVzZSBvZiBmb3JlaWduT2JqZWN0IGZvciBIVE1MIG1hcmt1cCBpcyBhbGxvd2VkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLmZvRW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGZvQWx0VGV4dAorICogCisgKiBTcGVjaWZpZXMgdGhlIGZhbGxiYWNrIHRleHQgZm9yIHVuc3VwcG9ydGVkIGZvcmVpZ25PYmplY3RzIGluIGV4cG9ydGVkCisgKiBkb2N1bWVudHMuIERlZmF1bHQgaXMgJ1tPYmplY3RdJy4gSWYgdGhpcyBpcyBzZXQgdG8gbnVsbCB0aGVuIG5vIGZhbGxiYWNrCisgKiB0ZXh0IGlzIGFkZGVkIHRvIHRoZSBleHBvcnRlZCBkb2N1bWVudC4KKyAqLworbXhTdmdDYW52YXMyRC5wcm90b3R5cGUuZm9BbHRUZXh0ID0gJ1tPYmplY3RdJzsKKworLyoqCisgKiBWYXJpYWJsZTogZm9PZmZzZXQKKyAqIAorICogT2Zmc2V0IHRvIGJlIHVzZWQgZm9yIGZvcmVpZ25PYmplY3RzLgorICovCitteFN2Z0NhbnZhczJELnByb3RvdHlwZS5mb09mZnNldCA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IHRleHRPZmZzZXQKKyAqIAorICogT2Zmc2V0IHRvIGJlIHVzZWQgZm9yIHRleHQgZWxlbWVudHMuCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLnRleHRPZmZzZXQgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBpbWFnZU9mZnNldAorICogCisgKiBPZmZzZXQgdG8gYmUgdXNlZCBmb3IgaW1hZ2UgZWxlbWVudHMuCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLmltYWdlT2Zmc2V0ID0gMDsKKworLyoqCisgKiBWYXJpYWJsZTogc3Ryb2tlVG9sZXJhbmNlCisgKiAKKyAqIEFkZHMgdHJhbnNwYXJlbnQgcGF0aHMgZm9yIHN0cm9rZXMuCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLnN0cm9rZVRvbGVyYW5jZSA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IHJlZkNvdW50CisgKiAKKyAqIExvY2FsIGNvdW50ZXIgZm9yIHJlZmVyZW5jZXMgaW4gU1ZHIGV4cG9ydC4KKyAqLworbXhTdmdDYW52YXMyRC5wcm90b3R5cGUucmVmQ291bnQgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBibG9ja0ltYWdlUG9pbnRlckV2ZW50cworICogCisgKiBTcGVjaWZpZXMgaWYgYSB0cmFuc3BhcmVudCByZWN0YW5nbGUgc2hvdWxkIGJlIGFkZGVkIG9uIHRvcCBvZiBpbWFnZXMgdG8gYWJzb3JiCisgKiBhbGwgcG9pbnRlciBldmVudHMuIERlZmF1bHQgaXMgZmFsc2UuIFRoaXMgaXMgb25seSBuZWVkZWQgaW4gRmlyZWZveCB0byBkaXNhYmxlCisgKiBjb250cm9sLWNsaWNrcyBvbiBpbWFnZXMuCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLmJsb2NrSW1hZ2VQb2ludGVyRXZlbnRzID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGxpbmVIZWlnaHRDb3JyZWN0aW9uCisgKiAKKyAqIENvcnJlY3Rpb24gZmFjdG9yIGZvciA8bXhDb25zdGFudHMuTElORV9IRUlHSFQ+IGluIEhUTUwgb3V0cHV0LiBEZWZhdWx0IGlzIDEuCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLmxpbmVIZWlnaHRDb3JyZWN0aW9uID0gMTsKKworLyoqCisgKiBWYXJpYWJsZTogcG9pbnRlckV2ZW50c1ZhbHVlCisgKiAKKyAqIERlZmF1bHQgdmFsdWUgZm9yIGFjdGl2ZSBwb2ludGVyIGV2ZW50cy4gRGVmYXVsdCBpcyBhbGwuCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLnBvaW50ZXJFdmVudHNWYWx1ZSA9ICdhbGwnOworCisvKioKKyAqIFZhcmlhYmxlOiBmb250TWV0cmljc1BhZGRpbmcKKyAqIAorICogUGFkZGluZyB0byBiZSBhZGRlZCBmb3IgdGV4dCB0aGF0IGlzIG5vdCB3cmFwcGVkIHRvIGFjY291bnQgZm9yIGRpZmZlcmVuY2VzCisgKiBpbiBmb250IG1ldHJpY3Mgb24gZGlmZmVyZW50IHBsYXRmb3JtcyBpbiBwaXhlbHMuIERlZmF1bHQgaXMgMTAuCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLmZvbnRNZXRyaWNzUGFkZGluZyA9IDEwOworCisvKioKKyAqIFZhcmlhYmxlOiBjYWNoZU9mZnNldFNpemUKKyAqIAorICogU3BlY2lmaWVzIGlmIG9mZnNldFdpZHRoIGFuZCBvZmZzZXRIZWlnaHQgc2hvdWxkIGJlIGNhY2hlZC4gRGVmYXVsdCBpcyB0cnVlLgorICogVGhpcyBpcyB1c2VkIHRvIHNwZWVkIHVwIHJlcGFpbnQgb2YgdGV4dCBpbiA8dXBkYXRlVGV4dD4uCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLmNhY2hlT2Zmc2V0U2l6ZSA9IHRydWU7CisKKy8qKgorICogRnVuY3Rpb246IGZvcm1hdAorICogCisgKiBSb3VuZHMgYWxsIG51bWJlcnMgdG8gMiBkZWNpbWFsIHBvaW50cy4KKyAqLworbXhTdmdDYW52YXMyRC5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24odmFsdWUpCit7CisJcmV0dXJuIHBhcnNlRmxvYXQocGFyc2VGbG9hdCh2YWx1ZSkudG9GaXhlZCgyKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRCYXNlVXJsCisgKiAKKyAqIFJldHVybnMgdGhlIFVSTCBvZiB0aGUgcGFnZSB3aXRob3V0IHRoZSBoYXNoIHBhcnQuIFRoaXMgbmVlZHMgdG8gdXNlIGhyZWYgdG8KKyAqIGluY2x1ZGUgYW55IHNlYXJjaCBwYXJ0IHdpdGggbm8gcGFyYW1zIChpZSBxdWVzdGlvbiBtYXJrIGFsb25lKS4gVGhpcyBpcyBhCisgKiB3b3JrYXJvdW5kIGZvciB0aGUgZmFjdCB0aGF0IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggaXMgZW1wdHkgaWYgdGhlcmUgaXMKKyAqIG5vIHNlYXJjaCBzdHJpbmcgYmVoaW5kIHRoZSBxdWVzdGlvbiBtYXJrLgorICovCitteFN2Z0NhbnZhczJELnByb3RvdHlwZS5nZXRCYXNlVXJsID0gZnVuY3Rpb24oKQoreworCXZhciBocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CisJdmFyIGhhc2ggPSBocmVmLmxhc3RJbmRleE9mKCcjJyk7CisJCisJaWYgKGhhc2ggPiAwKQorCXsKKwkJaHJlZiA9IGhyZWYuc3Vic3RyaW5nKDAsIGhhc2gpOworCX0KKwkKKwlyZXR1cm4gaHJlZjsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlc2V0CisgKiAKKyAqIFJldHVybnMgYW55IG9mZnNldHMgZm9yIHJlbmRlcmluZyBwaXhlbHMuCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKQoreworCW14QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUucmVzZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl0aGlzLmdyYWRpZW50cyA9IFtdOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlU3R5bGUKKyAqIAorICogQ3JlYXRlcyB0aGUgb3B0aW9uYWwgc3R5bGUgc2VjdGlvbi4KKyAqLworbXhTdmdDYW52YXMyRC5wcm90b3R5cGUuY3JlYXRlU3R5bGUgPSBmdW5jdGlvbih4KQoreworCXZhciBzdHlsZSA9IHRoaXMuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKKwlzdHlsZS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9jc3MnKTsKKwlteFV0aWxzLndyaXRlKHN0eWxlLCAnc3Zne2ZvbnQtZmFtaWx5OicgKyBteENvbnN0YW50cy5ERUZBVUxUX0ZPTlRGQU1JTFkgKworCQkJJztmb250LXNpemU6JyArIG14Q29uc3RhbnRzLkRFRkFVTFRfRk9OVFNJWkUgKworCQkJJztmaWxsOm5vbmU7c3Ryb2tlLW1pdGVybGltaXQ6MTB9Jyk7CisJCisJcmV0dXJuIHN0eWxlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlRWxlbWVudAorICogCisgKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgU1ZHIGVsZW1lbnRzCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbih0YWdOYW1lLCBuYW1lc3BhY2UpCit7CisJaWYgKHRoaXMucm9vdC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyAhPSBudWxsKQorCXsKKwkJcmV0dXJuIHRoaXMucm9vdC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UgfHwgbXhDb25zdGFudHMuTlNfU1ZHLCB0YWdOYW1lKTsKKwl9CisJZWxzZQorCXsKKwkJdmFyIGVsdCA9IHRoaXMucm9vdC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7CisJCQorCQlpZiAobmFtZXNwYWNlICE9IG51bGwpCisJCXsKKwkJCWVsdC5zZXRBdHRyaWJ1dGUoJ3htbG5zJywgbmFtZXNwYWNlKTsKKwkJfQorCQkKKwkJcmV0dXJuIGVsdDsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRBbHRlcm5hdGVDb250ZW50CisgKiAKKyAqIFJldHVybnMgdGhlIGFsdGVybmF0ZSBjb250ZW50IGZvciB0aGUgZ2l2ZW4gZm9yZWlnbk9iamVjdC4KKyAqLworbXhTdmdDYW52YXMyRC5wcm90b3R5cGUuY3JlYXRlQWx0ZXJuYXRlQ29udGVudCA9IGZ1bmN0aW9uKGZvLCB4LCB5LCB3LCBoLCBzdHIsIGFsaWduLCB2YWxpZ24sIHdyYXAsIGZvcm1hdCwgb3ZlcmZsb3csIGNsaXAsIHJvdGF0aW9uKQoreworCWlmICh0aGlzLmZvQWx0VGV4dCAhPSBudWxsKQorCXsKKwkJdmFyIHMgPSB0aGlzLnN0YXRlOworCQl2YXIgYWx0ID0gdGhpcy5jcmVhdGVFbGVtZW50KCd0ZXh0Jyk7CisJCWFsdC5zZXRBdHRyaWJ1dGUoJ3gnLCBNYXRoLnJvdW5kKHcgLyAyKSk7CisJCWFsdC5zZXRBdHRyaWJ1dGUoJ3knLCBNYXRoLnJvdW5kKChoICsgcy5mb250U2l6ZSkgLyAyKSk7CisJCWFsdC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBzLmZvbnRDb2xvciB8fCAnYmxhY2snKTsKKwkJYWx0LnNldEF0dHJpYnV0ZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJyk7CisJCWFsdC5zZXRBdHRyaWJ1dGUoJ2ZvbnQtc2l6ZScsIHMuZm9udFNpemUgKyAncHgnKTsKKwkJYWx0LnNldEF0dHJpYnV0ZSgnZm9udC1mYW1pbHknLCBzLmZvbnRGYW1pbHkpOworCQkKKwkJaWYgKChzLmZvbnRTdHlsZSAmIG14Q29uc3RhbnRzLkZPTlRfQk9MRCkgPT0gbXhDb25zdGFudHMuRk9OVF9CT0xEKQorCQl7CisJCQlhbHQuc2V0QXR0cmlidXRlKCdmb250LXdlaWdodCcsICdib2xkJyk7CisJCX0KKwkJCisJCWlmICgocy5mb250U3R5bGUgJiBteENvbnN0YW50cy5GT05UX0lUQUxJQykgPT0gbXhDb25zdGFudHMuRk9OVF9JVEFMSUMpCisJCXsKKwkJCWFsdC5zZXRBdHRyaWJ1dGUoJ2ZvbnQtc3R5bGUnLCAnaXRhbGljJyk7CisJCX0KKwkJCisJCWlmICgocy5mb250U3R5bGUgJiBteENvbnN0YW50cy5GT05UX1VOREVSTElORSkgPT0gbXhDb25zdGFudHMuRk9OVF9VTkRFUkxJTkUpCisJCXsKKwkJCWFsdC5zZXRBdHRyaWJ1dGUoJ3RleHQtZGVjb3JhdGlvbicsICd1bmRlcmxpbmUnKTsKKwkJfQorCQkKKwkJbXhVdGlscy53cml0ZShhbHQsIHRoaXMuZm9BbHRUZXh0KTsKKwkJCisJCXJldHVybiBhbHQ7CisJfQorCWVsc2UKKwl7CisJCXJldHVybiBudWxsOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUdyYWRpZW50SWQKKyAqIAorICogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIFNWRyBlbGVtZW50cworICovCitteFN2Z0NhbnZhczJELnByb3RvdHlwZS5jcmVhdGVHcmFkaWVudElkID0gZnVuY3Rpb24oc3RhcnQsIGVuZCwgYWxwaGExLCBhbHBoYTIsIGRpcmVjdGlvbikKK3sKKwkvLyBSZW1vdmVzIGlsbGVnYWwgY2hhcmFjdGVycyBmcm9tIGdyYWRpZW50IElECisJaWYgKHN0YXJ0LmNoYXJBdCgwKSA9PSAnIycpCisJeworCQlzdGFydCA9IHN0YXJ0LnN1YnN0cmluZygxKTsKKwl9CisJCisJaWYgKGVuZC5jaGFyQXQoMCkgPT0gJyMnKQorCXsKKwkJZW5kID0gZW5kLnN1YnN0cmluZygxKTsKKwl9CisJCisJLy8gV29ya2Fyb3VuZCBmb3IgZ3JhZGllbnQgSURzIG5vdCB3b3JraW5nIGluIFNhZmFyaSA1IC8gQ2hyb21lIDYKKwkvLyBpZiB0aGV5IGNvbnRhaW4gdXBwZXJjYXNlIGNoYXJhY3RlcnMKKwlzdGFydCA9IHN0YXJ0LnRvTG93ZXJDYXNlKCkgKyAnLScgKyBhbHBoYTE7CisJZW5kID0gZW5kLnRvTG93ZXJDYXNlKCkgKyAnLScgKyBhbHBoYTI7CisKKwkvLyBXcm9uZyBncmFkaWVudCBkaXJlY3Rpb25zIHBvc3NpYmxlPworCXZhciBkaXIgPSBudWxsOworCQorCWlmIChkaXJlY3Rpb24gPT0gbnVsbCB8fCBkaXJlY3Rpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX1NPVVRIKQorCXsKKwkJZGlyID0gJ3MnOworCX0KKwllbHNlIGlmIChkaXJlY3Rpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX0VBU1QpCisJeworCQlkaXIgPSAnZSc7CisJfQorCWVsc2UKKwl7CisJCXZhciB0bXAgPSBzdGFydDsKKwkJc3RhcnQgPSBlbmQ7CisJCWVuZCA9IHRtcDsKKwkJCisJCWlmIChkaXJlY3Rpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX05PUlRIKQorCQl7CisJCQlkaXIgPSAncyc7CisJCX0KKwkJZWxzZSBpZiAoZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9XRVNUKQorCQl7CisJCQlkaXIgPSAnZSc7CisJCX0KKwl9CisJCisJcmV0dXJuICdteC1ncmFkaWVudC0nICsgc3RhcnQgKyAnLScgKyBlbmQgKyAnLScgKyBkaXI7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTdmdHcmFkaWVudAorICogCisgKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgU1ZHIGVsZW1lbnRzCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLmdldFN2Z0dyYWRpZW50ID0gZnVuY3Rpb24oc3RhcnQsIGVuZCwgYWxwaGExLCBhbHBoYTIsIGRpcmVjdGlvbikKK3sKKwl2YXIgaWQgPSB0aGlzLmNyZWF0ZUdyYWRpZW50SWQoc3RhcnQsIGVuZCwgYWxwaGExLCBhbHBoYTIsIGRpcmVjdGlvbik7CisJdmFyIGdyYWRpZW50ID0gdGhpcy5ncmFkaWVudHNbaWRdOworCQorCWlmIChncmFkaWVudCA9PSBudWxsKQorCXsKKwkJdmFyIHN2ZyA9IHRoaXMucm9vdC5vd25lclNWR0VsZW1lbnQ7CisKKwkJdmFyIGNvdW50ZXIgPSAwOworCQl2YXIgdG1wSWQgPSBpZCArICctJyArIGNvdW50ZXI7CisKKwkJaWYgKHN2ZyAhPSBudWxsKQorCQl7CisJCQlncmFkaWVudCA9IHN2Zy5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRtcElkKTsKKwkJCQorCQkJd2hpbGUgKGdyYWRpZW50ICE9IG51bGwgJiYgZ3JhZGllbnQub3duZXJTVkdFbGVtZW50ICE9IHN2ZykKKwkJCXsKKwkJCQl0bXBJZCA9IGlkICsgJy0nICsgY291bnRlcisrOworCQkJCWdyYWRpZW50ID0gc3ZnLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodG1wSWQpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJLy8gVXNlcyBzaG9ydGVyIElEcyBmb3IgZXhwb3J0CisJCQl0bXBJZCA9ICdpZCcgKyAoKyt0aGlzLnJlZkNvdW50KTsKKwkJfQorCQkKKwkJaWYgKGdyYWRpZW50ID09IG51bGwpCisJCXsKKwkJCWdyYWRpZW50ID0gdGhpcy5jcmVhdGVTdmdHcmFkaWVudChzdGFydCwgZW5kLCBhbHBoYTEsIGFscGhhMiwgZGlyZWN0aW9uKTsKKwkJCWdyYWRpZW50LnNldEF0dHJpYnV0ZSgnaWQnLCB0bXBJZCk7CisJCQkKKwkJCWlmICh0aGlzLmRlZnMgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLmRlZnMuYXBwZW5kQ2hpbGQoZ3JhZGllbnQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXN2Zy5hcHBlbmRDaGlsZChncmFkaWVudCk7CisJCQl9CisJCX0KKworCQl0aGlzLmdyYWRpZW50c1tpZF0gPSBncmFkaWVudDsKKwl9CisKKwlyZXR1cm4gZ3JhZGllbnQuZ2V0QXR0cmlidXRlKCdpZCcpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlU3ZnR3JhZGllbnQKKyAqIAorICogQ3JlYXRlcyB0aGUgZ2l2ZW4gU1ZHIGdyYWRpZW50LgorICovCitteFN2Z0NhbnZhczJELnByb3RvdHlwZS5jcmVhdGVTdmdHcmFkaWVudCA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGFscGhhMSwgYWxwaGEyLCBkaXJlY3Rpb24pCit7CisJdmFyIGdyYWRpZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KCdsaW5lYXJHcmFkaWVudCcpOworCWdyYWRpZW50LnNldEF0dHJpYnV0ZSgneDEnLCAnMCUnKTsKKwlncmFkaWVudC5zZXRBdHRyaWJ1dGUoJ3kxJywgJzAlJyk7CisJZ3JhZGllbnQuc2V0QXR0cmlidXRlKCd4MicsICcwJScpOworCWdyYWRpZW50LnNldEF0dHJpYnV0ZSgneTInLCAnMCUnKTsKKwkKKwlpZiAoZGlyZWN0aW9uID09IG51bGwgfHwgZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9TT1VUSCkKKwl7CisJCWdyYWRpZW50LnNldEF0dHJpYnV0ZSgneTInLCAnMTAwJScpOworCX0KKwllbHNlIGlmIChkaXJlY3Rpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX0VBU1QpCisJeworCQlncmFkaWVudC5zZXRBdHRyaWJ1dGUoJ3gyJywgJzEwMCUnKTsKKwl9CisJZWxzZSBpZiAoZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9OT1JUSCkKKwl7CisJCWdyYWRpZW50LnNldEF0dHJpYnV0ZSgneTEnLCAnMTAwJScpOworCX0KKwllbHNlIGlmIChkaXJlY3Rpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX1dFU1QpCisJeworCQlncmFkaWVudC5zZXRBdHRyaWJ1dGUoJ3gxJywgJzEwMCUnKTsKKwl9CisJCisJdmFyIG9wID0gKGFscGhhMSA8IDEpID8gJztzdG9wLW9wYWNpdHk6JyArIGFscGhhMSA6ICcnOworCQorCXZhciBzdG9wID0gdGhpcy5jcmVhdGVFbGVtZW50KCdzdG9wJyk7CisJc3RvcC5zZXRBdHRyaWJ1dGUoJ29mZnNldCcsICcwJScpOworCXN0b3Auc2V0QXR0cmlidXRlKCdzdHlsZScsICdzdG9wLWNvbG9yOicgKyBzdGFydCArIG9wKTsKKwlncmFkaWVudC5hcHBlbmRDaGlsZChzdG9wKTsKKwkKKwlvcCA9IChhbHBoYTIgPCAxKSA/ICc7c3RvcC1vcGFjaXR5OicgKyBhbHBoYTIgOiAnJzsKKwkKKwlzdG9wID0gdGhpcy5jcmVhdGVFbGVtZW50KCdzdG9wJyk7CisJc3RvcC5zZXRBdHRyaWJ1dGUoJ29mZnNldCcsICcxMDAlJyk7CisJc3RvcC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3N0b3AtY29sb3I6JyArIGVuZCArIG9wKTsKKwlncmFkaWVudC5hcHBlbmRDaGlsZChzdG9wKTsKKwkKKwlyZXR1cm4gZ3JhZGllbnQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGROb2RlCisgKiAKKyAqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBTVkcgZWxlbWVudHMKKyAqLworbXhTdmdDYW52YXMyRC5wcm90b3R5cGUuYWRkTm9kZSA9IGZ1bmN0aW9uKGZpbGxlZCwgc3Ryb2tlZCkKK3sKKwl2YXIgbm9kZSA9IHRoaXMubm9kZTsKKwl2YXIgcyA9IHRoaXMuc3RhdGU7CisKKwlpZiAobm9kZSAhPSBudWxsKQorCXsKKwkJaWYgKG5vZGUubm9kZU5hbWUgPT0gJ3BhdGgnKQorCQl7CisJCQkvLyBDaGVja3MgaWYgdGhlIHBhdGggaXMgbm90IGVtcHR5CisJCQlpZiAodGhpcy5wYXRoICE9IG51bGwgJiYgdGhpcy5wYXRoLmxlbmd0aCA+IDApCisJCQl7CisJCQkJbm9kZS5zZXRBdHRyaWJ1dGUoJ2QnLCB0aGlzLnBhdGguam9pbignICcpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlpZiAoZmlsbGVkICYmIHMuZmlsbENvbG9yICE9IG51bGwpCisJCXsKKwkJCXRoaXMudXBkYXRlRmlsbCgpOworCQl9CisJCWVsc2UgaWYgKCF0aGlzLnN0eWxlRW5hYmxlZCkKKwkJeworCQkJLy8gV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODE0OTUyCisJCQlpZiAobm9kZS5ub2RlTmFtZSA9PSAnZWxsaXBzZScgJiYgbXhDbGllbnQuSVNfRkYpCisJCQl7CisJCQkJbm9kZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAndHJhbnNwYXJlbnQnKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlub2RlLnNldEF0dHJpYnV0ZSgnZmlsbCcsICdub25lJyk7CisJCQl9CisJCQkKKwkJCS8vIFNldHMgdGhlIGFjdHVhbCBmaWxsZWQgc3RhdGUgZm9yIHN0cm9rZSB0b2xlcmFuY2UKKwkJCWZpbGxlZCA9IGZhbHNlOworCQl9CisJCQorCQlpZiAoc3Ryb2tlZCAmJiBzLnN0cm9rZUNvbG9yICE9IG51bGwpCisJCXsKKwkJCXRoaXMudXBkYXRlU3Ryb2tlKCk7CisJCX0KKwkJZWxzZSBpZiAoIXRoaXMuc3R5bGVFbmFibGVkKQorCQl7CisJCQlub2RlLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgJ25vbmUnKTsKKwkJfQorCQkKKwkJaWYgKHMudHJhbnNmb3JtICE9IG51bGwgJiYgcy50cmFuc2Zvcm0ubGVuZ3RoID4gMCkKKwkJeworCQkJbm9kZS5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIHMudHJhbnNmb3JtKTsKKwkJfQorCQkKKwkJaWYgKHMuc2hhZG93KQorCQl7CisJCQl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVTaGFkb3cobm9kZSkpOworCQl9CisJCisJCS8vIEFkZHMgc3Ryb2tlIHRvbGVyYW5jZQorCQlpZiAodGhpcy5zdHJva2VUb2xlcmFuY2UgPiAwICYmICFmaWxsZWQpCisJCXsKKwkJCXRoaXMucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZVRvbGVyYW5jZShub2RlKSk7CisJCX0KKworCQkvLyBBZGRzIHBvaW50ZXIgZXZlbnRzCisJCWlmICh0aGlzLnBvaW50ZXJFdmVudHMgJiYgKG5vZGUubm9kZU5hbWUgIT0gJ3BhdGgnIHx8CisJCQl0aGlzLnBhdGhbdGhpcy5wYXRoLmxlbmd0aCAtIDFdID09IHRoaXMuY2xvc2VPcCkpCisJCXsKKwkJCW5vZGUuc2V0QXR0cmlidXRlKCdwb2ludGVyLWV2ZW50cycsIHRoaXMucG9pbnRlckV2ZW50c1ZhbHVlKTsKKwkJfQorCQkvLyBFbmFibGVzIGNsaWNrcyBmb3Igbm9kZXMgaW5zaWRlIGEgbGluayBlbGVtZW50CisJCWVsc2UgaWYgKCF0aGlzLnBvaW50ZXJFdmVudHMgJiYgdGhpcy5vcmlnaW5hbFJvb3QgPT0gbnVsbCkKKwkJeworCQkJbm9kZS5zZXRBdHRyaWJ1dGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTsKKwkJfQorCQkKKwkJLy8gUmVtb3ZlcyBpbnZpc2libGUgbm9kZXMgZnJvbSBvdXRwdXQgaWYgdGhleSBkb24ndCBoYW5kbGUgZXZlbnRzCisJCWlmICgobm9kZS5ub2RlTmFtZSAhPSAncmVjdCcgJiYgbm9kZS5ub2RlTmFtZSAhPSAncGF0aCcgJiYgbm9kZS5ub2RlTmFtZSAhPSAnZWxsaXBzZScpIHx8CisJCQkobm9kZS5nZXRBdHRyaWJ1dGUoJ2ZpbGwnKSAhPSAnbm9uZScgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoJ2ZpbGwnKSAhPSAndHJhbnNwYXJlbnQnKSB8fAorCQkJbm9kZS5nZXRBdHRyaWJ1dGUoJ3N0cm9rZScpICE9ICdub25lJyB8fCBub2RlLmdldEF0dHJpYnV0ZSgncG9pbnRlci1ldmVudHMnKSAhPSAnbm9uZScpCisJCXsKKwkJCS8vIExBVEVSOiBVcGRhdGUgZXhpc3RpbmcgRE9NIGZvciBwZXJmb3JtYW5jZQkJCisJCQl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQobm9kZSk7CisJCX0KKwkJCisJCXRoaXMubm9kZSA9IG51bGw7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlRmlsbAorICogCisgKiBUcmFuc2ZlcnMgdGhlIHN0cm9rZSBhdHRyaWJ1dGVzIGZyb20gPHN0YXRlPiB0byA8bm9kZT4uCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLnVwZGF0ZUZpbGwgPSBmdW5jdGlvbigpCit7CisJdmFyIHMgPSB0aGlzLnN0YXRlOworCQorCWlmIChzLmFscGhhIDwgMSB8fCBzLmZpbGxBbHBoYSA8IDEpCisJeworCQl0aGlzLm5vZGUuc2V0QXR0cmlidXRlKCdmaWxsLW9wYWNpdHknLCBzLmFscGhhICogcy5maWxsQWxwaGEpOworCX0KKwkKKwlpZiAocy5maWxsQ29sb3IgIT0gbnVsbCkKKwl7CisJCWlmIChzLmdyYWRpZW50Q29sb3IgIT0gbnVsbCkKKwkJeworCQkJdmFyIGlkID0gdGhpcy5nZXRTdmdHcmFkaWVudChzLmZpbGxDb2xvciwgcy5ncmFkaWVudENvbG9yLCBzLmdyYWRpZW50RmlsbEFscGhhLCBzLmdyYWRpZW50QWxwaGEsIHMuZ3JhZGllbnREaXJlY3Rpb24pOworCQkJCisJCQlpZiAoIW14Q2xpZW50LklTX0NIUk9NRV9BUFAgJiYgIW14Q2xpZW50LklTX0lFICYmICFteENsaWVudC5JU19JRTExICYmCisJCQkJIW14Q2xpZW50LklTX0VER0UgJiYgdGhpcy5yb290Lm93bmVyRG9jdW1lbnQgPT0gZG9jdW1lbnQpCisJCQl7CisJCQkJLy8gV29ya2Fyb3VuZCBmb3IgcG90ZW50aWFsIGJhc2UgdGFnIGFuZCBicmFja2V0cyBtdXN0IGJlIGVzY2FwZWQKKwkJCQl2YXIgYmFzZSA9IHRoaXMuZ2V0QmFzZVVybCgpLnJlcGxhY2UoLyhbXChcKV0pL2csICdcXCQxJyk7CisJCQkJdGhpcy5ub2RlLnNldEF0dHJpYnV0ZSgnZmlsbCcsICd1cmwoJyArIGJhc2UgKyAnIycgKyBpZCArICcpJyk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdGhpcy5ub2RlLnNldEF0dHJpYnV0ZSgnZmlsbCcsICd1cmwoIycgKyBpZCArICcpJyk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLm5vZGUuc2V0QXR0cmlidXRlKCdmaWxsJywgcy5maWxsQ29sb3IudG9Mb3dlckNhc2UoKSk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDdXJyZW50U3Ryb2tlV2lkdGgKKyAqIAorICogUmV0dXJucyB0aGUgY3VycmVudCBzdHJva2Ugd2lkdGggKD49IDEpLCBpZS4gbWF4KDEsIHRoaXMuZm9ybWF0KHRoaXMuc3RhdGUuc3Ryb2tlV2lkdGggKiB0aGlzLnN0YXRlLnNjYWxlKSkuCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLmdldEN1cnJlbnRTdHJva2VXaWR0aCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gTWF0aC5tYXgoMSwgdGhpcy5mb3JtYXQodGhpcy5zdGF0ZS5zdHJva2VXaWR0aCAqIHRoaXMuc3RhdGUuc2NhbGUpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZVN0cm9rZQorICogCisgKiBUcmFuc2ZlcnMgdGhlIHN0cm9rZSBhdHRyaWJ1dGVzIGZyb20gPHN0YXRlPiB0byA8bm9kZT4uCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLnVwZGF0ZVN0cm9rZSA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgcyA9IHRoaXMuc3RhdGU7CisKKwl0aGlzLm5vZGUuc2V0QXR0cmlidXRlKCdzdHJva2UnLCBzLnN0cm9rZUNvbG9yLnRvTG93ZXJDYXNlKCkpOworCQorCWlmIChzLmFscGhhIDwgMSB8fCBzLnN0cm9rZUFscGhhIDwgMSkKKwl7CisJCXRoaXMubm9kZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1vcGFjaXR5Jywgcy5hbHBoYSAqIHMuc3Ryb2tlQWxwaGEpOworCX0KKwkKKwl2YXIgc3cgPSB0aGlzLmdldEN1cnJlbnRTdHJva2VXaWR0aCgpOworCQorCWlmIChzdyAhPSAxKQorCXsKKwkJdGhpcy5ub2RlLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgc3cpOworCX0KKwkKKwlpZiAodGhpcy5ub2RlLm5vZGVOYW1lID09ICdwYXRoJykKKwl7CisJCXRoaXMudXBkYXRlU3Ryb2tlQXR0cmlidXRlcygpOworCX0KKwkKKwlpZiAocy5kYXNoZWQpCisJeworCQl0aGlzLm5vZGUuc2V0QXR0cmlidXRlKCdzdHJva2UtZGFzaGFycmF5JywgdGhpcy5jcmVhdGVEYXNoUGF0dGVybigKKwkJCSgocy5maXhEYXNoKSA/IDEgOiBzLnN0cm9rZVdpZHRoKSAqIHMuc2NhbGUpKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1cGRhdGVTdHJva2VBdHRyaWJ1dGVzCisgKiAKKyAqIFRyYW5zZmVycyB0aGUgc3Ryb2tlIGF0dHJpYnV0ZXMgZnJvbSA8c3RhdGU+IHRvIDxub2RlPi4KKyAqLworbXhTdmdDYW52YXMyRC5wcm90b3R5cGUudXBkYXRlU3Ryb2tlQXR0cmlidXRlcyA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgcyA9IHRoaXMuc3RhdGU7CisJCisJLy8gTGluZWpvaW4gbWl0ZXIgaXMgZGVmYXVsdCBpbiBTVkcKKwlpZiAocy5saW5lSm9pbiAhPSBudWxsICYmIHMubGluZUpvaW4gIT0gJ21pdGVyJykKKwl7CisJCXRoaXMubm9kZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lam9pbicsIHMubGluZUpvaW4pOworCX0KKwkKKwlpZiAocy5saW5lQ2FwICE9IG51bGwpCisJeworCQkvLyBmbGF0IGlzIGNhbGxlZCBidXR0IGluIFNWRworCQl2YXIgdmFsdWUgPSBzLmxpbmVDYXA7CisJCQorCQlpZiAodmFsdWUgPT0gJ2ZsYXQnKQorCQl7CisJCQl2YWx1ZSA9ICdidXR0JzsKKwkJfQorCQkKKwkJLy8gTGluZWNhcCBidXR0IGlzIGRlZmF1bHQgaW4gU1ZHCisJCWlmICh2YWx1ZSAhPSAnYnV0dCcpCisJCXsKKwkJCXRoaXMubm9kZS5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS1saW5lY2FwJywgdmFsdWUpOworCQl9CisJfQorCQorCS8vIE1pdGVybGltaXQgMTAgaXMgZGVmYXVsdCBpbiBvdXIgZG9jdW1lbnQKKwlpZiAocy5taXRlckxpbWl0ICE9IG51bGwgJiYgKCF0aGlzLnN0eWxlRW5hYmxlZCB8fCBzLm1pdGVyTGltaXQgIT0gMTApKQorCXsKKwkJdGhpcy5ub2RlLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLW1pdGVybGltaXQnLCBzLm1pdGVyTGltaXQpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZURhc2hQYXR0ZXJuCisgKiAKKyAqIENyZWF0ZXMgdGhlIFNWRyBkYXNoIHBhdHRlcm4gZm9yIHRoZSBnaXZlbiBzdGF0ZS4KKyAqLworbXhTdmdDYW52YXMyRC5wcm90b3R5cGUuY3JlYXRlRGFzaFBhdHRlcm4gPSBmdW5jdGlvbihzY2FsZSkKK3sKKwl2YXIgcGF0ID0gW107CisJCisJaWYgKHR5cGVvZih0aGlzLnN0YXRlLmRhc2hQYXR0ZXJuKSA9PT0gJ3N0cmluZycpCisJeworCQl2YXIgZGFzaCA9IHRoaXMuc3RhdGUuZGFzaFBhdHRlcm4uc3BsaXQoJyAnKTsKKwkJCisJCWlmIChkYXNoLmxlbmd0aCA+IDApCisJCXsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgZGFzaC5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQlwYXRbaV0gPSBOdW1iZXIoZGFzaFtpXSkgKiBzY2FsZTsKKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gcGF0LmpvaW4oJyAnKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVRvbGVyYW5jZQorICogCisgKiBDcmVhdGVzIGEgaGl0IGRldGVjdGlvbiB0b2xlcmFuY2Ugc2hhcGUgZm9yIHRoZSBnaXZlbiBub2RlLgorICovCitteFN2Z0NhbnZhczJELnByb3RvdHlwZS5jcmVhdGVUb2xlcmFuY2UgPSBmdW5jdGlvbihub2RlKQoreworCXZhciB0b2wgPSBub2RlLmNsb25lTm9kZSh0cnVlKTsKKwl2YXIgc3cgPSBwYXJzZUZsb2F0KHRvbC5nZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcpIHx8IDEpICsgdGhpcy5zdHJva2VUb2xlcmFuY2U7CisJdG9sLnNldEF0dHJpYnV0ZSgncG9pbnRlci1ldmVudHMnLCAnc3Ryb2tlJyk7CisJdG9sLnNldEF0dHJpYnV0ZSgndmlzaWJpbGl0eScsICdoaWRkZW4nKTsKKwl0b2wucmVtb3ZlQXR0cmlidXRlKCdzdHJva2UtZGFzaGFycmF5Jyk7CisJdG9sLnNldEF0dHJpYnV0ZSgnc3Ryb2tlLXdpZHRoJywgc3cpOworCXRvbC5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCAnbm9uZScpOworCQorCS8vIFdvcmthcm91bmQgZm9yIE9wZXJhIGlnbm9yaW5nIHRoZSB2aXNpYmxpdHkgYXR0cmlidXRlIGFib3ZlIHdoaWxlCisJLy8gb3RoZXIgYnJvd3NlcnMgbmVlZCBhIHN0cm9rZSBjb2xvciB0byBwZXJmb3JtIHRoZSBoaXQtZGV0ZWN0aW9uIGJ1dAorCS8vIGRvIG5vdCBpZ25vcmUgdGhlIHZpc2liaWxpdHkgYXR0cmlidXRlLiBTaWRlLWVmZmVjdCBpcyB0aGF0IE9wZXJhJ3MKKwkvLyBoaXQgZGV0ZWN0aW9uIGZvciBob3Jpem9udGFsL3ZlcnRpY2FsIGVkZ2VzIHNlZW1zIHRvIGlnbm9yZSB0aGUgdG9sLgorCXRvbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIChteENsaWVudC5JU19PVCkgPyAnbm9uZScgOiAnd2hpdGUnKTsKKwkKKwlyZXR1cm4gdG9sOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlU2hhZG93CisgKiAKKyAqIENyZWF0ZXMgYSBzaGFkb3cgZm9yIHRoZSBnaXZlbiBub2RlLgorICovCitteFN2Z0NhbnZhczJELnByb3RvdHlwZS5jcmVhdGVTaGFkb3cgPSBmdW5jdGlvbihub2RlKQoreworCXZhciBzaGFkb3cgPSBub2RlLmNsb25lTm9kZSh0cnVlKTsKKwl2YXIgcyA9IHRoaXMuc3RhdGU7CisKKwkvLyBGaXJlZm94IHVzZXMgdHJhbnNwYXJlbnQgZm9yIG5vIGZpbGwgaW4gZWxsaXBzZXMKKwlpZiAoc2hhZG93LmdldEF0dHJpYnV0ZSgnZmlsbCcpICE9ICdub25lJyAmJiAoIW14Q2xpZW50LklTX0ZGIHx8IHNoYWRvdy5nZXRBdHRyaWJ1dGUoJ2ZpbGwnKSAhPSAndHJhbnNwYXJlbnQnKSkKKwl7CisJCXNoYWRvdy5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBzLnNoYWRvd0NvbG9yKTsKKwl9CisJCisJaWYgKHNoYWRvdy5nZXRBdHRyaWJ1dGUoJ3N0cm9rZScpICE9ICdub25lJykKKwl7CisJCXNoYWRvdy5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHMuc2hhZG93Q29sb3IpOworCX0KKworCXNoYWRvdy5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIHRoaXMuZm9ybWF0KHMuc2hhZG93RHggKiBzLnNjYWxlKSArCisJCScsJyArIHRoaXMuZm9ybWF0KHMuc2hhZG93RHkgKiBzLnNjYWxlKSArICcpJyArIChzLnRyYW5zZm9ybSB8fCAnJykpOworCXNoYWRvdy5zZXRBdHRyaWJ1dGUoJ29wYWNpdHknLCBzLnNoYWRvd0FscGhhKTsKKwkKKwlyZXR1cm4gc2hhZG93OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0TGluaworICogCisgKiBFeHBlcmltZW50YWwgaW1wbGVtZW50YXRpb24gZm9yIGh5cGVybGlua3MuCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLnNldExpbmsgPSBmdW5jdGlvbihsaW5rKQoreworCWlmIChsaW5rID09IG51bGwpCisJeworCQl0aGlzLnJvb3QgPSB0aGlzLm9yaWdpbmFsUm9vdDsKKwl9CisJZWxzZQorCXsKKwkJdGhpcy5vcmlnaW5hbFJvb3QgPSB0aGlzLnJvb3Q7CisJCQorCQl2YXIgbm9kZSA9IHRoaXMuY3JlYXRlRWxlbWVudCgnYScpOworCQkKKwkJLy8gV29ya2Fyb3VuZCBmb3IgaW1wbGljaXQgbmFtZXNwYWNlIGhhbmRsaW5nIGluIEhUTUw1IGV4cG9ydCwgSUUgYWRkcyBOUzEgbmFtZXNwYWNlIHNvIHVzZSBjb2RlIGJlbG93CisJCS8vIGluIGFsbCBJRSB2ZXJzaW9ucyBleGNlcHQgcXVpcmtzIG1vZGUuIEtOT1dOOiBBZGRzIHhsaW5rIG5hbWVzcGFjZSB0byBlYWNoIGltYWdlIHRhZyBpbiBvdXRwdXQuCisJCWlmIChub2RlLnNldEF0dHJpYnV0ZU5TID09IG51bGwgfHwgKHRoaXMucm9vdC5vd25lckRvY3VtZW50ICE9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSBudWxsKSkKKwkJeworCQkJbm9kZS5zZXRBdHRyaWJ1dGUoJ3hsaW5rOmhyZWYnLCBsaW5rKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW5vZGUuc2V0QXR0cmlidXRlTlMobXhDb25zdGFudHMuTlNfWExJTkssICd4bGluazpocmVmJywgbGluayk7CisJCX0KKwkJCisJCXRoaXMucm9vdC5hcHBlbmRDaGlsZChub2RlKTsKKwkJdGhpcy5yb290ID0gbm9kZTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByb3RhdGUKKyAqIAorICogU2V0cyB0aGUgcm90YXRpb24gb2YgdGhlIGNhbnZhcy4gTm90ZSB0aGF0IHJvdGF0aW9uIGNhbm5vdCBiZSBjb25jYXRlbmF0ZWQuCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLnJvdGF0ZSA9IGZ1bmN0aW9uKHRoZXRhLCBmbGlwSCwgZmxpcFYsIGN4LCBjeSkKK3sKKwlpZiAodGhldGEgIT0gMCB8fCBmbGlwSCB8fCBmbGlwVikKKwl7CisJCXZhciBzID0gdGhpcy5zdGF0ZTsKKwkJY3ggKz0gcy5keDsKKwkJY3kgKz0gcy5keTsKKwkKKwkJY3ggKj0gcy5zY2FsZTsKKwkJY3kgKj0gcy5zY2FsZTsKKworCQlzLnRyYW5zZm9ybSA9IHMudHJhbnNmb3JtIHx8ICcnOworCQkKKwkJLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGN1c3RvbSBzY2FsZS90cmFuc2xhdGUgYW5kIGJ1aWx0LWluIHJvdGF0aW9uCisJCS8vIFJvdGF0aW9uIHN0YXRlIGlzIHBhcnQgb2YgdGhlIEFmZmluZVRyYW5zZm9ybSBpbiBzdGF0ZS50cmFuc2Zvcm0KKwkJaWYgKGZsaXBIICYmIGZsaXBWKQorCQl7CisJCQl0aGV0YSArPSAxODA7CisJCX0KKwkJZWxzZSBpZiAoZmxpcEggIT0gZmxpcFYpCisJCXsKKwkJCXZhciB0eCA9IChmbGlwSCkgPyBjeCA6IDA7CisJCQl2YXIgc3ggPSAoZmxpcEgpID8gLTEgOiAxOworCQorCQkJdmFyIHR5ID0gKGZsaXBWKSA/IGN5IDogMDsKKwkJCXZhciBzeSA9IChmbGlwVikgPyAtMSA6IDE7CisKKwkJCXMudHJhbnNmb3JtICs9ICd0cmFuc2xhdGUoJyArIHRoaXMuZm9ybWF0KHR4KSArICcsJyArIHRoaXMuZm9ybWF0KHR5KSArICcpJyArCisJCQkJJ3NjYWxlKCcgKyB0aGlzLmZvcm1hdChzeCkgKyAnLCcgKyB0aGlzLmZvcm1hdChzeSkgKyAnKScgKworCQkJCSd0cmFuc2xhdGUoJyArIHRoaXMuZm9ybWF0KC10eCkgKyAnLCcgKyB0aGlzLmZvcm1hdCgtdHkpICsgJyknOworCQl9CisJCQorCQlpZiAoZmxpcEggPyAhZmxpcFYgOiBmbGlwVikKKwkJeworCQkJdGhldGEgKj0gLTE7CisJCX0KKwkJCisJCWlmICh0aGV0YSAhPSAwKQorCQl7CisJCQlzLnRyYW5zZm9ybSArPSAncm90YXRlKCcgKyB0aGlzLmZvcm1hdCh0aGV0YSkgKyAnLCcgKyB0aGlzLmZvcm1hdChjeCkgKyAnLCcgKyB0aGlzLmZvcm1hdChjeSkgKyAnKSc7CisJCX0KKwkJCisJCXMucm90YXRpb24gPSBzLnJvdGF0aW9uICsgdGhldGE7CisJCXMucm90YXRpb25DeCA9IGN4OworCQlzLnJvdGF0aW9uQ3kgPSBjeTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBiZWdpbgorICogCisgKiBFeHRlbmRzIHN1cGVyY2xhc3MgdG8gY3JlYXRlIHBhdGguCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLmJlZ2luID0gZnVuY3Rpb24oKQoreworCW14QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuYmVnaW4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl0aGlzLm5vZGUgPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ3BhdGgnKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlY3QKKyAqIAorICogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIFNWRyBlbGVtZW50cworICovCitteFN2Z0NhbnZhczJELnByb3RvdHlwZS5yZWN0ID0gZnVuY3Rpb24oeCwgeSwgdywgaCkKK3sKKwl2YXIgcyA9IHRoaXMuc3RhdGU7CisJdmFyIG4gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ3JlY3QnKTsKKwluLnNldEF0dHJpYnV0ZSgneCcsIHRoaXMuZm9ybWF0KCh4ICsgcy5keCkgKiBzLnNjYWxlKSk7CisJbi5zZXRBdHRyaWJ1dGUoJ3knLCB0aGlzLmZvcm1hdCgoeSArIHMuZHkpICogcy5zY2FsZSkpOworCW4uc2V0QXR0cmlidXRlKCd3aWR0aCcsIHRoaXMuZm9ybWF0KHcgKiBzLnNjYWxlKSk7CisJbi5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHRoaXMuZm9ybWF0KGggKiBzLnNjYWxlKSk7CisJCisJdGhpcy5ub2RlID0gbjsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJvdW5kcmVjdAorICogCisgKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgU1ZHIGVsZW1lbnRzCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLnJvdW5kcmVjdCA9IGZ1bmN0aW9uKHgsIHksIHcsIGgsIGR4LCBkeSkKK3sKKwl0aGlzLnJlY3QoeCwgeSwgdywgaCk7CisJCisJaWYgKGR4ID4gMCkKKwl7CisJCXRoaXMubm9kZS5zZXRBdHRyaWJ1dGUoJ3J4JywgdGhpcy5mb3JtYXQoZHggKiB0aGlzLnN0YXRlLnNjYWxlKSk7CisJfQorCQorCWlmIChkeSA+IDApCisJeworCQl0aGlzLm5vZGUuc2V0QXR0cmlidXRlKCdyeScsIHRoaXMuZm9ybWF0KGR5ICogdGhpcy5zdGF0ZS5zY2FsZSkpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGVsbGlwc2UKKyAqIAorICogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIFNWRyBlbGVtZW50cworICovCitteFN2Z0NhbnZhczJELnByb3RvdHlwZS5lbGxpcHNlID0gZnVuY3Rpb24oeCwgeSwgdywgaCkKK3sKKwl2YXIgcyA9IHRoaXMuc3RhdGU7CisJdmFyIG4gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ2VsbGlwc2UnKTsKKwkvLyBObyByb3VuZGluZyBmb3IgY29uc2lzdGVudCBvdXRwdXQgd2l0aCAxLngKKwluLnNldEF0dHJpYnV0ZSgnY3gnLCBNYXRoLnJvdW5kKCh4ICsgdyAvIDIgKyBzLmR4KSAqIHMuc2NhbGUpKTsKKwluLnNldEF0dHJpYnV0ZSgnY3knLCBNYXRoLnJvdW5kKCh5ICsgaCAvIDIgKyBzLmR5KSAqIHMuc2NhbGUpKTsKKwluLnNldEF0dHJpYnV0ZSgncngnLCB3IC8gMiAqIHMuc2NhbGUpOworCW4uc2V0QXR0cmlidXRlKCdyeScsIGggLyAyICogcy5zY2FsZSk7CisJdGhpcy5ub2RlID0gbjsKK307CisKKy8qKgorICogRnVuY3Rpb246IGltYWdlCisgKiAKKyAqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBTVkcgZWxlbWVudHMKKyAqLworbXhTdmdDYW52YXMyRC5wcm90b3R5cGUuaW1hZ2UgPSBmdW5jdGlvbih4LCB5LCB3LCBoLCBzcmMsIGFzcGVjdCwgZmxpcEgsIGZsaXBWKQoreworCXNyYyA9IHRoaXMuY29udmVydGVyLmNvbnZlcnQoc3JjKTsKKwkKKwkvLyBMQVRFUjogQWRkIG9wdGlvbiBmb3IgZW1iZWRkaW5nIGltYWdlcyBhcyBiYXNlNjQuCisJYXNwZWN0ID0gKGFzcGVjdCAhPSBudWxsKSA/IGFzcGVjdCA6IHRydWU7CisJZmxpcEggPSAoZmxpcEggIT0gbnVsbCkgPyBmbGlwSCA6IGZhbHNlOworCWZsaXBWID0gKGZsaXBWICE9IG51bGwpID8gZmxpcFYgOiBmYWxzZTsKKwkKKwl2YXIgcyA9IHRoaXMuc3RhdGU7CisJeCArPSBzLmR4OworCXkgKz0gcy5keTsKKwkKKwl2YXIgbm9kZSA9IHRoaXMuY3JlYXRlRWxlbWVudCgnaW1hZ2UnKTsKKwlub2RlLnNldEF0dHJpYnV0ZSgneCcsIHRoaXMuZm9ybWF0KHggKiBzLnNjYWxlKSArIHRoaXMuaW1hZ2VPZmZzZXQpOworCW5vZGUuc2V0QXR0cmlidXRlKCd5JywgdGhpcy5mb3JtYXQoeSAqIHMuc2NhbGUpICsgdGhpcy5pbWFnZU9mZnNldCk7CisJbm9kZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgdGhpcy5mb3JtYXQodyAqIHMuc2NhbGUpKTsKKwlub2RlLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgdGhpcy5mb3JtYXQoaCAqIHMuc2NhbGUpKTsKKwkKKwkvLyBXb3JrYXJvdW5kIGZvciBtaXNzaW5nIG5hbWVzcGFjZSBzdXBwb3J0CisJaWYgKG5vZGUuc2V0QXR0cmlidXRlTlMgPT0gbnVsbCkKKwl7CisJCW5vZGUuc2V0QXR0cmlidXRlKCd4bGluazpocmVmJywgc3JjKTsKKwl9CisJZWxzZQorCXsKKwkJbm9kZS5zZXRBdHRyaWJ1dGVOUyhteENvbnN0YW50cy5OU19YTElOSywgJ3hsaW5rOmhyZWYnLCBzcmMpOworCX0KKwkKKwlpZiAoIWFzcGVjdCkKKwl7CisJCW5vZGUuc2V0QXR0cmlidXRlKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ25vbmUnKTsKKwl9CisKKwlpZiAocy5hbHBoYSA8IDEgfHwgcy5maWxsQWxwaGEgPCAxKQorCXsKKwkJbm9kZS5zZXRBdHRyaWJ1dGUoJ29wYWNpdHknLCBzLmFscGhhICogcy5maWxsQWxwaGEpOworCX0KKwkKKwl2YXIgdHIgPSB0aGlzLnN0YXRlLnRyYW5zZm9ybSB8fCAnJzsKKwkKKwlpZiAoZmxpcEggfHwgZmxpcFYpCisJeworCQl2YXIgc3ggPSAxOworCQl2YXIgc3kgPSAxOworCQl2YXIgZHggPSAwOworCQl2YXIgZHkgPSAwOworCQkKKwkJaWYgKGZsaXBIKQorCQl7CisJCQlzeCA9IC0xOworCQkJZHggPSAtdyAtIDIgKiB4OworCQl9CisJCQorCQlpZiAoZmxpcFYpCisJCXsKKwkJCXN5ID0gLTE7CisJCQlkeSA9IC1oIC0gMiAqIHk7CisJCX0KKwkJCisJCS8vIEFkZHMgaW1hZ2UgdGFuc2Zvcm1hdGlvbiB0byBleGlzdGluZyB0cmFuc2Zvcm0KKwkJdHIgKz0gJ3NjYWxlKCcgKyBzeCArICcsJyArIHN5ICsgJyl0cmFuc2xhdGUoJyArIChkeCAqIHMuc2NhbGUpICsgJywnICsgKGR5ICogcy5zY2FsZSkgKyAnKSc7CisJfQorCisJaWYgKHRyLmxlbmd0aCA+IDApCisJeworCQlub2RlLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgdHIpOworCX0KKwkKKwlpZiAoIXRoaXMucG9pbnRlckV2ZW50cykKKwl7CisJCW5vZGUuc2V0QXR0cmlidXRlKCdwb2ludGVyLWV2ZW50cycsICdub25lJyk7CisJfQorCQorCXRoaXMucm9vdC5hcHBlbmRDaGlsZChub2RlKTsKKwkKKwkvLyBEaXNhYmxlcyBjb250cm9sLWNsaWNrcyBvbiBpbWFnZXMgaW4gRmlyZWZveCB0byBvcGVuIGluIG5ldyB0YWIKKwkvLyBieSBwdXR0aW5nIGEgcmVjdCBpbiB0aGUgZm9yZWdyb3VuZCB0aGF0IGFic29yYnMgYWxsIGV2ZW50cyBhbmQKKwkvLyBkaXNhYmxpbmcgYWxsIHBvaW50ZXItZXZlbnRzIG9uIHRoZSBvcmlnaW5hbCBpbWFnZSB0YWcuCisJaWYgKHRoaXMuYmxvY2tJbWFnZVBvaW50ZXJFdmVudHMpCisJeworCQlub2RlLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAncG9pbnRlci1ldmVudHM6bm9uZScpOworCQkKKwkJbm9kZSA9IHRoaXMuY3JlYXRlRWxlbWVudCgncmVjdCcpOworCQlub2RlLnNldEF0dHJpYnV0ZSgndmlzaWJpbGl0eScsICdoaWRkZW4nKTsKKwkJbm9kZS5zZXRBdHRyaWJ1dGUoJ3BvaW50ZXItZXZlbnRzJywgJ2ZpbGwnKTsKKwkJbm9kZS5zZXRBdHRyaWJ1dGUoJ3gnLCB0aGlzLmZvcm1hdCh4ICogcy5zY2FsZSkpOworCQlub2RlLnNldEF0dHJpYnV0ZSgneScsIHRoaXMuZm9ybWF0KHkgKiBzLnNjYWxlKSk7CisJCW5vZGUuc2V0QXR0cmlidXRlKCd3aWR0aCcsIHRoaXMuZm9ybWF0KHcgKiBzLnNjYWxlKSk7CisJCW5vZGUuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCB0aGlzLmZvcm1hdChoICogcy5zY2FsZSkpOworCQl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQobm9kZSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY29udmVydEh0bWwKKyAqIAorICogQ29udmVydHMgdGhlIGdpdmVuIEhUTUwgc3RyaW5nIHRvIFhIVE1MLgorICovCitteFN2Z0NhbnZhczJELnByb3RvdHlwZS5jb252ZXJ0SHRtbCA9IGZ1bmN0aW9uKHZhbCkKK3sKKwlpZiAodGhpcy51c2VEb21QYXJzZXIpCisJeworCQl2YXIgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh2YWwsICd0ZXh0L2h0bWwnKTsKKworCQlpZiAoZG9jICE9IG51bGwpCisJCXsKKwkJCXZhbCA9IG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoZG9jLmJvZHkpOworCQkJCisJCQkvLyBFeHRyYWN0cyBib2R5IGNvbnRlbnQgZnJvbSBET00KKwkJCWlmICh2YWwuc3Vic3RyaW5nKDAsIDUpID09ICc8Ym9keScpCisJCQl7CisJCQkJdmFsID0gdmFsLnN1YnN0cmluZyh2YWwuaW5kZXhPZignPicsIDUpICsgMSk7CisJCQl9CisJCQkKKwkJCWlmICh2YWwuc3Vic3RyaW5nKHZhbC5sZW5ndGggLSA3LCB2YWwubGVuZ3RoKSA9PSAnPC9ib2R5PicpCisJCQl7CisJCQkJdmFsID0gdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gNyk7CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiAoZG9jdW1lbnQuaW1wbGVtZW50YXRpb24gIT0gbnVsbCAmJiBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCAhPSBudWxsKQorCXsKKwkJdmFyIHhkID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnaHRtbCcsIG51bGwpOworCQl2YXIgeGIgPSB4ZC5jcmVhdGVFbGVtZW50KCdib2R5Jyk7CisJCXhkLmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCh4Yik7CisJCQorCQl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCWRpdi5pbm5lckhUTUwgPSB2YWw7CisJCXZhciBjaGlsZCA9IGRpdi5maXJzdENoaWxkOworCQkKKwkJd2hpbGUgKGNoaWxkICE9IG51bGwpCisJCXsKKwkJCXZhciBuZXh0ID0gY2hpbGQubmV4dFNpYmxpbmc7CisJCQl4Yi5hcHBlbmRDaGlsZCh4ZC5hZG9wdE5vZGUoY2hpbGQpKTsKKwkJCWNoaWxkID0gbmV4dDsKKwkJfQorCQkKKwkJcmV0dXJuIHhiLmlubmVySFRNTDsKKwl9CisJZWxzZQorCXsKKwkJdmFyIHRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsKKwkJCisJCS8vIEhhbmRsZXMgc3BlY2lhbCBIVE1MIGVudGl0aWVzIDwgYW5kID4gYW5kIGRvdWJsZSBlc2NhcGluZworCQkvLyBhbmQgY29udmVydHMgdW5jbG9zZWQgYnIsIGhyIGFuZCBpbWcgdGFncyB0byBYSFRNTAorCQkvLyBMQVRFUjogQ29udmVydCBhbGwgdW5jbG9zZWQgdGFncworCQl0YS5pbm5lckhUTUwgPSB2YWwucmVwbGFjZSgvJmFtcDsvZywgJyZhbXA7YW1wOycpLgorCQkJcmVwbGFjZSgvJiM2MDsvZywgJyZhbXA7bHQ7JykucmVwbGFjZSgvJiM2MjsvZywgJyZhbXA7Z3Q7JykuCisJCQlyZXBsYWNlKC8mbHQ7L2csICcmYW1wO2x0OycpLnJlcGxhY2UoLyZndDsvZywgJyZhbXA7Z3Q7JykuCisJCQlyZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpOworCQl2YWwgPSB0YS52YWx1ZS5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLyZhbXA7bHQ7L2csICcmbHQ7JykuCisJCQlyZXBsYWNlKC8mYW1wO2d0Oy9nLCAnJmd0OycpLnJlcGxhY2UoLyZhbXA7YW1wOy9nLCAnJmFtcDsnKS4KKwkJCXJlcGxhY2UoLzxicj4vZywgJzxiciAvPicpLnJlcGxhY2UoLzxocj4vZywgJzxociAvPicpLgorCQkJcmVwbGFjZSgvKDxpbWdbXj5dKyk+L2dtLCAiJDEgLz4iKTsKKwl9CisJCisJcmV0dXJuIHZhbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZURpdgorICogCisgKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgU1ZHIGVsZW1lbnRzCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLmNyZWF0ZURpdiA9IGZ1bmN0aW9uKHN0ciwgYWxpZ24sIHZhbGlnbiwgc3R5bGUsIG92ZXJmbG93KQoreworCXZhciBzID0gdGhpcy5zdGF0ZTsKKworCS8vIElubGluZSBibG9jayBmb3IgcmVuZGVyaW5nIEhUTUwgYmFja2dyb3VuZCBvdmVyIFNWRyBpbiBTYWZhcmkKKwl2YXIgbGggPSAobXhDb25zdGFudHMuQUJTT0xVVEVfTElORV9IRUlHSFQpID8gKHMuZm9udFNpemUgKiBteENvbnN0YW50cy5MSU5FX0hFSUdIVCkgKyAncHgnIDoKKwkJKG14Q29uc3RhbnRzLkxJTkVfSEVJR0hUICogdGhpcy5saW5lSGVpZ2h0Q29ycmVjdGlvbik7CisJCisJc3R5bGUgPSAnZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOicgKyBzLmZvbnRTaXplICsgJ3B4O2ZvbnQtZmFtaWx5OicgKyBzLmZvbnRGYW1pbHkgKworCQknO2NvbG9yOicgKyBzLmZvbnRDb2xvciArICc7bGluZS1oZWlnaHQ6JyArIGxoICsgJzsnICsgc3R5bGU7CisKKwlpZiAoKHMuZm9udFN0eWxlICYgbXhDb25zdGFudHMuRk9OVF9CT0xEKSA9PSBteENvbnN0YW50cy5GT05UX0JPTEQpCisJeworCQlzdHlsZSArPSAnZm9udC13ZWlnaHQ6Ym9sZDsnOworCX0KKworCWlmICgocy5mb250U3R5bGUgJiBteENvbnN0YW50cy5GT05UX0lUQUxJQykgPT0gbXhDb25zdGFudHMuRk9OVF9JVEFMSUMpCisJeworCQlzdHlsZSArPSAnZm9udC1zdHlsZTppdGFsaWM7JzsKKwl9CisJCisJaWYgKChzLmZvbnRTdHlsZSAmIG14Q29uc3RhbnRzLkZPTlRfVU5ERVJMSU5FKSA9PSBteENvbnN0YW50cy5GT05UX1VOREVSTElORSkKKwl7CisJCXN0eWxlICs9ICd0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOyc7CisJfQorCQorCWlmIChhbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9DRU5URVIpCisJeworCQlzdHlsZSArPSAndGV4dC1hbGlnbjpjZW50ZXI7JzsKKwl9CisJZWxzZSBpZiAoYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fUklHSFQpCisJeworCQlzdHlsZSArPSAndGV4dC1hbGlnbjpyaWdodDsnOworCX0KKworCXZhciBjc3MgPSAnJzsKKwkKKwlpZiAocy5mb250QmFja2dyb3VuZENvbG9yICE9IG51bGwpCisJeworCQljc3MgKz0gJ2JhY2tncm91bmQtY29sb3I6JyArIHMuZm9udEJhY2tncm91bmRDb2xvciArICc7JzsKKwl9CisJCisJaWYgKHMuZm9udEJvcmRlckNvbG9yICE9IG51bGwpCisJeworCQljc3MgKz0gJ2JvcmRlcjoxcHggc29saWQgJyArIHMuZm9udEJvcmRlckNvbG9yICsgJzsnOworCX0KKwkKKwl2YXIgdmFsID0gc3RyOworCQorCWlmICghbXhVdGlscy5pc05vZGUodmFsKSkKKwl7CisJCXZhbCA9IHRoaXMuY29udmVydEh0bWwodmFsKTsKKwkJCisJCWlmIChvdmVyZmxvdyAhPSAnZmlsbCcgJiYgb3ZlcmZsb3cgIT0gJ3dpZHRoJykKKwkJeworCQkJLy8gSW5uZXIgZGl2IGFsd2F5cyBuZWVkZWQgdG8gbWVhc3VyZSB3cmFwcGVkIHRleHQKKwkJCXZhbCA9ICc8ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7dGV4dC1hbGlnbjppbmhlcml0O3RleHQtZGVjb3JhdGlvbjppbmhlcml0OycgKyBjc3MgKyAnIj4nICsgdmFsICsgJzwvZGl2Pic7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdHlsZSArPSBjc3M7CisJCX0KKwl9CisKKwkvLyBVc2VzIERPTSBBUEkgd2hlcmUgYXZhaWxhYmxlLiBUaGlzIGNhbm5vdCBiZSB1c2VkIGluIElFIHRvIGF2b2lkCisJLy8gYW4gb3BlbmluZyBhbmQgdHdvICghKSBjbG9zaW5nIFRCT0RZIHRhZ3MgYmVpbmcgYWRkZWQgdG8gdGFibGVzLgorCWlmICghbXhDbGllbnQuSVNfSUUgJiYgZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKQorCXsKKwkJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdkaXYnKTsKKwkJZGl2LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBzdHlsZSk7CisJCQorCQlpZiAobXhVdGlscy5pc05vZGUodmFsKSkKKwkJeworCQkJLy8gQ3JlYXRlcyBhIGNvcHkgZm9yIGV4cG9ydAorCQkJaWYgKHRoaXMucm9vdC5vd25lckRvY3VtZW50ICE9IGRvY3VtZW50KQorCQkJeworCQkJCWRpdi5hcHBlbmRDaGlsZCh2YWwuY2xvbmVOb2RlKHRydWUpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkaXYuYXBwZW5kQ2hpbGQodmFsKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWRpdi5pbm5lckhUTUwgPSB2YWw7CisJCX0KKwkJCisJCXJldHVybiBkaXY7CisJfQorCWVsc2UKKwl7CisJCS8vIFNlcmlhbGl6ZXMgZm9yIGV4cG9ydAorCQlpZiAobXhVdGlscy5pc05vZGUodmFsKSAmJiB0aGlzLnJvb3Qub3duZXJEb2N1bWVudCAhPSBkb2N1bWVudCkKKwkJeworCQkJdmFsID0gdmFsLm91dGVySFRNTDsKKwkJfQorCisJCS8vIE5PVEU6IEZGIDMuNiBjcmFzaGVzIGlmIGNvbnRlbnQgQ1NTIGNvbnRhaW5zICJoZWlnaHQ6MTAwJSIKKwkJcmV0dXJuIG14VXRpbHMucGFyc2VYbWwoJzxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHN0eWxlPSInICsgc3R5bGUgKyAKKwkJCSciPicgKyB2YWwgKyAnPC9kaXY+JykuZG9jdW1lbnRFbGVtZW50OworCX0KK307CisKKy8qKgorICogSW52YWxpZGF0ZXMgdGhlIGNhY2hlZCBvZmZzZXQgc2l6ZSBmb3IgdGhlIGdpdmVuIG5vZGUuCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZWRPZmZzZXRTaXplID0gZnVuY3Rpb24obm9kZSkKK3sKKwlkZWxldGUgbm9kZS5maXJzdENoaWxkLm14Q2FjaGVkT2Zmc2V0V2lkdGg7CisJZGVsZXRlIG5vZGUuZmlyc3RDaGlsZC5teENhY2hlZEZpbmFsT2Zmc2V0V2lkdGg7CisJZGVsZXRlIG5vZGUuZmlyc3RDaGlsZC5teENhY2hlZEZpbmFsT2Zmc2V0SGVpZ2h0OworfTsKKworLyoqCisgKiBVcGRhdGVzIGV4aXN0aW5nIERPTSBub2RlcyBmb3IgdGV4dCByZW5kZXJpbmcuIExBVEVSOiBNZXJnZSBjb21tb24gcGFydHMgd2l0aCB0ZXh0IGZ1bmN0aW9uIGJlbG93LgorICovCitteFN2Z0NhbnZhczJELnByb3RvdHlwZS51cGRhdGVUZXh0ID0gZnVuY3Rpb24oeCwgeSwgdywgaCwgYWxpZ24sIHZhbGlnbiwgd3JhcCwgb3ZlcmZsb3csIGNsaXAsIHJvdGF0aW9uLCBub2RlKQoreworCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5maXJzdENoaWxkICE9IG51bGwgJiYgbm9kZS5maXJzdENoaWxkLmZpcnN0Q2hpbGQgIT0gbnVsbCAmJgorCQlub2RlLmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkICE9IG51bGwpCisJeworCQkvLyBVc2VzIG91dGVyIGdyb3VwIGZvciBvcGFjaXR5IGFuZCB0cmFuc2Zvcm1zIHRvCisJCS8vIGZpeCByZW5kZXJpbmcgb3JkZXIgaW4gQ2hyb21lCisJCXZhciBncm91cCA9IG5vZGUuZmlyc3RDaGlsZDsKKwkJdmFyIGZvID0gZ3JvdXAuZmlyc3RDaGlsZDsKKwkJdmFyIGRpdiA9IGZvLmZpcnN0Q2hpbGQ7CisKKwkJcm90YXRpb24gPSAocm90YXRpb24gIT0gbnVsbCkgPyByb3RhdGlvbiA6IDA7CisJCQorCQl2YXIgcyA9IHRoaXMuc3RhdGU7CisJCXggKz0gcy5keDsKKwkJeSArPSBzLmR5OworCQkKKwkJaWYgKGNsaXApCisJCXsKKwkJCWRpdi5zdHlsZS5tYXhIZWlnaHQgPSBNYXRoLnJvdW5kKGgpICsgJ3B4JzsKKwkJCWRpdi5zdHlsZS5tYXhXaWR0aCA9IE1hdGgucm91bmQodykgKyAncHgnOworCQl9CisJCWVsc2UgaWYgKG92ZXJmbG93ID09ICdmaWxsJykKKwkJeworCQkJZGl2LnN0eWxlLndpZHRoID0gTWF0aC5yb3VuZCh3ICsgMSkgKyAncHgnOworCQkJZGl2LnN0eWxlLmhlaWdodCA9IE1hdGgucm91bmQoaCArIDEpICsgJ3B4JzsKKwkJfQorCQllbHNlIGlmIChvdmVyZmxvdyA9PSAnd2lkdGgnKQorCQl7CisJCQlkaXYuc3R5bGUud2lkdGggPSBNYXRoLnJvdW5kKHcgKyAxKSArICdweCc7CisJCQkKKwkJCWlmIChoID4gMCkKKwkJCXsKKwkJCQlkaXYuc3R5bGUubWF4SGVpZ2h0ID0gTWF0aC5yb3VuZChoKSArICdweCc7CisJCQl9CisJCX0KKworCQlpZiAod3JhcCAmJiB3ID4gMCkKKwkJeworCQkJZGl2LnN0eWxlLndpZHRoID0gTWF0aC5yb3VuZCh3ICsgMSkgKyAncHgnOworCQl9CisJCQorCQkvLyBDb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGUgc2l6ZSB3aGljaCBpcyBjb21wdXRlZCBhZnRlcgorCQkvLyB0aGUgZWxlbWVudCB3YXMgYWRkZWQgdG8gdGhlIERPTS4KKwkJdmFyIG93ID0gMDsKKwkJdmFyIG9oID0gMDsKKwkJCisJCS8vIFBhZGRpbmcgYXZvaWRzIGNsaXBwaW5nIG9uIGJvcmRlciBhbmQgd3JhcHBpbmcgZm9yIGRpZmZlcmluZyBmb250IG1ldHJpY3Mgb24gcGxhdGZvcm1zCisJCXZhciBwYWRYID0gMjsKKwkJdmFyIHBhZFkgPSAyOworCisJCXZhciBzaXplRGl2ID0gZGl2OworCQkKKwkJaWYgKHNpemVEaXYuZmlyc3RDaGlsZCAhPSBudWxsICYmIHNpemVEaXYuZmlyc3RDaGlsZC5ub2RlTmFtZSA9PSAnRElWJykKKwkJeworCQkJc2l6ZURpdiA9IHNpemVEaXYuZmlyc3RDaGlsZDsKKwkJfQorCQkKKwkJdmFyIHRtcCA9IChncm91cC5teENhY2hlZE9mZnNldFdpZHRoICE9IG51bGwpID8gZ3JvdXAubXhDYWNoZWRPZmZzZXRXaWR0aCA6IHNpemVEaXYub2Zmc2V0V2lkdGg7CisJCW93ID0gdG1wICsgcGFkWDsKKworCQkvLyBSZWNvbXB1dGVzIHRoZSBoZWlnaHQgb2YgdGhlIGVsZW1lbnQgZm9yIHdyYXBwZWQgd2lkdGgKKwkJaWYgKHdyYXAgJiYgb3ZlcmZsb3cgIT0gJ2ZpbGwnKQorCQl7CisJCQlpZiAoY2xpcCkKKwkJCXsKKwkJCQlvdyA9IE1hdGgubWluKG93LCB3KTsKKwkJCX0KKwkJCQorCQkJZGl2LnN0eWxlLndpZHRoID0gb3cgKyAncHgnOworCQl9CisJCQorCQlvdyA9ICgoZ3JvdXAubXhDYWNoZWRGaW5hbE9mZnNldFdpZHRoICE9IG51bGwpID8gZ3JvdXAubXhDYWNoZWRGaW5hbE9mZnNldFdpZHRoIDoKKwkJCXNpemVEaXYub2Zmc2V0V2lkdGgpICsgcGFkWDsKKwkJb2ggPSAoKGdyb3VwLm14Q2FjaGVkRmluYWxPZmZzZXRIZWlnaHQgIT0gbnVsbCkgPyBncm91cC5teENhY2hlZEZpbmFsT2Zmc2V0SGVpZ2h0IDoKKwkJCXNpemVEaXYub2Zmc2V0SGVpZ2h0KSAtIDI7CisKKwkJaWYgKGNsaXApCisJCXsKKwkJCW9oID0gTWF0aC5taW4ob2gsIGgpOworCQkJb3cgPSBNYXRoLm1pbihvdywgdyk7CisJCX0KKworCQlpZiAob3ZlcmZsb3cgPT0gJ3dpZHRoJykKKwkJeworCQkJaCA9IG9oOworCQl9CisJCWVsc2UgaWYgKG92ZXJmbG93ICE9ICdmaWxsJykKKwkJeworCQkJdyA9IG93OworCQkJaCA9IG9oOworCQl9CisKKwkJdmFyIGR4ID0gMDsKKwkJdmFyIGR5ID0gMDsKKworCQlpZiAoYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fQ0VOVEVSKQorCQl7CisJCQlkeCAtPSB3IC8gMjsKKwkJfQorCQllbHNlIGlmIChhbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9SSUdIVCkKKwkJeworCQkJZHggLT0gdzsKKwkJfQorCQkKKwkJeCArPSBkeDsKKwkJCisJCS8vIEZJWE1FOiBMSU5FX0hFSUdIVCBub3QgaWRlYWwgZm9yIGFsbCB0ZXh0IHNpemVzLCBmaXggZm9yIGV4cG9ydAorCQlpZiAodmFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSkKKwkJeworCQkJZHkgLT0gaCAvIDI7CisJCX0KKwkJZWxzZSBpZiAodmFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX0JPVFRPTSkKKwkJeworCQkJZHkgLT0gaDsKKwkJfQorCQkKKwkJLy8gV29ya2Fyb3VuZCBmb3IgcmVuZGVyaW5nIG9mZnNldHMKKwkJLy8gVE9ETzogQ2hlY2sgaWYgZXhwb3J0IG5lZWRzIHRoZXNlIGZpeGVzLCB0b28KKwkJaWYgKG92ZXJmbG93ICE9ICdmaWxsJyAmJiBteENsaWVudC5JU19GRiAmJiBteENsaWVudC5JU19XSU4pCisJCXsKKwkJCWR5IC09IDI7CisJCX0KKwkJCisJCXkgKz0gZHk7CisKKwkJdmFyIHRyID0gKHMuc2NhbGUgIT0gMSkgPyAnc2NhbGUoJyArIHMuc2NhbGUgKyAnKScgOiAnJzsKKworCQlpZiAocy5yb3RhdGlvbiAhPSAwICYmIHRoaXMucm90YXRlSHRtbCkKKwkJeworCQkJdHIgKz0gJ3JvdGF0ZSgnICsgKHMucm90YXRpb24pICsgJywnICsgKHcgLyAyKSArICcsJyArIChoIC8gMikgKyAnKSc7CisJCQl2YXIgcHQgPSB0aGlzLnJvdGF0ZVBvaW50KCh4ICsgdyAvIDIpICogcy5zY2FsZSwgKHkgKyBoIC8gMikgKiBzLnNjYWxlLAorCQkJCXMucm90YXRpb24sIHMucm90YXRpb25DeCwgcy5yb3RhdGlvbkN5KTsKKwkJCXggPSBwdC54IC0gdyAqIHMuc2NhbGUgLyAyOworCQkJeSA9IHB0LnkgLSBoICogcy5zY2FsZSAvIDI7CisJCX0KKwkJZWxzZQorCQl7CisJCQl4ICo9IHMuc2NhbGU7CisJCQl5ICo9IHMuc2NhbGU7CisJCX0KKworCQlpZiAocm90YXRpb24gIT0gMCkKKwkJeworCQkJdHIgKz0gJ3JvdGF0ZSgnICsgKHJvdGF0aW9uKSArICcsJyArICgtZHgpICsgJywnICsgKC1keSkgKyAnKSc7CisJCX0KKworCQlncm91cC5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIE1hdGgucm91bmQoeCkgKyAnLCcgKyBNYXRoLnJvdW5kKHkpICsgJyknICsgdHIpOworCQlmby5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgTWF0aC5yb3VuZChNYXRoLm1heCgxLCB3KSkpOworCQlmby5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIE1hdGgucm91bmQoTWF0aC5tYXgoMSwgaCkpKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB0ZXh0CisgKiAKKyAqIFBhaW50cyB0aGUgZ2l2ZW4gdGV4dC4gUG9zc2libGUgdmFsdWVzIGZvciBmb3JtYXQgYXJlIGVtcHR5IHN0cmluZyBmb3IgcGxhaW4KKyAqIHRleHQgYW5kIGh0bWwgZm9yIEhUTUwgbWFya3VwLiBOb3RlIHRoYXQgSFRNTCBtYXJrdXAgaXMgb25seSBzdXBwb3J0ZWQgaWYKKyAqIGZvcmVpZ25PYmplY3QgaXMgc3VwcG9ydGVkIGFuZCA8Zm9FbmFibGVkPiBpcyB0cnVlLiAoVGhpcyBtZWFucyBJRTkgYW5kIGxhdGVyCisgKiBkb2VzIGN1cnJlbnRseSBub3Qgc3VwcG9ydCBIVE1MIHRleHQgYXMgcGFydCBvZiBzaGFwZXMuKQorICovCitteFN2Z0NhbnZhczJELnByb3RvdHlwZS50ZXh0ID0gZnVuY3Rpb24oeCwgeSwgdywgaCwgc3RyLCBhbGlnbiwgdmFsaWduLCB3cmFwLCBmb3JtYXQsIG92ZXJmbG93LCBjbGlwLCByb3RhdGlvbiwgZGlyKQoreworCWlmICh0aGlzLnRleHRFbmFibGVkICYmIHN0ciAhPSBudWxsKQorCXsKKwkJcm90YXRpb24gPSAocm90YXRpb24gIT0gbnVsbCkgPyByb3RhdGlvbiA6IDA7CisJCQorCQl2YXIgcyA9IHRoaXMuc3RhdGU7CisJCXggKz0gcy5keDsKKwkJeSArPSBzLmR5OworCQkKKwkJaWYgKHRoaXMuZm9FbmFibGVkICYmIGZvcm1hdCA9PSAnaHRtbCcpCisJCXsKKwkJCXZhciBzdHlsZSA9ICd2ZXJ0aWNhbC1hbGlnbjp0b3A7JzsKKwkJCQorCQkJaWYgKGNsaXApCisJCQl7CisJCQkJc3R5bGUgKz0gJ292ZXJmbG93OmhpZGRlbjttYXgtaGVpZ2h0OicgKyBNYXRoLnJvdW5kKGgpICsgJ3B4O21heC13aWR0aDonICsgTWF0aC5yb3VuZCh3KSArICdweDsnOworCQkJfQorCQkJZWxzZSBpZiAob3ZlcmZsb3cgPT0gJ2ZpbGwnKQorCQkJeworCQkJCXN0eWxlICs9ICd3aWR0aDonICsgTWF0aC5yb3VuZCh3ICsgMSkgKyAncHg7aGVpZ2h0OicgKyBNYXRoLnJvdW5kKGggKyAxKSArICdweDtvdmVyZmxvdzpoaWRkZW47JzsKKwkJCX0KKwkJCWVsc2UgaWYgKG92ZXJmbG93ID09ICd3aWR0aCcpCisJCQl7CisJCQkJc3R5bGUgKz0gJ3dpZHRoOicgKyBNYXRoLnJvdW5kKHcgKyAxKSArICdweDsnOworCQkJCQorCQkJCWlmIChoID4gMCkKKwkJCQl7CisJCQkJCXN0eWxlICs9ICdtYXgtaGVpZ2h0OicgKyBNYXRoLnJvdW5kKGgpICsgJ3B4O292ZXJmbG93OmhpZGRlbjsnOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHdyYXAgJiYgdyA+IDApCisJCQl7CisJCQkJc3R5bGUgKz0gJ3dpZHRoOicgKyBNYXRoLnJvdW5kKHcgKyAxKSArICdweDt3aGl0ZS1zcGFjZTpub3JtYWw7d29yZC13cmFwOicgKworCQkJCQlteENvbnN0YW50cy5XT1JEX1dSQVAgKyAnOyc7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc3R5bGUgKz0gJ3doaXRlLXNwYWNlOm5vd3JhcDsnOworCQkJfQorCQkJCisJCQkvLyBVc2VzIG91dGVyIGdyb3VwIGZvciBvcGFjaXR5IGFuZCB0cmFuc2Zvcm1zIHRvCisJCQkvLyBmaXggcmVuZGVyaW5nIG9yZGVyIGluIENocm9tZQorCQkJdmFyIGdyb3VwID0gdGhpcy5jcmVhdGVFbGVtZW50KCdnJyk7CisJCQkKKwkJCWlmIChzLmFscGhhIDwgMSkKKwkJCXsKKwkJCQlncm91cC5zZXRBdHRyaWJ1dGUoJ29wYWNpdHknLCBzLmFscGhhKTsKKwkJCX0KKworCQkJdmFyIGZvID0gdGhpcy5jcmVhdGVFbGVtZW50KCdmb3JlaWduT2JqZWN0Jyk7CisJCQlmby5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ292ZXJmbG93OnZpc2libGU7Jyk7CisJCQlmby5zZXRBdHRyaWJ1dGUoJ3BvaW50ZXItZXZlbnRzJywgJ2FsbCcpOworCQkJCisJCQl2YXIgZGl2ID0gdGhpcy5jcmVhdGVEaXYoc3RyLCBhbGlnbiwgdmFsaWduLCBzdHlsZSwgb3ZlcmZsb3cpOworCQkJCisJCQkvLyBJZ25vcmVzIGludmFsaWQgWEhUTUwgbGFiZWxzCisJCQlpZiAoZGl2ID09IG51bGwpCisJCQl7CisJCQkJcmV0dXJuOworCQkJfQorCQkJZWxzZSBpZiAoZGlyICE9IG51bGwpCisJCQl7CisJCQkJZGl2LnNldEF0dHJpYnV0ZSgnZGlyJywgZGlyKTsKKwkJCX0KKworCQkJZ3JvdXAuYXBwZW5kQ2hpbGQoZm8pOworCQkJdGhpcy5yb290LmFwcGVuZENoaWxkKGdyb3VwKTsKKwkJCQorCQkJLy8gQ29kZSB0aGF0IGRlcGVuZHMgb24gdGhlIHNpemUgd2hpY2ggaXMgY29tcHV0ZWQgYWZ0ZXIKKwkJCS8vIHRoZSBlbGVtZW50IHdhcyBhZGRlZCB0byB0aGUgRE9NLgorCQkJdmFyIG93ID0gMDsKKwkJCXZhciBvaCA9IDA7CisJCQkKKwkJCS8vIFBhZGRpbmcgYXZvaWRzIGNsaXBwaW5nIG9uIGJvcmRlciBhbmQgd3JhcHBpbmcgZm9yIGRpZmZlcmluZyBmb250IG1ldHJpY3Mgb24gcGxhdGZvcm1zCisJCQl2YXIgcGFkWCA9IDI7CisJCQl2YXIgcGFkWSA9IDI7CisKKwkJCS8vIE5PVEU6IElFIGlzIGFsd2F5cyBleHBvcnQgYXMgaXQgZG9lcyBub3Qgc3VwcG9ydCBmb3JlaWduIG9iamVjdHMKKwkJCWlmIChteENsaWVudC5JU19JRSAmJiAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09IDkgfHwgIW14Q2xpZW50LklTX1NWRykpCisJCQl7CisJCQkJLy8gSGFuZGxlcyBub24tc3RhbmRhcmQgbmFtZXNwYWNlIGZvciBnZXR0aW5nIHNpemUgaW4gSUUKKwkJCQl2YXIgY2xvbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKwkJCQkKKwkJCQljbG9uZS5zdHlsZS5jc3NUZXh0ID0gZGl2LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTsKKwkJCQljbG9uZS5zdHlsZS5kaXNwbGF5ID0gKG14Q2xpZW50LklTX1FVSVJLUykgPyAnaW5saW5lJyA6ICdpbmxpbmUtYmxvY2snOworCQkJCWNsb25lLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKwkJCQljbG9uZS5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CisKKwkJCQkvLyBJbm5lciBESVYgaXMgbmVlZGVkIGZvciB0ZXh0IG1lYXN1cmluZworCQkJCXZhciBkaXYyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCQkJZGl2Mi5zdHlsZS5kaXNwbGF5ID0gKG14Q2xpZW50LklTX1FVSVJLUykgPyAnaW5saW5lJyA6ICdpbmxpbmUtYmxvY2snOworCQkJCWRpdjIuc3R5bGUud29yZFdyYXAgPSBteENvbnN0YW50cy5XT1JEX1dSQVA7CisJCQkJZGl2Mi5pbm5lckhUTUwgPSAobXhVdGlscy5pc05vZGUoc3RyKSkgPyBzdHIub3V0ZXJIVE1MIDogc3RyOworCQkJCWNsb25lLmFwcGVuZENoaWxkKGRpdjIpOworCisJCQkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjbG9uZSk7CisKKwkJCQkvLyBXb3JrYXJvdW5kIGZvciBkaWZmZXJlbnQgYm94IG1vZGVscworCQkJCWlmIChkb2N1bWVudC5kb2N1bWVudE1vZGUgIT0gOCAmJiBkb2N1bWVudC5kb2N1bWVudE1vZGUgIT0gOSAmJiBzLmZvbnRCb3JkZXJDb2xvciAhPSBudWxsKQorCQkJCXsKKwkJCQkJcGFkWCArPSAyOworCQkJCQlwYWRZICs9IDI7CisJCQkJfQorCisJCQkJaWYgKHdyYXAgJiYgdyA+IDApCisJCQkJeworCQkJCQl2YXIgdG1wID0gZGl2Mi5vZmZzZXRXaWR0aDsKKwkJCQkJCisJCQkJCS8vIFdvcmthcm91bmQgZm9yIGFkZGluZyBwYWRkaW5nIHR3aWNlIGluIElFOC9JRTkgc3RhbmRhcmRzIG1vZGUgaWYgbGFiZWwgaXMgd3JhcHBlZAorCQkJCQl2YXIgcGFkRHggPSAwOworCQkJCQkKKwkJCQkJLy8gRm9yIGV4cG9ydCwgaWYgbm8gd3JhcHBpbmcgb2NjdXJzLCB3ZSBhZGQgYSBsYXJnZSBwYWRkaW5nIHRvIG1ha2UKKwkJCQkJLy8gc3VyZSB0aGVyZSBpcyBubyB3cmFwcGluZyBldmVuIGlmIHRoZSB0ZXh0IG1ldHJpY3MgYXJlIGRpZmZlcmVudC4KKwkJCQkJLy8gVGhpcyBhZGRzIHN1cHBvcnQgZm9yIHRleHQgbWV0cmljcyBvbiBkaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbXMuCisJCQkJCS8vIERpc2FibGVzIHdyYXBwaW5nIGlmIHRleHQgaXMgbm90IHdyYXBwZWQgZm9yIGdpdmVuIHdpZHRoCisJCQkJCWlmICghY2xpcCAmJiB3cmFwICYmIHcgPiAwICYmIHRoaXMucm9vdC5vd25lckRvY3VtZW50ICE9IGRvY3VtZW50ICYmIG92ZXJmbG93ICE9ICdmaWxsJykKKwkJCQkJeworCQkJCQkJdmFyIHdzID0gY2xvbmUuc3R5bGUud2hpdGVTcGFjZTsKKwkJCQkJCWRpdjIuc3R5bGUud2hpdGVTcGFjZSA9ICdub3dyYXAnOworCQkJCQkJCisJCQkJCQlpZiAodG1wIDwgZGl2Mi5vZmZzZXRXaWR0aCkKKwkJCQkJCXsKKwkJCQkJCQljbG9uZS5zdHlsZS53aGl0ZVNwYWNlID0gd3M7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmIChjbGlwKQorCQkJCQl7CisJCQkJCQl0bXAgPSBNYXRoLm1pbih0bXAsIHcpOworCQkJCQl9CisJCQkJCQorCQkJCQljbG9uZS5zdHlsZS53aWR0aCA9IHRtcCArICdweCc7CisJCisJCQkJCS8vIFBhZGRpbmcgYXZvaWRzIGNsaXBwaW5nIG9uIGJvcmRlcgorCQkJCQlvdyA9IGRpdjIub2Zmc2V0V2lkdGggKyBwYWRYICsgcGFkRHg7CisJCQkJCW9oID0gZGl2Mi5vZmZzZXRIZWlnaHQgKyBwYWRZOworCQkJCQkKKwkJCQkJLy8gT3ZlcnJpZGVzIHRoZSB3aWR0aCBvZiB0aGUgRElWIHZpYSBYTUwgRE9NIGJ5IHVzaW5nIHRoZQorCQkJCQkvLyBjbG9uZSBET00gc3R5bGUsIGdldHRpbmcgdGhlIENTUyB0ZXh0IGZvciB0aGF0IGFuZAorCQkJCQkvLyB0aGVuIHNldHRpbmcgdGhhdCBvbiB0aGUgRElWIHZpYSBzZXRBdHRyaWJ1dGUKKwkJCQkJY2xvbmUuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snOworCQkJCQljbG9uZS5zdHlsZS5wb3NpdGlvbiA9ICcnOworCQkJCQljbG9uZS5zdHlsZS52aXNpYmlsaXR5ID0gJyc7CisJCQkJCWNsb25lLnN0eWxlLndpZHRoID0gb3cgKyAncHgnOworCQkJCQkKKwkJCQkJZGl2LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBjbG9uZS5zdHlsZS5jc3NUZXh0KTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLy8gUGFkZGluZyBhdm9pZHMgY2xpcHBpbmcgb24gYm9yZGVyCisJCQkJCW93ID0gZGl2Mi5vZmZzZXRXaWR0aCArIHBhZFg7CisJCQkJCW9oID0gZGl2Mi5vZmZzZXRIZWlnaHQgKyBwYWRZOworCQkJCX0KKworCQkJCWNsb25lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmUpOworCQkJCWZvLmFwcGVuZENoaWxkKGRpdik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLy8gVXNlcyBkb2N1bWVudCBmb3IgdGV4dCBtZWFzdXJpbmcgZHVyaW5nIGV4cG9ydAorCQkJCWlmICh0aGlzLnJvb3Qub3duZXJEb2N1bWVudCAhPSBkb2N1bWVudCkKKwkJCQl7CisJCQkJCWRpdi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CisJCQkJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJZm8uYXBwZW5kQ2hpbGQoZGl2KTsKKwkJCQl9CisKKwkJCQl2YXIgc2l6ZURpdiA9IGRpdjsKKwkJCQkKKwkJCQlpZiAoc2l6ZURpdi5maXJzdENoaWxkICE9IG51bGwgJiYgc2l6ZURpdi5maXJzdENoaWxkLm5vZGVOYW1lID09ICdESVYnKQorCQkJCXsKKwkJCQkJc2l6ZURpdiA9IHNpemVEaXYuZmlyc3RDaGlsZDsKKwkJCQkJCisJCQkJCWlmICh3cmFwICYmIGRpdi5zdHlsZS53b3JkV3JhcCA9PSAnYnJlYWstd29yZCcpCisJCQkJCXsKKwkJCQkJCXNpemVEaXYuc3R5bGUud2lkdGggPSAnMTAwJSc7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJdmFyIHRtcCA9IHNpemVEaXYub2Zmc2V0V2lkdGg7CisJCQkJCisJCQkJLy8gV29ya2Fyb3VuZCBmb3IgdGV4dCBtZWFzdXJpbmcgaW4gaGlkZGVuIGNvbnRhaW5lcnMKKwkJCQlpZiAodG1wID09IDAgJiYgZGl2LnBhcmVudE5vZGUgPT0gZm8pCisJCQkJeworCQkJCQlkaXYuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOworCQkJCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7CisJCQkJCQorCQkJCQl0bXAgPSBzaXplRGl2Lm9mZnNldFdpZHRoOworCQkJCX0KKwkJCQkKKwkJCQlpZiAodGhpcy5jYWNoZU9mZnNldFNpemUpCisJCQkJeworCQkJCQlncm91cC5teENhY2hlZE9mZnNldFdpZHRoID0gdG1wOworCQkJCX0KKwkJCQkKKwkJCQkvLyBEaXNhYmxlcyB3cmFwcGluZyBpZiB0ZXh0IGlzIG5vdCB3cmFwcGVkIGZvciBnaXZlbiB3aWR0aAorCQkJCWlmICghY2xpcCAmJiB3cmFwICYmIHcgPiAwICYmIHRoaXMucm9vdC5vd25lckRvY3VtZW50ICE9IGRvY3VtZW50ICYmCisJCQkJCW92ZXJmbG93ICE9ICdmaWxsJyAmJiBvdmVyZmxvdyAhPSAnd2lkdGgnKQorCQkJCXsKKwkJCQkJdmFyIHdzID0gZGl2LnN0eWxlLndoaXRlU3BhY2U7CisJCQkJCWRpdi5zdHlsZS53aGl0ZVNwYWNlID0gJ25vd3JhcCc7CisJCQkJCQorCQkJCQlpZiAodG1wIDwgc2l6ZURpdi5vZmZzZXRXaWR0aCkKKwkJCQkJeworCQkJCQkJZGl2LnN0eWxlLndoaXRlU3BhY2UgPSB3czsKKwkJCQkJfQorCQkJCX0KKworCQkJCW93ID0gdG1wICsgcGFkWCAtIDE7CisKKwkJCQkvLyBSZWNvbXB1dGVzIHRoZSBoZWlnaHQgb2YgdGhlIGVsZW1lbnQgZm9yIHdyYXBwZWQgd2lkdGgKKwkJCQlpZiAod3JhcCAmJiBvdmVyZmxvdyAhPSAnZmlsbCcgJiYgb3ZlcmZsb3cgIT0gJ3dpZHRoJykKKwkJCQl7CisJCQkJCWlmIChjbGlwKQorCQkJCQl7CisJCQkJCQlvdyA9IE1hdGgubWluKG93LCB3KTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJZGl2LnN0eWxlLndpZHRoID0gb3cgKyAncHgnOworCQkJCX0KKworCQkJCW93ID0gc2l6ZURpdi5vZmZzZXRXaWR0aDsKKwkJCQlvaCA9IHNpemVEaXYub2Zmc2V0SGVpZ2h0OworCQkJCQorCQkJCWlmICh0aGlzLmNhY2hlT2Zmc2V0U2l6ZSkKKwkJCQl7CisJCQkJCWdyb3VwLm14Q2FjaGVkRmluYWxPZmZzZXRXaWR0aCA9IG93OworCQkJCQlncm91cC5teENhY2hlZEZpbmFsT2Zmc2V0SGVpZ2h0ID0gb2g7CisJCQkJfQorCisJCQkJb2ggLT0gcGFkWTsKKwkJCQkKKwkJCQlpZiAoZGl2LnBhcmVudE5vZGUgIT0gZm8pCisJCQkJeworCQkJCQlmby5hcHBlbmRDaGlsZChkaXYpOworCQkJCQlkaXYuc3R5bGUudmlzaWJpbGl0eSA9ICcnOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGNsaXApCisJCQl7CisJCQkJb2ggPSBNYXRoLm1pbihvaCwgaCk7CisJCQkJb3cgPSBNYXRoLm1pbihvdywgdyk7CisJCQl9CisKKwkJCWlmIChvdmVyZmxvdyA9PSAnd2lkdGgnKQorCQkJeworCQkJCWggPSBvaDsKKwkJCX0KKwkJCWVsc2UgaWYgKG92ZXJmbG93ICE9ICdmaWxsJykKKwkJCXsKKwkJCQl3ID0gb3c7CisJCQkJaCA9IG9oOworCQkJfQorCisJCQlpZiAocy5hbHBoYSA8IDEpCisJCQl7CisJCQkJZ3JvdXAuc2V0QXR0cmlidXRlKCdvcGFjaXR5Jywgcy5hbHBoYSk7CisJCQl9CisJCQkKKwkJCXZhciBkeCA9IDA7CisJCQl2YXIgZHkgPSAwOworCisJCQlpZiAoYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fQ0VOVEVSKQorCQkJeworCQkJCWR4IC09IHcgLyAyOworCQkJfQorCQkJZWxzZSBpZiAoYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fUklHSFQpCisJCQl7CisJCQkJZHggLT0gdzsKKwkJCX0KKwkJCQorCQkJeCArPSBkeDsKKwkJCQorCQkJLy8gRklYTUU6IExJTkVfSEVJR0hUIG5vdCBpZGVhbCBmb3IgYWxsIHRleHQgc2l6ZXMsIGZpeCBmb3IgZXhwb3J0CisJCQlpZiAodmFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSkKKwkJCXsKKwkJCQlkeSAtPSBoIC8gMjsKKwkJCX0KKwkJCWVsc2UgaWYgKHZhbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9CT1RUT00pCisJCQl7CisJCQkJZHkgLT0gaDsKKwkJCX0KKwkJCQorCQkJLy8gV29ya2Fyb3VuZCBmb3IgcmVuZGVyaW5nIG9mZnNldHMKKwkJCS8vIFRPRE86IENoZWNrIGlmIGV4cG9ydCBuZWVkcyB0aGVzZSBmaXhlcywgdG9vCisJCQkvL2lmICh0aGlzLnJvb3Qub3duZXJEb2N1bWVudCA9PSBkb2N1bWVudCkKKwkJCWlmIChvdmVyZmxvdyAhPSAnZmlsbCcgJiYgbXhDbGllbnQuSVNfRkYgJiYgbXhDbGllbnQuSVNfV0lOKQorCQkJeworCQkJCWR5IC09IDI7CisJCQl9CisJCQkKKwkJCXkgKz0gZHk7CisKKwkJCXZhciB0ciA9IChzLnNjYWxlICE9IDEpID8gJ3NjYWxlKCcgKyBzLnNjYWxlICsgJyknIDogJyc7CisKKwkJCWlmIChzLnJvdGF0aW9uICE9IDAgJiYgdGhpcy5yb3RhdGVIdG1sKQorCQkJeworCQkJCXRyICs9ICdyb3RhdGUoJyArIChzLnJvdGF0aW9uKSArICcsJyArICh3IC8gMikgKyAnLCcgKyAoaCAvIDIpICsgJyknOworCQkJCXZhciBwdCA9IHRoaXMucm90YXRlUG9pbnQoKHggKyB3IC8gMikgKiBzLnNjYWxlLCAoeSArIGggLyAyKSAqIHMuc2NhbGUsCisJCQkJCXMucm90YXRpb24sIHMucm90YXRpb25DeCwgcy5yb3RhdGlvbkN5KTsKKwkJCQl4ID0gcHQueCAtIHcgKiBzLnNjYWxlIC8gMjsKKwkJCQl5ID0gcHQueSAtIGggKiBzLnNjYWxlIC8gMjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl4ICo9IHMuc2NhbGU7CisJCQkJeSAqPSBzLnNjYWxlOworCQkJfQorCisJCQlpZiAocm90YXRpb24gIT0gMCkKKwkJCXsKKwkJCQl0ciArPSAncm90YXRlKCcgKyAocm90YXRpb24pICsgJywnICsgKC1keCkgKyAnLCcgKyAoLWR5KSArICcpJzsKKwkJCX0KKworCQkJZ3JvdXAuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyAoTWF0aC5yb3VuZCh4KSArIHRoaXMuZm9PZmZzZXQpICsgJywnICsKKwkJCQkoTWF0aC5yb3VuZCh5KSArIHRoaXMuZm9PZmZzZXQpICsgJyknICsgdHIpOworCQkJZm8uc2V0QXR0cmlidXRlKCd3aWR0aCcsIE1hdGgucm91bmQoTWF0aC5tYXgoMSwgdykpKTsKKwkJCWZvLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgTWF0aC5yb3VuZChNYXRoLm1heCgxLCBoKSkpOworCQkJCisJCQkvLyBBZGRzIGFsdGVybmF0ZSBjb250ZW50IGlmIGZvcmVpZ25PYmplY3Qgbm90IHN1cHBvcnRlZCBpbiB2aWV3ZXIKKwkJCWlmICh0aGlzLnJvb3Qub3duZXJEb2N1bWVudCAhPSBkb2N1bWVudCkKKwkJCXsKKwkJCQl2YXIgYWx0ID0gdGhpcy5jcmVhdGVBbHRlcm5hdGVDb250ZW50KGZvLCB4LCB5LCB3LCBoLCBzdHIsIGFsaWduLCB2YWxpZ24sIHdyYXAsIGZvcm1hdCwgb3ZlcmZsb3csIGNsaXAsIHJvdGF0aW9uKTsKKwkJCQkKKwkJCQlpZiAoYWx0ICE9IG51bGwpCisJCQkJeworCQkJCQlmby5zZXRBdHRyaWJ1dGUoJ3JlcXVpcmVkRmVhdHVyZXMnLCAnaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHMTEvZmVhdHVyZSNFeHRlbnNpYmlsaXR5Jyk7CisJCQkJCXZhciBzdyA9IHRoaXMuY3JlYXRlRWxlbWVudCgnc3dpdGNoJyk7CisJCQkJCXN3LmFwcGVuZENoaWxkKGZvKTsKKwkJCQkJc3cuYXBwZW5kQ2hpbGQoYWx0KTsKKwkJCQkJZ3JvdXAuYXBwZW5kQ2hpbGQoc3cpOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXRoaXMucGxhaW5UZXh0KHgsIHksIHcsIGgsIHN0ciwgYWxpZ24sIHZhbGlnbiwgd3JhcCwgb3ZlcmZsb3csIGNsaXAsIHJvdGF0aW9uLCBkaXIpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlQ2xpcAorICogCisgKiBDcmVhdGVzIGEgY2xpcCBmb3IgdGhlIGdpdmVuIGNvb3JkaW5hdGVzLgorICovCitteFN2Z0NhbnZhczJELnByb3RvdHlwZS5jcmVhdGVDbGlwID0gZnVuY3Rpb24oeCwgeSwgdywgaCkKK3sKKwl4ID0gTWF0aC5yb3VuZCh4KTsKKwl5ID0gTWF0aC5yb3VuZCh5KTsKKwl3ID0gTWF0aC5yb3VuZCh3KTsKKwloID0gTWF0aC5yb3VuZChoKTsKKwkKKwl2YXIgaWQgPSAnbXgtY2xpcC0nICsgeCArICctJyArIHkgKyAnLScgKyB3ICsgJy0nICsgaDsKKworCXZhciBjb3VudGVyID0gMDsKKwl2YXIgdG1wID0gaWQgKyAnLScgKyBjb3VudGVyOworCQorCS8vIFJlc29sdmVzIElEIGNvbmZsaWN0cworCXdoaWxlIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0bXApICE9IG51bGwpCisJeworCQl0bXAgPSBpZCArICctJyArICgrK2NvdW50ZXIpOworCX0KKwkKKwljbGlwID0gdGhpcy5jcmVhdGVFbGVtZW50KCdjbGlwUGF0aCcpOworCWNsaXAuc2V0QXR0cmlidXRlKCdpZCcsIHRtcCk7CisJCisJdmFyIHJlY3QgPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ3JlY3QnKTsKKwlyZWN0LnNldEF0dHJpYnV0ZSgneCcsIHgpOworCXJlY3Quc2V0QXR0cmlidXRlKCd5JywgeSk7CisJcmVjdC5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgdyk7CisJcmVjdC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGgpOworCQkKKwljbGlwLmFwcGVuZENoaWxkKHJlY3QpOworCQorCXJldHVybiBjbGlwOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdGV4dAorICogCisgKiBQYWludHMgdGhlIGdpdmVuIHRleHQuIFBvc3NpYmxlIHZhbHVlcyBmb3IgZm9ybWF0IGFyZSBlbXB0eSBzdHJpbmcgZm9yCisgKiBwbGFpbiB0ZXh0IGFuZCBodG1sIGZvciBIVE1MIG1hcmt1cC4KKyAqLworbXhTdmdDYW52YXMyRC5wcm90b3R5cGUucGxhaW5UZXh0ID0gZnVuY3Rpb24oeCwgeSwgdywgaCwgc3RyLCBhbGlnbiwgdmFsaWduLCB3cmFwLCBvdmVyZmxvdywgY2xpcCwgcm90YXRpb24sIGRpcikKK3sKKwlyb3RhdGlvbiA9IChyb3RhdGlvbiAhPSBudWxsKSA/IHJvdGF0aW9uIDogMDsKKwl2YXIgcyA9IHRoaXMuc3RhdGU7CisJdmFyIHNpemUgPSBzLmZvbnRTaXplOworCXZhciBub2RlID0gdGhpcy5jcmVhdGVFbGVtZW50KCdnJyk7CisJdmFyIHRyID0gcy50cmFuc2Zvcm0gfHwgJyc7CisJdGhpcy51cGRhdGVGb250KG5vZGUpOworCQorCS8vIE5vbi1yb3RhdGVkIHRleHQKKwlpZiAocm90YXRpb24gIT0gMCkKKwl7CisJCXRyICs9ICdyb3RhdGUoJyArIHJvdGF0aW9uICArICcsJyArIHRoaXMuZm9ybWF0KHggKiBzLnNjYWxlKSArICcsJyArIHRoaXMuZm9ybWF0KHkgKiBzLnNjYWxlKSArICcpJzsKKwl9CisJCisJaWYgKGRpciAhPSBudWxsKQorCXsKKwkJbm9kZS5zZXRBdHRyaWJ1dGUoJ2RpcmVjdGlvbicsIGRpcik7CisJfQorCisJaWYgKGNsaXAgJiYgdyA+IDAgJiYgaCA+IDApCisJeworCQl2YXIgY3ggPSB4OworCQl2YXIgY3kgPSB5OworCQkKKwkJaWYgKGFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUikKKwkJeworCQkJY3ggLT0gdyAvIDI7CisJCX0KKwkJZWxzZSBpZiAoYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fUklHSFQpCisJCXsKKwkJCWN4IC09IHc7CisJCX0KKwkJCisJCWlmIChvdmVyZmxvdyAhPSAnZmlsbCcpCisJCXsKKwkJCWlmICh2YWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fTUlERExFKQorCQkJeworCQkJCWN5IC09IGggLyAyOworCQkJfQorCQkJZWxzZSBpZiAodmFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX0JPVFRPTSkKKwkJCXsKKwkJCQljeSAtPSBoOworCQkJfQorCQl9CisJCQorCQkvLyBMQVRFUjogUmVtb3ZlIHNwYWNpbmcgZnJvbSBjbGlwIHJlY3RhbmdsZQorCQl2YXIgYyA9IHRoaXMuY3JlYXRlQ2xpcChjeCAqIHMuc2NhbGUgLSAyLCBjeSAqIHMuc2NhbGUgLSAyLCB3ICogcy5zY2FsZSArIDQsIGggKiBzLnNjYWxlICsgNCk7CisJCQorCQlpZiAodGhpcy5kZWZzICE9IG51bGwpCisJCXsKKwkJCXRoaXMuZGVmcy5hcHBlbmRDaGlsZChjKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIE1ha2VzIHN1cmUgY2xpcCBpcyByZW1vdmVkIHdpdGggcmVmZXJlbmNpbmcgbm9kZQorCQkJdGhpcy5yb290LmFwcGVuZENoaWxkKGMpOworCQl9CisJCQorCQlpZiAoIW14Q2xpZW50LklTX0NIUk9NRV9BUFAgJiYgIW14Q2xpZW50LklTX0lFICYmICFteENsaWVudC5JU19JRTExICYmCisJCQkhbXhDbGllbnQuSVNfRURHRSAmJiB0aGlzLnJvb3Qub3duZXJEb2N1bWVudCA9PSBkb2N1bWVudCkKKwkJeworCQkJLy8gV29ya2Fyb3VuZCBmb3IgcG90ZW50aWFsIGJhc2UgdGFnCisJCQl2YXIgYmFzZSA9IHRoaXMuZ2V0QmFzZVVybCgpLnJlcGxhY2UoLyhbXChcKV0pL2csICdcXCQxJyk7CisJCQlub2RlLnNldEF0dHJpYnV0ZSgnY2xpcC1wYXRoJywgJ3VybCgnICsgYmFzZSArICcjJyArIGMuZ2V0QXR0cmlidXRlKCdpZCcpICsgJyknKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW5vZGUuc2V0QXR0cmlidXRlKCdjbGlwLXBhdGgnLCAndXJsKCMnICsgYy5nZXRBdHRyaWJ1dGUoJ2lkJykgKyAnKScpOworCQl9CisJfQorCisJLy8gRGVmYXVsdCBpcyBsZWZ0CisJdmFyIGFuY2hvciA9IChhbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9SSUdIVCkgPyAnZW5kJyA6CisJCQkJCShhbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9DRU5URVIpID8gJ21pZGRsZScgOgorCQkJCQknc3RhcnQnOworCisJLy8gVGV4dC1hbmNob3Igc3RhcnQgaXMgZGVmYXVsdCBpbiBTVkcKKwlpZiAoYW5jaG9yICE9ICdzdGFydCcpCisJeworCQlub2RlLnNldEF0dHJpYnV0ZSgndGV4dC1hbmNob3InLCBhbmNob3IpOworCX0KKwkKKwlpZiAoIXRoaXMuc3R5bGVFbmFibGVkIHx8IHNpemUgIT0gbXhDb25zdGFudHMuREVGQVVMVF9GT05UU0laRSkKKwl7CisJCW5vZGUuc2V0QXR0cmlidXRlKCdmb250LXNpemUnLCAoc2l6ZSAqIHMuc2NhbGUpICsgJ3B4Jyk7CisJfQorCQorCWlmICh0ci5sZW5ndGggPiAwKQorCXsKKwkJbm9kZS5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIHRyKTsKKwl9CisJCisJaWYgKHMuYWxwaGEgPCAxKQorCXsKKwkJbm9kZS5zZXRBdHRyaWJ1dGUoJ29wYWNpdHknLCBzLmFscGhhKTsKKwl9CisJCisJdmFyIGxpbmVzID0gc3RyLnNwbGl0KCdcbicpOworCXZhciBsaCA9IE1hdGgucm91bmQoc2l6ZSAqIG14Q29uc3RhbnRzLkxJTkVfSEVJR0hUKTsKKwl2YXIgdGV4dEhlaWdodCA9IHNpemUgKyAobGluZXMubGVuZ3RoIC0gMSkgKiBsaDsKKworCXZhciBjeSA9IHkgKyBzaXplIC0gMTsKKworCWlmICh2YWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fTUlERExFKQorCXsKKwkJaWYgKG92ZXJmbG93ID09ICdmaWxsJykKKwkJeworCQkJY3kgLT0gaCAvIDI7CisJCX0KKwkJZWxzZQorCQl7CisJCQl2YXIgZHkgPSAoKHRoaXMubWF0Y2hIdG1sQWxpZ25tZW50ICYmIGNsaXAgJiYgaCA+IDApID8gTWF0aC5taW4odGV4dEhlaWdodCwgaCkgOiB0ZXh0SGVpZ2h0KSAvIDI7CisJCQljeSAtPSBkeSArIDE7CisJCX0KKwl9CisJZWxzZSBpZiAodmFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX0JPVFRPTSkKKwl7CisJCWlmIChvdmVyZmxvdyA9PSAnZmlsbCcpCisJCXsKKwkJCWN5IC09IGg7CisJCX0KKwkJZWxzZQorCQl7CisJCQl2YXIgZHkgPSAodGhpcy5tYXRjaEh0bWxBbGlnbm1lbnQgJiYgY2xpcCAmJiBoID4gMCkgPyBNYXRoLm1pbih0ZXh0SGVpZ2h0LCBoKSA6IHRleHRIZWlnaHQ7CisJCQljeSAtPSBkeSArIDI7CisJCX0KKwl9CisKKwlmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKQorCXsKKwkJLy8gV29ya2Fyb3VuZCBmb3IgYm91bmRpbmcgYm94IG9mIGVtcHR5IGxpbmVzIGFuZCBzcGFjZXMKKwkJaWYgKGxpbmVzW2ldLmxlbmd0aCA+IDAgJiYgbXhVdGlscy50cmltKGxpbmVzW2ldKS5sZW5ndGggPiAwKQorCQl7CisJCQl2YXIgdGV4dCA9IHRoaXMuY3JlYXRlRWxlbWVudCgndGV4dCcpOworCQkJLy8gTEFURVI6IE1hdGNoIGhvcml6b250YWwgSFRNTCBhbGlnbm1lbnQKKwkJCXRleHQuc2V0QXR0cmlidXRlKCd4JywgdGhpcy5mb3JtYXQoeCAqIHMuc2NhbGUpICsgdGhpcy50ZXh0T2Zmc2V0KTsKKwkJCXRleHQuc2V0QXR0cmlidXRlKCd5JywgdGhpcy5mb3JtYXQoY3kgKiBzLnNjYWxlKSArIHRoaXMudGV4dE9mZnNldCk7CisJCQkKKwkJCW14VXRpbHMud3JpdGUodGV4dCwgbGluZXNbaV0pOworCQkJbm9kZS5hcHBlbmRDaGlsZCh0ZXh0KTsKKwkJfQorCisJCWN5ICs9IGxoOworCX0KKworCXRoaXMucm9vdC5hcHBlbmRDaGlsZChub2RlKTsKKwl0aGlzLmFkZFRleHRCYWNrZ3JvdW5kKG5vZGUsIHN0ciwgeCwgeSwgdywgKG92ZXJmbG93ID09ICdmaWxsJykgPyBoIDogdGV4dEhlaWdodCwgYWxpZ24sIHZhbGlnbiwgb3ZlcmZsb3cpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlRm9udAorICogCisgKiBVcGRhdGVzIHRoZSB0ZXh0IHByb3BlcnRpZXMgZm9yIHRoZSBnaXZlbiBub2RlLiAoTk9URTogRm9yIHRoaXMgdG8gd29yayBpbgorICogSUUsIHRoZSBnaXZlbiBub2RlIG11c3QgYmUgYSB0ZXh0IG9yIHRzcGFuIGVsZW1lbnQuKQorICovCitteFN2Z0NhbnZhczJELnByb3RvdHlwZS51cGRhdGVGb250ID0gZnVuY3Rpb24obm9kZSkKK3sKKwl2YXIgcyA9IHRoaXMuc3RhdGU7CisKKwlub2RlLnNldEF0dHJpYnV0ZSgnZmlsbCcsIHMuZm9udENvbG9yKTsKKwkKKwlpZiAoIXRoaXMuc3R5bGVFbmFibGVkIHx8IHMuZm9udEZhbWlseSAhPSBteENvbnN0YW50cy5ERUZBVUxUX0ZPTlRGQU1JTFkpCisJeworCQlub2RlLnNldEF0dHJpYnV0ZSgnZm9udC1mYW1pbHknLCBzLmZvbnRGYW1pbHkpOworCX0KKworCWlmICgocy5mb250U3R5bGUgJiBteENvbnN0YW50cy5GT05UX0JPTEQpID09IG14Q29uc3RhbnRzLkZPTlRfQk9MRCkKKwl7CisJCW5vZGUuc2V0QXR0cmlidXRlKCdmb250LXdlaWdodCcsICdib2xkJyk7CisJfQorCisJaWYgKChzLmZvbnRTdHlsZSAmIG14Q29uc3RhbnRzLkZPTlRfSVRBTElDKSA9PSBteENvbnN0YW50cy5GT05UX0lUQUxJQykKKwl7CisJCW5vZGUuc2V0QXR0cmlidXRlKCdmb250LXN0eWxlJywgJ2l0YWxpYycpOworCX0KKwkKKwlpZiAoKHMuZm9udFN0eWxlICYgbXhDb25zdGFudHMuRk9OVF9VTkRFUkxJTkUpID09IG14Q29uc3RhbnRzLkZPTlRfVU5ERVJMSU5FKQorCXsKKwkJbm9kZS5zZXRBdHRyaWJ1dGUoJ3RleHQtZGVjb3JhdGlvbicsICd1bmRlcmxpbmUnKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRUZXh0QmFja2dyb3VuZAorICogCisgKiBCYWNrZ3JvdW5kIGNvbG9yIGFuZCBib3JkZXIKKyAqLworbXhTdmdDYW52YXMyRC5wcm90b3R5cGUuYWRkVGV4dEJhY2tncm91bmQgPSBmdW5jdGlvbihub2RlLCBzdHIsIHgsIHksIHcsIGgsIGFsaWduLCB2YWxpZ24sIG92ZXJmbG93KQoreworCXZhciBzID0gdGhpcy5zdGF0ZTsKKworCWlmIChzLmZvbnRCYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCB8fCBzLmZvbnRCb3JkZXJDb2xvciAhPSBudWxsKQorCXsKKwkJdmFyIGJib3ggPSBudWxsOworCQkKKwkJaWYgKG92ZXJmbG93ID09ICdmaWxsJyB8fCBvdmVyZmxvdyA9PSAnd2lkdGgnKQorCQl7CisJCQlpZiAoYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fQ0VOVEVSKQorCQkJeworCQkJCXggLT0gdyAvIDI7CisJCQl9CisJCQllbHNlIGlmIChhbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9SSUdIVCkKKwkJCXsKKwkJCQl4IC09IHc7CisJCQl9CisJCQkKKwkJCWlmICh2YWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fTUlERExFKQorCQkJeworCQkJCXkgLT0gaCAvIDI7CisJCQl9CisJCQllbHNlIGlmICh2YWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fQk9UVE9NKQorCQkJeworCQkJCXkgLT0gaDsKKwkJCX0KKwkJCQorCQkJYmJveCA9IG5ldyBteFJlY3RhbmdsZSgoeCArIDEpICogcy5zY2FsZSwgeSAqIHMuc2NhbGUsICh3IC0gMikgKiBzLnNjYWxlLCAoaCArIDIpICogcy5zY2FsZSk7CisJCX0KKwkJZWxzZSBpZiAobm9kZS5nZXRCQm94ICE9IG51bGwgJiYgdGhpcy5yb290Lm93bmVyRG9jdW1lbnQgPT0gZG9jdW1lbnQpCisJCXsKKwkJCS8vIFVzZXMgZ2V0QkJveCBvbmx5IGlmIGluc2lkZSBkb2N1bWVudCBmb3IgY29ycmVjdCBzaXplCisJCQl0cnkKKwkJCXsKKwkJCQliYm94ID0gbm9kZS5nZXRCQm94KCk7CisJCQkJdmFyIGllID0gbXhDbGllbnQuSVNfSUUgJiYgbXhDbGllbnQuSVNfU1ZHOworCQkJCWJib3ggPSBuZXcgbXhSZWN0YW5nbGUoYmJveC54LCBiYm94LnkgKyAoKGllKSA/IDAgOiAxKSwgYmJveC53aWR0aCwgYmJveC5oZWlnaHQgKyAoKGllKSA/IDEgOiAwKSk7CisJCQl9CisJCQljYXRjaCAoZSkKKwkJCXsKKwkJCQkvLyBJZ25vcmVzIE5TX0VSUk9SX0ZBSUxVUkUgaW4gRkYgaWYgY29udGFpbmVyIGRpc3BsYXkgaXMgbm9uZS4KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIENvbXB1dGVzIHNpemUgaWYgbm90IGluIGRvY3VtZW50IG9yIG5vIGdldEJCb3ggYXZhaWxhYmxlCisJCQl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisKKwkJCS8vIFdyYXBwaW5nIGFuZCBjbGlwcGluZyBjYW4gYmUgaWdub3JlZCBoZXJlCisJCQlkaXYuc3R5bGUubGluZUhlaWdodCA9IChteENvbnN0YW50cy5BQlNPTFVURV9MSU5FX0hFSUdIVCkgPyAocy5mb250U2l6ZSAqIG14Q29uc3RhbnRzLkxJTkVfSEVJR0hUKSArICdweCcgOiBteENvbnN0YW50cy5MSU5FX0hFSUdIVDsKKwkJCWRpdi5zdHlsZS5mb250U2l6ZSA9IHMuZm9udFNpemUgKyAncHgnOworCQkJZGl2LnN0eWxlLmZvbnRGYW1pbHkgPSBzLmZvbnRGYW1pbHk7CisJCQlkaXYuc3R5bGUud2hpdGVTcGFjZSA9ICdub3dyYXAnOworCQkJZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKwkJCWRpdi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CisJCQlkaXYuc3R5bGUuZGlzcGxheSA9IChteENsaWVudC5JU19RVUlSS1MpID8gJ2lubGluZScgOiAnaW5saW5lLWJsb2NrJzsKKwkJCWRpdi5zdHlsZS56b29tID0gJzEnOworCQkJCisJCQlpZiAoKHMuZm9udFN0eWxlICYgbXhDb25zdGFudHMuRk9OVF9CT0xEKSA9PSBteENvbnN0YW50cy5GT05UX0JPTEQpCisJCQl7CisJCQkJZGl2LnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7CisJCQl9CisKKwkJCWlmICgocy5mb250U3R5bGUgJiBteENvbnN0YW50cy5GT05UX0lUQUxJQykgPT0gbXhDb25zdGFudHMuRk9OVF9JVEFMSUMpCisJCQl7CisJCQkJZGl2LnN0eWxlLmZvbnRTdHlsZSA9ICdpdGFsaWMnOworCQkJfQorCQkJCisJCQlzdHIgPSBteFV0aWxzLmh0bWxFbnRpdGllcyhzdHIsIGZhbHNlKTsKKwkJCWRpdi5pbm5lckhUTUwgPSBzdHIucmVwbGFjZSgvXG4vZywgJzxici8+Jyk7CisJCQkKKwkJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTsKKwkJCXZhciB3ID0gZGl2Lm9mZnNldFdpZHRoOworCQkJdmFyIGggPSBkaXYub2Zmc2V0SGVpZ2h0OworCQkJZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZGl2KTsKKwkJCQorCQkJaWYgKGFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUikKKwkJCXsKKwkJCQl4IC09IHcgLyAyOworCQkJfQorCQkJZWxzZSBpZiAoYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fUklHSFQpCisJCQl7CisJCQkJeCAtPSB3OworCQkJfQorCQkJCisJCQlpZiAodmFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSkKKwkJCXsKKwkJCQl5IC09IGggLyAyOworCQkJfQorCQkJZWxzZSBpZiAodmFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX0JPVFRPTSkKKwkJCXsKKwkJCQl5IC09IGg7CisJCQl9CisJCQkKKwkJCWJib3ggPSBuZXcgbXhSZWN0YW5nbGUoKHggKyAxKSAqIHMuc2NhbGUsICh5ICsgMikgKiBzLnNjYWxlLCB3ICogcy5zY2FsZSwgKGggKyAxKSAqIHMuc2NhbGUpOworCQl9CisJCQorCQlpZiAoYmJveCAhPSBudWxsKQorCQl7CisJCQl2YXIgbiA9IHRoaXMuY3JlYXRlRWxlbWVudCgncmVjdCcpOworCQkJbi5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCBzLmZvbnRCYWNrZ3JvdW5kQ29sb3IgfHwgJ25vbmUnKTsKKwkJCW4uc2V0QXR0cmlidXRlKCdzdHJva2UnLCBzLmZvbnRCb3JkZXJDb2xvciB8fCAnbm9uZScpOworCQkJbi5zZXRBdHRyaWJ1dGUoJ3gnLCBNYXRoLmZsb29yKGJib3gueCAtIDEpKTsKKwkJCW4uc2V0QXR0cmlidXRlKCd5JywgTWF0aC5mbG9vcihiYm94LnkgLSAxKSk7CisJCQluLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBNYXRoLmNlaWwoYmJveC53aWR0aCArIDIpKTsKKwkJCW4uc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBNYXRoLmNlaWwoYmJveC5oZWlnaHQpKTsKKworCQkJdmFyIHN3ID0gKHMuZm9udEJvcmRlckNvbG9yICE9IG51bGwpID8gTWF0aC5tYXgoMSwgdGhpcy5mb3JtYXQocy5zY2FsZSkpIDogMDsKKwkJCW4uc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBzdyk7CisJCQkKKwkJCS8vIFdvcmthcm91bmQgZm9yIGNyaXNwIHJlbmRlcmluZyAtIG9ubHkgcmVxdWlyZWQgaWYgbm90IGV4cG9ydGluZworCQkJaWYgKHRoaXMucm9vdC5vd25lckRvY3VtZW50ID09IGRvY3VtZW50ICYmIG14VXRpbHMubW9kKHN3LCAyKSA9PSAxKQorCQkJeworCQkJCW4uc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAuNSwgMC41KScpOworCQkJfQorCQkJCisJCQlub2RlLmluc2VydEJlZm9yZShuLCBub2RlLmZpcnN0Q2hpbGQpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogc3Ryb2tlCisgKiAKKyAqIFBhaW50cyB0aGUgb3V0bGluZSBvZiB0aGUgY3VycmVudCBwYXRoLgorICovCitteFN2Z0NhbnZhczJELnByb3RvdHlwZS5zdHJva2UgPSBmdW5jdGlvbigpCit7CisJdGhpcy5hZGROb2RlKGZhbHNlLCB0cnVlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGZpbGwKKyAqIAorICogRmlsbHMgdGhlIGN1cnJlbnQgcGF0aC4KKyAqLworbXhTdmdDYW52YXMyRC5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLmFkZE5vZGUodHJ1ZSwgZmFsc2UpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZmlsbEFuZFN0cm9rZQorICogCisgKiBGaWxscyBhbmQgcGFpbnRzIHRoZSBvdXRsaW5lIG9mIHRoZSBjdXJyZW50IHBhdGguCisgKi8KK214U3ZnQ2FudmFzMkQucHJvdG90eXBlLmZpbGxBbmRTdHJva2UgPSBmdW5jdGlvbigpCit7CisJdGhpcy5hZGROb2RlKHRydWUsIHRydWUpOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214VG9vbGJhci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214VG9vbGJhci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjkwY2VkCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhUb29sYmFyLmpzCkBAIC0wLDAgKzEsNTI3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFRvb2xiYXIKKyAqIAorICogQ3JlYXRlcyBhIHRvb2xiYXIgaW5zaWRlIGEgZ2l2ZW4gRE9NIG5vZGUuIFRoZSB0b29sYmFyIG1heSBjb250YWluIGljb25zLAorICogYnV0dG9ucyBhbmQgY29tYm8gYm94ZXMuCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LlNFTEVDVAorICogCisgKiBGaXJlcyB3aGVuIGFuIGl0ZW0gd2FzIHNlbGVjdGVkIGluIHRoZSB0b29sYmFyLiBUaGUgPGNvZGU+ZnVuY3Rpb248L2NvZGU+CisgKiBwcm9wZXJ0eSBjb250YWlucyB0aGUgZnVuY3Rpb24gdGhhdCB3YXMgc2VsZWN0ZWQgaW4gPHNlbGVjdE1vZGU+LgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhUb29sYmFyCisgKiAKKyAqIENvbnN0cnVjdHMgYSB0b29sYmFyIGluIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogY29udGFpbmVyIC0gRE9NIG5vZGUgdGhhdCBjb250YWlucyB0aGUgdG9vbGJhci4KKyAqLworZnVuY3Rpb24gbXhUb29sYmFyKGNvbnRhaW5lcikKK3sKKwl0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKK307CisKKy8qKgorICogRXh0ZW5kcyBteEV2ZW50U291cmNlLgorICovCitteFRvb2xiYXIucHJvdG90eXBlID0gbmV3IG14RXZlbnRTb3VyY2UoKTsKK214VG9vbGJhci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBteFRvb2xiYXI7CisKKy8qKgorICogVmFyaWFibGU6IGNvbnRhaW5lcgorICogCisgKiBSZWZlcmVuY2UgdG8gdGhlIERPTSBub2RlcyB0aGF0IGNvbnRhaW5zIHRoZSB0b29sYmFyLgorICovCitteFRvb2xiYXIucHJvdG90eXBlLmNvbnRhaW5lciA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIGV2ZW50cyBhcmUgaGFuZGxlZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteFRvb2xiYXIucHJvdG90eXBlLmVuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBub1Jlc2V0CisgKiAKKyAqIFNwZWNpZmllcyBpZiA8cmVzZXRNb2RlPiByZXF1aXJlcyBhIGZvcmNlZCBmbGFnIG9mIHRydWUgZm9yIHJlc2V0dGluZworICogdGhlIGN1cnJlbnQgbW9kZSBpbiB0aGUgdG9vbGJhci4gRGVmYXVsdCBpcyBmYWxzZS4gVGhpcyBpcyBzZXQgdG8gdHJ1ZQorICogaWYgdGhlIHRvb2xiYXIgaXRlbSBpcyBkb3VibGUgY2xpY2tlZCB0byBhdm9pZCBhIHJlc2V0IGFmdGVyIGEgc2luZ2xlCisgKiB1c2Ugb2YgdGhlIGl0ZW0uCisgKi8KK214VG9vbGJhci5wcm90b3R5cGUubm9SZXNldCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiB1cGRhdGVEZWZhdWx0TW9kZQorICogCisgKiBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGRlZmF1bHQgbW9kZSBzaG91bGQgYmUgdGhlIGxhc3Qgc2VsZWN0ZWQKKyAqIHN3aXRjaCBtb2RlIG9yIHRoZSBmaXJzdCBpbnNlcnRlZCBzd2l0Y2ggbW9kZS4gRGVmYXVsdCBpcyB0cnVlLCB0aGF0CisgKiBpcyB0aGUgbGFzdCBzZWxlY3RlZCBzd2l0Y2ggbW9kZSBpcyB0aGUgZGVmYXVsdCBtb2RlLiBUaGUgZGVmYXVsdCBtb2RlCisgKiBpcyB0aGUgbW9kZSB0byBiZSBzZWxlY3RlZCBhZnRlciBhIHJlc2V0IG9mIHRoZSB0b29sYmFyLiBJZiB0aGlzIGlzCisgKiBmYWxzZSwgdGhlbiB0aGUgZGVmYXVsdCBtb2RlIGlzIHRoZSBmaXJzdCBpbnNlcnRlZCBtb2RlIGl0ZW0gcmVnYXJkbGVzcworICogb2Ygd2hhdCB3YXMgbGFzdCBzZWxlY3RlZC4gT3RoZXJ3aXNlLCB0aGUgc2VsZWN0ZWQgaXRlbSBhZnRlciBhIHJlc2V0IGlzCisgKiB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBpdGVtLgorICovCitteFRvb2xiYXIucHJvdG90eXBlLnVwZGF0ZURlZmF1bHRNb2RlID0gdHJ1ZTsKKworLyoqCisgKiBGdW5jdGlvbjogYWRkSXRlbQorICogCisgKiBBZGRzIHRoZSBnaXZlbiBmdW5jdGlvbiBhcyBhbiBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgdGl0bGUgYW5kIGljb24KKyAqIGFuZCByZXR1cm5zIHRoZSBuZXcgaW1hZ2Ugbm9kZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdGl0bGUgLSBPcHRpb25hbCBzdHJpbmcgdGhhdCBpcyB1c2VkIGFzIHRoZSB0b29sdGlwLgorICogaWNvbiAtIE9wdGlvbmFsIFVSTCBvZiB0aGUgaW1hZ2UgdG8gYmUgdXNlZC4gSWYgbm8gVVJMIGlzIGdpdmVuLCB0aGVuIGEKKyAqIGJ1dHRvbiBpcyBjcmVhdGVkLgorICogZnVuY3QgLSBGdW5jdGlvbiB0byBleGVjdXRlIG9uIGEgbW91c2UgY2xpY2suCisgKiBwcmVzc2VkSWNvbiAtIE9wdGlvbmFsIFVSTCBvZiB0aGUgcHJlc3NlZCBpbWFnZS4gRGVmYXVsdCBpcyBhIGdyYXkKKyAqIGJhY2tncm91bmQuCisgKiBzdHlsZSAtIE9wdGlvbmFsIHN0eWxlIGNsYXNzbmFtZS4gRGVmYXVsdCBpcyBteFRvb2xiYXJJdGVtLgorICogZmFjdG9yeU1ldGhvZCAtIE9wdGlvbmFsIGZhY3RvcnkgbWV0aG9kIGZvciBwb3B1cCBtZW51LCBlZy4KKyAqIGZ1bmN0aW9uKG1lbnUsIGV2dCwgY2VsbCkgeyBtZW51LmFkZEl0ZW0oJ0hlbGxvLCBXb3JsZCEnKTsgfQorICovCitteFRvb2xiYXIucHJvdG90eXBlLmFkZEl0ZW0gPSBmdW5jdGlvbih0aXRsZSwgaWNvbiwgZnVuY3QsIHByZXNzZWRJY29uLCBzdHlsZSwgZmFjdG9yeU1ldGhvZCkKK3sKKwl2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgoaWNvbiAhPSBudWxsKSA/ICdpbWcnIDogJ2J1dHRvbicpOworCXZhciBpbml0aWFsQ2xhc3NOYW1lID0gc3R5bGUgfHwgKChmYWN0b3J5TWV0aG9kICE9IG51bGwpID8KKwkJCSdteFRvb2xiYXJNb2RlJyA6ICdteFRvb2xiYXJJdGVtJyk7CisJaW1nLmNsYXNzTmFtZSA9IGluaXRpYWxDbGFzc05hbWU7CisJaW1nLnNldEF0dHJpYnV0ZSgnc3JjJywgaWNvbik7CisJCisJaWYgKHRpdGxlICE9IG51bGwpCisJeworCQlpZiAoaWNvbiAhPSBudWxsKQorCQl7CisJCQlpbWcuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRpdGxlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW14VXRpbHMud3JpdGUoaW1nLCB0aXRsZSk7CisJCX0KKwl9CisJCisJdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoaW1nKTsKKworCS8vIEludm9rZXMgdGhlIGZ1bmN0aW9uIG9uIGEgY2xpY2sgb24gdGhlIHRvb2xiYXIgaXRlbQorCWlmIChmdW5jdCAhPSBudWxsKQorCXsKKwkJbXhFdmVudC5hZGRMaXN0ZW5lcihpbWcsICdjbGljaycsIGZ1bmN0KTsKKwkJCisJCWlmIChteENsaWVudC5JU19UT1VDSCkKKwkJeworCQkJbXhFdmVudC5hZGRMaXN0ZW5lcihpbWcsICd0b3VjaGVuZCcsIGZ1bmN0KTsKKwkJfQorCX0KKworCXZhciBtb3VzZUhhbmRsZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCXsKKwkJaWYgKHByZXNzZWRJY29uICE9IG51bGwpCisJCXsKKwkJCWltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGljb24pOworCQl9CisJCWVsc2UKKwkJeworCQkJaW1nLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcnOworCQl9CisJfSk7CisKKwkvLyBIaWdobGlnaHRzIHRoZSB0b29sYmFyIGl0ZW0gd2l0aCBhIGdyYXkgYmFja2dyb3VuZAorCS8vIHdoaWxlIGl0IGlzIGJlaW5nIGNsaWNrZWQgd2l0aCB0aGUgbW91c2UKKwlteEV2ZW50LmFkZEdlc3R1cmVMaXN0ZW5lcnMoaW1nLCBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCXsKKwkJaWYgKHByZXNzZWRJY29uICE9IG51bGwpCisJCXsKKwkJCWltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIHByZXNzZWRJY29uKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWltZy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnZ3JheSc7CisJCX0KKwkJCisJCS8vIFBvcHVwIE1lbnUKKwkJaWYgKGZhY3RvcnlNZXRob2QgIT0gbnVsbCkKKwkJeworCQkJaWYgKHRoaXMubWVudSA9PSBudWxsKQorCQkJeworCQkJCXRoaXMubWVudSA9IG5ldyBteFBvcHVwTWVudSgpOworCQkJCXRoaXMubWVudS5pbml0KCk7CisJCQl9CisJCQkKKwkJCXZhciBsYXN0ID0gdGhpcy5jdXJyZW50SW1nOworCQkJCisJCQlpZiAodGhpcy5tZW51LmlzTWVudVNob3dpbmcoKSkKKwkJCXsKKwkJCQl0aGlzLm1lbnUuaGlkZU1lbnUoKTsKKwkJCX0KKwkJCQorCQkJaWYgKGxhc3QgIT0gaW1nKQorCQkJeworCQkJCS8vIFJlZGlyZWN0cyBmYWN0b3J5IG1ldGhvZCB0byBsb2NhbCBmYWN0b3J5IG1ldGhvZAorCQkJCXRoaXMuY3VycmVudEltZyA9IGltZzsKKwkJCQl0aGlzLm1lbnUuZmFjdG9yeU1ldGhvZCA9IGZhY3RvcnlNZXRob2Q7CisJCQkJCisJCQkJdmFyIHBvaW50ID0gbmV3IG14UG9pbnQoCisJCQkJCWltZy5vZmZzZXRMZWZ0LAorCQkJCQlpbWcub2Zmc2V0VG9wICsgaW1nLm9mZnNldEhlaWdodCk7CisJCQkJdGhpcy5tZW51LnBvcHVwKHBvaW50LngsIHBvaW50LnksIG51bGwsIGV2dCk7CisKKwkJCQkvLyBTZXRzIGFuZCBvdmVycmlkZXMgdG8gcmVzdG9yZSBjbGFzc25hbWUKKwkJCQlpZiAodGhpcy5tZW51LmlzTWVudVNob3dpbmcoKSkKKwkJCQl7CisJCQkJCWltZy5jbGFzc05hbWUgPSBpbml0aWFsQ2xhc3NOYW1lICsgJ1NlbGVjdGVkJzsKKwkJCQkJCisJCQkJCXRoaXMubWVudS5oaWRlTWVudSA9IGZ1bmN0aW9uKCkKKwkJCQkJeworCQkJCQkJbXhQb3B1cE1lbnUucHJvdG90eXBlLmhpZGVNZW51LmFwcGx5KHRoaXMpOworCQkJCQkJaW1nLmNsYXNzTmFtZSA9IGluaXRpYWxDbGFzc05hbWU7CisJCQkJCQl0aGlzLmN1cnJlbnRJbWcgPSBudWxsOworCQkJCQl9OworCQkJCX0KKwkJCX0KKwkJfQorCX0pLCBudWxsLCBtb3VzZUhhbmRsZXIpOworCisJbXhFdmVudC5hZGRMaXN0ZW5lcihpbWcsICdtb3VzZW91dCcsIG1vdXNlSGFuZGxlcik7CisJCisJcmV0dXJuIGltZzsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZENvbWJvCisgKiAKKyAqIEFkZHMgYW5kIHJldHVybnMgYSBuZXcgU0VMRUNUIGVsZW1lbnQgdXNpbmcgdGhlIGdpdmVuIHN0eWxlLiBUaGUgZWxlbWVudAorICogaXMgcGxhY2VkIGluc2lkZSBhIERJViB3aXRoIHRoZSBteFRvb2xiYXJDb21ib0NvbnRhaW5lciBzdHlsZSBjbGFzc25hbWUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0eWxlIC0gT3B0aW9uYWwgc3R5bGUgY2xhc3NuYW1lLiBEZWZhdWx0IGlzIG14VG9vbGJhckNvbWJvLgorICovCitteFRvb2xiYXIucHJvdG90eXBlLmFkZENvbWJvID0gZnVuY3Rpb24oc3R5bGUpCit7CisJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworCWRpdi5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7CisJZGl2LmNsYXNzTmFtZSA9ICdteFRvb2xiYXJDb21ib0NvbnRhaW5lcic7CisJCisJdmFyIHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpOworCXNlbGVjdC5jbGFzc05hbWUgPSBzdHlsZSB8fCAnbXhUb29sYmFyQ29tYm8nOworCWRpdi5hcHBlbmRDaGlsZChzZWxlY3QpOworCQorCXRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGRpdik7CisJCisJcmV0dXJuIHNlbGVjdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZENvbWJvCisgKiAKKyAqIEFkZHMgYW5kIHJldHVybnMgYSBuZXcgU0VMRUNUIGVsZW1lbnQgdXNpbmcgdGhlIGdpdmVuIHRpdGxlIGFzIHRoZQorICogZGVmYXVsdCBlbGVtZW50LiBUaGUgc2VsZWN0aW9uIGlzIHJlc2V0IHRvIHRoaXMgZWxlbWVudCBhZnRlciBlYWNoCisgKiBjaGFuZ2UuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHRpdGxlIC0gU3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSB0aXRsZSBvZiB0aGUgZGVmYXVsdCBlbGVtZW50LgorICogc3R5bGUgLSBPcHRpb25hbCBzdHlsZSBjbGFzc25hbWUuIERlZmF1bHQgaXMgbXhUb29sYmFyQ29tYm8uCisgKi8KK214VG9vbGJhci5wcm90b3R5cGUuYWRkQWN0aW9uQ29tYm8gPSBmdW5jdGlvbih0aXRsZSwgc3R5bGUpCit7CisJdmFyIHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpOworCXNlbGVjdC5jbGFzc05hbWUgPSBzdHlsZSB8fCAnbXhUb29sYmFyQ29tYm8nOworCXRoaXMuYWRkT3B0aW9uKHNlbGVjdCwgdGl0bGUsIG51bGwpOworCQorCW14RXZlbnQuYWRkTGlzdGVuZXIoc2VsZWN0LCAnY2hhbmdlJywgZnVuY3Rpb24oZXZ0KQorCXsKKwkJdmFyIHZhbHVlID0gc2VsZWN0Lm9wdGlvbnNbc2VsZWN0LnNlbGVjdGVkSW5kZXhdOworCQlzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IDA7CisJCQorCQlpZiAodmFsdWUuZnVuY3QgIT0gbnVsbCkKKwkJeworCQkJdmFsdWUuZnVuY3QoZXZ0KTsKKwkJfQorCX0pOworCQorCXRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHNlbGVjdCk7CisJCisJcmV0dXJuIHNlbGVjdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZE9wdGlvbgorICogCisgKiBBZGRzIGFuZCByZXR1cm5zIGEgbmV3IE9QVElPTiBlbGVtZW50IGluc2lkZSB0aGUgZ2l2ZW4gU0VMRUNUIGVsZW1lbnQuCisgKiBJZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBmdW5jdGlvbiB0aGVuIGl0IGlzIHN0b3JlZCBpbiB0aGUgb3B0aW9uJ3MgZnVuY3QKKyAqIGZpZWxkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjb21ibyAtIFNFTEVDVCBlbGVtZW50IHRoYXQgd2lsbCBjb250YWluIHRoZSBuZXcgZW50cnkuCisgKiB0aXRsZSAtIFN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgdGl0bGUgb2YgdGhlIG9wdGlvbi4KKyAqIHZhbHVlIC0gU3BlY2lmaWVzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBvcHRpb24uCisgKi8KK214VG9vbGJhci5wcm90b3R5cGUuYWRkT3B0aW9uID0gZnVuY3Rpb24oY29tYm8sIHRpdGxlLCB2YWx1ZSkKK3sKKwl2YXIgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7CisJbXhVdGlscy53cml0ZWxuKG9wdGlvbiwgdGl0bGUpOworCQorCWlmICh0eXBlb2YodmFsdWUpID09ICdmdW5jdGlvbicpCisJeworCQlvcHRpb24uZnVuY3QgPSB2YWx1ZTsKKwl9CisJZWxzZQorCXsKKwkJb3B0aW9uLnNldEF0dHJpYnV0ZSgndmFsdWUnLCB2YWx1ZSk7CisJfQorCQorCWNvbWJvLmFwcGVuZENoaWxkKG9wdGlvbik7CisJCisJcmV0dXJuIG9wdGlvbjsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZFN3aXRjaE1vZGUKKyAqIAorICogQWRkcyBhIG5ldyBzZWxlY3RhYmxlIGl0ZW0gdG8gdGhlIHRvb2xiYXIuIE9ubHkgb25lIHN3aXRjaCBtb2RlIGl0ZW0gbWF5CisgKiBiZSBzZWxlY3RlZCBhdCBhIHRpbWUuIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSBpcyB0aGUgZGVmYXVsdCBpdGVtCisgKiBhZnRlciBhIHJlc2V0IG9mIHRoZSB0b29sYmFyLgorICovCitteFRvb2xiYXIucHJvdG90eXBlLmFkZFN3aXRjaE1vZGUgPSBmdW5jdGlvbih0aXRsZSwgaWNvbiwgZnVuY3QsIHByZXNzZWRJY29uLCBzdHlsZSkKK3sKKwl2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CisJaW1nLmluaXRpYWxDbGFzc05hbWUgPSBzdHlsZSB8fCAnbXhUb29sYmFyTW9kZSc7CisJaW1nLmNsYXNzTmFtZSA9IGltZy5pbml0aWFsQ2xhc3NOYW1lOworCWltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGljb24pOworCWltZy5hbHRJY29uID0gcHJlc3NlZEljb247CisJCisJaWYgKHRpdGxlICE9IG51bGwpCisJeworCQlpbWcuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRpdGxlKTsKKwl9CisJCisJbXhFdmVudC5hZGRMaXN0ZW5lcihpbWcsICdjbGljaycsIG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJeworCQl2YXIgdG1wID0gdGhpcy5zZWxlY3RlZE1vZGUuYWx0SWNvbjsKKwkJCisJCWlmICh0bXAgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5zZWxlY3RlZE1vZGUuYWx0SWNvbiA9IHRoaXMuc2VsZWN0ZWRNb2RlLmdldEF0dHJpYnV0ZSgnc3JjJyk7CisJCQl0aGlzLnNlbGVjdGVkTW9kZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIHRtcCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLnNlbGVjdGVkTW9kZS5jbGFzc05hbWUgPSB0aGlzLnNlbGVjdGVkTW9kZS5pbml0aWFsQ2xhc3NOYW1lOworCQl9CisJCQorCQlpZiAodGhpcy51cGRhdGVEZWZhdWx0TW9kZSkKKwkJeworCQkJdGhpcy5kZWZhdWx0TW9kZSA9IGltZzsKKwkJfQorCQkKKwkJdGhpcy5zZWxlY3RlZE1vZGUgPSBpbWc7CisJCQorCQl2YXIgdG1wID0gaW1nLmFsdEljb247CisJCQorCQlpZiAodG1wICE9IG51bGwpCisJCXsKKwkJCWltZy5hbHRJY29uID0gaW1nLmdldEF0dHJpYnV0ZSgnc3JjJyk7CisJCQlpbWcuc2V0QXR0cmlidXRlKCdzcmMnLCB0bXApOworCQl9CisJCWVsc2UKKwkJeworCQkJaW1nLmNsYXNzTmFtZSA9IGltZy5pbml0aWFsQ2xhc3NOYW1lKydTZWxlY3RlZCc7CisJCX0KKwkJCisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuU0VMRUNUKSk7CisJCWZ1bmN0KCk7CisJfSkpOworCQorCXRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGltZyk7CisJCisJaWYgKHRoaXMuZGVmYXVsdE1vZGUgPT0gbnVsbCkKKwl7CisJCXRoaXMuZGVmYXVsdE1vZGUgPSBpbWc7CisJCQorCQkvLyBGdW5jdGlvbiBzaG91bGQgZmlyZSBvbmx5IG9uY2Ugc28KKwkJLy8gZG8gbm90IHBhc3MgaXQgd2l0aCB0aGUgc2VsZWN0IGV2ZW50CisJCXRoaXMuc2VsZWN0TW9kZShpbWcpOworCQlmdW5jdCgpOworCX0KKwkKKwlyZXR1cm4gaW1nOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYWRkTW9kZQorICogCisgKiBBZGRzIGEgbmV3IGl0ZW0gdG8gdGhlIHRvb2xiYXIuIFRoZSBzZWxlY3Rpb24gaXMgdHlwaWNhbGx5IHJlc2V0IGFmdGVyCisgKiB0aGUgaXRlbSBoYXMgYmVlbiBjb25zdW1lZCwgZm9yIGV4YW1wbGUgYnkgYWRkaW5nIGEgbmV3IHZlcnRleCB0byB0aGUKKyAqIGdyYXBoLiBUaGUgcmVzZXQgaXMgbm90IGNhcnJpZWQgb3V0IGlmIHRoZSBpdGVtIGlzIGRvdWJsZSBjbGlja2VkLgorICogCisgKiBUaGUgZnVuY3Rpb24gYXJndW1lbnQgdXNlcyB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZTogZnVuY3QoZXZ0LCBjZWxsKSB3aGVyZQorICogZXZ0IGlzIHRoZSBuYXRpdmUgbW91c2UgZXZlbnQgYW5kIGNlbGwgaXMgdGhlIGNlbGwgdW5kZXIgdGhlIG1vdXNlLgorICovCitteFRvb2xiYXIucHJvdG90eXBlLmFkZE1vZGUgPSBmdW5jdGlvbih0aXRsZSwgaWNvbiwgZnVuY3QsIHByZXNzZWRJY29uLCBzdHlsZSwgdG9nZ2xlKQoreworCXRvZ2dsZSA9ICh0b2dnbGUgIT0gbnVsbCkgPyB0b2dnbGUgOiB0cnVlOworCXZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KChpY29uICE9IG51bGwpID8gJ2ltZycgOiAnYnV0dG9uJyk7CisJCisJaW1nLmluaXRpYWxDbGFzc05hbWUgPSBzdHlsZSB8fCAnbXhUb29sYmFyTW9kZSc7CisJaW1nLmNsYXNzTmFtZSA9IGltZy5pbml0aWFsQ2xhc3NOYW1lOworCWltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsIGljb24pOworCWltZy5hbHRJY29uID0gcHJlc3NlZEljb247CisKKwlpZiAodGl0bGUgIT0gbnVsbCkKKwl7CisJCWltZy5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGl0bGUpOworCX0KKwkKKwlpZiAodGhpcy5lbmFibGVkICYmIHRvZ2dsZSkKKwl7CisJCW14RXZlbnQuYWRkTGlzdGVuZXIoaW1nLCAnY2xpY2snLCBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQl7CisJCQl0aGlzLnNlbGVjdE1vZGUoaW1nLCBmdW5jdCk7CisJCQl0aGlzLm5vUmVzZXQgPSBmYWxzZTsKKwkJfSkpOworCQkKKwkJbXhFdmVudC5hZGRMaXN0ZW5lcihpbWcsICdkYmxjbGljaycsIG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJCXsKKwkJCXRoaXMuc2VsZWN0TW9kZShpbWcsIGZ1bmN0KTsKKwkJCXRoaXMubm9SZXNldCA9IHRydWU7CisJCX0pKTsKKwkJCisJCWlmICh0aGlzLmRlZmF1bHRNb2RlID09IG51bGwpCisJCXsKKwkJCXRoaXMuZGVmYXVsdE1vZGUgPSBpbWc7CisJCQl0aGlzLmRlZmF1bHRGdW5jdGlvbiA9IGZ1bmN0OworCQkJdGhpcy5zZWxlY3RNb2RlKGltZywgZnVuY3QpOworCQl9CisJfQorCisJdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoaW1nKTsJCQkJCQorCisJcmV0dXJuIGltZzsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNlbGVjdE1vZGUKKyAqIAorICogUmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBtb2RlIGFuZCBkaXNwbGF5cyB0aGUgZ2l2ZW4KKyAqIERPTSBub2RlIGFzIHNlbGVjdGVkLiBUaGlzIGZ1bmN0aW9uIGZpcmVzIGEgc2VsZWN0IGV2ZW50IHdpdGggdGhlIGdpdmVuCisgKiBmdW5jdGlvbiBhcyBhIHBhcmFtZXRlci4KKyAqLworbXhUb29sYmFyLnByb3RvdHlwZS5zZWxlY3RNb2RlID0gZnVuY3Rpb24oZG9tTm9kZSwgZnVuY3QpCit7CisJaWYgKHRoaXMuc2VsZWN0ZWRNb2RlICE9IGRvbU5vZGUpCisJeworCQlpZiAodGhpcy5zZWxlY3RlZE1vZGUgIT0gbnVsbCkKKwkJeworCQkJdmFyIHRtcCA9IHRoaXMuc2VsZWN0ZWRNb2RlLmFsdEljb247CisJCQkKKwkJCWlmICh0bXAgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLnNlbGVjdGVkTW9kZS5hbHRJY29uID0gdGhpcy5zZWxlY3RlZE1vZGUuZ2V0QXR0cmlidXRlKCdzcmMnKTsKKwkJCQl0aGlzLnNlbGVjdGVkTW9kZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIHRtcCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdGhpcy5zZWxlY3RlZE1vZGUuY2xhc3NOYW1lID0gdGhpcy5zZWxlY3RlZE1vZGUuaW5pdGlhbENsYXNzTmFtZTsKKwkJCX0KKwkJfQorCQkKKwkJdGhpcy5zZWxlY3RlZE1vZGUgPSBkb21Ob2RlOworCQl2YXIgdG1wID0gdGhpcy5zZWxlY3RlZE1vZGUuYWx0SWNvbjsKKwkJCisJCWlmICh0bXAgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5zZWxlY3RlZE1vZGUuYWx0SWNvbiA9IHRoaXMuc2VsZWN0ZWRNb2RlLmdldEF0dHJpYnV0ZSgnc3JjJyk7CisJCQl0aGlzLnNlbGVjdGVkTW9kZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIHRtcCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLnNlbGVjdGVkTW9kZS5jbGFzc05hbWUgPSB0aGlzLnNlbGVjdGVkTW9kZS5pbml0aWFsQ2xhc3NOYW1lKydTZWxlY3RlZCc7CisJCX0KKwkJCisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuU0VMRUNULCAiZnVuY3Rpb24iLCBmdW5jdCkpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJlc2V0TW9kZQorICogCisgKiBTZWxlY3RzIHRoZSBkZWZhdWx0IG1vZGUgYW5kIHJlc2V0cyB0aGUgc3RhdGUgb2YgdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQKKyAqIG1vZGUuCisgKi8KK214VG9vbGJhci5wcm90b3R5cGUucmVzZXRNb2RlID0gZnVuY3Rpb24oZm9yY2VkKQoreworCWlmICgoZm9yY2VkIHx8ICF0aGlzLm5vUmVzZXQpICYmIHRoaXMuc2VsZWN0ZWRNb2RlICE9IHRoaXMuZGVmYXVsdE1vZGUpCisJeworCQkvLyBUaGUgbGFzdCBzZWxlY3RlZCBzd2l0Y2ggbW9kZSB3aWxsIGJlIGFjdGl2YXRlZAorCQkvLyBzbyB0aGUgZnVuY3Rpb24gd2FzIGFscmVhZHkgZXhlY3V0ZWQgYW5kIGlzCisJCS8vIG5vIGxvbmdlciByZXF1aXJlZCBoZXJlCisJCXRoaXMuc2VsZWN0TW9kZSh0aGlzLmRlZmF1bHRNb2RlLCB0aGlzLmRlZmF1bHRGdW5jdGlvbik7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogYWRkU2VwYXJhdG9yCisgKiAKKyAqIEFkZHMgdGhlIHNwZWNpZmllcyBpbWFnZSBhcyBhIHNlcGFyYXRvci4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogaWNvbiAtIFVSTCBvZiB0aGUgc2VwYXJhdG9yIGljb24uCisgKi8KK214VG9vbGJhci5wcm90b3R5cGUuYWRkU2VwYXJhdG9yID0gZnVuY3Rpb24oaWNvbikKK3sKKwlyZXR1cm4gdGhpcy5hZGRJdGVtKG51bGwsIGljb24sIG51bGwpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYWRkQnJlYWsKKyAqIAorICogQWRkcyBhIGJyZWFrIHRvIHRoZSBjb250YWluZXIuCisgKi8KK214VG9vbGJhci5wcm90b3R5cGUuYWRkQnJlYWsgPSBmdW5jdGlvbigpCit7CisJbXhVdGlscy5icih0aGlzLmNvbnRhaW5lcik7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRMaW5lCisgKiAKKyAqIEFkZHMgYSBob3Jpem9udGFsIGxpbmUgdG8gdGhlIGNvbnRhaW5lci4KKyAqLworbXhUb29sYmFyLnByb3RvdHlwZS5hZGRMaW5lID0gZnVuY3Rpb24oKQoreworCXZhciBociA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2hyJyk7CisJCisJaHIuc3R5bGUubWFyZ2luUmlnaHQgPSAnNnB4JzsKKwloci5zZXRBdHRyaWJ1dGUoJ3NpemUnLCAnMScpOworCQorCXRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGhyKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqIAorICogUmVtb3ZlcyB0aGUgdG9vbGJhciBhbmQgYWxsIGl0cyBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAqLworbXhUb29sYmFyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkKK3sKKwlteEV2ZW50LnJlbGVhc2UodGhpcy5jb250YWluZXIpOworCXRoaXMuY29udGFpbmVyID0gbnVsbDsKKwl0aGlzLmRlZmF1bHRNb2RlID0gbnVsbDsKKwl0aGlzLmRlZmF1bHRGdW5jdGlvbiA9IG51bGw7CisJdGhpcy5zZWxlY3RlZE1vZGUgPSBudWxsOworCQorCWlmICh0aGlzLm1lbnUgIT0gbnVsbCkKKwl7CisJCXRoaXMubWVudS5kZXN0cm95KCk7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214VW5kb01hbmFnZXIuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teFVuZG9NYW5hZ2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OTU2MWMKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teFVuZG9NYW5hZ2VyLmpzCkBAIC0wLDAgKzEsMjI5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFVuZG9NYW5hZ2VyCisgKgorICogSW1wbGVtZW50cyBhIGNvbW1hbmQgaGlzdG9yeS4gV2hlbiBjaGFuZ2luZyB0aGUgZ3JhcGggbW9kZWwsIGFuCisgKiA8bXhVbmRvYWJsZUNoYW5nZT4gb2JqZWN0IGlzIGNyZWF0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0cmFuc2FjdGlvbiAod2hlbgorICogbW9kZWwuYmVnaW5VcGRhdGUgaXMgY2FsbGVkKS4gQWxsIGF0b21pYyBjaGFuZ2VzIGFyZSB0aGVuIGFkZGVkIHRvIHRoaXMKKyAqIG9iamVjdCB1bnRpbCB0aGUgbGFzdCBtb2RlbC5lbmRVcGRhdGUgY2FsbCwgYXQgd2hpY2ggcG9pbnQgdGhlCisgKiA8bXhVbmRvYWJsZUVkaXQ+IGlzIGRpc3BhdGNoZWQgaW4gYW4gZXZlbnQsIGFuZCBhZGRlZCB0byB0aGUgaGlzdG9yeSBpbnNpZGUKKyAqIDxteFVuZG9NYW5hZ2VyPi4gVGhpcyBpcyBkb25lIGJ5IGFuIGV2ZW50IGxpc3RlbmVyIGluCisgKiA8bXhFZGl0b3IuaW5zdGFsbFVuZG9IYW5kbGVyPi4KKyAqIAorICogRWFjaCBhdG9taWMgY2hhbmdlIG9mIHRoZSBtb2RlbCBpcyByZXByZXNlbnRlZCBieSBhbiBvYmplY3QgKGVnLgorICogPG14Um9vdENoYW5nZT4sIDxteENoaWxkQ2hhbmdlPiwgPG14VGVybWluYWxDaGFuZ2U+IGV0Yykgd2hpY2ggY29udGFpbnMgdGhlCisgKiBjb21wbGV0ZSB1bmRvIGluZm9ybWF0aW9uLiBUaGUgPG14VW5kb01hbmFnZXI+IGFsc28gbGlzdGVucyB0byB0aGUKKyAqIDxteEdyYXBoVmlldz4gYW5kIHN0b3JlcyBpdCdzIGNoYW5nZXMgdG8gdGhlIGN1cnJlbnQgcm9vdCBhcyBpbnNpZ25pZmljYW50CisgKiB1bmRvYWJsZSBjaGFuZ2VzLCBzbyB0aGF0IGRyaWxsaW5nIChzdGVwIGludG8sIHN0ZXAgdXApIGlzIHVuZG9uZS4KKyAqIAorICogVGhpcyBtZWFucyB3aGVuIHlvdSBleGVjdXRlIGFuIGF0b21pYyBjaGFuZ2Ugb24gdGhlIG1vZGVsLCB0aGVuIGNoYW5nZSB0aGUKKyAqIGN1cnJlbnQgcm9vdCBvbiB0aGUgdmlldyBhbmQgY2xpY2sgdW5kbywgdGhlIGNoYW5nZSBvZiB0aGUgcm9vdCB3aWxsIGJlCisgKiB1bmRvbmUgdG9nZXRoZXIgd2l0aCB0aGUgY2hhbmdlIG9mIHRoZSBtb2RlbCBzbyB0aGF0IHRoZSBkaXNwbGF5IHJlcHJlc2VudHMKKyAqIHRoZSBzdGF0ZSBhdCB3aGljaCB0aGUgbW9kZWwgd2FzIGNoYW5nZWQuIEhvd2V2ZXIsIHRoZXNlIGNoYW5nZXMgYXJlIG5vdAorICogdHJhbnNtaXR0ZWQgZm9yIHNoYXJpbmcgYXMgdGhleSBkbyBub3QgcmVwcmVzZW50IGEgc3RhdGUgY2hhbmdlLgorICoKKyAqIEV4YW1wbGU6CisgKiAKKyAqIFdoZW4gYWRkaW5nIGFuIHVuZG8gbWFuYWdlciB0byBhIGdyYXBoLCBtYWtlIHN1cmUgdG8gYWRkIGl0CisgKiB0byB0aGUgbW9kZWwgYW5kIHRoZSB2aWV3IGFzIHdlbGwgdG8gbWFpbnRhaW4gYSBjb25zaXN0ZW50CisgKiBkaXNwbGF5IGFjcm9zcyBtdWx0aXBsZSB1bmRvL3JlZG8gc3RlcHMuCisgKgorICogKGNvZGUpCisgKiB2YXIgdW5kb01hbmFnZXIgPSBuZXcgbXhVbmRvTWFuYWdlcigpOworICogdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oc2VuZGVyLCBldnQpCisgKiB7CisgKiAgIHVuZG9NYW5hZ2VyLnVuZG9hYmxlRWRpdEhhcHBlbmVkKGV2dC5nZXRQcm9wZXJ0eSgnZWRpdCcpKTsKKyAqIH07CisgKiBncmFwaC5nZXRNb2RlbCgpLmFkZExpc3RlbmVyKG14RXZlbnQuVU5ETywgbGlzdGVuZXIpOworICogZ3JhcGguZ2V0VmlldygpLmFkZExpc3RlbmVyKG14RXZlbnQuVU5ETywgbGlzdGVuZXIpOworICogKGVuZCkKKyAqIAorICogVGhlIGNvZGUgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW5mb3JtcyB0aGUgdW5kb01hbmFnZXIKKyAqIG9mIGFuIHVuZG9hYmxlIGVkaXQgYW5kIGJpbmRzIGl0IHRvIHRoZSB1bmRvIGV2ZW50IG9mCisgKiA8bXhHcmFwaE1vZGVsPiBhbmQgPG14R3JhcGhWaWV3PiB1c2luZworICogPG14RXZlbnRTb3VyY2UuYWRkTGlzdGVuZXI+LgorICogCisgKiBFdmVudDogbXhFdmVudC5DTEVBUgorICogCisgKiBGaXJlcyBhZnRlciA8Y2xlYXI+IHdhcyBpbnZva2VkLiBUaGlzIGV2ZW50IGhhcyBubyBwcm9wZXJ0aWVzLgorICogCisgKiBFdmVudDogbXhFdmVudC5VTkRPCisgKiAKKyAqIEZpcmVzIGFmZXIgYSBzaWduaWZpY2FudCBlZGl0IHdhcyB1bmRvbmUgaW4gPHVuZG8+LiBUaGUgPGNvZGU+ZWRpdDwvY29kZT4KKyAqIHByb3BlcnR5IGNvbnRhaW5zIHRoZSA8bXhVbmRvYWJsZUVkaXQ+IHRoYXQgd2FzIHVuZG9uZS4KKyAqIAorICogRXZlbnQ6IG14RXZlbnQuUkVETworICogCisgKiBGaXJlcyBhZmVyIGEgc2lnbmlmaWNhbnQgZWRpdCB3YXMgcmVkb25lIGluIDxyZWRvPi4gVGhlIDxjb2RlPmVkaXQ8L2NvZGU+CisgKiBwcm9wZXJ0eSBjb250YWlucyB0aGUgPG14VW5kb2FibGVFZGl0PiB0aGF0IHdhcyByZWRvbmUuCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LkFERAorICogCisgKiBGaXJlcyBhZnRlciBhbiB1bmRvYWJsZSBlZGl0IHdhcyBhZGRlZCB0byB0aGUgaGlzdG9yeS4gVGhlIDxjb2RlPmVkaXQ8L2NvZGU+CisgKiBwcm9wZXJ0eSBjb250YWlucyB0aGUgPG14VW5kb2FibGVFZGl0PiB0aGF0IHdhcyBhZGRlZC4KKyAqIAorICogQ29uc3RydWN0b3I6IG14VW5kb01hbmFnZXIKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IHVuZG8gbWFuYWdlciB3aXRoIHRoZSBnaXZlbiBoaXN0b3J5IHNpemUuIElmIG5vIGhpc3RvcnkKKyAqIHNpemUgaXMgZ2l2ZW4sIHRoZW4gYSBkZWZhdWx0IHNpemUgb2YgMTAwIHN0ZXBzIGlzIHVzZWQuCisgKi8KK2Z1bmN0aW9uIG14VW5kb01hbmFnZXIoc2l6ZSkKK3sKKwl0aGlzLnNpemUgPSAoc2l6ZSAhPSBudWxsKSA/IHNpemUgOiAxMDA7CisJdGhpcy5jbGVhcigpOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14RXZlbnRTb3VyY2UuCisgKi8KK214VW5kb01hbmFnZXIucHJvdG90eXBlID0gbmV3IG14RXZlbnRTb3VyY2UoKTsKK214VW5kb01hbmFnZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhVbmRvTWFuYWdlcjsKKworLyoqCisgKiBWYXJpYWJsZTogc2l6ZQorICogCisgKiBNYXhpbXVtIGNvbW1hbmQgaGlzdG9yeSBzaXplLiAwIG1lYW5zIHVubGltaXRlZCBoaXN0b3J5LiBEZWZhdWx0IGlzCisgKiAxMDAuCisgKi8KK214VW5kb01hbmFnZXIucHJvdG90eXBlLnNpemUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBoaXN0b3J5CisgKiAKKyAqIEFycmF5IHRoYXQgY29udGFpbnMgdGhlIHN0ZXBzIG9mIHRoZSBjb21tYW5kIGhpc3RvcnkuCisgKi8KK214VW5kb01hbmFnZXIucHJvdG90eXBlLmhpc3RvcnkgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBpbmRleE9mTmV4dEFkZAorICogCisgKiBJbmRleCBvZiB0aGUgZWxlbWVudCB0byBiZSBhZGRlZCBuZXh0LgorICovCitteFVuZG9NYW5hZ2VyLnByb3RvdHlwZS5pbmRleE9mTmV4dEFkZCA9IDA7CisKKy8qKgorICogRnVuY3Rpb246IGlzRW1wdHkKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBoaXN0b3J5IGlzIGVtcHR5LgorICovCitteFVuZG9NYW5hZ2VyLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmhpc3RvcnkubGVuZ3RoID09IDA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjbGVhcgorICogCisgKiBDbGVhcnMgdGhlIGNvbW1hbmQgaGlzdG9yeS4KKyAqLworbXhVbmRvTWFuYWdlci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpCit7CisJdGhpcy5oaXN0b3J5ID0gW107CisJdGhpcy5pbmRleE9mTmV4dEFkZCA9IDA7CisJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5DTEVBUikpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY2FuVW5kbworICogCisgKiBSZXR1cm5zIHRydWUgaWYgYW4gdW5kbyBpcyBwb3NzaWJsZS4KKyAqLworbXhVbmRvTWFuYWdlci5wcm90b3R5cGUuY2FuVW5kbyA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5pbmRleE9mTmV4dEFkZCA+IDA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1bmRvCisgKiAKKyAqIFVuZG9lcyB0aGUgbGFzdCBjaGFuZ2UuCisgKi8KK214VW5kb01hbmFnZXIucHJvdG90eXBlLnVuZG8gPSBmdW5jdGlvbigpCit7CisgICAgd2hpbGUgKHRoaXMuaW5kZXhPZk5leHRBZGQgPiAwKQorICAgIHsKKyAgICAgICAgdmFyIGVkaXQgPSB0aGlzLmhpc3RvcnlbLS10aGlzLmluZGV4T2ZOZXh0QWRkXTsKKyAgICAgICAgZWRpdC51bmRvKCk7CisKKwkJaWYgKGVkaXQuaXNTaWduaWZpY2FudCgpKQorICAgICAgICB7CisgICAgICAgIAl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LlVORE8sICdlZGl0JywgZWRpdCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjYW5SZWRvCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiBhIHJlZG8gaXMgcG9zc2libGUuCisgKi8KK214VW5kb01hbmFnZXIucHJvdG90eXBlLmNhblJlZG8gPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuaW5kZXhPZk5leHRBZGQgPCB0aGlzLmhpc3RvcnkubGVuZ3RoOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVkbworICogCisgKiBSZWRvZXMgdGhlIGxhc3QgY2hhbmdlLgorICovCitteFVuZG9NYW5hZ2VyLnByb3RvdHlwZS5yZWRvID0gZnVuY3Rpb24oKQoreworICAgIHZhciBuID0gdGhpcy5oaXN0b3J5Lmxlbmd0aDsKKyAgICAKKyAgICB3aGlsZSAodGhpcy5pbmRleE9mTmV4dEFkZCA8IG4pCisgICAgeworICAgICAgICB2YXIgZWRpdCA9ICB0aGlzLmhpc3RvcnlbdGhpcy5pbmRleE9mTmV4dEFkZCsrXTsKKyAgICAgICAgZWRpdC5yZWRvKCk7CisgICAgICAgIAorICAgICAgICBpZiAoZWRpdC5pc1NpZ25pZmljYW50KCkpCisgICAgICAgIHsKKyAgICAgICAgCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuUkVETywgJ2VkaXQnLCBlZGl0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8qKgorICogRnVuY3Rpb246IHVuZG9hYmxlRWRpdEhhcHBlbmVkCisgKiAKKyAqIE1ldGhvZCB0byBiZSBjYWxsZWQgdG8gYWRkIG5ldyB1bmRvYWJsZSBlZGl0cyB0byB0aGUgPGhpc3Rvcnk+LgorICovCitteFVuZG9NYW5hZ2VyLnByb3RvdHlwZS51bmRvYWJsZUVkaXRIYXBwZW5lZCA9IGZ1bmN0aW9uKHVuZG9hYmxlRWRpdCkKK3sKKwl0aGlzLnRyaW0oKTsKKwkKKwlpZiAodGhpcy5zaXplID4gMCAmJgorCQl0aGlzLnNpemUgPT0gdGhpcy5oaXN0b3J5Lmxlbmd0aCkKKwl7CisJCXRoaXMuaGlzdG9yeS5zaGlmdCgpOworCX0KKwkKKwl0aGlzLmhpc3RvcnkucHVzaCh1bmRvYWJsZUVkaXQpOworCXRoaXMuaW5kZXhPZk5leHRBZGQgPSB0aGlzLmhpc3RvcnkubGVuZ3RoOworCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuQURELCAnZWRpdCcsIHVuZG9hYmxlRWRpdCkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdHJpbQorICogCisgKiBSZW1vdmVzIGFsbCBwZW5kaW5nIHN0ZXBzIGFmdGVyIDxpbmRleE9mTmV4dEFkZD4gZnJvbSB0aGUgaGlzdG9yeSwKKyAqIGludm9raW5nIGRpZSBvbiBlYWNoIGVkaXQuIFRoaXMgaXMgY2FsbGVkIGZyb20gPHVuZG9hYmxlRWRpdEhhcHBlbmVkPi4KKyAqLworbXhVbmRvTWFuYWdlci5wcm90b3R5cGUudHJpbSA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAodGhpcy5oaXN0b3J5Lmxlbmd0aCA+IHRoaXMuaW5kZXhPZk5leHRBZGQpCisJeworCQl2YXIgZWRpdHMgPSB0aGlzLmhpc3Rvcnkuc3BsaWNlKHRoaXMuaW5kZXhPZk5leHRBZGQsCisJCQl0aGlzLmhpc3RvcnkubGVuZ3RoIC0gdGhpcy5pbmRleE9mTmV4dEFkZCk7CisJCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBlZGl0cy5sZW5ndGg7IGkrKykKKwkJeworCQkJZWRpdHNbaV0uZGllKCk7CisJCX0KKwl9Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhVbmRvYWJsZUVkaXQuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teFVuZG9hYmxlRWRpdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTJmODMwCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhVbmRvYWJsZUVkaXQuanMKQEAgLTAsMCArMSwyMTMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14VW5kb2FibGVFZGl0CisgKiAKKyAqIEltcGxlbWVudHMgYSBjb21wb3NpdGUgdW5kb2FibGUgZWRpdC4gSGVyZSBpcyBhbiBleGFtcGxlIGZvciBhIGN1c3RvbSBjaGFuZ2UKKyAqIHdoaWNoIGdldHMgZXhlY3V0ZWQgdmlhIHRoZSBtb2RlbDoKKyAqIAorICogKGNvZGUpCisgKiBmdW5jdGlvbiBDdXN0b21DaGFuZ2UobW9kZWwsIG5hbWUpCisgKiB7CisgKiAgIHRoaXMubW9kZWwgPSBtb2RlbDsKKyAqICAgdGhpcy5uYW1lID0gbmFtZTsKKyAqICAgdGhpcy5wcmV2aW91cyA9IG5hbWU7CisgKiB9OworICogCisgKiBDdXN0b21DaGFuZ2UucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbigpCisgKiB7CisgKiAgIHZhciB0bXAgPSB0aGlzLm1vZGVsLm5hbWU7CisgKiAgIHRoaXMubW9kZWwubmFtZSA9IHRoaXMucHJldmlvdXM7CisgKiAgIHRoaXMucHJldmlvdXMgPSB0bXA7CisgKiB9OworICogCisgKiB2YXIgbmFtZSA9IHByb21wdCgnRW50ZXIgbmFtZScpOworICogZ3JhcGgubW9kZWwuZXhlY3V0ZShuZXcgQ3VzdG9tQ2hhbmdlKGdyYXBoLm1vZGVsLCBuYW1lKSk7CisgKiAoZW5kKQorICogCisgKiBFdmVudDogbXhFdmVudC5FWEVDVVRFRAorICogCisgKiBGaXJlcyBiZXR3ZWVuIFNUQVJUX0VESVQgYW5kIEVORF9FRElUIGFmdGVyIGFuIGF0b21pYyBjaGFuZ2Ugd2FzIGV4ZWN1dGVkLgorICogVGhlIDxjb2RlPmNoYW5nZTwvY29kZT4gcHJvcGVydHkgY29udGFpbnMgdGhlIGNoYW5nZSB0aGF0IHdhcyBleGVjdXRlZC4KKyAqIAorICogRXZlbnQ6IG14RXZlbnQuU1RBUlRfRURJVAorICogCisgKiBGaXJlcyBiZWZvcmUgYSBzZXQgb2YgY2hhbmdlcyB3aWxsIGJlIGV4ZWN1dGVkIGluIDx1bmRvPiBvciA8cmVkbz4uCisgKiBUaGlzIGV2ZW50IGNvbnRhaW5zIG5vIHByb3BlcnRpZXMuCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LkVORF9FRElUCisgKgorICogRmlyZXMgYWZ0ZXIgYSBzZXQgb2YgY2hhbmdlc3dhcyBleGVjdXRlZCBpbiA8dW5kbz4gb3IgPHJlZG8+LgorICogVGhpcyBldmVudCBjb250YWlucyBubyBwcm9wZXJ0aWVzLgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhVbmRvYWJsZUVkaXQKKyAqIAorICogQ29uc3RydWN0cyBhIG5ldyB1bmRvYWJsZSBlZGl0IGZvciB0aGUgZ2l2ZW4gc291cmNlLgorICovCitmdW5jdGlvbiBteFVuZG9hYmxlRWRpdChzb3VyY2UsIHNpZ25pZmljYW50KQoreworCXRoaXMuc291cmNlID0gc291cmNlOworCXRoaXMuY2hhbmdlcyA9IFtdOworCXRoaXMuc2lnbmlmaWNhbnQgPSAoc2lnbmlmaWNhbnQgIT0gbnVsbCkgPyBzaWduaWZpY2FudCA6IHRydWU7Cit9OworCisvKioKKyAqIFZhcmlhYmxlOiBzb3VyY2UKKyAqIAorICogU3BlY2lmaWVzIHRoZSBzb3VyY2Ugb2YgdGhlIGVkaXQuCisgKi8KK214VW5kb2FibGVFZGl0LnByb3RvdHlwZS5zb3VyY2UgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjaGFuZ2VzCisgKiAKKyAqIEFycmF5IHRoYXQgY29udGFpbnMgdGhlIGNoYW5nZXMgdGhhdCBtYWtlIHVwIHRoaXMgZWRpdC4gVGhlIGNoYW5nZXMgYXJlCisgKiBleHBlY3RlZCB0byBlaXRoZXIgaGF2ZSBhbiB1bmRvIGFuZCByZWRvIGZ1bmN0aW9uLCBvciBhbiBleGVjdXRlCisgKiBmdW5jdGlvbi4gRGVmYXVsdCBpcyBhbiBlbXB0eSBhcnJheS4KKyAqLworbXhVbmRvYWJsZUVkaXQucHJvdG90eXBlLmNoYW5nZXMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzaWduaWZpY2FudAorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIHVuZG9hYmxlIGNoYW5nZSBpcyBzaWduaWZpY2FudC4KKyAqIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhVbmRvYWJsZUVkaXQucHJvdG90eXBlLnNpZ25pZmljYW50ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogdW5kb25lCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGlzIGVkaXQgaGFzIGJlZW4gdW5kb25lLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteFVuZG9hYmxlRWRpdC5wcm90b3R5cGUudW5kb25lID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHJlZG9uZQorICogCisgKiBTcGVjaWZpZXMgaWYgdGhpcyBlZGl0IGhhcyBiZWVuIHJlZG9uZS4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhVbmRvYWJsZUVkaXQucHJvdG90eXBlLnJlZG9uZSA9IGZhbHNlOworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0VtcHR5CisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGhpcyBlZGl0IGNvbnRhaW5zIG5vIGNoYW5nZXMuCisgKi8KK214VW5kb2FibGVFZGl0LnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmNoYW5nZXMubGVuZ3RoID09IDA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1NpZ25pZmljYW50CisgKiAKKyAqIFJldHVybnMgPHNpZ25pZmljYW50Pi4KKyAqLworbXhVbmRvYWJsZUVkaXQucHJvdG90eXBlLmlzU2lnbmlmaWNhbnQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuc2lnbmlmaWNhbnQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGQKKyAqIAorICogQWRkcyB0aGUgc3BlY2lmaWVkIGNoYW5nZSB0byB0aGlzIGVkaXQuIFRoZSBjaGFuZ2UgaXMgYW4gb2JqZWN0IHRoYXQgaXMKKyAqIGV4cGVjdGVkIHRvIGVpdGhlciBoYXZlIGFuIHVuZG8gYW5kIHJlZG8sIG9yIGFuIGV4ZWN1dGUgZnVuY3Rpb24uCisgKi8KK214VW5kb2FibGVFZGl0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihjaGFuZ2UpCit7CisJdGhpcy5jaGFuZ2VzLnB1c2goY2hhbmdlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IG5vdGlmeQorICogCisgKiBIb29rIHRvIG5vdGlmeSBhbnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzIGFmdGVyIGFuIDx1bmRvPiBvciA8cmVkbz4KKyAqIGhhcyBiZWVuIGNhcnJpZWQgb3V0LiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgorICovCitteFVuZG9hYmxlRWRpdC5wcm90b3R5cGUubm90aWZ5ID0gZnVuY3Rpb24oKSB7IH07CisKKy8qKgorICogRnVuY3Rpb246IGRpZQorICogCisgKiBIb29rIHRvIGZyZWUgcmVzb3VyY2VzIGFmdGVyIHRoZSBlZGl0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY29tbWFuZAorICogaGlzdG9yeS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eS4KKyAqLworbXhVbmRvYWJsZUVkaXQucHJvdG90eXBlLmRpZSA9IGZ1bmN0aW9uKCkgeyB9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1bmRvCisgKiAKKyAqIFVuZG9lcyBhbGwgY2hhbmdlcyBpbiB0aGlzIGVkaXQuCisgKi8KK214VW5kb2FibGVFZGl0LnByb3RvdHlwZS51bmRvID0gZnVuY3Rpb24oKQoreworCWlmICghdGhpcy51bmRvbmUpCisJeworCQl0aGlzLnNvdXJjZS5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5TVEFSVF9FRElUKSk7CisJCXZhciBjb3VudCA9IHRoaXMuY2hhbmdlcy5sZW5ndGg7CisJCQorCQlmb3IgKHZhciBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkKKwkJeworCQkJdmFyIGNoYW5nZSA9IHRoaXMuY2hhbmdlc1tpXTsKKwkJCQorCQkJaWYgKGNoYW5nZS5leGVjdXRlICE9IG51bGwpCisJCQl7CisJCQkJY2hhbmdlLmV4ZWN1dGUoKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGNoYW5nZS51bmRvICE9IG51bGwpCisJCQl7CisJCQkJY2hhbmdlLnVuZG8oKTsKKwkJCX0KKwkJCQorCQkJLy8gTmV3IGdsb2JhbCBleGVjdXRlZCBldmVudAorCQkJdGhpcy5zb3VyY2UuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuRVhFQ1VURUQsICdjaGFuZ2UnLCBjaGFuZ2UpKTsKKwkJfQorCQkKKwkJdGhpcy51bmRvbmUgPSB0cnVlOworCQl0aGlzLnJlZG9uZSA9IGZhbHNlOworCQl0aGlzLnNvdXJjZS5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5FTkRfRURJVCkpOworCX0KKwkKKwl0aGlzLm5vdGlmeSgpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVkbworICogCisgKiBSZWRvZXMgYWxsIGNoYW5nZXMgaW4gdGhpcyBlZGl0LgorICovCitteFVuZG9hYmxlRWRpdC5wcm90b3R5cGUucmVkbyA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAoIXRoaXMucmVkb25lKQorCXsKKwkJdGhpcy5zb3VyY2UuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuU1RBUlRfRURJVCkpOworCQl2YXIgY291bnQgPSB0aGlzLmNoYW5nZXMubGVuZ3RoOworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQl7CisJCQl2YXIgY2hhbmdlID0gdGhpcy5jaGFuZ2VzW2ldOworCQkJCisJCQlpZiAoY2hhbmdlLmV4ZWN1dGUgIT0gbnVsbCkKKwkJCXsKKwkJCQljaGFuZ2UuZXhlY3V0ZSgpOworCQkJfQorCQkJZWxzZSBpZiAoY2hhbmdlLnJlZG8gIT0gbnVsbCkKKwkJCXsKKwkJCQljaGFuZ2UucmVkbygpOworCQkJfQorCQkJCisJCQkvLyBOZXcgZ2xvYmFsIGV4ZWN1dGVkIGV2ZW50CisJCQl0aGlzLnNvdXJjZS5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5FWEVDVVRFRCwgJ2NoYW5nZScsIGNoYW5nZSkpOworCQl9CisJCQorCQl0aGlzLnVuZG9uZSA9IGZhbHNlOworCQl0aGlzLnJlZG9uZSA9IHRydWU7CisJCXRoaXMuc291cmNlLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LkVORF9FRElUKSk7CisJfQorCQorCXRoaXMubm90aWZ5KCk7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhVcmxDb252ZXJ0ZXIuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teFVybENvbnZlcnRlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWFlNTBlCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhVcmxDb252ZXJ0ZXIuanMKQEAgLTAsMCArMSwxNTEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICoKKyAqIENsYXNzOiBteFVybENvbnZlcnRlcgorICogCisgKiBDb252ZXJ0cyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgVVJMcyB0byBhYnNvbHV0ZSBVUkxzIHdpdGggcHJvdG9jb2wgYW5kIGRvbWFpbi4KKyAqLwordmFyIG14VXJsQ29udmVydGVyID0gZnVuY3Rpb24oKQoreworCS8vIEVtcHR5IGNvbnN0cnVjdG9yCit9OworCisvKioKKyAqIFZhcmlhYmxlOiBlbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgY29udmVydGVyIGlzIGVuYWJsZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhVcmxDb252ZXJ0ZXIucHJvdG90eXBlLmVuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBiYXNlVXJsCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgYmFzZSBVUkwgdG8gYmUgdXNlZCBhcyBhIHByZWZpeCBmb3IgcmVsYXRpdmUgVVJMcy4KKyAqLworbXhVcmxDb252ZXJ0ZXIucHJvdG90eXBlLmJhc2VVcmwgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBiYXNlRG9tYWluCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgYmFzZSBkb21haW4gdG8gYmUgdXNlZCBhcyBhIHByZWZpeCBmb3IgYWJzb2x1dGUgVVJMcy4KKyAqLworbXhVcmxDb252ZXJ0ZXIucHJvdG90eXBlLmJhc2VEb21haW4gPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiB1cGRhdGVCYXNlVXJsCisgKiAKKyAqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgYmFzZSBVUkwuCisgKi8KK214VXJsQ29udmVydGVyLnByb3RvdHlwZS51cGRhdGVCYXNlVXJsID0gZnVuY3Rpb24oKQoreworCXRoaXMuYmFzZURvbWFpbiA9IGxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGxvY2F0aW9uLmhvc3Q7CisJdGhpcy5iYXNlVXJsID0gdGhpcy5iYXNlRG9tYWluICsgbG9jYXRpb24ucGF0aG5hbWU7CisJdmFyIHRtcCA9IHRoaXMuYmFzZVVybC5sYXN0SW5kZXhPZignLycpOworCQorCS8vIFN0cmlwcyBmaWxlbmFtZSBldGMKKwlpZiAodG1wID4gMCkKKwl7CisJCXRoaXMuYmFzZVVybCA9IHRoaXMuYmFzZVVybC5zdWJzdHJpbmcoMCwgdG1wICsgMSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFbmFibGVkCisgKiAKKyAqIFJldHVybnMgPGVuYWJsZWQ+LgorICovCitteFVybENvbnZlcnRlci5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmVuYWJsZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRFbmFibGVkCisgKiAKKyAqIFNldHMgPGVuYWJsZWQ+LgorICovCitteFVybENvbnZlcnRlci5wcm90b3R5cGUuc2V0RW5hYmxlZCA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuZW5hYmxlZCA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0QmFzZVVybAorICogCisgKiBSZXR1cm5zIDxiYXNlVXJsPi4KKyAqLworbXhVcmxDb252ZXJ0ZXIucHJvdG90eXBlLmdldEJhc2VVcmwgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuYmFzZVVybDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEJhc2VVcmwKKyAqIAorICogU2V0cyA8YmFzZVVybD4uCisgKi8KK214VXJsQ29udmVydGVyLnByb3RvdHlwZS5zZXRCYXNlVXJsID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5iYXNlVXJsID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRCYXNlRG9tYWluCisgKiAKKyAqIFJldHVybnMgPGJhc2VEb21haW4+LgorICovCitteFVybENvbnZlcnRlci5wcm90b3R5cGUuZ2V0QmFzZURvbWFpbiA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5iYXNlRG9tYWluOworfSwKKworLyoqCisgKiBGdW5jdGlvbjogc2V0QmFzZURvbWFpbgorICogCisgKiBTZXRzIDxiYXNlRG9tYWluPi4KKyAqLworbXhVcmxDb252ZXJ0ZXIucHJvdG90eXBlLnNldEJhc2VEb21haW4gPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmJhc2VEb21haW4gPSB2YWx1ZTsKK30sCisKKy8qKgorICogRnVuY3Rpb246IGlzUmVsYXRpdmVVcmwKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBVUkwgaXMgcmVsYXRpdmUuCisgKi8KK214VXJsQ29udmVydGVyLnByb3RvdHlwZS5pc1JlbGF0aXZlVXJsID0gZnVuY3Rpb24odXJsKQoreworCXJldHVybiB1cmwuc3Vic3RyaW5nKDAsIDIpICE9ICcvLycgJiYgdXJsLnN1YnN0cmluZygwLCA3KSAhPSAnaHR0cDovLycgJiYgdXJsLnN1YnN0cmluZygwLCA4KSAhPSAnaHR0cHM6Ly8nICYmIHVybC5zdWJzdHJpbmcoMCwgMTApICE9ICdkYXRhOmltYWdlJzsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNvbnZlcnQKKyAqIAorICogQ29udmVydHMgdGhlIGdpdmVuIFVSTCB0byBhbiBhYnNvbHV0ZSBVUkwgd2l0aCBwcm90b2wgYW5kIGRvbWFpbi4KKyAqIFJlbGF0aXZlIFVSTHMgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhYnNvbHV0ZSBVUkxzLgorICovCitteFVybENvbnZlcnRlci5wcm90b3R5cGUuY29udmVydCA9IGZ1bmN0aW9uKHVybCkKK3sKKwlpZiAodGhpcy5pc0VuYWJsZWQoKSAmJiB0aGlzLmlzUmVsYXRpdmVVcmwodXJsKSkKKwl7CisJCWlmICh0aGlzLmdldEJhc2VVcmwoKSA9PSBudWxsKQorCQl7CisJCQl0aGlzLnVwZGF0ZUJhc2VVcmwoKTsKKwkJfQorCQkKKwkJaWYgKHVybC5jaGFyQXQoMCkgPT0gJy8nKQorCQl7CisJCQl1cmwgPSB0aGlzLmdldEJhc2VEb21haW4oKSArIHVybDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXVybCA9IHRoaXMuZ2V0QmFzZVVybCgpICsgdXJsOworCQl9CisJfQorCQorCXJldHVybiB1cmw7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhVdGlscy5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214VXRpbHMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1YTI2OAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214VXRpbHMuanMKQEAgLTAsMCArMSw0MzUzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCit2YXIgbXhVdGlscyA9Cit7CisJLyoqCisJICogQ2xhc3M6IG14VXRpbHMKKwkgKiAKKwkgKiBBIHNpbmdsZXRvbiBjbGFzcyB0aGF0IHByb3ZpZGVzIGNyb3NzLWJyb3dzZXIgaGVscGVyIG1ldGhvZHMuCisJICogVGhpcyBpcyBhIGdsb2JhbCBmdW5jdGlvbmFsaXR5LiBUbyBhY2Nlc3MgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzCisJICogY2xhc3MsIHVzZSB0aGUgZ2xvYmFsIGNsYXNzbmFtZSBhcHBlbmRlZCBieSB0aGUgZnVuY3Rpb25uYW1lLgorCSAqIFlvdSBtYXkgaGF2ZSB0byBsb2FkIGNocm9tZTovL2dsb2JhbC9jb250ZW50L2NvbnRlbnRBcmVhVXRpbHMuanMKKwkgKiB0byBkaXNhYmxlIGNlcnRhaW4gc2VjdXJpdHkgcmVzdHJpY3Rpb25zIGluIE1vemlsbGEgZm9yIHRoZSA8b3Blbj4sCisJICogPHNhdmU+LCA8c2F2ZUFzPiBhbmQgPGNvcHk+IGZ1bmN0aW9uLgorCSAqIAorCSAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgZGlzcGxheXMgYW4gZXJyb3IgbWVzc2FnZToKKwkgKiAKKwkgKiAoY29kZSkKKwkgKiBteFV0aWxzLmVycm9yKCdCcm93c2VyIGlzIG5vdCBzdXBwb3J0ZWQhJywgMjAwLCBmYWxzZSk7CisJICogKGVuZCkKKwkgKiAKKwkgKiBWYXJpYWJsZTogZXJyb3JSZXNvdXJjZQorCSAqIAorCSAqIFNwZWNpZmllcyB0aGUgcmVzb3VyY2Uga2V5IGZvciB0aGUgdGl0bGUgb2YgdGhlIGVycm9yIHdpbmRvdy4gSWYgdGhlCisJICogcmVzb3VyY2UgZm9yIHRoaXMga2V5IGRvZXMgbm90IGV4aXN0IHRoZW4gdGhlIHZhbHVlIGlzIHVzZWQgYXMKKwkgKiB0aGUgdGl0bGUuIERlZmF1bHQgaXMgJ2Vycm9yJy4KKwkgKi8KKwllcnJvclJlc291cmNlOiAobXhDbGllbnQubGFuZ3VhZ2UgIT0gJ25vbmUnKSA/ICdlcnJvcicgOiAnJywKKwkKKwkvKioKKwkgKiBWYXJpYWJsZTogY2xvc2VSZXNvdXJjZQorCSAqIAorCSAqIFNwZWNpZmllcyB0aGUgcmVzb3VyY2Uga2V5IGZvciB0aGUgbGFiZWwgb2YgdGhlIGNsb3NlIGJ1dHRvbi4gSWYgdGhlCisJICogcmVzb3VyY2UgZm9yIHRoaXMga2V5IGRvZXMgbm90IGV4aXN0IHRoZW4gdGhlIHZhbHVlIGlzIHVzZWQgYXMKKwkgKiB0aGUgbGFiZWwuIERlZmF1bHQgaXMgJ2Nsb3NlJy4KKwkgKi8KKwljbG9zZVJlc291cmNlOiAobXhDbGllbnQubGFuZ3VhZ2UgIT0gJ25vbmUnKSA/ICdjbG9zZScgOiAnJywKKworCS8qKgorCSAqIFZhcmlhYmxlOiBlcnJvckltYWdlCisJICogCisJICogRGVmaW5lcyB0aGUgaW1hZ2UgdXNlZCBmb3IgZXJyb3IgZGlhbG9ncy4KKwkgKi8KKwllcnJvckltYWdlOiBteENsaWVudC5pbWFnZUJhc2VQYXRoICsgJy9lcnJvci5naWYnLAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiByZW1vdmVDdXJzb3JzCisJICogCisJICogUmVtb3ZlcyB0aGUgY3Vyc29ycyBmcm9tIHRoZSBzdHlsZSBvZiB0aGUgZ2l2ZW4gRE9NIG5vZGUgYW5kIGl0cworCSAqIGRlc2NlbmRhbnRzLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogZWxlbWVudCAtIERPTSBub2RlIHRvIHJlbW92ZSB0aGUgY3Vyc29yIHN0eWxlIGZyb20uCisJICovCisJcmVtb3ZlQ3Vyc29yczogZnVuY3Rpb24oZWxlbWVudCkKKwl7CisJCWlmIChlbGVtZW50LnN0eWxlICE9IG51bGwpCisJCXsKKwkJCWVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJyc7CisJCX0KKwkJCisJCXZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGROb2RlczsKKwkJCisJCWlmIChjaGlsZHJlbiAhPSBudWxsKQorCQl7CisJICAgICAgICB2YXIgY2hpbGRDb3VudCA9IGNoaWxkcmVuLmxlbmd0aDsKKwkgICAgICAgIAorCSAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpICs9IDEpCisJICAgICAgICB7CisJICAgICAgICAgICAgbXhVdGlscy5yZW1vdmVDdXJzb3JzKGNoaWxkcmVuW2ldKTsKKwkgICAgICAgIH0KKwkgICAgfQorCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0Q3VycmVudFN0eWxlCisJICogCisJICogUmV0dXJucyB0aGUgY3VycmVudCBzdHlsZSBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBlbGVtZW50IC0gRE9NIG5vZGUgd2hvc2UgY3VycmVudCBzdHlsZSBzaG91bGQgYmUgcmV0dXJuZWQuCisJICovCisJZ2V0Q3VycmVudFN0eWxlOiBmdW5jdGlvbigpCisJeworCQlpZiAobXhDbGllbnQuSVNfSUUpCisJCXsKKwkJCXJldHVybiBmdW5jdGlvbihlbGVtZW50KQorCQkJeworCQkJCXJldHVybiAoZWxlbWVudCAhPSBudWxsKSA/IGVsZW1lbnQuY3VycmVudFN0eWxlIDogbnVsbDsKKwkJCX07CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gZnVuY3Rpb24oZWxlbWVudCkKKwkJCXsKKwkJCQlyZXR1cm4gKGVsZW1lbnQgIT0gbnVsbCkgPworCQkJCQl3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCAnJykgOgorCQkJCQludWxsOworCQkJfTsKKwkJfQorCX0oKSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogcGFyc2VDc3NOdW1iZXIKKwkgKiAKKwkgKiBQYXJzZXMgdGhlIGdpdmVuIENTUyBudW1lcmljIHZhbHVlIGFkZGluZyBoYW5kbGluZyBmb3IgdGhlIHZhbHVlcyB0aGluLAorCSAqIG1lZGl1bSBhbmQgdGhpY2sgKDIsIDQgYW5kIDYpLgorCSAqLworCXBhcnNlQ3NzTnVtYmVyOiBmdW5jdGlvbih2YWx1ZSkKKwl7CisJCWlmICh2YWx1ZSA9PSAndGhpbicpCisJCXsKKwkJCXZhbHVlID0gJzInOworCQl9CisJCWVsc2UgaWYgKHZhbHVlID09ICdtZWRpdW0nKQorCQl7CisJCQl2YWx1ZSA9ICc0JzsKKwkJfQorCQllbHNlIGlmICh2YWx1ZSA9PSAndGhpY2snKQorCQl7CisJCQl2YWx1ZSA9ICc2JzsKKwkJfQorCQkKKwkJdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTsKKwkJCisJCWlmIChpc05hTih2YWx1ZSkpCisJCXsKKwkJCXZhbHVlID0gMDsKKwkJfQorCQkKKwkJcmV0dXJuIHZhbHVlOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogc2V0UHJlZml4ZWRTdHlsZQorCSAqIAorCSAqIEFkZHMgdGhlIGdpdmVuIHN0eWxlIHdpdGggdGhlIHN0YW5kYXJkIG5hbWUgYW5kIGFuIG9wdGlvbmFsIHZlbmRvciBwcmVmaXggZm9yIHRoZSBjdXJyZW50CisJICogYnJvd3Nlci4KKwkgKiAKKwkgKiAoY29kZSkKKwkgKiBteFV0aWxzLnNldFByZWZpeGVkU3R5bGUobm9kZS5zdHlsZSwgJ3RyYW5zZm9ybU9yaWdpbicsICcwJSAwJScpOworCSAqIChlbmQpCisJICovCisJc2V0UHJlZml4ZWRTdHlsZTogZnVuY3Rpb24oKQorCXsKKwkJdmFyIHByZWZpeCA9IG51bGw7CisJCQorCQlpZiAobXhDbGllbnQuSVNfT1QpCisJCXsKKwkJCXByZWZpeCA9ICdPJzsKKwkJfQorCQllbHNlIGlmIChteENsaWVudC5JU19TRiB8fCBteENsaWVudC5JU19HQykKKwkJeworCQkJcHJlZml4ID0gJ1dlYmtpdCc7CisJCX0KKwkJZWxzZSBpZiAobXhDbGllbnQuSVNfTVQpCisJCXsKKwkJCXByZWZpeCA9ICdNb3onOworCQl9CisJCWVsc2UgaWYgKG14Q2xpZW50LklTX0lFICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA+PSA5ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA8IDEwKQorCQl7CisJCQlwcmVmaXggPSAnbXMnOworCQl9CisKKwkJcmV0dXJuIGZ1bmN0aW9uKHN0eWxlLCBuYW1lLCB2YWx1ZSkKKwkJeworCQkJc3R5bGVbbmFtZV0gPSB2YWx1ZTsKKwkJCQorCQkJaWYgKHByZWZpeCAhPSBudWxsICYmIG5hbWUubGVuZ3RoID4gMCkKKwkJCXsKKwkJCQluYW1lID0gcHJlZml4ICsgbmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOworCQkJCXN0eWxlW25hbWVdID0gdmFsdWU7CisJCQl9CisJCX07CisJfSgpLAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBoYXNTY3JvbGxiYXJzCisJICogCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBvdmVyZmxvdyBDU1MgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG5vZGUgaXMgZWl0aGVyCisJICogc2Nyb2xsIG9yIGF1dG8uCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBub2RlIC0gRE9NIG5vZGUgd2hvc2Ugc3R5bGUgc2hvdWxkIGJlIGNoZWNrZWQgZm9yIHNjcm9sbGJhcnMuCisJICovCisJaGFzU2Nyb2xsYmFyczogZnVuY3Rpb24obm9kZSkKKwl7CisJCXZhciBzdHlsZSA9IG14VXRpbHMuZ2V0Q3VycmVudFN0eWxlKG5vZGUpOworCisJCXJldHVybiBzdHlsZSAhPSBudWxsICYmIChzdHlsZS5vdmVyZmxvdyA9PSAnc2Nyb2xsJyB8fCBzdHlsZS5vdmVyZmxvdyA9PSAnYXV0bycpOworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IGJpbmQKKwkgKiAKKwkgKiBSZXR1cm5zIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGxvY2tzIHRoZSBleGVjdXRpb24gc2NvcGUgb2YgdGhlIGdpdmVuCisJICogZnVuY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBzY29wZS4gSW5zaWRlIGZ1bmN0LCB0aGUgInRoaXMiIGtleXdvcmQKKwkgKiBiZWNvbWVzIGEgcmVmZXJlbmNlIHRvIHRoYXQgc2NvcGUuCisJICovCisJYmluZDogZnVuY3Rpb24oc2NvcGUsIGZ1bmN0KQorCXsKKwkJcmV0dXJuIGZ1bmN0aW9uKCkKKwkJeworCQkJcmV0dXJuIGZ1bmN0LmFwcGx5KHNjb3BlLCBhcmd1bWVudHMpOworCQl9OworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IGV2YWwKKwkgKiAKKwkgKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIGV4cHJlc3Npb24gdXNpbmcgZXZhbCBhbmQgcmV0dXJucyB0aGUgSmF2YVNjcmlwdAorCSAqIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGV4cHJlc3Npb24gcmVzdWx0LiBTdXBwb3J0cyBldmFsdWF0aW9uIG9mCisJICogZXhwcmVzc2lvbnMgdGhhdCBkZWZpbmUgZnVuY3Rpb25zIGFuZCByZXR1cm5zIHRoZSBmdW5jdGlvbiBvYmplY3QgZm9yCisJICogdGhlc2UgZXhwcmVzc2lvbnMuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBleHByIC0gQSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uLgorCSAqLworCWV2YWw6IGZ1bmN0aW9uKGV4cHIpCisJeworCQl2YXIgcmVzdWx0ID0gbnVsbDsKKworCQlpZiAoZXhwci5pbmRleE9mKCdmdW5jdGlvbicpID49IDApCisJCXsKKwkJCXRyeQorCQkJeworCQkJCWV2YWwoJ3ZhciBfbXhKYXZhU2NyaXB0RXhwcmVzc2lvbj0nK2V4cHIpOworCQkJCXJlc3VsdCA9IF9teEphdmFTY3JpcHRFeHByZXNzaW9uOworCQkJCS8vIFRPRE86IFVzZSBkZWxldGUgaGVyZT8KKwkJCQlfbXhKYXZhU2NyaXB0RXhwcmVzc2lvbiA9IG51bGw7CisJCQl9CisJCQljYXRjaCAoZSkKKwkJCXsKKwkJCQlteExvZy53YXJuKGUubWVzc2FnZSArICcgd2hpbGUgZXZhbHVhdGluZyAnICsgZXhwcik7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQl0cnkKKwkJCXsKKwkJCQlyZXN1bHQgPSBldmFsKGV4cHIpOworCQkJfQorCQkJY2F0Y2ggKGUpCisJCQl7CisJCQkJbXhMb2cud2FybihlLm1lc3NhZ2UgKyAnIHdoaWxlIGV2YWx1YXRpbmcgJyArIGV4cHIpOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gcmVzdWx0OworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IGZpbmROb2RlCisJICogCisJICogUmV0dXJucyB0aGUgZmlyc3Qgbm9kZSB3aGVyZSBhdHRyIGVxdWFscyB2YWx1ZS4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHVzZSBYUGF0aC4KKwkgKi8KKwlmaW5kTm9kZTogZnVuY3Rpb24obm9kZSwgYXR0ciwgdmFsdWUpCisJeworCQlpZiAobm9kZS5ub2RlVHlwZSA9PSBteENvbnN0YW50cy5OT0RFVFlQRV9FTEVNRU5UKQorCQl7CisJCQl2YXIgdG1wID0gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cik7CisJCisJCQlpZiAodG1wICE9IG51bGwgJiYgdG1wID09IHZhbHVlKQorCQkJeworCQkJCXJldHVybiBub2RlOworCQkJfQorCQl9CisJCQorCQlub2RlID0gbm9kZS5maXJzdENoaWxkOworCQkKKwkJd2hpbGUgKG5vZGUgIT0gbnVsbCkKKwkJeworCQkJdmFyIHJlc3VsdCA9IG14VXRpbHMuZmluZE5vZGUobm9kZSwgYXR0ciwgdmFsdWUpOworCQkJCisJCQlpZiAocmVzdWx0ICE9IG51bGwpCisJCQl7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCQorCQkJbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CisJCX0KKwkJCisJCXJldHVybiBudWxsOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0RnVuY3Rpb25OYW1lCisJICogCisJICogUmV0dXJucyB0aGUgbmFtZSBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogZiAtIEphdmFTY3JpcHQgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIGZ1bmN0aW9uLgorCSAqLworCWdldEZ1bmN0aW9uTmFtZTogZnVuY3Rpb24oZikKKwl7CisJCXZhciBzdHIgPSBudWxsOworCisJCWlmIChmICE9IG51bGwpCisJCXsKKwkJCWlmIChmLm5hbWUgIT0gbnVsbCkKKwkJCXsKKwkJCQlzdHIgPSBmLm5hbWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc3RyID0gbXhVdGlscy50cmltKGYudG9TdHJpbmcoKSk7CisJCQkJCisJCQkJaWYgKC9eZnVuY3Rpb25ccy8udGVzdChzdHIpKQorCQkJCXsKKwkJCQkJc3RyID0gbXhVdGlscy5sdHJpbShzdHIuc3Vic3RyaW5nKDkpKTsKKwkJCQkJdmFyIGlkeDIgPSBzdHIuaW5kZXhPZignKCcpOworCQkJCQkKKwkJCQkJaWYgKGlkeDIgPiAwKQorCQkJCQl7CisJCQkJCQlzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIGlkeDIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlyZXR1cm4gc3RyOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogaW5kZXhPZgorCSAqIAorCSAqIFJldHVybnMgdGhlIGluZGV4IG9mIG9iaiBpbiBhcnJheSBvciAtMSBpZiB0aGUgYXJyYXkgZG9lcyBub3QgY29udGFpbgorCSAqIHRoZSBnaXZlbiBvYmplY3QuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBhcnJheSAtIEFycmF5IHRvIGNoZWNrIGZvciB0aGUgZ2l2ZW4gb2JqLgorCSAqIG9iaiAtIE9iamVjdCB0byBmaW5kIGluIHRoZSBnaXZlbiBhcnJheS4KKwkgKi8KKwlpbmRleE9mOiBmdW5jdGlvbihhcnJheSwgb2JqKQorCXsKKwkJaWYgKGFycmF5ICE9IG51bGwgJiYgb2JqICE9IG51bGwpCisJCXsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJaWYgKGFycmF5W2ldID09IG9iaikKKwkJCQl7CisJCQkJCXJldHVybiBpOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIC0xOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZm9yRWFjaAorCSAqIAorCSAqIENhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBnaXZlbiBhcnJheSBhbmQgcmV0dXJucworCSAqIHRoZSBhcnJheS4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGFycmF5IC0gQXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMuCisJICogZm4gLSBGdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIGVhY2ggb2JqZWN0LgorCSAqLworCWZvckVhY2g6IGZ1bmN0aW9uKGFycmF5LCBmbikKKwl7CisJCWlmIChhcnJheSAhPSBudWxsICYmIGZuICE9IG51bGwpCisJCXsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJZm4oYXJyYXlbaV0pOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gYXJyYXk7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiByZW1vdmUKKwkgKiAKKwkgKiBSZW1vdmVzIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgZ2l2ZW4gb2JqZWN0IGluIHRoZSBnaXZlbiBhcnJheSBvcgorCSAqIG9iamVjdC4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHRoZSBvYmplY3QsIGJlIHRoZXkKKwkgKiBhc3NvY2lhdGl2ZSBvciBhcyBhbiBhcnJheSBlbnRyeSwgYWxsIG9jY3VycmVuY2VzIGFyZSByZW1vdmVkIGZyb20KKwkgKiB0aGUgYXJyYXkgb3IgZGVsZXRlZCBmcm9tIHRoZSBvYmplY3QuIEJ5IHJlbW92aW5nIHRoZSBvYmplY3QgZnJvbQorCSAqIHRoZSBhcnJheSwgYWxsIGVsZW1lbnRzIGZvbGxvd2luZyB0aGUgcmVtb3ZlZCBlbGVtZW50IGFyZSBzaGlmdGVkCisJICogYnkgb25lIHN0ZXAgdG93YXJkcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4KKwkgKiAKKwkgKiBUaGUgbGVuZ3RoIG9mIGFycmF5cyBpcyBub3QgbW9kaWZpZWQgaW5zaWRlIHRoaXMgZnVuY3Rpb24uCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBvYmogLSBPYmplY3QgdG8gZmluZCBpbiB0aGUgZ2l2ZW4gYXJyYXkuCisJICogYXJyYXkgLSBBcnJheSB0byBjaGVjayBmb3IgdGhlIGdpdmVuIG9iai4KKwkgKi8KKwlyZW1vdmU6IGZ1bmN0aW9uKG9iaiwgYXJyYXkpCisJeworCQl2YXIgcmVzdWx0ID0gbnVsbDsKKwkJCisJCWlmICh0eXBlb2YoYXJyYXkpID09ICdvYmplY3QnKQorCQl7CisJCQl2YXIgaW5kZXggPSBteFV0aWxzLmluZGV4T2YoYXJyYXksIG9iaik7CisJCQkKKwkJCXdoaWxlIChpbmRleCA+PSAwKQorCQkJeworCQkJCWFycmF5LnNwbGljZShpbmRleCwgMSk7CisJCQkJcmVzdWx0ID0gb2JqOworCQkJCWluZGV4ID0gbXhVdGlscy5pbmRleE9mKGFycmF5LCBvYmopOworCQkJfQorCQl9CisKKwkJZm9yICh2YXIga2V5IGluIGFycmF5KQorCQl7CisJCQlpZiAoYXJyYXlba2V5XSA9PSBvYmopCisJCQl7CisJCQkJZGVsZXRlIGFycmF5W2tleV07CisJCQkJcmVzdWx0ID0gb2JqOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gcmVzdWx0OworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IGlzTm9kZQorCSAqIAorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gWE1MIG5vZGUgd2l0aCB0aGUgbm9kZSBuYW1lCisJICogYW5kIGlmIHRoZSBvcHRpb25hbCBhdHRyaWJ1dGUgaGFzIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisJICogCisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgdGhlIGdpdmVuIHZhbHVlIGlzIGEgRE9NIG5vZGUgaWYgdGhlCisJICogbm9kZVR5cGUgcHJvcGVydHkgaXMgbnVtZXJpYywgdGhhdCBpcywgaWYgaXNOYU4gcmV0dXJucyBmYWxzZSBmb3IKKwkgKiB2YWx1ZS5ub2RlVHlwZS4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIHZhbHVlIC0gT2JqZWN0IHRoYXQgc2hvdWxkIGJlIGV4YW1pbmVkIGFzIGEgbm9kZS4KKwkgKiBub2RlTmFtZSAtIFN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgbm9kZSBuYW1lLgorCSAqIGF0dHJpYnV0ZU5hbWUgLSBPcHRpb25hbCBhdHRyaWJ1dGUgbmFtZSB0byBjaGVjay4KKwkgKiBhdHRyaWJ1dGVWYWx1ZSAtIE9wdGlvbmFsIGF0dHJpYnV0ZSB2YWx1ZSB0byBjaGVjay4KKwkgKi8KKwkgaXNOb2RlOiBmdW5jdGlvbih2YWx1ZSwgbm9kZU5hbWUsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKQorCSB7CisJIAlpZiAodmFsdWUgIT0gbnVsbCAmJiAhaXNOYU4odmFsdWUubm9kZVR5cGUpICYmIChub2RlTmFtZSA9PSBudWxsIHx8CisJIAkJdmFsdWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSkKKyAJCXsKKyAJCQlyZXR1cm4gYXR0cmlidXRlTmFtZSA9PSBudWxsIHx8CisgCQkJCXZhbHVlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSA9PSBhdHRyaWJ1dGVWYWx1ZTsKKyAJCX0KKwkgCQorCSAJcmV0dXJuIGZhbHNlOworCSB9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBpc0FuY2VzdG9yTm9kZQorCSAqIAorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gYW5jZXN0b3IgaXMgYW4gYW5jZXN0b3Igb2YgdGhlCisJICogZ2l2ZW4gRE9NIG5vZGUgaW4gdGhlIERPTS4gVGhpcyBhbHNvIHJldHVybnMgdHJ1ZSBpZiB0aGUKKwkgKiBjaGlsZCBpcyB0aGUgYW5jZXN0b3IuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBhbmNlc3RvciAtIERPTSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgYW5jZXN0b3IuCisJICogY2hpbGQgLSBET00gbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGNoaWxkLgorCSAqLworCSBpc0FuY2VzdG9yTm9kZTogZnVuY3Rpb24oYW5jZXN0b3IsIGNoaWxkKQorCSB7CisJIAl2YXIgcGFyZW50ID0gY2hpbGQ7CisJIAkKKwkgCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkKKwkgCXsKKwkgCQlpZiAocGFyZW50ID09IGFuY2VzdG9yKQorCSAJCXsKKwkgCQkJcmV0dXJuIHRydWU7CisJIAkJfQorCisJIAkJcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7CisJIAl9CisJIAkKKwkgCXJldHVybiBmYWxzZTsKKwkgfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBnZXRDaGlsZE5vZGVzCisJICogCisJICogUmV0dXJucyBhbiBhcnJheSBvZiBjaGlsZCBub2RlcyB0aGF0IGFyZSBvZiB0aGUgZ2l2ZW4gbm9kZSB0eXBlLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogbm9kZSAtIFBhcmVudCBET00gbm9kZSB0byByZXR1cm4gdGhlIGNoaWxkcmVuIGZyb20uCisJICogbm9kZVR5cGUgLSBPcHRpb25hbCBub2RlIHR5cGUgdG8gcmV0dXJuLiBEZWZhdWx0IGlzCisJICogPG14Q29uc3RhbnRzLk5PREVUWVBFX0VMRU1FTlQ+LgorCSAqLworCWdldENoaWxkTm9kZXM6IGZ1bmN0aW9uKG5vZGUsIG5vZGVUeXBlKQorCXsKKwkJbm9kZVR5cGUgPSBub2RlVHlwZSB8fCBteENvbnN0YW50cy5OT0RFVFlQRV9FTEVNRU5UOworCQkKKwkJdmFyIGNoaWxkcmVuID0gW107CisJCXZhciB0bXAgPSBub2RlLmZpcnN0Q2hpbGQ7CisJCQorCQl3aGlsZSAodG1wICE9IG51bGwpCisJCXsKKwkJCWlmICh0bXAubm9kZVR5cGUgPT0gbm9kZVR5cGUpCisJCQl7CisJCQkJY2hpbGRyZW4ucHVzaCh0bXApOworCQkJfQorCQkJCisJCQl0bXAgPSB0bXAubmV4dFNpYmxpbmc7CisJCX0KKwkJCisJCXJldHVybiBjaGlsZHJlbjsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGltcG9ydE5vZGUKKwkgKiAKKwkgKiBDcm9zcyBicm93c2VyIGltcGxlbWVudGF0aW9uIGZvciBkb2N1bWVudC5pbXBvcnROb2RlLiBVc2VzIGRvY3VtZW50LmltcG9ydE5vZGUKKwkgKiBpbiBhbGwgYnJvd3NlcnMgYnV0IElFLCB3aGVyZSB0aGUgbm9kZSBpcyBjbG9uZWQgYnkgY3JlYXRpbmcgYSBuZXcgbm9kZSBhbmQKKwkgKiBjb3B5aW5nIGFsbCBhdHRyaWJ1dGVzIGFuZCBjaGlsZHJlbiBpbnRvIGl0IHVzaW5nIGltcG9ydE5vZGUsIHJlY3Vyc2l2ZWx5LgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogZG9jIC0gRG9jdW1lbnQgdG8gaW1wb3J0IHRoZSBub2RlIGludG8uCisJICogbm9kZSAtIE5vZGUgdG8gYmUgaW1wb3J0ZWQuCisJICogYWxsQ2hpbGRyZW4gLSBJZiBhbGwgY2hpbGRyZW4gc2hvdWxkIGJlIGltcG9ydGVkLgorCSAqLworCWltcG9ydE5vZGU6IGZ1bmN0aW9uKGRvYywgbm9kZSwgYWxsQ2hpbGRyZW4pCisJeworCQlpZiAobXhDbGllbnQuSVNfSUUgJiYgKGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSBudWxsIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA8IDEwKSkKKwkJeworCQkJc3dpdGNoIChub2RlLm5vZGVUeXBlKQorCQkJeworCQkJCWNhc2UgMTogLyogZWxlbWVudCAqLworCQkJCXsKKwkJCQkJdmFyIG5ld05vZGUgPSBkb2MuY3JlYXRlRWxlbWVudChub2RlLm5vZGVOYW1lKTsKKwkJCQkJCisJCQkJCWlmIChub2RlLmF0dHJpYnV0ZXMgJiYgbm9kZS5hdHRyaWJ1dGVzLmxlbmd0aCA+IDApCisJCQkJCXsKKwkJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKQorCQkJCQkJeworCQkJCQkJCW5ld05vZGUuc2V0QXR0cmlidXRlKG5vZGUuYXR0cmlidXRlc1tpXS5ub2RlTmFtZSwKKwkJCQkJCQkJbm9kZS5nZXRBdHRyaWJ1dGUobm9kZS5hdHRyaWJ1dGVzW2ldLm5vZGVOYW1lKSk7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWlmIChhbGxDaGlsZHJlbiAmJiBub2RlLmNoaWxkTm9kZXMgJiYgbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDApCisJCQkJCQl7CisJCQkJCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspCisJCQkJCQkJeworCQkJCQkJCQluZXdOb2RlLmFwcGVuZENoaWxkKG14VXRpbHMuaW1wb3J0Tm9kZShkb2MsIG5vZGUuY2hpbGROb2Rlc1tpXSwgYWxsQ2hpbGRyZW4pKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJCisJCQkJCXJldHVybiBuZXdOb2RlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2FzZSAzOiAvKiB0ZXh0ICovCisJCQkgICAgY2FzZSA0OiAvKiBjZGF0YS1zZWN0aW9uICovCisJCQkgICAgY2FzZSA4OiAvKiBjb21tZW50ICovCisJCQkgICAgeworCQkJICAgICAgcmV0dXJuIGRvYy5jcmVhdGVUZXh0Tm9kZShub2RlLnZhbHVlKTsKKwkJCSAgICAgIGJyZWFrOworCQkJICAgIH0KKwkJCX07CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gZG9jLmltcG9ydE5vZGUobm9kZSwgYWxsQ2hpbGRyZW4pOworCQl9CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBjcmVhdGVYbWxEb2N1bWVudAorCSAqIAorCSAqIFJldHVybnMgYSBuZXcsIGVtcHR5IFhNTCBkb2N1bWVudC4KKwkgKi8KKwljcmVhdGVYbWxEb2N1bWVudDogZnVuY3Rpb24oKQorCXsKKwkJdmFyIGRvYyA9IG51bGw7CisJCQorCQlpZiAoZG9jdW1lbnQuaW1wbGVtZW50YXRpb24gJiYgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQpCisJCXsKKwkJCWRvYyA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCcnLCAnJywgbnVsbCk7CisJCX0KKwkJZWxzZSBpZiAod2luZG93LkFjdGl2ZVhPYmplY3QpCisJCXsKKwkJCWRvYyA9IG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MRE9NJyk7CisJIAl9CisJIAkKKwkgCXJldHVybiBkb2M7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBwYXJzZVhtbAorCSAqIAorCSAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIFhNTCBzdHJpbmcgaW50byBhIG5ldyBYTUwgZG9jdW1lbnQgYW5kIHJldHVybnMgdGhlCisJICogbmV3IGRvY3VtZW50LgorCSAqIAorCSAqIEV4YW1wbGU6CisJICogCisJICogKGNvZGUpCisJICogdmFyIGRvYyA9IG14VXRpbHMucGFyc2VYbWwoCisJICogICAnPG14R3JhcGhNb2RlbD48cm9vdD48TXlEaWFncmFtIGlkPSIwIj48bXhDZWxsLz48L015RGlhZ3JhbT4nKworCSAqICAgJzxNeUxheWVyIGlkPSIxIj48bXhDZWxsIHBhcmVudD0iMCIgLz48L015TGF5ZXI+PE15T2JqZWN0IGlkPSIyIj4nKworCSAqICAgJzxteENlbGwgc3R5bGU9InN0cm9rZUNvbG9yPWJsdWU7ZmlsbENvbG9yPXJlZCIgcGFyZW50PSIxIiB2ZXJ0ZXg9IjEiPicrCisJICogICAnPG14R2VvbWV0cnkgeD0iMTAiIHk9IjEwIiB3aWR0aD0iODAiIGhlaWdodD0iMzAiIGFzPSJnZW9tZXRyeSIvPicrCisJICogICAnPC9teENlbGw+PC9NeU9iamVjdD48L3Jvb3Q+PC9teEdyYXBoTW9kZWw+Jyk7CisJICogKGVuZCkKKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIHhtbCAtIFN0cmluZyB0aGF0IGNvbnRhaW5zIHRoZSBYTUwgZGF0YS4KKwkgKi8KKwlwYXJzZVhtbDogZnVuY3Rpb24oKQorCXsKKwkJaWYgKHdpbmRvdy5ET01QYXJzZXIpCisJCXsKKwkJCXJldHVybiBmdW5jdGlvbih4bWwpCisJCQl7CisJCQkJdmFyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKKwkJCQkKKwkJCQlyZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh4bWwsICd0ZXh0L3htbCcpOworCQkJfTsKKwkJfQorCQllbHNlIC8vIElFPD05CisJCXsKKwkJCXJldHVybiBmdW5jdGlvbih4bWwpCisJCQl7CisJCQkJdmFyIHJlc3VsdCA9IG14VXRpbHMuY3JlYXRlWG1sRG9jdW1lbnQoKTsKKwkJCQlyZXN1bHQuYXN5bmMgPSBmYWxzZTsKKwkJCQkvLyBXb3JrYXJvdW5kIGZvciBwYXJzaW5nIGVycm9ycyB3aXRoIFNWRyBEVEQKKwkJCQlyZXN1bHQudmFsaWRhdGVPblBhcnNlID0gZmFsc2U7CisJCQkJcmVzdWx0LnJlc29sdmVFeHRlcm5hbHMgPSBmYWxzZTsKKwkJCQlyZXN1bHQubG9hZFhNTCh4bWwpOworCQkJCQorCQkJCXJldHVybiByZXN1bHQ7CisJCQl9OworCQl9CisJfSgpLAorCisJLyoqCisJICogRnVuY3Rpb246IGNsZWFyU2VsZWN0aW9uCisJICogCisJICogQ2xlYXJzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpbiB0aGUgcGFnZS4KKwkgKi8KKwljbGVhclNlbGVjdGlvbjogZnVuY3Rpb24oKQorCXsKKwkJaWYgKGRvY3VtZW50LnNlbGVjdGlvbikKKwkJeworCQkJcmV0dXJuIGZ1bmN0aW9uKCkKKwkJCXsKKwkJCQlkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKKwkJCX07CisJCX0KKwkJZWxzZSBpZiAod2luZG93LmdldFNlbGVjdGlvbikKKwkJeworCQkJcmV0dXJuIGZ1bmN0aW9uKCkKKwkJCXsKKwkJCQl3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7CisJCQl9OworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuIGZ1bmN0aW9uKCkgeyB9OworCQl9CisJfSgpLAorCisJLyoqCisJICogRnVuY3Rpb246IGdldFByZXR0eVhNTAorCSAqIAorCSAqIFJldHVybnMgYSBwcmV0dHkgcHJpbnRlZCBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBYTUwgdHJlZSBmb3IgdGhlCisJICogZ2l2ZW4gbm9kZS4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBwcmludCBYTUwgZm9yIHJlYWRpbmcsCisJICogdXNlIDxnZXRYbWw+IGluc3RlYWQgdG8gb2J0YWluIGEgc3RyaW5nIGZvciBwcm9jZXNzaW5nLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogbm9kZSAtIERPTSBub2RlIHRvIHJldHVybiB0aGUgWE1MIGZvci4KKwkgKiB0YWIgLSBPcHRpb25hbCBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIGluZGVudGF0aW9uIGZvciBvbmUgbGV2ZWwuCisJICogRGVmYXVsdCBpcyB0d28gc3BhY2VzLgorCSAqIGluZGVudCAtIE9wdGlvbmFsIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgaW5kZW50YXRpb24uCisJICogRGVmYXVsdCBpcyBhbiBlbXB0eSBzdHJpbmcuCisJICovCisJZ2V0UHJldHR5WG1sOiBmdW5jdGlvbihub2RlLCB0YWIsIGluZGVudCkKKwl7CisJCXZhciByZXN1bHQgPSBbXTsKKwkJCisJCWlmIChub2RlICE9IG51bGwpCisJCXsKKwkJCXRhYiA9IHRhYiB8fCAnICAnOworCQkJaW5kZW50ID0gaW5kZW50IHx8ICcnOworCQkJCisJCQlpZiAobm9kZS5ub2RlVHlwZSA9PSBteENvbnN0YW50cy5OT0RFVFlQRV9URVhUKQorCQkJeworCQkJCXJlc3VsdC5wdXNoKG5vZGUudmFsdWUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJlc3VsdC5wdXNoKGluZGVudCArICc8JyArIG5vZGUubm9kZU5hbWUpOworCQkJCQorCQkJCS8vIENyZWF0ZXMgdGhlIHN0cmluZyB3aXRoIHRoZSBub2RlIGF0dHJpYnV0ZXMKKwkJCQkvLyBhbmQgY29udmVydHMgYWxsIEhUTUwgZW50aXRpZXMgaW4gdGhlIHZhbHVlcworCQkJCXZhciBhdHRycyA9IG5vZGUuYXR0cmlidXRlczsKKwkJCQkKKwkJCQlpZiAoYXR0cnMgIT0gbnVsbCkKKwkJCQl7CisJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspCisJCQkJCXsKKwkJCQkJCXZhciB2YWwgPSBteFV0aWxzLmh0bWxFbnRpdGllcyhhdHRyc1tpXS52YWx1ZSk7CisJCQkJCQlyZXN1bHQucHVzaCgnICcgKyBhdHRyc1tpXS5ub2RlTmFtZSArICc9IicgKyB2YWwgKyAnIicpOworCQkJCQl9CisJCQkJfQorCisJCQkJLy8gUmVjdXJzaXZlbHkgY3JlYXRlcyB0aGUgWE1MIHN0cmluZyBmb3IgZWFjaAorCQkJCS8vIGNoaWxkIG5vZGVzIGFuZCBhcHBlbmRzIGl0IGhlcmUgd2l0aCBhbgorCQkJCS8vIGluZGVudGF0aW9uCisJCQkJdmFyIHRtcCA9IG5vZGUuZmlyc3RDaGlsZDsKKwkJCQkKKwkJCQlpZiAodG1wICE9IG51bGwpCisJCQkJeworCQkJCQlyZXN1bHQucHVzaCgnPlxuJyk7CisJCQkJCQorCQkJCQl3aGlsZSAodG1wICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCXJlc3VsdC5wdXNoKG14VXRpbHMuZ2V0UHJldHR5WG1sKHRtcCwgdGFiLCBpbmRlbnQgKyB0YWIpKTsKKwkJCQkJCXRtcCA9IHRtcC5uZXh0U2libGluZzsKKwkJCQkJfQorCQkJCQkKKwkJCQkJcmVzdWx0LnB1c2goaW5kZW50ICsgJzwvJytub2RlLm5vZGVOYW1lICsgJz5cbicpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXN1bHQucHVzaCgnLz5cbicpOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIHJlc3VsdC5qb2luKCcnKTsKKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiByZW1vdmVXaGl0ZXNwYWNlCisJICogCisJICogUmVtb3ZlcyB0aGUgc2libGluZyB0ZXh0IG5vZGVzIGZvciB0aGUgZ2l2ZW4gbm9kZSB0aGF0IG9ubHkgY29uc2lzdHMKKwkgKiBvZiB0YWJzLCBuZXdsaW5lcyBhbmQgc3BhY2VzLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogbm9kZSAtIERPTSBub2RlIHdob3NlIHNpYmxpbmdzIHNob3VsZCBiZSByZW1vdmVkLgorCSAqIGJlZm9yZSAtIE9wdGlvbmFsIGJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdHJhdmVyc2FsLgorCSAqLworCXJlbW92ZVdoaXRlc3BhY2U6IGZ1bmN0aW9uKG5vZGUsIGJlZm9yZSkKKwl7CisJCXZhciB0bXAgPSAoYmVmb3JlKSA/IG5vZGUucHJldmlvdXNTaWJsaW5nIDogbm9kZS5uZXh0U2libGluZzsKKwkJCisJCXdoaWxlICh0bXAgIT0gbnVsbCAmJiB0bXAubm9kZVR5cGUgPT0gbXhDb25zdGFudHMuTk9ERVRZUEVfVEVYVCkKKwkJeworCQkJdmFyIG5leHQgPSAoYmVmb3JlKSA/IHRtcC5wcmV2aW91c1NpYmxpbmcgOiB0bXAubmV4dFNpYmxpbmc7CisJCQl2YXIgdGV4dCA9IG14VXRpbHMuZ2V0VGV4dENvbnRlbnQodG1wKTsKKwkJCQorCQkJaWYgKG14VXRpbHMudHJpbSh0ZXh0KS5sZW5ndGggPT0gMCkKKwkJCXsKKwkJCQl0bXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0bXApOworCQkJfQorCQkJCisJCQl0bXAgPSBuZXh0OworCQl9CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogaHRtbEVudGl0aWVzCisJICogCisJICogUmVwbGFjZXMgY2hhcmFjdGVycyAobGVzcyB0aGFuLCBncmVhdGVyIHRoYW4sIG5ld2xpbmVzIGFuZCBxdW90ZXMpIHdpdGgKKwkgKiB0aGVpciBIVE1MIGVudGl0aWVzIGluIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIHMgLSBTdHJpbmcgdGhhdCBjb250YWlucyB0aGUgY2hhcmFjdGVycyB0byBiZSBjb252ZXJ0ZWQuCisJICogbmV3bGluZSAtIElmIG5ld2xpbmVzIHNob3VsZCBiZSByZXBsYWNlZC4gRGVmYXVsdCBpcyB0cnVlLgorCSAqLworCWh0bWxFbnRpdGllczogZnVuY3Rpb24ocywgbmV3bGluZSkKKwl7CisJCXMgPSBTdHJpbmcocyB8fCAnJyk7CisJCQorCQlzID0gcy5yZXBsYWNlKC8mL2csJyZhbXA7Jyk7IC8vIDM4IDI2CisJCXMgPSBzLnJlcGxhY2UoLyIvZywnJnF1b3Q7Jyk7IC8vIDM0IDIyCisJCXMgPSBzLnJlcGxhY2UoL1wnL2csJyYjMzk7Jyk7IC8vIDM5IDI3CisJCXMgPSBzLnJlcGxhY2UoLzwvZywnJmx0OycpOyAvLyA2MCAzQworCQlzID0gcy5yZXBsYWNlKC8+L2csJyZndDsnKTsgLy8gNjIgM0UKKworCQlpZiAobmV3bGluZSA9PSBudWxsIHx8IG5ld2xpbmUpCisJCXsKKwkJCXMgPSBzLnJlcGxhY2UoL1xuL2csICcmI3hhOycpOworCQl9CisJCQorCQlyZXR1cm4gczsKKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBpc1ZtbAorCSAqIAorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbm9kZSBpcyBpbiB0aGUgVk1MIG5hbWVzcGFjZS4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIG5vZGUgLSBET00gbm9kZSB3aG9zZSB0YWcgdXJuIHNob3VsZCBiZSBjaGVja2VkLgorCSAqLworCWlzVm1sOiBmdW5jdGlvbihub2RlKQorCXsKKwkJcmV0dXJuIG5vZGUgIT0gbnVsbCAmJiBub2RlLnRhZ1VybiA9PSAndXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwnOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0WG1sCisJICogCisJICogUmV0dXJucyB0aGUgWE1MIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBub2RlLiBGb3IgSW50ZXJuZXQgRXhwbG9yZXIsCisJICogYWxsIFxyXG5cdFtcdF0qIGFyZSByZW1vdmVkIGZyb20gdGhlIFhNTCBzdHJpbmcgYW5kIHRoZSByZW1haW5pbmcgXHJcbgorCSAqIGFyZSByZXBsYWNlZCBieSBcbi4gQWxsIFxuIGFyZSB0aGVuIHJlcGxhY2VkIHdpdGggbGluZWZlZWQsIG9yICYjeGE7IGlmCisJICogbm8gbGluZWZlZWQgaXMgZGVmaW5lZC4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIG5vZGUgLSBET00gbm9kZSB0byByZXR1cm4gdGhlIFhNTCBmb3IuCisJICogbGluZWZlZWQgLSBPcHRpb25hbCBzdHJpbmcgdGhhdCBsaW5lZmVlZHMgYXJlIGNvbnZlcnRlZCBpbnRvLiBEZWZhdWx0IGlzCisJICogJiN4YTsKKwkgKi8KKwlnZXRYbWw6IGZ1bmN0aW9uKG5vZGUsIGxpbmVmZWVkKQorCXsKKwkJdmFyIHhtbCA9ICcnOworCisJCWlmICh3aW5kb3cuWE1MU2VyaWFsaXplciAhPSBudWxsKQorCQl7CisJCQl2YXIgeG1sU2VyaWFsaXplciA9IG5ldyBYTUxTZXJpYWxpemVyKCk7CisJCQl4bWwgPSB4bWxTZXJpYWxpemVyLnNlcmlhbGl6ZVRvU3RyaW5nKG5vZGUpOyAgICAgCisJCX0KKwkJZWxzZSBpZiAobm9kZS54bWwgIT0gbnVsbCkKKwkJeworCQkJeG1sID0gbm9kZS54bWwucmVwbGFjZSgvXHJcblx0W1x0XSovZywgJycpLgorCQkJCXJlcGxhY2UoLz5cclxuL2csICc+JykuCisJCQkJcmVwbGFjZSgvXHJcbi9nLCAnXG4nKTsKKwkJfQorCisJCS8vIFJlcGxhY2VzIGxpbmVmZWVkcyB3aXRoIEhUTUwgRW50aXRpZXMuCisJCWxpbmVmZWVkID0gbGluZWZlZWQgfHwgJyYjeGE7JzsKKwkJeG1sID0geG1sLnJlcGxhY2UoL1xuL2csIGxpbmVmZWVkKTsKKwkJICAKKwkJcmV0dXJuIHhtbDsKKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBleHRyYWN0VGV4dFdpdGhXaGl0ZXNwYWNlCisJICogCisJICogUmV0dXJucyB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgbm9kZS4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGVsZW1zIC0gRE9NIG5vZGVzIHRvIHJldHVybiB0aGUgdGV4dCBmb3IuCisJICovCisJZXh0cmFjdFRleHRXaXRoV2hpdGVzcGFjZTogZnVuY3Rpb24oZWxlbXMpCisJeworCSAgICAvLyBLbm93biBibG9jayBlbGVtZW50cyBmb3IgaGFuZGxpbmcgbGluZWZlZWRzIChsaXN0IGlzIG5vdCBjb21wbGV0ZSkKKwkJdmFyIGJsb2NrcyA9IFsnQkxPQ0tRVU9URScsICdESVYnLCAnSDEnLCAnSDInLCAnSDMnLCAnSDQnLCAnSDUnLCAnSDYnLCAnT0wnLCAnUCcsICdQUkUnLCAnVEFCTEUnLCAnVUwnXTsKKwkJdmFyIHJldCA9IFtdOworCQkKKwkJZnVuY3Rpb24gZG9FeHRyYWN0KGVsdHMpCisJCXsKKwkJCS8vIFNpbmdsZSBicmVhayBzaG91bGQgYmUgaWdub3JlZAorCQkJaWYgKGVsdHMubGVuZ3RoID09IDEgJiYgKGVsdHNbMF0ubm9kZU5hbWUgPT0gJ0JSJyB8fAorCQkJCWVsdHNbMF0uaW5uZXJIVE1MID09ICdcbicpKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbHRzLmxlbmd0aDsgaSsrKQorCQkgICAgeworCQkgICAgICAgIHZhciBlbGVtID0gZWx0c1tpXTsKKworCQkJCS8vIERJViB3aXRoIGEgYnIgb3IgbGluZWZlZWQgZm9yY2VzIGEgbGluZWZlZWQKKwkJCQlpZiAoZWxlbS5ub2RlTmFtZSA9PSAnQlInIHx8IGVsZW0uaW5uZXJIVE1MID09ICdcbicgfHwKKwkJCQkJKChlbHRzLmxlbmd0aCA9PSAxIHx8IGkgPT0gMCkgJiYgKGVsZW0ubm9kZU5hbWUgPT0gJ0RJVicgJiYKKwkJCQkJZWxlbS5pbm5lckhUTUwudG9Mb3dlckNhc2UoKSA9PSAnPGJyPicpKSkKKwkJICAgIAl7CisJICAgIAkJCXJldC5wdXNoKCdcbicpOworCQkgICAgCX0KKwkJCQllbHNlCisJCQkJeworCQkJICAgICAgICBpZiAoZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA0KQorCQkJICAgICAgICB7CisJCQkgICAgICAgIAlpZiAoZWxlbS5ub2RlVmFsdWUubGVuZ3RoID4gMCkKKwkJCSAgICAgICAgCXsKKwkJCSAgICAgICAgCQlyZXQucHVzaChlbGVtLm5vZGVWYWx1ZSk7CisJCQkgICAgICAgIAl9CisJCQkgICAgICAgIH0KKwkJCSAgICAgICAgZWxzZSBpZiAoZWxlbS5ub2RlVHlwZSAhPT0gOCAmJiBlbGVtLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkKKwkJCQkJeworCQkJCQkJZG9FeHRyYWN0KGVsZW0uY2hpbGROb2Rlcyk7CisJCQkJCX0KKwkJCSAgICAgICAgCisJICAgICAgICAJCWlmIChpIDwgZWx0cy5sZW5ndGggLSAxICYmIG14VXRpbHMuaW5kZXhPZihibG9ja3MsIGVsdHNbaSArIDFdLm5vZGVOYW1lKSA+PSAwKQorCSAgICAgICAgCQl7CisJICAgICAgICAJCQlyZXQucHVzaCgnXG4nKTsJCQorCSAgICAgICAgCQl9CisJCQkJfQorCQkgICAgfQorCQl9OworCQkKKwkJZG9FeHRyYWN0KGVsZW1zKTsKKwkgICAgCisJICAgIHJldHVybiByZXQuam9pbignJyk7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiByZXBsYWNlVHJhaWxpbmdOZXdsaW5lcworCSAqIAorCSAqIFJlcGxhY2VzIGVhY2ggdHJhaWxpbmcgbmV3bGluZSB3aXRoIHRoZSBnaXZlbiBwYXR0ZXJuLgorCSAqLworCXJlcGxhY2VUcmFpbGluZ05ld2xpbmVzOiBmdW5jdGlvbihzdHIsIHBhdHRlcm4pCisJeworCQkvLyBMQVRFUjogQ2hlY2sgaXMgdGhpcyBjYW4gYmUgZG9uZSB3aXRoIGEgcmVndWxhciBleHByZXNzaW9uCisJCXZhciBwb3N0Zml4ID0gJyc7CisJCQorCQl3aGlsZSAoc3RyLmxlbmd0aCA+IDAgJiYgc3RyLmNoYXJBdChzdHIubGVuZ3RoIC0gMSkgPT0gJ1xuJykKKwkJeworCQkJc3RyID0gc3RyLnN1YnN0cmluZygwLCBzdHIubGVuZ3RoIC0gMSk7CisJCQlwb3N0Zml4ICs9IHBhdHRlcm47CisJCX0KKwkJCisJCXJldHVybiBzdHIgKyBwb3N0Zml4OworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0VGV4dENvbnRlbnQKKwkgKiAKKwkgKiBSZXR1cm5zIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBub2RlLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogbm9kZSAtIERPTSBub2RlIHRvIHJldHVybiB0aGUgdGV4dCBjb250ZW50IGZvci4KKwkgKi8KKwlnZXRUZXh0Q29udGVudDogZnVuY3Rpb24obm9kZSkKKwl7CisJCWlmIChub2RlLmlubmVyVGV4dCAhPT0gdW5kZWZpbmVkKQorCQl7CisJCQlyZXR1cm4gbm9kZS5pbm5lclRleHQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gKG5vZGUgIT0gbnVsbCkgPyBub2RlWyhub2RlLnRleHRDb250ZW50ID09PSB1bmRlZmluZWQpID8gJ3RleHQnIDogJ3RleHRDb250ZW50J10gOiAnJzsKKwkJfQorCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IHNldFRleHRDb250ZW50CisJICogCisJICogU2V0cyB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgbm9kZS4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIG5vZGUgLSBET00gbm9kZSB0byBzZXQgdGhlIHRleHQgY29udGVudCBmb3IuCisJICogdGV4dCAtIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHRleHQgY29udGVudC4KKwkgKi8KKwlzZXRUZXh0Q29udGVudDogZnVuY3Rpb24obm9kZSwgdGV4dCkKKwl7CisJCWlmIChub2RlLmlubmVyVGV4dCAhPT0gdW5kZWZpbmVkKQorCQl7CisJCQlub2RlLmlubmVyVGV4dCA9IHRleHQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQlub2RlWyhub2RlLnRleHRDb250ZW50ID09PSB1bmRlZmluZWQpID8gJ3RleHQnIDogJ3RleHRDb250ZW50J10gPSB0ZXh0OworCQl9CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0SW5uZXJIdG1sCisJICogCisJICogUmV0dXJucyB0aGUgaW5uZXIgSFRNTCBmb3IgdGhlIGdpdmVuIG5vZGUgYXMgYSBzdHJpbmcgb3IgYW4gZW1wdHkgc3RyaW5nCisJICogaWYgbm8gbm9kZSB3YXMgc3BlY2lmaWVkLiBUaGUgaW5uZXIgSFRNTCBpcyB0aGUgdGV4dCByZXByZXNlbnRpbmcgYWxsCisJICogY2hpbGRyZW4gb2YgdGhlIG5vZGUsIGJ1dCBub3QgdGhlIG5vZGUgaXRzZWxmLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogbm9kZSAtIERPTSBub2RlIHRvIHJldHVybiB0aGUgaW5uZXIgSFRNTCBmb3IuCisJICovCisJZ2V0SW5uZXJIdG1sOiBmdW5jdGlvbigpCisJeworCQlpZiAobXhDbGllbnQuSVNfSUUpCisJCXsKKwkJCXJldHVybiBmdW5jdGlvbihub2RlKQorCQkJeworCQkJCWlmIChub2RlICE9IG51bGwpCisJCQkJeworCQkJCQlyZXR1cm4gbm9kZS5pbm5lckhUTUw7CisJCQkJfQorCQkJCQorCQkJCXJldHVybiAnJzsKKwkJCX07CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXR1cm4gZnVuY3Rpb24obm9kZSkKKwkJCXsKKwkJCQlpZiAobm9kZSAhPSBudWxsKQorCQkJCXsKKwkJCQkJdmFyIHNlcmlhbGl6ZXIgPSBuZXcgWE1MU2VyaWFsaXplcigpOworCQkJCQlyZXR1cm4gc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyhub2RlKTsKKwkJCQl9CisJCQkJCisJCQkJcmV0dXJuICcnOworCQkJfTsKKwkJfQorCX0oKSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBnZXRPdXRlckh0bWwKKwkgKiAKKwkgKiBSZXR1cm5zIHRoZSBvdXRlciBIVE1MIGZvciB0aGUgZ2l2ZW4gbm9kZSBhcyBhIHN0cmluZyBvciBhbiBlbXB0eQorCSAqIHN0cmluZyBpZiBubyBub2RlIHdhcyBzcGVjaWZpZWQuIFRoZSBvdXRlciBIVE1MIGlzIHRoZSB0ZXh0IHJlcHJlc2VudGluZworCSAqIGFsbCBjaGlsZHJlbiBvZiB0aGUgbm9kZSBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogbm9kZSAtIERPTSBub2RlIHRvIHJldHVybiB0aGUgb3V0ZXIgSFRNTCBmb3IuCisJICovCisJZ2V0T3V0ZXJIdG1sOiBmdW5jdGlvbigpCisJeworCQlpZiAobXhDbGllbnQuSVNfSUUpCisJCXsKKwkJCXJldHVybiBmdW5jdGlvbihub2RlKQorCQkJeworCQkJCWlmIChub2RlICE9IG51bGwpCisJCQkJeworCQkJCQlpZiAobm9kZS5vdXRlckhUTUwgIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJcmV0dXJuIG5vZGUub3V0ZXJIVE1MOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJdmFyIHRtcCA9IFtdOworCQkJCQkJdG1wLnB1c2goJzwnK25vZGUubm9kZU5hbWUpOworCQkJCQkJCisJCQkJCQl2YXIgYXR0cnMgPSBub2RlLmF0dHJpYnV0ZXM7CisJCQkJCQkKKwkJCQkJCWlmIChhdHRycyAhPSBudWxsKQorCQkJCQkJeworCQkJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspCisJCQkJCQkJeworCQkJCQkJCQl2YXIgdmFsdWUgPSBhdHRyc1tpXS52YWx1ZTsKKwkJCQkJCQkJCisJCQkJCQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCA+IDApCisJCQkJCQkJCXsKKwkJCQkJCQkJCXRtcC5wdXNoKCcgJyk7CisJCQkJCQkJCQl0bXAucHVzaChhdHRyc1tpXS5ub2RlTmFtZSk7CisJCQkJCQkJCQl0bXAucHVzaCgnPSInKTsKKwkJCQkJCQkJCXRtcC5wdXNoKHZhbHVlKTsKKwkJCQkJCQkJCXRtcC5wdXNoKCciJyk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWlmIChub2RlLmlubmVySFRNTC5sZW5ndGggPT0gMCkKKwkJCQkJCXsKKwkJCQkJCQl0bXAucHVzaCgnLz4nKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQl0bXAucHVzaCgnPicpOworCQkJCQkJCXRtcC5wdXNoKG5vZGUuaW5uZXJIVE1MKTsKKwkJCQkJCQl0bXAucHVzaCgnPC8nK25vZGUubm9kZU5hbWUrJz4nKTsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJcmV0dXJuIHRtcC5qb2luKCcnKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQlyZXR1cm4gJyc7CisJCQl9OworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuIGZ1bmN0aW9uKG5vZGUpCisJCQl7CisJCQkJaWYgKG5vZGUgIT0gbnVsbCkKKwkJCQl7CisJCQkJCXZhciBzZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKTsKKwkJCQkJcmV0dXJuIHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcobm9kZSk7CisJCQkJfQorCQkJCQorCQkJCXJldHVybiAnJzsKKwkJCX07CisJCX0KKwl9KCksCisJCisJLyoqCisJICogRnVuY3Rpb246IHdyaXRlCisJICogCisJICogQ3JlYXRlcyBhIHRleHQgbm9kZSBmb3IgdGhlIGdpdmVuIHN0cmluZyBhbmQgYXBwZW5kcyBpdCB0byB0aGUgZ2l2ZW4KKwkgKiBwYXJlbnQuIFJldHVybnMgdGhlIHRleHQgbm9kZS4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIHBhcmVudCAtIERPTSBub2RlIHRvIGFwcGVuZCB0aGUgdGV4dCBub2RlIHRvLgorCSAqIHRleHQgLSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IHRvIGJlIGFkZGVkLgorCSAqLworCXdyaXRlOiBmdW5jdGlvbihwYXJlbnQsIHRleHQpCisJeworCQl2YXIgZG9jID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7CisJCXZhciBub2RlID0gZG9jLmNyZWF0ZVRleHROb2RlKHRleHQpOworCQkKKwkJaWYgKHBhcmVudCAhPSBudWxsKQorCQl7CisJCQlwYXJlbnQuYXBwZW5kQ2hpbGQobm9kZSk7CisJCX0KKwkJCisJCXJldHVybiBub2RlOworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IHdyaXRlbG4KKwkgKiAKKwkgKiBDcmVhdGVzIGEgdGV4dCBub2RlIGZvciB0aGUgZ2l2ZW4gc3RyaW5nIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBnaXZlbgorCSAqIHBhcmVudCB3aXRoIGFuIGFkZGl0aW9uYWwgbGluZWZlZWQuIFJldHVybnMgdGhlIHRleHQgbm9kZS4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIHBhcmVudCAtIERPTSBub2RlIHRvIGFwcGVuZCB0aGUgdGV4dCBub2RlIHRvLgorCSAqIHRleHQgLSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IHRvIGJlIGFkZGVkLgorCSAqLworCXdyaXRlbG46IGZ1bmN0aW9uKHBhcmVudCwgdGV4dCkKKwl7CisJCXZhciBkb2MgPSBwYXJlbnQub3duZXJEb2N1bWVudDsKKwkJdmFyIG5vZGUgPSBkb2MuY3JlYXRlVGV4dE5vZGUodGV4dCk7CisJCQorCQlpZiAocGFyZW50ICE9IG51bGwpCisJCXsKKwkJCXBhcmVudC5hcHBlbmRDaGlsZChub2RlKTsKKwkJCXBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsKKwkJfQorCQkKKwkJcmV0dXJuIG5vZGU7CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogYnIKKwkgKiAKKwkgKiBBcHBlbmRzIGEgbGluZWJyZWFrIHRvIHRoZSBnaXZlbiBwYXJlbnQgYW5kIHJldHVybnMgdGhlIGxpbmVicmVhay4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIHBhcmVudCAtIERPTSBub2RlIHRvIGFwcGVuZCB0aGUgbGluZWJyZWFrIHRvLgorCSAqLworCWJyOiBmdW5jdGlvbihwYXJlbnQsIGNvdW50KQorCXsKKwkJY291bnQgPSBjb3VudCB8fCAxOworCQl2YXIgYnIgPSBudWxsOworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQl7CisJCQlpZiAocGFyZW50ICE9IG51bGwpCisJCQl7CisJCQkJYnIgPSBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpOworCQkJCXBhcmVudC5hcHBlbmRDaGlsZChicik7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBicjsKKwl9LAorCQkKKwkvKioKKwkgKiBGdW5jdGlvbjogYnV0dG9uCisJICogCisJICogUmV0dXJucyBhIG5ldyBidXR0b24gd2l0aCB0aGUgZ2l2ZW4gbGV2ZWwgYW5kIGZ1bmN0aW9uIGFzIGFuIG9uY2xpY2sKKwkgKiBldmVudCBoYW5kbGVyLgorCSAqIAorCSAqIChjb2RlKQorCSAqIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobXhVdGlscy5idXR0b24oJ1Rlc3QnLCBmdW5jdGlvbihldnQpCisJICogeworCSAqICAgYWxlcnQoJ0hlbGxvLCBXb3JsZCEnKTsKKwkgKiB9KSk7CisJICogKGVuZCkKKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGxhYmVsIC0gU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgbGFiZWwgb2YgdGhlIGJ1dHRvbi4KKwkgKiBmdW5jdCAtIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBpZiB0aGUgYnV0dG9uIGlzIHByZXNzZWQuCisJICogZG9jIC0gT3B0aW9uYWwgZG9jdW1lbnQgdG8gYmUgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGJ1dHRvbi4gRGVmYXVsdCBpcyB0aGUKKwkgKiBjdXJyZW50IGRvY3VtZW50LgorCSAqLworCWJ1dHRvbjogZnVuY3Rpb24obGFiZWwsIGZ1bmN0LCBkb2MpCisJeworCQlkb2MgPSAoZG9jICE9IG51bGwpID8gZG9jIDogZG9jdW1lbnQ7CisJCQorCQl2YXIgYnV0dG9uID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOworCQlteFV0aWxzLndyaXRlKGJ1dHRvbiwgbGFiZWwpOworCisJCW14RXZlbnQuYWRkTGlzdGVuZXIoYnV0dG9uLCAnY2xpY2snLCBmdW5jdGlvbihldnQpCisJCXsKKwkJCWZ1bmN0KGV2dCk7CisJCX0pOworCQkKKwkJcmV0dXJuIGJ1dHRvbjsKKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBwYXJhCisJICogCisJICogQXBwZW5kcyBhIG5ldyBwYXJhZ3JhcGggd2l0aCB0aGUgZ2l2ZW4gdGV4dCB0byB0aGUgc3BlY2lmaWVkIHBhcmVudCBhbmQKKwkgKiByZXR1cm5zIHRoZSBwYXJhZ3JhcGguCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBwYXJlbnQgLSBET00gbm9kZSB0byBhcHBlbmQgdGhlIHRleHQgbm9kZSB0by4KKwkgKiB0ZXh0IC0gU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGV4dCBmb3IgdGhlIG5ldyBwYXJhZ3JhcGguCisJICovCisJcGFyYTogZnVuY3Rpb24ocGFyZW50LCB0ZXh0KQorCXsKKwkJdmFyIHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7CisJCW14VXRpbHMud3JpdGUocCwgdGV4dCk7CisKKwkJaWYgKHBhcmVudCAhPSBudWxsKQorCQl7CisJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocCk7CisJCX0KKwkJCisJCXJldHVybiBwOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogYWRkVHJhbnNwYXJlbnRCYWNrZ3JvdW5kRmlsdGVyCisJICogCisJICogQWRkcyBhIHRyYW5zcGFyZW50IGJhY2tncm91bmQgdG8gdGhlIGZpbHRlciBvZiB0aGUgZ2l2ZW4gbm9kZS4gVGhpcworCSAqIGJhY2tncm91bmQgY2FuIGJlIHVzZWQgaW4gSUU4IHN0YW5kYXJkcyBtb2RlIChuYXRpdmUgSUU4IG9ubHkpIHRvIHBhc3MKKwkgKiBldmVudHMgdGhyb3VnaCB0aGUgbm9kZS4KKwkgKi8KKwlhZGRUcmFuc3BhcmVudEJhY2tncm91bmRGaWx0ZXI6IGZ1bmN0aW9uKG5vZGUpCisJeworCQlub2RlLnN0eWxlLmZpbHRlciArPSAncHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkFscGhhSW1hZ2VMb2FkZXIoc3JjPVwnJyArCisJCQlteENsaWVudC5pbWFnZUJhc2VQYXRoICsgJy90cmFuc3BhcmVudC5naWZcJywgc2l6aW5nTWV0aG9kPVwnc2NhbGVcJyknOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogbGlua0FjdGlvbgorCSAqIAorCSAqIEFkZHMgYSBoeXBlcmxpbmsgdG8gdGhlIHNwZWNpZmllZCBwYXJlbnQgdGhhdCBpbnZva2VzIGFjdGlvbiBvbiB0aGUKKwkgKiBzcGVjaWZpZWQgZWRpdG9yLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogcGFyZW50IC0gRE9NIG5vZGUgdG8gY29udGFpbiB0aGUgbmV3IGxpbmsuCisJICogdGV4dCAtIFN0cmluZyB0aGF0IGlzIHVzZWQgYXMgdGhlIGxpbmsgbGFiZWwuCisJICogZWRpdG9yIC0gPG14RWRpdG9yPiB0aGF0IHdpbGwgZXhlY3V0ZSB0aGUgYWN0aW9uLgorCSAqIGFjdGlvbiAtIFN0cmluZyB0aGF0IGRlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZC4KKwkgKiBwYWQgLSBPcHRpb25hbCBsZWZ0LXBhZGRpbmcgZm9yIHRoZSBsaW5rLiBEZWZhdWx0IGlzIDAuCisJICovCisJbGlua0FjdGlvbjogZnVuY3Rpb24ocGFyZW50LCB0ZXh0LCBlZGl0b3IsIGFjdGlvbiwgcGFkKQorCXsKKwkJcmV0dXJuIG14VXRpbHMubGluayhwYXJlbnQsIHRleHQsIGZ1bmN0aW9uKCkKKwkJeworCQkJZWRpdG9yLmV4ZWN1dGUoYWN0aW9uKTsKKwkJfSwgcGFkKTsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGxpbmtJbnZva2UKKwkgKiAKKwkgKiBBZGRzIGEgaHlwZXJsaW5rIHRvIHRoZSBzcGVjaWZpZWQgcGFyZW50IHRoYXQgaW52b2tlcyB0aGUgc3BlY2lmaWVkCisJICogZnVuY3Rpb24gb24gdGhlIGVkaXRvciBwYXNzaW5nIGFsb25nIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQuIFRoZQorCSAqIGZ1bmN0aW9uIG5hbWUgaXMgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiBvZiB0aGUgZWRpdG9yIGluc3RhbmNlLAorCSAqIG5vdCBhbiBhY3Rpb24gbmFtZS4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIHBhcmVudCAtIERPTSBub2RlIHRvIGNvbnRhaW4gdGhlIG5ldyBsaW5rLgorCSAqIHRleHQgLSBTdHJpbmcgdGhhdCBpcyB1c2VkIGFzIHRoZSBsaW5rIGxhYmVsLgorCSAqIGVkaXRvciAtIDxteEVkaXRvcj4gaW5zdGFuY2UgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24gb24uCisJICogZnVuY3ROYW1lIC0gU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uCisJICogYXJnIC0gT2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9uLgorCSAqIHBhZCAtIE9wdGlvbmFsIGxlZnQtcGFkZGluZyBmb3IgdGhlIGxpbmsuIERlZmF1bHQgaXMgMC4KKwkgKi8KKwlsaW5rSW52b2tlOiBmdW5jdGlvbihwYXJlbnQsIHRleHQsIGVkaXRvciwgZnVuY3ROYW1lLCBhcmcsIHBhZCkKKwl7CisJCXJldHVybiBteFV0aWxzLmxpbmsocGFyZW50LCB0ZXh0LCBmdW5jdGlvbigpCisJCXsKKwkJCWVkaXRvcltmdW5jdE5hbWVdKGFyZyk7CisJCX0sIHBhZCk7CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogbGluaworCSAqIAorCSAqIEFkZHMgYSBoeXBlcmxpbmsgdG8gdGhlIHNwZWNpZmllZCBwYXJlbnQgYW5kIGludm9rZXMgdGhlIGdpdmVuIGZ1bmN0aW9uCisJICogd2hlbiB0aGUgbGluayBpcyBjbGlja2VkLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogcGFyZW50IC0gRE9NIG5vZGUgdG8gY29udGFpbiB0aGUgbmV3IGxpbmsuCisJICogdGV4dCAtIFN0cmluZyB0aGF0IGlzIHVzZWQgYXMgdGhlIGxpbmsgbGFiZWwuCisJICogZnVuY3QgLSBGdW5jdGlvbiB0byBleGVjdXRlIHdoZW4gdGhlIGxpbmsgaXMgY2xpY2tlZC4KKwkgKiBwYWQgLSBPcHRpb25hbCBsZWZ0LXBhZGRpbmcgZm9yIHRoZSBsaW5rLiBEZWZhdWx0IGlzIDAuCisJICovCisJbGluazogZnVuY3Rpb24ocGFyZW50LCB0ZXh0LCBmdW5jdCwgcGFkKQorCXsKKwkJdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CisJCQorCQlhLnN0eWxlLmNvbG9yID0gJ2JsdWUnOworCQlhLnN0eWxlLnRleHREZWNvcmF0aW9uID0gJ3VuZGVybGluZSc7CisJCWEuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOworCQkKKwkJaWYgKHBhZCAhPSBudWxsKQorCQl7CisJCQlhLnN0eWxlLnBhZGRpbmdMZWZ0ID0gcGFkKydweCc7CisJCX0KKwkJCisJCW14RXZlbnQuYWRkTGlzdGVuZXIoYSwgJ2NsaWNrJywgZnVuY3QpOworCQlteFV0aWxzLndyaXRlKGEsIHRleHQpOworCQkKKwkJaWYgKHBhcmVudCAhPSBudWxsKQorCQl7CisJCQlwYXJlbnQuYXBwZW5kQ2hpbGQoYSk7CisJCX0KKwkJCisJCXJldHVybiBhOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZml0CisJICogCisJICogTWFrZXMgc3VyZSB0aGUgZ2l2ZW4gbm9kZSBpcyBpbnNpZGUgdGhlIHZpc2libGUgYXJlYSBvZiB0aGUgd2luZG93LiBUaGlzCisJICogaXMgZG9uZSBieSBzZXR0aW5nIHRoZSBsZWZ0IGFuZCB0b3AgaW4gdGhlIHN0eWxlLiAKKwkgKi8KKwlmaXQ6IGZ1bmN0aW9uKG5vZGUpCisJeworCQl2YXIgbGVmdCA9IHBhcnNlSW50KG5vZGUub2Zmc2V0TGVmdCk7CisJCXZhciB3aWR0aCA9IHBhcnNlSW50KG5vZGUub2Zmc2V0V2lkdGgpOworCQkJCisJCXZhciBvZmZzZXQgPSBteFV0aWxzLmdldERvY3VtZW50U2Nyb2xsT3JpZ2luKG5vZGUub3duZXJEb2N1bWVudCk7CisJCXZhciBzbCA9IG9mZnNldC54OworCQl2YXIgc3QgPSBvZmZzZXQueTsKKworCQl2YXIgYiA9IGRvY3VtZW50LmJvZHk7CisJCXZhciBkID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OworCQl2YXIgcmlnaHQgPSAoc2wpICsgKGIuY2xpZW50V2lkdGggfHwgZC5jbGllbnRXaWR0aCk7CisJCQorCQlpZiAobGVmdCArIHdpZHRoID4gcmlnaHQpCisJCXsKKwkJCW5vZGUuc3R5bGUubGVmdCA9IE1hdGgubWF4KHNsLCByaWdodCAtIHdpZHRoKSArICdweCc7CisJCX0KKwkJCisJCXZhciB0b3AgPSBwYXJzZUludChub2RlLm9mZnNldFRvcCk7CisJCXZhciBoZWlnaHQgPSBwYXJzZUludChub2RlLm9mZnNldEhlaWdodCk7CisJCQorCQl2YXIgYm90dG9tID0gc3QgKyBNYXRoLm1heChiLmNsaWVudEhlaWdodCB8fCAwLCBkLmNsaWVudEhlaWdodCk7CisJCQorCQlpZiAodG9wICsgaGVpZ2h0ID4gYm90dG9tKQorCQl7CisJCQlub2RlLnN0eWxlLnRvcCA9IE1hdGgubWF4KHN0LCBib3R0b20gLSBoZWlnaHQpICsgJ3B4JzsKKwkJfQorCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogbG9hZAorCSAqIAorCSAqIExvYWRzIHRoZSBzcGVjaWZpZWQgVVJMICpzeW5jaHJvbm91c2x5KiBhbmQgcmV0dXJucyB0aGUgPG14WG1sUmVxdWVzdD4uCisJICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmlsZSBjYW5ub3QgYmUgbG9hZGVkLiBTZWUgPG14VXRpbHMuZ2V0PiBmb3IKKwkgKiBhbiBhc3luY2hyb25vdXMgaW1wbGVtZW50YXRpb24uCisJICoKKwkgKiBFeGFtcGxlOgorCSAqIAorCSAqIChjb2RlKQorCSAqIHRyeQorCSAqIHsKKwkgKiAgIHZhciByZXEgPSBteFV0aWxzLmxvYWQoZmlsZW5hbWUpOworCSAqICAgdmFyIHJvb3QgPSByZXEuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisJICogICAvLyBQcm9jZXNzIFhNTCBET00uLi4KKwkgKiB9CisJICogY2F0Y2ggKGV4KQorCSAqIHsKKwkgKiAgIG14VXRpbHMuYWxlcnQoJ0Nhbm5vdCBsb2FkICcrZmlsZW5hbWUrJzogJytleCk7CisJICogfQorCSAqIChlbmQpCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiB1cmwgLSBVUkwgdG8gZ2V0IHRoZSBkYXRhIGZyb20uCisJICovCisJbG9hZDogZnVuY3Rpb24odXJsKQorCXsKKwkJdmFyIHJlcSA9IG5ldyBteFhtbFJlcXVlc3QodXJsLCBudWxsLCAnR0VUJywgZmFsc2UpOworCQlyZXEuc2VuZCgpOworCQkKKwkJcmV0dXJuIHJlcTsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGdldAorCSAqIAorCSAqIExvYWRzIHRoZSBzcGVjaWZpZWQgVVJMICphc3luY2hyb25vdXNseSogYW5kIGludm9rZXMgdGhlIGdpdmVuIGZ1bmN0aW9ucworCSAqIGRlcGVuZGluZyBvbiB0aGUgcmVxdWVzdCBzdGF0dXMuIFJldHVybnMgdGhlIDxteFhtbFJlcXVlc3Q+IGluIHVzZS4gQm90aAorCSAqIGZ1bmN0aW9ucyB0YWtlIHRoZSA8bXhYbWxSZXF1ZXN0PiBhcyB0aGUgb25seSBwYXJhbWV0ZXIuIFNlZQorCSAqIDxteFV0aWxzLmxvYWQ+IGZvciBhIHN5bmNocm9ub3VzIGltcGxlbWVudGF0aW9uLgorCSAqCisJICogRXhhbXBsZToKKwkgKiAKKwkgKiAoY29kZSkKKwkgKiBteFV0aWxzLmdldCh1cmwsIGZ1bmN0aW9uKHJlcSkKKwkgKiB7CisJICogICAgdmFyIG5vZGUgPSByZXEuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisJICogICAgLy8gUHJvY2VzcyBYTUwgRE9NLi4uCisJICogfSk7CisJICogKGVuZCkKKwkgKiAKKwkgKiBTbyBmb3IgZXhhbXBsZSwgdG8gbG9hZCBhIGRpYWdyYW0gaW50byBhbiBleGlzdGluZyBncmFwaCBtb2RlbCwgdGhlCisJICogZm9sbG93aW5nIGNvZGUgaXMgdXNlZC4KKwkgKiAKKwkgKiAoY29kZSkKKwkgKiBteFV0aWxzLmdldCh1cmwsIGZ1bmN0aW9uKHJlcSkKKwkgKiB7CisJICogICB2YXIgbm9kZSA9IHJlcS5nZXREb2N1bWVudEVsZW1lbnQoKTsKKwkgKiAgIHZhciBkZWMgPSBuZXcgbXhDb2RlYyhub2RlLm93bmVyRG9jdW1lbnQpOworCSAqICAgZGVjLmRlY29kZShub2RlLCBncmFwaC5nZXRNb2RlbCgpKTsKKwkgKiB9KTsKKwkgKiAoZW5kKQorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogdXJsIC0gVVJMIHRvIGdldCB0aGUgZGF0YSBmcm9tLgorCSAqIG9ubG9hZCAtIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZm9yIGEgc3VjY2Vzc2Z1bCByZXNwb25zZS4KKwkgKiBvbmVycm9yIC0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gZXhlY3V0ZSBvbiBlcnJvci4KKwkgKiBiaW5hcnkgLSBPcHRpb25hbCBib29sZWFuIHBhcmFtZXRlciB0aGF0IHNwZWNpZmllcyBpZiB0aGUgcmVxdWVzdCBpcworCSAqIGJpbmFyeS4KKwkgKiB0aW1lb3V0IC0gT3B0aW9uYWwgdGltZW91dCBpbiBtcyBiZWZvcmUgY2FsbGluZyBvbnRpbWVvdXQuCisJICogb250aW1lb3V0IC0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gZXhlY3V0ZSBvbiB0aW1lb3V0LgorCSAqLworCWdldDogZnVuY3Rpb24odXJsLCBvbmxvYWQsIG9uZXJyb3IsIGJpbmFyeSwgdGltZW91dCwgb250aW1lb3V0KQorCXsKKwkJdmFyIHJlcSA9IG5ldyBteFhtbFJlcXVlc3QodXJsLCBudWxsLCAnR0VUJyk7CisJCQorCQlpZiAoYmluYXJ5ICE9IG51bGwpCisJCXsKKwkJCXJlcS5zZXRCaW5hcnkoYmluYXJ5KTsKKwkJfQorCQkKKwkJcmVxLnNlbmQob25sb2FkLCBvbmVycm9yLCB0aW1lb3V0LCBvbnRpbWVvdXQpOworCQkKKwkJcmV0dXJuIHJlcTsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGdldEFsbAorCSAqIAorCSAqIExvYWRzIHRoZSBVUkxzIGluIHRoZSBnaXZlbiBhcnJheSAqYXN5bmNocm9ub3VzbHkqIGFuZCBpbnZva2VzIHRoZSBnaXZlbiBmdW5jdGlvbgorCSAqIGlmIGFsbCByZXF1ZXN0cyByZXR1cm5lZCB3aXRoIGEgdmFsaWQgMnh4IHN0YXR1cy4gVGhlIGVycm9yIGhhbmRsZXIgaXMgaW52b2tlZAorCSAqIG9uY2Ugb24gdGhlIGZpcnN0IGVycm9yIG9yIGludmFsaWQgcmVzcG9uc2UuCisJICoKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIHVybHMgLSBBcnJheSBvZiBVUkxzIHRvIGJlIGxvYWRlZC4KKwkgKiBvbmxvYWQgLSBDYWxsYmFjayB3aXRoIGFycmF5IG9mIDxteFhtbFJlcXVlc3RzPi4KKwkgKiBvbmVycm9yIC0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gZXhlY3V0ZSBvbiBlcnJvci4KKwkgKi8KKwlnZXRBbGw6IGZ1bmN0aW9uKHVybHMsIG9ubG9hZCwgb25lcnJvcikKKwl7CisJCXZhciByZW1haW4gPSB1cmxzLmxlbmd0aDsKKwkJdmFyIHJlc3VsdCA9IFtdOworCQl2YXIgZXJyb3JzID0gMDsKKwkJdmFyIGVyciA9IGZ1bmN0aW9uKCkKKwkJeworCQkJaWYgKGVycm9ycyA9PSAwICYmIG9uZXJyb3IgIT0gbnVsbCkKKwkJCXsKKwkJCQlvbmVycm9yKCk7CisJCQl9CisKKwkJCWVycm9ycysrOworCQl9OworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKQorCQl7CisJCQkoZnVuY3Rpb24odXJsLCBpbmRleCkKKwkJCXsKKwkJCQlteFV0aWxzLmdldCh1cmwsIGZ1bmN0aW9uKHJlcSkKKwkJCQl7CisJCQkJCXZhciBzdGF0dXMgPSByZXEuZ2V0U3RhdHVzKCk7CisJCQkJCQorCQkJCQlpZiAoc3RhdHVzIDwgMjAwIHx8IHN0YXR1cyA+IDI5OSkKKwkJCQkJeworCQkJCQkJZXJyKCk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlyZXN1bHRbaW5kZXhdID0gcmVxOworCQkJCQkJcmVtYWluLS07CisJCQkJCQkKKwkJCQkJCWlmIChyZW1haW4gPT0gMCkKKwkJCQkJCXsKKwkJCQkJCQlvbmxvYWQocmVzdWx0KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0sIGVycik7CisJCQl9KSh1cmxzW2ldLCBpKTsKKwkJfQorCQkKKwkJaWYgKHJlbWFpbiA9PSAwKQorCQl7CisJCQlvbmxvYWQocmVzdWx0KTsJCQkKKwkJfQorCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IHBvc3QKKwkgKiAKKwkgKiBQb3N0cyB0aGUgc3BlY2lmaWVkIHBhcmFtcyB0byB0aGUgZ2l2ZW4gVVJMICphc3luY2hyb25vdXNseSogYW5kIGludm9rZXMKKwkgKiB0aGUgZ2l2ZW4gZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgcmVxdWVzdCBzdGF0dXMuIFJldHVybnMgdGhlCisJICogPG14WG1sUmVxdWVzdD4gaW4gdXNlLiBCb3RoIGZ1bmN0aW9ucyB0YWtlIHRoZSA8bXhYbWxSZXF1ZXN0PiBhcyB0aGUKKwkgKiBvbmx5IHBhcmFtZXRlci4gTWFrZSBzdXJlIHRvIHVzZSBlbmNvZGVVUklDb21wb25lbnQgZm9yIHRoZSBwYXJhbWV0ZXIKKwkgKiB2YWx1ZXMuCisJICoKKwkgKiBFeGFtcGxlOgorCSAqIAorCSAqIChjb2RlKQorCSAqIG14VXRpbHMucG9zdCh1cmwsICdrZXk9dmFsdWUnLCBmdW5jdGlvbihyZXEpCisJICogeworCSAqIAlteFV0aWxzLmFsZXJ0KCdSZWFkeTogJytyZXEuaXNSZWFkeSgpKycgU3RhdHVzOiAnK3JlcS5nZXRTdGF0dXMoKSk7CisJICogIC8vIFByb2Nlc3MgcmVxLmdldERvY3VtZW50RWxlbWVudCgpIHVzaW5nIERPTSBBUEkgaWYgT0suLi4KKwkgKiB9KTsKKwkgKiAoZW5kKQorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogdXJsIC0gVVJMIHRvIGdldCB0aGUgZGF0YSBmcm9tLgorCSAqIHBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSBwb3N0IHJlcXVlc3QuCisJICogb25sb2FkIC0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gZXhlY3V0ZSBmb3IgYSBzdWNjZXNzZnVsIHJlc3BvbnNlLgorCSAqIG9uZXJyb3IgLSBPcHRpb25hbCBmdW5jdGlvbiB0byBleGVjdXRlIG9uIGVycm9yLgorCSAqLworCXBvc3Q6IGZ1bmN0aW9uKHVybCwgcGFyYW1zLCBvbmxvYWQsIG9uZXJyb3IpCisJeworCQlyZXR1cm4gbmV3IG14WG1sUmVxdWVzdCh1cmwsIHBhcmFtcykuc2VuZChvbmxvYWQsIG9uZXJyb3IpOworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IHN1Ym1pdAorCSAqIAorCSAqIFN1Ym1pdHMgdGhlIGdpdmVuIHBhcmFtZXRlcnMgdG8gdGhlIHNwZWNpZmllZCBVUkwgdXNpbmcKKwkgKiA8bXhYbWxSZXF1ZXN0LnNpbXVsYXRlPiBhbmQgcmV0dXJucyB0aGUgPG14WG1sUmVxdWVzdD4uCisJICogTWFrZSBzdXJlIHRvIHVzZSBlbmNvZGVVUklDb21wb25lbnQgZm9yIHRoZSBwYXJhbWV0ZXIKKwkgKiB2YWx1ZXMuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiB1cmwgLSBVUkwgdG8gZ2V0IHRoZSBkYXRhIGZyb20uCisJICogcGFyYW1zIC0gUGFyYW1ldGVycyBmb3IgdGhlIGZvcm0uCisJICogZG9jIC0gRG9jdW1lbnQgdG8gY3JlYXRlIHRoZSBmb3JtIGluLgorCSAqIHRhcmdldCAtIFRhcmdldCB0byBzZW5kIHRoZSBmb3JtIHJlc3VsdCB0by4KKwkgKi8KKwlzdWJtaXQ6IGZ1bmN0aW9uKHVybCwgcGFyYW1zLCBkb2MsIHRhcmdldCkKKwl7CisJCXJldHVybiBuZXcgbXhYbWxSZXF1ZXN0KHVybCwgcGFyYW1zKS5zaW11bGF0ZShkb2MsIHRhcmdldCk7CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogbG9hZEludG8KKwkgKiAKKwkgKiBMb2FkcyB0aGUgc3BlY2lmaWVkIFVSTCAqYXN5bmNocm9ub3VzbHkqIGludG8gdGhlIHNwZWNpZmllZCBkb2N1bWVudCwKKwkgKiBpbnZva2luZyBvbmxvYWQgYWZ0ZXIgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGxvYWRlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbgorCSAqIGRvZXMgbm90IHVzZSA8bXhYbWxSZXF1ZXN0PiwgYnV0IHRoZSBkb2N1bWVudC5sb2FkIG1ldGhvZC4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIHVybCAtIFVSTCB0byBnZXQgdGhlIGRhdGEgZnJvbS4KKwkgKiBkb2MgLSBUaGUgZG9jdW1lbnQgdG8gbG9hZCB0aGUgVVJMIGludG8uCisJICogb25sb2FkIC0gRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBVUkwgaGFzIGJlZW4gbG9hZGVkLgorCSAqLworCWxvYWRJbnRvOiBmdW5jdGlvbih1cmwsIGRvYywgb25sb2FkKQorCXsKKwkJaWYgKG14Q2xpZW50LklTX0lFKQorCQl7CisJCQlkb2Mub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkKKwkJCXsKKwkJCQlpZiAoZG9jLnJlYWR5U3RhdGUgPT0gNCkKKwkJCQl7CisJCQkJCW9ubG9hZCgpOworCQkJCX0KKwkJCX07CisJCX0KKwkJZWxzZQorCQl7CisJCQlkb2MuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9ubG9hZCwgZmFsc2UpOworCQl9CisJCQorCQlkb2MubG9hZCh1cmwpOworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IGdldFZhbHVlCisJICogCisJICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIGFzc29jaWF0aXZlIGFycmF5IG9yCisJICogdGhlIGdpdmVuIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHZhbHVlIGlzIG51bGwuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBhcnJheSAtIEFzc29jaWF0aXZlIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUga2V5LgorCSAqIGtleSAtIEtleSB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQuCisJICogZGVmYXVsdFZhbHVlIC0gVmFsdWUgdG8gYmUgcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4KKwkgKiBrZXkgaXMgbnVsbC4KKwkgKi8KKwlnZXRWYWx1ZTogZnVuY3Rpb24oYXJyYXksIGtleSwgZGVmYXVsdFZhbHVlKQorCXsKKwkJdmFyIHZhbHVlID0gKGFycmF5ICE9IG51bGwpID8gYXJyYXlba2V5XSA6IG51bGw7CisKKwkJaWYgKHZhbHVlID09IG51bGwpCisJCXsKKwkJCXZhbHVlID0gZGVmYXVsdFZhbHVlOwkJCQorCQl9CisJCQorCQlyZXR1cm4gdmFsdWU7CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0TnVtYmVyCisJICogCisJICogUmV0dXJucyB0aGUgbnVtZXJpYyB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgZ2l2ZW4gYXNzb2NpYXRpdmUKKwkgKiBhcnJheSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZSAob3IgMCkgaWYgdGhlIHZhbHVlIGlzIG51bGwuIFRoZSB2YWx1ZQorCSAqIGlzIGNvbnZlcnRlZCB0byBhIG51bWVyaWMgdmFsdWUgdXNpbmcgdGhlIE51bWJlciBmdW5jdGlvbi4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGFycmF5IC0gQXNzb2NpYXRpdmUgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBrZXkuCisJICoga2V5IC0gS2V5IHdob3NlIHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZC4KKwkgKiBkZWZhdWx0VmFsdWUgLSBWYWx1ZSB0byBiZSByZXR1cm5lZCBpZiB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbgorCSAqIGtleSBpcyBudWxsLiBEZWZhdWx0IGlzIDAuCisJICovCisJZ2V0TnVtYmVyOiBmdW5jdGlvbihhcnJheSwga2V5LCBkZWZhdWx0VmFsdWUpCisJeworCQl2YXIgdmFsdWUgPSAoYXJyYXkgIT0gbnVsbCkgPyBhcnJheVtrZXldIDogbnVsbDsKKworCQlpZiAodmFsdWUgPT0gbnVsbCkKKwkJeworCQkJdmFsdWUgPSBkZWZhdWx0VmFsdWUgfHwgMDsJCQkKKwkJfQorCQkKKwkJcmV0dXJuIE51bWJlcih2YWx1ZSk7CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0Q29sb3IKKwkgKiAKKwkgKiBSZXR1cm5zIHRoZSBjb2xvciB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgZ2l2ZW4gYXNzb2NpYXRpdmUKKwkgKiBhcnJheSBvciB0aGUgZ2l2ZW4gZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdmFsdWUgaXMgbnVsbC4gSWYgdGhlIHZhbHVlCisJICogaXMgPG14Q29uc3RhbnRzLk5PTkU+IHRoZW4gbnVsbCBpcyByZXR1cm5lZC4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGFycmF5IC0gQXNzb2NpYXRpdmUgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBrZXkuCisJICoga2V5IC0gS2V5IHdob3NlIHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZC4KKwkgKiBkZWZhdWx0VmFsdWUgLSBWYWx1ZSB0byBiZSByZXR1cm5lZCBpZiB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbgorCSAqIGtleSBpcyBudWxsLiBEZWZhdWx0IGlzIG51bGwuCisJICovCisJZ2V0Q29sb3I6IGZ1bmN0aW9uKGFycmF5LCBrZXksIGRlZmF1bHRWYWx1ZSkKKwl7CisJCXZhciB2YWx1ZSA9IChhcnJheSAhPSBudWxsKSA/IGFycmF5W2tleV0gOiBudWxsOworCisJCWlmICh2YWx1ZSA9PSBudWxsKQorCQl7CisJCQl2YWx1ZSA9IGRlZmF1bHRWYWx1ZTsKKwkJfQorCQllbHNlIGlmICh2YWx1ZSA9PSBteENvbnN0YW50cy5OT05FKQorCQl7CisJCQl2YWx1ZSA9IG51bGw7CisJCX0KKwkJCisJCXJldHVybiB2YWx1ZTsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGNsb25lCisJICogCisJICogUmVjdXJzaXZlbHkgY2xvbmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlnbm9yaW5nIGFsbCBmaWVsZG5hbWVzIGluIHRoZQorCSAqIGdpdmVuIGFycmF5IG9mIHRyYW5zaWVudCBmaWVsZHMuIDxteE9iamVjdElkZW50aXR5LkZJRUxEX05BTUU+IGlzIGFsd2F5cworCSAqIGlnbm9yZWQgYnkgdGhpcyBmdW5jdGlvbi4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIG9iaiAtIE9iamVjdCB0byBiZSBjbG9uZWQuCisJICogdHJhbnNpZW50cyAtIE9wdGlvbmFsIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSBmaWVsZG5hbWUgdG8gYmUKKwkgKiBpZ25vcmVkLgorCSAqIHNoYWxsb3cgLSBPcHRpb25hbCBib29sZWFuIGFyZ3VtZW50IHRvIHNwZWNpZnkgaWYgYSBzaGFsbG93IGNsb25lIHNob3VsZAorCSAqIGJlIGNyZWF0ZWQsIHRoYXQgaXMsIG9uZSB3aGVyZSBhbGwgb2JqZWN0IHJlZmVyZW5jZXMgYXJlIG5vdCBjbG9uZWQgb3IsCisJICogaW4gb3RoZXIgd29yZHMsIG9uZSB3aGVyZSBvbmx5IGF0b21pYyAoc3RyaW5ncywgbnVtYmVycykgdmFsdWVzIGFyZQorCSAqIGNsb25lZC4gRGVmYXVsdCBpcyBmYWxzZS4KKwkgKi8KKwljbG9uZTogZnVuY3Rpb24ob2JqLCB0cmFuc2llbnRzLCBzaGFsbG93KQorCXsKKwkJc2hhbGxvdyA9IChzaGFsbG93ICE9IG51bGwpID8gc2hhbGxvdyA6IGZhbHNlOworCQl2YXIgY2xvbmUgPSBudWxsOworCQkKKwkJaWYgKG9iaiAhPSBudWxsICYmIHR5cGVvZihvYmouY29uc3RydWN0b3IpID09ICdmdW5jdGlvbicpCisJCXsKKwkJCWNsb25lID0gbmV3IG9iai5jb25zdHJ1Y3RvcigpOworCQkJCisJCSAgICBmb3IgKHZhciBpIGluIG9iaikKKwkJICAgIHsKKwkJICAgIAlpZiAoaSAhPSBteE9iamVjdElkZW50aXR5LkZJRUxEX05BTUUgJiYgKHRyYW5zaWVudHMgPT0gbnVsbCB8fAorCQkgICAgCQlteFV0aWxzLmluZGV4T2YodHJhbnNpZW50cywgaSkgPCAwKSkKKwkJICAgIAl7CisJCQkgICAgCWlmICghc2hhbGxvdyAmJiB0eXBlb2Yob2JqW2ldKSA9PSAnb2JqZWN0JykKKwkJCSAgICAJeworCQkJICAgICAgICAgICAgY2xvbmVbaV0gPSBteFV0aWxzLmNsb25lKG9ialtpXSk7CisJCQkgICAgICAgIH0KKwkJCSAgICAgICAgZWxzZQorCQkJICAgICAgICB7CisJCQkgICAgICAgICAgICBjbG9uZVtpXSA9IG9ialtpXTsKKwkJCSAgICAgICAgfQorCQkJCX0KKwkJICAgIH0KKwkJfQorCQkKKwkgICAgcmV0dXJuIGNsb25lOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZXF1YWxQb2ludHMKKwkgKiAKKwkgKiBDb21wYXJlcyBhbGwgbXhQb2ludHMgaW4gdGhlIGdpdmVuIGxpc3RzLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogYSAtIEFycmF5IG9mIDxteFBvaW50cz4gdG8gYmUgY29tcGFyZWQuCisJICogYiAtIEFycmF5IG9mIDxteFBvaW50cz4gdG8gYmUgY29tcGFyZWQuCisJICovCisJZXF1YWxQb2ludHM6IGZ1bmN0aW9uKGEsIGIpCisJeworCQlpZiAoKGEgPT0gbnVsbCAmJiBiICE9IG51bGwpIHx8IChhICE9IG51bGwgJiYgYiA9PSBudWxsKSB8fAorCQkJKGEgIT0gbnVsbCAmJiBiICE9IG51bGwgJiYgYS5sZW5ndGggIT0gYi5sZW5ndGgpKQorCQl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJZWxzZSBpZiAoYSAhPSBudWxsICYmIGIgIT0gbnVsbCkKKwkJeworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCWlmIChhW2ldID09IGJbaV0gfHwgKGFbaV0gIT0gbnVsbCAmJiAhYVtpXS5lcXVhbHMoYltpXSkpKQorCQkJCXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIHRydWU7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBlcXVhbEVudHJpZXMKKwkgKiAKKwkgKiBSZXR1cm5zIHRydWUgaWYgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGdpdmVuIG9iamVjdHMgYXJlIGVxdWFsLiBWYWx1ZXMKKwkgKiB3aXRoIE5hTiBhcmUgZXF1YWwgdG8gTmFOIGFuZCB1bmVxdWFsIHRvIGFueSBvdGhlciB2YWx1ZS4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGEgLSBGaXJzdCBvYmplY3QgdG8gYmUgY29tcGFyZWQuCisJICogYiAtIFNlY29uZCBvYmplY3QgdG8gYmUgY29tcGFyZWQuCisJICovCisJZXF1YWxFbnRyaWVzOiBmdW5jdGlvbihhLCBiKQorCXsKKwkJaWYgKChhID09IG51bGwgJiYgYiAhPSBudWxsKSB8fCAoYSAhPSBudWxsICYmIGIgPT0gbnVsbCkgfHwKKwkJCShhICE9IG51bGwgJiYgYiAhPSBudWxsICYmIGEubGVuZ3RoICE9IGIubGVuZ3RoKSkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWVsc2UgaWYgKGEgIT0gbnVsbCAmJiBiICE9IG51bGwpCisJCXsKKwkJCS8vIENvdW50cyBrZXlzIGluIGIgdG8gY2hlY2sgaWYgYWxsIHZhbHVlcyBoYXZlIGJlZW4gY29tcGFyZWQKKwkJCXZhciBjb3VudCA9IDA7CisJCQkKKwkJCWZvciAodmFyIGtleSBpbiBiKQorCQkJeworCQkJCWNvdW50Kys7CisJCQl9CisJCQkKKwkJCWZvciAodmFyIGtleSBpbiBhKQorCQkJeworCQkJCWNvdW50LS0KKwkJCQkKKwkJCQlpZiAoKCFteFV0aWxzLmlzTmFOKGFba2V5XSkgfHwgIW14VXRpbHMuaXNOYU4oYltrZXldKSkgJiYgYVtrZXldICE9IGJba2V5XSkKKwkJCQl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBjb3VudCA9PSAwOworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IHJlbW92ZUR1cGxpY2F0ZXMKKwkgKiAKKwkgKiBSZW1vdmVzIGFsbCBkdXBsaWNhdGVzIGZyb20gdGhlIGdpdmVuIGFycmF5LgorCSAqLworCXJlbW92ZUR1cGxpY2F0ZXM6IGZ1bmN0aW9uKGFycikKKwl7CisJCXZhciBkaWN0ID0gbmV3IG14RGljdGlvbmFyeSgpOworCQl2YXIgcmVzdWx0ID0gW107CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykKKwkJeworCQkJaWYgKCFkaWN0LmdldChhcnJbaV0pKQorCQkJeworCQkJCXJlc3VsdC5wdXNoKGFycltpXSk7CisJCQkJZGljdC5wdXQoYXJyW2ldLCB0cnVlKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogaXNOYU4KKwkgKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgb2YgdHlwZSBudW1iZXIgYW5kIGlzTmFOIHJldHVybnMgdHJ1ZS4KKwkgKi8KKwlpc05hTjogZnVuY3Rpb24odmFsdWUpCisJeworCQlyZXR1cm4gdHlwZW9mKHZhbHVlKSA9PSAnbnVtYmVyJyAmJiBpc05hTih2YWx1ZSk7CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogZXh0ZW5kCisJICoKKwkgKiBBc3NpZ25zIGEgY29weSBvZiB0aGUgc3VwZXJjbGFzcyBwcm90b3R5cGUgdG8gdGhlIHN1YmNsYXNzIHByb3RvdHlwZS4KKwkgKiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBjYWxsIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXJjbGFzcyBhdCB0aGlzCisJICogcG9pbnQsIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBjYWxsZWQgZXhwbGljaXRlbHkgaW4gdGhlCisJICogc3ViY2xhc3MgY29uc3RydWN0b3IuIEJlbG93IGlzIGFuIGV4YW1wbGUuCisJICogCisJICogKGNvZGUpCisJICogTXlHcmFwaCA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgbW9kZWwsIHJlbmRlckhpbnQsIHN0eWxlc2hlZXQpCisJICogeworCSAqICAgbXhHcmFwaC5jYWxsKHRoaXMsIGNvbnRhaW5lciwgbW9kZWwsIHJlbmRlckhpbnQsIHN0eWxlc2hlZXQpOworCSAqIH0KKwkgKiAKKwkgKiBteFV0aWxzLmV4dGVuZChNeUdyYXBoLCBteEdyYXBoKTsKKwkgKiAoZW5kKQorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogY3RvciAtIENvbnN0cnVjdG9yIG9mIHRoZSBzdWJjbGFzcy4KKwkgKiBzdXBlckN0b3IgLSBDb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXJjbGFzcy4KKwkgKi8KKwlleHRlbmQ6IGZ1bmN0aW9uKGN0b3IsIHN1cGVyQ3RvcikKKwl7CisJCXZhciBmID0gZnVuY3Rpb24oKSB7fTsKKwkJZi5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlOworCQkKKwkJY3Rvci5wcm90b3R5cGUgPSBuZXcgZigpOworCQljdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiB0b1N0cmluZworCSAqIAorCSAqIFJldHVybnMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogb2JqIC0gT2JqZWN0IHRvIHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvci4KKwkgKi8KKwl0b1N0cmluZzogZnVuY3Rpb24ob2JqKQorCXsKKwkgICAgdmFyIG91dHB1dCA9ICcnOworCSAgICAKKwkgICAgZm9yICh2YXIgaSBpbiBvYmopCisJICAgIHsKKwkgICAgCXRyeQorCSAgICAJeworCQkJICAgIGlmIChvYmpbaV0gPT0gbnVsbCkKKwkJCSAgICB7CisJCSAgICAgICAgICAgIG91dHB1dCArPSBpICsgJyA9IFtudWxsXVxuJzsKKwkJCSAgICB9CisJCQkgICAgZWxzZSBpZiAodHlwZW9mKG9ialtpXSkgPT0gJ2Z1bmN0aW9uJykKKwkJCSAgICB7CisJCSAgICAgICAgICAgIG91dHB1dCArPSBpICsgJyA9PiBbRnVuY3Rpb25dXG4nOworCQkgICAgICAgIH0KKwkJICAgICAgICBlbHNlIGlmICh0eXBlb2Yob2JqW2ldKSA9PSAnb2JqZWN0JykKKwkJICAgICAgICB7CisJCSAgICAgICAgCXZhciBjdG9yID0gbXhVdGlscy5nZXRGdW5jdGlvbk5hbWUob2JqW2ldLmNvbnN0cnVjdG9yKTsgCisJCSAgICAgICAgICAgIG91dHB1dCArPSBpICsgJyA9PiBbJyArIGN0b3IgKyAnXVxuJzsKKwkJICAgICAgICB9CisJCSAgICAgICAgZWxzZQorCQkgICAgICAgIHsKKwkJICAgICAgICAgICAgb3V0cHV0ICs9IGkgKyAnID0gJyArIG9ialtpXSArICdcbic7CisJCSAgICAgICAgfQorCSAgICAJfQorCSAgICAJY2F0Y2ggKGUpCisJICAgIAl7CisJICAgIAkJb3V0cHV0ICs9IGkgKyAnPScgKyBlLm1lc3NhZ2U7CisJICAgIAl9CisJICAgIH0KKwkgICAgCisJICAgIHJldHVybiBvdXRwdXQ7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiB0b1JhZGlhbnMKKwkgKiAKKwkgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gZGVncmVlIHRvIHJhZGlhbnMuCisJICovCisJdG9SYWRpYW5zOiBmdW5jdGlvbihkZWcpCisJeworCQlyZXR1cm4gTWF0aC5QSSAqIGRlZyAvIDE4MDsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IHRvRGVncmVlCisJICogCisJICogQ29udmVydHMgdGhlIGdpdmVuIHJhZGlhbnMgdG8gZGVncmVlLgorCSAqLworCXRvRGVncmVlOiBmdW5jdGlvbihyYWQpCisJeworCQlyZXR1cm4gcmFkICogMTgwIC8gTWF0aC5QSTsKKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBhcmNUb0N1cnZlcworCSAqIAorCSAqIENvbnZlcnRzIHRoZSBnaXZlbiBhcmMgdG8gYSBzZXJpZXMgb2YgY3VydmVzLgorCSAqLworCWFyY1RvQ3VydmVzOiBmdW5jdGlvbih4MCwgeTAsIHIxLCByMiwgYW5nbGUsIGxhcmdlQXJjRmxhZywgc3dlZXBGbGFnLCB4LCB5KQorCXsKKwkJeCAtPSB4MDsKKwkJeSAtPSB5MDsKKwkJCisgICAgICAgIGlmIChyMSA9PT0gMCB8fCByMiA9PT0gMCkgCisgICAgICAgIHsKKyAgICAgICAgCXJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHZhciBmUyA9IHN3ZWVwRmxhZzsKKyAgICAgICAgdmFyIHBzYWkgPSBhbmdsZTsKKyAgICAgICAgcjEgPSBNYXRoLmFicyhyMSk7CisgICAgICAgIHIyID0gTWF0aC5hYnMocjIpOworICAgICAgICB2YXIgY3R4ID0gLXggLyAyOworICAgICAgICB2YXIgY3R5ID0gLXkgLyAyOworICAgICAgICB2YXIgY3BzaSA9IE1hdGguY29zKHBzYWkgKiBNYXRoLlBJIC8gMTgwKTsKKyAgICAgICAgdmFyIHNwc2kgPSBNYXRoLnNpbihwc2FpICogTWF0aC5QSSAvIDE4MCk7CisgICAgICAgIHZhciByeGQgPSBjcHNpICogY3R4ICsgc3BzaSAqIGN0eTsKKyAgICAgICAgdmFyIHJ5ZCA9IC0xICogc3BzaSAqIGN0eCArIGNwc2kgKiBjdHk7CisgICAgICAgIHZhciByeGRkID0gcnhkICogcnhkOworICAgICAgICB2YXIgcnlkZCA9IHJ5ZCAqIHJ5ZDsKKyAgICAgICAgdmFyIHIxeCA9IHIxICogcjE7CisgICAgICAgIHZhciByMnkgPSByMiAqIHIyOworICAgICAgICB2YXIgbGFtZGEgPSByeGRkIC8gcjF4ICsgcnlkZCAvIHIyeTsKKyAgICAgICAgdmFyIHNkczsKKyAgICAgICAgCisgICAgICAgIGlmIChsYW1kYSA+IDEpIAorICAgICAgICB7CisgICAgICAgIAlyMSA9IE1hdGguc3FydChsYW1kYSkgKiByMTsKKyAgICAgICAgCXIyID0gTWF0aC5zcXJ0KGxhbWRhKSAqIHIyOworICAgICAgICAJc2RzID0gMDsKKyAgICAgICAgfSAgCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAJdmFyIHNlaWYgPSAxOworICAgICAgICAgICAgCisgICAgICAgIAlpZiAobGFyZ2VBcmNGbGFnID09PSBmUykgCisgICAgICAgIAl7CisgICAgICAgIAkJc2VpZiA9IC0xOworICAgICAgICAJfQorICAgICAgICAgICAgCisgICAgICAgIAlzZHMgPSBzZWlmICogTWF0aC5zcXJ0KChyMXggKiByMnkgLSByMXggKiByeWRkIC0gcjJ5ICogcnhkZCkgLyAocjF4ICogcnlkZCArIHIyeSAqIHJ4ZGQpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdmFyIHR4ZCA9IHNkcyAqIHIxICogcnlkIC8gcjI7CisgICAgICAgIHZhciB0eWQgPSAtMSAqIHNkcyAqIHIyICogcnhkIC8gcjE7CisgICAgICAgIHZhciB0eCA9IGNwc2kgKiB0eGQgLSBzcHNpICogdHlkICsgeCAvIDI7CisgICAgICAgIHZhciB0eSA9IHNwc2kgKiB0eGQgKyBjcHNpICogdHlkICsgeSAvIDI7CisgICAgICAgIHZhciByYWQgPSBNYXRoLmF0YW4yKChyeWQgLSB0eWQpIC8gcjIsIChyeGQgLSB0eGQpIC8gcjEpIC0gTWF0aC5hdGFuMigwLCAxKTsKKyAgICAgICAgdmFyIHMxID0gKHJhZCA+PSAwKSA/IHJhZCA6IDIgKiBNYXRoLlBJICsgcmFkOworICAgICAgICByYWQgPSBNYXRoLmF0YW4yKCgtcnlkIC0gdHlkKSAvIHIyLCAoLXJ4ZCAtIHR4ZCkgLyByMSkgLSBNYXRoLmF0YW4yKChyeWQgLSB0eWQpIC8gcjIsIChyeGQgLSB0eGQpIC8gcjEpOworICAgICAgICB2YXIgZHIgPSAocmFkID49IDApID8gcmFkIDogMiAqIE1hdGguUEkgKyByYWQ7CisgICAgICAgIAorICAgICAgICBpZiAoZlMgPT0gMCAmJiBkciA+IDApIAorICAgICAgICB7CisgICAgICAgIAlkciAtPSAyICogTWF0aC5QSTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmUyAhPSAwICYmIGRyIDwgMCkgCisgICAgICAgIHsKKyAgICAgICAgCWRyICs9IDIgKiBNYXRoLlBJOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB2YXIgc3NlID0gZHIgKiAyIC8gTWF0aC5QSTsKKyAgICAgICAgdmFyIHNlZyA9IE1hdGguY2VpbChzc2UgPCAwID8gLTEgKiBzc2UgOiBzc2UpOworICAgICAgICB2YXIgc2VnciA9IGRyIC8gc2VnOworICAgICAgICB2YXIgdCA9IDgvMyAqIE1hdGguc2luKHNlZ3IgLyA0KSAqIE1hdGguc2luKHNlZ3IgLyA0KSAvIE1hdGguc2luKHNlZ3IgLyAyKTsKKyAgICAgICAgdmFyIGNwc2lyMSA9IGNwc2kgKiByMTsKKyAgICAgICAgdmFyIGNwc2lyMiA9IGNwc2kgKiByMjsKKyAgICAgICAgdmFyIHNwc2lyMSA9IHNwc2kgKiByMTsKKyAgICAgICAgdmFyIHNwc2lyMiA9IHNwc2kgKiByMjsKKyAgICAgICAgdmFyIG1jID0gTWF0aC5jb3MoczEpOworICAgICAgICB2YXIgbXMgPSBNYXRoLnNpbihzMSk7CisgICAgICAgIHZhciB4MiA9IC10ICogKGNwc2lyMSAqIG1zICsgc3BzaXIyICogbWMpOworICAgICAgICB2YXIgeTIgPSAtdCAqIChzcHNpcjEgKiBtcyAtIGNwc2lyMiAqIG1jKTsKKyAgICAgICAgdmFyIHgzID0gMDsKKyAgICAgICAgdmFyIHkzID0gMDsKKworCQl2YXIgcmVzdWx0ID0gW107CisgICAgICAgIAorICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHNlZzsgKytuKSAKKyAgICAgICAgeworICAgICAgICAgICAgczEgKz0gc2VncjsKKyAgICAgICAgICAgIG1jID0gTWF0aC5jb3MoczEpOworICAgICAgICAgICAgbXMgPSBNYXRoLnNpbihzMSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHgzID0gY3BzaXIxICogbWMgLSBzcHNpcjIgKiBtcyArIHR4OworICAgICAgICAgICAgeTMgPSBzcHNpcjEgKiBtYyArIGNwc2lyMiAqIG1zICsgdHk7CisgICAgICAgICAgICB2YXIgZHggPSAtdCAqIChjcHNpcjEgKiBtcyArIHNwc2lyMiAqIG1jKTsKKyAgICAgICAgICAgIHZhciBkeSA9IC10ICogKHNwc2lyMSAqIG1zIC0gY3BzaXIyICogbWMpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBDdXJ2ZVRvIHVwZGF0ZXMgeDAsIHkwIHNvIG5lZWQgdG8gcmVzdG9yZSBpdAorICAgICAgICAgICAgdmFyIGluZGV4ID0gbiAqIDY7CisgICAgICAgICAgICByZXN1bHRbaW5kZXhdID0gTnVtYmVyKHgyICsgeDApOworICAgICAgICAgICAgcmVzdWx0W2luZGV4ICsgMV0gPSBOdW1iZXIoeTIgKyB5MCk7CisgICAgICAgICAgICByZXN1bHRbaW5kZXggKyAyXSA9IE51bWJlcih4MyAtIGR4ICsgeDApOworICAgICAgICAgICAgcmVzdWx0W2luZGV4ICsgM10gPSBOdW1iZXIoeTMgLSBkeSArIHkwKTsKKyAgICAgICAgICAgIHJlc3VsdFtpbmRleCArIDRdID0gTnVtYmVyKHgzICsgeDApOworICAgICAgICAgICAgcmVzdWx0W2luZGV4ICsgNV0gPSBOdW1iZXIoeTMgKyB5MCk7CisgICAgICAgICAgICAKKwkJCXgyID0geDMgKyBkeDsKKyAgICAgICAgICAgIHkyID0geTMgKyBkeTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGdldEJvdW5kaW5nQm94CisJICogCisJICogUmV0dXJucyB0aGUgYm91bmRpbmcgYm94IGZvciB0aGUgcm90YXRlZCByZWN0YW5nbGUuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiByZWN0IC0gPG14UmVjdGFuZ2xlPiB0byBiZSByb3RhdGVkLgorCSAqIGFuZ2xlIC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgYW5nbGUgKGluIGRlZ3JlZXMpLgorCSAqIGN4IC0gT3B0aW9uYWwgPG14UG9pbnQ+IHRoYXQgcmVwcmVzZW50cyB0aGUgcm90YXRpb24gY2VudGVyLiBJZiBubworCSAqIHJvdGF0aW9uIGNlbnRlciBpcyBnaXZlbiB0aGVuIHRoZSBjZW50ZXIgb2YgcmVjdCBpcyB1c2VkLgorCSAqLworCWdldEJvdW5kaW5nQm94OiBmdW5jdGlvbihyZWN0LCByb3RhdGlvbiwgY3gpCisJeworICAgICAgICB2YXIgcmVzdWx0ID0gbnVsbDsKKworICAgICAgICBpZiAocmVjdCAhPSBudWxsICYmIHJvdGF0aW9uICE9IG51bGwgJiYgcm90YXRpb24gIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJhZCA9IG14VXRpbHMudG9SYWRpYW5zKHJvdGF0aW9uKTsKKyAgICAgICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhyYWQpOworICAgICAgICAgICAgdmFyIHNpbiA9IE1hdGguc2luKHJhZCk7CisKKyAgICAgICAgICAgIGN4ID0gKGN4ICE9IG51bGwpID8gY3ggOiBuZXcgbXhQb2ludChyZWN0LnggKyByZWN0LndpZHRoIC8gMiwgcmVjdC55ICArIHJlY3QuaGVpZ2h0IC8gMik7CisKKyAgICAgICAgICAgIHZhciBwMSA9IG5ldyBteFBvaW50KHJlY3QueCwgcmVjdC55KTsKKyAgICAgICAgICAgIHZhciBwMiA9IG5ldyBteFBvaW50KHJlY3QueCArIHJlY3Qud2lkdGgsIHJlY3QueSk7CisgICAgICAgICAgICB2YXIgcDMgPSBuZXcgbXhQb2ludChwMi54LCByZWN0LnkgKyByZWN0LmhlaWdodCk7CisgICAgICAgICAgICB2YXIgcDQgPSBuZXcgbXhQb2ludChyZWN0LngsIHAzLnkpOworCisgICAgICAgICAgICBwMSA9IG14VXRpbHMuZ2V0Um90YXRlZFBvaW50KHAxLCBjb3MsIHNpbiwgY3gpOworICAgICAgICAgICAgcDIgPSBteFV0aWxzLmdldFJvdGF0ZWRQb2ludChwMiwgY29zLCBzaW4sIGN4KTsKKyAgICAgICAgICAgIHAzID0gbXhVdGlscy5nZXRSb3RhdGVkUG9pbnQocDMsIGNvcywgc2luLCBjeCk7CisgICAgICAgICAgICBwNCA9IG14VXRpbHMuZ2V0Um90YXRlZFBvaW50KHA0LCBjb3MsIHNpbiwgY3gpOworCisgICAgICAgICAgICByZXN1bHQgPSBuZXcgbXhSZWN0YW5nbGUocDEueCwgcDEueSwgMCwgMCk7CisgICAgICAgICAgICByZXN1bHQuYWRkKG5ldyBteFJlY3RhbmdsZShwMi54LCBwMi55LCAwLCAwKSk7CisgICAgICAgICAgICByZXN1bHQuYWRkKG5ldyBteFJlY3RhbmdsZShwMy54LCBwMy55LCAwLCAwKSk7CisgICAgICAgICAgICByZXN1bHQuYWRkKG5ldyBteFJlY3RhbmdsZShwNC54LCBwNC55LCAwLCAwKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0Um90YXRlZFBvaW50CisJICogCisJICogUm90YXRlcyB0aGUgZ2l2ZW4gcG9pbnQgYnkgdGhlIGdpdmVuIGNvcyBhbmQgc2luLgorCSAqLworCWdldFJvdGF0ZWRQb2ludDogZnVuY3Rpb24ocHQsIGNvcywgc2luLCBjKQorCXsKKwkJYyA9IChjICE9IG51bGwpID8gYyA6IG5ldyBteFBvaW50KCk7CisJCXZhciB4ID0gcHQueCAtIGMueDsKKwkJdmFyIHkgPSBwdC55IC0gYy55OworCisJCXZhciB4MSA9IHggKiBjb3MgLSB5ICogc2luOworCQl2YXIgeTEgPSB5ICogY29zICsgeCAqIHNpbjsKKworCQlyZXR1cm4gbmV3IG14UG9pbnQoeDEgKyBjLngsIHkxICsgYy55KTsKKwl9LAorCQorCS8qKgorCSAqIFJldHVybnMgYW4gaW50ZWdlciBtYXNrIG9mIHRoZSBwb3J0IGNvbnN0cmFpbnRzIG9mIHRoZSBnaXZlbiBtYXAKKwkgKiBAcGFyYW0gZGljdCB0aGUgc3R5bGUgbWFwIHRvIGRldGVybWluZSB0aGUgcG9ydCBjb25zdHJhaW50cyBmb3IKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIERlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBrZXkgaXMgdW5kZWZpbmVkLgorCSAqIEByZXR1cm4gdGhlIG1hc2sgb2YgcG9ydCBjb25zdHJhaW50IGRpcmVjdGlvbnMKKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIHRlcm1pbmFsIC0gPG14Q2VsU3RhdGU+IHRoYXQgcmVwcmVzZW50cyB0aGUgdGVybWluYWwuCisJICogZWRnZSAtIDxteENlbGxTdGF0ZT4gdGhhdCByZXByZXNlbnRzIHRoZSBlZGdlLgorCSAqIHNvdXJjZSAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIHRlcm1pbmFsIGlzIHRoZSBzb3VyY2UgdGVybWluYWwuCisJICogZGVmYXVsdFZhbHVlIC0gRGVmYXVsdCB2YWx1ZSB0byBiZSByZXR1cm5lZC4KKwkgKi8KKwlnZXRQb3J0Q29uc3RyYWludHM6IGZ1bmN0aW9uKHRlcm1pbmFsLCBlZGdlLCBzb3VyY2UsIGRlZmF1bHRWYWx1ZSkKKwl7CisJCXZhciB2YWx1ZSA9IG14VXRpbHMuZ2V0VmFsdWUodGVybWluYWwuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1BPUlRfQ09OU1RSQUlOVCwKKwkJCW14VXRpbHMuZ2V0VmFsdWUoZWRnZS5zdHlsZSwgKHNvdXJjZSkgPyBteENvbnN0YW50cy5TVFlMRV9TT1VSQ0VfUE9SVF9DT05TVFJBSU5UIDoKKwkJCQlteENvbnN0YW50cy5TVFlMRV9UQVJHRVRfUE9SVF9DT05TVFJBSU5ULCBudWxsKSk7CisJCQorCQlpZiAodmFsdWUgPT0gbnVsbCkKKwkJeworCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXZhciBkaXJlY3Rpb25zID0gdmFsdWUudG9TdHJpbmcoKTsKKwkJCXZhciByZXR1cm5WYWx1ZSA9IG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX05PTkU7CisJCQl2YXIgY29uc3RyYWludFJvdGF0aW9uRW5hYmxlZCA9IG14VXRpbHMuZ2V0VmFsdWUodGVybWluYWwuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1BPUlRfQ09OU1RSQUlOVF9ST1RBVElPTiwgMCk7CisJCQl2YXIgcm90YXRpb24gPSAwOworCQkJCisJCQlpZiAoY29uc3RyYWludFJvdGF0aW9uRW5hYmxlZCA9PSAxKQorCQkJeworCQkJCXJvdGF0aW9uID0gbXhVdGlscy5nZXRWYWx1ZSh0ZXJtaW5hbC5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfUk9UQVRJT04sIDApOworCQkJfQorCQkJCisJCQl2YXIgcXVhZCA9IDA7CisKKwkJCWlmIChyb3RhdGlvbiA+IDQ1KQorCQkJeworCQkJCXF1YWQgPSAxOworCQkJCQorCQkJCWlmIChyb3RhdGlvbiA+PSAxMzUpCisJCQkJeworCQkJCQlxdWFkID0gMjsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChyb3RhdGlvbiA8IC00NSkKKwkJCXsKKwkJCQlxdWFkID0gMzsKKwkJCQkKKwkJCQlpZiAocm90YXRpb24gPD0gLTEzNSkKKwkJCQl7CisJCQkJCXF1YWQgPSAyOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGRpcmVjdGlvbnMuaW5kZXhPZihteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEgpID49IDApCisJCQl7CisJCQkJc3dpdGNoIChxdWFkKQorCQkJCXsKKwkJCQkJY2FzZSAwOgorCQkJCQkJcmV0dXJuVmFsdWUgfD0gbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfTk9SVEg7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJcmV0dXJuVmFsdWUgfD0gbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfRUFTVDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDI6CisJCQkJCQlyZXR1cm5WYWx1ZSB8PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19TT1VUSDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDM6CisJCQkJCQlyZXR1cm5WYWx1ZSB8PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19XRVNUOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKGRpcmVjdGlvbnMuaW5kZXhPZihteENvbnN0YW50cy5ESVJFQ1RJT05fV0VTVCkgPj0gMCkKKwkJCXsKKwkJCQlzd2l0Y2ggKHF1YWQpCisJCQkJeworCQkJCQljYXNlIDA6CisJCQkJCQlyZXR1cm5WYWx1ZSB8PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19XRVNUOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMToKKwkJCQkJCXJldHVyblZhbHVlIHw9IG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX05PUlRIOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCXJldHVyblZhbHVlIHw9IG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX0VBU1Q7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAzOgorCQkJCQkJcmV0dXJuVmFsdWUgfD0gbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfU09VVEg7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoZGlyZWN0aW9ucy5pbmRleE9mKG14Q29uc3RhbnRzLkRJUkVDVElPTl9TT1VUSCkgPj0gMCkKKwkJCXsKKwkJCQlzd2l0Y2ggKHF1YWQpCisJCQkJeworCQkJCQljYXNlIDA6CisJCQkJCQlyZXR1cm5WYWx1ZSB8PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19TT1VUSDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDE6CisJCQkJCQlyZXR1cm5WYWx1ZSB8PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19XRVNUOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMjoKKwkJCQkJCXJldHVyblZhbHVlIHw9IG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX05PUlRIOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgMzoKKwkJCQkJCXJldHVyblZhbHVlIHw9IG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX0VBU1Q7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoZGlyZWN0aW9ucy5pbmRleE9mKG14Q29uc3RhbnRzLkRJUkVDVElPTl9FQVNUKSA+PSAwKQorCQkJeworCQkJCXN3aXRjaCAocXVhZCkKKwkJCQl7CisJCQkJCWNhc2UgMDoKKwkJCQkJCXJldHVyblZhbHVlIHw9IG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX0VBU1Q7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAxOgorCQkJCQkJcmV0dXJuVmFsdWUgfD0gbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfU09VVEg7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSAyOgorCQkJCQkJcmV0dXJuVmFsdWUgfD0gbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfV0VTVDsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIDM6CisJCQkJCQlyZXR1cm5WYWx1ZSB8PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19OT1JUSDsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIHJldHVyblZhbHVlOworCQl9CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogcmV2ZXJzZVBvcnRDb25zdHJhaW50cworCSAqIAorCSAqIFJldmVyc2UgdGhlIHBvcnQgY29uc3RyYWludCBiaXRtYXNrLiBGb3IgZXhhbXBsZSwgbm9ydGggfCBlYXN0CisJICogYmVjb21lcyBzb3V0aCB8IHdlc3QKKwkgKi8KKwlyZXZlcnNlUG9ydENvbnN0cmFpbnRzOiBmdW5jdGlvbihjb25zdHJhaW50KQorCXsKKwkJdmFyIHJlc3VsdCA9IDA7CisJCQorCQlyZXN1bHQgPSAoY29uc3RyYWludCAmIG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX1dFU1QpIDw8IDM7CisJCXJlc3VsdCB8PSAoY29uc3RyYWludCAmIG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX05PUlRIKSA8PCAxOworCQlyZXN1bHQgfD0gKGNvbnN0cmFpbnQgJiBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19TT1VUSCkgPj4gMTsKKwkJcmVzdWx0IHw9IChjb25zdHJhaW50ICYgbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfRUFTVCkgPj4gMzsKKwkJCisJCXJldHVybiByZXN1bHQ7CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogZmluZE5lYXJlc3RTZWdtZW50CisJICogCisJICogRmluZHMgdGhlIGluZGV4IG9mIHRoZSBuZWFyZXN0IHNlZ21lbnQgb24gdGhlIGdpdmVuIGNlbGwgc3RhdGUgZm9yCisJICogdGhlIHNwZWNpZmllZCBjb29yZGluYXRlIHBhaXIuCisJICovCisJZmluZE5lYXJlc3RTZWdtZW50OiBmdW5jdGlvbihzdGF0ZSwgeCwgeSkKKwl7CisJCXZhciBpbmRleCA9IC0xOworCQkKKwkJaWYgKHN0YXRlLmFic29sdXRlUG9pbnRzLmxlbmd0aCA+IDApCisJCXsKKwkJCXZhciBsYXN0ID0gc3RhdGUuYWJzb2x1dGVQb2ludHNbMF07CisJCQl2YXIgbWluID0gbnVsbDsKKwkJCQorCQkJZm9yICh2YXIgaSA9IDE7IGkgPCBzdGF0ZS5hYnNvbHV0ZVBvaW50cy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQl2YXIgY3VycmVudCA9IHN0YXRlLmFic29sdXRlUG9pbnRzW2ldOworCQkJCXZhciBkaXN0ID0gbXhVdGlscy5wdFNlZ0Rpc3RTcShsYXN0LngsIGxhc3QueSwKKwkJCQkJY3VycmVudC54LCBjdXJyZW50LnksIHgsIHkpOworCQkJCQorCQkJCWlmIChtaW4gPT0gbnVsbCB8fCBkaXN0IDwgbWluKQorCQkJCXsKKwkJCQkJbWluID0gZGlzdDsKKwkJCQkJaW5kZXggPSBpIC0gMTsKKwkJCQl9CisKKwkJCQlsYXN0ID0gY3VycmVudDsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIGluZGV4OworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0RGlyZWN0ZWRCb3VuZHMKKwkgKiAKKwkgKiBBZGRzIHRoZSBnaXZlbiBtYXJnaW5zIHRvIHRoZSBnaXZlbiByZWN0YW5nbGUgYW5kIHJvdGF0ZXMgYW5kIGZsaXBzIHRoZQorCSAqIHJlY3RhbmdsZSBhY2NvcmRpbmcgdG8gdGhlIHJlc3BlY3RpdmUgc3R5bGVzIGluIHN0eWxlLgorCSAqLworCWdldERpcmVjdGVkQm91bmRzOiBmdW5jdGlvbiAocmVjdCwgbSwgc3R5bGUsIGZsaXBILCBmbGlwVikKKwl7CisJCXZhciBkID0gbXhVdGlscy5nZXRWYWx1ZShzdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfRElSRUNUSU9OLCBteENvbnN0YW50cy5ESVJFQ1RJT05fRUFTVCk7CisJCWZsaXBIID0gKGZsaXBIICE9IG51bGwpID8gZmxpcEggOiBteFV0aWxzLmdldFZhbHVlKHN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9GTElQSCwgZmFsc2UpOworCQlmbGlwViA9IChmbGlwViAhPSBudWxsKSA/IGZsaXBWIDogbXhVdGlscy5nZXRWYWx1ZShzdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfRkxJUFYsIGZhbHNlKTsKKworCQltLnggPSBNYXRoLnJvdW5kKE1hdGgubWF4KDAsIE1hdGgubWluKHJlY3Qud2lkdGgsIG0ueCkpKTsKKwkJbS55ID0gTWF0aC5yb3VuZChNYXRoLm1heCgwLCBNYXRoLm1pbihyZWN0LmhlaWdodCwgbS55KSkpOworCQltLndpZHRoID0gTWF0aC5yb3VuZChNYXRoLm1heCgwLCBNYXRoLm1pbihyZWN0LndpZHRoLCBtLndpZHRoKSkpOworCQltLmhlaWdodCA9IE1hdGgucm91bmQoTWF0aC5tYXgoMCwgTWF0aC5taW4ocmVjdC5oZWlnaHQsIG0uaGVpZ2h0KSkpOworCQkKKwkJaWYgKChmbGlwViAmJiAoZCA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fU09VVEggfHwgZCA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEgpKSB8fAorCQkJKGZsaXBIICYmIChkID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9FQVNUIHx8IGQgPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX1dFU1QpKSkKKwkJeworCQkJdmFyIHRtcCA9IG0ueDsKKwkJCW0ueCA9IG0ud2lkdGg7CisJCQltLndpZHRoID0gdG1wOworCQl9CisJCQkKKwkJaWYgKChmbGlwSCAmJiAoZCA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fU09VVEggfHwgZCA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEgpKSB8fAorCQkJKGZsaXBWICYmIChkID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9FQVNUIHx8IGQgPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX1dFU1QpKSkKKwkJeworCQkJdmFyIHRtcCA9IG0ueTsKKwkJCW0ueSA9IG0uaGVpZ2h0OworCQkJbS5oZWlnaHQgPSB0bXA7CisJCX0KKwkJCisJCXZhciBtMiA9IG14UmVjdGFuZ2xlLmZyb21SZWN0YW5nbGUobSk7CisJCQorCQlpZiAoZCA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fU09VVEgpCisJCXsKKwkJCW0yLnkgPSBtLng7CisJCQltMi54ID0gbS5oZWlnaHQ7CisJCQltMi53aWR0aCA9IG0ueTsKKwkJCW0yLmhlaWdodCA9IG0ud2lkdGg7CisJCX0KKwkJZWxzZSBpZiAoZCA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fV0VTVCkKKwkJeworCQkJbTIueSA9IG0uaGVpZ2h0OworCQkJbTIueCA9IG0ud2lkdGg7CisJCQltMi53aWR0aCA9IG0ueDsKKwkJCW0yLmhlaWdodCA9IG0ueTsKKwkJfQorCQllbHNlIGlmIChkID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9OT1JUSCkKKwkJeworCQkJbTIueSA9IG0ud2lkdGg7CisJCQltMi54ID0gbS55OworCQkJbTIud2lkdGggPSBtLmhlaWdodDsKKwkJCW0yLmhlaWdodCA9IG0ueDsKKwkJfQorCQkKKwkJcmV0dXJuIG5ldyBteFJlY3RhbmdsZShyZWN0LnggKyBtMi54LCByZWN0LnkgKyBtMi55LCByZWN0LndpZHRoIC0gbTIud2lkdGggLSBtMi54LCByZWN0LmhlaWdodCAtIG0yLmhlaWdodCAtIG0yLnkpOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0UGVyaW1ldGVyUG9pbnQKKwkgKiAKKwkgKiBSZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGUgcG9seWdvbiBkZWZpbmVkIGJ5IHRoZSBhcnJheSBvZgorCSAqIHBvaW50cyBhbmQgdGhlIGxpbmUgYmV0d2VlbiBjZW50ZXIgYW5kIHBvaW50LgorCSAqLworCWdldFBlcmltZXRlclBvaW50OiBmdW5jdGlvbiAocHRzLCBjZW50ZXIsIHBvaW50KQorCXsKKwkJdmFyIG1pbiA9IG51bGw7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IHB0cy5sZW5ndGggLSAxOyBpKyspCisJCXsKKwkJCXZhciBwdCA9IG14VXRpbHMuaW50ZXJzZWN0aW9uKHB0c1tpXS54LCBwdHNbaV0ueSwgcHRzW2kgKyAxXS54LCBwdHNbaSArIDFdLnksCisJCQkJY2VudGVyLngsIGNlbnRlci55LCBwb2ludC54LCBwb2ludC55KTsKKwkJCQorCQkJaWYgKHB0ICE9IG51bGwpCisJCQl7CisJCQkJdmFyIGR4ID0gcG9pbnQueCAtIHB0Lng7CisJCQkJdmFyIGR5ID0gcG9pbnQueSAtIHB0Lnk7CisJCQkJdmFyIGlwID0ge3A6IHB0LCBkaXN0U3E6IGR5ICogZHkgKyBkeCAqIGR4fTsKKwkJCQkKKwkJCQlpZiAoaXAgIT0gbnVsbCAmJiAobWluID09IG51bGwgfHwgbWluLmRpc3RTcSA+IGlwLmRpc3RTcSkpCisJCQkJeworCQkJCQltaW4gPSBpcDsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXJldHVybiAobWluICE9IG51bGwpID8gbWluLnAgOiBudWxsOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogcmVjdGFuZ2xlSW50ZXJzZWN0c1NlZ21lbnQKKwkgKiAKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHJlY3RhbmdsZSBpbnRlcnNlY3RzIHRoZSBnaXZlbiBzZWdtZW50LgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogYm91bmRzIC0gPG14UmVjdGFuZ2xlPiB0aGF0IHJlcHJlc2VudHMgdGhlIHJlY3RhbmdsZS4KKwkgKiBwMSAtIDxteFBvaW50PiB0aGF0IHJlcHJlc2VudHMgdGhlIGZpcnN0IHBvaW50IG9mIHRoZSBzZWdtZW50LgorCSAqIHAyIC0gPG14UG9pbnQ+IHRoYXQgcmVwcmVzZW50cyB0aGUgc2Vjb25kIHBvaW50IG9mIHRoZSBzZWdtZW50LgorCSAqLworCXJlY3RhbmdsZUludGVyc2VjdHNTZWdtZW50OiBmdW5jdGlvbihib3VuZHMsIHAxLCBwMikKKwl7CisJCXZhciB0b3AgPSBib3VuZHMueTsKKwkJdmFyIGxlZnQgPSBib3VuZHMueDsKKwkJdmFyIGJvdHRvbSA9IHRvcCArIGJvdW5kcy5oZWlnaHQ7CisJCXZhciByaWdodCA9IGxlZnQgKyBib3VuZHMud2lkdGg7CisJCQkKKwkJLy8gRmluZCBtaW4gYW5kIG1heCBYIGZvciB0aGUgc2VnbWVudAorCQl2YXIgbWluWCA9IHAxLng7CisJCXZhciBtYXhYID0gcDIueDsKKwkJCisJCWlmIChwMS54ID4gcDIueCkKKwkJeworCQkgIG1pblggPSBwMi54OworCQkgIG1heFggPSBwMS54OworCQl9CisJCQorCQkvLyBGaW5kIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHNlZ21lbnQncyBhbmQgcmVjdGFuZ2xlJ3MgeC1wcm9qZWN0aW9ucworCQlpZiAobWF4WCA+IHJpZ2h0KQorCQl7CisJCSAgbWF4WCA9IHJpZ2h0OworCQl9CisJCQorCQlpZiAobWluWCA8IGxlZnQpCisJCXsKKwkJICBtaW5YID0gbGVmdDsKKwkJfQorCQkKKwkJaWYgKG1pblggPiBtYXhYKSAvLyBJZiB0aGVpciBwcm9qZWN0aW9ucyBkbyBub3QgaW50ZXJzZWN0IHJldHVybiBmYWxzZQorCQl7CisJCSAgcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQkvLyBGaW5kIGNvcnJlc3BvbmRpbmcgbWluIGFuZCBtYXggWSBmb3IgbWluIGFuZCBtYXggWCB3ZSBmb3VuZCBiZWZvcmUKKwkJdmFyIG1pblkgPSBwMS55OworCQl2YXIgbWF4WSA9IHAyLnk7CisJCXZhciBkeCA9IHAyLnggLSBwMS54OworCQkKKwkJaWYgKE1hdGguYWJzKGR4KSA+IDAuMDAwMDAwMSkKKwkJeworCQkgIHZhciBhID0gKHAyLnkgLSBwMS55KSAvIGR4OworCQkgIHZhciBiID0gcDEueSAtIGEgKiBwMS54OworCQkgIG1pblkgPSBhICogbWluWCArIGI7CisJCSAgbWF4WSA9IGEgKiBtYXhYICsgYjsKKwkJfQorCQkKKwkJaWYgKG1pblkgPiBtYXhZKQorCQl7CisJCSAgdmFyIHRtcCA9IG1heFk7CisJCSAgbWF4WSA9IG1pblk7CisJCSAgbWluWSA9IHRtcDsKKwkJfQorCQkKKwkJLy8gRmluZCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBzZWdtZW50J3MgYW5kIHJlY3RhbmdsZSdzIHktcHJvamVjdGlvbnMKKwkJaWYgKG1heFkgPiBib3R0b20pCisJCXsKKwkJICBtYXhZID0gYm90dG9tOworCQl9CisJCQorCQlpZiAobWluWSA8IHRvcCkKKwkJeworCQkgIG1pblkgPSB0b3A7CisJCX0KKwkJCisJCWlmIChtaW5ZID4gbWF4WSkgLy8gSWYgWS1wcm9qZWN0aW9ucyBkbyBub3QgaW50ZXJzZWN0IHJldHVybiBmYWxzZQorCQl7CisJCSAgcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBjb250YWlucworCSAqIAorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHBvaW50ICh4LCB5KSBpcyBjb250YWluZWQgaW4gdGhlIGdpdmVuIHJlY3RhbmdsZS4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGJvdW5kcyAtIDxteFJlY3RhbmdsZT4gdGhhdCByZXByZXNlbnRzIHRoZSBhcmVhLgorCSAqIHggLSBYLWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorCSAqIHkgLSBZLWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorCSAqLworCWNvbnRhaW5zOiBmdW5jdGlvbihib3VuZHMsIHgsIHkpCisJeworCQlyZXR1cm4gKGJvdW5kcy54IDw9IHggJiYgYm91bmRzLnggKyBib3VuZHMud2lkdGggPj0geCAmJgorCQkJCWJvdW5kcy55IDw9IHkgJiYgYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0ID49IHkpOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogaW50ZXJzZWN0cworCSAqIAorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIHJlY3RhbmdsZXMgaW50ZXJzZWN0LgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogYSAtIDxteFJlY3RhbmdsZT4gdG8gYmUgY2hlY2tlZCBmb3IgaW50ZXJzZWN0aW9uLgorCSAqIGIgLSA8bXhSZWN0YW5nbGU+IHRvIGJlIGNoZWNrZWQgZm9yIGludGVyc2VjdGlvbi4KKwkgKi8KKwlpbnRlcnNlY3RzOiBmdW5jdGlvbihhLCBiKQorCXsKKwkJdmFyIHR3ID0gYS53aWR0aDsKKwkJdmFyIHRoID0gYS5oZWlnaHQ7CisJCXZhciBydyA9IGIud2lkdGg7CisJCXZhciByaCA9IGIuaGVpZ2h0OworCQkKKwkJaWYgKHJ3IDw9IDAgfHwgcmggPD0gMCB8fCB0dyA8PSAwIHx8IHRoIDw9IDApCisJCXsKKwkJICAgIHJldHVybiBmYWxzZTsKKwkJfQorCQkKKwkJdmFyIHR4ID0gYS54OworCQl2YXIgdHkgPSBhLnk7CisJCXZhciByeCA9IGIueDsKKwkJdmFyIHJ5ID0gYi55OworCQkKKwkJcncgKz0gcng7CisJCXJoICs9IHJ5OworCQl0dyArPSB0eDsKKwkJdGggKz0gdHk7CisKKwkJcmV0dXJuICgocncgPCByeCB8fCBydyA+IHR4KSAmJgorCQkJKHJoIDwgcnkgfHwgcmggPiB0eSkgJiYKKwkJCSh0dyA8IHR4IHx8IHR3ID4gcngpICYmCisJCQkodGggPCB0eSB8fCB0aCA+IHJ5KSk7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBpbnRlcnNlY3RzCisJICogCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gcmVjdGFuZ2xlcyBpbnRlcnNlY3QuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBhIC0gPG14UmVjdGFuZ2xlPiB0byBiZSBjaGVja2VkIGZvciBpbnRlcnNlY3Rpb24uCisJICogYiAtIDxteFJlY3RhbmdsZT4gdG8gYmUgY2hlY2tlZCBmb3IgaW50ZXJzZWN0aW9uLgorCSAqLworCWludGVyc2VjdHNIb3RzcG90OiBmdW5jdGlvbihzdGF0ZSwgeCwgeSwgaG90c3BvdCwgbWluLCBtYXgpCisJeworCQlob3RzcG90ID0gKGhvdHNwb3QgIT0gbnVsbCkgPyBob3RzcG90IDogMTsKKwkJbWluID0gKG1pbiAhPSBudWxsKSA/IG1pbiA6IDA7CisJCW1heCA9IChtYXggIT0gbnVsbCkgPyBtYXggOiAwOworCQkKKwkJaWYgKGhvdHNwb3QgPiAwKQorCQl7CisJCQl2YXIgY3ggPSBzdGF0ZS5nZXRDZW50ZXJYKCk7CisJCQl2YXIgY3kgPSBzdGF0ZS5nZXRDZW50ZXJZKCk7CisJCQl2YXIgdyA9IHN0YXRlLndpZHRoOworCQkJdmFyIGggPSBzdGF0ZS5oZWlnaHQ7CisJCQkKKwkJCXZhciBzdGFydCA9IG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1NUQVJUU0laRSkgKiBzdGF0ZS52aWV3LnNjYWxlOworCisJCQlpZiAoc3RhcnQgPiAwKQorCQkJeworCQkJCWlmIChteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9IT1JJWk9OVEFMLCB0cnVlKSkKKwkJCQl7CisJCQkJCWN5ID0gc3RhdGUueSArIHN0YXJ0IC8gMjsKKwkJCQkJaCA9IHN0YXJ0OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQljeCA9IHN0YXRlLnggKyBzdGFydCAvIDI7CisJCQkJCXcgPSBzdGFydDsKKwkJCQl9CisJCQl9CisKKwkJCXcgPSBNYXRoLm1heChtaW4sIHcgKiBob3RzcG90KTsKKwkJCWggPSBNYXRoLm1heChtaW4sIGggKiBob3RzcG90KTsKKwkJCQorCQkJaWYgKG1heCA+IDApCisJCQl7CisJCQkJdyA9IE1hdGgubWluKHcsIG1heCk7CisJCQkJaCA9IE1hdGgubWluKGgsIG1heCk7CisJCQl9CisJCQkKKwkJCXZhciByZWN0ID0gbmV3IG14UmVjdGFuZ2xlKGN4IC0gdyAvIDIsIGN5IC0gaCAvIDIsIHcsIGgpOworCQkJdmFyIGFscGhhID0gbXhVdGlscy50b1JhZGlhbnMobXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfUk9UQVRJT04pIHx8IDApOworCQkJCisJCQlpZiAoYWxwaGEgIT0gMCkKKwkJCXsKKwkJCQl2YXIgY29zID0gTWF0aC5jb3MoLWFscGhhKTsKKwkJCQl2YXIgc2luID0gTWF0aC5zaW4oLWFscGhhKTsKKwkJCQl2YXIgY3ggPSBuZXcgbXhQb2ludChzdGF0ZS5nZXRDZW50ZXJYKCksIHN0YXRlLmdldENlbnRlclkoKSk7CisJCQkJdmFyIHB0ID0gbXhVdGlscy5nZXRSb3RhdGVkUG9pbnQobmV3IG14UG9pbnQoeCwgeSksIGNvcywgc2luLCBjeCk7CisJCQkJeCA9IHB0Lng7CisJCQkJeSA9IHB0Lnk7CisJCQl9CisJCQkKKwkJCXJldHVybiBteFV0aWxzLmNvbnRhaW5zKHJlY3QsIHgsIHkpOwkJCQorCQl9CisJCQorCQlyZXR1cm4gdHJ1ZTsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGdldE9mZnNldAorCSAqIAorCSAqIFJldHVybnMgdGhlIG9mZnNldCBmb3IgdGhlIHNwZWNpZmllZCBjb250YWluZXIgYXMgYW4gPG14UG9pbnQ+LiBUaGUKKwkgKiBvZmZzZXQgaXMgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgY29udGFpbmVyIHRvIHRoZQorCSAqIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgZG9jdW1lbnQuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBjb250YWluZXIgLSBET00gbm9kZSB0byByZXR1cm4gdGhlIG9mZnNldCBmb3IuCisJICogc2NvbGxPZmZzZXQgLSBPcHRpb25hbCBib29sZWFuIHRvIGFkZCB0aGUgc2Nyb2xsIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQuCisJICogRGVmYXVsdCBpcyBmYWxzZS4KKwkgKi8KKwlnZXRPZmZzZXQ6IGZ1bmN0aW9uKGNvbnRhaW5lciwgc2Nyb2xsT2Zmc2V0KQorCXsKKwkJdmFyIG9mZnNldExlZnQgPSAwOworCQl2YXIgb2Zmc2V0VG9wID0gMDsKKwkJCisJCS8vIElnbm9yZXMgZG9jdW1lbnQgc2Nyb2xsIG9yaWdpbiBmb3IgZml4ZWQgZWxlbWVudHMKKwkJdmFyIGZpeGVkID0gZmFsc2U7CisJCXZhciBub2RlID0gY29udGFpbmVyOworCQl2YXIgYiA9IGRvY3VtZW50LmJvZHk7CisJCXZhciBkID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OworCisJCXdoaWxlIChub2RlICE9IG51bGwgJiYgbm9kZSAhPSBiICYmIG5vZGUgIT0gZCAmJiAhZml4ZWQpCisJCXsKKwkJCXZhciBzdHlsZSA9IG14VXRpbHMuZ2V0Q3VycmVudFN0eWxlKG5vZGUpOworCQkJCisJCQlpZiAoc3R5bGUgIT0gbnVsbCkKKwkJCXsKKwkJCQlmaXhlZCA9IGZpeGVkIHx8IHN0eWxlLnBvc2l0aW9uID09ICdmaXhlZCc7CisJCQl9CisJCQkKKwkJCW5vZGUgPSBub2RlLnBhcmVudE5vZGU7CisJCX0KKwkJCisJCWlmICghc2Nyb2xsT2Zmc2V0ICYmICFmaXhlZCkKKwkJeworCQkJdmFyIG9mZnNldCA9IG14VXRpbHMuZ2V0RG9jdW1lbnRTY3JvbGxPcmlnaW4oY29udGFpbmVyLm93bmVyRG9jdW1lbnQpOworCQkJb2Zmc2V0TGVmdCArPSBvZmZzZXQueDsKKwkJCW9mZnNldFRvcCArPSBvZmZzZXQueTsKKwkJfQorCQkKKwkJdmFyIHIgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CisJCQorCQlpZiAociAhPSBudWxsKQorCQl7CisJCQlvZmZzZXRMZWZ0ICs9IHIubGVmdDsKKwkJCW9mZnNldFRvcCArPSByLnRvcDsKKwkJfQorCQkKKwkJcmV0dXJuIG5ldyBteFBvaW50KG9mZnNldExlZnQsIG9mZnNldFRvcCk7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBnZXREb2N1bWVudFNjcm9sbE9yaWdpbgorCSAqIAorCSAqIFJldHVybnMgdGhlIHNjcm9sbCBvcmlnaW4gb2YgdGhlIGdpdmVuIGRvY3VtZW50IG9yIHRoZSBjdXJyZW50IGRvY3VtZW50CisJICogaWYgbm8gZG9jdW1lbnQgaXMgZ2l2ZW4uCisJICovCisJZ2V0RG9jdW1lbnRTY3JvbGxPcmlnaW46IGZ1bmN0aW9uKGRvYykKKwl7CisJCWlmIChteENsaWVudC5JU19RVUlSS1MpCisJCXsKKwkJCXJldHVybiBuZXcgbXhQb2ludChkb2MuYm9keS5zY3JvbGxMZWZ0LCBkb2MuYm9keS5zY3JvbGxUb3ApOworCQl9CisJCWVsc2UKKwkJeworCQkJdmFyIHduZCA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93OworCQkJCisJCQl2YXIgeCA9ICh3bmQgIT0gbnVsbCAmJiB3aW5kb3cucGFnZVhPZmZzZXQgIT09IHVuZGVmaW5lZCkgPyB3aW5kb3cucGFnZVhPZmZzZXQgOiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZSB8fCBkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0OworCQkJdmFyIHkgPSAod25kICE9IG51bGwgJiYgd2luZG93LnBhZ2VZT2Zmc2V0ICE9PSB1bmRlZmluZWQpID8gd2luZG93LnBhZ2VZT2Zmc2V0IDogKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUgfHwgZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wOworCQkJCisJCQlyZXR1cm4gbmV3IG14UG9pbnQoeCwgeSk7CisJCX0KKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBnZXRTY3JvbGxPcmlnaW4KKwkgKiAKKwkgKiBSZXR1cm5zIHRoZSB0b3AsIGxlZnQgY29ybmVyIG9mIHRoZSB2aWV3cmVjdCBhcyBhbiA8bXhQb2ludD4uCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBub2RlIC0gRE9NIG5vZGUgd2hvc2Ugc2Nyb2xsIG9yaWdpbiBzaG91bGQgYmUgcmV0dXJuZWQuCisJICogaW5jbHVkZUFuY2VzdG9ycyAtIFdoZXRoZXIgdGhlIHNjcm9sbCBvcmlnaW4gb2YgdGhlIGFuY2VzdG9ycyBzaG91bGQgYmUKKwkgKiBpbmNsdWRlZC4gRGVmYXVsdCBpcyBmYWxzZS4KKwkgKiBpbmNsdWRlRG9jdW1lbnQgLSBXaGV0aGVyIHRoZSBzY3JvbGwgb3JpZ2luIG9mIHRoZSBkb2N1bWVudCBzaG91bGQgYmUKKwkgKiBpbmNsdWRlZC4gRGVmYXVsdCBpcyB0cnVlLgorCSAqLworCWdldFNjcm9sbE9yaWdpbjogZnVuY3Rpb24obm9kZSwgaW5jbHVkZUFuY2VzdG9ycywgaW5jbHVkZURvY3VtZW50KQorCXsKKwkJaW5jbHVkZUFuY2VzdG9ycyA9IChpbmNsdWRlQW5jZXN0b3JzICE9IG51bGwpID8gaW5jbHVkZUFuY2VzdG9ycyA6IGZhbHNlOworCQlpbmNsdWRlRG9jdW1lbnQgPSAoaW5jbHVkZURvY3VtZW50ICE9IG51bGwpID8gaW5jbHVkZURvY3VtZW50IDogdHJ1ZTsKKwkJCisJCXZhciBkb2MgPSAobm9kZSAhPSBudWxsKSA/IG5vZGUub3duZXJEb2N1bWVudCA6IGRvY3VtZW50OworCQl2YXIgYiA9IGRvYy5ib2R5OworCQl2YXIgZCA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7CisJCXZhciByZXN1bHQgPSBuZXcgbXhQb2ludCgpOworCQl2YXIgZml4ZWQgPSBmYWxzZTsKKworCQl3aGlsZSAobm9kZSAhPSBudWxsICYmIG5vZGUgIT0gYiAmJiBub2RlICE9IGQpCisJCXsKKwkJCWlmICghaXNOYU4obm9kZS5zY3JvbGxMZWZ0KSAmJiAhaXNOYU4obm9kZS5zY3JvbGxUb3ApKQorCQkJeworCQkJCXJlc3VsdC54ICs9IG5vZGUuc2Nyb2xsTGVmdDsKKwkJCQlyZXN1bHQueSArPSBub2RlLnNjcm9sbFRvcDsKKwkJCX0KKwkJCQorCQkJdmFyIHN0eWxlID0gbXhVdGlscy5nZXRDdXJyZW50U3R5bGUobm9kZSk7CisJCQkKKwkJCWlmIChzdHlsZSAhPSBudWxsKQorCQkJeworCQkJCWZpeGVkID0gZml4ZWQgfHwgc3R5bGUucG9zaXRpb24gPT0gJ2ZpeGVkJzsKKwkJCX0KKworCQkJbm9kZSA9IChpbmNsdWRlQW5jZXN0b3JzKSA/IG5vZGUucGFyZW50Tm9kZSA6IG51bGw7CisJCX0KKworCQlpZiAoIWZpeGVkICYmIGluY2x1ZGVEb2N1bWVudCkKKwkJeworCQkJdmFyIG9yaWdpbiA9IG14VXRpbHMuZ2V0RG9jdW1lbnRTY3JvbGxPcmlnaW4oZG9jKTsKKworCQkJcmVzdWx0LnggKz0gb3JpZ2luLng7CisJCQlyZXN1bHQueSArPSBvcmlnaW4ueTsKKwkJfQorCQkKKwkJcmV0dXJuIHJlc3VsdDsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGNvbnZlcnRQb2ludAorCSAqIAorCSAqIENvbnZlcnRzIHRoZSBzcGVjaWZpZWQgcG9pbnQgKHgsIHkpIHVzaW5nIHRoZSBvZmZzZXQgb2YgdGhlIHNwZWNpZmllZAorCSAqIGNvbnRhaW5lciBhbmQgcmV0dXJucyBhIG5ldyA8bXhQb2ludD4gd2l0aCB0aGUgcmVzdWx0LgorCSAqIAorCSAqIChjb2RlKQorCSAqIHZhciBwdCA9IG14VXRpbHMuY29udmVydFBvaW50KGdyYXBoLmNvbnRhaW5lciwKKwkgKiAgIG14RXZlbnQuZ2V0Q2xpZW50WChldnQpLCBteEV2ZW50LmdldENsaWVudFkoZXZ0KSk7CisJICogKGVuZCkKKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGNvbnRhaW5lciAtIERPTSBub2RlIHRvIHVzZSBmb3IgdGhlIG9mZnNldC4KKwkgKiB4IC0gWC1jb29yZGluYXRlIG9mIHRoZSBwb2ludCB0byBiZSBjb252ZXJ0ZWQuCisJICogeSAtIFktY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgdG8gYmUgY29udmVydGVkLgorCSAqLworCWNvbnZlcnRQb2ludDogZnVuY3Rpb24oY29udGFpbmVyLCB4LCB5KQorCXsKKwkJdmFyIG9yaWdpbiA9IG14VXRpbHMuZ2V0U2Nyb2xsT3JpZ2luKGNvbnRhaW5lciwgZmFsc2UpOworCQl2YXIgb2Zmc2V0ID0gbXhVdGlscy5nZXRPZmZzZXQoY29udGFpbmVyKTsKKworCQlvZmZzZXQueCAtPSBvcmlnaW4ueDsKKwkJb2Zmc2V0LnkgLT0gb3JpZ2luLnk7CisJCQorCQlyZXR1cm4gbmV3IG14UG9pbnQoeCAtIG9mZnNldC54LCB5IC0gb2Zmc2V0LnkpOworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IGx0cmltCisJICogCisJICogU3RyaXBzIGFsbCB3aGl0ZXNwYWNlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy4gV2l0aG91dCB0aGUKKwkgKiBzZWNvbmQgcGFyYW1ldGVyLCB0aGlzIHdpbGwgdHJpbSB0aGVzZSBjaGFyYWN0ZXJzOgorCSAqIAorCSAqIC0gIiAiIChBU0NJSSAzMiAoMHgyMCkpLCBhbiBvcmRpbmFyeSBzcGFjZQorCSAqIC0gIlx0IiAoQVNDSUkgOSAoMHgwOSkpLCBhIHRhYgorCSAqIC0gIlxuIiAoQVNDSUkgMTAgKDB4MEEpKSwgYSBuZXcgbGluZSAobGluZSBmZWVkKQorCSAqIC0gIlxyIiAoQVNDSUkgMTMgKDB4MEQpKSwgYSBjYXJyaWFnZSByZXR1cm4KKwkgKiAtICJcMCIgKEFTQ0lJIDAgKDB4MDApKSwgdGhlIE5VTC1ieXRlCisJICogLSAiXHgwQiIgKEFTQ0lJIDExICgweDBCKSksIGEgdmVydGljYWwgdGFiCisJICovCisJbHRyaW06IGZ1bmN0aW9uKHN0ciwgY2hhcnMpCisJeworCQljaGFycyA9IGNoYXJzIHx8ICJcXHMiOworCQkKKwkJcmV0dXJuIChzdHIgIT0gbnVsbCkgPyBzdHIucmVwbGFjZShuZXcgUmVnRXhwKCJeWyIgKyBjaGFycyArICJdKyIsICJnIiksICIiKSA6IG51bGw7CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogcnRyaW0KKwkgKiAKKwkgKiBTdHJpcHMgYWxsIHdoaXRlc3BhY2VzIGZyb20gdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiBXaXRob3V0IHRoZSBzZWNvbmQKKwkgKiBwYXJhbWV0ZXIsIHRoaXMgd2lsbCB0cmltIHRoZXNlIGNoYXJhY3RlcnM6CisJICogCisJICogLSAiICIgKEFTQ0lJIDMyICgweDIwKSksIGFuIG9yZGluYXJ5IHNwYWNlCisJICogLSAiXHQiIChBU0NJSSA5ICgweDA5KSksIGEgdGFiCisJICogLSAiXG4iIChBU0NJSSAxMCAoMHgwQSkpLCBhIG5ldyBsaW5lIChsaW5lIGZlZWQpCisJICogLSAiXHIiIChBU0NJSSAxMyAoMHgwRCkpLCBhIGNhcnJpYWdlIHJldHVybgorCSAqIC0gIlwwIiAoQVNDSUkgMCAoMHgwMCkpLCB0aGUgTlVMLWJ5dGUKKwkgKiAtICJceDBCIiAoQVNDSUkgMTEgKDB4MEIpKSwgYSB2ZXJ0aWNhbCB0YWIKKwkgKi8KKwlydHJpbTogZnVuY3Rpb24oc3RyLCBjaGFycykKKwl7CisJCWNoYXJzID0gY2hhcnMgfHwgIlxccyI7CisJCQorCQlyZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ci5yZXBsYWNlKG5ldyBSZWdFeHAoIlsiICsgY2hhcnMgKyAiXSskIiwgImciKSwgIiIpIDogbnVsbDsKKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiB0cmltCisJICogCisJICogU3RyaXBzIGFsbCB3aGl0ZXNwYWNlcyBmcm9tIGJvdGggZW5kIG9mIHRoZSBzdHJpbmcuCisJICogV2l0aG91dCB0aGUgc2Vjb25kIHBhcmFtZXRlciwgSmF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIHRyaW0gdGhlc2UKKwkgKiBjaGFyYWN0ZXJzOgorCSAqIAorCSAqIC0gIiAiIChBU0NJSSAzMiAoMHgyMCkpLCBhbiBvcmRpbmFyeSBzcGFjZQorCSAqIC0gIlx0IiAoQVNDSUkgOSAoMHgwOSkpLCBhIHRhYgorCSAqIC0gIlxuIiAoQVNDSUkgMTAgKDB4MEEpKSwgYSBuZXcgbGluZSAobGluZSBmZWVkKQorCSAqIC0gIlxyIiAoQVNDSUkgMTMgKDB4MEQpKSwgYSBjYXJyaWFnZSByZXR1cm4KKwkgKiAtICJcMCIgKEFTQ0lJIDAgKDB4MDApKSwgdGhlIE5VTC1ieXRlCisJICogLSAiXHgwQiIgKEFTQ0lJIDExICgweDBCKSksIGEgdmVydGljYWwgdGFiCisJICovCisJdHJpbTogZnVuY3Rpb24oc3RyLCBjaGFycykKKwl7CisJCXJldHVybiBteFV0aWxzLmx0cmltKG14VXRpbHMucnRyaW0oc3RyLCBjaGFycyksIGNoYXJzKTsKKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBpc051bWVyaWMKKwkgKiAKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBudW1lcmljLCB0aGF0IGlzLCBpZiBpdCBpcyBub3QKKwkgKiBudWxsLCBub3QgYW4gZW1wdHkgc3RyaW5nLCBub3QgYSBIRVggbnVtYmVyIGFuZCBpc05hTiByZXR1cm5zIGZhbHNlLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogbiAtIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBvc3NpYmx5IG51bWVyaWMgdmFsdWUuCisJICovCisJaXNOdW1lcmljOiBmdW5jdGlvbihuKQorCXsKKwkJcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKSAmJiAodHlwZW9mKG4pICE9ICdzdHJpbmcnIHx8IG4udG9Mb3dlckNhc2UoKS5pbmRleE9mKCcweCcpIDwgMCk7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBpc0ludGVnZXIKKwkgKiAKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGFuIHZhbGlkIGludGVnZXIgbnVtYmVyLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogbiAtIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBvc3NpYmx5IG51bWVyaWMgdmFsdWUuCisJICovCisJaXNJbnRlZ2VyOiBmdW5jdGlvbihuKQorCXsKKwkJcmV0dXJuIFN0cmluZyhwYXJzZUludChuKSkgPT09IFN0cmluZyhuKTsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IG1vZAorCSAqIAorCSAqIFJldHVybnMgdGhlIHJlbWFpbmRlciBvZiBkaXZpc2lvbiBvZiBuIGJ5IG0uIFlvdSBzaG91bGQgdXNlIHRoaXMgaW5zdGVhZAorCSAqIG9mIHRoZSBidWlsdC1pbiBvcGVyYXRpb24gYXMgdGhlIGJ1aWx0LWluIG9wZXJhdGlvbiBkb2VzIG5vdCBwcm9wZXJseQorCSAqIGhhbmRsZSBuZWdhdGl2ZSBudW1iZXJzLgorCSAqLworCW1vZDogZnVuY3Rpb24obiwgbSkKKwl7CisJCXJldHVybiAoKG4gJSBtKSArIG0pICUgbTsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IGludGVyc2VjdGlvbgorCSAqIAorCSAqIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBvZiB0d28gbGluZXMgYXMgYW4gPG14UG9pbnQ+LgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogeDAgLSBYLWNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGxpbmUncyBzdGFydHBvaW50LgorCSAqIHkwIC0gWC1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCBsaW5lJ3Mgc3RhcnRwb2ludC4KKwkgKiB4MSAtIFgtY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgbGluZSdzIGVuZHBvaW50LgorCSAqIHkxIC0gWS1jb29yZGluYXRlIG9mIHRoZSBmaXJzdCBsaW5lJ3MgZW5kcG9pbnQuCisJICogeDIgLSBYLWNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBsaW5lJ3Mgc3RhcnRwb2ludC4KKwkgKiB5MiAtIFktY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGxpbmUncyBzdGFydHBvaW50LgorCSAqIHgzIC0gWC1jb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgbGluZSdzIGVuZHBvaW50LgorCSAqIHkzIC0gWS1jb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgbGluZSdzIGVuZHBvaW50LgorCSAqLworCWludGVyc2VjdGlvbjogZnVuY3Rpb24gKHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MykKKwl7CisJCXZhciBkZW5vbSA9ICgoeTMgLSB5MikgKiAoeDEgLSB4MCkpIC0gKCh4MyAtIHgyKSAqICh5MSAtIHkwKSk7CisJCXZhciBudW1lX2EgPSAoKHgzIC0geDIpICogKHkwIC0geTIpKSAtICgoeTMgLSB5MikgKiAoeDAgLSB4MikpOworCQl2YXIgbnVtZV9iID0gKCh4MSAtIHgwKSAqICh5MCAtIHkyKSkgLSAoKHkxIC0geTApICogKHgwIC0geDIpKTsKKworCQl2YXIgdWEgPSBudW1lX2EgLyBkZW5vbTsKKwkJdmFyIHViID0gbnVtZV9iIC8gZGVub207CisJCQorCQlpZih1YSA+PSAwLjAgJiYgdWEgPD0gMS4wICYmIHViID49IDAuMCAmJiB1YiA8PSAxLjApCisJCXsKKwkJCS8vIEdldCB0aGUgaW50ZXJzZWN0aW9uIHBvaW50CisJCQl2YXIgeCA9IHgwICsgdWEgKiAoeDEgLSB4MCk7CisJCQl2YXIgeSA9IHkwICsgdWEgKiAoeTEgLSB5MCk7CisJCQkKKwkJCXJldHVybiBuZXcgbXhQb2ludCh4LCB5KTsKKwkJfQorCQkKKwkJLy8gTm8gaW50ZXJzZWN0aW9uCisJCXJldHVybiBudWxsOworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IHB0U2VnRGlzdFNxCisJICogCisJICogUmV0dXJucyB0aGUgc3F1YXJlIGRpc3RhbmNlIGJldHdlZW4gYSBzZWdtZW50IGFuZCBhIHBvaW50LiBUbyBnZXQgdGhlCisJICogZGlzdGFuY2UgYmV0d2VlbiBhIHBvaW50IGFuZCBhIGxpbmUgKHdpdGggaW5maW5pdGUgbGVuZ3RoKSB1c2UKKwkgKiA8bXhVdGlscy5wdExpbmVEaXN0Pi4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIHgxIC0gWC1jb29yZGluYXRlIG9mIHRoZSBzdGFydHBvaW50IG9mIHRoZSBzZWdtZW50LgorCSAqIHkxIC0gWS1jb29yZGluYXRlIG9mIHRoZSBzdGFydHBvaW50IG9mIHRoZSBzZWdtZW50LgorCSAqIHgyIC0gWC1jb29yZGluYXRlIG9mIHRoZSBlbmRwb2ludCBvZiB0aGUgc2VnbWVudC4KKwkgKiB5MiAtIFktY29vcmRpbmF0ZSBvZiB0aGUgZW5kcG9pbnQgb2YgdGhlIHNlZ21lbnQuCisJICogcHggLSBYLWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorCSAqIHB5IC0gWS1jb29yZGluYXRlIG9mIHRoZSBwb2ludC4KKwkgKi8KKwlwdFNlZ0Rpc3RTcTogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHB4LCBweSkKKyAgICB7CisJCXgyIC09IHgxOworCQl5MiAtPSB5MTsKKworCQlweCAtPSB4MTsKKwkJcHkgLT0geTE7CisKKwkJdmFyIGRvdHByb2QgPSBweCAqIHgyICsgcHkgKiB5MjsKKwkJdmFyIHByb2psZW5TcTsKKworCQlpZiAoZG90cHJvZCA8PSAwLjApCisJCXsKKwkJICAgIHByb2psZW5TcSA9IDAuMDsKKwkJfQorCQllbHNlCisJCXsKKwkJICAgIHB4ID0geDIgLSBweDsKKwkJICAgIHB5ID0geTIgLSBweTsKKwkJICAgIGRvdHByb2QgPSBweCAqIHgyICsgcHkgKiB5MjsKKworCQkgICAgaWYgKGRvdHByb2QgPD0gMC4wKQorCQkgICAgeworCQkJCXByb2psZW5TcSA9IDAuMDsKKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCQlwcm9qbGVuU3EgPSBkb3Rwcm9kICogZG90cHJvZCAvICh4MiAqIHgyICsgeTIgKiB5Mik7CisJCSAgICB9CisJCX0KKworCQl2YXIgbGVuU3EgPSBweCAqIHB4ICsgcHkgKiBweSAtIHByb2psZW5TcTsKKwkJCisJCWlmIChsZW5TcSA8IDApCisJCXsKKwkJICAgIGxlblNxID0gMDsKKwkJfQorCQkKKwkJcmV0dXJuIGxlblNxOworICAgIH0sCisJCisJLyoqCisJICogRnVuY3Rpb246IHB0TGluZURpc3QKKwkgKiAKKwkgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIGEgbGluZSBkZWZpbmVkIGJ5IHR3byBwb2ludHMgYW5kIGEgcG9pbnQuCisJICogVG8gZ2V0IHRoZSBkaXN0YW5jZSBiZXR3ZWVuIGEgcG9pbnQgYW5kIGEgc2VnbWVudCAod2l0aCBhIHNwZWNpZmljCisJICogbGVuZ3RoKSB1c2UgPG14VXRpbHMucHRTZXFEaXN0U3E+LgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogeDEgLSBYLWNvb3JkaW5hdGUgb2YgcG9pbnQgMSBvZiB0aGUgbGluZS4KKwkgKiB5MSAtIFktY29vcmRpbmF0ZSBvZiBwb2ludCAxIG9mIHRoZSBsaW5lLgorCSAqIHgyIC0gWC1jb29yZGluYXRlIG9mIHBvaW50IDEgb2YgdGhlIGxpbmUuCisJICogeTIgLSBZLWNvb3JkaW5hdGUgb2YgcG9pbnQgMSBvZiB0aGUgbGluZS4KKwkgKiBweCAtIFgtY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCisJICogcHkgLSBZLWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorCSAqLworICAgIHB0TGluZURpc3Q6IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCBweCwgcHkpCisgICAgeworCQlyZXR1cm4gTWF0aC5hYnMoKHkyIC0geTEpICogcHggLSAoeDIgLSB4MSkgKiBweSArIHgyICogeTEgLSB5MiAqIHgxKSAvCisJCQlNYXRoLnNxcnQoKHkyIC0geTEpICogKHkyIC0geTEpICsgKHgyIC0geDEpICogKHgyIC0geDEpKTsKKyAgICB9LAorICAgIAkKKwkvKioKKwkgKiBGdW5jdGlvbjogcmVsYXRpdmVDY3cKKwkgKiAKKwkgKiBSZXR1cm5zIDEgaWYgdGhlIGdpdmVuIHBvaW50IG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBzZWdtZW50LCAwIGlmIGl0cworCSAqIG9uIHRoZSBzZWdtZW50LCBhbmQgLTEgaWYgdGhlIHBvaW50IGlzIG9uIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHNlZ21lbnQuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiB4MSAtIFgtY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRwb2ludCBvZiB0aGUgc2VnbWVudC4KKwkgKiB5MSAtIFktY29vcmRpbmF0ZSBvZiB0aGUgc3RhcnRwb2ludCBvZiB0aGUgc2VnbWVudC4KKwkgKiB4MiAtIFgtY29vcmRpbmF0ZSBvZiB0aGUgZW5kcG9pbnQgb2YgdGhlIHNlZ21lbnQuCisJICogeTIgLSBZLWNvb3JkaW5hdGUgb2YgdGhlIGVuZHBvaW50IG9mIHRoZSBzZWdtZW50LgorCSAqIHB4IC0gWC1jb29yZGluYXRlIG9mIHRoZSBwb2ludC4KKwkgKiBweSAtIFktY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuCisJICovCisJcmVsYXRpdmVDY3c6IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCBweCwgcHkpCisgICAgeworCQl4MiAtPSB4MTsKKwkJeTIgLT0geTE7CisJCXB4IC09IHgxOworCQlweSAtPSB5MTsKKwkJdmFyIGNjdyA9IHB4ICogeTIgLSBweSAqIHgyOworCQkKKwkJaWYgKGNjdyA9PSAwLjApCisJCXsKKwkJICAgIGNjdyA9IHB4ICogeDIgKyBweSAqIHkyOworCQkgICAgCisJCSAgICBpZiAoY2N3ID4gMC4wKQorCQkgICAgeworCQkJCXB4IC09IHgyOworCQkJCXB5IC09IHkyOworCQkJCWNjdyA9IHB4ICogeDIgKyBweSAqIHkyOworCQkJCQorCQkJCWlmIChjY3cgPCAwLjApCisJCQkJeworCQkJCSAgICBjY3cgPSAwLjA7CisJCQkJfQorCQkgICAgfQorCQl9CisJCQorCQlyZXR1cm4gKGNjdyA8IDAuMCkgPyAtMSA6ICgoY2N3ID4gMC4wKSA/IDEgOiAwKTsKKyAgICB9LAorICAgIAorCS8qKgorCSAqIEZ1bmN0aW9uOiBhbmltYXRlQ2hhbmdlcworCSAqIAorCSAqIFNlZSA8bXhFZmZlY3RzLmFuaW1hdGVDaGFuZ2VzPi4gVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYW5kCisJICogd2lsbCBiZSByZW1vdmVkIGxhdGVyLgorCSAqLworCWFuaW1hdGVDaGFuZ2VzOiBmdW5jdGlvbihncmFwaCwgY2hhbmdlcykKKwl7CisJCS8vIExBVEVSOiBEZXByZWNhdGVkLCByZW1vdmUgdGhpcyBmdW5jdGlvbgorICAgIAlteEVmZmVjdHMuYW5pbWF0ZUNoYW5nZXMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9LAorICAgIAorCS8qKgorCSAqIEZ1bmN0aW9uOiBjYXNjYWRlT3BhY2l0eQorCSAqIAorCSAqIFNlZSA8bXhFZmZlY3RzLmNhc2NhZGVPcGFjaXR5Pi4gVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYW5kCisJICogd2lsbCBiZSByZW1vdmVkIGxhdGVyLgorCSAqLworICAgIGNhc2NhZGVPcGFjaXR5OiBmdW5jdGlvbihncmFwaCwgY2VsbCwgb3BhY2l0eSkKKwl7CisJCW14RWZmZWN0cy5jYXNjYWRlT3BhY2l0eS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZmFkZU91dAorCSAqIAorCSAqIFNlZSA8bXhFZmZlY3RzLmZhZGVPdXQ+LiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbmQKKwkgKiB3aWxsIGJlIHJlbW92ZWQgbGF0ZXIuCisJICovCisJZmFkZU91dDogZnVuY3Rpb24obm9kZSwgZnJvbSwgcmVtb3ZlLCBzdGVwLCBkZWxheSwgaXNFbmFibGVkKQorCXsKKwkJbXhFZmZlY3RzLmZhZGVPdXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBzZXRPcGFjaXR5CisJICogCisJICogU2V0cyB0aGUgb3BhY2l0eSBvZiB0aGUgc3BlY2lmaWVkIERPTSBub2RlIHRvIHRoZSBnaXZlbiB2YWx1ZSBpbiAlLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogbm9kZSAtIERPTSBub2RlIHRvIHNldCB0aGUgb3BhY2l0eSBmb3IuCisJICogdmFsdWUgLSBPcGFjaXR5IGluICUuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYmV0d2VlbiAwIGFuZCAxMDAuCisJICovCisJc2V0T3BhY2l0eTogZnVuY3Rpb24obm9kZSwgdmFsdWUpCisJeworCQlpZiAobXhVdGlscy5pc1ZtbChub2RlKSkKKwkJeworCSAgICAJaWYgKHZhbHVlID49IDEwMCkKKwkgICAgCXsKKwkgICAgCQlub2RlLnN0eWxlLmZpbHRlciA9ICcnOworCSAgICAJfQorCSAgICAJZWxzZQorCSAgICAJeworCSAgICAJCS8vIFRPRE86IFdoeSBpcyB0aGUgZGl2aXNpb24gYnkgNSBuZWVkZWQgaW4gVk1MPworCQkJICAgIG5vZGUuc3R5bGUuZmlsdGVyID0gJ2FscGhhKG9wYWNpdHk9JyArICh2YWx1ZS81KSArICcpJzsKKwkgICAgCX0KKwkJfQorCQllbHNlIGlmIChteENsaWVudC5JU19JRSAmJiAodHlwZW9mKGRvY3VtZW50LmRvY3VtZW50TW9kZSkgPT09ICd1bmRlZmluZWQnIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA8IDkpKQorCSAgICB7CisJICAgIAlpZiAodmFsdWUgPj0gMTAwKQorCSAgICAJeworCSAgICAJCW5vZGUuc3R5bGUuZmlsdGVyID0gJyc7CisJICAgIAl9CisJICAgIAllbHNlCisJICAgIAl7CisJCQkgICAgbm9kZS5zdHlsZS5maWx0ZXIgPSAnYWxwaGEob3BhY2l0eT0nICsgdmFsdWUgKyAnKSc7CisJICAgIAl9CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICBub2RlLnN0eWxlLm9wYWNpdHkgPSAodmFsdWUgLyAxMDApOworCQl9CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBjcmVhdGVJbWFnZQorCSAqIAorCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYW4gaW1hZ2UgKElNRyBub2RlKSBvciBWTUwgaW1hZ2UgKHY6aW1hZ2UpIGluIElFNiBpbgorCSAqIHF1aXJrcyBtb2RlLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogc3JjIC0gVVJMIHRoYXQgcG9pbnRzIHRvIHRoZSBpbWFnZSB0byBiZSBkaXNwbGF5ZWQuCisJICovCisJY3JlYXRlSW1hZ2U6IGZ1bmN0aW9uKHNyYykKKwl7CisgICAgICAgIHZhciBpbWFnZU5vZGUgPSBudWxsOworICAgICAgICAKKwkJaWYgKG14Q2xpZW50LklTX0lFNiAmJiBkb2N1bWVudC5jb21wYXRNb2RlICE9ICdDU1MxQ29tcGF0JykKKwkJeworICAgICAgICAJaW1hZ2VOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChteENsaWVudC5WTUxfUFJFRklYICsgJzppbWFnZScpOworICAgICAgICAJaW1hZ2VOb2RlLnNldEF0dHJpYnV0ZSgnc3JjJywgc3JjKTsKKyAgICAgICAgCWltYWdlTm9kZS5zdHlsZS5ib3JkZXJTdHlsZSA9ICdub25lJzsKKyAgICAgICAgfQorCQllbHNlCisJCXsKKwkJCWltYWdlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOworCQkJaW1hZ2VOb2RlLnNldEF0dHJpYnV0ZSgnc3JjJywgc3JjKTsKKwkJCWltYWdlTm9kZS5zZXRBdHRyaWJ1dGUoJ2JvcmRlcicsICcwJyk7CisJCX0KKwkJCisJCXJldHVybiBpbWFnZU5vZGU7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBzb3J0Q2VsbHMKKwkgKiAKKwkgKiBTb3J0cyB0aGUgZ2l2ZW4gY2VsbHMgYWNjb3JkaW5nIHRvIHRoZSBvcmRlciBpbiB0aGUgY2VsbCBoaWVyYXJjaHkuCisJICogQXNjZW5kaW5nIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byB0cnVlLgorCSAqLworCXNvcnRDZWxsczogZnVuY3Rpb24oY2VsbHMsIGFzY2VuZGluZykKKwl7CisJCWFzY2VuZGluZyA9IChhc2NlbmRpbmcgIT0gbnVsbCkgPyBhc2NlbmRpbmcgOiB0cnVlOworCQl2YXIgbG9va3VwID0gbmV3IG14RGljdGlvbmFyeSgpOworCQljZWxscy5zb3J0KGZ1bmN0aW9uKG8xLCBvMikKKwkJeworCQkJdmFyIHAxID0gbG9va3VwLmdldChvMSk7CisJCQkKKwkJCWlmIChwMSA9PSBudWxsKQorCQkJeworCQkJCXAxID0gbXhDZWxsUGF0aC5jcmVhdGUobzEpLnNwbGl0KG14Q2VsbFBhdGguUEFUSF9TRVBBUkFUT1IpOworCQkJCWxvb2t1cC5wdXQobzEsIHAxKTsKKwkJCX0KKwkJCQorCQkJdmFyIHAyID0gbG9va3VwLmdldChvMik7CisJCQkKKwkJCWlmIChwMiA9PSBudWxsKQorCQkJeworCQkJCXAyID0gbXhDZWxsUGF0aC5jcmVhdGUobzIpLnNwbGl0KG14Q2VsbFBhdGguUEFUSF9TRVBBUkFUT1IpOworCQkJCWxvb2t1cC5wdXQobzIsIHAyKTsKKwkJCX0KKwkJCQorCQkJdmFyIGNvbXAgPSBteENlbGxQYXRoLmNvbXBhcmUocDEsIHAyKTsKKwkJCQorCQkJcmV0dXJuIChjb21wID09IDApID8gMCA6ICgoKGNvbXAgPiAwKSA9PSBhc2NlbmRpbmcpID8gMSA6IC0xKTsKKwkJfSk7CisJCQorCQlyZXR1cm4gY2VsbHM7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBnZXRTdHlsZW5hbWUKKwkgKiAKKwkgKiBSZXR1cm5zIHRoZSBzdHlsZW5hbWUgaW4gYSBzdHlsZSBvZiB0aGUgZm9ybSBbKHN0eWxlbmFtZXxrZXk9dmFsdWUpO10gb3IKKwkgKiBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGdpdmVuIHN0eWxlIGRvZXMgbm90IGNvbnRhaW4gYSBzdHlsZW5hbWUuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBzdHlsZSAtIFN0cmluZyBvZiB0aGUgZm9ybSBbKHN0eWxlbmFtZXxrZXk9dmFsdWUpO10uCisJICovCisJZ2V0U3R5bGVuYW1lOiBmdW5jdGlvbihzdHlsZSkKKwl7CisJCWlmIChzdHlsZSAhPSBudWxsKQorCQl7CisJCQl2YXIgcGFpcnMgPSBzdHlsZS5zcGxpdCgnOycpOworCQkJdmFyIHN0eWxlbmFtZSA9IHBhaXJzWzBdOworCQkJCisJCQlpZiAoc3R5bGVuYW1lLmluZGV4T2YoJz0nKSA8IDApCisJCQl7CisJCQkJcmV0dXJuIHN0eWxlbmFtZTsKKwkJCX0KKwkJfQorCQkJCQorCQlyZXR1cm4gJyc7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBnZXRTdHlsZW5hbWVzCisJICogCisJICogUmV0dXJucyB0aGUgc3R5bGVuYW1lcyBpbiBhIHN0eWxlIG9mIHRoZSBmb3JtIFsoc3R5bGVuYW1lfGtleT12YWx1ZSk7XQorCSAqIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZSBnaXZlbiBzdHlsZSBkb2VzIG5vdCBjb250YWluIGFueSBzdHlsZW5hbWVzLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogc3R5bGUgLSBTdHJpbmcgb2YgdGhlIGZvcm0gWyhzdHlsZW5hbWV8a2V5PXZhbHVlKTtdLgorCSAqLworCWdldFN0eWxlbmFtZXM6IGZ1bmN0aW9uKHN0eWxlKQorCXsKKwkJdmFyIHJlc3VsdCA9IFtdOworCQkKKwkJaWYgKHN0eWxlICE9IG51bGwpCisJCXsKKwkJCXZhciBwYWlycyA9IHN0eWxlLnNwbGl0KCc7Jyk7CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJaWYgKHBhaXJzW2ldLmluZGV4T2YoJz0nKSA8IDApCisJCQkJeworCQkJCQlyZXN1bHQucHVzaChwYWlyc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJCQkJCisJCXJldHVybiByZXN1bHQ7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBpbmRleE9mU3R5bGVuYW1lCisJICogCisJICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIHN0eWxlbmFtZSBpbiB0aGUgZ2l2ZW4gc3R5bGUuIFRoaXMKKwkgKiByZXR1cm5zIC0xIGlmIHRoZSBnaXZlbiBzdHlsZW5hbWUgZG9lcyBub3Qgb2NjdXIgKGFzIGEgc3R5bGVuYW1lKSBpbiB0aGUKKwkgKiBnaXZlbiBzdHlsZSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuCisJICovCisJaW5kZXhPZlN0eWxlbmFtZTogZnVuY3Rpb24oc3R5bGUsIHN0eWxlbmFtZSkKKwl7CisJCWlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlbmFtZSAhPSBudWxsKQorCQl7CisJCQl2YXIgdG9rZW5zID0gc3R5bGUuc3BsaXQoJzsnKTsKKwkJCXZhciBwb3MgPSAwOworCQkJCisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQlpZiAodG9rZW5zW2ldID09IHN0eWxlbmFtZSkKKwkJCQl7CisJCQkJCXJldHVybiBwb3M7CisJCQkJfQorCQkJCQorCQkJCXBvcyArPSB0b2tlbnNbaV0ubGVuZ3RoICsgMTsKKwkJCX0KKwkJfQorCisJCXJldHVybiAtMTsKKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBhZGRTdHlsZW5hbWUKKwkgKiAKKwkgKiBBZGRzIHRoZSBzcGVjaWZpZWQgc3R5bGVuYW1lIHRvIHRoZSBnaXZlbiBzdHlsZSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5CisJICogY29udGFpbiB0aGUgc3R5bGVuYW1lLgorCSAqLworCWFkZFN0eWxlbmFtZTogZnVuY3Rpb24oc3R5bGUsIHN0eWxlbmFtZSkKKwl7CisJCWlmIChteFV0aWxzLmluZGV4T2ZTdHlsZW5hbWUoc3R5bGUsIHN0eWxlbmFtZSkgPCAwKQorCQl7CisJCQlpZiAoc3R5bGUgPT0gbnVsbCkKKwkJCXsKKwkJCQlzdHlsZSA9ICcnOworCQkJfQorCQkJZWxzZSBpZiAoc3R5bGUubGVuZ3RoID4gMCAmJiBzdHlsZS5jaGFyQXQoc3R5bGUubGVuZ3RoIC0gMSkgIT0gJzsnKQorCQkJeworCQkJCXN0eWxlICs9ICc7JzsKKwkJCX0KKwkJCQorCQkJc3R5bGUgKz0gc3R5bGVuYW1lOworCQl9CisJCQorCQlyZXR1cm4gc3R5bGU7CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogcmVtb3ZlU3R5bGVuYW1lCisJICogCisJICogUmVtb3ZlcyBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBzdHlsZW5hbWUgaW4gdGhlIGdpdmVuIHN0eWxlCisJICogYW5kIHJldHVybnMgdGhlIHVwZGF0ZWQgc3R5bGUuIFRyYWlsaW5nIHNlbWljb2xvbnMgYXJlIG5vdCBwcmVzZXJ2ZWQuCisJICovCisJcmVtb3ZlU3R5bGVuYW1lOiBmdW5jdGlvbihzdHlsZSwgc3R5bGVuYW1lKQorCXsKKwkJdmFyIHJlc3VsdCA9IFtdOworCQkKKwkJaWYgKHN0eWxlICE9IG51bGwpCisJCXsKKwkJCXZhciB0b2tlbnMgPSBzdHlsZS5zcGxpdCgnOycpOworCQkJCisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQlpZiAodG9rZW5zW2ldICE9IHN0eWxlbmFtZSkKKwkJCQl7CisJCQkJCXJlc3VsdC5wdXNoKHRva2Vuc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlyZXR1cm4gcmVzdWx0LmpvaW4oJzsnKTsKKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiByZW1vdmVBbGxTdHlsZW5hbWVzCisJICogCisJICogUmVtb3ZlcyBhbGwgc3R5bGVuYW1lcyBmcm9tIHRoZSBnaXZlbiBzdHlsZSBhbmQgcmV0dXJucyB0aGUgdXBkYXRlZAorCSAqIHN0eWxlLgorCSAqLworCXJlbW92ZUFsbFN0eWxlbmFtZXM6IGZ1bmN0aW9uKHN0eWxlKQorCXsKKwkJdmFyIHJlc3VsdCA9IFtdOworCQkKKwkJaWYgKHN0eWxlICE9IG51bGwpCisJCXsKKwkJCXZhciB0b2tlbnMgPSBzdHlsZS5zcGxpdCgnOycpOworCQkJCisJCQlmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQkvLyBLZWVwcyB0aGUga2V5LCB2YWx1ZSBhc3NpZ25tZW50cworCQkJCWlmICh0b2tlbnNbaV0uaW5kZXhPZignPScpID49IDApCisJCQkJeworCQkJCQlyZXN1bHQucHVzaCh0b2tlbnNbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIHJlc3VsdC5qb2luKCc7Jyk7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBzZXRDZWxsU3R5bGVzCisJICogCisJICogQXNzaWducyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgaW4gdGhlIHN0eWxlcyBvZiB0aGUgZ2l2ZW4gY2VsbHMsIG9yCisJICogcmVtb3ZlcyB0aGUga2V5IGZyb20gdGhlIHN0eWxlcyBpZiB0aGUgdmFsdWUgaXMgbnVsbC4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIG1vZGVsIC0gPG14R3JhcGhNb2RlbD4gdG8gZXhlY3V0ZSB0aGUgdHJhbnNhY3Rpb24gaW4uCisJICogY2VsbHMgLSBBcnJheSBvZiA8bXhDZWxscz4gdG8gYmUgdXBkYXRlZC4KKwkgKiBrZXkgLSBLZXkgb2YgdGhlIHN0eWxlIHRvIGJlIGNoYW5nZWQuCisJICogdmFsdWUgLSBOZXcgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkuCisJICovCisJc2V0Q2VsbFN0eWxlczogZnVuY3Rpb24obW9kZWwsIGNlbGxzLCBrZXksIHZhbHVlKQorCXsKKwkJaWYgKGNlbGxzICE9IG51bGwgJiYgY2VsbHMubGVuZ3RoID4gMCkKKwkJeworCQkJbW9kZWwuYmVnaW5VcGRhdGUoKTsKKwkJCXRyeQorCQkJeworCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCQkJeworCQkJCQlpZiAoY2VsbHNbaV0gIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJdmFyIHN0eWxlID0gbXhVdGlscy5zZXRTdHlsZShtb2RlbC5nZXRTdHlsZShjZWxsc1tpXSksIGtleSwgdmFsdWUpOworCQkJCQkJbW9kZWwuc2V0U3R5bGUoY2VsbHNbaV0sIHN0eWxlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWZpbmFsbHkKKwkJCXsKKwkJCQltb2RlbC5lbmRVcGRhdGUoKTsKKwkJCX0KKwkJfQorCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IHNldFN0eWxlCisJICogCisJICogQWRkcyBvciByZW1vdmVzIHRoZSBnaXZlbiBrZXksIHZhbHVlIHBhaXIgdG8gdGhlIHN0eWxlIGFuZCByZXR1cm5zIHRoZQorCSAqIG5ldyBzdHlsZS4gSWYgdmFsdWUgaXMgbnVsbCBvciB6ZXJvIGxlbmd0aCB0aGVuIHRoZSBrZXkgaXMgcmVtb3ZlZCBmcm9tCisJICogdGhlIHN0eWxlLiBUaGlzIGlzIGZvciBjZWxsIHN0eWxlcywgbm90IGZvciBDU1Mgc3R5bGVzLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogc3R5bGUgLSBTdHJpbmcgb2YgdGhlIGZvcm0gWyhzdHlsZW5hbWV8a2V5PXZhbHVlKTtdLgorCSAqIGtleSAtIEtleSBvZiB0aGUgc3R5bGUgdG8gYmUgY2hhbmdlZC4KKwkgKiB2YWx1ZSAtIE5ldyB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleS4KKwkgKi8KKwlzZXRTdHlsZTogZnVuY3Rpb24oc3R5bGUsIGtleSwgdmFsdWUpCisJeworCQl2YXIgaXNWYWx1ZSA9IHZhbHVlICE9IG51bGwgJiYgKHR5cGVvZih2YWx1ZS5sZW5ndGgpID09ICd1bmRlZmluZWQnIHx8IHZhbHVlLmxlbmd0aCA+IDApOworCQkKKwkJaWYgKHN0eWxlID09IG51bGwgfHwgc3R5bGUubGVuZ3RoID09IDApCisJCXsKKwkJCWlmIChpc1ZhbHVlKQorCQkJeworCQkJCXN0eWxlID0ga2V5ICsgJz0nICsgdmFsdWUgKyAnOyc7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoc3R5bGUuc3Vic3RyaW5nKDAsIGtleS5sZW5ndGggKyAxKSA9PSBrZXkgKyAnPScpCisJCQl7CisJCQkJdmFyIG5leHQgPSBzdHlsZS5pbmRleE9mKCc7Jyk7CisJCQkJCisJCQkJaWYgKGlzVmFsdWUpCisJCQkJeworCQkJCQlzdHlsZSA9IGtleSArICc9JyArIHZhbHVlICsgKChuZXh0IDwgMCkgPyAnOycgOiBzdHlsZS5zdWJzdHJpbmcobmV4dCkpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlzdHlsZSA9IChuZXh0IDwgMCB8fCBuZXh0ID09IHN0eWxlLmxlbmd0aCAtIDEpID8gJycgOiBzdHlsZS5zdWJzdHJpbmcobmV4dCArIDEpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl2YXIgaW5kZXggPSBzdHlsZS5pbmRleE9mKCc7JyArIGtleSArICc9Jyk7CisJCQkJCisJCQkJaWYgKGluZGV4IDwgMCkKKwkJCQl7CisJCQkJCWlmIChpc1ZhbHVlKQorCQkJCQl7CisJCQkJCQl2YXIgc2VwID0gKHN0eWxlLmNoYXJBdChzdHlsZS5sZW5ndGggLSAxKSA9PSAnOycpID8gJycgOiAnOyc7CisJCQkJCQlzdHlsZSA9IHN0eWxlICsgc2VwICsga2V5ICsgJz0nICsgdmFsdWUgKyAnOyc7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdmFyIG5leHQgPSBzdHlsZS5pbmRleE9mKCc7JywgaW5kZXggKyAxKTsKKwkJCQkJCisJCQkJCWlmIChpc1ZhbHVlKQorCQkJCQl7CisJCQkJCQlzdHlsZSA9IHN0eWxlLnN1YnN0cmluZygwLCBpbmRleCArIDEpICsga2V5ICsgJz0nICsgdmFsdWUgKyAoKG5leHQgPCAwKSA/ICc7JyA6IHN0eWxlLnN1YnN0cmluZyhuZXh0KSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlzdHlsZSA9IHN0eWxlLnN1YnN0cmluZygwLCBpbmRleCkgKyAoKG5leHQgPCAwKSA/ICc7JyA6IHN0eWxlLnN1YnN0cmluZyhuZXh0KSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBzdHlsZTsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IHNldENlbGxTdHlsZUZsYWdzCisJICogCisJICogU2V0cyBvciB0b2dnbGVzIHRoZSBmbGFnIGJpdCBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgY2VsbCdzIHN0eWxlcy4KKwkgKiBJZiB2YWx1ZSBpcyBudWxsIHRoZW4gdGhlIGZsYWcgaXMgdG9nZ2xlZC4KKwkgKiAKKwkgKiBFeGFtcGxlOgorCSAqIAorCSAqIChjb2RlKQorCSAqIHZhciBjZWxscyA9IGdyYXBoLmdldFNlbGVjdGlvbkNlbGxzKCk7CisJICogbXhVdGlscy5zZXRDZWxsU3R5bGVGbGFncyhncmFwaC5tb2RlbCwKKwkgKiAJCQljZWxscywKKwkgKiAJCQlteENvbnN0YW50cy5TVFlMRV9GT05UU1RZTEUsCisJICogCQkJbXhDb25zdGFudHMuRk9OVF9CT0xEKTsKKwkgKiAoZW5kKQorCSAqIAorCSAqIFRvZ2dsZXMgdGhlIGJvbGQgZm9udCBzdHlsZS4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIG1vZGVsIC0gPG14R3JhcGhNb2RlbD4gdGhhdCBjb250YWlucyB0aGUgY2VsbHMuCisJICogY2VsbHMgLSBBcnJheSBvZiA8bXhDZWxscz4gdG8gY2hhbmdlIHRoZSBzdHlsZSBmb3IuCisJICoga2V5IC0gS2V5IG9mIHRoZSBzdHlsZSB0byBiZSBjaGFuZ2VkLgorCSAqIGZsYWcgLSBJbnRlZ2VyIGZvciB0aGUgYml0IHRvIGJlIGNoYW5nZWQuCisJICogdmFsdWUgLSBPcHRpb25hbCBib29sZWFuIHZhbHVlIGZvciB0aGUgZmxhZy4KKwkgKi8KKwlzZXRDZWxsU3R5bGVGbGFnczogZnVuY3Rpb24obW9kZWwsIGNlbGxzLCBrZXksIGZsYWcsIHZhbHVlKQorCXsKKwkJaWYgKGNlbGxzICE9IG51bGwgJiYgY2VsbHMubGVuZ3RoID4gMCkKKwkJeworCQkJbW9kZWwuYmVnaW5VcGRhdGUoKTsKKwkJCXRyeQorCQkJeworCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCQkJeworCQkJCQlpZiAoY2VsbHNbaV0gIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJdmFyIHN0eWxlID0gbXhVdGlscy5zZXRTdHlsZUZsYWcoCisJCQkJCQkJbW9kZWwuZ2V0U3R5bGUoY2VsbHNbaV0pLAorCQkJCQkJCWtleSwgZmxhZywgdmFsdWUpOworCQkJCQkJbW9kZWwuc2V0U3R5bGUoY2VsbHNbaV0sIHN0eWxlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWZpbmFsbHkKKwkJCXsKKwkJCQltb2RlbC5lbmRVcGRhdGUoKTsKKwkJCX0KKwkJfQorCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IHNldFN0eWxlRmxhZworCSAqIAorCSAqIFNldHMgb3IgcmVtb3ZlcyB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlIHNwZWNpZmllZCBzdHlsZSBhbmQgcmV0dXJucyB0aGUKKwkgKiBuZXcgc3R5bGUuIElmIHZhbHVlIGlzIG51bGwgdGhlbiB0aGUgZmxhZyBpcyB0b2dnbGVkLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogc3R5bGUgLSBTdHJpbmcgb2YgdGhlIGZvcm0gWyhzdHlsZW5hbWV8a2V5PXZhbHVlKTtdLgorCSAqIGtleSAtIEtleSBvZiB0aGUgc3R5bGUgdG8gYmUgY2hhbmdlZC4KKwkgKiBmbGFnIC0gSW50ZWdlciBmb3IgdGhlIGJpdCB0byBiZSBjaGFuZ2VkLgorCSAqIHZhbHVlIC0gT3B0aW9uYWwgYm9vbGVhbiB2YWx1ZSBmb3IgdGhlIGdpdmVuIGZsYWcuCisJICovCisJc2V0U3R5bGVGbGFnOiBmdW5jdGlvbihzdHlsZSwga2V5LCBmbGFnLCB2YWx1ZSkKKwl7CisJCWlmIChzdHlsZSA9PSBudWxsIHx8IHN0eWxlLmxlbmd0aCA9PSAwKQorCQl7CisJCQlpZiAodmFsdWUgfHwgdmFsdWUgPT0gbnVsbCkKKwkJCXsKKwkJCQlzdHlsZSA9IGtleSsnPScrZmxhZzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzdHlsZSA9IGtleSsnPTAnOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJdmFyIGluZGV4ID0gc3R5bGUuaW5kZXhPZihrZXkrJz0nKTsKKwkJCQorCQkJaWYgKGluZGV4IDwgMCkKKwkJCXsKKwkJCQl2YXIgc2VwID0gKHN0eWxlLmNoYXJBdChzdHlsZS5sZW5ndGgtMSkgPT0gJzsnKSA/ICcnIDogJzsnOworCisJCQkJaWYgKHZhbHVlIHx8IHZhbHVlID09IG51bGwpCisJCQkJeworCQkJCQlzdHlsZSA9IHN0eWxlICsgc2VwICsga2V5ICsgJz0nICsgZmxhZzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJc3R5bGUgPSBzdHlsZSArIHNlcCArIGtleSArICc9MCc7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXZhciBjb250ID0gc3R5bGUuaW5kZXhPZignOycsIGluZGV4KTsKKwkJCQl2YXIgdG1wID0gJyc7CisJCQkJCisJCQkJaWYgKGNvbnQgPCAwKQorCQkJCXsKKwkJCQkJdG1wICA9IHN0eWxlLnN1YnN0cmluZyhpbmRleCtrZXkubGVuZ3RoKzEpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl0bXAgPSBzdHlsZS5zdWJzdHJpbmcoaW5kZXgra2V5Lmxlbmd0aCsxLCBjb250KTsKKwkJCQl9CisJCQkJCisJCQkJaWYgKHZhbHVlID09IG51bGwpCisJCQkJeworCQkJCQl0bXAgPSBwYXJzZUludCh0bXApIF4gZmxhZzsKKwkJCQl9CisJCQkJZWxzZSBpZiAodmFsdWUpCisJCQkJeworCQkJCQl0bXAgPSBwYXJzZUludCh0bXApIHwgZmxhZzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdG1wID0gcGFyc2VJbnQodG1wKSAmIH5mbGFnOworCQkJCX0KKwkJCQkKKwkJCQlzdHlsZSA9IHN0eWxlLnN1YnN0cmluZygwLCBpbmRleCkgKyBrZXkgKyAnPScgKyB0bXAgKworCQkJCQkoKGNvbnQgPj0gMCkgPyBzdHlsZS5zdWJzdHJpbmcoY29udCkgOiAnJyk7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBzdHlsZTsKKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBnZXRBbGlnbm1lbnRBc1BvaW50CisJICogCisJICogUmV0dXJucyBhbiA8bXhQb2ludD4gdGhhdCByZXByZXNlbnRzIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBhbGlnbm1lbnQKKwkgKiBmb3IgbnVtZXJpYyBjb21wdXRhdGlvbnMuIFggaXMgLTAuNSBmb3IgY2VudGVyLCAtMSBmb3IgcmlnaHQgYW5kIDAgZm9yCisJICogbGVmdCBhbGlnbm1lbnQuIFkgaXMgLTAuNSBmb3IgbWlkZGxlLCAtMSBmb3IgYm90dG9tIGFuZCAwIGZvciB0b3AKKwkgKiBhbGlnbm1lbnQuIERlZmF1bHQgdmFsdWVzIGZvciBtaXNzaW5nIGFyZ3VtZW50cyBpcyB0b3AsIGxlZnQuCisJICovCisJZ2V0QWxpZ25tZW50QXNQb2ludDogZnVuY3Rpb24oYWxpZ24sIHZhbGlnbikKKwl7CisJCXZhciBkeCA9IDA7CisJCXZhciBkeSA9IDA7CisJCQorCQkvLyBIb3Jpem9udGFsIGFsaWdubWVudAorCQlpZiAoYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fQ0VOVEVSKQorCQl7CisJCQlkeCA9IC0wLjU7CisJCX0KKwkJZWxzZSBpZiAoYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fUklHSFQpCisJCXsKKwkJCWR4ID0gLTE7CisJCX0KKworCQkvLyBWZXJ0aWNhbCBhbGlnbm1lbnQKKwkJaWYgKHZhbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9NSURETEUpCisJCXsKKwkJCWR5ID0gLTAuNTsKKwkJfQorCQllbHNlIGlmICh2YWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fQk9UVE9NKQorCQl7CisJCQlkeSA9IC0xOworCQl9CisJCQorCQlyZXR1cm4gbmV3IG14UG9pbnQoZHgsIGR5KTsKKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBnZXRTaXplRm9yU3RyaW5nCisJICogCisJICogUmV0dXJucyBhbiA8bXhSZWN0YW5nbGU+IHdpdGggdGhlIHNpemUgKHdpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzKSBvZgorCSAqIHRoZSBnaXZlbiBzdHJpbmcuIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gSFRNTCBtYXJrdXAuIE5ld2xpbmVzIHNob3VsZCBiZQorCSAqIGNvbnZlcnRlZCB0byA8YnI+IGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlCisJICogZm9yIHNhbml0aXppbmcgdGhlIEhUTUwgbWFya3VwLgorCSAqIAorCSAqIEV4YW1wbGU6CisJICogCisJICogKGNvZGUpCisJICogdmFyIGxhYmVsID0gZ3JhcGguZ2V0TGFiZWwoY2VsbCkucmVwbGFjZSgvXG4vZywgIjxicj4iKTsKKwkgKiB2YXIgc2l6ZSA9IGdyYXBoLmdldFNpemVGb3JTdHJpbmcobGFiZWwpOworCSAqIChlbmQpCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiB0ZXh0IC0gU3RyaW5nIHdob3NlIHNpemUgc2hvdWxkIGJlIHJldHVybmVkLgorCSAqIGZvbnRTaXplIC0gSW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgZm9udCBzaXplIGluIHBpeGVscy4gRGVmYXVsdCBpcworCSAqIDxteENvbnN0YW50cy5ERUZBVUxUX0ZPTlRTSVpFPi4KKwkgKiBmb250RmFtaWx5IC0gU3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBmb250IGZhbWlseS4gRGVmYXVsdAorCSAqIGlzIDxteENvbnN0YW50cy5ERUZBVUxUX0ZPTlRGQU1JTFk+LgorCSAqIHRleHRXaWR0aCAtIE9wdGlvbmFsIHdpZHRoIGZvciB0ZXh0IHdyYXBwaW5nLgorCSAqLworCWdldFNpemVGb3JTdHJpbmc6IGZ1bmN0aW9uKHRleHQsIGZvbnRTaXplLCBmb250RmFtaWx5LCB0ZXh0V2lkdGgpCisJeworCQlmb250U2l6ZSA9IChmb250U2l6ZSAhPSBudWxsKSA/IGZvbnRTaXplIDogbXhDb25zdGFudHMuREVGQVVMVF9GT05UU0laRTsKKwkJZm9udEZhbWlseSA9IChmb250RmFtaWx5ICE9IG51bGwpID8gZm9udEZhbWlseSA6IG14Q29uc3RhbnRzLkRFRkFVTFRfRk9OVEZBTUlMWTsKKwkJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworCQkKKwkJLy8gU2V0cyB0aGUgZm9udCBzaXplIGFuZCBmYW1pbHkKKwkJZGl2LnN0eWxlLmZvbnRGYW1pbHkgPSBmb250RmFtaWx5OworCQlkaXYuc3R5bGUuZm9udFNpemUgPSBNYXRoLnJvdW5kKGZvbnRTaXplKSArICdweCc7CisJCWRpdi5zdHlsZS5saW5lSGVpZ2h0ID0gTWF0aC5yb3VuZChmb250U2l6ZSAqIG14Q29uc3RhbnRzLkxJTkVfSEVJR0hUKSArICdweCc7CisJCQorCQkvLyBEaXNhYmxlcyBibG9jayBsYXlvdXQgYW5kIG91dHNpZGUgd3JhcHBpbmcgYW5kIGhpZGVzIHRoZSBkaXYKKwkJZGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKwkJZGl2LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKKwkJZGl2LnN0eWxlLmRpc3BsYXkgPSAobXhDbGllbnQuSVNfUVVJUktTKSA/ICdpbmxpbmUnIDogJ2lubGluZS1ibG9jayc7CisJCWRpdi5zdHlsZS56b29tID0gJzEnOworCQkKKwkJaWYgKHRleHRXaWR0aCAhPSBudWxsKQorCQl7CisJCQlkaXYuc3R5bGUud2lkdGggPSB0ZXh0V2lkdGggKyAncHgnOworCQkJZGl2LnN0eWxlLndoaXRlU3BhY2UgPSAnbm9ybWFsJzsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRpdi5zdHlsZS53aGl0ZVNwYWNlID0gJ25vd3JhcCc7CisJCX0KKwkJCisJCS8vIEFkZHMgdGhlIHRleHQgYW5kIGluc2VydHMgaW50byBET00gZm9yIHVwZGF0aW5nIG9mIHNpemUKKwkJZGl2LmlubmVySFRNTCA9IHRleHQ7CisJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTsKKwkJCisJCS8vIEdldHMgdGhlIHNpemUgYW5kIHJlbW92ZXMgZnJvbSBET00KKwkJdmFyIHNpemUgPSBuZXcgbXhSZWN0YW5nbGUoMCwgMCwgZGl2Lm9mZnNldFdpZHRoLCBkaXYub2Zmc2V0SGVpZ2h0KTsKKwkJZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkaXYpOworCQkKKwkJcmV0dXJuIHNpemU7CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0Vmlld1htbAorCSAqLworCWdldFZpZXdYbWw6IGZ1bmN0aW9uKGdyYXBoLCBzY2FsZSwgY2VsbHMsIHgwLCB5MCkKKwl7CisJCXgwID0gKHgwICE9IG51bGwpID8geDAgOiAwOworCQl5MCA9ICh5MCAhPSBudWxsKSA/IHkwIDogMDsKKwkJc2NhbGUgPSAoc2NhbGUgIT0gbnVsbCkgPyBzY2FsZSA6IDE7CisKKwkJaWYgKGNlbGxzID09IG51bGwpCisJCXsKKwkJCXZhciBtb2RlbCA9IGdyYXBoLmdldE1vZGVsKCk7CisJCQljZWxscyA9IFttb2RlbC5nZXRSb290KCldOworCQl9CisJCQorCQl2YXIgdmlldyA9IGdyYXBoLmdldFZpZXcoKTsKKwkJdmFyIHJlc3VsdCA9IG51bGw7CisKKwkJLy8gRGlzYWJsZXMgZXZlbnRzIG9uIHRoZSB2aWV3CisJCXZhciBldmVudHNFbmFibGVkID0gdmlldy5pc0V2ZW50c0VuYWJsZWQoKTsKKwkJdmlldy5zZXRFdmVudHNFbmFibGVkKGZhbHNlKTsKKworCQkvLyBXb3JrYXJvdW5kIGZvciBsYWJlbCBib3VuZHMgbm90IHRha2VuIGludG8gYWNjb3VudCBmb3IgaW1hZ2UgZXhwb3J0LgorCQkvLyBDcmVhdGVzIGEgdGVtcG9yYXJ5IGRyYXcgcGFuZSB3aGljaCBpcyB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQuCisJCS8vIFRleHQgcmVuZGVyaW5nIGlzIHJlcXVpcmVkIGZvciBmaW5kaW5nIHRoZSBib3VuZHMgb2YgdGhlIGxhYmVscy4KKwkJdmFyIGRyYXdQYW5lID0gdmlldy5kcmF3UGFuZTsKKwkJdmFyIG92ZXJsYXlQYW5lID0gdmlldy5vdmVybGF5UGFuZTsKKworCQlpZiAoZ3JhcGguZGlhbGVjdCA9PSBteENvbnN0YW50cy5ESUFMRUNUX1NWRykKKwkJeworCQkJdmlldy5kcmF3UGFuZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhteENvbnN0YW50cy5OU19TVkcsICdnJyk7CisJCQl2aWV3LmNhbnZhcy5hcHBlbmRDaGlsZCh2aWV3LmRyYXdQYW5lKTsKKworCQkJLy8gUmVkaXJlY3RzIGNlbGwgb3ZlcmxheXMgaW50byB0ZW1wb3JhcnkgY29udGFpbmVyCisJCQl2aWV3Lm92ZXJsYXlQYW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG14Q29uc3RhbnRzLk5TX1NWRywgJ2cnKTsKKwkJCXZpZXcuY2FudmFzLmFwcGVuZENoaWxkKHZpZXcub3ZlcmxheVBhbmUpOworCQl9CisJCWVsc2UKKwkJeworCQkJdmlldy5kcmF3UGFuZSA9IHZpZXcuZHJhd1BhbmUuY2xvbmVOb2RlKGZhbHNlKTsKKwkJCXZpZXcuY2FudmFzLmFwcGVuZENoaWxkKHZpZXcuZHJhd1BhbmUpOworCQkJCisJCQkvLyBSZWRpcmVjdHMgY2VsbCBvdmVybGF5cyBpbnRvIHRlbXBvcmFyeSBjb250YWluZXIKKwkJCXZpZXcub3ZlcmxheVBhbmUgPSB2aWV3Lm92ZXJsYXlQYW5lLmNsb25lTm9kZShmYWxzZSk7CisJCQl2aWV3LmNhbnZhcy5hcHBlbmRDaGlsZCh2aWV3Lm92ZXJsYXlQYW5lKTsKKwkJfQorCisJCS8vIFJlc2V0cyB0aGUgdHJhbnNsYXRpb24KKwkJdmFyIHRyYW5zbGF0ZSA9IHZpZXcuZ2V0VHJhbnNsYXRlKCk7CisJCXZpZXcudHJhbnNsYXRlID0gbmV3IG14UG9pbnQoeDAsIHkwKTsKKworCQkvLyBDcmVhdGVzIHRoZSB0ZW1wb3JhcnkgY2VsbCBzdGF0ZXMgaW4gdGhlIHZpZXcKKwkJdmFyIHRlbXAgPSBuZXcgbXhUZW1wb3JhcnlDZWxsU3RhdGVzKGdyYXBoLmdldFZpZXcoKSwgc2NhbGUsIGNlbGxzKTsKKworCQl0cnkKKwkJeworCQkJdmFyIGVuYyA9IG5ldyBteENvZGVjKCk7CisJCQlyZXN1bHQgPSBlbmMuZW5jb2RlKGdyYXBoLmdldFZpZXcoKSk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCQl0ZW1wLmRlc3Ryb3koKTsKKwkJCXZpZXcudHJhbnNsYXRlID0gdHJhbnNsYXRlOworCQkJdmlldy5jYW52YXMucmVtb3ZlQ2hpbGQodmlldy5kcmF3UGFuZSk7CisJCQl2aWV3LmNhbnZhcy5yZW1vdmVDaGlsZCh2aWV3Lm92ZXJsYXlQYW5lKTsKKwkJCXZpZXcuZHJhd1BhbmUgPSBkcmF3UGFuZTsKKwkJCXZpZXcub3ZlcmxheVBhbmUgPSBvdmVybGF5UGFuZTsKKwkJCXZpZXcuc2V0RXZlbnRzRW5hYmxlZChldmVudHNFbmFibGVkKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0U2NhbGVGb3JQYWdlQ291bnQKKwkgKiAKKwkgKiBSZXR1cm5zIHRoZSBzY2FsZSB0byBiZSB1c2VkIGZvciBwcmludGluZyB0aGUgZ3JhcGggd2l0aCB0aGUgZ2l2ZW4KKwkgKiBib3VuZHMgYWNyb3NzIHRoZSBzcGVjaWZpZXMgbnVtYmVyIG9mIHBhZ2VzIHdpdGggdGhlIGdpdmVuIGZvcm1hdC4gVGhlCisJICogc2NhbGUgaXMgYWx3YXlzIGNvbXB1dGVkIHN1Y2ggdGhhdCBpdCBnaXZlbiB0aGUgZ2l2ZW4gYW1vdW50IG9yIGZld2VyCisJICogcGFnZXMgaW4gdGhlIHByaW50IG91dHB1dC4gU2VlIDxteFByaW50UHJldmlldz4gZm9yIGFuIGV4YW1wbGUuCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBwYWdlQ291bnQgLSBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgcHJpbnQgb3V0cHV0LgorCSAqIGdyYXBoIC0gPG14R3JhcGg+IHRoYXQgc2hvdWxkIGJlIHByaW50ZWQuCisJICogcGFnZUZvcm1hdCAtIE9wdGlvbmFsIDxteFJlY3RhbmdsZT4gdGhhdCBzcGVjaWZpZXMgdGhlIHBhZ2UgZm9ybWF0LgorCSAqIERlZmF1bHQgaXMgPG14Q29uc3RhbnRzLlBBR0VfRk9STUFUX0E0X1BPUlRSQUlUPi4KKwkgKiBib3JkZXIgLSBUaGUgYm9yZGVyIGFsb25nIGVhY2ggc2lkZSBvZiBldmVyeSBwYWdlLgorCSAqLworCWdldFNjYWxlRm9yUGFnZUNvdW50OiBmdW5jdGlvbihwYWdlQ291bnQsIGdyYXBoLCBwYWdlRm9ybWF0LCBib3JkZXIpCisJeworCQlpZiAocGFnZUNvdW50IDwgMSkKKwkJeworCQkJLy8gV2UgY2FuJ3Qgd29yayB3aXRoIGxlc3MgdGhhbiAxIHBhZ2UsIHJldHVybiBubyBzY2FsZQorCQkJLy8gY2hhbmdlCisJCQlyZXR1cm4gMTsKKwkJfQorCQkKKwkJcGFnZUZvcm1hdCA9IChwYWdlRm9ybWF0ICE9IG51bGwpID8gcGFnZUZvcm1hdCA6IG14Q29uc3RhbnRzLlBBR0VfRk9STUFUX0E0X1BPUlRSQUlUOworCQlib3JkZXIgPSAoYm9yZGVyICE9IG51bGwpID8gYm9yZGVyIDogMDsKKwkJCisJCXZhciBhdmFpbGFibGVQYWdlV2lkdGggPSBwYWdlRm9ybWF0LndpZHRoIC0gKGJvcmRlciAqIDIpOworCQl2YXIgYXZhaWxhYmxlUGFnZUhlaWdodCA9IHBhZ2VGb3JtYXQuaGVpZ2h0IC0gKGJvcmRlciAqIDIpOworCisJCS8vIFdvcmsgb3V0IHRoZSBudW1iZXIgb2YgcGFnZXMgcmVxdWlyZWQgaWYgdGhlCisJCS8vIGdyYXBoIGlzIG5vdCBzY2FsZWQuCisJCXZhciBncmFwaEJvdW5kcyA9IGdyYXBoLmdldEdyYXBoQm91bmRzKCkuY2xvbmUoKTsKKwkJdmFyIHNjID0gZ3JhcGguZ2V0VmlldygpLmdldFNjYWxlKCk7CisJCWdyYXBoQm91bmRzLndpZHRoIC89IHNjOworCQlncmFwaEJvdW5kcy5oZWlnaHQgLz0gc2M7CisJCXZhciBncmFwaFdpZHRoID0gZ3JhcGhCb3VuZHMud2lkdGg7CisJCXZhciBncmFwaEhlaWdodCA9IGdyYXBoQm91bmRzLmhlaWdodDsKKworCQl2YXIgc2NhbGUgPSAxOworCQkKKwkJLy8gVGhlIHJhdGlvIG9mIHRoZSB3aWR0aC9oZWlnaHQgZm9yIGVhY2ggcHJpbnRlciBwYWdlCisJCXZhciBwYWdlRm9ybWF0QXNwZWN0UmF0aW8gPSBhdmFpbGFibGVQYWdlV2lkdGggLyBhdmFpbGFibGVQYWdlSGVpZ2h0OworCQkvLyBUaGUgcmF0aW8gb2YgdGhlIHdpZHRoL2hlaWdodCBmb3IgdGhlIGdyYXBoIHRvIGJlIHByaW50ZXIKKwkJdmFyIGdyYXBoQXNwZWN0UmF0aW8gPSBncmFwaFdpZHRoIC8gZ3JhcGhIZWlnaHQ7CisJCQorCQkvLyBUaGUgcmF0aW8gb2YgaG9yaXpvbnRhbCBwYWdlcyAvIHZlcnRpY2FsIHBhZ2VzIGZvciB0aGlzIAorCQkvLyBncmFwaCB0byBtYWludGFpbiBpdHMgYXNwZWN0IHJhdGlvIG9uIHRoaXMgcGFnZSBmb3JtYXQKKwkJdmFyIHBhZ2VzQXNwZWN0UmF0aW8gPSBncmFwaEFzcGVjdFJhdGlvIC8gcGFnZUZvcm1hdEFzcGVjdFJhdGlvOworCQkKKwkJLy8gRmFjdG9yIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgcGFnZSBjb3VudCB1cCBhbmQgZG93biAKKwkJLy8gYnkgdGhlIHBhZ2VzIGFzcGVjdCByYXRpbyB0byBvYnRhaW4gYSBob3Jpem9udGFsIGFuZCAKKwkJLy8gdmVydGljYWwgcGFnZSBjb3VudCB0aGF0IGFkZHMgdXAgdG8gdGhlIHBhZ2UgY291bnQKKwkJLy8gYW5kIGhhcyB0aGUgY29ycmVjdCBhc3BlY3QgcmF0aW8KKwkJdmFyIHBhZ2VSb290ID0gTWF0aC5zcXJ0KHBhZ2VDb3VudCk7CisJCXZhciBwYWdlc0FzcGVjdFJhdGlvU3FydCA9IE1hdGguc3FydChwYWdlc0FzcGVjdFJhdGlvKTsKKwkJdmFyIG51bVJvd1BhZ2VzID0gcGFnZVJvb3QgKiBwYWdlc0FzcGVjdFJhdGlvU3FydDsKKwkJdmFyIG51bUNvbHVtblBhZ2VzID0gcGFnZVJvb3QgLyBwYWdlc0FzcGVjdFJhdGlvU3FydDsKKworCQkvLyBUaGVzZSB2YWx1ZSBhcmUgcmFyZWx5IG1vcmUgdGhhbiAyIHJvdW5kaW5nIGRvd25zIGF3YXkgZnJvbQorCQkvLyBhIHRvdGFsIHRoYXQgbWVldHMgdGhlIHBhZ2UgY291bnQuIEluIGNhc2VzIG9mIG9uZSBiZWluZyBsZXNzIAorCQkvLyB0aGFuIDEgcGFnZSwgdGhlIG90aGVyIHZhbHVlIGNhbiBiZSB0b28gaGlnaCBhbmQgdGFrZSBtb3JlIGl0ZXJhdGlvbnMgCisJCS8vIEluIHRoaXMgY2FzZSwganVzdCBjaGFuZ2UgdGhhdCB2YWx1ZSB0byBiZSB0aGUgcGFnZSBjb3VudCwgc2luY2UgCisJCS8vIHdlIGtub3cgdGhlIG90aGVyIHZhbHVlIGlzIDEKKwkJaWYgKG51bVJvd1BhZ2VzIDwgMSAmJiBudW1Db2x1bW5QYWdlcyA+IHBhZ2VDb3VudCkKKwkJeworCQkJdmFyIHNjYWxlQ2hhbmdlID0gbnVtQ29sdW1uUGFnZXMgLyBwYWdlQ291bnQ7CisJCQludW1Db2x1bW5QYWdlcyA9IHBhZ2VDb3VudDsKKwkJCW51bVJvd1BhZ2VzIC89IHNjYWxlQ2hhbmdlOworCQl9CisJCQorCQlpZiAobnVtQ29sdW1uUGFnZXMgPCAxICYmIG51bVJvd1BhZ2VzID4gcGFnZUNvdW50KQorCQl7CisJCQl2YXIgc2NhbGVDaGFuZ2UgPSBudW1Sb3dQYWdlcyAvIHBhZ2VDb3VudDsKKwkJCW51bVJvd1BhZ2VzID0gcGFnZUNvdW50OworCQkJbnVtQ29sdW1uUGFnZXMgLz0gc2NhbGVDaGFuZ2U7CisJCX0JCQorCisJCXZhciBjdXJyZW50VG90YWxQYWdlcyA9IE1hdGguY2VpbChudW1Sb3dQYWdlcykgKiBNYXRoLmNlaWwobnVtQ29sdW1uUGFnZXMpOworCisJCXZhciBudW1Mb29wcyA9IDA7CisJCQorCQkvLyBJdGVyYXRlIHRocm91Z2ggd2hpbGUgdGhlIHJvdW5kZWQgdXAgbnVtYmVyIG9mIHBhZ2VzIGNvbWVzIHRvCisJCS8vIGEgdG90YWwgZ3JlYXRlciB0aGFuIHRoZSByZXF1aXJlZCBudW1iZXIKKwkJd2hpbGUgKGN1cnJlbnRUb3RhbFBhZ2VzID4gcGFnZUNvdW50KQorCQl7CisJCQkvLyBSb3VuZCBkb3duIHRoZSBwYWdlIGNvdW50IChyb3dzIG9yIGNvbHVtbnMpIHRoYXQgaXMKKwkJCS8vIGNsb3Nlc3QgdG8gaXRzIG5leHQgaW50ZWdlciBkb3duIGluIHBlcmNlbnRhZ2UgdGVybXMuCisJCQkvLyBpLmUuIFJlZHVjZSB0aGUgcGFnZSB0b3RhbCBieSByZWR1Y2luZyB0aGUgdG90YWwKKwkJCS8vIHBhZ2UgYXJlYSBieSB0aGUgbGVhc3QgcG9zc2libGUgYW1vdW50CisKKwkJCXZhciByb3VuZFJvd0Rvd25Qcm9wb3J0aW9uID0gTWF0aC5mbG9vcihudW1Sb3dQYWdlcykgLyBudW1Sb3dQYWdlczsKKwkJCXZhciByb3VuZENvbHVtbkRvd25Qcm9wb3J0aW9uID0gTWF0aC5mbG9vcihudW1Db2x1bW5QYWdlcykgLyBudW1Db2x1bW5QYWdlczsKKwkJCQorCQkJLy8gSWYgdGhlIHJvdW5kIGRvd24gcHJvcG9ydGlvbiBpcywgd29yayBvdXQgdGhlIHByb3BvcnRpb24gdG8KKwkJCS8vIHJvdW5kIGRvd24gdG8gMSBwYWdlIGxlc3MKKwkJCWlmIChyb3VuZFJvd0Rvd25Qcm9wb3J0aW9uID09IDEpCisJCQl7CisJCQkJcm91bmRSb3dEb3duUHJvcG9ydGlvbiA9IE1hdGguZmxvb3IobnVtUm93UGFnZXMtMSkgLyBudW1Sb3dQYWdlczsKKwkJCX0KKwkJCWlmIChyb3VuZENvbHVtbkRvd25Qcm9wb3J0aW9uID09IDEpCisJCQl7CisJCQkJcm91bmRDb2x1bW5Eb3duUHJvcG9ydGlvbiA9IE1hdGguZmxvb3IobnVtQ29sdW1uUGFnZXMtMSkgLyBudW1Db2x1bW5QYWdlczsKKwkJCX0KKwkJCQorCQkJLy8gQ2hlY2sgd2hpY2ggcm91bmRpbmcgZG93biBpcyBzbWFsbGVyLCBidXQgaW4gdGhlIGNhc2Ugb2YgdmVyeSBzbWFsbCByb3VuZGluZ3MKKwkJCS8vIHRyeSB0aGUgb3RoZXIgZGltZW5zaW9uIGluc3RlYWQKKwkJCXZhciBzY2FsZUNoYW5nZSA9IDE7CisJCQkKKwkJCS8vIFVzZSB0aGUgaGlnaGVyIG9mIHRoZSB0d28gdmFsdWVzCisJCQlpZiAocm91bmRSb3dEb3duUHJvcG9ydGlvbiA+IHJvdW5kQ29sdW1uRG93blByb3BvcnRpb24pCisJCQl7CisJCQkJc2NhbGVDaGFuZ2UgPSByb3VuZFJvd0Rvd25Qcm9wb3J0aW9uOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXNjYWxlQ2hhbmdlID0gcm91bmRDb2x1bW5Eb3duUHJvcG9ydGlvbjsKKwkJCX0KKworCQkJbnVtUm93UGFnZXMgPSBudW1Sb3dQYWdlcyAqIHNjYWxlQ2hhbmdlOworCQkJbnVtQ29sdW1uUGFnZXMgPSBudW1Db2x1bW5QYWdlcyAqIHNjYWxlQ2hhbmdlOworCQkJY3VycmVudFRvdGFsUGFnZXMgPSBNYXRoLmNlaWwobnVtUm93UGFnZXMpICogTWF0aC5jZWlsKG51bUNvbHVtblBhZ2VzKTsKKwkJCQorCQkJbnVtTG9vcHMrKzsKKwkJCQorCQkJaWYgKG51bUxvb3BzID4gMTApCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLyBXb3JrIG91dCB0aGUgc2NhbGUgZnJvbSB0aGUgbnVtYmVyIG9mIHJvdyBwYWdlcyByZXF1aXJlZAorCQkvLyBUaGUgY29sdW1uIHBhZ2VzIHdpbGwgZ2l2ZSB0aGUgc2FtZSB2YWx1ZQorCQl2YXIgcG9zdGVyV2lkdGggPSBhdmFpbGFibGVQYWdlV2lkdGggKiBudW1Sb3dQYWdlczsKKwkJc2NhbGUgPSBwb3N0ZXJXaWR0aCAvIGdyYXBoV2lkdGg7CisJCQorCQkvLyBBbGxvdyBmb3Igcm91bmRpbmcgZXJyb3JzCisJCXJldHVybiBzY2FsZSAqIDAuOTk5OTk7CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogc2hvdworCSAqIAorCSAqIENvcGllcyB0aGUgc3R5bGVzIGFuZCB0aGUgbWFya3VwIGZyb20gdGhlIGdyYXBoJ3MgY29udGFpbmVyIGludG8gdGhlCisJICogZ2l2ZW4gZG9jdW1lbnQgYW5kIHJlbW92ZXMgYWxsIGN1cnNvciBzdHlsZXMuIFRoZSBkb2N1bWVudCBpcyByZXR1cm5lZC4KKwkgKiAKKwkgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGRvY3VtZW50IHdpdGggdGhlIGdyYXBoLgorCSAqIElmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zIHdpdGggbWlzc2luZyBzdHlsZXNoZWV0cyBpbiBJRSB0aGVuIHRyeSBhZGRpbmcKKwkgKiB0aGUgZG9tYWluIHRvIHRoZSB0cnVzdGVkIHNpdGVzLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogZ3JhcGggLSA8bXhHcmFwaD4gdG8gYmUgY29waWVkLgorCSAqIGRvYyAtIERvY3VtZW50IHdoZXJlIHRoZSBuZXcgZ3JhcGggaXMgY3JlYXRlZC4KKwkgKiB4MCAtIFgtY29vcmRpbmF0ZSBvZiB0aGUgZ3JhcGggdmlldyBvcmlnaW4uIERlZmF1bHQgaXMgMC4KKwkgKiB5MCAtIFktY29vcmRpbmF0ZSBvZiB0aGUgZ3JhcGggdmlldyBvcmlnaW4uIERlZmF1bHQgaXMgMC4KKwkgKiB3IC0gT3B0aW9uYWwgd2lkdGggb2YgdGhlIGdyYXBoIHZpZXcuCisJICogaCAtIE9wdGlvbmFsIGhlaWdodCBvZiB0aGUgZ3JhcGggdmlldy4KKwkgKi8KKwlzaG93OiBmdW5jdGlvbihncmFwaCwgZG9jLCB4MCwgeTAsIHcsIGgpCisJeworCQl4MCA9ICh4MCAhPSBudWxsKSA/IHgwIDogMDsKKwkJeTAgPSAoeTAgIT0gbnVsbCkgPyB5MCA6IDA7CisJCQorCQlpZiAoZG9jID09IG51bGwpCisJCXsKKwkJCXZhciB3bmQgPSB3aW5kb3cub3BlbigpOworCQkJZG9jID0gd25kLmRvY3VtZW50OworCQl9CisJCWVsc2UKKwkJeworCQkJZG9jLm9wZW4oKTsKKwkJfQorCisJCS8vIFdvcmthcm91bmQgZm9yIG1pc3NpbmcgcHJpbnQgb3V0cHV0IGluIElFOSBzdGFuZGFyZHMKKwkJaWYgKGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSA5KQorCQl7CisJCQlkb2Mud3JpdGVsbignPCEtLVtpZiBJRV0+PG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT05Ij48IVtlbmRpZl0tLT4nKTsKKwkJfQorCQkKKwkJdmFyIGJvdW5kcyA9IGdyYXBoLmdldEdyYXBoQm91bmRzKCk7CisJCXZhciBkeCA9IE1hdGguY2VpbCh4MCAtIGJvdW5kcy54KTsKKwkJdmFyIGR5ID0gTWF0aC5jZWlsKHkwIC0gYm91bmRzLnkpOworCQkKKwkJaWYgKHcgPT0gbnVsbCkKKwkJeworCQkJdyA9IE1hdGguY2VpbChib3VuZHMud2lkdGggKyB4MCkgKyBNYXRoLmNlaWwoTWF0aC5jZWlsKGJvdW5kcy54KSAtIGJvdW5kcy54KTsKKwkJfQorCQkKKwkJaWYgKGggPT0gbnVsbCkKKwkJeworCQkJaCA9IE1hdGguY2VpbChib3VuZHMuaGVpZ2h0ICsgeTApICsgTWF0aC5jZWlsKE1hdGguY2VpbChib3VuZHMueSkgLSBib3VuZHMueSk7CisJCX0KKwkJCisJCS8vIE5lZWRzIGEgc3BlY2lhbCB3YXkgb2YgY3JlYXRpbmcgdGhlIHBhZ2Ugc28gdGhhdCBubyBjbGljayBpcyByZXF1aXJlZAorCQkvLyB0byByZWZyZXNoIHRoZSBjb250ZW50cyBhZnRlciB0aGUgZXh0ZXJuYWwgQ1NTIHN0eWxlcyBoYXZlIGJlZW4gbG9hZGVkLgorCQkvLyBUbyBhdm9pZCBhIGNsaWNrIG9yIHByb2dyYW1tYXRpYyByZWZyZXNoLCB0aGUgc3R5bGVTaGVldHNbXS5jc3NUZXh0CisJCS8vIHByb3BlcnR5IGlzIGNvcGllZCBvdmVyIGZyb20gdGhlIG9yaWdpbmFsIGRvY3VtZW50LgorCQlpZiAobXhDbGllbnQuSVNfSUUgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09IDExKQorCQl7CisJCQl2YXIgaHRtbCA9ICc8aHRtbD48aGVhZD4nOworCisJCQl2YXIgYmFzZSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdiYXNlJyk7CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgYmFzZS5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQlodG1sICs9IGJhc2VbaV0ub3V0ZXJIVE1MOworCQkJfQorCisJCQlodG1sICs9ICc8c3R5bGU+JzsKKworCQkJLy8gQ29waWVzIHRoZSBzdHlsZXNoZWV0cyB3aXRob3V0IGhhdmluZyB0byBsb2FkIHRoZW0gYWdhaW4KKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgZG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJdHJ5CisJCQkJeworCQkJCQlodG1sICs9IGRvY3VtZW50LnN0eWxlU2hlZXRzW2ldLmNzc1RleHQ7CisJCQkJfQorCQkJCWNhdGNoIChlKQorCQkJCXsKKwkJCQkJLy8gaWdub3JlIHNlY3VyaXR5IGV4Y2VwdGlvbgorCQkJCX0KKwkJCX0KKworCQkJaHRtbCArPSAnPC9zdHlsZT48L2hlYWQ+PGJvZHkgc3R5bGU9Im1hcmdpbjowcHg7Ij4nOworCQkJCisJCQkvLyBDb3BpZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBncmFwaCBjb250YWluZXIKKwkJCWh0bWwgKz0gJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO292ZXJmbG93OmhpZGRlbjt3aWR0aDonICsgdyArICdweDtoZWlnaHQ6JyArIGggKyAncHg7Ij48ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTtsZWZ0OicgKyBkeCArICdweDt0b3A6JyArIGR5ICsgJ3B4OyI+JzsKKwkJCWh0bWwgKz0gZ3JhcGguY29udGFpbmVyLmlubmVySFRNTDsKKwkJCWh0bWwgKz0gJzwvZGl2PjwvZGl2PjwvYm9keT48aHRtbD4nOworCisJCQlkb2Mud3JpdGVsbihodG1sKTsKKwkJCWRvYy5jbG9zZSgpOworCQl9CisJCWVsc2UKKwkJeworCQkJZG9jLndyaXRlbG4oJzxodG1sPjxoZWFkPicpOworCQkJCisJCQl2YXIgYmFzZSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdiYXNlJyk7CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgYmFzZS5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQlkb2Mud3JpdGVsbihteFV0aWxzLmdldE91dGVySHRtbChiYXNlW2ldKSk7CisJCQl9CisJCQkKKwkJCXZhciBsaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsaW5rJyk7CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJZG9jLndyaXRlbG4obXhVdGlscy5nZXRPdXRlckh0bWwobGlua3NbaV0pKTsKKwkJCX0KKwkKKwkJCXZhciBzdHlsZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3R5bGUnKTsKKwkJCQorCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJZG9jLndyaXRlbG4obXhVdGlscy5nZXRPdXRlckh0bWwoc3R5bGVzW2ldKSk7CisJCQl9CisKKwkJCWRvYy53cml0ZWxuKCc8L2hlYWQ+PGJvZHkgc3R5bGU9Im1hcmdpbjowcHg7Ij48L2JvZHk+PC9odG1sPicpOworCQkJZG9jLmNsb3NlKCk7CisKKwkJCXZhciBvdXRlciA9IGRvYy5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKwkJCW91dGVyLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKwkJCW91dGVyLm92ZXJmbG93ID0gJ2hpZGRlbic7CisJCQlvdXRlci5zdHlsZS53aWR0aCA9IHcgKyAncHgnOworCQkJb3V0ZXIuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7CisKKwkJCS8vIFJlcXVpcmVkIGZvciBIVE1MIGxhYmVscyBpZiBmb3JlaWduT2JqZWN0cyBhcmUgZGlzYWJsZWQKKwkJCXZhciBkaXYgPSBkb2MuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCQlkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOworCQkJZGl2LnN0eWxlLmxlZnQgPSBkeCArICdweCc7CisJCQlkaXYuc3R5bGUudG9wID0gZHkgKyAncHgnOworCisJCQl2YXIgbm9kZSA9IGdyYXBoLmNvbnRhaW5lci5maXJzdENoaWxkOworCQkJdmFyIHN2ZyA9IG51bGw7CisJCQkKKwkJCXdoaWxlIChub2RlICE9IG51bGwpCisJCQl7CisJCQkJdmFyIGNsb25lID0gbm9kZS5jbG9uZU5vZGUodHJ1ZSk7CisJCQkJCisJCQkJaWYgKG5vZGUgPT0gZ3JhcGgudmlldy5kcmF3UGFuZS5vd25lclNWR0VsZW1lbnQpCisJCQkJeworCQkJCQlvdXRlci5hcHBlbmRDaGlsZChjbG9uZSk7CisJCQkJCXN2ZyA9IGNsb25lOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlkaXYuYXBwZW5kQ2hpbGQoY2xvbmUpOworCQkJCX0KKwkJCQkKKwkJCQlub2RlID0gbm9kZS5uZXh0U2libGluZzsKKwkJCX0KKworCQkJZG9jLmJvZHkuYXBwZW5kQ2hpbGQob3V0ZXIpOworCQkJCisJCQlpZiAoZGl2LmZpcnN0Q2hpbGQgIT0gbnVsbCkKKwkJCXsKKwkJCQlkb2MuYm9keS5hcHBlbmRDaGlsZChkaXYpOworCQkJfQorCQkJCQkJCisJCQlpZiAoc3ZnICE9IG51bGwpCisJCQl7CisJCQkJc3ZnLnN0eWxlLm1pbldpZHRoID0gJyc7CisJCQkJc3ZnLnN0eWxlLm1pbkhlaWdodCA9ICcnOworCQkJCXN2Zy5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgZHggKyAnLCcgKyBkeSArICcpJyk7CisJCQl9CisJCX0KKwkJCisJCW14VXRpbHMucmVtb3ZlQ3Vyc29ycyhkb2MuYm9keSk7CisJCisJCXJldHVybiBkb2M7CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogcHJpbnRTY3JlZW4KKwkgKiAKKwkgKiBQcmludHMgdGhlIHNwZWNpZmllZCBncmFwaCB1c2luZyBhIG5ldyB3aW5kb3cgYW5kIHRoZSBidWlsdC1pbiBwcmludAorCSAqIGRpYWxvZy4KKwkgKiAKKwkgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGRvY3VtZW50IHdpdGggdGhlIGdyYXBoLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogZ3JhcGggLSA8bXhHcmFwaD4gdG8gYmUgcHJpbnRlZC4KKwkgKi8KKwlwcmludFNjcmVlbjogZnVuY3Rpb24oZ3JhcGgpCisJeworCQl2YXIgd25kID0gd2luZG93Lm9wZW4oKTsKKwkJdmFyIGJvdW5kcyA9IGdyYXBoLmdldEdyYXBoQm91bmRzKCk7CisJCW14VXRpbHMuc2hvdyhncmFwaCwgd25kLmRvY3VtZW50KTsKKwkJCisJCXZhciBwcmludCA9IGZ1bmN0aW9uKCkKKwkJeworCQkJd25kLmZvY3VzKCk7CisJCQl3bmQucHJpbnQoKTsKKwkJCXduZC5jbG9zZSgpOworCQl9OworCQkKKwkJLy8gV29ya2Fyb3VuZCBmb3IgR29vZ2xlIENocm9tZSB3aGljaCBuZWVkcyBhIGJpdCBvZiBhCisJCS8vIGRlbGF5IGluIG9yZGVyIHRvIHJlbmRlciB0aGUgU1ZHIGNvbnRlbnRzCisJCWlmIChteENsaWVudC5JU19HQykKKwkJeworCQkJd25kLnNldFRpbWVvdXQocHJpbnQsIDUwMCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwcmludCgpOworCQl9CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogcG9wdXAKKwkgKiAKKwkgKiBTaG93cyB0aGUgc3BlY2lmaWVkIHRleHQgY29udGVudCBpbiBhIG5ldyA8bXhXaW5kb3c+IG9yIGEgbmV3IGJyb3dzZXIKKwkgKiB3aW5kb3cgaWYgaXNJbnRlcm5hbFdpbmRvdyBpcyBmYWxzZS4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGNvbnRlbnQgLSBTdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIHRleHQgdG8gYmUgZGlzcGxheWVkLgorCSAqIGlzSW50ZXJuYWxXaW5kb3cgLSBPcHRpb25hbCBib29sZWFuIGluZGljYXRpbmcgaWYgYW4gbXhXaW5kb3cgc2hvdWxkIGJlCisJICogdXNlZCBpbnN0ZWFkIG9mIGEgbmV3IGJyb3dzZXIgd2luZG93LiBEZWZhdWx0IGlzIGZhbHNlLgorCSAqLworCXBvcHVwOiBmdW5jdGlvbihjb250ZW50LCBpc0ludGVybmFsV2luZG93KQorCXsKKwkgICAJaWYgKGlzSW50ZXJuYWxXaW5kb3cpCisJICAgCXsKKwkJCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKwkJCQorCQkJZGl2LnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCc7CisJCQlkaXYuc3R5bGUud2lkdGggPSAnNjM2cHgnOworCQkJZGl2LnN0eWxlLmhlaWdodCA9ICc0NjBweCc7CisJCQkKKwkJCXZhciBwcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTsKKwkJICAgIHByZS5pbm5lckhUTUwgPSBteFV0aWxzLmh0bWxFbnRpdGllcyhjb250ZW50LCBmYWxzZSkuCisJCSAgICAJcmVwbGFjZSgvXG4vZywnPGJyPicpLnJlcGxhY2UoLyAvZywgJyZuYnNwOycpOworCQkJCisJCQlkaXYuYXBwZW5kQ2hpbGQocHJlKTsKKwkJCQorCQkJdmFyIHcgPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoOworCQkJdmFyIGggPSBNYXRoLm1heChkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCB8fCAwLCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KQorCQkJdmFyIHduZCA9IG5ldyBteFdpbmRvdygnUG9wdXAgV2luZG93JywgZGl2LAorCQkJCXcvMi0zMjAsIGgvMi0yNDAsIDY0MCwgNDgwLCBmYWxzZSwgdHJ1ZSk7CisKKwkJCXduZC5zZXRDbG9zYWJsZSh0cnVlKTsKKwkJCXduZC5zZXRWaXNpYmxlKHRydWUpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gV3JhcHMgdXAgdGhlIFhNTCBjb250ZW50IGluIGEgdGV4dGFyZWEKKwkJCWlmIChteENsaWVudC5JU19OUykKKwkJCXsKKwkJCSAgICB2YXIgd25kID0gd2luZG93Lm9wZW4oKTsKKwkJCQl3bmQuZG9jdW1lbnQud3JpdGVsbignPHByZT4nK214VXRpbHMuaHRtbEVudGl0aWVzKGNvbnRlbnQpKyc8L3ByZScpOworCQkJICAgCXduZC5kb2N1bWVudC5jbG9zZSgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJICAgIHZhciB3bmQgPSB3aW5kb3cub3BlbigpOworCQkJICAgIHZhciBwcmUgPSB3bmQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7CisJCQkgICAgcHJlLmlubmVySFRNTCA9IG14VXRpbHMuaHRtbEVudGl0aWVzKGNvbnRlbnQsIGZhbHNlKS4KKwkJCSAgICAJcmVwbGFjZSgvXG4vZywnPGJyPicpLnJlcGxhY2UoLyAvZywgJyZuYnNwOycpOworCQkJICAgCXduZC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHByZSk7CisJCQl9CisJICAgCX0KKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBhbGVydAorCSAqIAorCSAqIERpc3BsYXlzcyB0aGUgZ2l2ZW4gYWxlcnQgaW4gYSBuZXcgZGlhbG9nLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlCisJICogYnVpbHQtaW4gYWxlcnQgZnVuY3Rpb24uIFRoaXMgaXMgdXNlZCB0byBkaXNwbGF5IHZhbGlkYXRpb24gZXJyb3JzIHdoZW4KKwkgKiBjb25uZWN0aW9ucyBjYW5ub3QgYmUgY2hhbmdlZCBvciBjcmVhdGVkLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogbWVzc2FnZSAtIFN0cmluZyBzcGVjaWZ5aW5nIHRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC4KKwkgKi8KKwlhbGVydDogZnVuY3Rpb24obWVzc2FnZSkKKwl7CisJCWFsZXJ0KG1lc3NhZ2UpOworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IHByb21wdAorCSAqIAorCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBtZXNzYWdlIGluIGEgcHJvbXB0IGRpYWxvZy4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCisJICogdGhlIGJ1aWx0LWluIHByb21wdCBmdW5jdGlvbi4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIG1lc3NhZ2UgLSBTdHJpbmcgc3BlY2lmeWluZyB0aGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuCisJICogZGVmYXVsdFZhbHVlIC0gT3B0aW9uYWwgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgdmFsdWUuCisJICovCisJcHJvbXB0OiBmdW5jdGlvbihtZXNzYWdlLCBkZWZhdWx0VmFsdWUpCisJeworCQlyZXR1cm4gcHJvbXB0KG1lc3NhZ2UsIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUgOiAnJyk7CisJfSwKKwkKKwkvKioKKwkgKiBGdW5jdGlvbjogY29uZmlybQorCSAqIAorCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBtZXNzYWdlIGluIGEgY29uZmlybSBkaWFsb2cuIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcworCSAqIHRoZSBidWlsdC1pbiBjb25maXJtIGZ1bmN0aW9uLgorCSAqIAorCSAqIFBhcmFtZXRlcnM6CisJICogCisJICogbWVzc2FnZSAtIFN0cmluZyBzcGVjaWZ5aW5nIHRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC4KKwkgKi8KKwljb25maXJtOiBmdW5jdGlvbihtZXNzYWdlKQorCXsKKwkJcmV0dXJuIGNvbmZpcm0obWVzc2FnZSk7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBlcnJvcgorCSAqIAorCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGEgbmV3IDxteFdpbmRvdz4gb2YgdGhlIGdpdmVuIHdpZHRoLgorCSAqIElmIGNsb3NlIGlzIHRydWUgdGhlbiBhbiBhZGRpdGlvbmFsIGNsb3NlIGJ1dHRvbiBpcyBhZGRlZCB0byB0aGUgd2luZG93LgorCSAqIFRoZSBvcHRpb25hbCBpY29uIHNwZWNpZmllcyB0aGUgaWNvbiB0byBiZSB1c2VkIGZvciB0aGUgd2luZG93LiBEZWZhdWx0CisJICogaXMgPG14VXRpbHMuZXJyb3JJbWFnZT4uCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBtZXNzYWdlIC0gU3RyaW5nIHNwZWNpZnlpbmcgdGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLgorCSAqIHdpZHRoIC0gSW50ZWdlciBzcGVjaWZ5aW5nIHRoZSB3aWR0aCBvZiB0aGUgd2luZG93LgorCSAqIGNsb3NlIC0gT3B0aW9uYWwgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gYWRkIGEgY2xvc2UgYnV0dG9uLgorCSAqIGljb24gLSBPcHRpb25hbCBpY29uIGZvciB0aGUgd2luZG93IGRlY29yYXRpb24uCisJICovCisJZXJyb3I6IGZ1bmN0aW9uKG1lc3NhZ2UsIHdpZHRoLCBjbG9zZSwgaWNvbikKKwl7CisJCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKwkJZGl2LnN0eWxlLnBhZGRpbmcgPSAnMjBweCc7CisKKwkJdmFyIGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOworCQlpbWcuc2V0QXR0cmlidXRlKCdzcmMnLCBpY29uIHx8IG14VXRpbHMuZXJyb3JJbWFnZSk7CisJCWltZy5zZXRBdHRyaWJ1dGUoJ3ZhbGlnbicsICdib3R0b20nKTsKKwkJaW1nLnN0eWxlLnZlcnRpY2FsQWxpZ24gPSAnbWlkZGxlJzsKKwkJZGl2LmFwcGVuZENoaWxkKGltZyk7CisKKwkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdcdTAwYTAnKSk7IC8vICZuYnNwOworCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJ1x1MDBhMCcpKTsgLy8gJm5ic3A7CisJCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnXHUwMGEwJykpOyAvLyAmbmJzcDsKKwkJbXhVdGlscy53cml0ZShkaXYsIG1lc3NhZ2UpOworCisJCXZhciB3ID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDsKKwkJdmFyIGggPSAoZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCk7CisJCXZhciB3YXJuID0gbmV3IG14V2luZG93KG14UmVzb3VyY2VzLmdldChteFV0aWxzLmVycm9yUmVzb3VyY2UpIHx8CisJCQlteFV0aWxzLmVycm9yUmVzb3VyY2UsIGRpdiwgKHctd2lkdGgpLzIsIGgvNCwgd2lkdGgsIG51bGwsCisJCQlmYWxzZSwgdHJ1ZSk7CisKKwkJaWYgKGNsb3NlKQorCQl7CisJCQlteFV0aWxzLmJyKGRpdik7CisJCQkKKwkJCXZhciB0bXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7CisJCQl2YXIgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CisKKwkJCWlmIChteENsaWVudC5JU19JRSkKKwkJCXsKKwkJCQlidXR0b24uc3R5bGUuY3NzVGV4dCA9ICdmbG9hdDpyaWdodCc7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYnV0dG9uLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZmxvYXQ6cmlnaHQnKTsKKwkJCX0KKworCQkJbXhFdmVudC5hZGRMaXN0ZW5lcihidXR0b24sICdjbGljaycsIGZ1bmN0aW9uKGV2dCkKKwkJCXsKKwkJCQl3YXJuLmRlc3Ryb3koKTsKKwkJCX0pOworCisJCQlteFV0aWxzLndyaXRlKGJ1dHRvbiwgbXhSZXNvdXJjZXMuZ2V0KG14VXRpbHMuY2xvc2VSZXNvdXJjZSkgfHwKKwkJCQlteFV0aWxzLmNsb3NlUmVzb3VyY2UpOworCQkJCisJCQl0bXAuYXBwZW5kQ2hpbGQoYnV0dG9uKTsKKwkJCWRpdi5hcHBlbmRDaGlsZCh0bXApOworCQkJCisJCQlteFV0aWxzLmJyKGRpdik7CisJCQkKKwkJCXdhcm4uc2V0Q2xvc2FibGUodHJ1ZSk7CisJCX0KKwkJCisJCXdhcm4uc2V0VmlzaWJsZSh0cnVlKTsKKwkJCisJCXJldHVybiB3YXJuOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogbWFrZURyYWdnYWJsZQorCSAqIAorCSAqIENvbmZpZ3VyZXMgdGhlIGdpdmVuIERPTSBlbGVtZW50IHRvIGFjdCBhcyBhIGRyYWcgc291cmNlIGZvciB0aGUKKwkgKiBzcGVjaWZpZWQgZ3JhcGguIFJldHVybnMgYSBhIG5ldyA8bXhEcmFnU291cmNlPi4gSWYKKwkgKiA8bXhEcmFnU291cmNlLmd1aWRlRW5hYmxlZD4gaXMgZW5hYmxlZCB0aGVuIHRoZSB4IGFuZCB5IGFyZ3VtZW50cyBtdXN0CisJICogYmUgdXNlZCBpbiBmdW5jdCB0byBtYXRjaCB0aGUgcHJldmlldyBsb2NhdGlvbi4KKwkgKiAKKwkgKiBFeGFtcGxlOgorCSAqIAorCSAqIChjb2RlKQorCSAqIHZhciBmdW5jdCA9IGZ1bmN0aW9uKGdyYXBoLCBldnQsIGNlbGwsIHgsIHkpCisJICogeworCSAqICAgaWYgKGdyYXBoLmNhbkltcG9ydENlbGwoY2VsbCkpCisJICogICB7CisJICogICAgIHZhciBwYXJlbnQgPSBncmFwaC5nZXREZWZhdWx0UGFyZW50KCk7CisJICogICAgIHZhciB2ZXJ0ZXggPSBudWxsOworCSAqICAgICAKKwkgKiAgICAgZ3JhcGguZ2V0TW9kZWwoKS5iZWdpblVwZGF0ZSgpOworCSAqICAgICB0cnkKKwkgKiAgICAgeworCSAqIAkgICAgIHZlcnRleCA9IGdyYXBoLmluc2VydFZlcnRleChwYXJlbnQsIG51bGwsICdIZWxsbycsIHgsIHksIDgwLCAzMCk7CisJICogICAgIH0KKwkgKiAgICAgZmluYWxseQorCSAqICAgICB7CisJICogICAgICAgZ3JhcGguZ2V0TW9kZWwoKS5lbmRVcGRhdGUoKTsKKwkgKiAgICAgfQorCSAqCisJICogICAgIGdyYXBoLnNldFNlbGVjdGlvbkNlbGwodmVydGV4KTsKKwkgKiAgIH0KKwkgKiB9CisJICogCisJICogdmFyIGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOworCSAqIGltZy5zZXRBdHRyaWJ1dGUoJ3NyYycsICdlZGl0b3JzL2ltYWdlcy9yZWN0YW5nbGUuZ2lmJyk7CisJICogaW1nLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKwkgKiBpbWcuc3R5bGUubGVmdCA9ICcwcHgnOworCSAqIGltZy5zdHlsZS50b3AgPSAnMHB4JzsKKwkgKiBpbWcuc3R5bGUud2lkdGggPSAnMTZweCc7CisJICogaW1nLnN0eWxlLmhlaWdodCA9ICcxNnB4JzsKKwkgKiAKKwkgKiB2YXIgZHJhZ0ltYWdlID0gaW1nLmNsb25lTm9kZSh0cnVlKTsKKwkgKiBkcmFnSW1hZ2Uuc3R5bGUud2lkdGggPSAnMzJweCc7CisJICogZHJhZ0ltYWdlLnN0eWxlLmhlaWdodCA9ICczMnB4JzsKKwkgKiBteFV0aWxzLm1ha2VEcmFnZ2FibGUoaW1nLCBncmFwaCwgZnVuY3QsIGRyYWdJbWFnZSk7CisJICogZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpbWcpOworCSAqIChlbmQpCisJICogCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBlbGVtZW50IC0gRE9NIGVsZW1lbnQgdG8gbWFrZSBkcmFnZ2FibGUuCisJICogZ3JhcGhGIC0gPG14R3JhcGg+IHRoYXQgYWN0cyBhcyB0aGUgZHJvcCB0YXJnZXQgb3IgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEKKwkgKiBtb3VzZSBldmVudCBhbmQgcmV0dXJucyB0aGUgY3VycmVudCA8bXhHcmFwaD4uCisJICogZnVuY3QgLSBGdW5jdGlvbiB0byBleGVjdXRlIG9uIGEgc3VjY2Vzc2Z1bCBkcm9wLgorCSAqIGRyYWdFbGVtZW50IC0gT3B0aW9uYWwgRE9NIG5vZGUgdG8gYmUgdXNlZCBmb3IgdGhlIGRyYWcgcHJldmlldy4KKwkgKiBkeCAtIE9wdGlvbmFsIGhvcml6b250YWwgb2Zmc2V0IGJldHdlZW4gdGhlIGN1cnNvciBhbmQgdGhlIGRyYWcKKwkgKiBwcmV2aWV3LgorCSAqIGR5IC0gT3B0aW9uYWwgdmVydGljYWwgb2Zmc2V0IGJldHdlZW4gdGhlIGN1cnNvciBhbmQgdGhlIGRyYWcKKwkgKiBwcmV2aWV3LgorCSAqIGF1dG9zY3JvbGwgLSBPcHRpb25hbCBib29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIGF1dG9zY3JvbGwgc2hvdWxkIGJlCisJICogdXNlZC4gRGVmYXVsdCBpcyBteEdyYXBoLmF1dG9zY3JvbGwuCisJICogc2NhbGVQcmV2aWV3IC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgcHJldmlldyBlbGVtZW50CisJICogc2hvdWxkIGJlIHNjYWxlZCBhY2NvcmRpbmcgdG8gdGhlIGdyYXBoIHNjYWxlLiBJZiB0aGlzIGlzIHRydWUsIHRoZW4KKwkgKiB0aGUgb2Zmc2V0cyB3aWxsIGFsc28gYmUgc2NhbGVkLiBEZWZhdWx0IGlzIGZhbHNlLgorCSAqIGhpZ2hsaWdodERyb3BUYXJnZXRzIC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiBkcm9wVGFyZ2V0cworCSAqIHNob3VsZCBiZSBoaWdobGlnaHRlZC4gRGVmYXVsdCBpcyB0cnVlLgorCSAqIGdldERyb3BUYXJnZXQgLSBPcHRpb25hbCBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGRyb3AgdGFyZ2V0IGZvciBhIGdpdmVuCisJICogbG9jYXRpb24gKHgsIHkpLiBEZWZhdWx0IGlzIG14R3JhcGguZ2V0Q2VsbEF0LgorCSAqLworCW1ha2VEcmFnZ2FibGU6IGZ1bmN0aW9uKGVsZW1lbnQsIGdyYXBoRiwgZnVuY3QsIGRyYWdFbGVtZW50LCBkeCwgZHksIGF1dG9zY3JvbGwsCisJCQlzY2FsZVByZXZpZXcsIGhpZ2hsaWdodERyb3BUYXJnZXRzLCBnZXREcm9wVGFyZ2V0KQorCXsKKwkJdmFyIGRyYWdTb3VyY2UgPSBuZXcgbXhEcmFnU291cmNlKGVsZW1lbnQsIGZ1bmN0KTsKKwkJZHJhZ1NvdXJjZS5kcmFnT2Zmc2V0ID0gbmV3IG14UG9pbnQoKGR4ICE9IG51bGwpID8gZHggOiAwLAorCQkJKGR5ICE9IG51bGwpID8gZHkgOiBteENvbnN0YW50cy5UT09MVElQX1ZFUlRJQ0FMX09GRlNFVCk7CisJCWRyYWdTb3VyY2UuYXV0b3Njcm9sbCA9IGF1dG9zY3JvbGw7CisJCQorCQkvLyBDYW5ub3QgZW5hYmxlIHRoaXMgYnkgZGVmYXVsdC4gVGhpcyBuZWVkcyB0byBiZSBlbmFibGVkIGluIHRoZSBjYWxsZXIKKwkJLy8gaWYgdGhlIGZ1bmN0IGFyZ3VtZW50IHVzZXMgdGhlIG5ldyB4LSBhbmQgeS1hcmd1bWVudHMuCisJCWRyYWdTb3VyY2Uuc2V0R3VpZGVzRW5hYmxlZChmYWxzZSk7CisJCQorCQlpZiAoaGlnaGxpZ2h0RHJvcFRhcmdldHMgIT0gbnVsbCkKKwkJeworCQkJZHJhZ1NvdXJjZS5oaWdobGlnaHREcm9wVGFyZ2V0cyA9IGhpZ2hsaWdodERyb3BUYXJnZXRzOworCQl9CisJCQorCQkvLyBPdmVycmlkZXMgZnVuY3Rpb24gdG8gZmluZCBkcm9wIHRhcmdldCBjZWxsCisJCWlmIChnZXREcm9wVGFyZ2V0ICE9IG51bGwpCisJCXsKKwkJCWRyYWdTb3VyY2UuZ2V0RHJvcFRhcmdldCA9IGdldERyb3BUYXJnZXQ7CisJCX0KKwkJCisJCS8vIE92ZXJyaWRlcyBmdW5jdGlvbiB0byBnZXQgY3VycmVudCBncmFwaAorCQlkcmFnU291cmNlLmdldEdyYXBoRm9yRXZlbnQgPSBmdW5jdGlvbihldnQpCisJCXsKKwkJCXJldHVybiAodHlwZW9mKGdyYXBoRikgPT0gJ2Z1bmN0aW9uJykgPyBncmFwaEYoZXZ0KSA6IGdyYXBoRjsKKwkJfTsKKwkJCisJCS8vIFRyYW5zbGF0ZXMgc3dpdGNoZXMgaW50byBkcmFnU291cmNlIGN1c3RvbWl6YXRpb25zCisJCWlmIChkcmFnRWxlbWVudCAhPSBudWxsKQorCQl7CisJCQlkcmFnU291cmNlLmNyZWF0ZURyYWdFbGVtZW50ID0gZnVuY3Rpb24oKQorCQkJeworCQkJCXJldHVybiBkcmFnRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7CisJCQl9OworCQkJCisJCQlpZiAoc2NhbGVQcmV2aWV3KQorCQkJeworCQkJCWRyYWdTb3VyY2UuY3JlYXRlUHJldmlld0VsZW1lbnQgPSBmdW5jdGlvbihncmFwaCkKKwkJCQl7CisJCQkJCXZhciBlbHQgPSBkcmFnRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7CisKKwkJCQkJdmFyIHcgPSBwYXJzZUludChlbHQuc3R5bGUud2lkdGgpOworCQkJCQl2YXIgaCA9IHBhcnNlSW50KGVsdC5zdHlsZS5oZWlnaHQpOworCQkJCQllbHQuc3R5bGUud2lkdGggPSBNYXRoLnJvdW5kKHcgKiBncmFwaC52aWV3LnNjYWxlKSArICdweCc7CisJCQkJCWVsdC5zdHlsZS5oZWlnaHQgPSBNYXRoLnJvdW5kKGggKiBncmFwaC52aWV3LnNjYWxlKSArICdweCc7CisJCQkJCQorCQkJCQlyZXR1cm4gZWx0OworCQkJCX07CisJCQl9CisJCX0KKwkJCisJCXJldHVybiBkcmFnU291cmNlOworCX0KKworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214Vm1sQ2FudmFzMkQuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teFZtbENhbnZhczJELmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiM2Q2MDAKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teFZtbENhbnZhczJELmpzCkBAIC0wLDAgKzEsMTEwMiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKgorICogQ2xhc3M6IG14Vm1sQ2FudmFzMkQKKyAqIAorICogSW1wbGVtZW50cyBhIGNhbnZhcyB0byBiZSB1c2VkIGZvciByZW5kZXJpbmcgVk1MLiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgaW1wbGVtZW50aW5nIGEKKyAqIGZhbGxiYWNrIGZvciBTVkcgaW1hZ2VzIHdoaWNoIGFyZSBub3Qgc3VwcG9ydGVkIGluIFZNTC1iYXNlZCBicm93c2Vycy4KKyAqIAorICogKGNvZGUpCisgKiB2YXIgbXhWbWxDYW52YXMyREltYWdlID0gbXhWbWxDYW52YXMyRC5wcm90b3R5cGUuaW1hZ2U7CisgKiBteFZtbENhbnZhczJELnByb3RvdHlwZS5pbWFnZSA9IGZ1bmN0aW9uKHgsIHksIHcsIGgsIHNyYywgYXNwZWN0LCBmbGlwSCwgZmxpcFYpCisgKiB7CisgKiAgIGlmIChzcmMuc3Vic3RyaW5nKHNyYy5sZW5ndGggLSA0LCBzcmMubGVuZ3RoKSA9PSAnLnN2ZycpCisgKiAgIHsKKyAqICAgICBzcmMgPSAnaHR0cDovL3d3dy5qZ3JhcGguY29tL2ltYWdlcy9teGdyYXBoLmdpZic7CisgKiAgIH0KKyAqICAgCisgKiAgIG14Vm1sQ2FudmFzMkRJbWFnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICogfTsKKyAqIChlbmQpCisgKiAKKyAqIFRvIGRpc2FibGUgYW50aS1hbGlhc2luZyBpbiB0aGUgb3V0cHV0LCB1c2UgdGhlIGZvbGxvd2luZyBjb2RlLgorICogCisgKiAoY29kZSkKKyAqIGRvY3VtZW50LmNyZWF0ZVN0eWxlU2hlZXQoKS5jc3NUZXh0ID0gbXhDbGllbnQuVk1MX1BSRUZJWCArICdcXDoqe2FudGlhbGlhczpmYWxzZTspfSc7CisgKiAoZW5kKQorICogCisgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBwdWJsaWMgQVBJIGlzIGF2YWlsYWJsZSBpbiA8bXhYbWxDYW52YXMyRD4uIE5vdGUgdGhhdAorICogdGhlcmUgaXMgYSBrbm93biBpc3N1ZSBpbiBWTUwgd2hlcmUgZ3JhZGllbnRzIGFyZSBwYWludGVkIHVzaW5nIHRoZSBvdXRlcgorICogYm91bmRpbmcgYm94IG9mIHJvdGF0ZWQgc2hhcGVzLCBub3QgdGhlIGFjdHVhbCBib3VuZHMgb2YgdGhlIHNoYXBlLiBTZWUKKyAqIGFsc28gPHRleHQ+IGZvciBwbGFpbiB0ZXh0IGxhYmVsIHJlc3RyaWN0aW9ucyBpbiBzaGFwZXMgZm9yIFZNTC4KKyAqLwordmFyIG14Vm1sQ2FudmFzMkQgPSBmdW5jdGlvbihyb290KQoreworCW14QWJzdHJhY3RDYW52YXMyRC5jYWxsKHRoaXMpOworCisJLyoqCisJICogVmFyaWFibGU6IHJvb3QKKwkgKiAKKwkgKiBSZWZlcmVuY2UgdG8gdGhlIGNvbnRhaW5lciBmb3IgdGhlIFNWRyBjb250ZW50LgorCSAqLworCXRoaXMucm9vdCA9IHJvb3Q7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhBYnN0cmFjdENhbnZhczJECisgKi8KK214VXRpbHMuZXh0ZW5kKG14Vm1sQ2FudmFzMkQsIG14QWJzdHJhY3RDYW52YXMyRCk7CisKKy8qKgorICogVmFyaWFibGU6IHBhdGgKKyAqIAorICogSG9sZHMgdGhlIGN1cnJlbnQgRE9NIG5vZGUuCisgKi8KK214Vm1sQ2FudmFzMkQucHJvdG90eXBlLm5vZGUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB0ZXh0RW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgdGV4dCBvdXRwdXQgc2hvdWxkIGJlIGVuYWJsZWRldEIuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhWbWxDYW52YXMyRC5wcm90b3R5cGUudGV4dEVuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBtb3ZlT3AKKyAqIAorICogQ29udGFpbnMgdGhlIHN0cmluZyB1c2VkIGZvciBtb3ZpbmcgaW4gcGF0aHMuIERlZmF1bHQgaXMgJ20nLgorICovCitteFZtbENhbnZhczJELnByb3RvdHlwZS5tb3ZlT3AgPSAnbSc7CisKKy8qKgorICogVmFyaWFibGU6IGxpbmVPcAorICogCisgKiBDb250YWlucyB0aGUgc3RyaW5nIHVzZWQgZm9yIG1vdmluZyBpbiBwYXRocy4gRGVmYXVsdCBpcyAnbCcuCisgKi8KK214Vm1sQ2FudmFzMkQucHJvdG90eXBlLmxpbmVPcCA9ICdsJzsKKworLyoqCisgKiBWYXJpYWJsZTogY3VydmVPcAorICogCisgKiBDb250YWlucyB0aGUgc3RyaW5nIHVzZWQgZm9yIGJlemllciBjdXJ2ZXMuIERlZmF1bHQgaXMgJ2MnLgorICovCitteFZtbENhbnZhczJELnByb3RvdHlwZS5jdXJ2ZU9wID0gJ2MnOworCisvKioKKyAqIFZhcmlhYmxlOiBjbG9zZU9wCisgKiAKKyAqIEhvbGRzIHRoZSBvcGVyYXRvciBmb3IgY2xvc2luZyBjdXJ2ZXMuIERlZmF1bHQgaXMgJ3ggZScuCisgKi8KK214Vm1sQ2FudmFzMkQucHJvdG90eXBlLmNsb3NlT3AgPSAneCc7CisKKy8qKgorICogVmFyaWFibGU6IHJvdGF0ZWRIdG1sQmFja2dyb3VuZAorICogCisgKiBCYWNrZ3JvdW5kIGNvbG9yIGZvciByb3RhdGVkIEhUTUwuIERlZmF1bHQgaXMgJycuIFRoaXMgY2FuIGJlIHNldCB0byBlZy4KKyAqIHdoaXRlIHRvIGltcHJvdmUgcmVuZGVyaW5nIG9mIHJvdGF0ZWQgdGV4dCBpbiBWTUwgZm9yIElFOS4KKyAqLworbXhWbWxDYW52YXMyRC5wcm90b3R5cGUucm90YXRlZEh0bWxCYWNrZ3JvdW5kID0gJyc7CisKKy8qKgorICogVmFyaWFibGU6IHZtbFNjYWxlCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgc2NhbGUgdXNlZCB0byBkcmF3IFZNTCBzaGFwZXMuCisgKi8KK214Vm1sQ2FudmFzMkQucHJvdG90eXBlLnZtbFNjYWxlID0gMTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlRWxlbWVudAorICogCisgKiBDcmVhdGVzIHRoZSBnaXZlbiBlbGVtZW50IHVzaW5nIHRoZSBkb2N1bWVudC4KKyAqLworbXhWbWxDYW52YXMyRC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uKG5hbWUpCit7CisJcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVWbWxFbGVtZW50CisgKiAKKyAqIENyZWF0ZXMgYSBuZXcgZWxlbWVudCB1c2luZyA8Y3JlYXRlRWxlbWVudD4gYW5kIHByZWZpeGVzIHRoZSBnaXZlbiBuYW1lIHdpdGgKKyAqIDxteENsaWVudC5WTUxfUFJFRklYPi4KKyAqLworbXhWbWxDYW52YXMyRC5wcm90b3R5cGUuY3JlYXRlVm1sRWxlbWVudCA9IGZ1bmN0aW9uKG5hbWUpCit7CisJcmV0dXJuIHRoaXMuY3JlYXRlRWxlbWVudChteENsaWVudC5WTUxfUFJFRklYICsgJzonICsgbmFtZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGROb2RlCisgKiAKKyAqIEFkZHMgdGhlIGN1cnJlbnQgbm9kZSB0byB0aGUgPHJvb3Q+LgorICovCitteFZtbENhbnZhczJELnByb3RvdHlwZS5hZGROb2RlID0gZnVuY3Rpb24oZmlsbGVkLCBzdHJva2VkKQoreworCXZhciBub2RlID0gdGhpcy5ub2RlOworCXZhciBzID0gdGhpcy5zdGF0ZTsKKwkKKwlpZiAobm9kZSAhPSBudWxsKQorCXsKKwkJaWYgKG5vZGUubm9kZU5hbWUgPT0gJ3NoYXBlJykKKwkJeworCQkJLy8gQ2hlY2tzIGlmIHRoZSBwYXRoIGlzIG5vdCBlbXB0eQorCQkJaWYgKHRoaXMucGF0aCAhPSBudWxsICYmIHRoaXMucGF0aC5sZW5ndGggPiAwKQorCQkJeworCQkJCW5vZGUucGF0aCA9IHRoaXMucGF0aC5qb2luKCcgJykgKyAnIGUnOworCQkJCW5vZGUuc3R5bGUud2lkdGggPSB0aGlzLnJvb3Quc3R5bGUud2lkdGg7CisJCQkJbm9kZS5zdHlsZS5oZWlnaHQgPSB0aGlzLnJvb3Quc3R5bGUuaGVpZ2h0OworCQkJCW5vZGUuY29vcmRzaXplID0gcGFyc2VJbnQobm9kZS5zdHlsZS53aWR0aCkgKyAnICcgKyBwYXJzZUludChub2RlLnN0eWxlLmhlaWdodCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJbm9kZS5zdHJva2V3ZWlnaHQgPSB0aGlzLmZvcm1hdChNYXRoLm1heCgxLCBzLnN0cm9rZVdpZHRoICogcy5zY2FsZSAvIHRoaXMudm1sU2NhbGUpKSArICdweCc7CisJCQorCQlpZiAocy5zaGFkb3cpCisJCXsKKwkJCXRoaXMucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZVNoYWRvdyhub2RlLAorCQkJCWZpbGxlZCAmJiBzLmZpbGxDb2xvciAhPSBudWxsLAorCQkJCXN0cm9rZWQgJiYgcy5zdHJva2VDb2xvciAhPSBudWxsKSk7CisJCX0KKwkJCisJCWlmIChzdHJva2VkICYmIHMuc3Ryb2tlQ29sb3IgIT0gbnVsbCkKKwkJeworCQkJbm9kZS5zdHJva2VkID0gJ3RydWUnOworCQkJbm9kZS5zdHJva2Vjb2xvciA9IHMuc3Ryb2tlQ29sb3I7CisJCX0KKwkJZWxzZQorCQl7CisJCQlub2RlLnN0cm9rZWQgPSAnZmFsc2UnOworCQl9CisKKwkJbm9kZS5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZVN0cm9rZSgpKTsKKworCQlpZiAoZmlsbGVkICYmIHMuZmlsbENvbG9yICE9IG51bGwpCisJCXsKKwkJCW5vZGUuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVGaWxsKCkpOworCQl9CisJCWVsc2UgaWYgKHRoaXMucG9pbnRlckV2ZW50cyAmJiAobm9kZS5ub2RlTmFtZSAhPSAnc2hhcGUnIHx8CisJCQl0aGlzLnBhdGhbdGhpcy5wYXRoLmxlbmd0aCAtIDFdID09IHRoaXMuY2xvc2VPcCkpCisJCXsKKwkJCW5vZGUuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVUcmFuc3BhcmVudEZpbGwoKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlub2RlLmZpbGxlZCA9ICdmYWxzZSc7CisJCX0KKworCQkvLyBMQVRFUjogVXBkYXRlIGV4aXN0aW5nIERPTSBmb3IgcGVyZm9ybWFuY2UKKwkJdGhpcy5yb290LmFwcGVuZENoaWxkKG5vZGUpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVRyYW5zcGFyZW50RmlsbAorICogCisgKiBDcmVhdGVzIGEgdHJhbnNwYXJlbnQgZmlsbC4KKyAqLworbXhWbWxDYW52YXMyRC5wcm90b3R5cGUuY3JlYXRlVHJhbnNwYXJlbnRGaWxsID0gZnVuY3Rpb24oKQoreworCXZhciBmaWxsID0gdGhpcy5jcmVhdGVWbWxFbGVtZW50KCdmaWxsJyk7CisJZmlsbC5zcmMgPSBteENsaWVudC5pbWFnZUJhc2VQYXRoICsgJy90cmFuc3BhcmVudC5naWYnOworCWZpbGwudHlwZSA9ICd0aWxlJzsKKwkKKwlyZXR1cm4gZmlsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUZpbGwKKyAqIAorICogQ3JlYXRlcyBhIGZpbGwgZm9yIHRoZSBjdXJyZW50IHN0YXRlLgorICovCitteFZtbENhbnZhczJELnByb3RvdHlwZS5jcmVhdGVGaWxsID0gZnVuY3Rpb24oKQoreworCXZhciBzID0gdGhpcy5zdGF0ZTsKKwkKKwkvLyBHcmFkaWVudHMgaW4gZm9yZWdyb3VuZHMgbm90IHN1cHBvcnRlZCBiZWNhdXNlIHNwZWNpYWwgZ3JhZGllbnRzCisJLy8gd2l0aCBib3VuZHMgbXVzdCBiZSBjcmVhdGVkIGZvciBlYWNoIGVsZW1lbnQgaW4gZ3JhcGhpY3MtY2FudmFzZXMKKwl2YXIgZmlsbCA9IHRoaXMuY3JlYXRlVm1sRWxlbWVudCgnZmlsbCcpOworCWZpbGwuY29sb3IgPSBzLmZpbGxDb2xvcjsKKworCWlmIChzLmdyYWRpZW50Q29sb3IgIT0gbnVsbCkKKwl7CisJCWZpbGwudHlwZSA9ICdncmFkaWVudCc7CisJCWZpbGwubWV0aG9kID0gJ25vbmUnOworCQlmaWxsLmNvbG9yMiA9IHMuZ3JhZGllbnRDb2xvcjsKKwkJdmFyIGFuZ2xlID0gMTgwIC0gcy5yb3RhdGlvbjsKKwkJCisJCWlmIChzLmdyYWRpZW50RGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9XRVNUKQorCQl7CisJCQlhbmdsZSAtPSA5MCArICgodGhpcy5yb290LnN0eWxlLmZsaXAgPT0gJ3gnKSA/IDE4MCA6IDApOworCQl9CisJCWVsc2UgaWYgKHMuZ3JhZGllbnREaXJlY3Rpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX0VBU1QpCisJCXsKKwkJCWFuZ2xlICs9IDkwICsgKCh0aGlzLnJvb3Quc3R5bGUuZmxpcCA9PSAneCcpID8gMTgwIDogMCk7CisJCX0KKwkJZWxzZSBpZiAocy5ncmFkaWVudERpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEgpCisJCXsKKwkJCWFuZ2xlIC09IDE4MCArICgodGhpcy5yb290LnN0eWxlLmZsaXAgPT0gJ3knKSA/IC0xODAgOiAwKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCSBhbmdsZSArPSAoKHRoaXMucm9vdC5zdHlsZS5mbGlwID09ICd5JykgPyAtMTgwIDogMCk7CisJCX0KKwkJCisJCWlmICh0aGlzLnJvb3Quc3R5bGUuZmxpcCA9PSAneCcgfHwgdGhpcy5yb290LnN0eWxlLmZsaXAgPT0gJ3knKQorCQl7CisJCQlhbmdsZSAqPSAtMTsKKwkJfQorCisJCS8vIExBVEVSOiBGaXggb3V0ZXIgYm91bmRpbmcgYm94IGZvciByb3RhdGVkIHNoYXBlcyB1c2VkIGluIFZNTC4KKwkJZmlsbC5hbmdsZSA9IG14VXRpbHMubW9kKGFuZ2xlLCAzNjApOworCQlmaWxsLm9wYWNpdHkgPSAocy5hbHBoYSAqIHMuZ3JhZGllbnRGaWxsQWxwaGEgKiAxMDApICsgJyUnOworCQlmaWxsLnNldEF0dHJpYnV0ZShteENsaWVudC5PRkZJQ0VfUFJFRklYICsgJzpvcGFjaXR5MicsIChzLmFscGhhICogcy5ncmFkaWVudEFscGhhICogMTAwKSArICclJyk7CisJfQorCWVsc2UgaWYgKHMuYWxwaGEgPCAxIHx8IHMuZmlsbEFscGhhIDwgMSkKKwl7CisJCWZpbGwub3BhY2l0eSA9IChzLmFscGhhICogcy5maWxsQWxwaGEgKiAxMDApICsgJyUnOwkJCQorCX0KKwkKKwlyZXR1cm4gZmlsbDsKK307CisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVTdHJva2UKKyAqIAorICogQ3JlYXRlcyBhIGZpbGwgZm9yIHRoZSBjdXJyZW50IHN0YXRlLgorICovCitteFZtbENhbnZhczJELnByb3RvdHlwZS5jcmVhdGVTdHJva2UgPSBmdW5jdGlvbigpCit7CisJdmFyIHMgPSB0aGlzLnN0YXRlOworCXZhciBzdHJva2UgPSB0aGlzLmNyZWF0ZVZtbEVsZW1lbnQoJ3N0cm9rZScpOworCXN0cm9rZS5lbmRjYXAgPSBzLmxpbmVDYXAgfHwgJ2ZsYXQnOworCXN0cm9rZS5qb2luc3R5bGUgPSBzLmxpbmVKb2luIHx8ICdtaXRlcic7CisJc3Ryb2tlLm1pdGVybGltaXQgPSBzLm1pdGVyTGltaXQgfHwgJzEwJzsKKwkKKwlpZiAocy5hbHBoYSA8IDEgfHwgcy5zdHJva2VBbHBoYSA8IDEpCisJeworCQlzdHJva2Uub3BhY2l0eSA9IChzLmFscGhhICogcy5zdHJva2VBbHBoYSAqIDEwMCkgKyAnJSc7CisJfQorCQorCWlmIChzLmRhc2hlZCkKKwl7CisJCXN0cm9rZS5kYXNoc3R5bGUgPSB0aGlzLmdldFZtbERhc2hTdHlsZSgpOworCX0KKwkKKwlyZXR1cm4gc3Ryb2tlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Vm1sRGFzaFBhdHRlcm4KKyAqIAorICogUmV0dXJucyBhIFZNTCBkYXNoIHBhdHRlcm4gZm9yIHRoZSBjdXJyZW50IGRhc2hQYXR0ZXJuLgorICogU2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9iYjI2NDA4NSh2PXZzLjg1KS5hc3B4CisgKi8KK214Vm1sQ2FudmFzMkQucHJvdG90eXBlLmdldFZtbERhc2hTdHlsZSA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgcmVzdWx0ID0gJ2Rhc2gnOworCQorCWlmICh0eXBlb2YodGhpcy5zdGF0ZS5kYXNoUGF0dGVybikgPT09ICdzdHJpbmcnKQorCXsKKwkJdmFyIHRvayA9IHRoaXMuc3RhdGUuZGFzaFBhdHRlcm4uc3BsaXQoJyAnKTsKKwkJCisJCWlmICh0b2subGVuZ3RoID4gMCAmJiB0b2tbMF0gPT0gMSkKKwkJeworCQkJcmVzdWx0ID0gJzAgMic7CisJCX0KKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVNoYWRvdworICogCisgKiBDcmVhdGVzIGEgc2hhZG93IGZvciB0aGUgZ2l2ZW4gbm9kZS4KKyAqLworbXhWbWxDYW52YXMyRC5wcm90b3R5cGUuY3JlYXRlU2hhZG93ID0gZnVuY3Rpb24obm9kZSwgZmlsbGVkLCBzdHJva2VkKQoreworCXZhciBzID0gdGhpcy5zdGF0ZTsKKwl2YXIgcmFkID0gLXMucm90YXRpb24gKiAoTWF0aC5QSSAvIDE4MCk7CisJdmFyIGNvcyA9IE1hdGguY29zKHJhZCk7CisJdmFyIHNpbiA9IE1hdGguc2luKHJhZCk7CisKKwl2YXIgZHggPSBzLnNoYWRvd0R4ICogcy5zY2FsZTsKKwl2YXIgZHkgPSBzLnNoYWRvd0R5ICogcy5zY2FsZTsKKworCWlmICh0aGlzLnJvb3Quc3R5bGUuZmxpcCA9PSAneCcpCisJeworCQlkeCAqPSAtMTsKKwl9CisJZWxzZSBpZiAodGhpcy5yb290LnN0eWxlLmZsaXAgPT0gJ3knKQorCXsKKwkJZHkgKj0gLTE7CisJfQorCQorCXZhciBzaGFkb3cgPSBub2RlLmNsb25lTm9kZSh0cnVlKTsKKwlzaGFkb3cuc3R5bGUubWFyZ2luTGVmdCA9IE1hdGgucm91bmQoZHggKiBjb3MgLSBkeSAqIHNpbikgKyAncHgnOworCXNoYWRvdy5zdHlsZS5tYXJnaW5Ub3AgPSBNYXRoLnJvdW5kKGR4ICogc2luICsgZHkgKiBjb3MpICsgJ3B4JzsKKworCS8vIFdvcmthcm91bmQgZm9yIHdyb25nIGNsb25pbmcgaW4gSUU4IHN0YW5kYXJkcyBtb2RlCisJaWYgKGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSA4KQorCXsKKwkJc2hhZG93LnN0cm9rZXdlaWdodCA9IG5vZGUuc3Ryb2tld2VpZ2h0OworCQkKKwkJaWYgKG5vZGUubm9kZU5hbWUgPT0gJ3NoYXBlJykKKwkJeworCQkJc2hhZG93LnBhdGggPSB0aGlzLnBhdGguam9pbignICcpICsgJyBlJzsKKwkJCXNoYWRvdy5zdHlsZS53aWR0aCA9IHRoaXMucm9vdC5zdHlsZS53aWR0aDsKKwkJCXNoYWRvdy5zdHlsZS5oZWlnaHQgPSB0aGlzLnJvb3Quc3R5bGUuaGVpZ2h0OworCQkJc2hhZG93LmNvb3Jkc2l6ZSA9IHBhcnNlSW50KG5vZGUuc3R5bGUud2lkdGgpICsgJyAnICsgcGFyc2VJbnQobm9kZS5zdHlsZS5oZWlnaHQpOworCQl9CisJfQorCQorCWlmIChzdHJva2VkKQorCXsKKwkJc2hhZG93LnN0cm9rZWNvbG9yID0gcy5zaGFkb3dDb2xvcjsKKwkJc2hhZG93LmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlU2hhZG93U3Ryb2tlKCkpOworCX0KKwllbHNlCisJeworCQlzaGFkb3cuc3Ryb2tlZCA9ICdmYWxzZSc7CisJfQorCQorCWlmIChmaWxsZWQpCisJeworCQlzaGFkb3cuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVTaGFkb3dGaWxsKCkpOworCX0KKwllbHNlCisJeworCQlzaGFkb3cuZmlsbGVkID0gJ2ZhbHNlJzsKKwl9CisJCisJcmV0dXJuIHNoYWRvdzsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVNoYWRvd0ZpbGwKKyAqIAorICogQ3JlYXRlcyB0aGUgZmlsbCBmb3IgdGhlIHNoYWRvdy4KKyAqLworbXhWbWxDYW52YXMyRC5wcm90b3R5cGUuY3JlYXRlU2hhZG93RmlsbCA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgZmlsbCA9IHRoaXMuY3JlYXRlVm1sRWxlbWVudCgnZmlsbCcpOworCWZpbGwuY29sb3IgPSB0aGlzLnN0YXRlLnNoYWRvd0NvbG9yOworCWZpbGwub3BhY2l0eSA9ICh0aGlzLnN0YXRlLmFscGhhICogdGhpcy5zdGF0ZS5zaGFkb3dBbHBoYSAqIDEwMCkgKyAnJSc7CisJCisJcmV0dXJuIGZpbGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVTaGFkb3dTdHJva2UKKyAqIAorICogQ3JlYXRlcyB0aGUgc3Ryb2tlIGZvciB0aGUgc2hhZG93LgorICovCitteFZtbENhbnZhczJELnByb3RvdHlwZS5jcmVhdGVTaGFkb3dTdHJva2UgPSBmdW5jdGlvbigpCit7CisJdmFyIHN0cm9rZSA9IHRoaXMuY3JlYXRlU3Ryb2tlKCk7CisJc3Ryb2tlLm9wYWNpdHkgPSAodGhpcy5zdGF0ZS5hbHBoYSAqIHRoaXMuc3RhdGUuc2hhZG93QWxwaGEgKiAxMDApICsgJyUnOworCQorCXJldHVybiBzdHJva2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByb3RhdGUKKyAqIAorICogU2V0cyB0aGUgcm90YXRpb24gb2YgdGhlIGNhbnZhcy4gTm90ZSB0aGF0IHJvdGF0aW9uIGNhbm5vdCBiZSBjb25jYXRlbmF0ZWQuCisgKi8KK214Vm1sQ2FudmFzMkQucHJvdG90eXBlLnJvdGF0ZSA9IGZ1bmN0aW9uKHRoZXRhLCBmbGlwSCwgZmxpcFYsIGN4LCBjeSkKK3sKKwlpZiAoZmxpcEggJiYgZmxpcFYpCisJeworCQl0aGV0YSArPSAxODA7CisJfQorCWVsc2UgaWYgKGZsaXBIKQorCXsKKwkJdGhpcy5yb290LnN0eWxlLmZsaXAgPSAneCc7CisJfQorCWVsc2UgaWYgKGZsaXBWKQorCXsKKwkJdGhpcy5yb290LnN0eWxlLmZsaXAgPSAneSc7CisJfQorCisJaWYgKGZsaXBIID8gIWZsaXBWIDogZmxpcFYpCisJeworCQl0aGV0YSAqPSAtMTsKKwl9CisKKwl0aGlzLnJvb3Quc3R5bGUucm90YXRpb24gPSB0aGV0YTsKKwl0aGlzLnN0YXRlLnJvdGF0aW9uID0gdGhpcy5zdGF0ZS5yb3RhdGlvbiArIHRoZXRhOworCXRoaXMuc3RhdGUucm90YXRpb25DeCA9IGN4OworCXRoaXMuc3RhdGUucm90YXRpb25DeSA9IGN5OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYmVnaW4KKyAqIAorICogRXh0ZW5kcyBzdXBlcmNsYXNzIHRvIGNyZWF0ZSBwYXRoLgorICovCitteFZtbENhbnZhczJELnByb3RvdHlwZS5iZWdpbiA9IGZ1bmN0aW9uKCkKK3sKKwlteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLmJlZ2luLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJdGhpcy5ub2RlID0gdGhpcy5jcmVhdGVWbWxFbGVtZW50KCdzaGFwZScpOworCXRoaXMubm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBxdWFkVG8KKyAqIAorICogUmVwbGFjZXMgcXVhZHJhdGljIGN1cnZlIHdpdGggYmV6aWVyIGN1cnZlIGluIFZNTC4KKyAqLworbXhWbWxDYW52YXMyRC5wcm90b3R5cGUucXVhZFRvID0gZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIpCit7CisJdmFyIHMgPSB0aGlzLnN0YXRlOworCisJdmFyIGNweDAgPSAodGhpcy5sYXN0WCArIHMuZHgpICogcy5zY2FsZTsKKwl2YXIgY3B5MCA9ICh0aGlzLmxhc3RZICsgcy5keSkgKiBzLnNjYWxlOworCXZhciBxcHgxID0gKHgxICsgcy5keCkgKiBzLnNjYWxlOworCXZhciBxcHkxID0gKHkxICsgcy5keSkgKiBzLnNjYWxlOworCXZhciBjcHgzID0gKHgyICsgcy5keCkgKiBzLnNjYWxlOworCXZhciBjcHkzID0gKHkyICsgcy5keSkgKiBzLnNjYWxlOworCQorCXZhciBjcHgxID0gY3B4MCArIDIvMyAqIChxcHgxIC0gY3B4MCk7CisJdmFyIGNweTEgPSBjcHkwICsgMi8zICogKHFweTEgLSBjcHkwKTsKKwkKKwl2YXIgY3B4MiA9IGNweDMgKyAyLzMgKiAocXB4MSAtIGNweDMpOworCXZhciBjcHkyID0gY3B5MyArIDIvMyAqIChxcHkxIC0gY3B5Myk7CisJCisJdGhpcy5wYXRoLnB1c2goJ2MgJyArIHRoaXMuZm9ybWF0KGNweDEpICsgJyAnICsgdGhpcy5mb3JtYXQoY3B5MSkgKworCQkJJyAnICsgdGhpcy5mb3JtYXQoY3B4MikgKyAnICcgKyB0aGlzLmZvcm1hdChjcHkyKSArCisJCQknICcgKyB0aGlzLmZvcm1hdChjcHgzKSArICcgJyArIHRoaXMuZm9ybWF0KGNweTMpKTsKKwl0aGlzLmxhc3RYID0gKGNweDMgLyBzLnNjYWxlKSAtIHMuZHg7CisJdGhpcy5sYXN0WSA9IChjcHkzIC8gcy5zY2FsZSkgLSBzLmR5OworCQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlUmVjdAorICogCisgKiBTZXRzIHRoZSBnbGFzcyBncmFkaWVudC4KKyAqLworbXhWbWxDYW52YXMyRC5wcm90b3R5cGUuY3JlYXRlUmVjdCA9IGZ1bmN0aW9uKG5vZGVOYW1lLCB4LCB5LCB3LCBoKQoreworCXZhciBzID0gdGhpcy5zdGF0ZTsKKwl2YXIgbiA9IHRoaXMuY3JlYXRlVm1sRWxlbWVudChub2RlTmFtZSk7CisJbi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisJbi5zdHlsZS5sZWZ0ID0gdGhpcy5mb3JtYXQoKHggKyBzLmR4KSAqIHMuc2NhbGUpICsgJ3B4JzsKKwluLnN0eWxlLnRvcCA9IHRoaXMuZm9ybWF0KCh5ICsgcy5keSkgKiBzLnNjYWxlKSArICdweCc7CisJbi5zdHlsZS53aWR0aCA9IHRoaXMuZm9ybWF0KHcgKiBzLnNjYWxlKSArICdweCc7CisJbi5zdHlsZS5oZWlnaHQgPSB0aGlzLmZvcm1hdChoICogcy5zY2FsZSkgKyAncHgnOworCQorCXJldHVybiBuOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVjdAorICogCisgKiBTZXRzIHRoZSBjdXJyZW50IHBhdGggdG8gYSByZWN0YW5nbGUuCisgKi8KK214Vm1sQ2FudmFzMkQucHJvdG90eXBlLnJlY3QgPSBmdW5jdGlvbih4LCB5LCB3LCBoKQoreworCXRoaXMubm9kZSA9IHRoaXMuY3JlYXRlUmVjdCgncmVjdCcsIHgsIHksIHcsIGgpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcm91bmRyZWN0CisgKiAKKyAqIFNldHMgdGhlIGN1cnJlbnQgcGF0aCB0byBhIHJvdW5kZWQgcmVjdGFuZ2xlLgorICovCitteFZtbENhbnZhczJELnByb3RvdHlwZS5yb3VuZHJlY3QgPSBmdW5jdGlvbih4LCB5LCB3LCBoLCBkeCwgZHkpCit7CisJdGhpcy5ub2RlID0gdGhpcy5jcmVhdGVSZWN0KCdyb3VuZHJlY3QnLCB4LCB5LCB3LCBoKTsKKwkvLyBTZXRBdHRyaWJ1dGUgbmVlZGVkIGhlcmUgZm9yIElFOAorCXRoaXMubm9kZS5zZXRBdHRyaWJ1dGUoJ2FyY3NpemUnLCBNYXRoLm1heChkeCAqIDEwMCAvIHcsIGR5ICogMTAwIC8gaCkgKyAnJScpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZWxsaXBzZQorICogCisgKiBTZXRzIHRoZSBjdXJyZW50IHBhdGggdG8gYW4gZWxsaXBzZS4KKyAqLworbXhWbWxDYW52YXMyRC5wcm90b3R5cGUuZWxsaXBzZSA9IGZ1bmN0aW9uKHgsIHksIHcsIGgpCit7CisJdGhpcy5ub2RlID0gdGhpcy5jcmVhdGVSZWN0KCdvdmFsJywgeCwgeSwgdywgaCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbWFnZQorICogCisgKiBQYWludHMgYW4gaW1hZ2UuCisgKi8KK214Vm1sQ2FudmFzMkQucHJvdG90eXBlLmltYWdlID0gZnVuY3Rpb24oeCwgeSwgdywgaCwgc3JjLCBhc3BlY3QsIGZsaXBILCBmbGlwVikKK3sKKwl2YXIgbm9kZSA9IG51bGw7CisJCisJaWYgKCFhc3BlY3QpCisJeworCQlub2RlID0gdGhpcy5jcmVhdGVSZWN0KCdpbWFnZScsIHgsIHksIHcsIGgpOworCQlub2RlLnNyYyA9IHNyYzsKKwl9CisJZWxzZQorCXsKKwkJLy8gVXNlcyBmaWxsIHdpdGggYXNwZWN0IHRvIGF2b2lkIGFzeW5jaHJvbm91cyB1cGRhdGUgb2Ygc2l6ZQorCQlub2RlID0gdGhpcy5jcmVhdGVSZWN0KCdyZWN0JywgeCwgeSwgdywgaCk7CisJCW5vZGUuc3Ryb2tlZCA9ICdmYWxzZSc7CisJCQorCQkvLyBIYW5kbGVzIGltYWdlIGFzcGVjdCB2aWEgZmlsbAorCQl2YXIgZmlsbCA9IHRoaXMuY3JlYXRlVm1sRWxlbWVudCgnZmlsbCcpOworCQlmaWxsLmFzcGVjdCA9IChhc3BlY3QpID8gJ2F0bW9zdCcgOiAnaWdub3JlJzsKKwkJZmlsbC5yb3RhdGUgPSAndHJ1ZSc7CisJCWZpbGwudHlwZSA9ICdmcmFtZSc7CisJCWZpbGwuc3JjID0gc3JjOworCisJCW5vZGUuYXBwZW5kQ2hpbGQoZmlsbCk7CisJfQorCQorCWlmIChmbGlwSCAmJiBmbGlwVikKKwl7CisJCW5vZGUuc3R5bGUucm90YXRpb24gPSAnMTgwJzsKKwl9CisJZWxzZSBpZiAoZmxpcEgpCisJeworCQlub2RlLnN0eWxlLmZsaXAgPSAneCc7CisJfQorCWVsc2UgaWYgKGZsaXBWKQorCXsKKwkJbm9kZS5zdHlsZS5mbGlwID0gJ3knOworCX0KKwkKKwlpZiAodGhpcy5zdGF0ZS5hbHBoYSA8IDEgfHwgdGhpcy5zdGF0ZS5maWxsQWxwaGEgPCAxKQorCXsKKwkJLy8gS05PV046IEJvcmRlcnMgYXJvdW5kIHRyYW5zcGFyZW50IGltYWdlcyBpbiBJRTw5LiBVc2luZyBmaWxsLm9wYWNpdHkKKwkJLy8gZml4ZXMgdGhpcyBwcm9ibGVtIGJ5IGFkZGluZyBhIHdoaXRlIGJhY2tncm91bmQgaW4gYWxsIElFIHZlcnNpb25zLgorCQlub2RlLnN0eWxlLmZpbHRlciArPSAnYWxwaGEob3BhY2l0eT0nICsgKHRoaXMuc3RhdGUuYWxwaGEgKiB0aGlzLnN0YXRlLmZpbGxBbHBoYSAqIDEwMCkgKyAnKSc7CisJfQorCisJdGhpcy5yb290LmFwcGVuZENoaWxkKG5vZGUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlVGV4dAorICogCisgKiBDcmVhdGVzIHRoZSBpbm5lcm1vc3QgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBIVE1MIHRleHQuCisgKi8KK214Vm1sQ2FudmFzMkQucHJvdG90eXBlLmNyZWF0ZURpdiA9IGZ1bmN0aW9uKHN0ciwgYWxpZ24sIHZhbGlnbiwgb3ZlcmZsb3cpCit7CisJdmFyIGRpdiA9IHRoaXMuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJdmFyIHN0YXRlID0gdGhpcy5zdGF0ZTsKKworCXZhciBjc3MgPSAnJzsKKwkKKwlpZiAoc3RhdGUuZm9udEJhY2tncm91bmRDb2xvciAhPSBudWxsKQorCXsKKwkJY3NzICs9ICdiYWNrZ3JvdW5kLWNvbG9yOicgKyBzdGF0ZS5mb250QmFja2dyb3VuZENvbG9yICsgJzsnOworCX0KKwkKKwlpZiAoc3RhdGUuZm9udEJvcmRlckNvbG9yICE9IG51bGwpCisJeworCQljc3MgKz0gJ2JvcmRlcjoxcHggc29saWQgJyArIHN0YXRlLmZvbnRCb3JkZXJDb2xvciArICc7JzsKKwl9CisJCisJaWYgKG14VXRpbHMuaXNOb2RlKHN0cikpCisJeworCQlkaXYuYXBwZW5kQ2hpbGQoc3RyKTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKG92ZXJmbG93ICE9ICdmaWxsJyAmJiBvdmVyZmxvdyAhPSAnd2lkdGgnKQorCQl7CisJCQl2YXIgZGl2MiA9IHRoaXMuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCQlkaXYyLnN0eWxlLmNzc1RleHQgPSBjc3M7CisJCQlkaXYyLnN0eWxlLmRpc3BsYXkgPSAobXhDbGllbnQuSVNfUVVJUktTKSA/ICdpbmxpbmUnIDogJ2lubGluZS1ibG9jayc7CisJCQlkaXYyLnN0eWxlLnpvb20gPSAnMSc7CisJCQlkaXYyLnN0eWxlLnRleHREZWNvcmF0aW9uID0gJ2luaGVyaXQnOworCQkJZGl2Mi5pbm5lckhUTUwgPSBzdHI7CisJCQlkaXYuYXBwZW5kQ2hpbGQoZGl2Mik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlkaXYuc3R5bGUuY3NzVGV4dCA9IGNzczsKKwkJCWRpdi5pbm5lckhUTUwgPSBzdHI7CisJCX0KKwl9CisJCisJdmFyIHN0eWxlID0gZGl2LnN0eWxlOworCisJc3R5bGUuZm9udFNpemUgPSAoc3RhdGUuZm9udFNpemUgLyB0aGlzLnZtbFNjYWxlKSArICdweCc7CisJc3R5bGUuZm9udEZhbWlseSA9IHN0YXRlLmZvbnRGYW1pbHk7CisJc3R5bGUuY29sb3IgPSBzdGF0ZS5mb250Q29sb3I7CisJc3R5bGUudmVydGljYWxBbGlnbiA9ICd0b3AnOworCXN0eWxlLnRleHRBbGlnbiA9IGFsaWduIHx8ICdsZWZ0JzsKKwlzdHlsZS5saW5lSGVpZ2h0ID0gKG14Q29uc3RhbnRzLkFCU09MVVRFX0xJTkVfSEVJR0hUKSA/IChzdGF0ZS5mb250U2l6ZSAqIG14Q29uc3RhbnRzLkxJTkVfSEVJR0hUIC8gdGhpcy52bWxTY2FsZSkgKyAncHgnIDogbXhDb25zdGFudHMuTElORV9IRUlHSFQ7CisKKwlpZiAoKHN0YXRlLmZvbnRTdHlsZSAmIG14Q29uc3RhbnRzLkZPTlRfQk9MRCkgPT0gbXhDb25zdGFudHMuRk9OVF9CT0xEKQorCXsKKwkJc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJzsKKwl9CisKKwlpZiAoKHN0YXRlLmZvbnRTdHlsZSAmIG14Q29uc3RhbnRzLkZPTlRfSVRBTElDKSA9PSBteENvbnN0YW50cy5GT05UX0lUQUxJQykKKwl7CisJCXN0eWxlLmZvbnRTdHlsZSA9ICdpdGFsaWMnOworCX0KKwkKKwlpZiAoKHN0YXRlLmZvbnRTdHlsZSAmIG14Q29uc3RhbnRzLkZPTlRfVU5ERVJMSU5FKSA9PSBteENvbnN0YW50cy5GT05UX1VOREVSTElORSkKKwl7CisJCXN0eWxlLnRleHREZWNvcmF0aW9uID0gJ3VuZGVybGluZSc7CisJfQorCQorCXJldHVybiBkaXY7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB0ZXh0CisgKiAKKyAqIFBhaW50cyB0aGUgZ2l2ZW4gdGV4dC4gUG9zc2libGUgdmFsdWVzIGZvciBmb3JtYXQgYXJlIGVtcHR5IHN0cmluZyBmb3IgcGxhaW4KKyAqIHRleHQgYW5kIGh0bWwgZm9yIEhUTUwgbWFya3VwLiBDbGlwcGluZywgdGV4dCBiYWNrZ3JvdW5kIGFuZCBib3JkZXIgYXJlIG5vdAorICogc3VwcG9ydGVkIGZvciBwbGFpbiB0ZXh0IGluIFZNTC4KKyAqLworbXhWbWxDYW52YXMyRC5wcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uKHgsIHksIHcsIGgsIHN0ciwgYWxpZ24sIHZhbGlnbiwgd3JhcCwgZm9ybWF0LCBvdmVyZmxvdywgY2xpcCwgcm90YXRpb24sIGRpcikKK3sKKwlpZiAodGhpcy50ZXh0RW5hYmxlZCAmJiBzdHIgIT0gbnVsbCkKKwl7CisJCXZhciBzID0gdGhpcy5zdGF0ZTsKKwkJCisJCWlmIChmb3JtYXQgPT0gJ2h0bWwnKQorCQl7CisJCQlpZiAocy5yb3RhdGlvbiAhPSBudWxsKQorCQkJeworCQkJCXZhciBwdCA9IHRoaXMucm90YXRlUG9pbnQoeCwgeSwgcy5yb3RhdGlvbiwgcy5yb3RhdGlvbkN4LCBzLnJvdGF0aW9uQ3kpOworCQkJCQorCQkJCXggPSBwdC54OworCQkJCXkgPSBwdC55OworCQkJfQorCisJCQlpZiAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09IDggJiYgIW14Q2xpZW50LklTX0VNKQorCQkJeworCQkJCXggKz0gcy5keDsKKwkJCQl5ICs9IHMuZHk7CisJCQkJCisJCQkJLy8gV29ya2Fyb3VuZCBmb3IgcmVuZGVyaW5nIG9mZnNldHMKKwkJCQlpZiAob3ZlcmZsb3cgIT0gJ2ZpbGwnICYmIHZhbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9UT1ApCisJCQkJeworCQkJCQl5IC09IDE7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXggKj0gcy5zY2FsZTsKKwkJCQl5ICo9IHMuc2NhbGU7CisJCQl9CisKKwkJCS8vIEFkZHMgZXZlbnQgdHJhbnNwYXJlbmN5IGluIElFOCBzdGFuZGFyZHMgd2l0aG91dCB0aGUgdHJhbnNwYXJlbnQgYmFja2dyb3VuZAorCQkJLy8gZmlsdGVyIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGR1ZSB0byBidWdzIGluIHRoZSB6b29tZWQgYm91bmRpbmcgYm94ICh0b28gc2xvdykKKwkJCS8vIEZJWE1FOiBObyBldmVudCB0cmFuc3BhcmVuY3kgaWYgaW5zaWRlIHY6cmVjdCAoaWUgcGFydCBvZiBzaGFwZSkKKwkJCS8vIEtOT1dOOiBPZmZzZXQgd3JvbmcgZm9yIHJvdGF0ZWQgdGV4dCB3aXRoIHdvcmQgdGhhdCBhcmUgbG9uZ2VyIHRoYW4gdGhlIHdyYXBwaW5nCisJCQkvLyB3aWR0aCBpbiBJRTggYmVjYXVzZSByZWFsIHdpZHRoIG9mIHRleHQgY2Fubm90IGJlIGRldGVybWluZWQgaGVyZS4KKwkJCS8vIFRoaXMgc2hvdWxkIGJlIGZpeGVkIGluIG14VGV4dC51cGRhdGVCb3VuZGluZ0JveCBieSBjYWxsaW5nIGJlZm9yZSB0aGlzIGFuZAorCQkJLy8gcGFzc2luZyB0aGUgcmVhbCB3aWR0aCB0byB0aGlzIG1ldGhvZCBpZiBub3QgY2xpcHBlZCBhbmQgd3JhcHBlZC4KKwkJCXZhciBhYnMgPSAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09IDggJiYgIW14Q2xpZW50LklTX0VNKSA/IHRoaXMuY3JlYXRlVm1sRWxlbWVudCgnZ3JvdXAnKSA6IHRoaXMuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCQlhYnMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOworCQkJYWJzLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJzsKKwkJCWFicy5zdHlsZS5sZWZ0ID0gdGhpcy5mb3JtYXQoeCkgKyAncHgnOworCQkJYWJzLnN0eWxlLnRvcCA9IHRoaXMuZm9ybWF0KHkpICsgJ3B4JzsKKwkJCWFicy5zdHlsZS56b29tID0gcy5zY2FsZTsKKworCQkJdmFyIGJveCA9IHRoaXMuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCQlib3guc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOworCQkJYm94LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJzsKKwkJCQorCQkJdmFyIG1hcmdpbiA9IG14VXRpbHMuZ2V0QWxpZ25tZW50QXNQb2ludChhbGlnbiwgdmFsaWduKTsKKwkJCXZhciBkeCA9IG1hcmdpbi54OworCQkJdmFyIGR5ID0gbWFyZ2luLnk7CisKKwkJCXZhciBkaXYgPSB0aGlzLmNyZWF0ZURpdihzdHIsIGFsaWduLCB2YWxpZ24sIG92ZXJmbG93KTsKKwkJCXZhciBpbm5lciA9IHRoaXMuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCQkKKwkJCWlmIChkaXIgIT0gbnVsbCkKKwkJCXsKKwkJCQlkaXYuc2V0QXR0cmlidXRlKCdkaXInLCBkaXIpOworCQkJfQorCisJCQlpZiAod3JhcCAmJiB3ID4gMCkKKwkJCXsKKwkJCQlpZiAoIWNsaXApCisJCQkJeworCQkJCQlkaXYuc3R5bGUud2lkdGggPSBNYXRoLnJvdW5kKHcpICsgJ3B4JzsKKwkJCQl9CisJCQkJCisJCQkJZGl2LnN0eWxlLndvcmRXcmFwID0gbXhDb25zdGFudHMuV09SRF9XUkFQOworCQkJCWRpdi5zdHlsZS53aGl0ZVNwYWNlID0gJ25vcm1hbCc7CisJCQkJCisJCQkJLy8gTEFURVI6IENoZWNrIGlmIG90aGVyIGNhc2VzIG5lZWQgdG8gYmUgaGFuZGxlZAorCQkJCWlmIChkaXYuc3R5bGUud29yZFdyYXAgPT0gJ2JyZWFrLXdvcmQnKQorCQkJCXsKKwkJCQkJdmFyIHRtcCA9IGRpdjsKKwkJCQkJCisJCQkJCWlmICh0bXAuZmlyc3RDaGlsZCAhPSBudWxsICYmIHRtcC5maXJzdENoaWxkLm5vZGVOYW1lID09ICdESVYnKQorCQkJCQl7CisJCQkJCQl0bXAuZmlyc3RDaGlsZC5zdHlsZS53aWR0aCA9ICcxMDAlJzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkaXYuc3R5bGUud2hpdGVTcGFjZSA9ICdub3dyYXAnOworCQkJfQorCQkJCisJCQl2YXIgcm90ID0gcy5yb3RhdGlvbiArIChyb3RhdGlvbiB8fCAwKTsKKwkJCQorCQkJaWYgKHRoaXMucm90YXRlSHRtbCAmJiByb3QgIT0gMCkKKwkJCXsKKwkJCQlpbm5lci5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7CisJCQkJaW5uZXIuc3R5bGUuem9vbSA9ICcxJzsKKwkJCQlpbm5lci5hcHBlbmRDaGlsZChkaXYpOworCisJCQkJLy8gQm94IG5vdCBuZWVkZWQgZm9yIHJlbmRlcmluZyBpbiBJRTggc3RhbmRhcmRzCisJCQkJaWYgKGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSA4ICYmICFteENsaWVudC5JU19FTSAmJiB0aGlzLnJvb3Qubm9kZU5hbWUgIT0gJ0RJVicpCisJCQkJeworCQkJCQlib3guYXBwZW5kQ2hpbGQoaW5uZXIpOworCQkJCQlhYnMuYXBwZW5kQ2hpbGQoYm94KTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJYWJzLmFwcGVuZENoaWxkKGlubmVyKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gOCAmJiAhbXhDbGllbnQuSVNfRU0pCisJCQl7CisJCQkJYm94LmFwcGVuZENoaWxkKGRpdik7CisJCQkJYWJzLmFwcGVuZENoaWxkKGJveCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZGl2LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJzsKKwkJCQlhYnMuYXBwZW5kQ2hpbGQoZGl2KTsKKwkJCX0KKwkJCQorCQkJLy8gSW5zZXJ0cyB0aGUgbm9kZSBpbnRvIHRoZSBET00KKwkJCWlmICh0aGlzLnJvb3Qubm9kZU5hbWUgIT0gJ0RJVicpCisJCQl7CisJCQkJLy8gUmVjdGFuZ2xlIHRvIGZpeCBwb3NpdGlvbiBpbiBncm91cAorCQkJCXZhciByZWN0ID0gdGhpcy5jcmVhdGVWbWxFbGVtZW50KCdyZWN0Jyk7CisJCQkJcmVjdC5zdHJva2VkID0gJ2ZhbHNlJzsKKwkJCQlyZWN0LmZpbGxlZCA9ICdmYWxzZSc7CisKKwkJCQlyZWN0LmFwcGVuZENoaWxkKGFicyk7CisJCQkJdGhpcy5yb290LmFwcGVuZENoaWxkKHJlY3QpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRoaXMucm9vdC5hcHBlbmRDaGlsZChhYnMpOworCQkJfQorCQkJCisJCQlpZiAoY2xpcCkKKwkJCXsKKwkJCQlkaXYuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKKwkJCQlkaXYuc3R5bGUud2lkdGggPSBNYXRoLnJvdW5kKHcpICsgJ3B4JzsKKwkJCQkKKwkJCQlpZiAoIW14Q2xpZW50LklTX1FVSVJLUykKKwkJCQl7CisJCQkJCWRpdi5zdHlsZS5tYXhIZWlnaHQgPSBNYXRoLnJvdW5kKGgpICsgJ3B4JzsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmIChvdmVyZmxvdyA9PSAnZmlsbCcpCisJCQl7CisJCQkJLy8gS05PV046IEFmZmVjdHMgaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gcXVpcmtzCisJCQkJLy8gYnV0IGZpbGwgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIGFsaWduPWxlZnQKKwkJCQlkaXYuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKKwkJCQlkaXYuc3R5bGUud2lkdGggPSAoTWF0aC5tYXgoMCwgdykgKyAxKSArICdweCc7CisJCQkJZGl2LnN0eWxlLmhlaWdodCA9IChNYXRoLm1heCgwLCBoKSArIDEpICsgJ3B4JzsKKwkJCX0KKwkJCWVsc2UgaWYgKG92ZXJmbG93ID09ICd3aWR0aCcpCisJCQl7CisJCQkJLy8gS05PV046IEFmZmVjdHMgaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gcXVpcmtzCisJCQkJLy8gYnV0IGZpbGwgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIGFsaWduPWxlZnQKKwkJCQlkaXYuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKKwkJCQlkaXYuc3R5bGUud2lkdGggPSAoTWF0aC5tYXgoMCwgdykgKyAxKSArICdweCc7CisJCQkJZGl2LnN0eWxlLm1heEhlaWdodCA9IChNYXRoLm1heCgwLCBoKSArIDEpICsgJ3B4JzsKKwkJCX0KKwkJCQorCQkJaWYgKHRoaXMucm90YXRlSHRtbCAmJiByb3QgIT0gMCkKKwkJCXsKKwkJCQl2YXIgcmFkID0gcm90ICogKE1hdGguUEkgLyAxODApOworCQkJCQorCQkJCS8vIFByZWNhbGN1bGF0ZSBjb3MgYW5kIHNpbiBmb3IgdGhlIHJvdGF0aW9uCisJCQkJdmFyIHJlYWxfY29zID0gcGFyc2VGbG9hdChwYXJzZUZsb2F0KE1hdGguY29zKHJhZCkpLnRvRml4ZWQoOCkpOworCQkJCXZhciByZWFsX3NpbiA9IHBhcnNlRmxvYXQocGFyc2VGbG9hdChNYXRoLnNpbigtcmFkKSkudG9GaXhlZCg4KSk7CisKKwkJCQlyYWQgJT0gMiAqIE1hdGguUEk7CisJCQkJaWYgKHJhZCA8IDApIHJhZCArPSAyICogTWF0aC5QSTsKKwkJCQlyYWQgJT0gTWF0aC5QSTsKKwkJCQlpZiAocmFkID4gTWF0aC5QSSAvIDIpIHJhZCA9IE1hdGguUEkgLSByYWQ7CisJCQkJCisJCQkJdmFyIGNvcyA9IE1hdGguY29zKHJhZCk7CisJCQkJdmFyIHNpbiA9IE1hdGguc2luKHJhZCk7CisKKwkJCQkvLyBBZGRzIGRpdiB0byBkb2N1bWVudCB0byBtZWFzdXJlIHNpemUKKwkJCQlpZiAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09IDggJiYgIW14Q2xpZW50LklTX0VNKQorCQkJCXsKKwkJCQkJZGl2LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsKKwkJCQkJaW5uZXIuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snOworCQkJCQlib3guc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snOworCQkJCX0KKwkJCQkKKwkJCQlkaXYuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOworCQkJCWRpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisJCQkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpOworCQkJCQorCQkJCXZhciBzaXplRGl2ID0gZGl2OworCQkJCQorCQkJCWlmIChzaXplRGl2LmZpcnN0Q2hpbGQgIT0gbnVsbCAmJiBzaXplRGl2LmZpcnN0Q2hpbGQubm9kZU5hbWUgPT0gJ0RJVicpCisJCQkJeworCQkJCQlzaXplRGl2ID0gc2l6ZURpdi5maXJzdENoaWxkOworCQkJCX0KKwkJCQkKKwkJCQl2YXIgdG1wID0gc2l6ZURpdi5vZmZzZXRXaWR0aCArIDM7CisJCQkJdmFyIG9oID0gc2l6ZURpdi5vZmZzZXRIZWlnaHQ7CisJCQkJCisJCQkJaWYgKGNsaXApCisJCQkJeworCQkJCQl3ID0gTWF0aC5taW4odywgdG1wKTsKKwkJCQkJb2ggPSBNYXRoLm1pbihvaCwgaCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXcgPSB0bXA7CisJCQkJfQorCisJCQkJLy8gSGFuZGxlcyB3b3JkcyB0aGF0IGFyZSBsb25nZXIgdGhhbiB0aGUgZ2l2ZW4gd3JhcHBpbmcgd2lkdGgKKwkJCQlpZiAod3JhcCkKKwkJCQl7CisJCQkJCWRpdi5zdHlsZS53aWR0aCA9IHcgKyAncHgnOworCQkJCX0KKwkJCQkKKwkJCQkvLyBTaW11bGF0ZXMgbWF4LWhlaWdodCBpbiBxdWlya3MKKwkJCQlpZiAobXhDbGllbnQuSVNfUVVJUktTICYmIChjbGlwIHx8IG92ZXJmbG93ID09ICd3aWR0aCcpICYmIG9oID4gaCkKKwkJCQl7CisJCQkJCW9oID0gaDsKKwkJCQkJCisJCQkJCS8vIFF1aXJrcyBkb2VzIG5vdCBzdXBwb3J0IG1heEhlaWdodAorCQkJCQlkaXYuc3R5bGUuaGVpZ2h0ID0gb2ggKyAncHgnOworCQkJCX0KKwkJCQkKKwkJCQloID0gb2g7CisKKwkJCQl2YXIgdG9wX2ZpeCA9IChoIC0gaCAqIGNvcyArIHcgKiAtc2luKSAvIDIgLSByZWFsX3NpbiAqIHcgKiAoZHggKyAwLjUpICsgcmVhbF9jb3MgKiBoICogKGR5ICsgMC41KTsKKwkJCQl2YXIgbGVmdF9maXggPSAodyAtIHcgKiBjb3MgKyBoICogLXNpbikgLyAyICsgcmVhbF9jb3MgKiB3ICogKGR4ICsgMC41KSArIHJlYWxfc2luICogaCAqIChkeSArIDAuNSk7CisKKwkJCQlpZiAoYWJzLm5vZGVOYW1lID09ICdncm91cCcgJiYgdGhpcy5yb290Lm5vZGVOYW1lID09ICdESVYnKQorCQkJCXsKKwkJCQkJLy8gV29ya2Fyb3VuZCBmb3IgYnVnIHdoZXJlIGdyb3VwIGdldHMgbW92ZWQgYXdheSBpZiBsZWZ0IGFuZCB0b3AgYXJlIG5vbi16ZXJvIGluIElFOCBzdGFuZGFyZHMKKwkJCQkJdmFyIHBvcyA9IHRoaXMuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCQkJCXBvcy5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7CisJCQkJCXBvcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisJCQkJCXBvcy5zdHlsZS5sZWZ0ID0gdGhpcy5mb3JtYXQoeCArIChsZWZ0X2ZpeCAtIHcgLyAyKSAqIHMuc2NhbGUpICsgJ3B4JzsKKwkJCQkJcG9zLnN0eWxlLnRvcCA9IHRoaXMuZm9ybWF0KHkgKyAodG9wX2ZpeCAtIGggLyAyKSAqIHMuc2NhbGUpICsgJ3B4JzsKKwkJCQkJCisJCQkJCWFicy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHBvcyk7CisJCQkJCXBvcy5hcHBlbmRDaGlsZChhYnMpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl2YXIgc2MgPSAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09IDggJiYgIW14Q2xpZW50LklTX0VNKSA/IDEgOiBzLnNjYWxlOworCQkJCQkKKwkJCQkJYWJzLnN0eWxlLmxlZnQgPSB0aGlzLmZvcm1hdCh4ICsgKGxlZnRfZml4IC0gdyAvIDIpICogc2MpICsgJ3B4JzsKKwkJCQkJYWJzLnN0eWxlLnRvcCA9IHRoaXMuZm9ybWF0KHkgKyAodG9wX2ZpeCAtIGggLyAyKSAqIHNjKSArICdweCc7CisJCQkJfQorCQkJCQorCQkJCS8vIEtOT1dOOiBSb3RhdGVkIHRleHQgcmVuZGVyaW5nIHF1YWxpdHkgaXMgYmFkIGZvciBJRTkgcXVpcmtzCisJCQkJaW5uZXIuc3R5bGUuZmlsdGVyID0gInByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5NYXRyaXgoTTExPSIrcmVhbF9jb3MrIiwgTTEyPSIrCisJCQkJCXJlYWxfc2luKyIsIE0yMT0iKygtcmVhbF9zaW4pKyIsIE0yMj0iK3JlYWxfY29zKyIsIHNpemluZ01ldGhvZD0nYXV0byBleHBhbmQnKSI7CisJCQkJaW5uZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5yb3RhdGVkSHRtbEJhY2tncm91bmQ7CisJCQkJCisJCQkJaWYgKHRoaXMuc3RhdGUuYWxwaGEgPCAxKQorCQkJCXsKKwkJCQkJaW5uZXIuc3R5bGUuZmlsdGVyICs9ICdhbHBoYShvcGFjaXR5PScgKyAodGhpcy5zdGF0ZS5hbHBoYSAqIDEwMCkgKyAnKSc7CisJCQkJfQorCisJCQkJLy8gUmVzdG9yZSBwYXJlbnQgbm9kZSBmb3IgRElWCisJCQkJaW5uZXIuYXBwZW5kQ2hpbGQoZGl2KTsKKwkJCQlkaXYuc3R5bGUucG9zaXRpb24gPSAnJzsKKwkJCQlkaXYuc3R5bGUudmlzaWJpbGl0eSA9ICcnOworCQkJfQorCQkJZWxzZSBpZiAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlICE9IDggfHwgbXhDbGllbnQuSVNfRU0pCisJCQl7CisJCQkJZGl2LnN0eWxlLnZlcnRpY2FsQWxpZ24gPSAndG9wJzsKKwkJCQkKKwkJCQlpZiAodGhpcy5zdGF0ZS5hbHBoYSA8IDEpCisJCQkJeworCQkJCQlhYnMuc3R5bGUuZmlsdGVyID0gJ2FscGhhKG9wYWNpdHk9JyArICh0aGlzLnN0YXRlLmFscGhhICogMTAwKSArICcpJzsKKwkJCQl9CisJCQkJCisJCQkJLy8gQWRkcyBkaXYgdG8gZG9jdW1lbnQgdG8gbWVhc3VyZSBzaXplCisJCQkJdmFyIGRpdlBhcmVudCA9IGRpdi5wYXJlbnROb2RlOworCQkJCWRpdi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CisJCQkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpOworCQkJCQorCQkJCXcgPSBkaXYub2Zmc2V0V2lkdGg7CisJCQkJdmFyIG9oID0gZGl2Lm9mZnNldEhlaWdodDsKKwkJCQkKKwkJCQkvLyBTaW11bGF0ZXMgbWF4LWhlaWdodCBpbiBxdWlya3MKKwkJCQlpZiAobXhDbGllbnQuSVNfUVVJUktTICYmIGNsaXAgJiYgb2ggPiBoKQorCQkJCXsKKwkJCQkJb2ggPSBoOworCQkJCQkKKwkJCQkJLy8gUXVpcmtzIGRvZXMgbm90IHN1cHBvcnQgbWF4SGVpZ2h0CisJCQkJCWRpdi5zdHlsZS5oZWlnaHQgPSBvaCArICdweCc7CisJCQkJfQorCQkJCQorCQkJCWggPSBvaDsKKwkJCQkKKwkJCQlkaXYuc3R5bGUudmlzaWJpbGl0eSA9ICcnOworCQkJCWRpdlBhcmVudC5hcHBlbmRDaGlsZChkaXYpOworCQkJCQorCQkJCWFicy5zdHlsZS5sZWZ0ID0gdGhpcy5mb3JtYXQoeCArIHcgKiBkeCAqIHRoaXMuc3RhdGUuc2NhbGUpICsgJ3B4JzsKKwkJCQlhYnMuc3R5bGUudG9wID0gdGhpcy5mb3JtYXQoeSArIGggKiBkeSAqIHRoaXMuc3RhdGUuc2NhbGUpICsgJ3B4JzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAodGhpcy5zdGF0ZS5hbHBoYSA8IDEpCisJCQkJeworCQkJCQlkaXYuc3R5bGUuZmlsdGVyID0gJ2FscGhhKG9wYWNpdHk9JyArICh0aGlzLnN0YXRlLmFscGhhICogMTAwKSArICcpJzsKKwkJCQl9CisJCQkJCisJCQkJLy8gRmFzdGVyIHJlbmRlcmluZyBpbiBJRTggd2l0aG91dCBvZmZzZXRXaWR0aC9IZWlnaHQKKwkJCQlib3guc3R5bGUubGVmdCA9IChkeCAqIDEwMCkgKyAnJSc7CisJCQkJYm94LnN0eWxlLnRvcCA9IChkeSAqIDEwMCkgKyAnJSc7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLnBsYWluVGV4dCh4LCB5LCB3LCBoLCBteFV0aWxzLmh0bWxFbnRpdGllcyhzdHIsIGZhbHNlKSwgYWxpZ24sIHZhbGlnbiwgd3JhcCwgZm9ybWF0LCBvdmVyZmxvdywgY2xpcCwgcm90YXRpb24sIGRpcik7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBwbGFpblRleHQKKyAqIAorICogUGFpbnRzIHRoZSBvdXRsaW5lIG9mIHRoZSBjdXJyZW50IHBhdGguCisgKi8KK214Vm1sQ2FudmFzMkQucHJvdG90eXBlLnBsYWluVGV4dCA9IGZ1bmN0aW9uKHgsIHksIHcsIGgsIHN0ciwgYWxpZ24sIHZhbGlnbiwgd3JhcCwgZm9ybWF0LCBvdmVyZmxvdywgY2xpcCwgcm90YXRpb24sIGRpcikKK3sKKwkvLyBUZXh0RGlyZWN0aW9uIGlzIGlnbm9yZWQgc2luY2UgdGhpcyBjb2RlIGlzIG5vdCB1c2VkIChmb3JtYXQgaXMgYWx3YXlzIEhUTUwgaW4gdGhlIHRleHQgZnVuY3Rpb24pCisJdmFyIHMgPSB0aGlzLnN0YXRlOworCXggPSAoeCArIHMuZHgpICogcy5zY2FsZTsKKwl5ID0gKHkgKyBzLmR5KSAqIHMuc2NhbGU7CisJCisJdmFyIG5vZGUgPSB0aGlzLmNyZWF0ZVZtbEVsZW1lbnQoJ3NoYXBlJyk7CisJbm9kZS5zdHlsZS53aWR0aCA9ICcxcHgnOworCW5vZGUuc3R5bGUuaGVpZ2h0ID0gJzFweCc7CisJbm9kZS5zdHJva2VkID0gJ2ZhbHNlJzsKKworCXZhciBmaWxsID0gdGhpcy5jcmVhdGVWbWxFbGVtZW50KCdmaWxsJyk7CisJZmlsbC5jb2xvciA9IHMuZm9udENvbG9yOworCWZpbGwub3BhY2l0eSA9IChzLmFscGhhICogMTAwKSArICclJzsKKwlub2RlLmFwcGVuZENoaWxkKGZpbGwpOworCQorCXZhciBwYXRoID0gdGhpcy5jcmVhdGVWbWxFbGVtZW50KCdwYXRoJyk7CisJcGF0aC50ZXh0cGF0aG9rID0gJ3RydWUnOworCXBhdGgudiA9ICdtICcgKyB0aGlzLmZvcm1hdCgwKSArICcgJyArIHRoaXMuZm9ybWF0KDApICsgJyBsICcgKyB0aGlzLmZvcm1hdCgxKSArICcgJyArIHRoaXMuZm9ybWF0KDApOworCQorCW5vZGUuYXBwZW5kQ2hpbGQocGF0aCk7CisJCisJLy8gS05PV046IEZvbnQgZmFtaWx5IGFuZCB0ZXh0IGRlY29yYXRpb24gaWdub3JlZAorCXZhciB0cCA9IHRoaXMuY3JlYXRlVm1sRWxlbWVudCgndGV4dHBhdGgnKTsKKwl0cC5zdHlsZS5jc3NUZXh0ID0gJ3YtdGV4dC1hbGlnbjonICsgYWxpZ247CisJdHAuc3R5bGUuYWxpZ24gPSBhbGlnbjsKKwl0cC5zdHlsZS5mb250RmFtaWx5ID0gcy5mb250RmFtaWx5OworCXRwLnN0cmluZyA9IHN0cjsKKwl0cC5vbiA9ICd0cnVlJzsKKwkKKwkvLyBTY2FsZSB2aWEgZm9udHNpemUgaW5zdGVhZCBvZiBub2RlLnN0eWxlLnpvb20gZm9yIGNvcnJlY3Qgb2Zmc2V0cyBpbiBJRTgKKwl2YXIgc2l6ZSA9IHMuZm9udFNpemUgKiBzLnNjYWxlIC8gdGhpcy52bWxTY2FsZTsKKwl0cC5zdHlsZS5mb250U2l6ZSA9IHNpemUgKyAncHgnOworCQorCS8vIEJvbGQKKwlpZiAoKHMuZm9udFN0eWxlICYgbXhDb25zdGFudHMuRk9OVF9CT0xEKSA9PSBteENvbnN0YW50cy5GT05UX0JPTEQpCisJeworCQl0cC5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnOworCX0KKwkKKwkvLyBJdGFsaWMKKwlpZiAoKHMuZm9udFN0eWxlICYgbXhDb25zdGFudHMuRk9OVF9JVEFMSUMpID09IG14Q29uc3RhbnRzLkZPTlRfSVRBTElDKQorCXsKKwkJdHAuc3R5bGUuZm9udFN0eWxlID0gJ2l0YWxpYyc7CisJfQorCisJLy8gVW5kZXJsaW5lCisJaWYgKChzLmZvbnRTdHlsZSAmIG14Q29uc3RhbnRzLkZPTlRfVU5ERVJMSU5FKSA9PSBteENvbnN0YW50cy5GT05UX1VOREVSTElORSkKKwl7CisJCXRwLnN0eWxlLnRleHREZWNvcmF0aW9uID0gJ3VuZGVybGluZSc7CisJfQorCisJdmFyIGxpbmVzID0gc3RyLnNwbGl0KCdcbicpOworCXZhciB0ZXh0SGVpZ2h0ID0gc2l6ZSArIChsaW5lcy5sZW5ndGggLSAxKSAqIHNpemUgKiBteENvbnN0YW50cy5MSU5FX0hFSUdIVDsKKwl2YXIgZHggPSAwOworCXZhciBkeSA9IDA7CisKKwlpZiAodmFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX0JPVFRPTSkKKwl7CisJCWR5ID0gLSB0ZXh0SGVpZ2h0IC8gMjsKKwl9CisJZWxzZSBpZiAodmFsaWduICE9IG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSkgLy8gdG9wCisJeworCQlkeSA9IHRleHRIZWlnaHQgLyAyOworCX0KKworCWlmIChyb3RhdGlvbiAhPSBudWxsKQorCXsKKwkJbm9kZS5zdHlsZS5yb3RhdGlvbiA9IHJvdGF0aW9uOworCQl2YXIgcmFkID0gcm90YXRpb24gKiAoTWF0aC5QSSAvIDE4MCk7CisJCWR4ID0gTWF0aC5zaW4ocmFkKSAqIGR5OworCQlkeSA9IE1hdGguY29zKHJhZCkgKiBkeTsKKwl9CisKKwkvLyBGSVhNRTogQ2xpcHBpbmcgaXMgcmVsYXRpdmUgdG8gYm91bmRpbmcgYm94CisJLyppZiAoY2xpcCkKKwl7CisJCW5vZGUuc3R5bGUuY2xpcCA9ICdyZWN0KDBweCAnICsgdGhpcy5mb3JtYXQodykgKyAncHggJyArIHRoaXMuZm9ybWF0KGgpICsgJ3B4IDBweCknOworCX0qLworCQorCW5vZGUuYXBwZW5kQ2hpbGQodHApOworCW5vZGUuc3R5bGUubGVmdCA9IHRoaXMuZm9ybWF0KHggLSBkeCkgKyAncHgnOworCW5vZGUuc3R5bGUudG9wID0gdGhpcy5mb3JtYXQoeSArIGR5KSArICdweCc7CisJCisJdGhpcy5yb290LmFwcGVuZENoaWxkKG5vZGUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc3Ryb2tlCisgKiAKKyAqIFBhaW50cyB0aGUgb3V0bGluZSBvZiB0aGUgY3VycmVudCBwYXRoLgorICovCitteFZtbENhbnZhczJELnByb3RvdHlwZS5zdHJva2UgPSBmdW5jdGlvbigpCit7CisJdGhpcy5hZGROb2RlKGZhbHNlLCB0cnVlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGZpbGwKKyAqIAorICogRmlsbHMgdGhlIGN1cnJlbnQgcGF0aC4KKyAqLworbXhWbWxDYW52YXMyRC5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLmFkZE5vZGUodHJ1ZSwgZmFsc2UpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZmlsbEFuZFN0cm9rZQorICogCisgKiBGaWxscyBhbmQgcGFpbnRzIHRoZSBvdXRsaW5lIG9mIHRoZSBjdXJyZW50IHBhdGguCisgKi8KK214Vm1sQ2FudmFzMkQucHJvdG90eXBlLmZpbGxBbmRTdHJva2UgPSBmdW5jdGlvbigpCit7CisJdGhpcy5hZGROb2RlKHRydWUsIHRydWUpOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214V2luZG93LmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhXaW5kb3cuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5NWY0OQotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214V2luZG93LmpzCkBAIC0wLDAgKzEsMTEzMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhXaW5kb3cKKyAqIAorICogQmFzaWMgd2luZG93IGluc2lkZSBhIGRvY3VtZW50LgorICogCisgKiBFeGFtcGxlczoKKyAqIAorICogQ3JlYXRpbmcgYSBzaW1wbGUgd2luZG93LgorICoKKyAqIChjb2RlKQorICogdmFyIHRiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisgKiB2YXIgd25kID0gbmV3IG14V2luZG93KCdUaXRsZScsIHRiLCAxMDAsIDEwMCwgMjAwLCAyMDAsIHRydWUsIHRydWUpOworICogd25kLnNldFZpc2libGUodHJ1ZSk7IAorICogKGVuZCkKKyAqCisgKiBDcmVhdGluZyBhIHdpbmRvdyB0aGF0IGNvbnRhaW5zIGFuIGlmcmFtZS4gCisgKiAKKyAqIChjb2RlKQorICogdmFyIGZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CisgKiBmcmFtZS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzE5MnB4Jyk7CisgKiBmcmFtZS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcxNzJweCcpOworICogZnJhbWUuc2V0QXR0cmlidXRlKCdzcmMnLCAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS8nKTsKKyAqIGZyYW1lLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7CisgKiAKKyAqIHZhciB3ID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDsKKyAqIHZhciBoID0gKGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpOworICogdmFyIHduZCA9IG5ldyBteFdpbmRvdygnVGl0bGUnLCBmcmFtZSwgKHctMjAwKS8yLCAoaC0yMDApLzMsIDIwMCwgMjAwKTsKKyAqIHduZC5zZXRWaXNpYmxlKHRydWUpOworICogKGVuZCkKKyAqIAorICogVG8gbGltaXQgdGhlIG1vdmVtZW50IG9mIGEgd2luZG93LCBlZy4gdG8ga2VlcCBpdCBmcm9tIGJlaW5nIG1vdmVkIGJleW9uZAorICogdGhlIHRvcCwgbGVmdCBjb3JuZXIgdGhlIGZvbGxvd2luZyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gKHJlY29tbWVuZGVkKToKKyAqIAorICogKGNvZGUpCisgKiB3bmQuc2V0TG9jYXRpb24gPSBmdW5jdGlvbih4LCB5KQorICogeworICogICB4ID0gTWF0aC5tYXgoMCwgeCk7CisgKiAgIHkgPSBNYXRoLm1heCgwLCB5KTsKKyAqICAgbXhXaW5kb3cucHJvdG90eXBlLnNldExvY2F0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgKiB9OworICogKGVuZCkKKyAqIAorICogT3IgdGhlIGZvbGxvd2luZyBldmVudCBoYW5kbGVyIGNhbiBiZSB1c2VkOgorICogCisgKiAoY29kZSkKKyAqIHduZC5hZGRMaXN0ZW5lcihteEV2ZW50Lk1PVkUsIGZ1bmN0aW9uKGUpCisgKiB7CisgKiAgIHduZC5zZXRMb2NhdGlvbihNYXRoLm1heCgwLCB3bmQuZ2V0WCgpKSwgTWF0aC5tYXgoMCwgd25kLmdldFkoKSkpOworICogfSk7CisgKiAoZW5kKQorICogCisgKiBUbyBrZWVwIGEgd2luZG93IGluc2lkZSB0aGUgY3VycmVudCB3aW5kb3c6CisgKiAKKyAqIChjb2RlKQorICogbXhFdmVudC5hZGRMaXN0ZW5lcih3aW5kb3csICdyZXNpemUnLCBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorICogeworICogICB2YXIgaXcgPSB3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggfHwgZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDsKKyAqICAgdmFyIGloID0gd2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgfHwgZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7CisgKiAgIAorICogICB2YXIgeCA9IHRoaXMud2luZG93LmdldFgoKTsKKyAqICAgdmFyIHkgPSB0aGlzLndpbmRvdy5nZXRZKCk7CisgKiAgIAorICogICBpZiAoeCArIHRoaXMud2luZG93LnRhYmxlLmNsaWVudFdpZHRoID4gaXcpCisgKiAgIHsKKyAqICAgICB4ID0gTWF0aC5tYXgoMCwgaXcgLSB0aGlzLndpbmRvdy50YWJsZS5jbGllbnRXaWR0aCk7CisgKiAgIH0KKyAqICAgCisgKiAgIGlmICh5ICsgdGhpcy53aW5kb3cudGFibGUuY2xpZW50SGVpZ2h0ID4gaWgpCisgKiAgIHsKKyAqICAgICB5ID0gTWF0aC5tYXgoMCwgaWggLSB0aGlzLndpbmRvdy50YWJsZS5jbGllbnRIZWlnaHQpOworICogICB9CisgKiAgIAorICogICBpZiAodGhpcy53aW5kb3cuZ2V0WCgpICE9IHggfHwgdGhpcy53aW5kb3cuZ2V0WSgpICE9IHkpCisgKiAgIHsKKyAqICAgICB0aGlzLndpbmRvdy5zZXRMb2NhdGlvbih4LCB5KTsKKyAqICAgfQorICogfSkpOworICogKGVuZCkKKyAqCisgKiBFdmVudDogbXhFdmVudC5NT1ZFX1NUQVJUCisgKgorICogRmlyZXMgYmVmb3JlIHRoZSB3aW5kb3cgaXMgbW92ZWQuIFRoZSA8Y29kZT5ldmVudDwvY29kZT4gcHJvcGVydHkgY29udGFpbnMKKyAqIHRoZSBjb3JyZXNwb25kaW5nIG1vdXNlIGV2ZW50LgorICoKKyAqIEV2ZW50OiBteEV2ZW50Lk1PVkUKKyAqCisgKiBGaXJlcyB3aGlsZSB0aGUgd2luZG93IGlzIGJlaW5nIG1vdmVkLiBUaGUgPGNvZGU+ZXZlbnQ8L2NvZGU+IHByb3BlcnR5CisgKiBjb250YWlucyB0aGUgY29ycmVzcG9uZGluZyBtb3VzZSBldmVudC4KKyAqCisgKiBFdmVudDogbXhFdmVudC5NT1ZFX0VORAorICoKKyAqIEZpcmVzIGFmdGVyIHRoZSB3aW5kb3cgaXMgbW92ZWQuIFRoZSA8Y29kZT5ldmVudDwvY29kZT4gcHJvcGVydHkgY29udGFpbnMKKyAqIHRoZSBjb3JyZXNwb25kaW5nIG1vdXNlIGV2ZW50LgorICoKKyAqIEV2ZW50OiBteEV2ZW50LlJFU0laRV9TVEFSVAorICoKKyAqIEZpcmVzIGJlZm9yZSB0aGUgd2luZG93IGlzIHJlc2l6ZWQuIFRoZSA8Y29kZT5ldmVudDwvY29kZT4gcHJvcGVydHkgY29udGFpbnMKKyAqIHRoZSBjb3JyZXNwb25kaW5nIG1vdXNlIGV2ZW50LgorICoKKyAqIEV2ZW50OiBteEV2ZW50LlJFU0laRQorICoKKyAqIEZpcmVzIHdoaWxlIHRoZSB3aW5kb3cgaXMgYmVpbmcgcmVzaXplZC4gVGhlIDxjb2RlPmV2ZW50PC9jb2RlPiBwcm9wZXJ0eQorICogY29udGFpbnMgdGhlIGNvcnJlc3BvbmRpbmcgbW91c2UgZXZlbnQuCisgKgorICogRXZlbnQ6IG14RXZlbnQuUkVTSVpFX0VORAorICoKKyAqIEZpcmVzIGFmdGVyIHRoZSB3aW5kb3cgaXMgcmVzaXplZC4gVGhlIDxjb2RlPmV2ZW50PC9jb2RlPiBwcm9wZXJ0eSBjb250YWlucworICogdGhlIGNvcnJlc3BvbmRpbmcgbW91c2UgZXZlbnQuCisgKgorICogRXZlbnQ6IG14RXZlbnQuTUFYSU1JWkUKKyAqIAorICogRmlyZXMgYWZ0ZXIgdGhlIHdpbmRvdyBpcyBtYXhpbWl6ZWQuIFRoZSA8Y29kZT5ldmVudDwvY29kZT4gcHJvcGVydHkKKyAqIGNvbnRhaW5zIHRoZSBjb3JyZXNwb25kaW5nIG1vdXNlIGV2ZW50LgorICogCisgKiBFdmVudDogbXhFdmVudC5NSU5JTUlaRQorICogCisgKiBGaXJlcyBhZnRlciB0aGUgd2luZG93IGlzIG1pbmltaXplZC4gVGhlIDxjb2RlPmV2ZW50PC9jb2RlPiBwcm9wZXJ0eQorICogY29udGFpbnMgdGhlIGNvcnJlc3BvbmRpbmcgbW91c2UgZXZlbnQuCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50Lk5PUk1BTElaRQorICogCisgKiBGaXJlcyBhZnRlciB0aGUgd2luZG93IGlzIG5vcm1hbGl6ZWQsIHRoYXQgaXMsIGl0IHJldHVybmVkIGZyb20KKyAqIG1heGltaXplZCBvciBtaW5pbWl6ZWQgc3RhdGUuIFRoZSA8Y29kZT5ldmVudDwvY29kZT4gcHJvcGVydHkgY29udGFpbnMgdGhlCisgKiBjb3JyZXNwb25kaW5nIG1vdXNlIGV2ZW50LgorICogIAorICogRXZlbnQ6IG14RXZlbnQuQUNUSVZBVEUKKyAqIAorICogRmlyZXMgYWZ0ZXIgYSB3aW5kb3cgaXMgYWN0aXZhdGVkLiBUaGUgPGNvZGU+cHJldmlvdXNXaW5kb3c8L2NvZGU+IHByb3BlcnR5CisgKiBjb250YWlucyB0aGUgcHJldmlvdXMgd2luZG93LiBUaGUgZXZlbnQgc2VuZGVyIGlzIHRoZSBhY3RpdmUgd2luZG93LgorICogCisgKiBFdmVudDogbXhFdmVudC5TSE9XCisgKiAKKyAqIEZpcmVzIGFmdGVyIHRoZSB3aW5kb3cgaXMgc2hvd24uIFRoaXMgZXZlbnQgaGFzIG5vIHByb3BlcnRpZXMuCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LkhJREUKKyAqIAorICogRmlyZXMgYWZ0ZXIgdGhlIHdpbmRvdyBpcyBoaWRkZW4uIFRoaXMgZXZlbnQgaGFzIG5vIHByb3BlcnRpZXMuCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LkNMT1NFCisgKiAKKyAqIEZpcmVzIGJlZm9yZSB0aGUgd2luZG93IGlzIGNsb3NlZC4gVGhlIDxjb2RlPmV2ZW50PC9jb2RlPiBwcm9wZXJ0eSBjb250YWlucworICogdGhlIGNvcnJlc3BvbmRpbmcgbW91c2UgZXZlbnQuCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LkRFU1RST1kKKyAqIAorICogRmlyZXMgYmVmb3JlIHRoZSB3aW5kb3cgaXMgZGVzdHJveWVkLiBUaGlzIGV2ZW50IGhhcyBubyBwcm9wZXJ0aWVzLgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhXaW5kb3cKKyAqIAorICogQ29uc3RydWN0cyBhIG5ldyB3aW5kb3cgd2l0aCB0aGUgZ2l2ZW4gZGltZW5zaW9uIGFuZCB0aXRsZSB0byBkaXNwbGF5CisgKiB0aGUgc3BlY2lmaWVkIGNvbnRlbnQuIFRoZSB3aW5kb3cgZWxlbWVudHMgdXNlIHRoZSBnaXZlbiBzdHlsZSBhcyBhCisgKiBwcmVmaXggZm9yIHRoZSBjbGFzc25hbWVzIG9mIHRoZSByZXNwZWN0aXZlIHdpbmRvdyBlbGVtZW50cywgbmFtZWx5LAorICogdGhlIHdpbmRvdyB0aXRsZSBhbmQgd2luZG93IHBhbmUuIFRoZSByZXNwZWN0aXZlIHBvc3RmaXhlcyBhcmUgYXBwZW5kZWQKKyAqIHRvIHRoZSBnaXZlbiBzdHlsZW5hbWUgYXMgZm9sbG93czoKKyAqIAorICogICBzdHlsZSAtIEJhc2Ugc3R5bGUgZm9yIHRoZSB3aW5kb3cuCisgKiAgIHN0eWxlK1RpdGxlIC0gU3R5bGUgZm9yIHRoZSB3aW5kb3cgdGl0bGUuCisgKiAgIHN0eWxlK1BhbmUgLSBTdHlsZSBmb3IgdGhlIHdpbmRvdyBwYW5lLgorICogCisgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3Igc3R5bGUgaXMgbXhXaW5kb3csIHJlc3VsdGluZyBpbiB0aGUgZm9sbG93aW5nCisgKiBjbGFzc25hbWVzIGZvciB0aGUgd2luZG93IGVsZW1lbnRzOiBteFdpbmRvdywgbXhXaW5kb3dUaXRsZSBhbmQKKyAqIG14V2luZG93UGFuZS4KKyAqIAorICogSWYgcmVwbGFjZU5vZGUgaXMgZ2l2ZW4gdGhlbiB0aGUgd2luZG93IHJlcGxhY2VzIHRoZSBnaXZlbiBET00gbm9kZSBpbgorICogdGhlIGRvY3VtZW50LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB0aXRsZSAtIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHRpdGxlIG9mIHRoZSBuZXcgd2luZG93LgorICogY29udGVudCAtIERPTSBub2RlIHRoYXQgaXMgdXNlZCBhcyB0aGUgd2luZG93IGNvbnRlbnQuCisgKiB4IC0gWC1jb29yZGluYXRlIG9mIHRoZSB3aW5kb3cgbG9jYXRpb24uCisgKiB5IC0gWS1jb29yZGluYXRlIG9mIHRoZSB3aW5kb3cgbG9jYXRpb24uCisgKiB3aWR0aCAtIFdpZHRoIG9mIHRoZSB3aW5kb3cuCisgKiBoZWlnaHQgLSBPcHRpb25hbCBoZWlnaHQgb2YgdGhlIHdpbmRvdy4gRGVmYXVsdCBpcyB0byBtYXRjaCB0aGUgaGVpZ2h0CisgKiBvZiB0aGUgY29udGVudCBhdCB0aGUgc3BlY2lmaWVkIHdpZHRoLgorICogbWluaW1pemFibGUgLSBPcHRpb25hbCBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHdpbmRvdyBpcyBtaW5pbWl6YWJsZS4KKyAqIERlZmF1bHQgaXMgdHJ1ZS4KKyAqIG1vdmFibGUgLSBPcHRpb25hbCBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHdpbmRvdyBpcyBtb3ZhYmxlLiBEZWZhdWx0CisgKiBpcyB0cnVlLgorICogcmVwbGFjZU5vZGUgLSBPcHRpb25hbCBET00gbm9kZSB0aGF0IHRoZSB3aW5kb3cgc2hvdWxkIHJlcGxhY2UuCisgKiBzdHlsZSAtIE9wdGlvbmFsIGJhc2UgY2xhc3NuYW1lIGZvciB0aGUgd2luZG93IGVsZW1lbnRzLiBEZWZhdWx0IGlzCisgKiBteFdpbmRvdy4KKyAqLworZnVuY3Rpb24gbXhXaW5kb3codGl0bGUsIGNvbnRlbnQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIG1pbmltaXphYmxlLCBtb3ZhYmxlLCByZXBsYWNlTm9kZSwgc3R5bGUpCit7CisJaWYgKGNvbnRlbnQgIT0gbnVsbCkKKwl7CisJCW1pbmltaXphYmxlID0gKG1pbmltaXphYmxlICE9IG51bGwpID8gbWluaW1pemFibGUgOiB0cnVlOworCQl0aGlzLmNvbnRlbnQgPSBjb250ZW50OworCQl0aGlzLmluaXQoeCwgeSwgd2lkdGgsIGhlaWdodCwgc3R5bGUpOworCQkKKwkJdGhpcy5pbnN0YWxsTWF4aW1pemVIYW5kbGVyKCk7CisJCXRoaXMuaW5zdGFsbE1pbmltaXplSGFuZGxlcigpOworCQl0aGlzLmluc3RhbGxDbG9zZUhhbmRsZXIoKTsKKwkJdGhpcy5zZXRNaW5pbWl6YWJsZShtaW5pbWl6YWJsZSk7CisJCXRoaXMuc2V0VGl0bGUodGl0bGUpOworCQkKKwkJaWYgKG1vdmFibGUgPT0gbnVsbCB8fCBtb3ZhYmxlKQorCQl7CisJCQl0aGlzLmluc3RhbGxNb3ZlSGFuZGxlcigpOworCQl9CisKKwkJaWYgKHJlcGxhY2VOb2RlICE9IG51bGwgJiYgcmVwbGFjZU5vZGUucGFyZW50Tm9kZSAhPSBudWxsKQorCQl7CisJCQlyZXBsYWNlTm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmRpdiwgcmVwbGFjZU5vZGUpOworCQl9CisJCWVsc2UKKwkJeworCQkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmRpdik7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhFdmVudFNvdXJjZS4KKyAqLworbXhXaW5kb3cucHJvdG90eXBlID0gbmV3IG14RXZlbnRTb3VyY2UoKTsKK214V2luZG93LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG14V2luZG93OworCisvKioKKyAqIFZhcmlhYmxlOiBjbG9zZUltYWdlCisgKiAKKyAqIFVSTCBvZiB0aGUgaW1hZ2UgdG8gYmUgdXNlZCBmb3IgdGhlIGNsb3NlIGljb24gaW4gdGhlIHRpdGxlYmFyLgorICovCitteFdpbmRvdy5wcm90b3R5cGUuY2xvc2VJbWFnZSA9IG14Q2xpZW50LmltYWdlQmFzZVBhdGggKyAnL2Nsb3NlLmdpZic7CisKKy8qKgorICogVmFyaWFibGU6IG1pbmltaXplSW1hZ2UKKyAqIAorICogVVJMIG9mIHRoZSBpbWFnZSB0byBiZSB1c2VkIGZvciB0aGUgbWluaW1pemUgaWNvbiBpbiB0aGUgdGl0bGViYXIuCisgKi8KK214V2luZG93LnByb3RvdHlwZS5taW5pbWl6ZUltYWdlID0gbXhDbGllbnQuaW1hZ2VCYXNlUGF0aCArICcvbWluaW1pemUuZ2lmJzsKKwkKKy8qKgorICogVmFyaWFibGU6IG5vcm1hbGl6ZUltYWdlCisgKiAKKyAqIFVSTCBvZiB0aGUgaW1hZ2UgdG8gYmUgdXNlZCBmb3IgdGhlIG5vcm1hbGl6ZSBpY29uIGluIHRoZSB0aXRsZWJhci4KKyAqLworbXhXaW5kb3cucHJvdG90eXBlLm5vcm1hbGl6ZUltYWdlID0gbXhDbGllbnQuaW1hZ2VCYXNlUGF0aCArICcvbm9ybWFsaXplLmdpZic7CisJCisvKioKKyAqIFZhcmlhYmxlOiBtYXhpbWl6ZUltYWdlCisgKiAKKyAqIFVSTCBvZiB0aGUgaW1hZ2UgdG8gYmUgdXNlZCBmb3IgdGhlIG1heGltaXplIGljb24gaW4gdGhlIHRpdGxlYmFyLgorICovCitteFdpbmRvdy5wcm90b3R5cGUubWF4aW1pemVJbWFnZSA9IG14Q2xpZW50LmltYWdlQmFzZVBhdGggKyAnL21heGltaXplLmdpZic7CisKKy8qKgorICogVmFyaWFibGU6IG5vcm1hbGl6ZUltYWdlCisgKiAKKyAqIFVSTCBvZiB0aGUgaW1hZ2UgdG8gYmUgdXNlZCBmb3IgdGhlIHJlc2l6ZSBpY29uLgorICovCitteFdpbmRvdy5wcm90b3R5cGUucmVzaXplSW1hZ2UgPSBteENsaWVudC5pbWFnZUJhc2VQYXRoICsgJy9yZXNpemUuZ2lmJzsKKworLyoqCisgKiBWYXJpYWJsZTogdmlzaWJsZQorICogCisgKiBCb29sZWFuIGZsYWcgdGhhdCByZXByZXNlbnRzIHRoZSB2aXNpYmxlIHN0YXRlIG9mIHRoZSB3aW5kb3cuCisgKi8KK214V2luZG93LnByb3RvdHlwZS52aXNpYmxlID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IG1pbmltdW1TaXplCisgKiAKKyAqIDxteFJlY3RhbmdsZT4gdGhhdCBzcGVjaWZpZXMgdGhlIG1pbmltdW0gd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgd2luZG93LgorICogRGVmYXVsdCBpcyAoNTAsIDQwKS4KKyAqLworbXhXaW5kb3cucHJvdG90eXBlLm1pbmltdW1TaXplID0gbmV3IG14UmVjdGFuZ2xlKDAsIDAsIDUwLCA0MCk7CisKKy8qKgorICogVmFyaWFibGU6IGRlc3Ryb3lPbkNsb3NlCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgd2luZG93IHNob3VsZCBiZSBkZXN0cm95ZWQgd2hlbiBpdCBpcyBjbG9zZWQuIElmIHRoaXMKKyAqIGlzIGZhbHNlIHRoZW4gdGhlIHdpbmRvdyBpcyBoaWRkZW4gdXNpbmcgPHNldFZpc2libGU+LiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214V2luZG93LnByb3RvdHlwZS5kZXN0cm95T25DbG9zZSA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGNvbnRlbnRIZWlnaHRDb3JyZWN0aW9uCisgKiAKKyAqIERlZmluZXMgdGhlIGNvcnJlY3Rpb24gZmFjdG9yIGZvciBjb21wdXRpbmcgdGhlIGhlaWdodCBvZiB0aGUgY29udGVudFdyYXBwZXIuCisgKiBEZWZhdWx0IGlzIDYgZm9yIElFIDcvOCBzdGFuZGFyZHMgbW9kZSBhbmQgMiBmb3IgYWxsIG90aGVyIGJyb3dzZXJzIGFuZCBtb2Rlcy4KKyAqLworbXhXaW5kb3cucHJvdG90eXBlLmNvbnRlbnRIZWlnaHRDb3JyZWN0aW9uID0gKGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSA4IHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSA3KSA/IDYgOiAyOworCisvKioKKyAqIFZhcmlhYmxlOiB0aXRsZQorICogCisgKiBSZWZlcmVuY2UgdG8gdGhlIERPTSBub2RlIChURCkgdGhhdCBjb250YWlucyB0aGUgdGl0bGUuCisgKi8KK214V2luZG93LnByb3RvdHlwZS50aXRsZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGNvbnRlbnQKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSBET00gbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIHdpbmRvdyBjb250ZW50LgorICovCitteFdpbmRvdy5wcm90b3R5cGUuY29udGVudCA9IG51bGw7CisKKy8qKgorICogRnVuY3Rpb246IGluaXQKKyAqIAorICogSW5pdGlhbGl6ZXMgdGhlIERPTSB0cmVlIHRoYXQgcmVwcmVzZW50cyB0aGUgd2luZG93LgorICovCitteFdpbmRvdy5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKHgsIHksIHdpZHRoLCBoZWlnaHQsIHN0eWxlKQoreworCXN0eWxlID0gKHN0eWxlICE9IG51bGwpID8gc3R5bGUgOiAnbXhXaW5kb3cnOworCQorCXRoaXMuZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJdGhpcy5kaXYuY2xhc3NOYW1lID0gc3R5bGU7CisKKwl0aGlzLmRpdi5zdHlsZS5sZWZ0ID0geCArICdweCc7CisJdGhpcy5kaXYuc3R5bGUudG9wID0geSArICdweCc7CisJdGhpcy50YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJyk7CisJdGhpcy50YWJsZS5jbGFzc05hbWUgPSBzdHlsZTsKKworCS8vIERpc2FibGVzIGJ1aWx0LWluIHBhbiBhbmQgem9vbSBpbiBJRTEwIGFuZCBsYXRlcgorCWlmIChteENsaWVudC5JU19QT0lOVEVSKQorCXsKKwkJdGhpcy5kaXYuc3R5bGUudG91Y2hBY3Rpb24gPSAnbm9uZSc7CisJfQorCQorCS8vIFdvcmthcm91bmQgZm9yIHRhYmxlIHNpemUgcHJvYmxlbXMgaW4gRkYKKwlpZiAod2lkdGggIT0gbnVsbCkKKwl7CisJCWlmICghbXhDbGllbnQuSVNfUVVJUktTKQorCQl7CisJCQl0aGlzLmRpdi5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JzsgCisJCX0KKwkJCisJCXRoaXMudGFibGUuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7CisJfSAKKwkKKwlpZiAoaGVpZ2h0ICE9IG51bGwpCisJeworCQlpZiAoIW14Q2xpZW50LklTX1FVSVJLUykKKwkJeworCQkJdGhpcy5kaXYuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JzsKKwkJfQorCQkKKwkJdGhpcy50YWJsZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnOworCX0JCQorCQorCS8vIENyZWF0ZXMgdGl0bGUgcm93CisJdmFyIHRib2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGJvZHknKTsKKwl2YXIgdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOworCQorCXRoaXMudGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOworCXRoaXMudGl0bGUuY2xhc3NOYW1lID0gc3R5bGUgKyAnVGl0bGUnOworCQorCXRoaXMuYnV0dG9ucyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworCXRoaXMuYnV0dG9ucy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisJdGhpcy5idXR0b25zLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsKKwl0aGlzLmJ1dHRvbnMuc3R5bGUucmlnaHQgPSAnNHB4JzsKKwl0aGlzLmJ1dHRvbnMuc3R5bGUudG9wID0gJzVweCc7CisJdGhpcy50aXRsZS5hcHBlbmRDaGlsZCh0aGlzLmJ1dHRvbnMpOworCQorCXRyLmFwcGVuZENoaWxkKHRoaXMudGl0bGUpOworCXRib2R5LmFwcGVuZENoaWxkKHRyKTsKKwkKKwkvLyBDcmVhdGVzIGNvbnRlbnQgcm93IGFuZCB0YWJsZSBjZWxsCisJdHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOworCXRoaXMudGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOworCXRoaXMudGQuY2xhc3NOYW1lID0gc3R5bGUgKyAnUGFuZSc7CisJCisJaWYgKGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSA3KQorCXsKKwkJdGhpcy50ZC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7CisJfQorCisJdGhpcy5jb250ZW50V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworCXRoaXMuY29udGVudFdyYXBwZXIuY2xhc3NOYW1lID0gc3R5bGUgKyAnUGFuZSc7CisJdGhpcy5jb250ZW50V3JhcHBlci5zdHlsZS53aWR0aCA9ICcxMDAlJzsKKwl0aGlzLmNvbnRlbnRXcmFwcGVyLmFwcGVuZENoaWxkKHRoaXMuY29udGVudCk7CisKKwkvLyBXb3JrYXJvdW5kIGZvciBkaXYgYXJvdW5kIGRpdiByZXN0cmljdHMgaGVpZ2h0CisJLy8gb2YgaW5uZXIgZGl2IGlmIG91dGVyZGl2IGhhcyBoaWRkZW4gb3ZlcmZsb3cKKwlpZiAobXhDbGllbnQuSVNfUVVJUktTIHx8IHRoaXMuY29udGVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpICE9ICdESVYnKQorCXsKKwkJdGhpcy5jb250ZW50V3JhcHBlci5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7CisJfQorCisJLy8gUHV0cyBhbGwgY29udGVudCBpbnRvIHRoZSBET00KKwl0aGlzLnRkLmFwcGVuZENoaWxkKHRoaXMuY29udGVudFdyYXBwZXIpOworCXRyLmFwcGVuZENoaWxkKHRoaXMudGQpOworCXRib2R5LmFwcGVuZENoaWxkKHRyKTsKKwl0aGlzLnRhYmxlLmFwcGVuZENoaWxkKHRib2R5KTsKKwl0aGlzLmRpdi5hcHBlbmRDaGlsZCh0aGlzLnRhYmxlKTsKKwkKKwkvLyBQdXRzIHRoZSB3aW5kb3cgb24gdG9wIG9mIG90aGVyIHdpbmRvd3Mgd2hlbiBjbGlja2VkCisJdmFyIGFjdGl2YXRvciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJeworCQl0aGlzLmFjdGl2YXRlKCk7CisJfSk7CisJCisJbXhFdmVudC5hZGRHZXN0dXJlTGlzdGVuZXJzKHRoaXMudGl0bGUsIGFjdGl2YXRvcik7CisJbXhFdmVudC5hZGRHZXN0dXJlTGlzdGVuZXJzKHRoaXMudGFibGUsIGFjdGl2YXRvcik7CisKKwl0aGlzLmhpZGUoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFRpdGxlCisgKiAKKyAqIFNldHMgdGhlIHdpbmRvdyB0aXRsZSB0byB0aGUgZ2l2ZW4gc3RyaW5nLiBIVE1MIG1hcmt1cCBpbnNpZGUgdGhlIHRpdGxlCisgKiB3aWxsIGJlIGVzY2FwZWQuCisgKi8KK214V2luZG93LnByb3RvdHlwZS5zZXRUaXRsZSA9IGZ1bmN0aW9uKHRpdGxlKQoreworCS8vIFJlbW92ZXMgYWxsIHRleHQgY29udGVudCBub2RlcyAobm9ybWFsbHkganVzdCBvbmUpCisJdmFyIGNoaWxkID0gdGhpcy50aXRsZS5maXJzdENoaWxkOworCQorCXdoaWxlIChjaGlsZCAhPSBudWxsKQorCXsKKwkJdmFyIG5leHQgPSBjaGlsZC5uZXh0U2libGluZzsKKwkJCisJCWlmIChjaGlsZC5ub2RlVHlwZSA9PSBteENvbnN0YW50cy5OT0RFVFlQRV9URVhUKQorCQl7CisJCQljaGlsZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNoaWxkKTsKKwkJfQorCQkKKwkJY2hpbGQgPSBuZXh0OworCX0KKwkKKwlteFV0aWxzLndyaXRlKHRoaXMudGl0bGUsIHRpdGxlIHx8ICcnKTsKKwl0aGlzLnRpdGxlLmFwcGVuZENoaWxkKHRoaXMuYnV0dG9ucyk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRTY3JvbGxhYmxlCisgKiAKKyAqIFNldHMgaWYgdGhlIHdpbmRvdyBjb250ZW50cyBzaG91bGQgYmUgc2Nyb2xsYWJsZS4KKyAqLworbXhXaW5kb3cucHJvdG90eXBlLnNldFNjcm9sbGFibGUgPSBmdW5jdGlvbihzY3JvbGxhYmxlKQoreworCS8vIFdvcmthcm91bmQgZm9yIGhhbmcgaW4gUHJlc3RvIDIuNS4yMiAoT3BlcmEgMTAuNSkKKwlpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdQcmVzdG8vMi41JykgPCAwKQorCXsKKwkJaWYgKHNjcm9sbGFibGUpCisJCXsKKwkJCXRoaXMuY29udGVudFdyYXBwZXIuc3R5bGUub3ZlcmZsb3cgPSAnYXV0byc7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLmNvbnRlbnRXcmFwcGVyLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhY3RpdmF0ZQorICogCisgKiBQdXRzIHRoZSB3aW5kb3cgb24gdG9wIG9mIGFsbCBvdGhlciB3aW5kb3dzLgorICovCitteFdpbmRvdy5wcm90b3R5cGUuYWN0aXZhdGUgPSBmdW5jdGlvbigpCit7CisJaWYgKG14V2luZG93LmFjdGl2ZVdpbmRvdyAhPSB0aGlzKQorCXsKKwkJdmFyIHN0eWxlID0gbXhVdGlscy5nZXRDdXJyZW50U3R5bGUodGhpcy5nZXRFbGVtZW50KCkpOworCQl2YXIgaW5kZXggPSAoc3R5bGUgIT0gbnVsbCkgPyBzdHlsZS56SW5kZXggOiAzOworCisJCWlmIChteFdpbmRvdy5hY3RpdmVXaW5kb3cpCisJCXsKKwkJCXZhciBlbHQgPSBteFdpbmRvdy5hY3RpdmVXaW5kb3cuZ2V0RWxlbWVudCgpOworCQkJCisJCQlpZiAoZWx0ICE9IG51bGwgJiYgZWx0LnN0eWxlICE9IG51bGwpCisJCQl7CisJCQkJZWx0LnN0eWxlLnpJbmRleCA9IGluZGV4OworCQkJfQorCQl9CisJCQorCQl2YXIgcHJldmlvdXNXaW5kb3cgPSBteFdpbmRvdy5hY3RpdmVXaW5kb3c7CisJCXRoaXMuZ2V0RWxlbWVudCgpLnN0eWxlLnpJbmRleCA9IHBhcnNlSW50KGluZGV4KSArIDE7CisJCW14V2luZG93LmFjdGl2ZVdpbmRvdyA9IHRoaXM7CisJCQorCQl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LkFDVElWQVRFLCAncHJldmlvdXNXaW5kb3cnLCBwcmV2aW91c1dpbmRvdykpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEVsZW1lbnQKKyAqIAorICogUmV0dXJ1bnMgdGhlIG91dGVybW9zdCBET00gbm9kZSB0aGF0IG1ha2VzIHVwIHRoZSB3aW5kb3cuCisgKi8KK214V2luZG93LnByb3RvdHlwZS5nZXRFbGVtZW50ID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmRpdjsKK307CisKKy8qKgorICogRnVuY3Rpb246IGZpdAorICogCisgKiBNYWtlcyBzdXJlIHRoZSB3aW5kb3cgaXMgaW5zaWRlIHRoZSBjbGllbnQgYXJlYSBvZiB0aGUgd2luZG93LgorICovCitteFdpbmRvdy5wcm90b3R5cGUuZml0ID0gZnVuY3Rpb24oKQoreworCW14VXRpbHMuZml0KHRoaXMuZGl2KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzUmVzaXphYmxlCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGlzIHJlc2l6YWJsZS4KKyAqLworbXhXaW5kb3cucHJvdG90eXBlLmlzUmVzaXphYmxlID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLnJlc2l6ZSAhPSBudWxsKQorCXsKKwkJcmV0dXJuIHRoaXMucmVzaXplLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnOworCX0KKwkKKwlyZXR1cm4gZmFsc2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRSZXNpemFibGUKKyAqIAorICogU2V0cyBpZiB0aGUgd2luZG93IHNob3VsZCBiZSByZXNpemFibGUuIFRvIGF2b2lkIGludGVyZmVyZW5jZSB3aXRoIHNvbWUKKyAqIGJ1aWx0LWluIGZlYXR1cmVzIG9mIElFMTAgYW5kIGxhdGVyLCB0aGUgdXNlIG9mIHRoZSBmb2xsb3dpbmcgY29kZSBpcworICogcmVjb21tZW5kZWQgaWYgdGhlcmUgYXJlIHJlc2l6YWJsZSA8bXhXaW5kb3c+cyBpbiB0aGUgcGFnZToKKyAqIAorICogKGNvZGUpCisgKiBpZiAobXhDbGllbnQuSVNfUE9JTlRFUikKKyAqIHsKKyAqICAgZG9jdW1lbnQuYm9keS5zdHlsZS5tc1RvdWNoQWN0aW9uID0gJ25vbmUnOworICogfQorICogKGVuZCkKKyAqLworbXhXaW5kb3cucHJvdG90eXBlLnNldFJlc2l6YWJsZSA9IGZ1bmN0aW9uKHJlc2l6YWJsZSkKK3sKKwlpZiAocmVzaXphYmxlKQorCXsKKwkJaWYgKHRoaXMucmVzaXplID09IG51bGwpCisJCXsKKwkJCXRoaXMucmVzaXplID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CisJCQl0aGlzLnJlc2l6ZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisJCQl0aGlzLnJlc2l6ZS5zdHlsZS5ib3R0b20gPSAnMnB4JzsKKwkJCXRoaXMucmVzaXplLnN0eWxlLnJpZ2h0ID0gJzJweCc7CisKKwkJCXRoaXMucmVzaXplLnNldEF0dHJpYnV0ZSgnc3JjJywgbXhDbGllbnQuaW1hZ2VCYXNlUGF0aCArICcvcmVzaXplLmdpZicpOworCQkJdGhpcy5yZXNpemUuc3R5bGUuY3Vyc29yID0gJ253LXJlc2l6ZSc7CisJCQkKKwkJCXZhciBzdGFydFggPSBudWxsOworCQkJdmFyIHN0YXJ0WSA9IG51bGw7CisJCQl2YXIgd2lkdGggPSBudWxsOworCQkJdmFyIGhlaWdodCA9IG51bGw7CisJCQkKKwkJCXZhciBzdGFydCA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJCQl7CisJCQkJLy8gTEFURVI6IHBvaW50ZXJkb3duIHN0YXJ0aW5nIG9uIGJvcmRlciBvZiByZXNpemUgZG9lcyBzdGFydAorCQkJCS8vIHRoZSBkcmFnIG9wZXJhdGlvbiBidXQgZG9lcyBub3QgZmlyZSBjb25zZWN1dGl2ZSBldmVudHMgdmlhCisJCQkJLy8gb25lIG9mIHRoZSBsaXN0ZW5lcnMgYmVsb3cgKGRvZXMgcGFuIGluc3RlYWQpLgorCQkJCS8vIFdvcmthcm91bmQ6IGRvY3VtZW50LmJvZHkuc3R5bGUubXNUb3VjaEFjdGlvbiA9ICdub25lJworCQkJCXRoaXMuYWN0aXZhdGUoKTsKKwkJCQlzdGFydFggPSBteEV2ZW50LmdldENsaWVudFgoZXZ0KTsKKwkJCQlzdGFydFkgPSBteEV2ZW50LmdldENsaWVudFkoZXZ0KTsKKwkJCQl3aWR0aCA9IHRoaXMuZGl2Lm9mZnNldFdpZHRoOworCQkJCWhlaWdodCA9IHRoaXMuZGl2Lm9mZnNldEhlaWdodDsKKwkJCQkKKwkJCQlteEV2ZW50LmFkZEdlc3R1cmVMaXN0ZW5lcnMoZG9jdW1lbnQsIG51bGwsIGRyYWdIYW5kbGVyLCBkcm9wSGFuZGxlcik7CisJCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5SRVNJWkVfU1RBUlQsICdldmVudCcsIGV2dCkpOworCQkJCW14RXZlbnQuY29uc3VtZShldnQpOworCQkJfSk7CisKKwkJCS8vIEFkZHMgYSB0ZW1wb3JhcnkgcGFpciBvZiBsaXN0ZW5lcnMgdG8gaW50ZXJjZXB0CisJCQkvLyB0aGUgZ2VzdHVyZSBldmVudCBpbiB0aGUgZG9jdW1lbnQKKwkJCXZhciBkcmFnSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJCQl7CisJCQkJaWYgKHN0YXJ0WCAhPSBudWxsICYmIHN0YXJ0WSAhPSBudWxsKQorCQkJCXsKKwkJCQkJdmFyIGR4ID0gbXhFdmVudC5nZXRDbGllbnRYKGV2dCkgLSBzdGFydFg7CisJCQkJCXZhciBkeSA9IG14RXZlbnQuZ2V0Q2xpZW50WShldnQpIC0gc3RhcnRZOworCQorCQkJCQl0aGlzLnNldFNpemUod2lkdGggKyBkeCwgaGVpZ2h0ICsgZHkpOworCQorCQkJCQl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LlJFU0laRSwgJ2V2ZW50JywgZXZ0KSk7CisJCQkJCW14RXZlbnQuY29uc3VtZShldnQpOworCQkJCX0KKwkJCX0pOworCQkJCisJCQl2YXIgZHJvcEhhbmRsZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQkJeworCQkJCWlmIChzdGFydFggIT0gbnVsbCAmJiBzdGFydFkgIT0gbnVsbCkKKwkJCQl7CisJCQkJCXN0YXJ0WCA9IG51bGw7CisJCQkJCXN0YXJ0WSA9IG51bGw7CisJCQkJCW14RXZlbnQucmVtb3ZlR2VzdHVyZUxpc3RlbmVycyhkb2N1bWVudCwgbnVsbCwgZHJhZ0hhbmRsZXIsIGRyb3BIYW5kbGVyKTsKKwkJCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5SRVNJWkVfRU5ELCAnZXZlbnQnLCBldnQpKTsKKwkJCQkJbXhFdmVudC5jb25zdW1lKGV2dCk7CisJCQkJfQorCQkJfSk7CisJCQkKKwkJCW14RXZlbnQuYWRkR2VzdHVyZUxpc3RlbmVycyh0aGlzLnJlc2l6ZSwgc3RhcnQsIGRyYWdIYW5kbGVyLCBkcm9wSGFuZGxlcik7CisJCQl0aGlzLmRpdi5hcHBlbmRDaGlsZCh0aGlzLnJlc2l6ZSk7CisJCX0KKwkJZWxzZSAKKwkJeworCQkJdGhpcy5yZXNpemUuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnOworCQl9CisJfQorCWVsc2UgaWYgKHRoaXMucmVzaXplICE9IG51bGwpCisJeworCQl0aGlzLnJlc2l6ZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworCX0KK307CisJCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRTaXplCisgKiAKKyAqIFNldHMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdy4KKyAqLworbXhXaW5kb3cucHJvdG90eXBlLnNldFNpemUgPSBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KQoreworCXdpZHRoID0gTWF0aC5tYXgodGhpcy5taW5pbXVtU2l6ZS53aWR0aCwgd2lkdGgpOworCWhlaWdodCA9IE1hdGgubWF4KHRoaXMubWluaW11bVNpemUuaGVpZ2h0LCBoZWlnaHQpOworCisJLy8gV29ya2Fyb3VuZCBmb3IgdGFibGUgc2l6ZSBwcm9ibGVtcyBpbiBGRgorCWlmICghbXhDbGllbnQuSVNfUVVJUktTKQorCXsKKwkJdGhpcy5kaXYuc3R5bGUud2lkdGggPSAgd2lkdGggKyAncHgnOworCQl0aGlzLmRpdi5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnOworCX0KKwkKKwl0aGlzLnRhYmxlLnN0eWxlLndpZHRoID0gIHdpZHRoICsgJ3B4JzsKKwl0aGlzLnRhYmxlLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7CisKKwlpZiAoIW14Q2xpZW50LklTX1FVSVJLUykKKwl7CisJCXRoaXMuY29udGVudFdyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gKHRoaXMuZGl2Lm9mZnNldEhlaWdodCAtCisJCQl0aGlzLnRpdGxlLm9mZnNldEhlaWdodCAtIHRoaXMuY29udGVudEhlaWdodENvcnJlY3Rpb24pICsgJ3B4JzsKKwl9Cit9OworCQorLyoqCisgKiBGdW5jdGlvbjogc2V0TWluaW1pemFibGUKKyAqIAorICogU2V0cyBpZiB0aGUgd2luZG93IGlzIG1pbmltaXphYmxlLgorICovCitteFdpbmRvdy5wcm90b3R5cGUuc2V0TWluaW1pemFibGUgPSBmdW5jdGlvbihtaW5pbWl6YWJsZSkKK3sKKwl0aGlzLm1pbmltaXplLnN0eWxlLmRpc3BsYXkgPSAobWluaW1pemFibGUpID8gJycgOiAnbm9uZSc7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRNaW5pbXVtU2l6ZQorICogCisgKiBSZXR1cm5zIGFuIDxteFJlY3RhbmdsZT4gdGhhdCBzcGVjaWZpZXMgdGhlIHNpemUgZm9yIHRoZSBtaW5pbWl6ZWQgd2luZG93LgorICogQSB3aWR0aCBvciBoZWlnaHQgb2YgMCBtZWFucyBrZWVwIHRoZSBleGlzdGluZyB3aWR0aCBvciBoZWlnaHQuIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgd2luZG93IHRpdGxlIGFuZCBrZWVwcyB0aGUgd2lkdGguCisgKi8KK214V2luZG93LnByb3RvdHlwZS5nZXRNaW5pbXVtU2l6ZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gbmV3IG14UmVjdGFuZ2xlKDAsIDAsIDAsIHRoaXMudGl0bGUub2Zmc2V0SGVpZ2h0KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGluc3RhbGxNaW5pbWl6ZUhhbmRsZXIKKyAqIAorICogSW5zdGFsbHMgdGhlIGV2ZW50IGxpc3RlbmVycyByZXF1aXJlZCBmb3IgbWluaW1pemluZyB0aGUgd2luZG93LgorICovCitteFdpbmRvdy5wcm90b3R5cGUuaW5zdGFsbE1pbmltaXplSGFuZGxlciA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLm1pbmltaXplID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CisJCisJdGhpcy5taW5pbWl6ZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIHRoaXMubWluaW1pemVJbWFnZSk7CisJdGhpcy5taW5pbWl6ZS5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ01pbmltaXplJyk7CisJdGhpcy5taW5pbWl6ZS5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7CisJdGhpcy5taW5pbWl6ZS5zdHlsZS5tYXJnaW5MZWZ0ID0gJzJweCc7CisJdGhpcy5taW5pbWl6ZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworCQorCXRoaXMuYnV0dG9ucy5hcHBlbmRDaGlsZCh0aGlzLm1pbmltaXplKTsKKwkKKwl2YXIgbWluaW1pemVkID0gZmFsc2U7CisJdmFyIG1heERpc3BsYXkgPSBudWxsOworCXZhciBoZWlnaHQgPSBudWxsOworCisJdmFyIGZ1bmN0ID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwl7CisJCXRoaXMuYWN0aXZhdGUoKTsKKwkJCisJCWlmICghbWluaW1pemVkKQorCQl7CisJCQltaW5pbWl6ZWQgPSB0cnVlOworCQkJCisJCQl0aGlzLm1pbmltaXplLnNldEF0dHJpYnV0ZSgnc3JjJywgdGhpcy5ub3JtYWxpemVJbWFnZSk7CisJCQl0aGlzLm1pbmltaXplLnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnTm9ybWFsaXplJyk7CisJCQl0aGlzLmNvbnRlbnRXcmFwcGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisJCQltYXhEaXNwbGF5ID0gdGhpcy5tYXhpbWl6ZS5zdHlsZS5kaXNwbGF5OworCQkJCisJCQl0aGlzLm1heGltaXplLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisJCQloZWlnaHQgPSB0aGlzLnRhYmxlLnN0eWxlLmhlaWdodDsKKwkJCQorCQkJdmFyIG1pblNpemUgPSB0aGlzLmdldE1pbmltdW1TaXplKCk7CisJCQkKKwkJCWlmIChtaW5TaXplLmhlaWdodCA+IDApCisJCQl7CisJCQkJaWYgKCFteENsaWVudC5JU19RVUlSS1MpCisJCQkJeworCQkJCQl0aGlzLmRpdi5zdHlsZS5oZWlnaHQgPSBtaW5TaXplLmhlaWdodCArICdweCc7CisJCQkJfQorCQkJCQorCQkJCXRoaXMudGFibGUuc3R5bGUuaGVpZ2h0ID0gbWluU2l6ZS5oZWlnaHQgKyAncHgnOworCQkJfQorCQkJCisJCQlpZiAobWluU2l6ZS53aWR0aCA+IDApCisJCQl7CisJCQkJaWYgKCFteENsaWVudC5JU19RVUlSS1MpCisJCQkJeworCQkJCQl0aGlzLmRpdi5zdHlsZS53aWR0aCA9IG1pblNpemUud2lkdGggKyAncHgnOworCQkJCX0KKwkJCQkKKwkJCQl0aGlzLnRhYmxlLnN0eWxlLndpZHRoID0gbWluU2l6ZS53aWR0aCArICdweCc7CisJCQl9CisJCQkKKwkJCWlmICh0aGlzLnJlc2l6ZSAhPSBudWxsKQorCQkJeworCQkJCXRoaXMucmVzaXplLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKKwkJCX0KKwkJCQorCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5NSU5JTUlaRSwgJ2V2ZW50JywgZXZ0KSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQltaW5pbWl6ZWQgPSBmYWxzZTsKKwkJCQorCQkJdGhpcy5taW5pbWl6ZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIHRoaXMubWluaW1pemVJbWFnZSk7CisJCQl0aGlzLm1pbmltaXplLnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnTWluaW1pemUnKTsKKwkJCXRoaXMuY29udGVudFdyYXBwZXIuc3R5bGUuZGlzcGxheSA9ICcnOyAvLyBkZWZhdWx0CisJCQl0aGlzLm1heGltaXplLnN0eWxlLmRpc3BsYXkgPSBtYXhEaXNwbGF5OworCQkJCisJCQlpZiAoIW14Q2xpZW50LklTX1FVSVJLUykKKwkJCXsKKwkJCQl0aGlzLmRpdi5zdHlsZS5oZWlnaHQgPSBoZWlnaHQ7CisJCQl9CisJCQkKKwkJCXRoaXMudGFibGUuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0OworCisJCQlpZiAodGhpcy5yZXNpemUgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLnJlc2l6ZS5zdHlsZS52aXNpYmlsaXR5ID0gJyc7CisJCQl9CisJCQkKKwkJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuTk9STUFMSVpFLCAnZXZlbnQnLCBldnQpKTsKKwkJfQorCQkKKwkJbXhFdmVudC5jb25zdW1lKGV2dCk7CisJfSk7CisJCisJbXhFdmVudC5hZGRHZXN0dXJlTGlzdGVuZXJzKHRoaXMubWluaW1pemUsIGZ1bmN0KTsKK307CisJCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRNYXhpbWl6YWJsZQorICogCisgKiBTZXRzIGlmIHRoZSB3aW5kb3cgaXMgbWF4aW1pemFibGUuCisgKi8KK214V2luZG93LnByb3RvdHlwZS5zZXRNYXhpbWl6YWJsZSA9IGZ1bmN0aW9uKG1heGltaXphYmxlKQoreworCXRoaXMubWF4aW1pemUuc3R5bGUuZGlzcGxheSA9IChtYXhpbWl6YWJsZSkgPyAnJyA6ICdub25lJzsKK307CisKKy8qKgorICogRnVuY3Rpb246IGluc3RhbGxNYXhpbWl6ZUhhbmRsZXIKKyAqIAorICogSW5zdGFsbHMgdGhlIGV2ZW50IGxpc3RlbmVycyByZXF1aXJlZCBmb3IgbWF4aW1pemluZyB0aGUgd2luZG93LgorICovCitteFdpbmRvdy5wcm90b3R5cGUuaW5zdGFsbE1heGltaXplSGFuZGxlciA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLm1heGltaXplID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CisJCisJdGhpcy5tYXhpbWl6ZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIHRoaXMubWF4aW1pemVJbWFnZSk7CisJdGhpcy5tYXhpbWl6ZS5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ01heGltaXplJyk7CisJdGhpcy5tYXhpbWl6ZS5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7CisJdGhpcy5tYXhpbWl6ZS5zdHlsZS5tYXJnaW5MZWZ0ID0gJzJweCc7CisJdGhpcy5tYXhpbWl6ZS5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7CisJdGhpcy5tYXhpbWl6ZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworCQorCXRoaXMuYnV0dG9ucy5hcHBlbmRDaGlsZCh0aGlzLm1heGltaXplKTsKKwkKKwl2YXIgbWF4aW1pemVkID0gZmFsc2U7CisJdmFyIHggPSBudWxsOworCXZhciB5ID0gbnVsbDsKKwl2YXIgaGVpZ2h0ID0gbnVsbDsKKwl2YXIgd2lkdGggPSBudWxsOworCXZhciBtaW5EaXNwbGF5ID0gbnVsbDsKKworCXZhciBmdW5jdCA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJeworCQl0aGlzLmFjdGl2YXRlKCk7CisJCQorCQlpZiAodGhpcy5tYXhpbWl6ZS5zdHlsZS5kaXNwbGF5ICE9ICdub25lJykKKwkJeworCQkJaWYgKCFtYXhpbWl6ZWQpCisJCQl7CisJCQkJbWF4aW1pemVkID0gdHJ1ZTsKKwkJCQkKKwkJCQl0aGlzLm1heGltaXplLnNldEF0dHJpYnV0ZSgnc3JjJywgdGhpcy5ub3JtYWxpemVJbWFnZSk7CisJCQkJdGhpcy5tYXhpbWl6ZS5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ05vcm1hbGl6ZScpOworCQkJCXRoaXMuY29udGVudFdyYXBwZXIuc3R5bGUuZGlzcGxheSA9ICcnOworCQkJCW1pbkRpc3BsYXkgPSB0aGlzLm1pbmltaXplLnN0eWxlLmRpc3BsYXk7CisJCQkJdGhpcy5taW5pbWl6ZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworCQkJCQorCQkJCS8vIFNhdmVzIHdpbmRvdyBzdGF0ZQorCQkJCXggPSBwYXJzZUludCh0aGlzLmRpdi5zdHlsZS5sZWZ0KTsKKwkJCQl5ID0gcGFyc2VJbnQodGhpcy5kaXYuc3R5bGUudG9wKTsKKwkJCQloZWlnaHQgPSB0aGlzLnRhYmxlLnN0eWxlLmhlaWdodDsKKwkJCQl3aWR0aCA9IHRoaXMudGFibGUuc3R5bGUud2lkdGg7CisKKwkJCQl0aGlzLmRpdi5zdHlsZS5sZWZ0ID0gJzBweCc7CisJCQkJdGhpcy5kaXYuc3R5bGUudG9wID0gJzBweCc7CisJCQkJdmFyIGRvY0hlaWdodCA9IE1hdGgubWF4KGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0IHx8IDAsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgfHwgMCk7CisKKwkJCQlpZiAoIW14Q2xpZW50LklTX1FVSVJLUykKKwkJCQl7CisJCQkJCXRoaXMuZGl2LnN0eWxlLndpZHRoID0gKGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggLSAyKSArICdweCc7CisJCQkJCXRoaXMuZGl2LnN0eWxlLmhlaWdodCA9IChkb2NIZWlnaHQgLSAyKSArICdweCc7CisJCQkJfQorCisJCQkJdGhpcy50YWJsZS5zdHlsZS53aWR0aCA9IChkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIC0gMikgKyAncHgnOworCQkJCXRoaXMudGFibGUuc3R5bGUuaGVpZ2h0ID0gKGRvY0hlaWdodCAtIDIpICsgJ3B4JzsKKwkJCQkKKwkJCQlpZiAodGhpcy5yZXNpemUgIT0gbnVsbCkKKwkJCQl7CisJCQkJCXRoaXMucmVzaXplLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKKwkJCQl9CisKKwkJCQlpZiAoIW14Q2xpZW50LklTX1FVSVJLUykKKwkJCQl7CisJCQkJCXZhciBzdHlsZSA9IG14VXRpbHMuZ2V0Q3VycmVudFN0eWxlKHRoaXMuY29udGVudFdyYXBwZXIpOworCQkKKwkJCQkJaWYgKHN0eWxlLm92ZXJmbG93ID09ICdhdXRvJyB8fCB0aGlzLnJlc2l6ZSAhPSBudWxsKQorCQkJCQl7CisJCQkJCQl0aGlzLmNvbnRlbnRXcmFwcGVyLnN0eWxlLmhlaWdodCA9ICh0aGlzLmRpdi5vZmZzZXRIZWlnaHQgLQorCQkJCQkJCXRoaXMudGl0bGUub2Zmc2V0SGVpZ2h0IC0gdGhpcy5jb250ZW50SGVpZ2h0Q29ycmVjdGlvbikgKyAncHgnOworCQkJCQl9CisJCQkJfQorCisJCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5NQVhJTUlaRSwgJ2V2ZW50JywgZXZ0KSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbWF4aW1pemVkID0gZmFsc2U7CisJCQkJCisJCQkJdGhpcy5tYXhpbWl6ZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIHRoaXMubWF4aW1pemVJbWFnZSk7CisJCQkJdGhpcy5tYXhpbWl6ZS5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgJ01heGltaXplJyk7CisJCQkJdGhpcy5jb250ZW50V3JhcHBlci5zdHlsZS5kaXNwbGF5ID0gJyc7CisJCQkJdGhpcy5taW5pbWl6ZS5zdHlsZS5kaXNwbGF5ID0gbWluRGlzcGxheTsKKworCQkJCS8vIFJlc3RvcmVzIHdpbmRvdyBzdGF0ZQorCQkJCXRoaXMuZGl2LnN0eWxlLmxlZnQgPSB4KydweCc7CisJCQkJdGhpcy5kaXYuc3R5bGUudG9wID0geSsncHgnOworCQkJCQorCQkJCWlmICghbXhDbGllbnQuSVNfUVVJUktTKQorCQkJCXsKKwkJCQkJdGhpcy5kaXYuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0OworCQkJCQl0aGlzLmRpdi5zdHlsZS53aWR0aCA9IHdpZHRoOworCisJCQkJCXZhciBzdHlsZSA9IG14VXRpbHMuZ2V0Q3VycmVudFN0eWxlKHRoaXMuY29udGVudFdyYXBwZXIpOworCQkKKwkJCQkJaWYgKHN0eWxlLm92ZXJmbG93ID09ICdhdXRvJyB8fCB0aGlzLnJlc2l6ZSAhPSBudWxsKQorCQkJCQl7CisJCQkJCQl0aGlzLmNvbnRlbnRXcmFwcGVyLnN0eWxlLmhlaWdodCA9ICh0aGlzLmRpdi5vZmZzZXRIZWlnaHQgLQorCQkJCQkJCXRoaXMudGl0bGUub2Zmc2V0SGVpZ2h0IC0gdGhpcy5jb250ZW50SGVpZ2h0Q29ycmVjdGlvbikgKyAncHgnOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCXRoaXMudGFibGUuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0OworCQkJCXRoaXMudGFibGUuc3R5bGUud2lkdGggPSB3aWR0aDsKKworCQkJCWlmICh0aGlzLnJlc2l6ZSAhPSBudWxsKQorCQkJCXsKKwkJCQkJdGhpcy5yZXNpemUuc3R5bGUudmlzaWJpbGl0eSA9ICcnOworCQkJCX0KKwkJCQkKKwkJCQl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50Lk5PUk1BTElaRSwgJ2V2ZW50JywgZXZ0KSk7CisJCQl9CisJCQkKKwkJCW14RXZlbnQuY29uc3VtZShldnQpOworCQl9CisJfSk7CisJCisJbXhFdmVudC5hZGRHZXN0dXJlTGlzdGVuZXJzKHRoaXMubWF4aW1pemUsIGZ1bmN0KTsKKwlteEV2ZW50LmFkZExpc3RlbmVyKHRoaXMudGl0bGUsICdkYmxjbGljaycsIGZ1bmN0KTsKK307CisJCisvKioKKyAqIEZ1bmN0aW9uOiBpbnN0YWxsTW92ZUhhbmRsZXIKKyAqIAorICogSW5zdGFsbHMgdGhlIGV2ZW50IGxpc3RlbmVycyByZXF1aXJlZCBmb3IgbW92aW5nIHRoZSB3aW5kb3cuCisgKi8KK214V2luZG93LnByb3RvdHlwZS5pbnN0YWxsTW92ZUhhbmRsZXIgPSBmdW5jdGlvbigpCit7CisJdGhpcy50aXRsZS5zdHlsZS5jdXJzb3IgPSAnbW92ZSc7CisJCisJbXhFdmVudC5hZGRHZXN0dXJlTGlzdGVuZXJzKHRoaXMudGl0bGUsCisJCW14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJCXsKKwkJCXZhciBzdGFydFggPSBteEV2ZW50LmdldENsaWVudFgoZXZ0KTsKKwkJCXZhciBzdGFydFkgPSBteEV2ZW50LmdldENsaWVudFkoZXZ0KTsKKwkJCXZhciB4ID0gdGhpcy5nZXRYKCk7CisJCQl2YXIgeSA9IHRoaXMuZ2V0WSgpOworCQkJCQkJCisJCQkvLyBBZGRzIGEgdGVtcG9yYXJ5IHBhaXIgb2YgbGlzdGVuZXJzIHRvIGludGVyY2VwdAorCQkJLy8gdGhlIGdlc3R1cmUgZXZlbnQgaW4gdGhlIGRvY3VtZW50CisJCQl2YXIgZHJhZ0hhbmRsZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQkJeworCQkJCXZhciBkeCA9IG14RXZlbnQuZ2V0Q2xpZW50WChldnQpIC0gc3RhcnRYOworCQkJCXZhciBkeSA9IG14RXZlbnQuZ2V0Q2xpZW50WShldnQpIC0gc3RhcnRZOworCQkJCXRoaXMuc2V0TG9jYXRpb24oeCArIGR4LCB5ICsgZHkpOworCQkJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuTU9WRSwgJ2V2ZW50JywgZXZ0KSk7CisJCQkJbXhFdmVudC5jb25zdW1lKGV2dCk7CisJCQl9KTsKKwkJCQorCQkJdmFyIGRyb3BIYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwkJCXsKKwkJCQlteEV2ZW50LnJlbW92ZUdlc3R1cmVMaXN0ZW5lcnMoZG9jdW1lbnQsIG51bGwsIGRyYWdIYW5kbGVyLCBkcm9wSGFuZGxlcik7CisJCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5NT1ZFX0VORCwgJ2V2ZW50JywgZXZ0KSk7CisJCQkJbXhFdmVudC5jb25zdW1lKGV2dCk7CisJCQl9KTsKKwkJCQorCQkJbXhFdmVudC5hZGRHZXN0dXJlTGlzdGVuZXJzKGRvY3VtZW50LCBudWxsLCBkcmFnSGFuZGxlciwgZHJvcEhhbmRsZXIpOworCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5NT1ZFX1NUQVJULCAnZXZlbnQnLCBldnQpKTsKKwkJCW14RXZlbnQuY29uc3VtZShldnQpOworCQl9KSk7CisJCisJLy8gRGlzYWJsZXMgYnVpbHQtaW4gcGFuIGFuZCB6b29tIGluIElFMTAgYW5kIGxhdGVyCisJaWYgKG14Q2xpZW50LklTX1BPSU5URVIpCisJeworCQl0aGlzLnRpdGxlLnN0eWxlLnRvdWNoQWN0aW9uID0gJ25vbmUnOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHNldExvY2F0aW9uCisgKiAKKyAqIFNldHMgdGhlIHVwcGVyLCBsZWZ0IGNvcm5lciBvZiB0aGUgd2luZG93LgorICovCisgbXhXaW5kb3cucHJvdG90eXBlLnNldExvY2F0aW9uID0gZnVuY3Rpb24oeCwgeSkKKyB7CisJdGhpcy5kaXYuc3R5bGUubGVmdCA9IHggKyAncHgnOworCXRoaXMuZGl2LnN0eWxlLnRvcCA9IHkgKyAncHgnOworIH07CisKKy8qKgorICogRnVuY3Rpb246IGdldFgKKyAqCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSB4LWF4aXMuCisgKi8KK214V2luZG93LnByb3RvdHlwZS5nZXRYID0gZnVuY3Rpb24oKQoreworCXJldHVybiBwYXJzZUludCh0aGlzLmRpdi5zdHlsZS5sZWZ0KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFkKKyAqCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSB5LWF4aXMuCisgKi8KK214V2luZG93LnByb3RvdHlwZS5nZXRZID0gZnVuY3Rpb24oKQoreworCXJldHVybiBwYXJzZUludCh0aGlzLmRpdi5zdHlsZS50b3ApOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaW5zdGFsbENsb3NlSGFuZGxlcgorICoKKyAqIEFkZHMgdGhlIDxjbG9zZUltYWdlPiBhcyBhIG5ldyBpbWFnZSBub2RlIGluIDxjbG9zZUltZz4gYW5kIGluc3RhbGxzIHRoZQorICogPGNsb3NlPiBldmVudC4KKyAqLworbXhXaW5kb3cucHJvdG90eXBlLmluc3RhbGxDbG9zZUhhbmRsZXIgPSBmdW5jdGlvbigpCit7CisJdGhpcy5jbG9zZUltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOworCQorCXRoaXMuY2xvc2VJbWcuc2V0QXR0cmlidXRlKCdzcmMnLCB0aGlzLmNsb3NlSW1hZ2UpOworCXRoaXMuY2xvc2VJbWcuc2V0QXR0cmlidXRlKCd0aXRsZScsICdDbG9zZScpOworCXRoaXMuY2xvc2VJbWcuc3R5bGUubWFyZ2luTGVmdCA9ICcycHgnOworCXRoaXMuY2xvc2VJbWcuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOworCXRoaXMuY2xvc2VJbWcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKKwkKKwl0aGlzLmJ1dHRvbnMuYXBwZW5kQ2hpbGQodGhpcy5jbG9zZUltZyk7CisKKwlteEV2ZW50LmFkZEdlc3R1cmVMaXN0ZW5lcnModGhpcy5jbG9zZUltZywKKwkJbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwkJeworCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5DTE9TRSwgJ2V2ZW50JywgZXZ0KSk7CisJCQkKKwkJCWlmICh0aGlzLmRlc3Ryb3lPbkNsb3NlKQorCQkJeworCQkJCXRoaXMuZGVzdHJveSgpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRoaXMuc2V0VmlzaWJsZShmYWxzZSk7CisJCQl9CisJCQkKKwkJCW14RXZlbnQuY29uc3VtZShldnQpOworCQl9KSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRJbWFnZQorICogCisgKiBTZXRzIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdpbmRvdy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogaW1hZ2UgLSBVUkwgb2YgdGhlIGltYWdlIHRvIGJlIHVzZWQuCisgKi8KK214V2luZG93LnByb3RvdHlwZS5zZXRJbWFnZSA9IGZ1bmN0aW9uKGltYWdlKQoreworCXRoaXMuaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKKwl0aGlzLmltYWdlLnNldEF0dHJpYnV0ZSgnc3JjJywgaW1hZ2UpOworCXRoaXMuaW1hZ2Uuc2V0QXR0cmlidXRlKCdhbGlnbicsICdsZWZ0Jyk7CisJdGhpcy5pbWFnZS5zdHlsZS5tYXJnaW5SaWdodCA9ICc0cHgnOworCXRoaXMuaW1hZ2Uuc3R5bGUubWFyZ2luTGVmdCA9ICcwcHgnOworCXRoaXMuaW1hZ2Uuc3R5bGUubWFyZ2luVG9wID0gJy0ycHgnOworCQorCXRoaXMudGl0bGUuaW5zZXJ0QmVmb3JlKHRoaXMuaW1hZ2UsIHRoaXMudGl0bGUuZmlyc3RDaGlsZCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRDbG9zYWJsZQorICogCisgKiBTZXRzIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHdpbmRvdy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2xvc2FibGUgLSBCb29sZWFuIHNwZWNpZnlpbmcgaWYgdGhlIHdpbmRvdyBzaG91bGQgYmUgY2xvc2FibGUuCisgKi8KK214V2luZG93LnByb3RvdHlwZS5zZXRDbG9zYWJsZSA9IGZ1bmN0aW9uKGNsb3NhYmxlKQoreworCXRoaXMuY2xvc2VJbWcuc3R5bGUuZGlzcGxheSA9IChjbG9zYWJsZSkgPyAnJyA6ICdub25lJzsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzVmlzaWJsZQorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHdpbmRvdyBpcyB2aXNpYmxlLgorICovCitteFdpbmRvdy5wcm90b3R5cGUuaXNWaXNpYmxlID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLmRpdiAhPSBudWxsKQorCXsKKwkJcmV0dXJuIHRoaXMuZGl2LnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnOworCX0KKwkKKwlyZXR1cm4gZmFsc2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRWaXNpYmxlCisgKgorICogU2hvd3Mgb3IgaGlkZXMgdGhlIHdpbmRvdyBkZXBlbmRpbmcgb24gdGhlIGdpdmVuIGZsYWcuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZpc2libGUgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHdpbmRvdyBzaG91bGQgYmUgbWFkZSB2aXNpYmxlLgorICovCitteFdpbmRvdy5wcm90b3R5cGUuc2V0VmlzaWJsZSA9IGZ1bmN0aW9uKHZpc2libGUpCit7CisJaWYgKHRoaXMuZGl2ICE9IG51bGwgJiYgdGhpcy5pc1Zpc2libGUoKSAhPSB2aXNpYmxlKQorCXsKKwkJaWYgKHZpc2libGUpCisJCXsKKwkJCXRoaXMuc2hvdygpOworCQl9CisJCWVsc2UKKwkJeworCQkJdGhpcy5oaWRlKCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzaG93CisgKgorICogU2hvd3MgdGhlIHdpbmRvdy4KKyAqLworbXhXaW5kb3cucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbigpCit7CisJdGhpcy5kaXYuc3R5bGUuZGlzcGxheSA9ICcnOworCXRoaXMuYWN0aXZhdGUoKTsKKwkKKwl2YXIgc3R5bGUgPSBteFV0aWxzLmdldEN1cnJlbnRTdHlsZSh0aGlzLmNvbnRlbnRXcmFwcGVyKTsKKwkKKwlpZiAoIW14Q2xpZW50LklTX1FVSVJLUyAmJiAoc3R5bGUub3ZlcmZsb3cgPT0gJ2F1dG8nIHx8IHRoaXMucmVzaXplICE9IG51bGwpKQorCXsKKwkJdGhpcy5jb250ZW50V3JhcHBlci5zdHlsZS5oZWlnaHQgPSAodGhpcy5kaXYub2Zmc2V0SGVpZ2h0IC0KKwkJCQl0aGlzLnRpdGxlLm9mZnNldEhlaWdodCAtIHRoaXMuY29udGVudEhlaWdodENvcnJlY3Rpb24pICsgJ3B4JzsKKwl9CisJCisJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5TSE9XKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBoaWRlCisgKgorICogSGlkZXMgdGhlIHdpbmRvdy4KKyAqLworbXhXaW5kb3cucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbigpCit7CisJdGhpcy5kaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKKwl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LkhJREUpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqCisgKiBEZXN0cm95cyB0aGUgd2luZG93IGFuZCByZW1vdmVzIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4gRmlyZXMgYQorICogPGRlc3Ryb3k+IGV2ZW50IHByaW9yIHRvIGRlc3Ryb3lpbmcgdGhlIHdpbmRvdy4KKyAqLworbXhXaW5kb3cucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpCit7CisJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5ERVNUUk9ZKSk7CisJCisJaWYgKHRoaXMuZGl2ICE9IG51bGwpCisJeworCQlteEV2ZW50LnJlbGVhc2UodGhpcy5kaXYpOworCQl0aGlzLmRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZGl2KTsKKwkJdGhpcy5kaXYgPSBudWxsOworCX0KKwkKKwl0aGlzLnRpdGxlID0gbnVsbDsKKwl0aGlzLmNvbnRlbnQgPSBudWxsOworCXRoaXMuY29udGVudFdyYXBwZXIgPSBudWxsOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214WG1sQ2FudmFzMkQuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teFhtbENhbnZhczJELmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5M2VhZDYKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdXRpbC9teFhtbENhbnZhczJELmpzCkBAIC0wLDAgKzEsMTIxNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhYbWxDYW52YXMyRAorICoKKyAqIEJhc2UgY2xhc3MgZm9yIGFsbCBjYW52YXNlcy4gVGhlIGZvbGxvd2luZyBtZXRob2RzIG1ha2UgdXAgdGhlIHB1YmxpYworICogaW50ZXJmYWNlIG9mIHRoZSBjYW52YXMgMkQgZm9yIGFsbCBwYWludGluZyBpbiBteEdyYXBoOgorICogCisgKiAtIDxzYXZlPiwgPHJlc3RvcmU+CisgKiAtIDxzY2FsZT4sIDx0cmFuc2xhdGU+LCA8cm90YXRlPgorICogLSA8c2V0QWxwaGE+LCA8c2V0RmlsbEFscGhhPiwgPHNldFN0cm9rZUFscGhhPiwgPHNldEZpbGxDb2xvcj4sIDxzZXRHcmFkaWVudD4sCisgKiAgIDxzZXRTdHJva2VDb2xvcj4sIDxzZXRTdHJva2VXaWR0aD4sIDxzZXREYXNoZWQ+LCA8c2V0RGFzaFBhdHRlcm4+LCA8c2V0TGluZUNhcD4sIAorICogICA8c2V0TGluZUpvaW4+LCA8c2V0TWl0ZXJMaW1pdD4KKyAqIC0gPHNldEZvbnRDb2xvcj4sIDxzZXRGb250QmFja2dyb3VuZENvbG9yPiwgPHNldEZvbnRCb3JkZXJDb2xvcj4sIDxzZXRGb250U2l6ZT4sCisgKiAgIDxzZXRGb250RmFtaWx5PiwgPHNldEZvbnRTdHlsZT4KKyAqIC0gPHNldFNoYWRvdz4sIDxzZXRTaGFkb3dDb2xvcj4sIDxzZXRTaGFkb3dBbHBoYT4sIDxzZXRTaGFkb3dPZmZzZXQ+CisgKiAtIDxyZWN0PiwgPHJvdW5kcmVjdD4sIDxlbGxpcHNlPiwgPGltYWdlPiwgPHRleHQ+CisgKiAtIDxiZWdpbj4sIDxtb3ZlVG8+LCA8bGluZVRvPiwgPHF1YWRUbz4sIDxjdXJ2ZVRvPgorICogLSA8c3Ryb2tlPiwgPGZpbGw+LCA8ZmlsbEFuZFN0cm9rZT4KKyAqIAorICogPG14QWJzdHJhY3RDYW52YXMyRC5hcmNUbz4gaXMgYW4gYWRkaXRpb25hbCBtZXRob2QgZm9yIGRyYXdpbmcgcGF0aHMuIFRoaXMgaXMKKyAqIGEgc3ludGhldGljIG1ldGhvZCwgbWVhbmluZyB0aGF0IGl0IGlzIHR1cm5lZCBpbnRvIGEgc2VxdWVuY2Ugb2YgY3VydmVzIGJ5CisgKiBkZWZhdWx0LiBTdWJjbGFzc2VycyBtYXkgYWRkIG5hdGl2ZSBzdXBwb3J0IGZvciBhcmNzLgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhYbWxDYW52YXMyRAorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgYWJzdHJhY3QgY2FudmFzLgorICovCitmdW5jdGlvbiBteFhtbENhbnZhczJEKHJvb3QpCit7CisJbXhBYnN0cmFjdENhbnZhczJELmNhbGwodGhpcyk7CisKKwkvKioKKwkgKiBWYXJpYWJsZTogcm9vdAorCSAqIAorCSAqIFJlZmVyZW5jZSB0byB0aGUgY29udGFpbmVyIGZvciB0aGUgU1ZHIGNvbnRlbnQuCisJICovCisJdGhpcy5yb290ID0gcm9vdDsKKworCS8vIFdyaXRlcyBkZWZhdWx0IHNldHRpbmdzOworCXRoaXMud3JpdGVEZWZhdWx0cygpOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14QWJzdHJhY3RDYW52YXMyRAorICovCitteFV0aWxzLmV4dGVuZChteFhtbENhbnZhczJELCBteEFic3RyYWN0Q2FudmFzMkQpOworCisvKioKKyAqIFZhcmlhYmxlOiB0ZXh0RW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgdGV4dCBvdXRwdXQgc2hvdWxkIGJlIGVuYWJsZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhYbWxDYW52YXMyRC5wcm90b3R5cGUudGV4dEVuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBjb21wcmVzc2VkCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgb3V0cHV0IHNob3VsZCBiZSBjb21wcmVzc2VkIGJ5IHJlbW92aW5nIHJlZHVuZGFudCBjYWxscy4KKyAqIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhYbWxDYW52YXMyRC5wcm90b3R5cGUuY29tcHJlc3NlZCA9IHRydWU7CisKKy8qKgorICogRnVuY3Rpb246IHdyaXRlRGVmYXVsdHMKKyAqIAorICogV3JpdGVzIHRoZSByZW5kZXJpbmcgZGVmYXVsdHMgdG8gPHJvb3Q+OgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS53cml0ZURlZmF1bHRzID0gZnVuY3Rpb24oKQoreworCXZhciBlbGVtOworCQorCS8vIFdyaXRlcyBmb250IGRlZmF1bHRzCisJZWxlbSA9IHRoaXMuY3JlYXRlRWxlbWVudCgnZm9udGZhbWlseScpOworCWVsZW0uc2V0QXR0cmlidXRlKCdmYW1pbHknLCBteENvbnN0YW50cy5ERUZBVUxUX0ZPTlRGQU1JTFkpOworCXRoaXMucm9vdC5hcHBlbmRDaGlsZChlbGVtKTsKKwkKKwllbGVtID0gdGhpcy5jcmVhdGVFbGVtZW50KCdmb250c2l6ZScpOworCWVsZW0uc2V0QXR0cmlidXRlKCdzaXplJywgbXhDb25zdGFudHMuREVGQVVMVF9GT05UU0laRSk7CisJdGhpcy5yb290LmFwcGVuZENoaWxkKGVsZW0pOworCQorCS8vIFdyaXRlcyBzaGFkb3cgZGVmYXVsdHMKKwllbGVtID0gdGhpcy5jcmVhdGVFbGVtZW50KCdzaGFkb3djb2xvcicpOworCWVsZW0uc2V0QXR0cmlidXRlKCdjb2xvcicsIG14Q29uc3RhbnRzLlNIQURPV0NPTE9SKTsKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7CisJCisJZWxlbSA9IHRoaXMuY3JlYXRlRWxlbWVudCgnc2hhZG93YWxwaGEnKTsKKwllbGVtLnNldEF0dHJpYnV0ZSgnYWxwaGEnLCBteENvbnN0YW50cy5TSEFET1dfT1BBQ0lUWSk7CisJdGhpcy5yb290LmFwcGVuZENoaWxkKGVsZW0pOworCQorCWVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ3NoYWRvd29mZnNldCcpOworCWVsZW0uc2V0QXR0cmlidXRlKCdkeCcsIG14Q29uc3RhbnRzLlNIQURPV19PRkZTRVRfWCk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ2R5JywgbXhDb25zdGFudHMuU0hBRE9XX09GRlNFVF9ZKTsKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBmb3JtYXQKKyAqIAorICogUmV0dXJucyBhIGZvcm1hdHRlZCBudW1iZXIgd2l0aCAyIGRlY2ltYWwgcGxhY2VzLgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwlyZXR1cm4gcGFyc2VGbG9hdChwYXJzZUZsb2F0KHZhbHVlKS50b0ZpeGVkKDIpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUVsZW1lbnQKKyAqIAorICogQ3JlYXRlcyB0aGUgZ2l2ZW4gZWxlbWVudCB1c2luZyB0aGUgb3duZXIgZG9jdW1lbnQgb2YgPHJvb3Q+LgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24obmFtZSkKK3sKKwlyZXR1cm4gdGhpcy5yb290Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNhdmUKKyAqIAorICogU2F2ZXMgdGhlIGRyYXdpbmcgc3RhdGUuCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMuY29tcHJlc3NlZCkKKwl7CisJCW14QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuc2F2ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX0KKwkKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVFbGVtZW50KCdzYXZlJykpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVzdG9yZQorICogCisgKiBSZXN0b3JlcyB0aGUgZHJhd2luZyBzdGF0ZS4KKyAqLworbXhYbWxDYW52YXMyRC5wcm90b3R5cGUucmVzdG9yZSA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAodGhpcy5jb21wcmVzc2VkKQorCXsKKwkJbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5yZXN0b3JlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfQorCQorCXRoaXMucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUVsZW1lbnQoJ3Jlc3RvcmUnKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzY2FsZQorICogCisgKiBTY2FsZXMgdGhlIG91dHB1dC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc2NhbGUgLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSBzY2FsZSB3aGVyZSAxIGlzIGVxdWFsIHRvIDEwMCUuCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24odmFsdWUpCit7CisgICAgICAgIHZhciBlbGVtID0gdGhpcy5jcmVhdGVFbGVtZW50KCdzY2FsZScpOworICAgICAgICBlbGVtLnNldEF0dHJpYnV0ZSgnc2NhbGUnLCB2YWx1ZSk7CisgICAgICAgIHRoaXMucm9vdC5hcHBlbmRDaGlsZChlbGVtKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHRyYW5zbGF0ZQorICogCisgKiBUcmFuc2xhdGVzIHRoZSBvdXRwdXQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGR4IC0gTnVtYmVyIHRoYXQgc3BlY2lmaWVzIHRoZSBob3Jpem9udGFsIHRyYW5zbGF0aW9uLgorICogZHkgLSBOdW1iZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHZlcnRpY2FsIHRyYW5zbGF0aW9uLgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS50cmFuc2xhdGUgPSBmdW5jdGlvbihkeCwgZHkpCit7CisJdmFyIGVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ3RyYW5zbGF0ZScpOworCWVsZW0uc2V0QXR0cmlidXRlKCdkeCcsIHRoaXMuZm9ybWF0KGR4KSk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ2R5JywgdGhpcy5mb3JtYXQoZHkpKTsKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByb3RhdGUKKyAqIAorICogUm90YXRlcyBhbmQvb3IgZmxpcHMgdGhlIG91dHB1dCBhcm91bmQgYSBnaXZlbiBjZW50ZXIuIChOb3RlOiBEdWUgdG8KKyAqIGxpbWl0YXRpb25zIGluIFZNTCwgdGhlIHJvdGF0aW9uIGNhbm5vdCBiZSBjb25jYXRlbmF0ZWQuKQorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB0aGV0YSAtIE51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIGFuZ2xlIG9mIHRoZSByb3RhdGlvbiAoaW4gZGVncmVlcykuCisgKiBmbGlwSCAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgb3V0cHV0IHNob3VsZCBiZSBmbGlwcGVkIGhvcml6b250YWxseS4KKyAqIGZsaXBWIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBvdXRwdXQgc2hvdWxkIGJlIGZsaXBwZWQgdmVydGljYWxseS4KKyAqIGN4IC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSByb3RhdGlvbiBjZW50ZXIuCisgKiBjeSAtIE51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgcm90YXRpb24gY2VudGVyLgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS5yb3RhdGUgPSBmdW5jdGlvbih0aGV0YSwgZmxpcEgsIGZsaXBWLCBjeCwgY3kpCit7CisJdmFyIGVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ3JvdGF0ZScpOworCQorCWlmICh0aGV0YSAhPSAwIHx8IGZsaXBIIHx8IGZsaXBWKQorCXsKKwkJZWxlbS5zZXRBdHRyaWJ1dGUoJ3RoZXRhJywgdGhpcy5mb3JtYXQodGhldGEpKTsKKwkJZWxlbS5zZXRBdHRyaWJ1dGUoJ2ZsaXBIJywgKGZsaXBIKSA/ICcxJyA6ICcwJyk7CisJCWVsZW0uc2V0QXR0cmlidXRlKCdmbGlwVicsIChmbGlwVikgPyAnMScgOiAnMCcpOworCQllbGVtLnNldEF0dHJpYnV0ZSgnY3gnLCB0aGlzLmZvcm1hdChjeCkpOworCQllbGVtLnNldEF0dHJpYnV0ZSgnY3knLCB0aGlzLmZvcm1hdChjeSkpOworCQl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0QWxwaGEKKyAqIAorICogU2V0cyB0aGUgY3VycmVudCBhbHBoYS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSBuZXcgYWxwaGEuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYmV0d2VlbgorICogMSAob3BhcXVlKSBhbmQgMCAodHJhbnNwYXJlbnQpLgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS5zZXRBbHBoYSA9IGZ1bmN0aW9uKHZhbHVlKQoreworCWlmICh0aGlzLmNvbXByZXNzZWQpCisJeworCQlpZiAodGhpcy5zdGF0ZS5hbHBoYSA9PSB2YWx1ZSkKKwkJeworCQkJcmV0dXJuOworCQl9CisJCQorCQlteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldEFscGhhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfQorCQorCXZhciBlbGVtID0gdGhpcy5jcmVhdGVFbGVtZW50KCdhbHBoYScpOworCWVsZW0uc2V0QXR0cmlidXRlKCdhbHBoYScsIHRoaXMuZm9ybWF0KHZhbHVlKSk7CisJdGhpcy5yb290LmFwcGVuZENoaWxkKGVsZW0pOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0RmlsbEFscGhhCisgKiAKKyAqIFNldHMgdGhlIGN1cnJlbnQgZmlsbCBhbHBoYS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSBuZXcgZmlsbCBhbHBoYS4gUG9zc2libGUgdmFsdWVzIGFyZSBiZXR3ZWVuCisgKiAxIChvcGFxdWUpIGFuZCAwICh0cmFuc3BhcmVudCkuCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLnNldEZpbGxBbHBoYSA9IGZ1bmN0aW9uKHZhbHVlKQoreworCWlmICh0aGlzLmNvbXByZXNzZWQpCisJeworCQlpZiAodGhpcy5zdGF0ZS5maWxsQWxwaGEgPT0gdmFsdWUpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5zZXRGaWxsQWxwaGEuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9CisJCisJdmFyIGVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ2ZpbGxhbHBoYScpOworCWVsZW0uc2V0QXR0cmlidXRlKCdhbHBoYScsIHRoaXMuZm9ybWF0KHZhbHVlKSk7CisJdGhpcy5yb290LmFwcGVuZENoaWxkKGVsZW0pOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0U3Ryb2tlQWxwaGEKKyAqIAorICogU2V0cyB0aGUgY3VycmVudCBzdHJva2UgYWxwaGEuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbHVlIC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgbmV3IHN0cm9rZSBhbHBoYS4gUG9zc2libGUgdmFsdWVzIGFyZSBiZXR3ZWVuCisgKiAxIChvcGFxdWUpIGFuZCAwICh0cmFuc3BhcmVudCkuCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLnNldFN0cm9rZUFscGhhID0gZnVuY3Rpb24odmFsdWUpCit7CisJaWYgKHRoaXMuY29tcHJlc3NlZCkKKwl7CisJCWlmICh0aGlzLnN0YXRlLnN0cm9rZUFscGhhID09IHZhbHVlKQorCQl7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCW14QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuc2V0U3Ryb2tlQWxwaGEuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9CisJCisJdmFyIGVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ3N0cm9rZWFscGhhJyk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ2FscGhhJywgdGhpcy5mb3JtYXQodmFsdWUpKTsKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRGaWxsQ29sb3IKKyAqIAorICogU2V0cyB0aGUgY3VycmVudCBmaWxsIGNvbG9yLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb2xvciBvciAnbm9uZScuCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLnNldEZpbGxDb2xvciA9IGZ1bmN0aW9uKHZhbHVlKQoreworCWlmICh2YWx1ZSA9PSBteENvbnN0YW50cy5OT05FKQorCXsKKwkJdmFsdWUgPSBudWxsOworCX0KKwkKKwlpZiAodGhpcy5jb21wcmVzc2VkKQorCXsKKwkJaWYgKHRoaXMuc3RhdGUuZmlsbENvbG9yID09IHZhbHVlKQorCQl7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCW14QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuc2V0RmlsbENvbG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfQorCQorCXZhciBlbGVtID0gdGhpcy5jcmVhdGVFbGVtZW50KCdmaWxsY29sb3InKTsKKwllbGVtLnNldEF0dHJpYnV0ZSgnY29sb3InLCAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6IG14Q29uc3RhbnRzLk5PTkUpOworCXRoaXMucm9vdC5hcHBlbmRDaGlsZChlbGVtKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEdyYWRpZW50CisgKiAKKyAqIFNldHMgdGhlIGdyYWRpZW50LiBOb3RlIHRoYXQgdGhlIGNvb3JkaW5hdGVzIG1heSBiZSBpZ25vcmVkIGJ5IHNvbWUgaW1wbGVtZW50YXRpb25zLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjb2xvcjEgLSBIZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RhcnQgY29sb3IuCisgKiBjb2xvcjIgLSBIZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW5kIGNvbG9yLgorICogeCAtIFgtY29vcmRpbmF0ZSBvZiB0aGUgZ3JhZGllbnQgcmVnaW9uLgorICogeSAtIHktY29vcmRpbmF0ZSBvZiB0aGUgZ3JhZGllbnQgcmVnaW9uLgorICogdyAtIFdpZHRoIG9mIHRoZSBncmFkaWVudCByZWdpb24uCisgKiBoIC0gSGVpZ2h0IG9mIHRoZSBncmFkaWVudCByZWdpb24uCisgKiBkaXJlY3Rpb24gLSBPbmUgb2YgPG14Q29uc3RhbnRzLkRJUkVDVElPTl9OT1JUSD4sIDxteENvbnN0YW50cy5ESVJFQ1RJT05fRUFTVD4sCisgKiA8bXhDb25zdGFudHMuRElSRUNUSU9OX1NPVVRIPiBvciA8bXhDb25zdGFudHMuRElSRUNUSU9OX1dFU1Q+LgorICogYWxwaGExIC0gT3B0aW9uYWwgYWxwaGEgb2YgdGhlIHN0YXJ0IGNvbG9yLiBEZWZhdWx0IGlzIDEuIFBvc3NpYmxlIHZhbHVlcworICogYXJlIGJldHdlZW4gMSAob3BhcXVlKSBhbmQgMCAodHJhbnNwYXJlbnQpLgorICogYWxwaGEyIC0gT3B0aW9uYWwgYWxwaGEgb2YgdGhlIGVuZCBjb2xvci4gRGVmYXVsdCBpcyAxLiBQb3NzaWJsZSB2YWx1ZXMKKyAqIGFyZSBiZXR3ZWVuIDEgKG9wYXF1ZSkgYW5kIDAgKHRyYW5zcGFyZW50KS4KKyAqLworbXhYbWxDYW52YXMyRC5wcm90b3R5cGUuc2V0R3JhZGllbnQgPSBmdW5jdGlvbihjb2xvcjEsIGNvbG9yMiwgeCwgeSwgdywgaCwgZGlyZWN0aW9uLCBhbHBoYTEsIGFscGhhMikKK3sKKwlpZiAoY29sb3IxICE9IG51bGwgJiYgY29sb3IyICE9IG51bGwpCisJeworCQlteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldEdyYWRpZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQorCQl2YXIgZWxlbSA9IHRoaXMuY3JlYXRlRWxlbWVudCgnZ3JhZGllbnQnKTsKKwkJZWxlbS5zZXRBdHRyaWJ1dGUoJ2MxJywgY29sb3IxKTsKKwkJZWxlbS5zZXRBdHRyaWJ1dGUoJ2MyJywgY29sb3IyKTsKKwkJZWxlbS5zZXRBdHRyaWJ1dGUoJ3gnLCB0aGlzLmZvcm1hdCh4KSk7CisJCWVsZW0uc2V0QXR0cmlidXRlKCd5JywgdGhpcy5mb3JtYXQoeSkpOworCQllbGVtLnNldEF0dHJpYnV0ZSgndycsIHRoaXMuZm9ybWF0KHcpKTsKKwkJZWxlbS5zZXRBdHRyaWJ1dGUoJ2gnLCB0aGlzLmZvcm1hdChoKSk7CisJCQorCQkvLyBEZWZhdWx0IGRpcmVjdGlvbiBpcyBzb3V0aAorCQlpZiAoZGlyZWN0aW9uICE9IG51bGwpCisJCXsKKwkJCWVsZW0uc2V0QXR0cmlidXRlKCdkaXJlY3Rpb24nLCBkaXJlY3Rpb24pOworCQl9CisJCQorCQlpZiAoYWxwaGExICE9IG51bGwpCisJCXsKKwkJCWVsZW0uc2V0QXR0cmlidXRlKCdhbHBoYTEnLCBhbHBoYTEpOworCQl9CisJCQorCQlpZiAoYWxwaGEyICE9IG51bGwpCisJCXsKKwkJCWVsZW0uc2V0QXR0cmlidXRlKCdhbHBoYTInLCBhbHBoYTIpOworCQl9CisJCQorCQl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0U3Ryb2tlQ29sb3IKKyAqIAorICogU2V0cyB0aGUgY3VycmVudCBzdHJva2UgY29sb3IuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbHVlIC0gSGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbG9yIG9yICdub25lJy4KKyAqLworbXhYbWxDYW52YXMyRC5wcm90b3R5cGUuc2V0U3Ryb2tlQ29sb3IgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwlpZiAodmFsdWUgPT0gbXhDb25zdGFudHMuTk9ORSkKKwl7CisJCXZhbHVlID0gbnVsbDsKKwl9CisJCisJaWYgKHRoaXMuY29tcHJlc3NlZCkKKwl7CisJCWlmICh0aGlzLnN0YXRlLnN0cm9rZUNvbG9yID09IHZhbHVlKQorCQl7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCW14QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuc2V0U3Ryb2tlQ29sb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9CisJCisJdmFyIGVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ3N0cm9rZWNvbG9yJyk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ2NvbG9yJywgKHZhbHVlICE9IG51bGwpID8gdmFsdWUgOiBteENvbnN0YW50cy5OT05FKTsKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRTdHJva2VXaWR0aAorICogCisgKiBTZXRzIHRoZSBjdXJyZW50IHN0cm9rZSB3aWR0aC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBOdW1lcmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdHJva2Ugd2lkdGguCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLnNldFN0cm9rZVdpZHRoID0gZnVuY3Rpb24odmFsdWUpCit7CisJaWYgKHRoaXMuY29tcHJlc3NlZCkKKwl7CisJCWlmICh0aGlzLnN0YXRlLnN0cm9rZVdpZHRoID09IHZhbHVlKQorCQl7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCW14QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuc2V0U3Ryb2tlV2lkdGguYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9CisJCisJdmFyIGVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ3N0cm9rZXdpZHRoJyk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgdGhpcy5mb3JtYXQodmFsdWUpKTsKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXREYXNoZWQKKyAqIAorICogRW5hYmxlcyBvciBkaXNhYmxlcyBkYXNoZWQgbGluZXMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbHVlIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiBkYXNoZWQgbGluZXMgc2hvdWxkIGJlIGVuYWJsZWQuCisgKiB2YWx1ZSAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIHN0cm9rZSB3aWR0aCBzaG91bGQgYmUgaWdub3JlZAorICogZm9yIHRoZSBkYXNoIHBhdHRlcm4uIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLnNldERhc2hlZCA9IGZ1bmN0aW9uKHZhbHVlLCBmaXhEYXNoKQoreworCWlmICh0aGlzLmNvbXByZXNzZWQpCisJeworCQlpZiAodGhpcy5zdGF0ZS5kYXNoZWQgPT0gdmFsdWUpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5zZXREYXNoZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9CisJCisJdmFyIGVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ2Rhc2hlZCcpOworCWVsZW0uc2V0QXR0cmlidXRlKCdkYXNoZWQnLCAodmFsdWUpID8gJzEnIDogJzAnKTsKKwkKKwlpZiAoZml4RGFzaCAhPSBudWxsKQorCXsKKwkJZWxlbS5zZXRBdHRyaWJ1dGUoJ2ZpeERhc2gnLCAoZml4RGFzaCkgPyAnMScgOiAnMCcpOworCX0KKwkKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXREYXNoUGF0dGVybgorICogCisgKiBTZXRzIHRoZSBjdXJyZW50IGRhc2ggcGF0dGVybi4gRGVmYXVsdCBpcyAnMyAzJy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBkYXNoIHBhdHRlcm4sIHdoaWNoIGlzIGEgc2VxdWVuY2Ugb2YKKyAqIG51bWJlcnMgZGVmaW5pbmcgdGhlIGxlbmd0aCBvZiB0aGUgZGFzaGVzIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBzcGFjZXMKKyAqIGJldHdlZW4gdGhlIGRhc2hlcy4gVGhlIGxlbmd0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBsaW5lIHdpZHRoIC0gYSBsZW5ndGgKKyAqIG9mIDEgaXMgZXF1YWxzIHRvIHRoZSBsaW5lIHdpZHRoLgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS5zZXREYXNoUGF0dGVybiA9IGZ1bmN0aW9uKHZhbHVlKQoreworCWlmICh0aGlzLmNvbXByZXNzZWQpCisJeworCQlpZiAodGhpcy5zdGF0ZS5kYXNoUGF0dGVybiA9PSB2YWx1ZSkKKwkJeworCQkJcmV0dXJuOworCQl9CisJCQorCQlteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldERhc2hQYXR0ZXJuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfQorCQorCXZhciBlbGVtID0gdGhpcy5jcmVhdGVFbGVtZW50KCdkYXNocGF0dGVybicpOworCWVsZW0uc2V0QXR0cmlidXRlKCdwYXR0ZXJuJywgdmFsdWUpOworCXRoaXMucm9vdC5hcHBlbmRDaGlsZChlbGVtKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldExpbmVDYXAKKyAqIAorICogU2V0cyB0aGUgbGluZSBjYXAuIERlZmF1bHQgaXMgJ2ZsYXQnIHdoaWNoIGNvcnJlc3BvbmRzIHRvICdidXR0JyBpbiBTVkcuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbHVlIC0gU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgbGluZSBjYXAuIFBvc3NpYmxlIHZhbHVlcyBhcmUgZmxhdCwgcm91bmQKKyAqIGFuZCBzcXVhcmUuCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLnNldExpbmVDYXAgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwlpZiAodGhpcy5jb21wcmVzc2VkKQorCXsKKwkJaWYgKHRoaXMuc3RhdGUubGluZUNhcCA9PSB2YWx1ZSkKKwkJeworCQkJcmV0dXJuOworCQl9CisJCQorCQlteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldExpbmVDYXAuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9CisJCisJdmFyIGVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ2xpbmVjYXAnKTsKKwllbGVtLnNldEF0dHJpYnV0ZSgnY2FwJywgdmFsdWUpOworCXRoaXMucm9vdC5hcHBlbmRDaGlsZChlbGVtKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldExpbmVKb2luCisgKiAKKyAqIFNldHMgdGhlIGxpbmUgam9pbi4gRGVmYXVsdCBpcyAnbWl0ZXInLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGxpbmUgam9pbi4gUG9zc2libGUgdmFsdWVzIGFyZSBtaXRlciwKKyAqIHJvdW5kIGFuZCBiZXZlbC4KKyAqLworbXhYbWxDYW52YXMyRC5wcm90b3R5cGUuc2V0TGluZUpvaW4gPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwlpZiAodGhpcy5jb21wcmVzc2VkKQorCXsKKwkJaWYgKHRoaXMuc3RhdGUubGluZUpvaW4gPT0gdmFsdWUpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5zZXRMaW5lSm9pbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX0KKwkKKwl2YXIgZWxlbSA9IHRoaXMuY3JlYXRlRWxlbWVudCgnbGluZWpvaW4nKTsKKwllbGVtLnNldEF0dHJpYnV0ZSgnam9pbicsIHZhbHVlKTsKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRNaXRlckxpbWl0CisgKiAKKyAqIFNldHMgdGhlIG1pdGVyIGxpbWl0LiBEZWZhdWx0IGlzIDEwLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIE51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIG1pdGVyIGxpbWl0LgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS5zZXRNaXRlckxpbWl0ID0gZnVuY3Rpb24odmFsdWUpCit7CisJaWYgKHRoaXMuY29tcHJlc3NlZCkKKwl7CisJCWlmICh0aGlzLnN0YXRlLm1pdGVyTGltaXQgPT0gdmFsdWUpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5zZXRNaXRlckxpbWl0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfQorCQorCXZhciBlbGVtID0gdGhpcy5jcmVhdGVFbGVtZW50KCdtaXRlcmxpbWl0Jyk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ2xpbWl0JywgdmFsdWUpOworCXRoaXMucm9vdC5hcHBlbmRDaGlsZChlbGVtKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEZvbnRDb2xvcgorICogCisgKiBTZXRzIHRoZSBjdXJyZW50IGZvbnQgY29sb3IuIERlZmF1bHQgaXMgJyMwMDAwMDAnLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb2xvciBvciAnbm9uZScuCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLnNldEZvbnRDb2xvciA9IGZ1bmN0aW9uKHZhbHVlKQoreworCWlmICh0aGlzLnRleHRFbmFibGVkKQorCXsKKwkJaWYgKHZhbHVlID09IG14Q29uc3RhbnRzLk5PTkUpCisJCXsKKwkJCXZhbHVlID0gbnVsbDsKKwkJfQorCQkKKwkJaWYgKHRoaXMuY29tcHJlc3NlZCkKKwkJeworCQkJaWYgKHRoaXMuc3RhdGUuZm9udENvbG9yID09IHZhbHVlKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5zZXRGb250Q29sb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJfQorCQkKKwkJdmFyIGVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ2ZvbnRjb2xvcicpOworCQllbGVtLnNldEF0dHJpYnV0ZSgnY29sb3InLCAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6IG14Q29uc3RhbnRzLk5PTkUpOworCQl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0Rm9udEJhY2tncm91bmRDb2xvcgorICogCisgKiBTZXRzIHRoZSBjdXJyZW50IGZvbnQgYmFja2dyb3VuZCBjb2xvci4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBIZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29sb3Igb3IgJ25vbmUnLgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS5zZXRGb250QmFja2dyb3VuZENvbG9yID0gZnVuY3Rpb24odmFsdWUpCit7CisJaWYgKHRoaXMudGV4dEVuYWJsZWQpCisJeworCQlpZiAodmFsdWUgPT0gbXhDb25zdGFudHMuTk9ORSkKKwkJeworCQkJdmFsdWUgPSBudWxsOworCQl9CisJCQorCQlpZiAodGhpcy5jb21wcmVzc2VkKQorCQl7CisJCQlpZiAodGhpcy5zdGF0ZS5mb250QmFja2dyb3VuZENvbG9yID09IHZhbHVlKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5zZXRGb250QmFja2dyb3VuZENvbG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCX0KKworCQl2YXIgZWxlbSA9IHRoaXMuY3JlYXRlRWxlbWVudCgnZm9udGJhY2tncm91bmRjb2xvcicpOworCQllbGVtLnNldEF0dHJpYnV0ZSgnY29sb3InLCAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6IG14Q29uc3RhbnRzLk5PTkUpOworCQl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0Rm9udEJvcmRlckNvbG9yCisgKiAKKyAqIFNldHMgdGhlIGN1cnJlbnQgZm9udCBib3JkZXIgY29sb3IuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbHVlIC0gSGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbG9yIG9yICdub25lJy4KKyAqLworbXhYbWxDYW52YXMyRC5wcm90b3R5cGUuc2V0Rm9udEJvcmRlckNvbG9yID0gZnVuY3Rpb24odmFsdWUpCit7CisJaWYgKHRoaXMudGV4dEVuYWJsZWQpCisJeworCQlpZiAodmFsdWUgPT0gbXhDb25zdGFudHMuTk9ORSkKKwkJeworCQkJdmFsdWUgPSBudWxsOworCQl9CisJCQorCQlpZiAodGhpcy5jb21wcmVzc2VkKQorCQl7CisJCQlpZiAodGhpcy5zdGF0ZS5mb250Qm9yZGVyQ29sb3IgPT0gdmFsdWUpCisJCQl7CisJCQkJcmV0dXJuOworCQkJfQorCQkJCisJCQlteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldEZvbnRCb3JkZXJDb2xvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCQl9CisJCQorCQl2YXIgZWxlbSA9IHRoaXMuY3JlYXRlRWxlbWVudCgnZm9udGJvcmRlcmNvbG9yJyk7CisJCWVsZW0uc2V0QXR0cmlidXRlKCdjb2xvcicsICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlIDogbXhDb25zdGFudHMuTk9ORSk7CisJCXRoaXMucm9vdC5hcHBlbmRDaGlsZChlbGVtKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRGb250U2l6ZQorICogCisgKiBTZXRzIHRoZSBjdXJyZW50IGZvbnQgc2l6ZS4gRGVmYXVsdCBpcyA8bXhDb25zdGFudHMuREVGQVVMVF9GT05UU0laRT4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbHVlIC0gTnVtZXJpYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZm9udCBzaXplLgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS5zZXRGb250U2l6ZSA9IGZ1bmN0aW9uKHZhbHVlKQoreworCWlmICh0aGlzLnRleHRFbmFibGVkKQorCXsKKwkJaWYgKHRoaXMuY29tcHJlc3NlZCkKKwkJeworCQkJaWYgKHRoaXMuc3RhdGUuZm9udFNpemUgPT0gdmFsdWUpCisJCQl7CisJCQkJcmV0dXJuOworCQkJfQorCQkJCisJCQlteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldEZvbnRTaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCX0KKwkJCisJCXZhciBlbGVtID0gdGhpcy5jcmVhdGVFbGVtZW50KCdmb250c2l6ZScpOworCQllbGVtLnNldEF0dHJpYnV0ZSgnc2l6ZScsIHZhbHVlKTsKKwkJdGhpcy5yb290LmFwcGVuZENoaWxkKGVsZW0pOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEZvbnRGYW1pbHkKKyAqIAorICogU2V0cyB0aGUgY3VycmVudCBmb250IGZhbWlseS4gRGVmYXVsdCBpcyA8bXhDb25zdGFudHMuREVGQVVMVF9GT05URkFNSUxZPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZvbnQgZmFtaWx5LiBUaGlzIGhhbmRsZXMgdGhlIHNhbWUKKyAqIHZhbHVlcyBhcyB0aGUgQ1NTIGZvbnQtZmFtaWx5IHByb3BlcnR5LgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS5zZXRGb250RmFtaWx5ID0gZnVuY3Rpb24odmFsdWUpCit7CisJaWYgKHRoaXMudGV4dEVuYWJsZWQpCisJeworCQlpZiAodGhpcy5jb21wcmVzc2VkKQorCQl7CisJCQlpZiAodGhpcy5zdGF0ZS5mb250RmFtaWx5ID09IHZhbHVlKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5zZXRGb250RmFtaWx5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCX0KKwkJCisJCXZhciBlbGVtID0gdGhpcy5jcmVhdGVFbGVtZW50KCdmb250ZmFtaWx5Jyk7CisJCWVsZW0uc2V0QXR0cmlidXRlKCdmYW1pbHknLCB2YWx1ZSk7CisJCXRoaXMucm9vdC5hcHBlbmRDaGlsZChlbGVtKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRGb250U3R5bGUKKyAqIAorICogU2V0cyB0aGUgY3VycmVudCBmb250IHN0eWxlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIE51bWVyaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZvbnQgZmFtaWx5LiBUaGlzIGlzIHRoZSBzdW0gb2YgdGhlCisgKiBmb250IHN0eWxlcyBmcm9tIDxteENvbnN0YW50cz4uCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLnNldEZvbnRTdHlsZSA9IGZ1bmN0aW9uKHZhbHVlKQoreworCWlmICh0aGlzLnRleHRFbmFibGVkKQorCXsKKwkJaWYgKHZhbHVlID09IG51bGwpCisJCXsKKwkJCXZhbHVlID0gMDsKKwkJfQorCQkKKwkJaWYgKHRoaXMuY29tcHJlc3NlZCkKKwkJeworCQkJaWYgKHRoaXMuc3RhdGUuZm9udFN0eWxlID09IHZhbHVlKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5zZXRGb250U3R5bGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJfQorCQkKKwkJdmFyIGVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ2ZvbnRzdHlsZScpOworCQllbGVtLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCB2YWx1ZSk7CisJCXRoaXMucm9vdC5hcHBlbmRDaGlsZChlbGVtKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRTaGFkb3cKKyAqIAorICogRW5hYmxlcyBvciBkaXNhYmxlcyBzaGFkb3dzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgc2hhZG93cyBzaG91bGQgYmUgZW5hYmxlZC4KKyAqLworbXhYbWxDYW52YXMyRC5wcm90b3R5cGUuc2V0U2hhZG93ID0gZnVuY3Rpb24odmFsdWUpCit7CisJaWYgKHRoaXMuY29tcHJlc3NlZCkKKwl7CisJCWlmICh0aGlzLnN0YXRlLnNoYWRvdyA9PSB2YWx1ZSkKKwkJeworCQkJcmV0dXJuOworCQl9CisJCQorCQlteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldFNoYWRvdy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworCX0KKwkKKwl2YXIgZWxlbSA9IHRoaXMuY3JlYXRlRWxlbWVudCgnc2hhZG93Jyk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ2VuYWJsZWQnLCAodmFsdWUpID8gJzEnIDogJzAnKTsKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRTaGFkb3dDb2xvcgorICogCisgKiBTZXRzIHRoZSBjdXJyZW50IHNoYWRvdyBjb2xvci4gRGVmYXVsdCBpcyA8bXhDb25zdGFudHMuU0hBRE9XQ09MT1I+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb2xvciBvciAnbm9uZScuCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLnNldFNoYWRvd0NvbG9yID0gZnVuY3Rpb24odmFsdWUpCit7CisJaWYgKHRoaXMuY29tcHJlc3NlZCkKKwl7CisJCWlmICh2YWx1ZSA9PSBteENvbnN0YW50cy5OT05FKQorCQl7CisJCQl2YWx1ZSA9IG51bGw7CisJCX0KKwkJCisJCWlmICh0aGlzLnN0YXRlLnNoYWRvd0NvbG9yID09IHZhbHVlKQorCQl7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCW14QWJzdHJhY3RDYW52YXMyRC5wcm90b3R5cGUuc2V0U2hhZG93Q29sb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9CisJCisJdmFyIGVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ3NoYWRvd2NvbG9yJyk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ2NvbG9yJywgKHZhbHVlICE9IG51bGwpID8gdmFsdWUgOiBteENvbnN0YW50cy5OT05FKTsKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRTaGFkb3dBbHBoYQorICogCisgKiBTZXRzIHRoZSBjdXJyZW50IHNoYWRvd3MgYWxwaGEuIERlZmF1bHQgaXMgPG14Q29uc3RhbnRzLlNIQURPV19PUEFDSVRZPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSBuZXcgYWxwaGEuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYmV0d2VlbgorICogMSAob3BhcXVlKSBhbmQgMCAodHJhbnNwYXJlbnQpLgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS5zZXRTaGFkb3dBbHBoYSA9IGZ1bmN0aW9uKHZhbHVlKQoreworCWlmICh0aGlzLmNvbXByZXNzZWQpCisJeworCQlpZiAodGhpcy5zdGF0ZS5zaGFkb3dBbHBoYSA9PSB2YWx1ZSkKKwkJeworCQkJcmV0dXJuOworCQl9CisJCQorCQlteEFic3RyYWN0Q2FudmFzMkQucHJvdG90eXBlLnNldFNoYWRvd0FscGhhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJfQorCQorCXZhciBlbGVtID0gdGhpcy5jcmVhdGVFbGVtZW50KCdzaGFkb3dhbHBoYScpOworCWVsZW0uc2V0QXR0cmlidXRlKCdhbHBoYScsIHZhbHVlKTsKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7CisJCit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRTaGFkb3dPZmZzZXQKKyAqIAorICogU2V0cyB0aGUgY3VycmVudCBzaGFkb3cgb2Zmc2V0LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBkeCAtIE51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIGhvcml6b250YWwgb2Zmc2V0IG9mIHRoZSBzaGFkb3cuCisgKiBkeSAtIE51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgc2hhZG93LgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS5zZXRTaGFkb3dPZmZzZXQgPSBmdW5jdGlvbihkeCwgZHkpCit7CisJaWYgKHRoaXMuY29tcHJlc3NlZCkKKwl7CisJCWlmICh0aGlzLnN0YXRlLnNoYWRvd0R4ID09IGR4ICYmIHRoaXMuc3RhdGUuc2hhZG93RHkgPT0gZHkpCisJCXsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJbXhBYnN0cmFjdENhbnZhczJELnByb3RvdHlwZS5zZXRTaGFkb3dPZmZzZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwl9CisJCisJdmFyIGVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ3NoYWRvd29mZnNldCcpOworCWVsZW0uc2V0QXR0cmlidXRlKCdkeCcsIGR4KTsKKwllbGVtLnNldEF0dHJpYnV0ZSgnZHknLCBkeSk7CisJdGhpcy5yb290LmFwcGVuZENoaWxkKGVsZW0pOworCQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVjdAorICogCisgKiBQdXRzIGEgcmVjdGFuZ2xlIGludG8gdGhlIGRyYXdpbmcgYnVmZmVyLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB4IC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgKiB5IC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgKiB3IC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAqIGggLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAqLworbXhYbWxDYW52YXMyRC5wcm90b3R5cGUucmVjdCA9IGZ1bmN0aW9uKHgsIHksIHcsIGgpCit7CisJdmFyIGVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ3JlY3QnKTsKKwllbGVtLnNldEF0dHJpYnV0ZSgneCcsIHRoaXMuZm9ybWF0KHgpKTsKKwllbGVtLnNldEF0dHJpYnV0ZSgneScsIHRoaXMuZm9ybWF0KHkpKTsKKwllbGVtLnNldEF0dHJpYnV0ZSgndycsIHRoaXMuZm9ybWF0KHcpKTsKKwllbGVtLnNldEF0dHJpYnV0ZSgnaCcsIHRoaXMuZm9ybWF0KGgpKTsKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByb3VuZHJlY3QKKyAqIAorICogUHV0cyBhIHJvdW5kZWQgcmVjdGFuZ2xlIGludG8gdGhlIGRyYXdpbmcgYnVmZmVyLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB4IC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgKiB5IC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgKiB3IC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZS4KKyAqIGggLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAqIGR4IC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgaG9yaXpvbnRhbCByb3VuZGluZy4KKyAqIGR5IC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgdmVydGljYWwgcm91bmRpbmcuCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLnJvdW5kcmVjdCA9IGZ1bmN0aW9uKHgsIHksIHcsIGgsIGR4LCBkeSkKK3sKKwl2YXIgZWxlbSA9IHRoaXMuY3JlYXRlRWxlbWVudCgncm91bmRyZWN0Jyk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ3gnLCB0aGlzLmZvcm1hdCh4KSk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ3knLCB0aGlzLmZvcm1hdCh5KSk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ3cnLCB0aGlzLmZvcm1hdCh3KSk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ2gnLCB0aGlzLmZvcm1hdChoKSk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ2R4JywgdGhpcy5mb3JtYXQoZHgpKTsKKwllbGVtLnNldEF0dHJpYnV0ZSgnZHknLCB0aGlzLmZvcm1hdChkeSkpOworCXRoaXMucm9vdC5hcHBlbmRDaGlsZChlbGVtKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGVsbGlwc2UKKyAqIAorICogUHV0cyBhbiBlbGxpcHNlIGludG8gdGhlIGRyYXdpbmcgYnVmZmVyLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB4IC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBlbGxpcHNlLgorICogeSAtIE51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgZWxsaXBzZS4KKyAqIHcgLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSB3aWR0aCBvZiB0aGUgZWxsaXBzZS4KKyAqIGggLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSBoZWlnaHQgb2YgdGhlIGVsbGlwc2UuCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLmVsbGlwc2UgPSBmdW5jdGlvbih4LCB5LCB3LCBoKQoreworCXZhciBlbGVtID0gdGhpcy5jcmVhdGVFbGVtZW50KCdlbGxpcHNlJyk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ3gnLCB0aGlzLmZvcm1hdCh4KSk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ3knLCB0aGlzLmZvcm1hdCh5KSk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ3cnLCB0aGlzLmZvcm1hdCh3KSk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ2gnLCB0aGlzLmZvcm1hdChoKSk7CisJdGhpcy5yb290LmFwcGVuZENoaWxkKGVsZW0pOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaW1hZ2UKKyAqIAorICogUGFpbnRzIGFuIGltYWdlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB4IC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBpbWFnZS4KKyAqIHkgLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGltYWdlLgorICogdyAtIE51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZS4KKyAqIGggLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLgorICogc3JjIC0gU3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBVUkwgb2YgdGhlIGltYWdlLgorICogYXNwZWN0IC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBhc3BlY3Qgb2YgdGhlIGltYWdlIHNob3VsZCBiZSBwcmVzZXJ2ZWQuCisgKiBmbGlwSCAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgaW1hZ2Ugc2hvdWxkIGJlIGZsaXBwZWQgaG9yaXpvbnRhbGx5LgorICogZmxpcFYgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGltYWdlIHNob3VsZCBiZSBmbGlwcGVkIHZlcnRpY2FsbHkuCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLmltYWdlID0gZnVuY3Rpb24oeCwgeSwgdywgaCwgc3JjLCBhc3BlY3QsIGZsaXBILCBmbGlwVikKK3sKKwlzcmMgPSB0aGlzLmNvbnZlcnRlci5jb252ZXJ0KHNyYyk7CisJCisJLy8gTEFURVI6IEFkZCBvcHRpb24gZm9yIGVtYmVkZGluZyBpbWFnZXMgYXMgYmFzZTY0LgorCXZhciBlbGVtID0gdGhpcy5jcmVhdGVFbGVtZW50KCdpbWFnZScpOworCWVsZW0uc2V0QXR0cmlidXRlKCd4JywgdGhpcy5mb3JtYXQoeCkpOworCWVsZW0uc2V0QXR0cmlidXRlKCd5JywgdGhpcy5mb3JtYXQoeSkpOworCWVsZW0uc2V0QXR0cmlidXRlKCd3JywgdGhpcy5mb3JtYXQodykpOworCWVsZW0uc2V0QXR0cmlidXRlKCdoJywgdGhpcy5mb3JtYXQoaCkpOworCWVsZW0uc2V0QXR0cmlidXRlKCdzcmMnLCBzcmMpOworCWVsZW0uc2V0QXR0cmlidXRlKCdhc3BlY3QnLCAoYXNwZWN0KSA/ICcxJyA6ICcwJyk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ2ZsaXBIJywgKGZsaXBIKSA/ICcxJyA6ICcwJyk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ2ZsaXBWJywgKGZsaXBWKSA/ICcxJyA6ICcwJyk7CisJdGhpcy5yb290LmFwcGVuZENoaWxkKGVsZW0pOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYmVnaW4KKyAqIAorICogU3RhcnRzIGEgbmV3IHBhdGggYW5kIHB1dHMgaXQgaW50byB0aGUgZHJhd2luZyBidWZmZXIuCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLmJlZ2luID0gZnVuY3Rpb24oKQoreworCXRoaXMucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUVsZW1lbnQoJ2JlZ2luJykpOworCXRoaXMubGFzdFggPSAwOworCXRoaXMubGFzdFkgPSAwOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogbW92ZVRvCisgKiAKKyAqIE1vdmVzIHRoZSBjdXJyZW50IHBhdGggdGhlIGdpdmVuIHBvaW50LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB4IC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBwb2ludC4KKyAqIHkgLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS5tb3ZlVG8gPSBmdW5jdGlvbih4LCB5KQoreworCXZhciBlbGVtID0gdGhpcy5jcmVhdGVFbGVtZW50KCdtb3ZlJyk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ3gnLCB0aGlzLmZvcm1hdCh4KSk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ3knLCB0aGlzLmZvcm1hdCh5KSk7CisJdGhpcy5yb290LmFwcGVuZENoaWxkKGVsZW0pOworCXRoaXMubGFzdFggPSB4OworCXRoaXMubGFzdFkgPSB5OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogbGluZVRvCisgKiAKKyAqIERyYXdzIGEgbGluZSB0byB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHggLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGVuZHBvaW50LgorICogeSAtIE51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgZW5kcG9pbnQuCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLmxpbmVUbyA9IGZ1bmN0aW9uKHgsIHkpCit7CisJdmFyIGVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ2xpbmUnKTsKKwllbGVtLnNldEF0dHJpYnV0ZSgneCcsIHRoaXMuZm9ybWF0KHgpKTsKKwllbGVtLnNldEF0dHJpYnV0ZSgneScsIHRoaXMuZm9ybWF0KHkpKTsKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQoZWxlbSk7CisJdGhpcy5sYXN0WCA9IHg7CisJdGhpcy5sYXN0WSA9IHk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBxdWFkVG8KKyAqIAorICogQWRkcyBhIHF1YWRyYXRpYyBjdXJ2ZSB0byB0aGUgY3VycmVudCBwYXRoLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB4MSAtIE51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBwb2ludC4KKyAqIHkxIC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LgorICogeDIgLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGVuZHBvaW50LgorICogeTIgLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGVuZHBvaW50LgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS5xdWFkVG8gPSBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MikKK3sKKwl2YXIgZWxlbSA9IHRoaXMuY3JlYXRlRWxlbWVudCgncXVhZCcpOworCWVsZW0uc2V0QXR0cmlidXRlKCd4MScsIHRoaXMuZm9ybWF0KHgxKSk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ3kxJywgdGhpcy5mb3JtYXQoeTEpKTsKKwllbGVtLnNldEF0dHJpYnV0ZSgneDInLCB0aGlzLmZvcm1hdCh4MikpOworCWVsZW0uc2V0QXR0cmlidXRlKCd5MicsIHRoaXMuZm9ybWF0KHkyKSk7CisJdGhpcy5yb290LmFwcGVuZENoaWxkKGVsZW0pOworCXRoaXMubGFzdFggPSB4MjsKKwl0aGlzLmxhc3RZID0geTI7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjdXJ2ZVRvCisgKiAKKyAqIEFkZHMgYSBiZXppZXIgY3VydmUgdG8gdGhlIGN1cnJlbnQgcGF0aC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogeDEgLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgKiB5MSAtIE51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAqIHgyIC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAqIHkyIC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAqIHgzIC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBlbmRwb2ludC4KKyAqIHkzIC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSBlbmRwb2ludC4KKyAqLworbXhYbWxDYW52YXMyRC5wcm90b3R5cGUuY3VydmVUbyA9IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpCit7CisJdmFyIGVsZW0gPSB0aGlzLmNyZWF0ZUVsZW1lbnQoJ2N1cnZlJyk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ3gxJywgdGhpcy5mb3JtYXQoeDEpKTsKKwllbGVtLnNldEF0dHJpYnV0ZSgneTEnLCB0aGlzLmZvcm1hdCh5MSkpOworCWVsZW0uc2V0QXR0cmlidXRlKCd4MicsIHRoaXMuZm9ybWF0KHgyKSk7CisJZWxlbS5zZXRBdHRyaWJ1dGUoJ3kyJywgdGhpcy5mb3JtYXQoeTIpKTsKKwllbGVtLnNldEF0dHJpYnV0ZSgneDMnLCB0aGlzLmZvcm1hdCh4MykpOworCWVsZW0uc2V0QXR0cmlidXRlKCd5MycsIHRoaXMuZm9ybWF0KHkzKSk7CisJdGhpcy5yb290LmFwcGVuZENoaWxkKGVsZW0pOworCXRoaXMubGFzdFggPSB4MzsKKwl0aGlzLmxhc3RZID0geTM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjbG9zZQorICogCisgKiBDbG9zZXMgdGhlIGN1cnJlbnQgcGF0aC4KKyAqLworbXhYbWxDYW52YXMyRC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpCit7CisJdGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRWxlbWVudCgnY2xvc2UnKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB0ZXh0CisgKiAKKyAqIFBhaW50cyB0aGUgZ2l2ZW4gdGV4dC4gUG9zc2libGUgdmFsdWVzIGZvciBmb3JtYXQgYXJlIGVtcHR5IHN0cmluZyBmb3IKKyAqIHBsYWluIHRleHQgYW5kIGh0bWwgZm9yIEhUTUwgbWFya3VwLiBCYWNrZ3JvdW5kIGFuZCBib3JkZXIgY29sb3IgYXMgd2VsbAorICogYXMgY2xpcHBpbmcgaXMgbm90IGF2YWlsYWJsZSBpbiBwbGFpbiB0ZXh0IGxhYmVscyBmb3IgVk1MLiBIVE1MIGxhYmVscworICogYXJlIG5vdCBhdmFpbGFibGUgYXMgcGFydCBvZiBzaGFwZXMgd2l0aCBubyBmb3JlaWduT2JqZWN0IHN1cHBvcnQgaW4gU1ZHCisgKiAoZWcuIElFOSwgSUUxMCkuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHggLSBOdW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHRleHQuCisgKiB5IC0gTnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSB0ZXh0LgorICogdyAtIE51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIGF2YWlsYWJsZSB3aWR0aCBmb3IgdGhlIHRleHQgb3IgMCBmb3IgYXV0b21hdGljIHdpZHRoLgorICogaCAtIE51bWJlciB0aGF0IHJlcHJlc2VudHMgdGhlIGF2YWlsYWJsZSBoZWlnaHQgZm9yIHRoZSB0ZXh0IG9yIDAgZm9yIGF1dG9tYXRpYyBoZWlnaHQuCisgKiBzdHIgLSBTdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIHRleHQgdG8gYmUgcGFpbnRlZC4KKyAqIGFsaWduIC0gU3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgaG9yaXpvbnRhbCBhbGlnbm1lbnQuCisgKiB2YWxpZ24gLSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQuCisgKiB3cmFwIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB3b3JkLXdyYXBwaW5nIGlzIGVuYWJsZWQuIFJlcXVpcmVzIHcgPiAwLgorICogZm9ybWF0IC0gRW1wdHkgc3RyaW5nIGZvciBwbGFpbiB0ZXh0IG9yICdodG1sJyBmb3IgSFRNTCBtYXJrdXAuCisgKiBvdmVyZmxvdyAtIFNwZWNpZmllcyB0aGUgb3ZlcmZsb3cgYmVoYXZpb3VyIG9mIHRoZSBsYWJlbC4gUmVxdWlyZXMgdyA+IDAgYW5kL29yIGggPiAwLgorICogY2xpcCAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIGxhYmVsIHNob3VsZCBiZSBjbGlwcGVkLiBSZXF1aXJlcyB3ID4gMCBhbmQvb3IgaCA+IDAuCisgKiByb3RhdGlvbiAtIE51bWJlciB0aGF0IHNwZWNpZmllcyB0aGUgYW5nbGUgb2YgdGhlIHJvdGF0aW9uIGFyb3VuZCB0aGUgYW5jaG9yIHBvaW50IG9mIHRoZSB0ZXh0LgorICogZGlyIC0gT3B0aW9uYWwgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSB0ZXh0IGRpcmVjdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZSBydGwgYW5kIGxydC4KKyAqLworbXhYbWxDYW52YXMyRC5wcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uKHgsIHksIHcsIGgsIHN0ciwgYWxpZ24sIHZhbGlnbiwgd3JhcCwgZm9ybWF0LCBvdmVyZmxvdywgY2xpcCwgcm90YXRpb24sIGRpcikKK3sKKwlpZiAodGhpcy50ZXh0RW5hYmxlZCAmJiBzdHIgIT0gbnVsbCkKKwl7CisJCWlmIChteFV0aWxzLmlzTm9kZShzdHIpKQorCQl7CisJCQlzdHIgPSBteFV0aWxzLmdldE91dGVySHRtbChzdHIpOworCQl9CisJCQorCQl2YXIgZWxlbSA9IHRoaXMuY3JlYXRlRWxlbWVudCgndGV4dCcpOworCQllbGVtLnNldEF0dHJpYnV0ZSgneCcsIHRoaXMuZm9ybWF0KHgpKTsKKwkJZWxlbS5zZXRBdHRyaWJ1dGUoJ3knLCB0aGlzLmZvcm1hdCh5KSk7CisJCWVsZW0uc2V0QXR0cmlidXRlKCd3JywgdGhpcy5mb3JtYXQodykpOworCQllbGVtLnNldEF0dHJpYnV0ZSgnaCcsIHRoaXMuZm9ybWF0KGgpKTsKKwkJZWxlbS5zZXRBdHRyaWJ1dGUoJ3N0cicsIHN0cik7CisJCQorCQlpZiAoYWxpZ24gIT0gbnVsbCkKKwkJeworCQkJZWxlbS5zZXRBdHRyaWJ1dGUoJ2FsaWduJywgYWxpZ24pOworCQl9CisJCQorCQlpZiAodmFsaWduICE9IG51bGwpCisJCXsKKwkJCWVsZW0uc2V0QXR0cmlidXRlKCd2YWxpZ24nLCB2YWxpZ24pOworCQl9CisJCQorCQllbGVtLnNldEF0dHJpYnV0ZSgnd3JhcCcsICh3cmFwKSA/ICcxJyA6ICcwJyk7CisJCQorCQlpZiAoZm9ybWF0ID09IG51bGwpCisJCXsKKwkJCWZvcm1hdCA9ICcnOworCQl9CisJCQorCQllbGVtLnNldEF0dHJpYnV0ZSgnZm9ybWF0JywgZm9ybWF0KTsKKwkJCisJCWlmIChvdmVyZmxvdyAhPSBudWxsKQorCQl7CisJCQllbGVtLnNldEF0dHJpYnV0ZSgnb3ZlcmZsb3cnLCBvdmVyZmxvdyk7CisJCX0KKwkJCisJCWlmIChjbGlwICE9IG51bGwpCisJCXsKKwkJCWVsZW0uc2V0QXR0cmlidXRlKCdjbGlwJywgKGNsaXApID8gJzEnIDogJzAnKTsKKwkJfQorCQkKKwkJaWYgKHJvdGF0aW9uICE9IG51bGwpCisJCXsKKwkJCWVsZW0uc2V0QXR0cmlidXRlKCdyb3RhdGlvbicsIHJvdGF0aW9uKTsKKwkJfQorCQkKKwkJaWYgKGRpciAhPSBudWxsKQorCQl7CisJCQllbGVtLnNldEF0dHJpYnV0ZSgnZGlyJywgZGlyKTsKKwkJfQorCQkKKwkJdGhpcy5yb290LmFwcGVuZENoaWxkKGVsZW0pOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHN0cm9rZQorICogCisgKiBQYWludHMgdGhlIG91dGxpbmUgb2YgdGhlIGN1cnJlbnQgZHJhd2luZyBidWZmZXIuCisgKi8KK214WG1sQ2FudmFzMkQucHJvdG90eXBlLnN0cm9rZSA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVFbGVtZW50KCdzdHJva2UnKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBmaWxsCisgKiAKKyAqIEZpbGxzIHRoZSBjdXJyZW50IGRyYXdpbmcgYnVmZmVyLgorICovCitteFhtbENhbnZhczJELnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24oKQoreworCXRoaXMucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZUVsZW1lbnQoJ2ZpbGwnKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBmaWxsQW5kU3Ryb2tlCisgKiAKKyAqIEZpbGxzIHRoZSBjdXJyZW50IGRyYXdpbmcgYnVmZmVyIGFuZCBpdHMgb3V0bGluZS4KKyAqLworbXhYbWxDYW52YXMyRC5wcm90b3R5cGUuZmlsbEFuZFN0cm9rZSA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVFbGVtZW50KCdmaWxsc3Ryb2tlJykpOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214WG1sUmVxdWVzdC5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy91dGlsL214WG1sUmVxdWVzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGNjZjFmCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3V0aWwvbXhYbWxSZXF1ZXN0LmpzCkBAIC0wLDAgKzEsNDYzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFhtbFJlcXVlc3QKKyAqIAorICogWE1MIEhUVFAgcmVxdWVzdCB3cmFwcGVyLiBTZWUgYWxzbzogPG14VXRpbHMuZ2V0PiwgPG14VXRpbHMucG9zdD4gYW5kCisgKiA8bXhVdGlscy5sb2FkPi4gVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNyb3NzLWJyb3dzZXIgYWJzdHJhY3Rpb24gZm9yIEFqYXgKKyAqIHJlcXVlc3RzLgorICogCisgKiBFbmNvZGluZzoKKyAqIAorICogRm9yIGVuY29kaW5nIHBhcmFtZXRlciB2YWx1ZXMsIHRoZSBidWlsdC1pbiBlbmNvZGVVUklDb21wb25lbnQgSmF2YVNjcmlwdAorICogbWV0aG9kIG11c3QgYmUgdXNlZC4gRm9yIGF1dG9tYXRpYyBlbmNvZGluZyBvZiBwb3N0IGRhdGEgaW4gPG14RWRpdG9yPiB0aGUKKyAqIDxteEVkaXRvci5lc2NhcGVQb3N0RGF0YT4gc3dpdGNoIGNhbiBiZSBzZXQgdG8gdHJ1ZSAoZGVmYXVsdCkuIFRoZSBlbmNvZGluZworICogd2lsbCBiZSBjYXJyaWVkIG91dCB1c2luZyB0aGUgY29udGUgdHlwZSBvZiB0aGUgcGFnZS4gVGhhdCBpcywgdGhlIHBhZ2UKKyAqIGNvbnRhaW50aW5nIHRoZSBlZGl0b3Igc2hvdWxkIGNvbnRhaW4gYSBtZXRhIHRhZyBpbiB0aGUgaGVhZGVyLCBlZy4KKyAqIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KKyAqIAorICogRXhhbXBsZToKKyAqIAorICogKGNvZGUpCisgKiB2YXIgb25sb2FkID0gZnVuY3Rpb24ocmVxKQorICogeworICogICBteFV0aWxzLmFsZXJ0KHJlcS5nZXREb2N1bWVudEVsZW1lbnQoKSk7CisgKiB9CisgKiAKKyAqIHZhciBvbmVycm9yID0gZnVuY3Rpb24ocmVxKQorICogeworICogICBteFV0aWxzLmFsZXJ0KCdFcnJvcicpOworICogfQorICogbmV3IG14WG1sUmVxdWVzdCh1cmwsICdrZXk9dmFsdWUnKS5zZW5kKG9ubG9hZCwgb25lcnJvcik7CisgKiAoZW5kKQorICogCisgKiBTZW5kcyBhbiBhc3luY2hyb25vdXMgUE9TVCByZXF1ZXN0IHRvIHRoZSBzcGVjaWZpZWQgVVJMLgorICogCisgKiBFeGFtcGxlOgorICogCisgKiAoY29kZSkKKyAqIHZhciByZXEgPSBuZXcgbXhYbWxSZXF1ZXN0KHVybCwgJ2tleT12YWx1ZScsICdQT1NUJywgZmFsc2UpOworICogcmVxLnNlbmQoKTsKKyAqIG14VXRpbHMuYWxlcnQocmVxLmdldERvY3VtZW50RWxlbWVudCgpKTsKKyAqIChlbmQpCisgKiAKKyAqIFNlbmRzIGEgc3luY2hyb25vdXMgUE9TVCByZXF1ZXN0IHRvIHRoZSBzcGVjaWZpZWQgVVJMLgorICogCisgKiBFeGFtcGxlOgorICogCisgKiAoY29kZSkKKyAqIHZhciBlbmNvZGVyID0gbmV3IG14Q29kZWMoKTsKKyAqIHZhciByZXN1bHQgPSBlbmNvZGVyLmVuY29kZShncmFwaC5nZXRNb2RlbCgpKTsKKyAqIHZhciB4bWwgPSBlbmNvZGVVUklDb21wb25lbnQobXhVdGlscy5nZXRYbWwocmVzdWx0KSk7CisgKiBuZXcgbXhYbWxSZXF1ZXN0KHVybCwgJ3htbD0nK3htbCkuc2VuZCgpOworICogKGVuZCkKKyAqIAorICogU2VuZHMgYW4gZW5jb2RlZCBncmFwaCBtb2RlbCB0byB0aGUgc3BlY2lmaWVkIFVSTCB1c2luZyB4bWwgYXMgdGhlCisgKiBwYXJhbWV0ZXIgbmFtZS4gVGhlIHBhcmFtZXRlciBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgaW4gQyMgYXMgZm9sbG93czoKKyAqIAorICogKGNvZGUpCisgKiBzdHJpbmcgeG1sID0gSHR0cFV0aWxpdHkuVXJsRGVjb2RlKGNvbnRleHQuUmVxdWVzdC5QYXJhbXNbInhtbCJdKTsKKyAqIChlbmQpCisgKiAKKyAqIE9yIGluIEphdmEgYXMgZm9sbG93czoKKyAqIAorICogKGNvZGUpCisgKiBTdHJpbmcgeG1sID0gVVJMRGVjb2Rlci5kZWNvZGUocmVxdWVzdC5nZXRQYXJhbWV0ZXIoInhtbCIpLCAiVVRGLTgiKS5yZXBsYWNlKCJcbiIsICImI3hhOyIpOworICogKGVuZCkKKyAqCisgKiBOb3RlIHRoYXQgdGhlIGxpbmVmZWVkcyBzaG91bGQgb25seSBiZSByZXBsYWNlZCBpZiB0aGUgWE1MIGlzCisgKiBwcm9jZXNzZWQgaW4gSmF2YSwgZm9yIGV4YW1wbGUgd2hlbiBjcmVhdGluZyBhbiBpbWFnZS4KKyAqIAorICogQ29uc3RydWN0b3I6IG14WG1sUmVxdWVzdAorICogCisgKiBDb25zdHJ1Y3RzIGFuIFhNTCBIVFRQIHJlcXVlc3QuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHVybCAtIFRhcmdldCBVUkwgb2YgdGhlIHJlcXVlc3QuCisgKiBwYXJhbXMgLSBGb3JtIGVuY29kZWQgcGFyYW1ldGVycyB0byBzZW5kIHdpdGggYSBQT1NUIHJlcXVlc3QuCisgKiBtZXRob2QgLSBTdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIHJlcXVlc3QgbWV0aG9kLiBQb3NzaWJsZSB2YWx1ZXMgYXJlCisgKiBQT1NUIGFuZCBHRVQuIERlZmF1bHQgaXMgUE9TVC4KKyAqIGFzeW5jIC0gQm9vbGVhbiBzcGVjaWZ5aW5nIGlmIGFuIGFzeW5jaHJvbm91cyByZXF1ZXN0IHNob3VsZCBiZSB1c2VkLgorICogRGVmYXVsdCBpcyB0cnVlLgorICogdXNlcm5hbWUgLSBTdHJpbmcgc3BlY2lmeWluZyB0aGUgdXNlcm5hbWUgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3QuCisgKiBwYXNzd29yZCAtIFN0cmluZyBzcGVjaWZ5aW5nIHRoZSBwYXNzd29yZCB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdC4KKyAqLworZnVuY3Rpb24gbXhYbWxSZXF1ZXN0KHVybCwgcGFyYW1zLCBtZXRob2QsIGFzeW5jLCB1c2VybmFtZSwgcGFzc3dvcmQpCit7CisJdGhpcy51cmwgPSB1cmw7CisJdGhpcy5wYXJhbXMgPSBwYXJhbXM7CisJdGhpcy5tZXRob2QgPSBtZXRob2QgfHwgJ1BPU1QnOworCXRoaXMuYXN5bmMgPSAoYXN5bmMgIT0gbnVsbCkgPyBhc3luYyA6IHRydWU7CisJdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworCXRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKK307CisKKy8qKgorICogVmFyaWFibGU6IHVybAorICogCisgKiBIb2xkcyB0aGUgdGFyZ2V0IFVSTCBvZiB0aGUgcmVxdWVzdC4KKyAqLworbXhYbWxSZXF1ZXN0LnByb3RvdHlwZS51cmwgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBwYXJhbXMKKyAqIAorICogSG9sZHMgdGhlIGZvcm0gZW5jb2RlZCBkYXRhIGZvciB0aGUgUE9TVCByZXF1ZXN0LgorICovCitteFhtbFJlcXVlc3QucHJvdG90eXBlLnBhcmFtcyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IG1ldGhvZAorICogCisgKiBTcGVjaWZpZXMgdGhlIHJlcXVlc3QgbWV0aG9kLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFBPU1QgYW5kIEdFVC4gRGVmYXVsdAorICogaXMgUE9TVC4KKyAqLworbXhYbWxSZXF1ZXN0LnByb3RvdHlwZS5tZXRob2QgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBhc3luYworICogCisgKiBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHJlcXVlc3QgaXMgYXN5bmNocm9ub3VzLgorICovCitteFhtbFJlcXVlc3QucHJvdG90eXBlLmFzeW5jID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogYmluYXJ5CisgKiAKKyAqIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgcmVxdWVzdCBpcyBiaW5hcnkuIFRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaW4gSUUuCisgKiBJbiBhbGwgb3RoZXIgYnJvd3NlcnMgdGhlIHJlcXVlc3RlZCBtaW1lIHR5cGUgaXMgc2V0IHRvCisgKiB0ZXh0L3BsYWluOyBjaGFyc2V0PXgtdXNlci1kZWZpbmVkLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteFhtbFJlcXVlc3QucHJvdG90eXBlLmJpbmFyeSA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiB3aXRoQ3JlZGVudGlhbHMKKyAqIAorICogU3BlY2lmaWVzIGlmIHdpdGhDcmVkZW50aWFscyBzaG91bGQgYmUgdXNlZCBpbiBIVE1MNS1jb21wbGlhbnQgYnJvd3NlcnMuIERlZmF1bHQgaXMKKyAqIGZhbHNlLgorICovCitteFhtbFJlcXVlc3QucHJvdG90eXBlLndpdGhDcmVkZW50aWFscyA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiB1c2VybmFtZQorICogCisgKiBTcGVjaWZpZXMgdGhlIHVzZXJuYW1lIHRvIGJlIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLgorICovCitteFhtbFJlcXVlc3QucHJvdG90eXBlLnVzZXJuYW1lID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogcGFzc3dvcmQKKyAqIAorICogU3BlY2lmaWVzIHRoZSBwYXNzd29yZCB0byBiZSB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4KKyAqLworbXhYbWxSZXF1ZXN0LnByb3RvdHlwZS5wYXNzd29yZCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHJlcXVlc3QKKyAqIAorICogSG9sZHMgdGhlIGlubmVyLCBicm93c2VyLXNwZWNpZmljIHJlcXVlc3Qgb2JqZWN0LgorICovCitteFhtbFJlcXVlc3QucHJvdG90eXBlLnJlcXVlc3QgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBkZWNvZGVTaW11bGF0ZVZhbHVlcworICogCisgKiBTcGVjaWZpZXMgaWYgcmVxdWVzdCB2YWx1ZXMgc2hvdWxkIGJlIGRlY29kZWQgYXMgVVJJcyBiZWZvcmUgc2V0dGluZyB0aGUKKyAqIHRleHRhcmVhIHZhbHVlIGluIDxzaW11bGF0ZT4uIERlZmF1bHRzIHRvIGZhbHNlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwKKyAqIHRvIGF2b2lkIGFub3RoZXIgZGVjb2RlIG9uIHRoZSBzZXJ2ZXIgdGhpcyBzaG91bGQgYmUgc2V0IHRvIHRydWUuCisgKi8KK214WG1sUmVxdWVzdC5wcm90b3R5cGUuZGVjb2RlU2ltdWxhdGVWYWx1ZXMgPSBmYWxzZTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNCaW5hcnkKKyAqIAorICogUmV0dXJucyA8YmluYXJ5Pi4KKyAqLworbXhYbWxSZXF1ZXN0LnByb3RvdHlwZS5pc0JpbmFyeSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5iaW5hcnk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRCaW5hcnkKKyAqIAorICogU2V0cyA8YmluYXJ5Pi4KKyAqLworbXhYbWxSZXF1ZXN0LnByb3RvdHlwZS5zZXRCaW5hcnkgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmJpbmFyeSA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0VGV4dAorICogCisgKiBSZXR1cm5zIHRoZSByZXNwb25zZSBhcyBhIHN0cmluZy4KKyAqLworbXhYbWxSZXF1ZXN0LnByb3RvdHlwZS5nZXRUZXh0ID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLnJlcXVlc3QucmVzcG9uc2VUZXh0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNSZWFkeQorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlc3BvbnNlIGlzIHJlYWR5LgorICovCitteFhtbFJlcXVlc3QucHJvdG90eXBlLmlzUmVhZHkgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5yZWFkeVN0YXRlID09IDQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXREb2N1bWVudEVsZW1lbnQKKyAqIAorICogUmV0dXJucyB0aGUgZG9jdW1lbnQgZWxlbWVudCBvZiB0aGUgcmVzcG9uc2UgWE1MIGRvY3VtZW50LgorICovCitteFhtbFJlcXVlc3QucHJvdG90eXBlLmdldERvY3VtZW50RWxlbWVudCA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgZG9jID0gdGhpcy5nZXRYbWwoKTsKKwkKKwlpZiAoZG9jICE9IG51bGwpCisJeworCQlyZXR1cm4gZG9jLmRvY3VtZW50RWxlbWVudDsKKwl9CisJCisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRYbWwKKyAqIAorICogUmV0dXJucyB0aGUgcmVzcG9uc2UgYXMgYW4gWE1MIGRvY3VtZW50LiBVc2UgPGdldERvY3VtZW50RWxlbWVudD4gdG8gZ2V0CisgKiB0aGUgZG9jdW1lbnQgZWxlbWVudCBvZiB0aGUgWE1MIGRvY3VtZW50LgorICovCitteFhtbFJlcXVlc3QucHJvdG90eXBlLmdldFhtbCA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgeG1sID0gdGhpcy5yZXF1ZXN0LnJlc3BvbnNlWE1MOworCQorCS8vIEhhbmRsZXMgbWlzc2luZyByZXNwb25zZSBoZWFkZXJzIGluIElFLCB0aGUgZmlyc3QgY29uZGl0aW9uIGhhbmRsZXMKKwkvLyB0aGUgY2FzZSB3aGVyZSByZXNwb25zZVhNTCBpcyB0aGVyZSwgYnV0IHVzaW5nIGl0cyBub2RlcyBsZWFkcyB0bworCS8vIHR5cGUgZXJyb3JzIGluIHRoZSBteENlbGxDb2RlYyB3aGVuIHB1dHRpbmcgdGhlIG5vZGVzIGludG8gYSBuZXcKKwkvLyBkb2N1bWVudC4gVGhpcyBoYXBwZW5zIGluIElFOSBzdGFuZGFyZHMgbW9kZSBhbmQgd2l0aCBYTUwgdXNlcgorCS8vIG9iamVjdHMgb25seSwgYXMgdGhleSBhcmUgdXNlZCBkaXJlY3RseSBhcyB2YWx1ZXMgaW4gY2VsbHMuCisJaWYgKGRvY3VtZW50LmRvY3VtZW50TW9kZSA+PSA5IHx8IHhtbCA9PSBudWxsIHx8IHhtbC5kb2N1bWVudEVsZW1lbnQgPT0gbnVsbCkKKwl7CisJCXhtbCA9IG14VXRpbHMucGFyc2VYbWwodGhpcy5yZXF1ZXN0LnJlc3BvbnNlVGV4dCk7CisJfQorCQorCXJldHVybiB4bWw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRUZXh0CisgKiAKKyAqIFJldHVybnMgdGhlIHJlc3BvbnNlIGFzIGEgc3RyaW5nLgorICovCitteFhtbFJlcXVlc3QucHJvdG90eXBlLmdldFRleHQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5yZXNwb25zZVRleHQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTdGF0dXMKKyAqIAorICogUmV0dXJucyB0aGUgc3RhdHVzIGFzIGEgbnVtYmVyLCBlZy4gNDA0IGZvciAiTm90IGZvdW5kIiBvciAyMDAgZm9yICJPSyIuCisgKiBOb3RlOiBUaGUgTlNfRVJST1JfTk9UX0FWQUlMQUJMRSBmb3IgaW52YWxpZCByZXNwb25zZXMgY2Fubm90IGJlIGNvdWdodC4KKyAqLworbXhYbWxSZXF1ZXN0LnByb3RvdHlwZS5nZXRTdGF0dXMgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMucmVxdWVzdC5zdGF0dXM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGUKKyAqIAorICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgaW5uZXIgPHJlcXVlc3Q+IG9iamVjdC4KKyAqLworbXhYbWxSZXF1ZXN0LnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbigpCit7CisJaWYgKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCkKKwl7CisJCXJldHVybiBmdW5jdGlvbigpCisJCXsKKwkJCXZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKwkJCQorCQkJLy8gVE9ETzogQ2hlY2sgZm9yIG92ZXJyaWRlTWltZVR5cGUgcmVxdWlyZWQgaGVyZT8KKwkJCWlmICh0aGlzLmlzQmluYXJ5KCkgJiYgcmVxLm92ZXJyaWRlTWltZVR5cGUpCisJCQl7CisJCQkJcmVxLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvcGxhaW47IGNoYXJzZXQ9eC11c2VyLWRlZmluZWQnKTsKKwkJCX0KKworCQkJcmV0dXJuIHJlcTsKKwkJfTsKKwl9CisJZWxzZSBpZiAodHlwZW9mKEFjdGl2ZVhPYmplY3QpICE9ICd1bmRlZmluZWQnKQorCXsKKwkJcmV0dXJuIGZ1bmN0aW9uKCkKKwkJeworCQkJLy8gVE9ETzogSW1wbGVtZW50IGJpbmFyeSBvcHRpb24KKwkJCXJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTsKKwkJfTsKKwl9Cit9KCk7CisKKy8qKgorICogRnVuY3Rpb246IHNlbmQKKyAqIAorICogU2VuZCB0aGUgPHJlcXVlc3Q+IHRvIHRoZSB0YXJnZXQgVVJMIHVzaW5nIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb25zIHRvCisgKiBwcm9jZXNzIHRoZSByZXNwb25zZSBhc3ljaHJvbm91c2x5LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBvbmxvYWQgLSBGdW5jdGlvbiB0byBiZSBpbnZva2VkIGlmIGEgc3VjY2Vzc2Z1bCByZXNwb25zZSB3YXMgcmVjZWl2ZWQuCisgKiBvbmVycm9yIC0gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGFueSBlcnJvci4KKyAqIHRpbWVvdXQgLSBPcHRpb25hbCB0aW1lb3V0IGluIG1zIGJlZm9yZSBjYWxsaW5nIG9udGltZW91dC4KKyAqIG9udGltZW91dCAtIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gdGltZW91dC4KKyAqLworbXhYbWxSZXF1ZXN0LnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24ob25sb2FkLCBvbmVycm9yLCB0aW1lb3V0LCBvbnRpbWVvdXQpCit7CisJdGhpcy5yZXF1ZXN0ID0gdGhpcy5jcmVhdGUoKTsKKwkKKwlpZiAodGhpcy5yZXF1ZXN0ICE9IG51bGwpCisJeworCQlpZiAob25sb2FkICE9IG51bGwpCisJCXsKKwkJCXRoaXMucmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCQkJeworCQkJCWlmICh0aGlzLmlzUmVhZHkoKSkKKwkJCQl7CisJCQkJCW9ubG9hZCh0aGlzKTsKKwkJCQkJdGhpcy5vbnJlYWR5c3RhdGVjaGFhbmdlID0gbnVsbDsKKwkJCQl9CisJCQl9KTsKKwkJfQorCisJCXRoaXMucmVxdWVzdC5vcGVuKHRoaXMubWV0aG9kLCB0aGlzLnVybCwgdGhpcy5hc3luYywKKwkJCXRoaXMudXNlcm5hbWUsIHRoaXMucGFzc3dvcmQpOworCQl0aGlzLnNldFJlcXVlc3RIZWFkZXJzKHRoaXMucmVxdWVzdCwgdGhpcy5wYXJhbXMpOworCQkKKwkJaWYgKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCAmJiB0aGlzLndpdGhDcmVkZW50aWFscykKKwkJeworCQkJdGhpcy5yZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9ICd0cnVlJzsKKwkJfQorCQkKKwkJaWYgKCFteENsaWVudC5JU19RVUlSS1MgJiYgKGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSBudWxsIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA+IDkpICYmCisJCQl3aW5kb3cuWE1MSHR0cFJlcXVlc3QgJiYgdGltZW91dCAhPSBudWxsICYmIG9udGltZW91dCAhPSBudWxsKQorCQl7CisJCQl0aGlzLnJlcXVlc3QudGltZW91dCA9IHRpbWVvdXQ7CisJCQl0aGlzLnJlcXVlc3Qub250aW1lb3V0ID0gb250aW1lb3V0OworCQl9CisJCQkJCisJCXRoaXMucmVxdWVzdC5zZW5kKHRoaXMucGFyYW1zKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRSZXF1ZXN0SGVhZGVycworICogCisgKiBTZXRzIHRoZSBoZWFkZXJzIGZvciB0aGUgZ2l2ZW4gcmVxdWVzdCBhbmQgcGFyYW1ldGVycy4gVGhpcyBzZXRzIHRoZQorICogY29udGVudC10eXBlIHRvIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBpZiBhbnkgcGFyYW1zIGV4aXN0LgorICogCisgKiBFeGFtcGxlOgorICogCisgKiAoY29kZSkKKyAqIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcnMgPSBmdW5jdGlvbihyZXF1ZXN0LCBwYXJhbXMpCisgKiB7CisgKiAgIGlmIChwYXJhbXMgIT0gbnVsbCkKKyAqICAgeworICogICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywKKyAqICAgICAgICAgICAgICdtdWx0aXBhcnQvZm9ybS1kYXRhJyk7CisgKiAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsCisgKiAgICAgICAgICAgICBwYXJhbXMubGVuZ3RoKTsKKyAqICAgfQorICogfTsKKyAqIChlbmQpCisgKiAKKyAqIFVzZSB0aGUgY29kZSBhYm92ZSBiZWZvcmUgY2FsbGluZyA8c2VuZD4gaWYgeW91IHJlcXVpcmUgYQorICogbXVsdGlwYXJ0L2Zvcm0tZGF0YSByZXF1ZXN0LiAgIAorICovCitteFhtbFJlcXVlc3QucHJvdG90eXBlLnNldFJlcXVlc3RIZWFkZXJzID0gZnVuY3Rpb24ocmVxdWVzdCwgcGFyYW1zKQoreworCWlmIChwYXJhbXMgIT0gbnVsbCkKKwl7CisJCXJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHNpbXVsYXRlCisgKiAKKyAqIENyZWF0ZXMgYW5kIHBvc3RzIGEgcmVxdWVzdCB0byB0aGUgZ2l2ZW4gdGFyZ2V0IFVSTCB1c2luZyBhIGR5bmFtaWNhbGx5CisgKiBjcmVhdGVkIGZvcm0gaW5zaWRlIHRoZSBnaXZlbiBkb2N1bWVudC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZG9jcyAtIERvY3VtZW50IHRoYXQgY29udGFpbnMgdGhlIGZvcm0gZWxlbWVudC4KKyAqIHRhcmdldCAtIFRhcmdldCB0byBzZW5kIHRoZSBmb3JtIHJlc3VsdCB0by4KKyAqLworbXhYbWxSZXF1ZXN0LnByb3RvdHlwZS5zaW11bGF0ZSA9IGZ1bmN0aW9uKGRvYywgdGFyZ2V0KQoreworCWRvYyA9IGRvYyB8fCBkb2N1bWVudDsKKwl2YXIgb2xkID0gbnVsbDsKKworCWlmIChkb2MgPT0gZG9jdW1lbnQpCisJeworCQlvbGQgPSB3aW5kb3cub25iZWZvcmV1bmxvYWQ7CQkKKwkJd2luZG93Lm9uYmVmb3JldW5sb2FkID0gbnVsbDsKKwl9CisJCQkKKwl2YXIgZm9ybSA9IGRvYy5jcmVhdGVFbGVtZW50KCdmb3JtJyk7CisJZm9ybS5zZXRBdHRyaWJ1dGUoJ21ldGhvZCcsIHRoaXMubWV0aG9kKTsKKwlmb3JtLnNldEF0dHJpYnV0ZSgnYWN0aW9uJywgdGhpcy51cmwpOworCisJaWYgKHRhcmdldCAhPSBudWxsKQorCXsKKwkJZm9ybS5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsIHRhcmdldCk7CisJfQorCisJZm9ybS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworCWZvcm0uc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOworCQorCXZhciBwYXJzID0gKHRoaXMucGFyYW1zLmluZGV4T2YoJyYnKSA+IDApID8KKwkJdGhpcy5wYXJhbXMuc3BsaXQoJyYnKSA6CisJCXRoaXMucGFyYW1zLnNwbGl0KCk7CisKKwkvLyBBZGRzIHRoZSBwYXJhbWV0ZXJzIGFzIHRleHRhcmVhcyB0byB0aGUgZm9ybQorCWZvciAodmFyIGk9MDsgaTxwYXJzLmxlbmd0aDsgaSsrKQorCXsKKwkJdmFyIHBvcyA9IHBhcnNbaV0uaW5kZXhPZignPScpOworCQkKKwkJaWYgKHBvcyA+IDApCisJCXsKKwkJCXZhciBuYW1lID0gcGFyc1tpXS5zdWJzdHJpbmcoMCwgcG9zKTsKKwkJCXZhciB2YWx1ZSA9IHBhcnNbaV0uc3Vic3RyaW5nKHBvcysxKTsKKwkJCQorCQkJaWYgKHRoaXMuZGVjb2RlU2ltdWxhdGVWYWx1ZXMpCisJCQl7CisJCQkJdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpOworCQkJfQorCQkJCisJCQl2YXIgdGV4dGFyZWEgPSBkb2MuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsKKwkJCXRleHRhcmVhLnNldEF0dHJpYnV0ZSgnd3JhcCcsICdvZmYnKTsKKwkJCXRleHRhcmVhLnNldEF0dHJpYnV0ZSgnbmFtZScsIG5hbWUpOworCQkJbXhVdGlscy53cml0ZSh0ZXh0YXJlYSwgdmFsdWUpOworCQkJZm9ybS5hcHBlbmRDaGlsZCh0ZXh0YXJlYSk7CisJCX0KKwl9CisJCisJZG9jLmJvZHkuYXBwZW5kQ2hpbGQoZm9ybSk7CisJZm9ybS5zdWJtaXQoKTsKKwkKKwlpZiAoZm9ybS5wYXJlbnROb2RlICE9IG51bGwpCisJeworCQlmb3JtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZm9ybSk7CisJfQorCisJaWYgKG9sZCAhPSBudWxsKQorCXsJCQorCQl3aW5kb3cub25iZWZvcmV1bmxvYWQgPSBvbGQ7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214Q2VsbEVkaXRvci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214Q2VsbEVkaXRvci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGI4NGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3ZpZXcvbXhDZWxsRWRpdG9yLmpzCkBAIC0wLDAgKzEsMTA2OSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhDZWxsRWRpdG9yCisgKgorICogSW4tcGxhY2UgZWRpdG9yIGZvciB0aGUgZ3JhcGguIFRvIGNvbnRyb2wgdGhpcyBlZGl0b3IsIHVzZQorICogPG14R3JhcGguaW52b2tlc1N0b3BDZWxsRWRpdGluZz4sIDxteEdyYXBoLmVudGVyU3RvcHNDZWxsRWRpdGluZz4gYW5kCisgKiA8bXhHcmFwaC5lc2NhcGVFbmFibGVkPi4gSWYgPG14R3JhcGguZW50ZXJTdG9wc0NlbGxFZGl0aW5nPiBpcyB0cnVlIHRoZW4KKyAqIGN0cmwtZW50ZXIgb3Igc2hpZnQtZW50ZXIgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgbGluZWZlZWQuIFRoZSBGMiBhbmQKKyAqIGVzY2FwZSBrZXlzIGNhbiBhbHdheXMgYmUgdXNlZCB0byBzdG9wIGVkaXRpbmcuCisgKiAKKyAqIFRvIGN1c3RvbWl6ZSB0aGUgbG9jYXRpb24gb2YgdGhlIHRleHRib3ggaW4gdGhlIGdyYXBoLCBvdmVycmlkZQorICogPGdldEVkaXRvckJvdW5kcz4gYXMgZm9sbG93czoKKyAqIAorICogKGNvZGUpCisgKiBncmFwaC5jZWxsRWRpdG9yLmdldEVkaXRvckJvdW5kcyA9IGZ1bmN0aW9uKHN0YXRlKQorICogeworICogICB2YXIgcmVzdWx0ID0gbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5nZXRFZGl0b3JCb3VuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAqICAgCisgKiAgIGlmICh0aGlzLmdyYXBoLmdldE1vZGVsKCkuaXNFZGdlKHN0YXRlLmNlbGwpKQorICogICB7CisgKiAgICAgcmVzdWx0LnggPSBzdGF0ZS5nZXRDZW50ZXJYKCkgLSByZXN1bHQud2lkdGggLyAyOworICogICAgIHJlc3VsdC55ID0gc3RhdGUuZ2V0Q2VudGVyWSgpIC0gcmVzdWx0LmhlaWdodCAvIDI7CisgKiAgIH0KKyAqICAgCisgKiAgIHJldHVybiByZXN1bHQ7CisgKiB9OworICogKGVuZCkKKyAqIAorICogTm90ZSB0aGF0IHRoaXMgaG9vayBpcyBvbmx5IGNhbGxlZCBpZiA8YXV0b1NpemU+IGlzIGZhbHNlLiBJZiA8YXV0b1NpemU+IGlzIHRydWUsCisgKiB0aGVuIDxteFNoYXBlLmdldExhYmVsQm91bmRzPiBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIGN1cnJlbnQgYm91bmRzIG9mIHRoZSB0ZXh0Ym94LgorICogCisgKiBUaGUgdGV4dGFyZWEgdXNlcyB0aGUgbXhDZWxsRWRpdG9yIENTUyBjbGFzcy4gWW91IGNhbiBtb2RpZnkgdGhpcyBjbGFzcyBpbgorICogeW91ciBjdXN0b20gQ1NTLiBOb3RlOiBZb3Ugc2hvdWxkIG1vZGlmeSB0aGUgQ1NTIGFmdGVyIGxvYWRpbmcgdGhlIGNsaWVudAorICogaW4gdGhlIHBhZ2UuCisgKgorICogRXhhbXBsZToKKyAqIAorICogVG8gb25seSBhbGxvdyBudW1lcmljIGlucHV0IGluIHRoZSBpbi1wbGFjZSBlZGl0b3IsIHVzZSB0aGUgZm9sbG93aW5nIGNvZGUuCisgKgorICogKGNvZGUpCisgKiB2YXIgdGV4dCA9IGdyYXBoLmNlbGxFZGl0b3IudGV4dGFyZWE7CisgKiAKKyAqIG14RXZlbnQuYWRkTGlzdGVuZXIodGV4dCwgJ2tleWRvd24nLCBmdW5jdGlvbiAoZXZ0KQorICogeworICogICBpZiAoIShldnQua2V5Q29kZSA+PSA0OCAmJiBldnQua2V5Q29kZSA8PSA1NykgJiYKKyAqICAgICAgICEoZXZ0LmtleUNvZGUgPj0gOTYgJiYgZXZ0LmtleUNvZGUgPD0gMTA1KSkKKyAqICAgeworICogICAgIG14RXZlbnQuY29uc3VtZShldnQpOworICogICB9CisgKiB9KTsgCisgKiAoZW5kKQorICogCisgKiBQbGFjZWhvbGRlcjoKKyAqIAorICogVG8gaW1wbGVtZW50IGEgcGxhY2Vob2xkZXIgZm9yIGNlbGxzIHdpdGhvdXQgYSBsYWJlbCwgdXNlIHRoZQorICogPGVtcHR5TGFiZWxUZXh0PiB2YXJpYWJsZS4KKyAqIAorICogUmVzaXplIGluIENocm9tZToKKyAqIAorICogUmVzaXplIG9mIHRoZSB0ZXh0YXJlYSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LiBJZiB5b3Ugd2FudCB0byBlbmFibGUKKyAqIHRoaXMgZmVhdHVyZSBleHRlbmQgPGluaXQ+IGFuZCBzZXQgdGhpcy50ZXh0YXJlYS5zdHlsZS5yZXNpemUgPSAnJy4KKyAqIAorICogVG8gc3RhcnQgZWRpdGluZyBvbiBhIGtleSBwcmVzcyBldmVudCwgdGhlIGNvbnRhaW5lciBvZiB0aGUgZ3JhcGgKKyAqIHNob3VsZCBoYXZlIGZvY3VzIG9yIGEgZm9jdXNhYmxlIHBhcmVudCBzaG91bGQgYmUgdXNlZCB0byBhZGQgdGhlCisgKiBrZXkgcHJlc3MgaGFuZGxlciBhcyBmb2xsb3dzLgorICogCisgKiAoY29kZSkKKyAqIG14RXZlbnQuYWRkTGlzdGVuZXIoZ3JhcGguY29udGFpbmVyLCAna2V5cHJlc3MnLCBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorICogeworICogICBpZiAoIWdyYXBoLmlzRWRpdGluZygpICYmICFncmFwaC5pc1NlbGVjdGlvbkVtcHR5KCkgJiYgZXZ0LndoaWNoICE9PSAwICYmCisgKiAgICAgICAhbXhFdmVudC5pc0FsdERvd24oZXZ0KSAmJiAhbXhFdmVudC5pc0NvbnRyb2xEb3duKGV2dCkgJiYgIW14RXZlbnQuaXNNZXRhRG93bihldnQpKQorICogICB7CisgKiAgICAgZ3JhcGguc3RhcnRFZGl0aW5nKCk7CisgKiAgICAgCisgKiAgICAgaWYgKG14Q2xpZW50LklTX0ZGKQorICogICAgIHsKKyAqICAgICAgIGdyYXBoLmNlbGxFZGl0b3IudGV4dGFyZWEudmFsdWUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2dC53aGljaCk7CisgKiAgICAgfQorICogICB9CisgKiB9KSk7CisgKiAoZW5kKQorICogCisgKiBUbyBhbGxvdyBmb2N1cyBmb3IgYSBESVYsIGFuZCBoZW5jZSB0byByZWNlaXZlIGtleSBwcmVzcyBldmVudHMsIHNvbWUgYnJvd3NlcnMKKyAqIHJlcXVpcmUgaXQgdG8gaGF2ZSBhIHZhbGlkIHRhYmluZGV4IGF0dHJpYnV0ZS4gSW4gdGhpcyBjYXNlIHRoZSBmb2xsb3dpbmcKKyAqIGNvZGUgbWF5IGJlIHVzZWQgdG8ga2VlcCB0aGUgY29udGFpbmVyIGZvY3VzZWQuCisgKiAKKyAqIChjb2RlKQorICogdmFyIGdyYXBoRmlyZU1vdXNlRXZlbnQgPSBncmFwaC5maXJlTW91c2VFdmVudDsKKyAqIGdyYXBoLmZpcmVNb3VzZUV2ZW50ID0gZnVuY3Rpb24oZXZ0TmFtZSwgbWUsIHNlbmRlcikKKyAqIHsKKyAqICAgaWYgKGV2dE5hbWUgPT0gbXhFdmVudC5NT1VTRV9ET1dOKQorICogICB7CisgKiAgICAgdGhpcy5jb250YWluZXIuZm9jdXMoKTsKKyAqICAgfQorICogICAKKyAqICAgZ3JhcGhGaXJlTW91c2VFdmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICogfTsKKyAqIChlbmQpCisgKgorICogQ29uc3RydWN0b3I6IG14Q2VsbEVkaXRvcgorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgaW4tcGxhY2UgZWRpdG9yIGZvciB0aGUgc3BlY2lmaWVkIGdyYXBoLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBncmFwaCAtIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEdyYXBoPi4KKyAqLworZnVuY3Rpb24gbXhDZWxsRWRpdG9yKGdyYXBoKQoreworCXRoaXMuZ3JhcGggPSBncmFwaDsKKwkKKwkvLyBTdG9wcyBlZGl0aW5nIGFmdGVyIHpvb20gY2hhbmdlcworCXRoaXMuem9vbUhhbmRsZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCXsKKwkJaWYgKHRoaXMuZ3JhcGguaXNFZGl0aW5nKCkpCisJCXsKKwkJCXRoaXMucmVzaXplKCk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLmdyYXBoLnZpZXcuYWRkTGlzdGVuZXIobXhFdmVudC5TQ0FMRSwgdGhpcy56b29tSGFuZGxlcik7CisJdGhpcy5ncmFwaC52aWV3LmFkZExpc3RlbmVyKG14RXZlbnQuU0NBTEVfQU5EX1RSQU5TTEFURSwgdGhpcy56b29tSGFuZGxlcik7CisJCisJLy8gQWRkcyBoYW5kbGluZyBvZiBkZWxldGVkIGNlbGxzIHdoaWxlIGVkaXRpbmcKKwl0aGlzLmNoYW5nZUhhbmRsZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oc2VuZGVyKQorCXsKKwkJaWYgKHRoaXMuZWRpdGluZ0NlbGwgIT0gbnVsbCAmJiB0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXRTdGF0ZSh0aGlzLmVkaXRpbmdDZWxsKSA9PSBudWxsKQorCQl7CisJCQl0aGlzLnN0b3BFZGl0aW5nKHRydWUpOworCQl9CisJfSk7CisKKwl0aGlzLmdyYXBoLmdldE1vZGVsKCkuYWRkTGlzdGVuZXIobXhFdmVudC5DSEFOR0UsIHRoaXMuY2hhbmdlSGFuZGxlcik7Cit9OworCisvKioKKyAqIFZhcmlhYmxlOiBncmFwaAorICogCisgKiBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKi8KK214Q2VsbEVkaXRvci5wcm90b3R5cGUuZ3JhcGggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB0ZXh0YXJlYQorICoKKyAqIEhvbGRzIHRoZSBESVYgdGhhdCBpcyB1c2VkIGZvciB0ZXh0IGVkaXRpbmcuIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBudWxsIGJlZm9yZSB0aGUgZmlyc3QKKyAqIGVkaXQuIEluc3RhbnRpYXRlZCBpbiA8aW5pdD4uCisgKi8KK214Q2VsbEVkaXRvci5wcm90b3R5cGUudGV4dGFyZWEgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBlZGl0aW5nQ2VsbAorICogCisgKiBSZWZlcmVuY2UgdG8gdGhlIDxteENlbGw+IHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGVkaXRlZC4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5lZGl0aW5nQ2VsbCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHRyaWdnZXIKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSBldmVudCB0aGF0IHdhcyB1c2VkIHRvIHN0YXJ0IGVkaXRpbmcuCisgKi8KK214Q2VsbEVkaXRvci5wcm90b3R5cGUudHJpZ2dlciA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IG1vZGlmaWVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgbGFiZWwgaGFzIGJlZW4gbW9kaWZpZWQuCisgKi8KK214Q2VsbEVkaXRvci5wcm90b3R5cGUubW9kaWZpZWQgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogYXV0b1NpemUKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSB0ZXh0YXJlYSBzaG91bGQgYmUgcmVzaXplZCB3aGlsZSB0aGUgdGV4dCBpcyBiZWluZyBlZGl0ZWQuCisgKiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214Q2VsbEVkaXRvci5wcm90b3R5cGUuYXV0b1NpemUgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBzZWxlY3RUZXh0CisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgdGV4dCBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlZGl0aW5nIHN0YXJ0cy4gRGVmYXVsdCBpcworICogdHJ1ZS4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5zZWxlY3RUZXh0ID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogZW1wdHlMYWJlbFRleHQKKyAqIAorICogVGV4dCB0byBiZSBkaXNwbGF5ZWQgZm9yIGVtcHR5IGxhYmVscy4gRGVmYXVsdCBpcyAnJyBvciAnPGJyPicgaW4gRmlyZWZveCBhcworICogYSB3b3JrYXJvdW5kIGZvciB0aGUgbWlzc2luZyBjdXJzb3IgYnVnIGZvciBlbXB0eSBjb250ZW50IGVkaXRhYmxlLiBUaGlzIGNhbgorICogYmUgc2V0IHRvIGVnLiAiW1R5cGUgSGVyZV0iIHRvIGVhc2llciB2aXN1YWxpemUgZWRpdGluZyBvZiBlbXB0eSBsYWJlbHMuIFRoZQorICogdmFsdWUgaXMgb25seSBkaXNwbGF5ZWQgYmVmb3JlIHRoZSBmaXJzdCBrZXlzdHJva2UgYW5kIGlzIG5ldmVyIHVzZWQgYXMgdGhlCisgKiBhY3R1YWwgZWRpdGluZyB2YWx1ZS4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5lbXB0eUxhYmVsVGV4dCA9IChteENsaWVudC5JU19GRikgPyAnPGJyPicgOiAnJzsKKworLyoqCisgKiBWYXJpYWJsZTogZXNjYXBlQ2FuY2Vsc0VkaXRpbmcKKyAqIAorICogSWYgdHJ1ZSwgcHJlc3NpbmcgdGhlIGVzY2FwZSBrZXkgd2lsbCBzdG9wIGVkaXRpbmcgYW5kIG5vdCBhY2NlcHQgdGhlIG5ldworICogdmFsdWUuIENoYW5nZSB0aGlzIHRvIGZhbHNlIHRvIGFjY2VwdCB0aGUgbmV3IHZhbHVlIG9uIGVzY2FwZSwgYW5kIGNhbmNlbAorICogZWRpdGluZyBvbiBTaGlmdCtFc2NhcGUgaW5zdGVhZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteENlbGxFZGl0b3IucHJvdG90eXBlLmVzY2FwZUNhbmNlbHNFZGl0aW5nID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogdGV4dE5vZGUKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSBsYWJlbCBET00gbm9kZSB0aGF0IGhhcyBiZWVuIGhpZGRlbi4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS50ZXh0Tm9kZSA9ICcnOworCisvKioKKyAqIFZhcmlhYmxlOiB6SW5kZXgKKyAqIAorICogU3BlY2lmaWVzIHRoZSB6SW5kZXggZm9yIHRoZSB0ZXh0YXJlYS4gRGVmYXVsdCBpcyA1LgorICovCitteENlbGxFZGl0b3IucHJvdG90eXBlLnpJbmRleCA9IDU7CisKKy8qKgorICogVmFyaWFibGU6IG1pblJlc2l6ZQorICogCisgKiBEZWZpbmVzIHRoZSBtaW5pbXVtIHdpZHRoIGFuZCBoZWlnaHQgdG8gYmUgdXNlZCBpbiA8cmVzaXplPi4gRGVmYXVsdCBpcyAweDIwcHguCisgKi8KK214Q2VsbEVkaXRvci5wcm90b3R5cGUubWluUmVzaXplID0gbmV3IG14UmVjdGFuZ2xlKDAsIDIwKTsKKworLyoqCisgKiBWYXJpYWJsZTogd29yZFdyYXBQYWRkaW5nCisgKiAKKyAqIENvcnJlY3Rpb24gZmFjdG9yIGZvciB3b3JkIHdyYXBwaW5nIHdpZHRoLiBEZWZhdWx0IGlzIDIgaW4gcXVpcmtzLCAwIGluIElFCisgKiAxMSBhbmQgMSBpbiBhbGwgb3RoZXIgYnJvd3NlcnMgYW5kIG1vZGVzLgorICovCitteENlbGxFZGl0b3IucHJvdG90eXBlLndvcmRXcmFwUGFkZGluZyA9IChteENsaWVudC5JU19RVUlSS1MpID8gMiA6ICghbXhDbGllbnQuSVNfSUUxMSkgPyAxIDogMDsKKworLyoqCisgKiBWYXJpYWJsZTogYmx1ckVuYWJsZWQKKyAqCisgKiBJZiA8Zm9jdXNMb3N0PiBzaG91bGQgYmUgY2FsbGVkIGlmIDx0ZXh0YXJlYT4gbG9zZXMgdGhlIGZvY3VzLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteENlbGxFZGl0b3IucHJvdG90eXBlLmJsdXJFbmFibGVkID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGluaXRpYWxWYWx1ZQorICogCisgKiBIb2xkcyB0aGUgaW5pdGlhbCBlZGl0aW5nIHZhbHVlIHRvIGNoZWNrIGlmIHRoZSBjdXJyZW50IHZhbHVlIHdhcyBtb2RpZmllZC4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5pbml0aWFsVmFsdWUgPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiBpbml0CisgKgorICogQ3JlYXRlcyB0aGUgPHRleHRhcmVhPiBhbmQgaW5zdGFsbHMgdGhlIGV2ZW50IGxpc3RlbmVycy4gVGhlIGtleSBoYW5kbGVyCisgKiB1cGRhdGVzIHRoZSA8bW9kaWZpZWQ+IHN0YXRlLgorICovCitteENlbGxFZGl0b3IucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKQoreworCXRoaXMudGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKwl0aGlzLnRleHRhcmVhLmNsYXNzTmFtZSA9ICdteENlbGxFZGl0b3IgbXhQbGFpblRleHRFZGl0b3InOworCXRoaXMudGV4dGFyZWEuY29udGVudEVkaXRhYmxlID0gdHJ1ZTsKKwkKKwkvLyBXb3JrYXJvdW5kIGZvciBzZWxlY3Rpb24gb3V0c2lkZSBvZiBESVYgaWYgaGVpZ2h0IGlzIDAKKwlpZiAobXhDbGllbnQuSVNfR0MpCisJeworCQl0aGlzLnRleHRhcmVhLnN0eWxlLm1pbkhlaWdodCA9ICcxZW0nOworCX0KKwkKKwl0aGlzLmluc3RhbGxMaXN0ZW5lcnModGhpcy50ZXh0YXJlYSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhcHBseVZhbHVlCisgKiAKKyAqIENhbGxlZCBpbiA8c3RvcEVkaXRpbmc+IGlmIGNhbmNlbCBpcyBmYWxzZSB0byBpbnZva2UgPG14R3JhcGgubGFiZWxDaGFuZ2VkPi4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5hcHBseVZhbHVlID0gZnVuY3Rpb24oc3RhdGUsIHZhbHVlKQoreworCXRoaXMuZ3JhcGgubGFiZWxDaGFuZ2VkKHN0YXRlLmNlbGwsIHZhbHVlLCB0aGlzLnRyaWdnZXIpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0SW5pdGlhbFZhbHVlCisgKiAKKyAqIEdldHMgdGhlIGluaXRpYWwgZWRpdGluZyB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNlbGwuCisgKi8KK214Q2VsbEVkaXRvci5wcm90b3R5cGUuZ2V0SW5pdGlhbFZhbHVlID0gZnVuY3Rpb24oc3RhdGUsIHRyaWdnZXIpCit7CisJdmFyIHJlc3VsdCA9IG14VXRpbHMuaHRtbEVudGl0aWVzKHRoaXMuZ3JhcGguZ2V0RWRpdGluZ1ZhbHVlKHN0YXRlLmNlbGwsIHRyaWdnZXIpLCBmYWxzZSk7CisJCisgICAgLy8gV29ya2Fyb3VuZCBmb3IgdHJhaWxpbmcgbGluZSBicmVha3MgYmVpbmcgaWdub3JlZCBpbiB0aGUgZWRpdG9yCisJaWYgKCFteENsaWVudC5JU19RVUlSS1MgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlICE9IDggJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlICE9IDkgJiYKKwkJZG9jdW1lbnQuZG9jdW1lbnRNb2RlICE9IDEwKQorCXsKKwkJcmVzdWx0ID0gbXhVdGlscy5yZXBsYWNlVHJhaWxpbmdOZXdsaW5lcyhyZXN1bHQsICc8ZGl2Pjxicj48L2Rpdj4nKTsKKwl9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdC5yZXBsYWNlKC9cbi9nLCAnPGJyPicpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q3VycmVudFZhbHVlCisgKiAKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQgZWRpdGluZyB2YWx1ZS4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5nZXRDdXJyZW50VmFsdWUgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlyZXR1cm4gbXhVdGlscy5leHRyYWN0VGV4dFdpdGhXaGl0ZXNwYWNlKHRoaXMudGV4dGFyZWEuY2hpbGROb2Rlcyk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbnN0YWxsTGlzdGVuZXJzCisgKiAKKyAqIEluc3RhbGxzIGxpc3RlbmVycyBmb3IgZm9jdXMsIGNoYW5nZSBhbmQgc3RhbmRhcmQga2V5IGV2ZW50IGhhbmRsaW5nLgorICovCitteENlbGxFZGl0b3IucHJvdG90eXBlLmluc3RhbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbihlbHQpCit7CisJLy8gQXBwbGllcyB2YWx1ZSBpZiBmb2N1cyBpcyBsb3N0CisJbXhFdmVudC5hZGRMaXN0ZW5lcihlbHQsICdibHVyJywgbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwl7CisJCWlmICh0aGlzLmJsdXJFbmFibGVkKQorCQl7CisJCQl0aGlzLmZvY3VzTG9zdChldnQpOworCQl9CisJfSkpOworCisJLy8gVXBkYXRlcyBtb2RpZmllZCBzdGF0ZSBhbmQgaGFuZGxlcyBwbGFjZWhvbGRlciB0ZXh0CisJbXhFdmVudC5hZGRMaXN0ZW5lcihlbHQsICdrZXlkb3duJywgbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwl7CisJCWlmICghbXhFdmVudC5pc0NvbnN1bWVkKGV2dCkpCisJCXsKKwkJCWlmICh0aGlzLmlzU3RvcEVkaXRpbmdFdmVudChldnQpKQorCQkJeworCQkJCXRoaXMuZ3JhcGguc3RvcEVkaXRpbmcoZmFsc2UpOworCQkJCW14RXZlbnQuY29uc3VtZShldnQpOworCQkJfQorCQkJZWxzZSBpZiAoZXZ0LmtleUNvZGUgPT0gMjcgLyogRXNjYXBlICovKQorCQkJeworCQkJCXRoaXMuZ3JhcGguc3RvcEVkaXRpbmcodGhpcy5lc2NhcGVDYW5jZWxzRWRpdGluZyB8fCBteEV2ZW50LmlzU2hpZnREb3duKGV2dCkpOworCQkJCW14RXZlbnQuY29uc3VtZShldnQpOworCQkJfQorCQl9CisJfSkpOworCisJLy8gS2V5cHJlc3Mgb25seSBmaXJlcyBpZiBwcmludGFibGUga2V5IHdhcyBwcmVzc2VkIGFuZCBoYW5kbGVzIHJlbW92aW5nIHRoZSBlbXB0eSBwbGFjZWhvbGRlcgorCXZhciBrZXlwcmVzc0hhbmRsZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCXsKKwkJaWYgKHRoaXMuZWRpdGluZ0NlbGwgIT0gbnVsbCkKKwkJeworCQkJLy8gQ2xlYXJzIHRoZSBpbml0aWFsIGVtcHR5IGxhYmVsIG9uIHRoZSBmaXJzdCBrZXlzdHJva2UKKwkJCS8vIGFuZCB3b3JrYXJvdW5kIGZvciBGRiB3aGljaCBmaXJlcyBrZXlwcmVzcyBmb3IgZGVsZXRlIGFuZCBiYWNrc3BhY2UKKwkJCWlmICh0aGlzLmNsZWFyT25DaGFuZ2UgJiYgZWx0LmlubmVySFRNTCA9PSB0aGlzLmdldEVtcHR5TGFiZWxUZXh0KCkgJiYKKwkJCQkoIW14Q2xpZW50LklTX0ZGIHx8IChldnQua2V5Q29kZSAhPSA4IC8qIEJhY2tzcGFjZSAqLyAmJiBldnQua2V5Q29kZSAhPSA0NiAvKiBEZWxldGUgKi8pKSkKKwkJCXsKKwkJCQl0aGlzLmNsZWFyT25DaGFuZ2UgPSBmYWxzZTsKKwkJCQllbHQuaW5uZXJIVE1MID0gJyc7CisJCQl9CisJCX0KKwl9KTsKKworCW14RXZlbnQuYWRkTGlzdGVuZXIoZWx0LCAna2V5cHJlc3MnLCBrZXlwcmVzc0hhbmRsZXIpOworCW14RXZlbnQuYWRkTGlzdGVuZXIoZWx0LCAncGFzdGUnLCBrZXlwcmVzc0hhbmRsZXIpOworCQorCS8vIEhhbmRsZXIgZm9yIHVwZGF0aW5nIHRoZSBlbXB0eSBsYWJlbCB0ZXh0IHZhbHVlIGFmdGVyIGEgY2hhbmdlCisJdmFyIGtleXVwSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJeworCQlpZiAodGhpcy5lZGl0aW5nQ2VsbCAhPSBudWxsKQorCQl7CisJCQkvLyBVc2VzIGFuIG9wdGlvbmFsIHRleHQgdmFsdWUgZm9yIHNlbXB0eSBsYWJlbHMgd2hpY2ggaXMgY2xlYXJlZAorCQkJLy8gd2hlbiB0aGUgZmlyc3Qga2V5c3Ryb2tlIGFwcGVhcnMuIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIHNlZQorCQkJLy8gdGhhdCBhIGxhYmVsIGlzIGJlaW5nIGVkaXRlZCBldmVuIGlmIHRoZSBsYWJlbCBpcyBlbXB0eS4KKwkJCS8vIEluIFNhZmFyaSBhbmQgRkYsIGFuIGVtcHR5IHRleHQgaXMgcmVwcmVzZW50ZWQgYnkgPEJSPiB3aGljaCBpc24ndCBlbm91Z2ggdG8gZm9yY2UgYSB2YWxpZCBzaXplCisJCQlpZiAodGhpcy50ZXh0YXJlYS5pbm5lckhUTUwubGVuZ3RoID09IDAgfHwgdGhpcy50ZXh0YXJlYS5pbm5lckhUTUwgPT0gJzxicj4nKQorCQkJeworCQkJCXRoaXMudGV4dGFyZWEuaW5uZXJIVE1MID0gdGhpcy5nZXRFbXB0eUxhYmVsVGV4dCgpOworCQkJCXRoaXMuY2xlYXJPbkNoYW5nZSA9IHRoaXMudGV4dGFyZWEuaW5uZXJIVE1MLmxlbmd0aCA+IDA7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdGhpcy5jbGVhck9uQ2hhbmdlID0gZmFsc2U7CisJCQl9CisJCX0KKwl9KTsKKworCW14RXZlbnQuYWRkTGlzdGVuZXIoZWx0LCAoIW14Q2xpZW50LklTX0lFMTEgJiYgIW14Q2xpZW50LklTX0lFKSA/ICdpbnB1dCcgOiAna2V5dXAnLCBrZXl1cEhhbmRsZXIpOworCW14RXZlbnQuYWRkTGlzdGVuZXIoZWx0LCAnY3V0Jywga2V5dXBIYW5kbGVyKTsKKwlteEV2ZW50LmFkZExpc3RlbmVyKGVsdCwgJ3Bhc3RlJywga2V5dXBIYW5kbGVyKTsKKworCS8vIEFkZHMgYXV0b21hdGljIHJlc2l6aW5nIG9mIHRoZSB0ZXh0Ym94IHdoaWxlIHR5cGluZyB1c2luZyBpbnB1dCwga2V5dXAgYW5kL29yIERPTSBjaGFuZ2UgZXZlbnRzCisJdmFyIGV2dE5hbWUgPSAoIW14Q2xpZW50LklTX0lFMTEgJiYgIW14Q2xpZW50LklTX0lFKSA/ICdpbnB1dCcgOiAna2V5ZG93bic7CisJCisJdmFyIHJlc2l6ZUhhbmRsZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCXsKKwkJaWYgKHRoaXMuZWRpdGluZ0NlbGwgIT0gbnVsbCAmJiB0aGlzLmF1dG9TaXplICYmICFteEV2ZW50LmlzQ29uc3VtZWQoZXZ0KSkKKwkJeworCQkJLy8gQXN5bmNocm9ub3VzIGlzIG5lZWRlZCBmb3Iga2V5ZG93biBhbmQgc2hvd3MgYmV0dGVyIHJlc3VsdHMgZm9yIGlucHV0IGV2ZW50cyBvdmVyYWxsCisJCQkvLyAoaWUgbm9uLWJsb2NraW5nIGFuZCBjYXNlcyB3aGVyZSB0aGUgb2Zmc2V0V2lkdGgvLUhlaWdodCB3YXMgd3JvbmcgYXQgdGhpcyB0aW1lKQorCQkJaWYgKHRoaXMucmVzaXplVGhyZWFkICE9IG51bGwpCisJCQl7CisJCQkJd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRocmVhZCk7CisJCQl9CisJCQkKKwkJCXRoaXMucmVzaXplVGhyZWFkID0gd2luZG93LnNldFRpbWVvdXQobXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKCkKKwkJCXsKKwkJCQl0aGlzLnJlc2l6ZVRocmVhZCA9IG51bGw7CisJCQkJdGhpcy5yZXNpemUoKTsKKwkJCX0pLCAwKTsKKwkJfQorCX0pOworCQorCW14RXZlbnQuYWRkTGlzdGVuZXIoZWx0LCBldnROYW1lLCByZXNpemVIYW5kbGVyKTsKKworCWlmIChkb2N1bWVudC5kb2N1bWVudE1vZGUgPj0gOSkKKwl7CisJCW14RXZlbnQuYWRkTGlzdGVuZXIoZWx0LCAnRE9NTm9kZVJlbW92ZWQnLCByZXNpemVIYW5kbGVyKTsKKwkJbXhFdmVudC5hZGRMaXN0ZW5lcihlbHQsICdET01Ob2RlSW5zZXJ0ZWQnLCByZXNpemVIYW5kbGVyKTsKKwl9CisJZWxzZQorCXsKKwkJbXhFdmVudC5hZGRMaXN0ZW5lcihlbHQsICdjdXQnLCByZXNpemVIYW5kbGVyKTsKKwkJbXhFdmVudC5hZGRMaXN0ZW5lcihlbHQsICdwYXN0ZScsIHJlc2l6ZUhhbmRsZXIpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGlzU3RvcEVkaXRpbmdFdmVudAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGtleWRvd24gZXZlbnQgc2hvdWxkIHN0b3AgY2VsbCBlZGl0aW5nLiBUaGlzCisgKiByZXR1cm5zIHRydWUgaWYgRjIgaXMgcHJlc3NlZCBvZiBpZiA8bXhHcmFwaC5lbnRlclN0b3BzQ2VsbEVkaXRpbmc+IGlzIHRydWUKKyAqIGFuZCBlbnRlciBpcyBwcmVzc2VkIHdpdGhvdXQgY29udHJvbCBvciBzaGlmdC4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5pc1N0b3BFZGl0aW5nRXZlbnQgPSBmdW5jdGlvbihldnQpCit7CisJcmV0dXJuIGV2dC5rZXlDb2RlID09IDExMyAvKiBGMiAqLyB8fCAodGhpcy5ncmFwaC5pc0VudGVyU3RvcHNDZWxsRWRpdGluZygpICYmCisJCWV2dC5rZXlDb2RlID09IDEzIC8qIEVudGVyICovICYmICFteEV2ZW50LmlzQ29udHJvbERvd24oZXZ0KSAmJgorCQkhbXhFdmVudC5pc1NoaWZ0RG93bihldnQpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzRXZlbnRTb3VyY2UKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZWRpdG9yIGlzIHRoZSBzb3VyY2UgZm9yIHRoZSBnaXZlbiBuYXRpdmUgZXZlbnQuCisgKi8KK214Q2VsbEVkaXRvci5wcm90b3R5cGUuaXNFdmVudFNvdXJjZSA9IGZ1bmN0aW9uKGV2dCkKK3sKKwlyZXR1cm4gbXhFdmVudC5nZXRTb3VyY2UoZXZ0KSA9PSB0aGlzLnRleHRhcmVhOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVzaXplCisgKiAKKyAqIFJldHVybnMgPG1vZGlmaWVkPi4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbigpCit7CisJdmFyIHN0YXRlID0gdGhpcy5ncmFwaC5nZXRWaWV3KCkuZ2V0U3RhdGUodGhpcy5lZGl0aW5nQ2VsbCk7CisJCisJaWYgKHN0YXRlID09IG51bGwpCisJeworCQl0aGlzLnN0b3BFZGl0aW5nKHRydWUpOworCX0KKwllbHNlIGlmICh0aGlzLnRleHRhcmVhICE9IG51bGwpCisJeworCQl2YXIgaXNFZGdlID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpLmlzRWRnZShzdGF0ZS5jZWxsKTsKKyAJCXZhciBzY2FsZSA9IHRoaXMuZ3JhcGguZ2V0VmlldygpLnNjYWxlOworIAkJdmFyIG0gPSBudWxsOworCQkKKwkJaWYgKCF0aGlzLmF1dG9TaXplIHx8IChzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9PVkVSRkxPV10gPT0gJ2ZpbGwnKSkKKwkJeworCQkJLy8gU3BlY2lmaWVzIHRoZSBib3VuZHMgb2YgdGhlIGVkaXRvciBib3gKKwkJCXRoaXMuYm91bmRzID0gdGhpcy5nZXRFZGl0b3JCb3VuZHMoc3RhdGUpOworCQkJdGhpcy50ZXh0YXJlYS5zdHlsZS53aWR0aCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMud2lkdGggLyBzY2FsZSkgKyAncHgnOworCQkJdGhpcy50ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmhlaWdodCAvIHNjYWxlKSArICdweCc7CisJCQkKKwkJCS8vIEZJWE1FOiBPZmZzZXQgd2hlbiBzY2FsZWQKKwkJCWlmIChkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gOCB8fCBteENsaWVudC5JU19RVUlSS1MpCisJCQl7CisJCQkJdGhpcy50ZXh0YXJlYS5zdHlsZS5sZWZ0ID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy54KSArICdweCc7CisJCQkJdGhpcy50ZXh0YXJlYS5zdHlsZS50b3AgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLnkpICsgJ3B4JzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl0aGlzLnRleHRhcmVhLnN0eWxlLmxlZnQgPSBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLnggKyAxKSkgKyAncHgnOworCQkJCXRoaXMudGV4dGFyZWEuc3R5bGUudG9wID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy55ICsgMSkpICsgJ3B4JzsKKwkJCX0KKwkJCQorCQkJLy8gSW5zdGFsbHMgbmF0aXZlIHdvcmQgd3JhcHBpbmcgYW5kIGF2b2lkcyB3b3JkIHdyYXAgZm9yIGVtcHR5IGxhYmVsIHBsYWNlaG9sZGVyCisJCQlpZiAodGhpcy5ncmFwaC5pc1dyYXBwaW5nKHN0YXRlLmNlbGwpICYmICh0aGlzLmJvdW5kcy53aWR0aCA+PSAyIHx8IHRoaXMuYm91bmRzLmhlaWdodCA+PSAyKSAmJgorCQkJCXRoaXMudGV4dGFyZWEuaW5uZXJIVE1MICE9IHRoaXMuZ2V0RW1wdHlMYWJlbFRleHQoKSkKKwkJCXsKKwkJCQl0aGlzLnRleHRhcmVhLnN0eWxlLndvcmRXcmFwID0gbXhDb25zdGFudHMuV09SRF9XUkFQOworCQkJCXRoaXMudGV4dGFyZWEuc3R5bGUud2hpdGVTcGFjZSA9ICdub3JtYWwnOworCQkJCQorCQkJCWlmIChzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9PVkVSRkxPV10gIT0gJ2ZpbGwnKQorCQkJCXsKKwkJCQkJdGhpcy50ZXh0YXJlYS5zdHlsZS53aWR0aCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMud2lkdGggLyBzY2FsZSkgKyB0aGlzLndvcmRXcmFwUGFkZGluZyArICdweCc7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRoaXMudGV4dGFyZWEuc3R5bGUud2hpdGVTcGFjZSA9ICdub3dyYXAnOworCQkJCQorCQkJCWlmIChzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9PVkVSRkxPV10gIT0gJ2ZpbGwnKQorCQkJCXsKKwkJCQkJdGhpcy50ZXh0YXJlYS5zdHlsZS53aWR0aCA9ICcnOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJIAl7CisJIAkJdmFyIGx3ID0gbXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfTEFCRUxfV0lEVEgsIG51bGwpOworCQkJbSA9IChzdGF0ZS50ZXh0ICE9IG51bGwpID8gc3RhdGUudGV4dC5tYXJnaW4gOiBudWxsOworCQkJCisJCQlpZiAobSA9PSBudWxsKQorCQkJeworCQkJCW0gPSBteFV0aWxzLmdldEFsaWdubWVudEFzUG9pbnQobXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfQUxJR04sIG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUiksCisJCQkJCQlteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9WRVJUSUNBTF9BTElHTiwgbXhDb25zdGFudHMuQUxJR05fTUlERExFKSk7CisJCQl9CisJCQkKKwkgCQlpZiAoaXNFZGdlKQorCQkJeworCQkJCXRoaXMuYm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKHN0YXRlLmFic29sdXRlT2Zmc2V0LngsIHN0YXRlLmFic29sdXRlT2Zmc2V0LnksIDAsIDApOworCQkJCQorCQkJCWlmIChsdyAhPSBudWxsKQorCQkJIAl7CisJCQkJCXZhciB0bXAgPSAocGFyc2VGbG9hdChsdykgKyAyKSAqIHNjYWxlOworCQkJCQl0aGlzLmJvdW5kcy53aWR0aCA9IHRtcDsKKwkJCQkJdGhpcy5ib3VuZHMueCArPSBtLnggKiB0bXA7CisJCQkgCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl2YXIgYmRzID0gbXhSZWN0YW5nbGUuZnJvbVJlY3RhbmdsZShzdGF0ZSk7CisJCQkJdmFyIGhwb3MgPSBteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9MQUJFTF9QT1NJVElPTiwgbXhDb25zdGFudHMuQUxJR05fQ0VOVEVSKTsKKwkJCQl2YXIgdnBvcyA9IG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1ZFUlRJQ0FMX0xBQkVMX1BPU0lUSU9OLCBteENvbnN0YW50cy5BTElHTl9NSURETEUpOworCisJCQkJYmRzID0gKHN0YXRlLnNoYXBlICE9IG51bGwgJiYgaHBvcyA9PSBteENvbnN0YW50cy5BTElHTl9DRU5URVIgJiYgdnBvcyA9PSBteENvbnN0YW50cy5BTElHTl9NSURETEUpID8gc3RhdGUuc2hhcGUuZ2V0TGFiZWxCb3VuZHMoYmRzKSA6IGJkczsKKwkJCSAJCisJCQkgCWlmIChsdyAhPSBudWxsKQorCQkJIAl7CisJCQkgCQliZHMud2lkdGggPSBwYXJzZUZsb2F0KGx3KSAqIHNjYWxlOworCQkJIAl9CisJCQkgCQorCQkJIAlpZiAoIXN0YXRlLnZpZXcuZ3JhcGguY2VsbFJlbmRlcmVyLmxlZ2FjeVNwYWNpbmcgfHwgc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfT1ZFUkZMT1ddICE9ICd3aWR0aCcpCisJCQkgCXsKKwkJCQkJdmFyIHNwYWNpbmcgPSBwYXJzZUludChzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9TUEFDSU5HXSB8fCAyKSAqIHNjYWxlOworCQkJCQl2YXIgc3BhY2luZ1RvcCA9IChwYXJzZUludChzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9TUEFDSU5HX1RPUF0gfHwgMCkgKyBteFRleHQucHJvdG90eXBlLmJhc2VTcGFjaW5nVG9wKSAqIHNjYWxlICsgc3BhY2luZzsKKwkJCQkJdmFyIHNwYWNpbmdSaWdodCA9IChwYXJzZUludChzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9TUEFDSU5HX1JJR0hUXSB8fCAwKSArIG14VGV4dC5wcm90b3R5cGUuYmFzZVNwYWNpbmdSaWdodCkgKiBzY2FsZSArIHNwYWNpbmc7CisJCQkJCXZhciBzcGFjaW5nQm90dG9tID0gKHBhcnNlSW50KHN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1NQQUNJTkdfQk9UVE9NXSB8fCAwKSArIG14VGV4dC5wcm90b3R5cGUuYmFzZVNwYWNpbmdCb3R0b20pICogc2NhbGUgKyBzcGFjaW5nOworCQkJCQl2YXIgc3BhY2luZ0xlZnQgPSAocGFyc2VJbnQoc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU1BBQ0lOR19MRUZUXSB8fCAwKSArIG14VGV4dC5wcm90b3R5cGUuYmFzZVNwYWNpbmdMZWZ0KSAqIHNjYWxlICsgc3BhY2luZzsKKwkJCQkJCisJCQkJCXZhciBocG9zID0gbXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfTEFCRUxfUE9TSVRJT04sIG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUik7CisJCQkJCXZhciB2cG9zID0gbXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfVkVSVElDQUxfTEFCRUxfUE9TSVRJT04sIG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSk7CisKKwkJCQkJYmRzID0gbmV3IG14UmVjdGFuZ2xlKGJkcy54ICsgc3BhY2luZ0xlZnQsIGJkcy55ICsgc3BhY2luZ1RvcCwKKwkJCQkJCWJkcy53aWR0aCAtICgoaHBvcyA9PSBteENvbnN0YW50cy5BTElHTl9DRU5URVIgJiYgbHcgPT0gbnVsbCkgPyAoc3BhY2luZ0xlZnQgKyBzcGFjaW5nUmlnaHQpIDogMCksCisJCQkJCQliZHMuaGVpZ2h0IC0gKCh2cG9zID09IG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSkgPyAoc3BhY2luZ1RvcCArIHNwYWNpbmdCb3R0b20pIDogMCkpOworCQkJIAl9CisKKwkJCQl0aGlzLmJvdW5kcyA9IG5ldyBteFJlY3RhbmdsZShiZHMueCArIHN0YXRlLmFic29sdXRlT2Zmc2V0LngsIGJkcy55ICsgc3RhdGUuYWJzb2x1dGVPZmZzZXQueSwgYmRzLndpZHRoLCBiZHMuaGVpZ2h0KTsKKwkJCX0KKworCQkJLy8gTmVlZGVkIGZvciB3b3JkIHdyYXAgaW5zaWRlIHRleHQgYmxvY2tzIHdpdGggb3ZlcnNpemUgbGluZXMgdG8gbWF0Y2ggdGhlIGZpbmFsIHJlc3VsdCB3aGVyZQorCSAJCS8vIHRoZSB3aWR0aCBvZiB0aGUgbG9uZ2VzdCBsaW5lIGlzIHVzZWQgYXMgdGhlIHJlZmVyZW5jZSBmb3IgdGV4dCBhbGlnbm1lbnQgaW4gdGhlIGNlbGwKKwkgCQkvLyBUT0RPOiBGaXggd29yZCB3cmFwcGluZyBwcmV2aWV3IGZvciBlZGdlIGxhYmVscyBpbiBoZWxsb3dvcmxkLmh0bWwKKwkJCWlmICh0aGlzLmdyYXBoLmlzV3JhcHBpbmcoc3RhdGUuY2VsbCkgJiYgKHRoaXMuYm91bmRzLndpZHRoID49IDIgfHwgdGhpcy5ib3VuZHMuaGVpZ2h0ID49IDIpICYmCisJCQkJdGhpcy50ZXh0YXJlYS5pbm5lckhUTUwgIT0gdGhpcy5nZXRFbXB0eUxhYmVsVGV4dCgpKQorCQkJeworCQkJCXRoaXMudGV4dGFyZWEuc3R5bGUud29yZFdyYXAgPSBteENvbnN0YW50cy5XT1JEX1dSQVA7CisJCQkJdGhpcy50ZXh0YXJlYS5zdHlsZS53aGl0ZVNwYWNlID0gJ25vcm1hbCc7CisJCQkJCisJCSAJCS8vIEZvcmNlcyBhdXRvbWF0aWMgcmVmbG93IGlmIHRleHQgaXMgcmVtb3ZlZCBmcm9tIGFuIG92ZXJzaXplIGxhYmVsIGFuZCBub3JtYWwgd29yZCB3cmFwCisJCQkJdmFyIHRtcCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMud2lkdGggLyAoKGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSA4KSA/IHNjYWxlIDogc2NhbGUpKSArIHRoaXMud29yZFdyYXBQYWRkaW5nOworCQkJCXRoaXMudGV4dGFyZWEuc3R5bGUud2lkdGggPSB0bXAgKyAncHgnOworCQkJCQorCQkJCWlmICh0aGlzLnRleHRhcmVhLnNjcm9sbFdpZHRoID4gdG1wKQorCQkJCXsKKwkJCQkJdGhpcy50ZXh0YXJlYS5zdHlsZS53aWR0aCA9IHRoaXMudGV4dGFyZWEuc2Nyb2xsV2lkdGggKyAncHgnOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvLyBLTk9XTjogVHJhaWxpbmcgY3Vyc29yIGluIElFOSBxdWlya3MgbW9kZSBpcyBub3QgdmlzaWJsZQorCQkJCXRoaXMudGV4dGFyZWEuc3R5bGUud2hpdGVTcGFjZSA9ICdub3dyYXAnOworCQkJCXRoaXMudGV4dGFyZWEuc3R5bGUud2lkdGggPSAnJzsKKwkJCX0KKwkJCQorCQkJLy8gTEFURVI6IEtlZXAgaW4gdmlzaWJsZSBhcmVhLCBhZGQgZmluZSB0dW5pbmcgZm9yIHBpeGVsIHByZWNpc2lvbgorCQkJLy8gV29ya2Fyb3VuZCBmb3Igd3JvbmcgbWVhc3VyaW5nIGluIElFOCBzdGFuZGFyZHMKKwkJCWlmIChkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gOCkKKwkJCXsKKwkJCQl0aGlzLnRleHRhcmVhLnN0eWxlLnpvb20gPSAnMSc7CisJCQkJdGhpcy50ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7CisJCQl9CisJCQkKKwkJCXZhciBvdyA9IHRoaXMudGV4dGFyZWEuc2Nyb2xsV2lkdGg7CisJCQl2YXIgb2ggPSB0aGlzLnRleHRhcmVhLnNjcm9sbEhlaWdodDsKKwkJCQorCQkJLy8gVE9ETzogVXBkYXRlIENTUyB3aWR0aCBhbmQgaGVpZ2h0IGlmIHNtYWxsZXIgdGhhbiBtaW5SZXNpemUgb3IgcmVtb3ZlIG1pblJlc2l6ZQorCQkJLy9pZiAodGhpcy5taW5SZXNpemUgIT0gbnVsbCkKKwkJCS8veworCQkJLy8Jb3cgPSBNYXRoLm1heChvdywgdGhpcy5taW5SZXNpemUud2lkdGgpOworCQkJLy8Jb2ggPSBNYXRoLm1heChvaCwgdGhpcy5taW5SZXNpemUuaGVpZ2h0KTsKKwkJCS8vfQorCQkJCisJCQkvLyBMQVRFUjogS2VlcCBpbiB2aXNpYmxlIGFyZWEsIGFkZCBmaW5lIHR1bmluZyBmb3IgcGl4ZWwgcHJlY2lzaW9uCisJCQlpZiAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09IDgpCisJCQl7CisJCQkJLy8gTEFURVI6IFNjYWxlZCB3cmFwcGluZyBhbmQgcG9zaXRpb24gaXMgd3JvbmcgaW4gSUU4CisJCQkJdGhpcy50ZXh0YXJlYS5zdHlsZS5sZWZ0ID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKCh0aGlzLmJvdW5kcy54IC0gbS54ICogKHRoaXMuYm91bmRzLndpZHRoIC0gKG93ICsgMSkgKiBzY2FsZSkgKyBvdyAqIChzY2FsZSAtIDEpICogMCArIChtLnggKyAwLjUpICogMikgLyBzY2FsZSkpICsgJ3B4JzsKKwkJCQl0aGlzLnRleHRhcmVhLnN0eWxlLnRvcCA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgodGhpcy5ib3VuZHMueSAtIG0ueSAqICh0aGlzLmJvdW5kcy5oZWlnaHQgLSAob2ggKyAwLjUpICogc2NhbGUpICsgb2ggKiAoc2NhbGUgLSAxKSAqIDAgKyBNYXRoLmFicyhtLnkgKyAwLjUpICogMSkgLyBzY2FsZSkpICsgJ3B4JzsKKwkJCQkvLyBXb3JrYXJvdW5kIGZvciB3cm9uZyBldmVudCBoYW5kbGluZyB3aWR0aCBhbmQgaGVpZ2h0CisJCQkJdGhpcy50ZXh0YXJlYS5zdHlsZS53aWR0aCA9IE1hdGgucm91bmQob3cgKiBzY2FsZSkgKyAncHgnOworCQkJCXRoaXMudGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gTWF0aC5yb3VuZChvaCAqIHNjYWxlKSArICdweCc7CisJCQl9CisJCQllbHNlIGlmIChteENsaWVudC5JU19RVUlSS1MpCisJCQl7CQkJCisJCQkJdGhpcy50ZXh0YXJlYS5zdHlsZS5sZWZ0ID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHRoaXMuYm91bmRzLnggLSBtLnggKiAodGhpcy5ib3VuZHMud2lkdGggLSAob3cgKyAxKSAqIHNjYWxlKSArIG93ICogKHNjYWxlIC0gMSkgKiAwICsgKG0ueCArIDAuNSkgKiAyKSkgKyAncHgnOworCQkJCXRoaXMudGV4dGFyZWEuc3R5bGUudG9wID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHRoaXMuYm91bmRzLnkgLSBtLnkgKiAodGhpcy5ib3VuZHMuaGVpZ2h0IC0gKG9oICsgMC41KSAqIHNjYWxlKSArIG9oICogKHNjYWxlIC0gMSkgKiAwICsgTWF0aC5hYnMobS55ICsgMC41KSAqIDEpKSArICdweCc7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdGhpcy50ZXh0YXJlYS5zdHlsZS5sZWZ0ID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy54IC0gbS54ICogKHRoaXMuYm91bmRzLndpZHRoIC0gMikpICsgMSkgKyAncHgnOworCQkJCXRoaXMudGV4dGFyZWEuc3R5bGUudG9wID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy55IC0gbS55ICogKHRoaXMuYm91bmRzLmhlaWdodCAtIDQpICsgKChtLnkgPT0gLTEpID8gMyA6IDApKSArIDEpICsgJ3B4JzsKKwkJCX0KKwkgCX0KKworCQlpZiAobXhDbGllbnQuSVNfVk1MKQorCQl7CisJCQl0aGlzLnRleHRhcmVhLnN0eWxlLnpvb20gPSBzY2FsZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW14VXRpbHMuc2V0UHJlZml4ZWRTdHlsZSh0aGlzLnRleHRhcmVhLnN0eWxlLCAndHJhbnNmb3JtT3JpZ2luJywgJzBweCAwcHgnKTsKKwkJCW14VXRpbHMuc2V0UHJlZml4ZWRTdHlsZSh0aGlzLnRleHRhcmVhLnN0eWxlLCAndHJhbnNmb3JtJywKKwkJCQknc2NhbGUoJyArIHNjYWxlICsgJywnICsgc2NhbGUgKyAnKScgKyAoKG0gPT0gbnVsbCkgPyAnJyA6CisJCQkJJyB0cmFuc2xhdGUoJyArIChtLnggKiAxMDApICsgJyUsJyArIChtLnkgKiAxMDApICsgJyUpJykpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZm9jdXNMb3N0CisgKgorICogQ2FsbGVkIGlmIHRoZSB0ZXh0YXJlYSBoYXMgbG9zdCBmb2N1cy4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5mb2N1c0xvc3QgPSBmdW5jdGlvbigpCit7CisJdGhpcy5zdG9wRWRpdGluZyghdGhpcy5ncmFwaC5pc0ludm9rZXNTdG9wQ2VsbEVkaXRpbmcoKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRCYWNrZ3JvdW5kQ29sb3IKKyAqIAorICogUmV0dXJucyB0aGUgYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIGluLXBsYWNlIGVkaXRvci4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICogYWx3YXlzIHJldHVybnMgbnVsbC4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5nZXRCYWNrZ3JvdW5kQ29sb3IgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHN0YXJ0RWRpdGluZworICoKKyAqIFN0YXJ0cyB0aGUgZWRpdG9yIGZvciB0aGUgZ2l2ZW4gY2VsbC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRvIHN0YXJ0IGVkaXRpbmcuCisgKiB0cmlnZ2VyIC0gT3B0aW9uYWwgbW91c2UgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIGVkaXRvci4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5zdGFydEVkaXRpbmcgPSBmdW5jdGlvbihjZWxsLCB0cmlnZ2VyKQoreworCXRoaXMuc3RvcEVkaXRpbmcodHJ1ZSk7CisJCisJLy8gQ3JlYXRlcyBuZXcgdGV4dGFyZWEgaW5zdGFuY2UKKwlpZiAodGhpcy50ZXh0YXJlYSA9PSBudWxsKQorCXsKKwkJdGhpcy5pbml0KCk7CisJfQorCQorCWlmICh0aGlzLmdyYXBoLnRvb2x0aXBIYW5kbGVyICE9IG51bGwpCisJeworCQl0aGlzLmdyYXBoLnRvb2x0aXBIYW5kbGVyLmhpZGVUb29sdGlwKCk7CisJfQorCQorCXZhciBzdGF0ZSA9IHRoaXMuZ3JhcGguZ2V0VmlldygpLmdldFN0YXRlKGNlbGwpOworCQorCWlmIChzdGF0ZSAhPSBudWxsKQorCXsKKwkJLy8gQ29uZmlndXJlcyB0aGUgc3R5bGUgb2YgdGhlIGluLXBsYWNlIGVkaXRvcgorCQl2YXIgc2NhbGUgPSB0aGlzLmdyYXBoLmdldFZpZXcoKS5zY2FsZTsKKwkJdmFyIHNpemUgPSBteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9GT05UU0laRSwgbXhDb25zdGFudHMuREVGQVVMVF9GT05UU0laRSk7CisJCXZhciBmYW1pbHkgPSBteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9GT05URkFNSUxZLCBteENvbnN0YW50cy5ERUZBVUxUX0ZPTlRGQU1JTFkpOworCQl2YXIgY29sb3IgPSBteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9GT05UQ09MT1IsICdibGFjaycpOworCQl2YXIgYWxpZ24gPSBteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9BTElHTiwgbXhDb25zdGFudHMuQUxJR05fTEVGVCk7CisJCXZhciBib2xkID0gKG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0ZPTlRTVFlMRSwgMCkgJgorCQkJCW14Q29uc3RhbnRzLkZPTlRfQk9MRCkgPT0gbXhDb25zdGFudHMuRk9OVF9CT0xEOworCQl2YXIgaXRhbGljID0gKG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0ZPTlRTVFlMRSwgMCkgJgorCQkJCW14Q29uc3RhbnRzLkZPTlRfSVRBTElDKSA9PSBteENvbnN0YW50cy5GT05UX0lUQUxJQzsKKwkJdmFyIHVsaW5lID0gKG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0ZPTlRTVFlMRSwgMCkgJgorCQkJCW14Q29uc3RhbnRzLkZPTlRfVU5ERVJMSU5FKSA9PSBteENvbnN0YW50cy5GT05UX1VOREVSTElORTsKKwkJCisJCXRoaXMudGV4dGFyZWEuc3R5bGUubGluZUhlaWdodCA9IChteENvbnN0YW50cy5BQlNPTFVURV9MSU5FX0hFSUdIVCkgPyBNYXRoLnJvdW5kKHNpemUgKiBteENvbnN0YW50cy5MSU5FX0hFSUdIVCkgKyAncHgnIDogbXhDb25zdGFudHMuTElORV9IRUlHSFQ7CisJCXRoaXMudGV4dGFyZWEuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5nZXRCYWNrZ3JvdW5kQ29sb3Ioc3RhdGUpOworCQl0aGlzLnRleHRhcmVhLnN0eWxlLnRleHREZWNvcmF0aW9uID0gKHVsaW5lKSA/ICd1bmRlcmxpbmUnIDogJyc7CisJCXRoaXMudGV4dGFyZWEuc3R5bGUuZm9udFdlaWdodCA9IChib2xkKSA/ICdib2xkJyA6ICdub3JtYWwnOworCQl0aGlzLnRleHRhcmVhLnN0eWxlLmZvbnRTdHlsZSA9IChpdGFsaWMpID8gJ2l0YWxpYycgOiAnJzsKKwkJdGhpcy50ZXh0YXJlYS5zdHlsZS5mb250U2l6ZSA9IE1hdGgucm91bmQoc2l6ZSkgKyAncHgnOworCQl0aGlzLnRleHRhcmVhLnN0eWxlLnpJbmRleCA9IHRoaXMuekluZGV4OworCQl0aGlzLnRleHRhcmVhLnN0eWxlLmZvbnRGYW1pbHkgPSBmYW1pbHk7CisJCXRoaXMudGV4dGFyZWEuc3R5bGUudGV4dEFsaWduID0gYWxpZ247CisJCXRoaXMudGV4dGFyZWEuc3R5bGUub3V0bGluZSA9ICdub25lJzsKKwkJdGhpcy50ZXh0YXJlYS5zdHlsZS5jb2xvciA9IGNvbG9yOworCQkKKwkJdmFyIGRpciA9IHRoaXMudGV4dERpcmVjdGlvbiA9IG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1RFWFRfRElSRUNUSU9OLCBteENvbnN0YW50cy5ERUZBVUxUX1RFWFRfRElSRUNUSU9OKTsKKwkJCisJCWlmIChkaXIgPT0gbXhDb25zdGFudHMuVEVYVF9ESVJFQ1RJT05fQVVUTykKKwkJeworCQkJaWYgKHN0YXRlICE9IG51bGwgJiYgc3RhdGUudGV4dCAhPSBudWxsICYmIHN0YXRlLnRleHQuZGlhbGVjdCAhPSBteENvbnN0YW50cy5ESUFMRUNUX1NUUklDVEhUTUwgJiYKKwkJCQkhbXhVdGlscy5pc05vZGUoc3RhdGUudGV4dC52YWx1ZSkpCisJCQl7CisJCQkJZGlyID0gc3RhdGUudGV4dC5nZXRBdXRvRGlyZWN0aW9uKCk7CisJCQl9CisJCX0KKwkJCisJCWlmIChkaXIgPT0gbXhDb25zdGFudHMuVEVYVF9ESVJFQ1RJT05fTFRSIHx8IGRpciA9PSBteENvbnN0YW50cy5URVhUX0RJUkVDVElPTl9SVEwpCisJCXsKKwkJCXRoaXMudGV4dGFyZWEuc2V0QXR0cmlidXRlKCdkaXInLCBkaXIpOworCQl9CisJCWVsc2UKKwkJeworCQkJdGhpcy50ZXh0YXJlYS5yZW1vdmVBdHRyaWJ1dGUoJ2RpcicpOworCQl9CisKKwkJLy8gU2V0cyB0aGUgaW5pdGlhbCBlZGl0aW5nIHZhbHVlCisJCXRoaXMudGV4dGFyZWEuaW5uZXJIVE1MID0gdGhpcy5nZXRJbml0aWFsVmFsdWUoc3RhdGUsIHRyaWdnZXIpIHx8ICcnOworCQl0aGlzLmluaXRpYWxWYWx1ZSA9IHRoaXMudGV4dGFyZWEuaW5uZXJIVE1MOworCisJCS8vIFVzZXMgYW4gb3B0aW9uYWwgdGV4dCB2YWx1ZSBmb3IgZW1wdHkgbGFiZWxzIHdoaWNoIGlzIGNsZWFyZWQKKwkJLy8gd2hlbiB0aGUgZmlyc3Qga2V5c3Ryb2tlIGFwcGVhcnMuIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIHNlZQorCQkvLyB0aGF0IGEgbGFiZWwgaXMgYmVpbmcgZWRpdGVkIGV2ZW4gaWYgdGhlIGxhYmVsIGlzIGVtcHR5LgorCQlpZiAodGhpcy50ZXh0YXJlYS5pbm5lckhUTUwubGVuZ3RoID09IDAgfHwgdGhpcy50ZXh0YXJlYS5pbm5lckhUTUwgPT0gJzxicj4nKQorCQl7CisJCQl0aGlzLnRleHRhcmVhLmlubmVySFRNTCA9IHRoaXMuZ2V0RW1wdHlMYWJlbFRleHQoKTsKKwkJCXRoaXMuY2xlYXJPbkNoYW5nZSA9IHRydWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLmNsZWFyT25DaGFuZ2UgPSB0aGlzLnRleHRhcmVhLmlubmVySFRNTCA9PSB0aGlzLmdldEVtcHR5TGFiZWxUZXh0KCk7CisJCX0KKworCQl0aGlzLmdyYXBoLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnRleHRhcmVhKTsKKwkJCisJCS8vIFVwZGF0ZSB0aGlzIGFmdGVyIGZpcmluZyBhbGwgcG90ZW50aWFsIGV2ZW50cyB0aGF0IGNvdWxkIHVwZGF0ZSB0aGUgY2xlYW5PbkNoYW5nZSBmbGFnCisJCXRoaXMuZWRpdGluZ0NlbGwgPSBjZWxsOworCQl0aGlzLnRyaWdnZXIgPSB0cmlnZ2VyOworCQl0aGlzLnRleHROb2RlID0gbnVsbDsKKworCQlpZiAoc3RhdGUudGV4dCAhPSBudWxsICYmIHRoaXMuaXNIaWRlTGFiZWwoc3RhdGUpKQorCQl7CisJCQl0aGlzLnRleHROb2RlID0gc3RhdGUudGV4dC5ub2RlOworCQkJdGhpcy50ZXh0Tm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7CisJCX0KKworCQkvLyBXb3JrYXJvdW5kIGZvciBpbml0aWFsIG9mZnNldEhlaWdodCBub3QgcmVhZHkgZm9yIGhlYWRpbmcgaW4gbWFya3VwCisJCWlmICh0aGlzLmF1dG9TaXplICYmICh0aGlzLmdyYXBoLm1vZGVsLmlzRWRnZShzdGF0ZS5jZWxsKSB8fCBzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9PVkVSRkxPV10gIT0gJ2ZpbGwnKSkKKwkJeworCQkJd2luZG93LnNldFRpbWVvdXQobXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKCkKKwkJCXsKKwkJCQl0aGlzLnJlc2l6ZSgpOworCQkJfSksIDApOworCQl9CisJCQorCQl0aGlzLnJlc2l6ZSgpOworCQkKKwkJLy8gV29ya2Fyb3VuZCBmb3IgTlNfRVJST1JfRkFJTFVSRSBpbiBGRgorCQl0cnkKKwkJeworCQkJLy8gUHJlZmVycyBibGlua2luZyBjdXJzb3Igb3ZlciBubyBzZWxlY3RlZCB0ZXh0IGlmIGVtcHR5CisJCQl0aGlzLnRleHRhcmVhLmZvY3VzKCk7CisJCQkKKwkJCWlmICh0aGlzLmlzU2VsZWN0VGV4dCgpICYmIHRoaXMudGV4dGFyZWEuaW5uZXJIVE1MLmxlbmd0aCA+IDAgJiYKKwkJCQkodGhpcy50ZXh0YXJlYS5pbm5lckhUTUwgIT0gdGhpcy5nZXRFbXB0eUxhYmVsVGV4dCgpIHx8ICF0aGlzLmNsZWFyT25DaGFuZ2UpKQorCQkJeworCQkJCWRvY3VtZW50LmV4ZWNDb21tYW5kKCdzZWxlY3RBbGwnLCBmYWxzZSwgbnVsbCk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKGUpCisJCXsKKwkJCS8vIGlnbm9yZQorCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNTZWxlY3RUZXh0CisgKiAKKyAqIFJldHVybnMgPHNlbGVjdFRleHQ+LgorICovCitteENlbGxFZGl0b3IucHJvdG90eXBlLmlzU2VsZWN0VGV4dCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5zZWxlY3RUZXh0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc3RvcEVkaXRpbmcKKyAqCisgKiBTdG9wcyB0aGUgZWRpdG9yIGFuZCBhcHBsaWVzIHRoZSB2YWx1ZSBpZiBjYW5jZWwgaXMgZmFsc2UuCisgKi8KK214Q2VsbEVkaXRvci5wcm90b3R5cGUuc3RvcEVkaXRpbmcgPSBmdW5jdGlvbihjYW5jZWwpCit7CisJY2FuY2VsID0gY2FuY2VsIHx8IGZhbHNlOworCQorCWlmICh0aGlzLmVkaXRpbmdDZWxsICE9IG51bGwpCisJeworCQlpZiAodGhpcy50ZXh0Tm9kZSAhPSBudWxsKQorCQl7CisJCQl0aGlzLnRleHROb2RlLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7CisJCQl0aGlzLnRleHROb2RlID0gbnVsbDsKKwkJfQorCisJCXZhciBzdGF0ZSA9ICghY2FuY2VsKSA/IHRoaXMuZ3JhcGgudmlldy5nZXRTdGF0ZSh0aGlzLmVkaXRpbmdDZWxsKSA6IG51bGw7CisKKwkJdmFyIGluaXRpYWwgPSB0aGlzLmluaXRpYWxWYWx1ZTsKKwkJdGhpcy5pbml0aWFsVmFsdWUgPSBudWxsOworCQl0aGlzLmVkaXRpbmdDZWxsID0gbnVsbDsKKwkJdGhpcy50cmlnZ2VyID0gbnVsbDsKKwkJdGhpcy5ib3VuZHMgPSBudWxsOworCQl0aGlzLnRleHRhcmVhLmJsdXIoKTsKKwkJCisJCWlmICh0aGlzLnRleHRhcmVhLnBhcmVudE5vZGUgIT0gbnVsbCkKKwkJeworCQkJdGhpcy50ZXh0YXJlYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMudGV4dGFyZWEpOworCQl9CisJCQorCQlpZiAodGhpcy5jbGVhck9uQ2hhbmdlICYmIHRoaXMudGV4dGFyZWEuaW5uZXJIVE1MID09IHRoaXMuZ2V0RW1wdHlMYWJlbFRleHQoKSkKKwkJeworCQkJdGhpcy50ZXh0YXJlYS5pbm5lckhUTUwgPSAnJzsKKwkJCXRoaXMuY2xlYXJPbkNoYW5nZSA9IGZhbHNlOworCQl9CisJCQorCQlpZiAoc3RhdGUgIT0gbnVsbCAmJiB0aGlzLnRleHRhcmVhLmlubmVySFRNTCAhPSBpbml0aWFsKQorCQl7CisJCQl0aGlzLnByZXBhcmVUZXh0YXJlYSgpOworCQkJdmFyIHZhbHVlID0gdGhpcy5nZXRDdXJyZW50VmFsdWUoc3RhdGUpOworCQkJCisJCQlpZiAodmFsdWUgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLmFwcGx5VmFsdWUoc3RhdGUsIHZhbHVlKTsKKwkJCX0KKwkJfQorCQkKKwkJLy8gRm9yY2VzIG5ldyBpbnN0YW5jZSBvbiBuZXh0IGVkaXQgZm9yIHVuZG8gaGlzdG9yeSByZXNldAorCQlteEV2ZW50LnJlbGVhc2UodGhpcy50ZXh0YXJlYSk7CisJCXRoaXMudGV4dGFyZWEgPSBudWxsOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHByZXBhcmVUZXh0YXJlYQorICogCisgKiBQcmVwYXJlcyB0aGUgdGV4dGFyZWEgZm9yIGdldHRpbmcgaXRzIHZhbHVlIGluIDxzdG9wRWRpdGluZz4uCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJlbW92ZXMgdGhlIGV4dHJhIHRyYWlsaW5nIGxpbmVmZWVkIGluIEZpcmVmb3guCisgKi8KK214Q2VsbEVkaXRvci5wcm90b3R5cGUucHJlcGFyZVRleHRhcmVhID0gZnVuY3Rpb24oKQoreworCWlmIChteENsaWVudC5JU19GRiAmJiB0aGlzLnRleHRhcmVhLmxhc3RDaGlsZCAhPSBudWxsICYmCisJCXRoaXMudGV4dGFyZWEubGFzdENoaWxkLm5vZGVOYW1lID09ICdCUicpCisJeworCQl0aGlzLnRleHRhcmVhLnJlbW92ZUNoaWxkKHRoaXMudGV4dGFyZWEubGFzdENoaWxkKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0hpZGVMYWJlbAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxhYmVsIHNob3VsZCBiZSBoaWRkZW4gd2hpbGUgdGhlIGNlbGwgaXMgYmVpbmcKKyAqIGVkaXRlZC4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5pc0hpZGVMYWJlbCA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXJldHVybiB0cnVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0TWluaW11bVNpemUKKyAqIAorICogUmV0dXJucyB0aGUgbWluaW11bSB3aWR0aCBhbmQgaGVpZ2h0IGZvciBlZGl0aW5nIHRoZSBnaXZlbiBzdGF0ZS4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5nZXRNaW5pbXVtU2l6ZSA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXZhciBzY2FsZSA9IHRoaXMuZ3JhcGguZ2V0VmlldygpLnNjYWxlOworCQorCXJldHVybiBuZXcgbXhSZWN0YW5nbGUoMCwgMCwgKHN0YXRlLnRleHQgPT0gbnVsbCkgPyAzMCA6IHN0YXRlLnRleHQuc2l6ZSAqIHNjYWxlICsgMjAsCisJCQkodGhpcy50ZXh0YXJlYS5zdHlsZS50ZXh0QWxpZ24gPT0gJ2xlZnQnKSA/IDEyMCA6IDQwKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEVkaXRvckJvdW5kcworICogCisgKiBSZXR1cm5zIHRoZSA8bXhSZWN0YW5nbGU+IHRoYXQgZGVmaW5lcyB0aGUgYm91bmRzIG9mIHRoZSBlZGl0b3IuCisgKi8KK214Q2VsbEVkaXRvci5wcm90b3R5cGUuZ2V0RWRpdG9yQm91bmRzID0gZnVuY3Rpb24oc3RhdGUpCit7CisJdmFyIGlzRWRnZSA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5pc0VkZ2Uoc3RhdGUuY2VsbCk7CisJdmFyIHNjYWxlID0gdGhpcy5ncmFwaC5nZXRWaWV3KCkuc2NhbGU7CisJdmFyIG1pblNpemUgPSB0aGlzLmdldE1pbmltdW1TaXplKHN0YXRlKTsKKwl2YXIgbWluV2lkdGggPSBtaW5TaXplLndpZHRoOworIAl2YXIgbWluSGVpZ2h0ID0gbWluU2l6ZS5oZWlnaHQ7CisgCXZhciByZXN1bHQgPSBudWxsOworIAkKKyAJaWYgKCFpc0VkZ2UgJiYgc3RhdGUudmlldy5ncmFwaC5jZWxsUmVuZGVyZXIubGVnYWN5U3BhY2luZyAmJiBzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9PVkVSRkxPV10gPT0gJ2ZpbGwnKQorIAl7CisgCQlyZXN1bHQgPSBzdGF0ZS5zaGFwZS5nZXRMYWJlbEJvdW5kcyhteFJlY3RhbmdsZS5mcm9tUmVjdGFuZ2xlKHN0YXRlKSk7CisgCX0KKyAJZWxzZQorIAl7CisJCXZhciBzcGFjaW5nID0gcGFyc2VJbnQoc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU1BBQ0lOR10gfHwgMCkgKiBzY2FsZTsKKwkJdmFyIHNwYWNpbmdUb3AgPSAocGFyc2VJbnQoc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU1BBQ0lOR19UT1BdIHx8IDApICsgbXhUZXh0LnByb3RvdHlwZS5iYXNlU3BhY2luZ1RvcCkgKiBzY2FsZSArIHNwYWNpbmc7CisJCXZhciBzcGFjaW5nUmlnaHQgPSAocGFyc2VJbnQoc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU1BBQ0lOR19SSUdIVF0gfHwgMCkgKyBteFRleHQucHJvdG90eXBlLmJhc2VTcGFjaW5nUmlnaHQpICogc2NhbGUgKyBzcGFjaW5nOworCQl2YXIgc3BhY2luZ0JvdHRvbSA9IChwYXJzZUludChzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9TUEFDSU5HX0JPVFRPTV0gfHwgMCkgKyBteFRleHQucHJvdG90eXBlLmJhc2VTcGFjaW5nQm90dG9tKSAqIHNjYWxlICsgc3BhY2luZzsKKwkJdmFyIHNwYWNpbmdMZWZ0ID0gKHBhcnNlSW50KHN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1NQQUNJTkdfTEVGVF0gfHwgMCkgKyBteFRleHQucHJvdG90eXBlLmJhc2VTcGFjaW5nTGVmdCkgKiBzY2FsZSArIHNwYWNpbmc7CisJCisJIAlyZXN1bHQgPSBuZXcgbXhSZWN0YW5nbGUoc3RhdGUueCwgc3RhdGUueSwKKwkgCQkgTWF0aC5tYXgobWluV2lkdGgsIHN0YXRlLndpZHRoIC0gc3BhY2luZ0xlZnQgLSBzcGFjaW5nUmlnaHQpLAorCSAJCSBNYXRoLm1heChtaW5IZWlnaHQsIHN0YXRlLmhlaWdodCAtIHNwYWNpbmdUb3AgLSBzcGFjaW5nQm90dG9tKSk7CisJCXZhciBocG9zID0gbXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfTEFCRUxfUE9TSVRJT04sIG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUik7CisJCXZhciB2cG9zID0gbXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfVkVSVElDQUxfTEFCRUxfUE9TSVRJT04sIG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSk7CisJCQorCQlyZXN1bHQgPSAoc3RhdGUuc2hhcGUgIT0gbnVsbCAmJiBocG9zID09IG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUiAmJiB2cG9zID09IG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSkgPyBzdGF0ZS5zaGFwZS5nZXRMYWJlbEJvdW5kcyhyZXN1bHQpIDogcmVzdWx0OworCQorCQlpZiAoaXNFZGdlKQorCQl7CisJCQlyZXN1bHQueCA9IHN0YXRlLmFic29sdXRlT2Zmc2V0Lng7CisJCQlyZXN1bHQueSA9IHN0YXRlLmFic29sdXRlT2Zmc2V0Lnk7CisJCisJCQlpZiAoc3RhdGUudGV4dCAhPSBudWxsICYmIHN0YXRlLnRleHQuYm91bmRpbmdCb3ggIT0gbnVsbCkKKwkJCXsKKwkJCQkvLyBXb3JrYXJvdW5kIGZvciBsYWJlbCBjb250YWluaW5nIGp1c3Qgc3BhY2VzIGluIHdoaWNoIGNhc2UKKwkJCQkvLyB0aGUgYm91bmRpbmcgYm94IGxvY2F0aW9uIGNvbnRhaW5zIG5lZ2F0aXZlIG51bWJlcnMgCisJCQkJaWYgKHN0YXRlLnRleHQuYm91bmRpbmdCb3gueCA+IDApCisJCQkJeworCQkJCQlyZXN1bHQueCA9IHN0YXRlLnRleHQuYm91bmRpbmdCb3gueDsKKwkJCQl9CisJCQkJCisJCQkJaWYgKHN0YXRlLnRleHQuYm91bmRpbmdCb3gueSA+IDApCisJCQkJeworCQkJCQlyZXN1bHQueSA9IHN0YXRlLnRleHQuYm91bmRpbmdCb3gueTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoc3RhdGUudGV4dCAhPSBudWxsICYmIHN0YXRlLnRleHQuYm91bmRpbmdCb3ggIT0gbnVsbCkKKwkJeworCQkJcmVzdWx0LnggPSBNYXRoLm1pbihyZXN1bHQueCwgc3RhdGUudGV4dC5ib3VuZGluZ0JveC54KTsKKwkJCXJlc3VsdC55ID0gTWF0aC5taW4ocmVzdWx0LnksIHN0YXRlLnRleHQuYm91bmRpbmdCb3gueSk7CisJCX0KKwkKKwkJcmVzdWx0LnggKz0gc3BhY2luZ0xlZnQ7CisJCXJlc3VsdC55ICs9IHNwYWNpbmdUb3A7CisJCisJCWlmIChzdGF0ZS50ZXh0ICE9IG51bGwgJiYgc3RhdGUudGV4dC5ib3VuZGluZ0JveCAhPSBudWxsKQorCQl7CisJCQlpZiAoIWlzRWRnZSkKKwkJCXsKKwkJCQlyZXN1bHQud2lkdGggPSBNYXRoLm1heChyZXN1bHQud2lkdGgsIHN0YXRlLnRleHQuYm91bmRpbmdCb3gud2lkdGgpOworCQkJCXJlc3VsdC5oZWlnaHQgPSBNYXRoLm1heChyZXN1bHQuaGVpZ2h0LCBzdGF0ZS50ZXh0LmJvdW5kaW5nQm94LmhlaWdodCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmVzdWx0LndpZHRoID0gTWF0aC5tYXgobWluV2lkdGgsIHN0YXRlLnRleHQuYm91bmRpbmdCb3gud2lkdGgpOworCQkJCXJlc3VsdC5oZWlnaHQgPSBNYXRoLm1heChtaW5IZWlnaHQsIHN0YXRlLnRleHQuYm91bmRpbmdCb3guaGVpZ2h0KTsKKwkJCX0KKwkJfQorCQkKKwkJLy8gQXBwbGllcyB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgbGFiZWwgcG9zaXRpb25zCisJCWlmICh0aGlzLmdyYXBoLmdldE1vZGVsKCkuaXNWZXJ0ZXgoc3RhdGUuY2VsbCkpCisJCXsKKwkJCXZhciBob3Jpem9udGFsID0gbXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfTEFCRUxfUE9TSVRJT04sIG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUik7CisJCisJCQlpZiAoaG9yaXpvbnRhbCA9PSBteENvbnN0YW50cy5BTElHTl9MRUZUKQorCQkJeworCQkJCXJlc3VsdC54IC09IHN0YXRlLndpZHRoOworCQkJfQorCQkJZWxzZSBpZiAoaG9yaXpvbnRhbCA9PSBteENvbnN0YW50cy5BTElHTl9SSUdIVCkKKwkJCXsKKwkJCQlyZXN1bHQueCArPSBzdGF0ZS53aWR0aDsKKwkJCX0KKwkKKwkJCXZhciB2ZXJ0aWNhbCA9IG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1ZFUlRJQ0FMX0xBQkVMX1BPU0lUSU9OLCBteENvbnN0YW50cy5BTElHTl9NSURETEUpOworCQorCQkJaWYgKHZlcnRpY2FsID09IG14Q29uc3RhbnRzLkFMSUdOX1RPUCkKKwkJCXsKKwkJCQlyZXN1bHQueSAtPSBzdGF0ZS5oZWlnaHQ7CisJCQl9CisJCQllbHNlIGlmICh2ZXJ0aWNhbCA9PSBteENvbnN0YW50cy5BTElHTl9CT1RUT00pCisJCQl7CisJCQkJcmVzdWx0LnkgKz0gc3RhdGUuaGVpZ2h0OworCQkJfQorCQl9CisgCX0KKyAJCisgCXJldHVybiBuZXcgbXhSZWN0YW5nbGUoTWF0aC5yb3VuZChyZXN1bHQueCksIE1hdGgucm91bmQocmVzdWx0LnkpLCBNYXRoLnJvdW5kKHJlc3VsdC53aWR0aCksIE1hdGgucm91bmQocmVzdWx0LmhlaWdodCkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0RW1wdHlMYWJlbFRleHQKKyAqCisgKiBSZXR1cm5zIHRoZSBpbml0aWFsIGxhYmVsIHZhbHVlIHRvIGJlIHVzZWQgb2YgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbgorICogY2VsbCBpcyBlbXB0eS4gVGhpcyBsYWJlbCBpcyBkaXNwbGF5ZWQgYW5kIGNsZWFyZWQgb24gdGhlIGZpcnN0IGtleXN0cm9rZS4KKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8ZW1wdHlMYWJlbFRleHQ+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gZm9yIHdoaWNoIGEgdGV4dCBmb3IgYW4gZW1wdHkgZWRpdGluZyBib3ggc2hvdWxkIGJlCisgKiByZXR1cm5lZC4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5nZXRFbXB0eUxhYmVsVGV4dCA9IGZ1bmN0aW9uIChjZWxsKQoreworCXJldHVybiB0aGlzLmVtcHR5TGFiZWxUZXh0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0RWRpdGluZ0NlbGwKKyAqCisgKiBSZXR1cm5zIHRoZSBjZWxsIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGVkaXRlZCBvciBudWxsIGlmIG5vIGNlbGwgaXMKKyAqIGJlaW5nIGVkaXRlZC4KKyAqLworbXhDZWxsRWRpdG9yLnByb3RvdHlwZS5nZXRFZGl0aW5nQ2VsbCA9IGZ1bmN0aW9uICgpCit7CisJcmV0dXJuIHRoaXMuZWRpdGluZ0NlbGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZXN0cm95CisgKgorICogRGVzdHJveXMgdGhlIGVkaXRvciBhbmQgcmVtb3ZlcyBhbGwgYXNzb2NpYXRlZCByZXNvdXJjZXMuCisgKi8KK214Q2VsbEVkaXRvci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpCit7CisJaWYgKHRoaXMudGV4dGFyZWEgIT0gbnVsbCkKKwl7CisJCW14RXZlbnQucmVsZWFzZSh0aGlzLnRleHRhcmVhKTsKKwkJCisJCWlmICh0aGlzLnRleHRhcmVhLnBhcmVudE5vZGUgIT0gbnVsbCkKKwkJeworCQkJdGhpcy50ZXh0YXJlYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMudGV4dGFyZWEpOworCQl9CisJCQorCQl0aGlzLnRleHRhcmVhID0gbnVsbDsKKworCX0KKwkJCQorCWlmICh0aGlzLmNoYW5nZUhhbmRsZXIgIT0gbnVsbCkKKwl7CisJCXRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5yZW1vdmVMaXN0ZW5lcih0aGlzLmNoYW5nZUhhbmRsZXIpOworCQl0aGlzLmNoYW5nZUhhbmRsZXIgPSBudWxsOworCX0KKworCWlmICh0aGlzLnpvb21IYW5kbGVyKQorCXsKKwkJdGhpcy5ncmFwaC52aWV3LnJlbW92ZUxpc3RlbmVyKHRoaXMuem9vbUhhbmRsZXIpOworCQl0aGlzLnpvb21IYW5kbGVyID0gbnVsbDsKKwl9Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3ZpZXcvbXhDZWxsT3ZlcmxheS5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214Q2VsbE92ZXJsYXkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkZWJiYgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214Q2VsbE92ZXJsYXkuanMKQEAgLTAsMCArMSwyMzMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14Q2VsbE92ZXJsYXkKKyAqCisgKiBFeHRlbmRzIDxteEV2ZW50U291cmNlPiB0byBpbXBsZW1lbnQgYSBncmFwaCBvdmVybGF5LCByZXByZXNlbnRlZCBieSBhbiBpY29uCisgKiBhbmQgYSB0b29sdGlwLiBPdmVybGF5cyBjYW4gaGFuZGxlIGFuZCBmaXJlIDxjbGljaz4gZXZlbnRzIGFuZCBhcmUgYWRkZWQgdG8KKyAqIHRoZSBncmFwaCB1c2luZyA8bXhHcmFwaC5hZGRDZWxsT3ZlcmxheT4sIGFuZCByZW1vdmVkIHVzaW5nCisgKiA8bXhHcmFwaC5yZW1vdmVDZWxsT3ZlcmxheT4sIG9yIDxteEdyYXBoLnJlbW92ZUNlbGxPdmVybGF5cz4gdG8gcmVtb3ZlIGFsbCBvdmVybGF5cy4KKyAqIFRoZSA8bXhHcmFwaC5nZXRDZWxsT3ZlcmxheXM+IGZ1bmN0aW9uIHJldHVybnMgdGhlIGFycmF5IG9mIG92ZXJsYXlzIGZvciBhIGdpdmVuCisgKiBjZWxsIGluIGEgZ3JhcGguIElmIG11bHRpcGxlIG92ZXJsYXlzIGV4aXN0IGZvciB0aGUgc2FtZSBjZWxsLCB0aGVuCisgKiA8Z2V0Qm91bmRzPiBzaG91bGQgYmUgb3ZlcnJpZGRlbiBpbiBhdCBsZWFzdCBvbmUgb2YgdGhlIG92ZXJsYXlzLgorICogCisgKiBPdmVybGF5cyBhcHBlYXIgb24gdG9wIG9mIGFsbCBjZWxscyBpbiBhIHNwZWNpYWwgbGF5ZXIuIElmIHRoaXMgaXMgbm90CisgKiBkZXNpcmFibGUsIHRoZW4gdGhlIGltYWdlIG11c3QgYmUgcmVuZGVyZWQgYXMgcGFydCBvZiB0aGUgc2hhcGUgb3IgbGFiZWwgb2YKKyAqIHRoZSBjZWxsIGluc3RlYWQuCisgKgorICogRXhhbXBsZToKKyAqIAorICogVGhlIGZvbGxvd2luZyBhZGRzIGEgbmV3IG92ZXJsYXlzIGZvciBhIGdpdmVuIHZlcnRleCBhbmQgc2VsZWN0cyB0aGUgY2VsbAorICogaWYgdGhlIG92ZXJsYXkgaXMgY2xpY2tlZC4KKyAqCisgKiAoY29kZSkKKyAqIHZhciBvdmVybGF5ID0gbmV3IG14Q2VsbE92ZXJsYXkoaW1nLCBodG1sKTsKKyAqIGdyYXBoLmFkZENlbGxPdmVybGF5KHZlcnRleCwgb3ZlcmxheSk7CisgKiBvdmVybGF5LmFkZExpc3RlbmVyKG14RXZlbnQuQ0xJQ0ssIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorICogeworICogICB2YXIgY2VsbCA9IGV2dC5nZXRQcm9wZXJ0eSgnY2VsbCcpOworICogICBncmFwaC5zZXRTZWxlY3Rpb25DZWxsKGNlbGwpOworICogfSk7CisgKiAoZW5kKQorICogCisgKiBGb3IgY2VsbCBvdmVybGF5cyB0byBiZSBwcmludGVkIHVzZSA8bXhQcmludFByZXZpZXcucHJpbnRPdmVybGF5cz4uCisgKgorICogRXZlbnQ6IG14RXZlbnQuQ0xJQ0sKKyAqCisgKiBGaXJlcyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgb3ZlcmxheS4gVGhlIDxjb2RlPmV2ZW50PC9jb2RlPiBwcm9wZXJ0eQorICogY29udGFpbnMgdGhlIGNvcnJlc3BvbmRpbmcgbW91c2UgZXZlbnQgYW5kIHRoZSA8Y29kZT5jZWxsPC9jb2RlPiBwcm9wZXJ0eQorICogY29udGFpbnMgdGhlIGNlbGwuIEZvciB0b3VjaCBkZXZpY2VzIHRoaXMgaXMgZmlyZWQgaWYgdGhlIGVsZW1lbnQgcmVjZWl2ZXMKKyAqIGEgdG91Y2hlbmQgZXZlbnQuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteENlbGxPdmVybGF5CisgKgorICogQ29uc3RydWN0cyBhIG5ldyBvdmVybGF5IHVzaW5nIHRoZSBnaXZlbiBpbWFnZSBhbmQgdG9vbHRpcC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogaW1hZ2UgLSA8bXhJbWFnZT4gdGhhdCByZXByZXNlbnRzIHRoZSBpY29uIHRvIGJlIGRpc3BsYXllZC4KKyAqIHRvb2x0aXAgLSBPcHRpb25hbCBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIHRvb2x0aXAuCisgKiBhbGlnbiAtIE9wdGlvbmFsIGhvcml6b250YWwgYWxpZ25tZW50IGZvciB0aGUgb3ZlcmxheS4gUG9zc2libGUKKyAqIHZhbHVlcyBhcmUgPEFMSUdOX0xFRlQ+LCA8QUxJR05fQ0VOVEVSPiBhbmQgPEFMSUdOX1JJR0hUPgorICogKGRlZmF1bHQpLgorICogdmVydGljYWxBbGlnbiAtIFZlcnRpY2FsIGFsaWdubWVudCBmb3IgdGhlIG92ZXJsYXkuIFBvc3NpYmxlCisgKiB2YWx1ZXMgYXJlIDxBTElHTl9UT1A+LCA8QUxJR05fTUlERExFPiBhbmQgPEFMSUdOX0JPVFRPTT4KKyAqIChkZWZhdWx0KS4KKyAqLworZnVuY3Rpb24gbXhDZWxsT3ZlcmxheShpbWFnZSwgdG9vbHRpcCwgYWxpZ24sIHZlcnRpY2FsQWxpZ24sIG9mZnNldCwgY3Vyc29yKQoreworCXRoaXMuaW1hZ2UgPSBpbWFnZTsKKwl0aGlzLnRvb2x0aXAgPSB0b29sdGlwOworCXRoaXMuYWxpZ24gPSAoYWxpZ24gIT0gbnVsbCkgPyBhbGlnbiA6IHRoaXMuYWxpZ247CisJdGhpcy52ZXJ0aWNhbEFsaWduID0gKHZlcnRpY2FsQWxpZ24gIT0gbnVsbCkgPyB2ZXJ0aWNhbEFsaWduIDogdGhpcy52ZXJ0aWNhbEFsaWduOworCXRoaXMub2Zmc2V0ID0gKG9mZnNldCAhPSBudWxsKSA/IG9mZnNldCA6IG5ldyBteFBvaW50KCk7CisJdGhpcy5jdXJzb3IgPSAoY3Vyc29yICE9IG51bGwpID8gY3Vyc29yIDogJ2hlbHAnOworfTsKKworLyoqCisgKiBFeHRlbmRzIG14RXZlbnRTb3VyY2UuCisgKi8KK214Q2VsbE92ZXJsYXkucHJvdG90eXBlID0gbmV3IG14RXZlbnRTb3VyY2UoKTsKK214Q2VsbE92ZXJsYXkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhDZWxsT3ZlcmxheTsKKworLyoqCisgKiBWYXJpYWJsZTogaW1hZ2UKKyAqCisgKiBIb2xkcyB0aGUgPG14SW1hZ2U+IHRvIGJlIHVzZWQgYXMgdGhlIGljb24uCisgKi8KK214Q2VsbE92ZXJsYXkucHJvdG90eXBlLmltYWdlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogdG9vbHRpcAorICogCisgKiBIb2xkcyB0aGUgb3B0aW9uYWwgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHRvb2x0aXAuCisgKi8KK214Q2VsbE92ZXJsYXkucHJvdG90eXBlLnRvb2x0aXAgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBhbGlnbgorICogCisgKiBIb2xkcyB0aGUgaG9yaXpvbnRhbCBhbGlnbm1lbnQgZm9yIHRoZSBvdmVybGF5LiBEZWZhdWx0IGlzCisgKiA8bXhDb25zdGFudHMuQUxJR05fUklHSFQ+LiBGb3IgZWRnZXMsIHRoZSBvdmVybGF5IGFsd2F5cyBhcHBlYXJzIGluIHRoZQorICogY2VudGVyIG9mIHRoZSBlZGdlLgorICovCitteENlbGxPdmVybGF5LnByb3RvdHlwZS5hbGlnbiA9IG14Q29uc3RhbnRzLkFMSUdOX1JJR0hUOworCisvKioKKyAqIFZhcmlhYmxlOiB2ZXJ0aWNhbEFsaWduCisgKiAKKyAqIEhvbGRzIHRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgZm9yIHRoZSBvdmVybGF5LiBEZWZhdWx0IGlzCisgKiA8bXhDb25zdGFudHMuQUxJR05fQk9UVE9NPi4gRm9yIGVkZ2VzLCB0aGUgb3ZlcmxheSBhbHdheXMgYXBwZWFycyBpbiB0aGUKKyAqIGNlbnRlciBvZiB0aGUgZWRnZS4KKyAqLworbXhDZWxsT3ZlcmxheS5wcm90b3R5cGUudmVydGljYWxBbGlnbiA9IG14Q29uc3RhbnRzLkFMSUdOX0JPVFRPTTsKKworLyoqCisgKiBWYXJpYWJsZTogb2Zmc2V0CisgKiAKKyAqIEhvbGRzIHRoZSBvZmZzZXQgYXMgYW4gPG14UG9pbnQ+LiBUaGUgb2Zmc2V0IHdpbGwgYmUgc2NhbGVkIGFjY29yZGluZyB0byB0aGUKKyAqIGN1cnJlbnQgc2NhbGUuCisgKi8KK214Q2VsbE92ZXJsYXkucHJvdG90eXBlLm9mZnNldCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGN1cnNvcgorICogCisgKiBIb2xkcyB0aGUgY3Vyc29yIGZvciB0aGUgb3ZlcmxheS4gRGVmYXVsdCBpcyAnaGVscCcuCisgKi8KK214Q2VsbE92ZXJsYXkucHJvdG90eXBlLmN1cnNvciA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGRlZmF1bHRPdmVybGFwCisgKiAKKyAqIERlZmluZXMgdGhlIG92ZXJsYXBwaW5nIGZvciB0aGUgb3ZlcmxheSwgdGhhdCBpcywgdGhlIHByb3BvcnRpb25hbCBkaXN0YW5jZQorICogZnJvbSB0aGUgb3JpZ2luIHRvIHRoZSBwb2ludCBkZWZpbmVkIGJ5IHRoZSBhbGlnbm1lbnQuIERlZmF1bHQgaXMgMC41LgorICovCitteENlbGxPdmVybGF5LnByb3RvdHlwZS5kZWZhdWx0T3ZlcmxhcCA9IDAuNTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Qm91bmRzCisgKiAKKyAqIFJldHVybnMgdGhlIGJvdW5kcyBvZiB0aGUgb3ZlcmxheSBmb3IgdGhlIGdpdmVuIDxteENlbGxTdGF0ZT4gYXMgYW4KKyAqIDxteFJlY3RhbmdsZT4uIFRoaXMgc2hvdWxkIGJlIG92ZXJyaWRkZW4gd2hlbiB1c2luZyBtdWx0aXBsZSBvdmVybGF5cworICogcGVyIGNlbGwgc28gdGhhdCB0aGUgb3ZlcmxheXMgZG8gbm90IG92ZXJsYXAuCisgKiAKKyAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB3aWxsIHBsYWNlIHRoZSBvdmVybGF5IGFsb25nIGFuIGVkZ2UgKHdoZXJlCisgKiB4PVstMS4uMV0gZnJvbSB0aGUgc3RhcnQgdG8gdGhlIGVuZCBvZiB0aGUgZWRnZSBhbmQgeSBpcyB0aGUKKyAqIG9ydGhvZ29uYWwgb2Zmc2V0IGluIHB4KS4KKyAqIAorICogKGNvZGUpCisgKiBvdmVybGF5LmdldEJvdW5kcyA9IGZ1bmN0aW9uKHN0YXRlKQorICogeworICogICB2YXIgYm91bmRzID0gbXhDZWxsT3ZlcmxheS5wcm90b3R5cGUuZ2V0Qm91bmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgKiAgIAorICogICBpZiAoc3RhdGUudmlldy5ncmFwaC5nZXRNb2RlbCgpLmlzRWRnZShzdGF0ZS5jZWxsKSkKKyAqICAgeworICogICAgIHZhciBwdCA9IHN0YXRlLnZpZXcuZ2V0UG9pbnQoc3RhdGUsIHt4OiAwLCB5OiAwLCByZWxhdGl2ZTogdHJ1ZX0pOworICogICAgIAorICogICAgIGJvdW5kcy54ID0gcHQueCAtIGJvdW5kcy53aWR0aCAvIDI7CisgKiAgICAgYm91bmRzLnkgPSBwdC55IC0gYm91bmRzLmhlaWdodCAvIDI7CisgKiAgIH0KKyAqICAgCisgKiAgIHJldHVybiBib3VuZHM7CisgKiB9OworICogKGVuZCkKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKKyAqIGFzc29jaWF0ZWQgY2VsbC4KKyAqLworbXhDZWxsT3ZlcmxheS5wcm90b3R5cGUuZ2V0Qm91bmRzID0gZnVuY3Rpb24oc3RhdGUpCit7CisJdmFyIGlzRWRnZSA9IHN0YXRlLnZpZXcuZ3JhcGguZ2V0TW9kZWwoKS5pc0VkZ2Uoc3RhdGUuY2VsbCk7CisJdmFyIHMgPSBzdGF0ZS52aWV3LnNjYWxlOworCXZhciBwdCA9IG51bGw7CisKKwl2YXIgdyA9IHRoaXMuaW1hZ2Uud2lkdGg7CisJdmFyIGggPSB0aGlzLmltYWdlLmhlaWdodDsKKwkKKwlpZiAoaXNFZGdlKQorCXsKKwkJdmFyIHB0cyA9IHN0YXRlLmFic29sdXRlUG9pbnRzOworCQkKKwkJaWYgKHB0cy5sZW5ndGggJSAyID09IDEpCisJCXsKKwkJCXB0ID0gcHRzW01hdGguZmxvb3IocHRzLmxlbmd0aCAvIDIpXTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXZhciBpZHggPSBwdHMubGVuZ3RoIC8gMjsKKwkJCXZhciBwMCA9IHB0c1tpZHgtMV07CisJCQl2YXIgcDEgPSBwdHNbaWR4XTsKKwkJCXB0ID0gbmV3IG14UG9pbnQocDAueCArIChwMS54IC0gcDAueCkgLyAyLAorCQkJCXAwLnkgKyAocDEueSAtIHAwLnkpIC8gMik7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJcHQgPSBuZXcgbXhQb2ludCgpOworCQkKKwkJaWYgKHRoaXMuYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fTEVGVCkKKwkJeworCQkJcHQueCA9IHN0YXRlLng7CisJCX0KKwkJZWxzZSBpZiAodGhpcy5hbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9DRU5URVIpCisJCXsKKwkJCXB0LnggPSBzdGF0ZS54ICsgc3RhdGUud2lkdGggLyAyOworCQl9CisJCWVsc2UKKwkJeworCQkJcHQueCA9IHN0YXRlLnggKyBzdGF0ZS53aWR0aDsKKwkJfQorCQkKKwkJaWYgKHRoaXMudmVydGljYWxBbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9UT1ApCisJCXsKKwkJCXB0LnkgPSBzdGF0ZS55OworCQl9CisJCWVsc2UgaWYgKHRoaXMudmVydGljYWxBbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9NSURETEUpCisJCXsKKwkJCXB0LnkgPSBzdGF0ZS55ICsgc3RhdGUuaGVpZ2h0IC8gMjsKKwkJfQorCQllbHNlCisJCXsKKwkJCXB0LnkgPSBzdGF0ZS55ICsgc3RhdGUuaGVpZ2h0OworCQl9CisJfQorCisJcmV0dXJuIG5ldyBteFJlY3RhbmdsZShNYXRoLnJvdW5kKHB0LnggLSAodyAqIHRoaXMuZGVmYXVsdE92ZXJsYXAgLSB0aGlzLm9mZnNldC54KSAqIHMpLAorCQlNYXRoLnJvdW5kKHB0LnkgLSAoaCAqIHRoaXMuZGVmYXVsdE92ZXJsYXAgLSB0aGlzLm9mZnNldC55KSAqIHMpLCB3ICogcywgaCAqIHMpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdG9TdHJpbmcKKyAqIAorICogUmV0dXJucyB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb3ZlcmxheSB0byBiZSB1c2VkIGFzIHRoZQorICogdG9vbHRpcC4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDx0b29sdGlwPi4KKyAqLworbXhDZWxsT3ZlcmxheS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMudG9vbHRpcDsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teENlbGxSZW5kZXJlci5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214Q2VsbFJlbmRlcmVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNmIzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teENlbGxSZW5kZXJlci5qcwpAQCAtMCwwICsxLDE1NTMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14Q2VsbFJlbmRlcmVyCisgKiAKKyAqIFJlbmRlcnMgY2VsbHMgaW50byBhIGRvY3VtZW50IG9iamVjdCBtb2RlbC4gVGhlIDxkZWZhdWx0U2hhcGVzPiBpcyBhIGdsb2JhbAorICogbWFwIG9mIHNoYXBlbmFtZSwgY29uc3RydWN0b3IgcGFpcnMgdGhhdCBpcyB1c2VkIGluIGFsbCBpbnN0YW5jZXMuIFlvdSBjYW4KKyAqIGdldCBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBzaGFwZSBuYW1lcyB1c2luZyB0aGUgZm9sbG93aW5nIGNvZGUuCisgKiAKKyAqIEluIGdlbmVyYWwgdGhlIGNlbGwgcmVuZGVyZXIgaXMgaW4gY2hhcmdlIG9mIGNyZWF0aW5nLCByZWRyYXdpbmcgYW5kCisgKiBkZXN0cm95aW5nIHRoZSBzaGFwZSBhbmQgbGFiZWwgYXNzb2NpYXRlZCB3aXRoIGEgY2VsbCBzdGF0ZSwgYXMgd2VsbCBhcworICogc29tZSBvdGhlciBncmFwaGljYWwgb2JqZWN0cywgbmFtZWx5IGNvbnRyb2xzIGFuZCBvdmVybGF5cy4gVGhlIHNoYXBlCisgKiBoaWVhcmFyY2h5IGluIHRoZSBkaXNwbGF5IChpZS4gdGhlIGhpZXJhcmNoeSBpbiB3aGljaCB0aGUgRE9NIG5vZGVzCisgKiBhcHBlYXIgaW4gdGhlIGRvY3VtZW50KSBkb2VzIG5vdCByZWZsZWN0IHRoZSBjZWxsIGhpZXJhcmNoeS4gVGhlIHNoYXBlcworICogYXJlIGEgKGZsYXQpIHNlcXVlbmNlIG9mIHNoYXBlcyBhbmQgbGFiZWxzIGluc2lkZSB0aGUgZHJhdyBwYW5lIG9mIHRoZQorICogZ3JhcGggdmlldywgd2l0aCBzb21lIGV4Y2VwdGlvbnMsIG5hbWVseSB0aGUgSFRNTCBsYWJlbHMgYmVpbmcgcGxhY2VkCisgKiBkaXJlY3RseSBpbnNpZGUgdGhlIGdyYXBoIGNvbnRhaW5lciBmb3IgY2VydGFpbiBicm93c2Vycy4KKyAqIAorICogKGNvZGUpCisgKiBteExvZy5zaG93KCk7CisgKiBmb3IgKHZhciBpIGluIG14Q2VsbFJlbmRlcmVyLnByb3RvdHlwZS5kZWZhdWx0U2hhcGVzKQorICogeworICogICBteExvZy5kZWJ1ZyhpKTsKKyAqIH0KKyAqIChlbmQpCisgKgorICogQ29uc3RydWN0b3I6IG14Q2VsbFJlbmRlcmVyCisgKiAKKyAqIENvbnN0cnVjdHMgYSBuZXcgY2VsbCByZW5kZXJlciB3aXRoIHRoZSBmb2xsb3dpbmcgYnVpbHQtaW4gc2hhcGVzOgorICogYXJyb3csIHJlY3RhbmdsZSwgZWxsaXBzZSwgcmhvbWJ1cywgaW1hZ2UsIGxpbmUsIGxhYmVsLCBjeWxpbmRlciwKKyAqIHN3aW1sYW5lLCBjb25uZWN0b3IsIGFjdG9yIGFuZCBjbG91ZC4KKyAqLworZnVuY3Rpb24gbXhDZWxsUmVuZGVyZXIoKSB7IH07CisKKy8qKgorICogVmFyaWFibGU6IGRlZmF1bHRFZGdlU2hhcGUKKyAqIAorICogRGVmaW5lcyB0aGUgZGVmYXVsdCBzaGFwZSBmb3IgZWRnZXMuIERlZmF1bHQgaXMgPG14Q29ubmVjdG9yPi4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmRlZmF1bHRFZGdlU2hhcGUgPSBteENvbm5lY3RvcjsKKworLyoqCisgKiBWYXJpYWJsZTogZGVmYXVsdFZlcnRleFNoYXBlCisgKiAKKyAqIERlZmluZXMgdGhlIGRlZmF1bHQgc2hhcGUgZm9yIHZlcnRpY2VzLiBEZWZhdWx0IGlzIDxteFJlY3RhbmdsZVNoYXBlPi4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmRlZmF1bHRWZXJ0ZXhTaGFwZSA9IG14UmVjdGFuZ2xlU2hhcGU7CisKKy8qKgorICogVmFyaWFibGU6IGRlZmF1bHRUZXh0U2hhcGUKKyAqIAorICogRGVmaW5lcyB0aGUgZGVmYXVsdCBzaGFwZSBmb3IgbGFiZWxzLiBEZWZhdWx0IGlzIDxteFRleHQ+LgorICovCitteENlbGxSZW5kZXJlci5wcm90b3R5cGUuZGVmYXVsdFRleHRTaGFwZSA9IG14VGV4dDsKKworLyoqCisgKiBWYXJpYWJsZTogbGVnYWN5Q29udHJvbFBvc2l0aW9uCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgZm9sZGluZyBpY29uIHNob3VsZCBpZ25vcmUgdGhlIGhvcml6b250YWwKKyAqIG9yaWVudGF0aW9uIG9mIGEgc3dpbWxhbmUuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmxlZ2FjeUNvbnRyb2xQb3NpdGlvbiA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGxlZ2FjeVNwYWNpbmcKKyAqIAorICogU3BlY2lmaWVzIGlmIHNwYWNpbmcgYW5kIGxhYmVsIHBvc2l0aW9uIHNob3VsZCBiZSBpZ25vcmVkIGlmIG92ZXJmbG93IGlzCisgKiBmaWxsIG9yIHdpZHRoLiBEZWZhdWx0IGlzIHRydWUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmxpdHkuCisgKi8KK214Q2VsbFJlbmRlcmVyLnByb3RvdHlwZS5sZWdhY3lTcGFjaW5nID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogZGVmYXVsdFNoYXBlcworICogCisgKiBTdGF0aWMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZ2xvYmFsbHkgcmVnaXN0ZXJlZCBzaGFwZXMgd2hpY2ggYXJlCisgKiBrbm93biB0byBhbGwgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MuIEZvciBhZGRpbmcgbmV3IHNoYXBlcyB5b3Ugc2hvdWxkCisgKiB1c2UgdGhlIHN0YXRpYyA8bXhDZWxsUmVuZGVyZXIucmVnaXN0ZXJTaGFwZT4gZnVuY3Rpb24uCisgKi8KK214Q2VsbFJlbmRlcmVyLnByb3RvdHlwZS5kZWZhdWx0U2hhcGVzID0gbmV3IE9iamVjdCgpOworCisvKioKKyAqIFZhcmlhYmxlOiBhbnRpQWxpYXMKKyAqIAorICogQW50aS1hbGlhc2luZyBvcHRpb24gZm9yIG5ldyBzaGFwZXMuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmFudGlBbGlhcyA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGZvcmNlQ29udHJvbENsaWNrSGFuZGxlcgorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIGdyYXBoIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSBjb250cm9sCisgKiBjbGljayBoYW5kbGVyICh0byBhbGxvdyBmb2xkaW5nIGluIGRpc2FibGVkIGdyYXBocykuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214Q2VsbFJlbmRlcmVyLnByb3RvdHlwZS5mb3JjZUNvbnRyb2xDbGlja0hhbmRsZXIgPSBmYWxzZTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVnaXN0ZXJTaGFwZQorICogCisgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIGNvbnN0cnVjdG9yIHVuZGVyIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgaW5zdGFuY2UKKyAqIG9mIHRoZSByZW5kZXJlci4KKyAqIAorICogRXhhbXBsZToKKyAqIAorICogKGNvZGUpCisgKiBteENlbGxSZW5kZXJlci5yZWdpc3RlclNoYXBlKG14Q29uc3RhbnRzLlNIQVBFX1JFQ1RBTkdMRSwgbXhSZWN0YW5nbGVTaGFwZSk7CisgKiAoZW5kKQorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBrZXkgLSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzaGFwZSBuYW1lLgorICogc2hhcGUgLSBDb25zdHJ1Y3RvciBvZiB0aGUgPG14U2hhcGU+IHN1YmNsYXNzLgorICovCitteENlbGxSZW5kZXJlci5yZWdpc3RlclNoYXBlID0gZnVuY3Rpb24oa2V5LCBzaGFwZSkKK3sKKwlteENlbGxSZW5kZXJlci5wcm90b3R5cGUuZGVmYXVsdFNoYXBlc1trZXldID0gc2hhcGU7Cit9OworCisvLyBBZGRzIGRlZmF1bHQgc2hhcGVzIGludG8gdGhlIGRlZmF1bHQgc2hhcGVzIGFycmF5CitteENlbGxSZW5kZXJlci5yZWdpc3RlclNoYXBlKG14Q29uc3RhbnRzLlNIQVBFX1JFQ1RBTkdMRSwgbXhSZWN0YW5nbGVTaGFwZSk7CitteENlbGxSZW5kZXJlci5yZWdpc3RlclNoYXBlKG14Q29uc3RhbnRzLlNIQVBFX0VMTElQU0UsIG14RWxsaXBzZSk7CitteENlbGxSZW5kZXJlci5yZWdpc3RlclNoYXBlKG14Q29uc3RhbnRzLlNIQVBFX1JIT01CVVMsIG14UmhvbWJ1cyk7CitteENlbGxSZW5kZXJlci5yZWdpc3RlclNoYXBlKG14Q29uc3RhbnRzLlNIQVBFX0NZTElOREVSLCBteEN5bGluZGVyKTsKK214Q2VsbFJlbmRlcmVyLnJlZ2lzdGVyU2hhcGUobXhDb25zdGFudHMuU0hBUEVfQ09OTkVDVE9SLCBteENvbm5lY3Rvcik7CitteENlbGxSZW5kZXJlci5yZWdpc3RlclNoYXBlKG14Q29uc3RhbnRzLlNIQVBFX0FDVE9SLCBteEFjdG9yKTsKK214Q2VsbFJlbmRlcmVyLnJlZ2lzdGVyU2hhcGUobXhDb25zdGFudHMuU0hBUEVfVFJJQU5HTEUsIG14VHJpYW5nbGUpOworbXhDZWxsUmVuZGVyZXIucmVnaXN0ZXJTaGFwZShteENvbnN0YW50cy5TSEFQRV9IRVhBR09OLCBteEhleGFnb24pOworbXhDZWxsUmVuZGVyZXIucmVnaXN0ZXJTaGFwZShteENvbnN0YW50cy5TSEFQRV9DTE9VRCwgbXhDbG91ZCk7CitteENlbGxSZW5kZXJlci5yZWdpc3RlclNoYXBlKG14Q29uc3RhbnRzLlNIQVBFX0xJTkUsIG14TGluZSk7CitteENlbGxSZW5kZXJlci5yZWdpc3RlclNoYXBlKG14Q29uc3RhbnRzLlNIQVBFX0FSUk9XLCBteEFycm93KTsKK214Q2VsbFJlbmRlcmVyLnJlZ2lzdGVyU2hhcGUobXhDb25zdGFudHMuU0hBUEVfQVJST1dfQ09OTkVDVE9SLCBteEFycm93Q29ubmVjdG9yKTsKK214Q2VsbFJlbmRlcmVyLnJlZ2lzdGVyU2hhcGUobXhDb25zdGFudHMuU0hBUEVfRE9VQkxFX0VMTElQU0UsIG14RG91YmxlRWxsaXBzZSk7CitteENlbGxSZW5kZXJlci5yZWdpc3RlclNoYXBlKG14Q29uc3RhbnRzLlNIQVBFX1NXSU1MQU5FLCBteFN3aW1sYW5lKTsKK214Q2VsbFJlbmRlcmVyLnJlZ2lzdGVyU2hhcGUobXhDb25zdGFudHMuU0hBUEVfSU1BR0UsIG14SW1hZ2VTaGFwZSk7CitteENlbGxSZW5kZXJlci5yZWdpc3RlclNoYXBlKG14Q29uc3RhbnRzLlNIQVBFX0xBQkVMLCBteExhYmVsKTsKKworLyoqCisgKiBGdW5jdGlvbjogaW5pdGlhbGl6ZVNoYXBlCisgKiAKKyAqIEluaXRpYWxpemVzIHRoZSBzaGFwZSBpbiB0aGUgZ2l2ZW4gc3RhdGUgYnkgY2FsbGluZyBpdHMgaW5pdCBtZXRob2Qgd2l0aAorICogdGhlIGNvcnJlY3QgY29udGFpbmVyIGFmdGVyIGNvbmZpZ3VyaW5nIGl0IHVzaW5nIDxjb25maWd1cmVTaGFwZT4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiBmb3Igd2hpY2ggdGhlIHNoYXBlIHNob3VsZCBiZSBpbml0aWFsaXplZC4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmluaXRpYWxpemVTaGFwZSA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXN0YXRlLnNoYXBlLmRpYWxlY3QgPSBzdGF0ZS52aWV3LmdyYXBoLmRpYWxlY3Q7CisJdGhpcy5jb25maWd1cmVTaGFwZShzdGF0ZSk7CisJc3RhdGUuc2hhcGUuaW5pdChzdGF0ZS52aWV3LmdldERyYXdQYW5lKCkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlU2hhcGUKKyAqIAorICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgc2hhcGUgZm9yIHRoZSBnaXZlbiBjZWxsIHN0YXRlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gZm9yIHdoaWNoIHRoZSBzaGFwZSBzaG91bGQgYmUgY3JlYXRlZC4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZVNoYXBlID0gZnVuY3Rpb24oc3RhdGUpCit7CisJdmFyIHNoYXBlID0gbnVsbDsKKwkKKwlpZiAoc3RhdGUuc3R5bGUgIT0gbnVsbCkKKwl7CisJCS8vIENoZWNrcyBpZiB0aGVyZSBpcyBhIHN0ZW5jaWwgZm9yIHRoZSBuYW1lIGFuZCBjcmVhdGVzCisJCS8vIGEgc2hhcGUgaW5zdGFuY2UgZm9yIHRoZSBzdGVuY2lsIGlmIG9uZSBleGlzdHMKKwkJdmFyIHN0ZW5jaWwgPSBteFN0ZW5jaWxSZWdpc3RyeS5nZXRTdGVuY2lsKHN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1NIQVBFXSk7CisJCQorCQlpZiAoc3RlbmNpbCAhPSBudWxsKQorCQl7CisJCQlzaGFwZSA9IG5ldyBteFNoYXBlKHN0ZW5jaWwpOworCQl9CisJCWVsc2UKKwkJeworCQkJdmFyIGN0b3IgPSB0aGlzLmdldFNoYXBlQ29uc3RydWN0b3Ioc3RhdGUpOworCQkJc2hhcGUgPSBuZXcgY3RvcigpOworCQl9CisJfQorCQorCXJldHVybiBzaGFwZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUluZGljYXRvclNoYXBlCisgKiAKKyAqIENyZWF0ZXMgdGhlIGluZGljYXRvciBzaGFwZSBmb3IgdGhlIGdpdmVuIGNlbGwgc3RhdGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiBmb3Igd2hpY2ggdGhlIGluZGljYXRvciBzaGFwZSBzaG91bGQgYmUgY3JlYXRlZC4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZUluZGljYXRvclNoYXBlID0gZnVuY3Rpb24oc3RhdGUpCit7CisJc3RhdGUuc2hhcGUuaW5kaWNhdG9yU2hhcGUgPSB0aGlzLmdldFNoYXBlKHN0YXRlLnZpZXcuZ3JhcGguZ2V0SW5kaWNhdG9yU2hhcGUoc3RhdGUpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFNoYXBlCisgKiAKKyAqIFJldHVybnMgdGhlIHNoYXBlIGZvciB0aGUgZ2l2ZW4gbmFtZSBmcm9tIDxkZWZhdWx0U2hhcGVzPi4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmdldFNoYXBlID0gZnVuY3Rpb24obmFtZSkKK3sKKwlyZXR1cm4gKG5hbWUgIT0gbnVsbCkgPyBteENlbGxSZW5kZXJlci5wcm90b3R5cGUuZGVmYXVsdFNoYXBlc1tuYW1lXSA6IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTaGFwZUNvbnN0cnVjdG9yCisgKiAKKyAqIFJldHVybnMgdGhlIGNvbnN0cnVjdG9yIHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBzaGFwZS4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmdldFNoYXBlQ29uc3RydWN0b3IgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwl2YXIgY3RvciA9IHRoaXMuZ2V0U2hhcGUoc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU0hBUEVdKTsKKwkKKwlpZiAoY3RvciA9PSBudWxsKQorCXsKKwkJY3RvciA9IChzdGF0ZS52aWV3LmdyYXBoLmdldE1vZGVsKCkuaXNFZGdlKHN0YXRlLmNlbGwpKSA/CisJCQl0aGlzLmRlZmF1bHRFZGdlU2hhcGUgOiB0aGlzLmRlZmF1bHRWZXJ0ZXhTaGFwZTsKKwl9CisJCisJcmV0dXJuIGN0b3I7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjb25maWd1cmVTaGFwZQorICogCisgKiBDb25maWd1cmVzIHRoZSBzaGFwZSBmb3IgdGhlIGdpdmVuIGNlbGwgc3RhdGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiBmb3Igd2hpY2ggdGhlIHNoYXBlIHNob3VsZCBiZSBjb25maWd1cmVkLgorICovCitteENlbGxSZW5kZXJlci5wcm90b3R5cGUuY29uZmlndXJlU2hhcGUgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlzdGF0ZS5zaGFwZS5hcHBseShzdGF0ZSk7CisJc3RhdGUuc2hhcGUuaW1hZ2UgPSBzdGF0ZS52aWV3LmdyYXBoLmdldEltYWdlKHN0YXRlKTsKKwlzdGF0ZS5zaGFwZS5pbmRpY2F0b3JDb2xvciA9IHN0YXRlLnZpZXcuZ3JhcGguZ2V0SW5kaWNhdG9yQ29sb3Ioc3RhdGUpOworCXN0YXRlLnNoYXBlLmluZGljYXRvclN0cm9rZUNvbG9yID0gc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfSU5ESUNBVE9SX1NUUk9LRUNPTE9SXTsKKwlzdGF0ZS5zaGFwZS5pbmRpY2F0b3JHcmFkaWVudENvbG9yID0gc3RhdGUudmlldy5ncmFwaC5nZXRJbmRpY2F0b3JHcmFkaWVudENvbG9yKHN0YXRlKTsKKwlzdGF0ZS5zaGFwZS5pbmRpY2F0b3JEaXJlY3Rpb24gPSBzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9JTkRJQ0FUT1JfRElSRUNUSU9OXTsKKwlzdGF0ZS5zaGFwZS5pbmRpY2F0b3JJbWFnZSA9IHN0YXRlLnZpZXcuZ3JhcGguZ2V0SW5kaWNhdG9ySW1hZ2Uoc3RhdGUpOworCisJdGhpcy5wb3N0Q29uZmlndXJlU2hhcGUoc3RhdGUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcG9zdENvbmZpZ3VyZVNoYXBlCisgKiAKKyAqIFJlcGxhY2VzIGFueSByZXNlcnZlZCB3b3JkcyB1c2VkIGZvciBhdHRyaWJ1dGVzLCBlZy4gaW5oZXJpdCwKKyAqIGluZGljYXRlZCBvciBzd2ltbGFuZSBmb3IgY29sb3JzIGluIHRoZSBzaGFwZSBmb3IgdGhlIGdpdmVuIHN0YXRlLgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXNvbHZlcyB0aGVzZSBrZXl3b3JkcyBvbiB0aGUgZmlsbCwgc3Ryb2tlCisgKiBhbmQgZ3JhZGllbnQgY29sb3Iga2V5cy4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLnBvc3RDb25maWd1cmVTaGFwZSA9IGZ1bmN0aW9uKHN0YXRlKQoreworCWlmIChzdGF0ZS5zaGFwZSAhPSBudWxsKQorCXsKKwkJdGhpcy5yZXNvbHZlQ29sb3Ioc3RhdGUsICdpbmRpY2F0b3JDb2xvcicsIG14Q29uc3RhbnRzLlNUWUxFX0ZJTExDT0xPUik7CisJCXRoaXMucmVzb2x2ZUNvbG9yKHN0YXRlLCAnaW5kaWNhdG9yR3JhZGllbnRDb2xvcicsIG14Q29uc3RhbnRzLlNUWUxFX0dSQURJRU5UQ09MT1IpOworCQl0aGlzLnJlc29sdmVDb2xvcihzdGF0ZSwgJ2ZpbGwnLCBteENvbnN0YW50cy5TVFlMRV9GSUxMQ09MT1IpOworCQl0aGlzLnJlc29sdmVDb2xvcihzdGF0ZSwgJ3N0cm9rZScsIG14Q29uc3RhbnRzLlNUWUxFX1NUUk9LRUNPTE9SKTsKKwkJdGhpcy5yZXNvbHZlQ29sb3Ioc3RhdGUsICdncmFkaWVudCcsIG14Q29uc3RhbnRzLlNUWUxFX0dSQURJRU5UQ09MT1IpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJlc29sdmVDb2xvcgorICogCisgKiBSZXNvbHZlcyBzcGVjaWFsIGtleXdvcmRzICdpbmhlcml0JywgJ2luZGljYXRlZCcgYW5kICdzd2ltbGFuZScgYW5kIHNldHMKKyAqIHRoZSByZXNwZWN0aXZlIGNvbG9yIG9uIHRoZSBzaGFwZS4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLnJlc29sdmVDb2xvciA9IGZ1bmN0aW9uKHN0YXRlLCBmaWVsZCwga2V5KQoreworCXZhciB2YWx1ZSA9IHN0YXRlLnNoYXBlW2ZpZWxkXTsKKwl2YXIgZ3JhcGggPSBzdGF0ZS52aWV3LmdyYXBoOworCXZhciByZWZlcmVuY2VkID0gbnVsbDsKKwkKKwlpZiAodmFsdWUgPT0gJ2luaGVyaXQnKQorCXsKKwkJcmVmZXJlbmNlZCA9IGdyYXBoLm1vZGVsLmdldFBhcmVudChzdGF0ZS5jZWxsKTsKKwl9CisJZWxzZSBpZiAodmFsdWUgPT0gJ3N3aW1sYW5lJykKKwl7CisJCWlmIChncmFwaC5tb2RlbC5nZXRUZXJtaW5hbChzdGF0ZS5jZWxsLCBmYWxzZSkgIT0gbnVsbCkKKwkJeworCQkJcmVmZXJlbmNlZCA9IGdyYXBoLm1vZGVsLmdldFRlcm1pbmFsKHN0YXRlLmNlbGwsIGZhbHNlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJlZmVyZW5jZWQgPSBzdGF0ZS5jZWxsOworCQl9CisJCQorCQlyZWZlcmVuY2VkID0gZ3JhcGguZ2V0U3dpbWxhbmUocmVmZXJlbmNlZCk7CisJCWtleSA9IGdyYXBoLnN3aW1sYW5lSW5kaWNhdG9yQ29sb3JBdHRyaWJ1dGU7CisJfQorCWVsc2UgaWYgKHZhbHVlID09ICdpbmRpY2F0ZWQnKQorCXsKKwkJc3RhdGUuc2hhcGVbZmllbGRdID0gc3RhdGUuc2hhcGUuaW5kaWNhdG9yQ29sb3I7CisJfQorCQorCWlmIChyZWZlcmVuY2VkICE9IG51bGwpCisJeworCQl2YXIgcnN0YXRlID0gZ3JhcGguZ2V0VmlldygpLmdldFN0YXRlKHJlZmVyZW5jZWQpOworCQlzdGF0ZS5zaGFwZVtmaWVsZF0gPSBudWxsOworCisJCWlmIChyc3RhdGUgIT0gbnVsbCkKKwkJeworCQkJaWYgKHJzdGF0ZS5zaGFwZSAhPSBudWxsICYmIGZpZWxkICE9ICdpbmRpY2F0b3JDb2xvcicpCisJCQl7CisJCQkJc3RhdGUuc2hhcGVbZmllbGRdID0gcnN0YXRlLnNoYXBlW2ZpZWxkXTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzdGF0ZS5zaGFwZVtmaWVsZF0gPSByc3RhdGUuc3R5bGVba2V5XTsKKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldExhYmVsVmFsdWUKKyAqIAorICogUmV0dXJucyB0aGUgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlIGxhYmVsLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gZm9yIHdoaWNoIHRoZSBsYWJlbCBzaG91bGQgYmUgY3JlYXRlZC4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmdldExhYmVsVmFsdWUgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlyZXR1cm4gc3RhdGUudmlldy5ncmFwaC5nZXRMYWJlbChzdGF0ZS5jZWxsKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUxhYmVsCisgKiAKKyAqIENyZWF0ZXMgdGhlIGxhYmVsIGZvciB0aGUgZ2l2ZW4gY2VsbCBzdGF0ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IGZvciB3aGljaCB0aGUgbGFiZWwgc2hvdWxkIGJlIGNyZWF0ZWQuCisgKi8KK214Q2VsbFJlbmRlcmVyLnByb3RvdHlwZS5jcmVhdGVMYWJlbCA9IGZ1bmN0aW9uKHN0YXRlLCB2YWx1ZSkKK3sKKwl2YXIgZ3JhcGggPSBzdGF0ZS52aWV3LmdyYXBoOworCXZhciBpc0VkZ2UgPSBncmFwaC5nZXRNb2RlbCgpLmlzRWRnZShzdGF0ZS5jZWxsKTsKKwkKKwlpZiAoc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRk9OVFNJWkVdID4gMCB8fCBzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9GT05UU0laRV0gPT0gbnVsbCkKKwl7CisJCS8vIEF2b2lkcyB1c2luZyBET00gbm9kZSBmb3IgZW1wdHkgbGFiZWxzCisJCXZhciBpc0ZvcmNlSHRtbCA9IChncmFwaC5pc0h0bWxMYWJlbChzdGF0ZS5jZWxsKSB8fCAodmFsdWUgIT0gbnVsbCAmJiBteFV0aWxzLmlzTm9kZSh2YWx1ZSkpKTsKKworCQlzdGF0ZS50ZXh0ID0gbmV3IHRoaXMuZGVmYXVsdFRleHRTaGFwZSh2YWx1ZSwgbmV3IG14UmVjdGFuZ2xlKCksCisJCQkJKHN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0FMSUdOXSB8fCBteENvbnN0YW50cy5BTElHTl9DRU5URVIpLAorCQkJCWdyYXBoLmdldFZlcnRpY2FsQWxpZ24oc3RhdGUpLAorCQkJCXN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0ZPTlRDT0xPUl0sCisJCQkJc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRk9OVEZBTUlMWV0sCisJCQkJc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRk9OVFNJWkVdLAorCQkJCXN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0ZPTlRTVFlMRV0sCisJCQkJc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU1BBQ0lOR10sCisJCQkJc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU1BBQ0lOR19UT1BdLAorCQkJCXN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1NQQUNJTkdfUklHSFRdLAorCQkJCXN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1NQQUNJTkdfQk9UVE9NXSwKKwkJCQlzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9TUEFDSU5HX0xFRlRdLAorCQkJCXN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0hPUklaT05UQUxdLAorCQkJCXN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0xBQkVMX0JBQ0tHUk9VTkRDT0xPUl0sCisJCQkJc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfTEFCRUxfQk9SREVSQ09MT1JdLAorCQkJCWdyYXBoLmlzV3JhcHBpbmcoc3RhdGUuY2VsbCkgJiYgZ3JhcGguaXNIdG1sTGFiZWwoc3RhdGUuY2VsbCksCisJCQkJZ3JhcGguaXNMYWJlbENsaXBwZWQoc3RhdGUuY2VsbCksCisJCQkJc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfT1ZFUkZMT1ddLAorCQkJCXN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0xBQkVMX1BBRERJTkddLAorCQkJCW14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1RFWFRfRElSRUNUSU9OLCBteENvbnN0YW50cy5ERUZBVUxUX1RFWFRfRElSRUNUSU9OKSk7CisJCXN0YXRlLnRleHQub3BhY2l0eSA9IG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1RFWFRfT1BBQ0lUWSwgMTAwKTsKKwkJc3RhdGUudGV4dC5kaWFsZWN0ID0gKGlzRm9yY2VIdG1sKSA/IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1RSSUNUSFRNTCA6IHN0YXRlLnZpZXcuZ3JhcGguZGlhbGVjdDsKKwkJc3RhdGUudGV4dC5zdHlsZSA9IHN0YXRlLnN0eWxlOworCQlzdGF0ZS50ZXh0LnN0YXRlID0gc3RhdGU7CisJCXRoaXMuaW5pdGlhbGl6ZUxhYmVsKHN0YXRlLCBzdGF0ZS50ZXh0KTsKKwkJCisJCS8vIFdvcmthcm91bmQgZm9yIHRvdWNoIGRldmljZXMgcm91dGluZyBhbGwgZXZlbnRzIGZvciBhIG1vdXNlIGdlc3R1cmUKKwkJLy8gKGRvd24sIG1vdmUsIHVwKSB2aWEgdGhlIGluaXRpYWwgRE9NIG5vZGUuIElFIGFkZGl0aW9uYWxseSByZWRpcmVjdHMKKwkJLy8gdGhlIGV2ZW50IHZpYSB0aGUgaW5pdGlhbCBET00gbm9kZSBidXQgdGhlIGV2ZW50IHNvdXJjZSBpcyB0aGUgbm9kZQorCQkvLyB1bmRlciB0aGUgbW91c2UsIHNvIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBpcyB0aGUgY2FzZSBhbmQgZm9yY2UKKwkJLy8gZ2V0Q2VsbEF0IGZvciB0aGUgc3Vic2VxdWVudCBtb3VzZU1vdmVzIGFuZCB0aGUgZmluYWwgbW91c2VVcC4KKwkJdmFyIGZvcmNlR2V0Q2VsbCA9IGZhbHNlOworCQkKKwkJdmFyIGdldFN0YXRlID0gZnVuY3Rpb24oZXZ0KQorCQl7CisJCQl2YXIgcmVzdWx0ID0gc3RhdGU7CisKKwkJCWlmIChteENsaWVudC5JU19UT1VDSCB8fCBmb3JjZUdldENlbGwpCisJCQl7CisJCQkJdmFyIHggPSBteEV2ZW50LmdldENsaWVudFgoZXZ0KTsKKwkJCQl2YXIgeSA9IG14RXZlbnQuZ2V0Q2xpZW50WShldnQpOworCQkJCQorCQkJCS8vIERpc3BhdGNoZXMgdGhlIGRyb3AgZXZlbnQgdG8gdGhlIGdyYXBoIHdoaWNoCisJCQkJLy8gY29uc3VtZXMgYW5kIGV4ZWN1dGVzIHRoZSBzb3VyY2UgZnVuY3Rpb24KKwkJCQl2YXIgcHQgPSBteFV0aWxzLmNvbnZlcnRQb2ludChncmFwaC5jb250YWluZXIsIHgsIHkpOworCQkJCXJlc3VsdCA9IGdyYXBoLnZpZXcuZ2V0U3RhdGUoZ3JhcGguZ2V0Q2VsbEF0KHB0LngsIHB0LnkpKTsKKwkJCX0KKwkJCQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJfTsKKwkJCisJCS8vIFRPRE86IEFkZCBoYW5kbGluZyBmb3Igc3BlY2lhbCB0b3VjaCBkZXZpY2UgZ2VzdHVyZXMKKwkJbXhFdmVudC5hZGRHZXN0dXJlTGlzdGVuZXJzKHN0YXRlLnRleHQubm9kZSwKKwkJCW14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJCQl7CisJCQkJaWYgKHRoaXMuaXNMYWJlbEV2ZW50KHN0YXRlLCBldnQpKQorCQkJCXsKKwkJCQkJZ3JhcGguZmlyZU1vdXNlRXZlbnQobXhFdmVudC5NT1VTRV9ET1dOLCBuZXcgbXhNb3VzZUV2ZW50KGV2dCwgc3RhdGUpKTsKKwkJCQkJZm9yY2VHZXRDZWxsID0gZ3JhcGguZGlhbGVjdCAhPSBteENvbnN0YW50cy5ESUFMRUNUX1NWRyAmJgorCQkJCQkJbXhFdmVudC5nZXRTb3VyY2UoZXZ0KS5ub2RlTmFtZSA9PSAnSU1HJzsKKwkJCQl9CisJCQl9KSwKKwkJCW14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJCQl7CisJCQkJaWYgKHRoaXMuaXNMYWJlbEV2ZW50KHN0YXRlLCBldnQpKQorCQkJCXsKKwkJCQkJZ3JhcGguZmlyZU1vdXNlRXZlbnQobXhFdmVudC5NT1VTRV9NT1ZFLCBuZXcgbXhNb3VzZUV2ZW50KGV2dCwgZ2V0U3RhdGUoZXZ0KSkpOworCQkJCX0KKwkJCX0pLAorCQkJbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwkJCXsKKwkJCQlpZiAodGhpcy5pc0xhYmVsRXZlbnQoc3RhdGUsIGV2dCkpCisJCQkJeworCQkJCQlncmFwaC5maXJlTW91c2VFdmVudChteEV2ZW50Lk1PVVNFX1VQLCBuZXcgbXhNb3VzZUV2ZW50KGV2dCwgZ2V0U3RhdGUoZXZ0KSkpOworCQkJCQlmb3JjZUdldENlbGwgPSBmYWxzZTsKKwkJCQl9CisJCQl9KQorCQkpOworCisJCS8vIFVzZXMgZG91YmxlIGNsaWNrIHRpbWVvdXQgaW4gbXhHcmFwaCBmb3IgcXVpcmtzIG1vZGUKKwkJaWYgKGdyYXBoLm5hdGl2ZURibENsaWNrRW5hYmxlZCkKKwkJeworCQkJbXhFdmVudC5hZGRMaXN0ZW5lcihzdGF0ZS50ZXh0Lm5vZGUsICdkYmxjbGljaycsCisJCQkJbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwkJCQl7CisJCQkJCWlmICh0aGlzLmlzTGFiZWxFdmVudChzdGF0ZSwgZXZ0KSkKKwkJCQkJeworCQkJCQkJZ3JhcGguZGJsQ2xpY2soZXZ0LCBzdGF0ZS5jZWxsKTsKKwkJCQkJCW14RXZlbnQuY29uc3VtZShldnQpOworCQkJCQl9CisJCQkJfSkKKwkJCSk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbml0aWFsaXplTGFiZWwKKyAqIAorICogSW5pdGlhaWx6ZXMgdGhlIGxhYmVsIHdpdGggYSBzdWl0YWJsZSBjb250YWluZXIuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB3aG9zZSBsYWJlbCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQuCisgKi8KK214Q2VsbFJlbmRlcmVyLnByb3RvdHlwZS5pbml0aWFsaXplTGFiZWwgPSBmdW5jdGlvbihzdGF0ZSwgc2hhcGUpCit7CisJaWYgKG14Q2xpZW50LklTX1NWRyAmJiBteENsaWVudC5OT19GTyAmJiBzaGFwZS5kaWFsZWN0ICE9IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHKQorCXsKKwkJc2hhcGUuaW5pdChzdGF0ZS52aWV3LmdyYXBoLmNvbnRhaW5lcik7CisJfQorCWVsc2UKKwl7CisJCXNoYXBlLmluaXQoc3RhdGUudmlldy5nZXREcmF3UGFuZSgpKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVDZWxsT3ZlcmxheXMKKyAqIAorICogQ3JlYXRlcyB0aGUgYWN0dWFsIHNoYXBlIGZvciBzaG93aW5nIHRoZSBvdmVybGF5IGZvciB0aGUgZ2l2ZW4gY2VsbCBzdGF0ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IGZvciB3aGljaCB0aGUgb3ZlcmxheSBzaG91bGQgYmUgY3JlYXRlZC4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZUNlbGxPdmVybGF5cyA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXZhciBncmFwaCA9IHN0YXRlLnZpZXcuZ3JhcGg7CisJdmFyIG92ZXJsYXlzID0gZ3JhcGguZ2V0Q2VsbE92ZXJsYXlzKHN0YXRlLmNlbGwpOworCXZhciBkaWN0ID0gbnVsbDsKKwkKKwlpZiAob3ZlcmxheXMgIT0gbnVsbCkKKwl7CisJCWRpY3QgPSBuZXcgbXhEaWN0aW9uYXJ5KCk7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IG92ZXJsYXlzLmxlbmd0aDsgaSsrKQorCQl7CisJCQl2YXIgc2hhcGUgPSAoc3RhdGUub3ZlcmxheXMgIT0gbnVsbCkgPyBzdGF0ZS5vdmVybGF5cy5yZW1vdmUob3ZlcmxheXNbaV0pIDogbnVsbDsKKwkJCQorCQkJaWYgKHNoYXBlID09IG51bGwpCisJCQl7CisJCQkJdmFyIHRtcCA9IG5ldyBteEltYWdlU2hhcGUobmV3IG14UmVjdGFuZ2xlKCksIG92ZXJsYXlzW2ldLmltYWdlLnNyYyk7CisJCQkJdG1wLmRpYWxlY3QgPSBzdGF0ZS52aWV3LmdyYXBoLmRpYWxlY3Q7CisJCQkJdG1wLnByZXNlcnZlSW1hZ2VBc3BlY3QgPSBmYWxzZTsKKwkJCQl0bXAub3ZlcmxheSA9IG92ZXJsYXlzW2ldOworCQkJCXRoaXMuaW5pdGlhbGl6ZU92ZXJsYXkoc3RhdGUsIHRtcCk7CisJCQkJdGhpcy5pbnN0YWxsQ2VsbE92ZXJsYXlMaXN0ZW5lcnMoc3RhdGUsIG92ZXJsYXlzW2ldLCB0bXApOworCQorCQkJCWlmIChvdmVybGF5c1tpXS5jdXJzb3IgIT0gbnVsbCkKKwkJCQl7CisJCQkJCXRtcC5ub2RlLnN0eWxlLmN1cnNvciA9IG92ZXJsYXlzW2ldLmN1cnNvcjsKKwkJCQl9CisJCQkJCisJCQkJZGljdC5wdXQob3ZlcmxheXNbaV0sIHRtcCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZGljdC5wdXQob3ZlcmxheXNbaV0sIHNoYXBlKTsKKwkJCX0KKwkJfQorCX0KKwkKKwkvLyBSZW1vdmVzIHVudXNlZAorCWlmIChzdGF0ZS5vdmVybGF5cyAhPSBudWxsKQorCXsKKwkJc3RhdGUub3ZlcmxheXMudmlzaXQoZnVuY3Rpb24oaWQsIHNoYXBlKQorCQl7CisJCQlzaGFwZS5kZXN0cm95KCk7CisJCX0pOworCX0KKwkKKwlzdGF0ZS5vdmVybGF5cyA9IGRpY3Q7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbml0aWFsaXplT3ZlcmxheQorICogCisgKiBJbml0aWFsaXplcyB0aGUgZ2l2ZW4gb3ZlcmxheS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IGZvciB3aGljaCB0aGUgb3ZlcmxheSBzaG91bGQgYmUgY3JlYXRlZC4KKyAqIG92ZXJsYXkgLSA8bXhJbWFnZVNoYXBlPiB0aGF0IHJlcHJlc2VudHMgdGhlIG92ZXJsYXkuCisgKi8KK214Q2VsbFJlbmRlcmVyLnByb3RvdHlwZS5pbml0aWFsaXplT3ZlcmxheSA9IGZ1bmN0aW9uKHN0YXRlLCBvdmVybGF5KQoreworCW92ZXJsYXkuaW5pdChzdGF0ZS52aWV3LmdldE92ZXJsYXlQYW5lKCkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaW5zdGFsbE92ZXJsYXlMaXN0ZW5lcnMKKyAqIAorICogSW5zdGFsbHMgdGhlIGxpc3RlbmVycyBmb3IgdGhlIGdpdmVuIDxteENlbGxTdGF0ZT4sIDxteENlbGxPdmVybGF5PiBhbmQKKyAqIDxteFNoYXBlPiB0aGF0IHJlcHJlc2VudHMgdGhlIG92ZXJsYXkuCisgKi8KK214Q2VsbFJlbmRlcmVyLnByb3RvdHlwZS5pbnN0YWxsQ2VsbE92ZXJsYXlMaXN0ZW5lcnMgPSBmdW5jdGlvbihzdGF0ZSwgb3ZlcmxheSwgc2hhcGUpCit7CisJdmFyIGdyYXBoICA9IHN0YXRlLnZpZXcuZ3JhcGg7CisJCisJbXhFdmVudC5hZGRMaXN0ZW5lcihzaGFwZS5ub2RlLCAnY2xpY2snLCBmdW5jdGlvbiAoZXZ0KQorCXsKKwkJaWYgKGdyYXBoLmlzRWRpdGluZygpKQorCQl7CisJCQlncmFwaC5zdG9wRWRpdGluZyghZ3JhcGguaXNJbnZva2VzU3RvcENlbGxFZGl0aW5nKCkpOworCQl9CisJCQorCQlvdmVybGF5LmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LkNMSUNLLAorCQkJCSdldmVudCcsIGV2dCwgJ2NlbGwnLCBzdGF0ZS5jZWxsKSk7CisJfSk7CisJCisJbXhFdmVudC5hZGRHZXN0dXJlTGlzdGVuZXJzKHNoYXBlLm5vZGUsCisJCWZ1bmN0aW9uIChldnQpCisJCXsKKwkJCW14RXZlbnQuY29uc3VtZShldnQpOworCQl9LAorCQlmdW5jdGlvbiAoZXZ0KQorCQl7CisJCQlncmFwaC5maXJlTW91c2VFdmVudChteEV2ZW50Lk1PVVNFX01PVkUsCisJCQkJbmV3IG14TW91c2VFdmVudChldnQsIHN0YXRlKSk7CisJCX0pOworCQorCWlmIChteENsaWVudC5JU19UT1VDSCkKKwl7CisJCW14RXZlbnQuYWRkTGlzdGVuZXIoc2hhcGUubm9kZSwgJ3RvdWNoZW5kJywgZnVuY3Rpb24gKGV2dCkKKwkJeworCQkJb3ZlcmxheS5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5DTElDSywKKwkJCQkJJ2V2ZW50JywgZXZ0LCAnY2VsbCcsIHN0YXRlLmNlbGwpKTsKKwkJfSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlQ29udHJvbAorICogCisgKiBDcmVhdGVzIHRoZSBjb250cm9sIGZvciB0aGUgZ2l2ZW4gY2VsbCBzdGF0ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IGZvciB3aGljaCB0aGUgY29udHJvbCBzaG91bGQgYmUgY3JlYXRlZC4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZUNvbnRyb2wgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwl2YXIgZ3JhcGggPSBzdGF0ZS52aWV3LmdyYXBoOworCXZhciBpbWFnZSA9IGdyYXBoLmdldEZvbGRpbmdJbWFnZShzdGF0ZSk7CisJCisJaWYgKGdyYXBoLmZvbGRpbmdFbmFibGVkICYmIGltYWdlICE9IG51bGwpCisJeworCQlpZiAoc3RhdGUuY29udHJvbCA9PSBudWxsKQorCQl7CisJCQl2YXIgYiA9IG5ldyBteFJlY3RhbmdsZSgwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0KTsKKwkJCXN0YXRlLmNvbnRyb2wgPSBuZXcgbXhJbWFnZVNoYXBlKGIsIGltYWdlLnNyYyk7CisJCQlzdGF0ZS5jb250cm9sLnByZXNlcnZlSW1hZ2VBc3BlY3QgPSBmYWxzZTsKKwkJCXN0YXRlLmNvbnRyb2wuZGlhbGVjdCA9IGdyYXBoLmRpYWxlY3Q7CisKKwkJCXRoaXMuaW5pdENvbnRyb2woc3RhdGUsIHN0YXRlLmNvbnRyb2wsIHRydWUsIHRoaXMuY3JlYXRlQ29udHJvbENsaWNrSGFuZGxlcihzdGF0ZSkpOworCQl9CisJfQorCWVsc2UgaWYgKHN0YXRlLmNvbnRyb2wgIT0gbnVsbCkKKwl7CisJCXN0YXRlLmNvbnRyb2wuZGVzdHJveSgpOworCQlzdGF0ZS5jb250cm9sID0gbnVsbDsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVDb250cm9sQ2xpY2tIYW5kbGVyCisgKiAKKyAqIEhvb2sgZm9yIGNyZWF0aW5nIHRoZSBjbGljayBoYW5kbGVyIGZvciB0aGUgZm9sZGluZyBpY29uLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gd2hvc2UgY29udHJvbCBjbGljayBoYW5kbGVyIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmNyZWF0ZUNvbnRyb2xDbGlja0hhbmRsZXIgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwl2YXIgZ3JhcGggPSBzdGF0ZS52aWV3LmdyYXBoOworCQorCXJldHVybiBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24gKGV2dCkKKwl7CisJCWlmICh0aGlzLmZvcmNlQ29udHJvbENsaWNrSGFuZGxlciB8fCBncmFwaC5pc0VuYWJsZWQoKSkKKwkJeworCQkJdmFyIGNvbGxhcHNlID0gIWdyYXBoLmlzQ2VsbENvbGxhcHNlZChzdGF0ZS5jZWxsKTsKKwkJCWdyYXBoLmZvbGRDZWxscyhjb2xsYXBzZSwgZmFsc2UsIFtzdGF0ZS5jZWxsXSwgbnVsbCwgZXZ0KTsKKwkJCW14RXZlbnQuY29uc3VtZShldnQpOworCQl9CisJfSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbml0Q29udHJvbAorICogCisgKiBJbml0aWFsaXplcyB0aGUgZ2l2ZW4gY29udHJvbCBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBET00gbm9kZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IGZvciB3aGljaCB0aGUgY29udHJvbCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQuCisgKiBjb250cm9sIC0gPG14U2hhcGU+IHRvIGJlIGluaXRpYWxpemVkLgorICogaGFuZGxlRXZlbnRzIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIG1vdXNlZG93biBhbmQgbW91c2Vtb3ZlIHNob3VsZCBmaXJlIGV2ZW50cyB2aWEgdGhlIGdyYXBoLgorICogY2xpY2tIYW5kbGVyIC0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gaW1wbGVtZW50IGNsaWNrcyBvbiB0aGUgY29udHJvbC4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmluaXRDb250cm9sID0gZnVuY3Rpb24oc3RhdGUsIGNvbnRyb2wsIGhhbmRsZUV2ZW50cywgY2xpY2tIYW5kbGVyKQoreworCXZhciBncmFwaCA9IHN0YXRlLnZpZXcuZ3JhcGg7CisJCisJLy8gSW4gdGhlIHNwZWNpYWwgY2FzZSB3aGVyZSB0aGUgbGFiZWwgaXMgaW4gSFRNTCBhbmQgdGhlIGRpc3BsYXkgaXMgU1ZHIHRoZSBpbWFnZQorCS8vIHNob3VsZCBnbyBpbnRvIHRoZSBncmFwaCBjb250YWluZXIgZGlyZWN0bHkgaW4gb3JkZXIgdG8gYmUgY2xpY2thYmxlLiBPdGhlcndpc2UKKwkvLyBpdCBpcyBvYnNjdXJlZCBieSB0aGUgSFRNTCBsYWJlbCB0aGF0IG92ZXJsYXBzIHRoZSBjZWxsLgorCXZhciBpc0ZvcmNlSHRtbCA9IGdyYXBoLmlzSHRtbExhYmVsKHN0YXRlLmNlbGwpICYmIG14Q2xpZW50Lk5PX0ZPICYmCisJCWdyYXBoLmRpYWxlY3QgPT0gbXhDb25zdGFudHMuRElBTEVDVF9TVkc7CisKKwlpZiAoaXNGb3JjZUh0bWwpCisJeworCQljb250cm9sLmRpYWxlY3QgPSBteENvbnN0YW50cy5ESUFMRUNUX1BSRUZFUkhUTUw7CisJCWNvbnRyb2wuaW5pdChncmFwaC5jb250YWluZXIpOworCQljb250cm9sLm5vZGUuc3R5bGUuekluZGV4ID0gMTsKKwl9CisJZWxzZQorCXsKKwkJY29udHJvbC5pbml0KHN0YXRlLnZpZXcuZ2V0T3ZlcmxheVBhbmUoKSk7CisJfQorCisJdmFyIG5vZGUgPSBjb250cm9sLmlubmVyTm9kZSB8fCBjb250cm9sLm5vZGU7CisJCisJLy8gV29ya2Fyb3VuZCBmb3IgbWlzc2luZyBjbGljayBldmVudCBvbiBpT1MgaXMgdG8gY2hlY2sgdG9sZXJhbmNlIGJlbG93CisJaWYgKGNsaWNrSGFuZGxlciAhPSBudWxsICYmICFteENsaWVudC5JU19JT1MpCisJeworCQlpZiAoZ3JhcGguaXNFbmFibGVkKCkpCisJCXsKKwkJCW5vZGUuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInOworCQl9CisJCQorCQlteEV2ZW50LmFkZExpc3RlbmVyKG5vZGUsICdjbGljaycsIGNsaWNrSGFuZGxlcik7CisJfQorCQorCWlmIChoYW5kbGVFdmVudHMpCisJeworCQl2YXIgZmlyc3QgPSBudWxsOworCisJCW14RXZlbnQuYWRkR2VzdHVyZUxpc3RlbmVycyhub2RlLAorCQkJZnVuY3Rpb24gKGV2dCkKKwkJCXsKKwkJCQlmaXJzdCA9IG5ldyBteFBvaW50KG14RXZlbnQuZ2V0Q2xpZW50WChldnQpLCBteEV2ZW50LmdldENsaWVudFkoZXZ0KSk7CisJCQkJZ3JhcGguZmlyZU1vdXNlRXZlbnQobXhFdmVudC5NT1VTRV9ET1dOLCBuZXcgbXhNb3VzZUV2ZW50KGV2dCwgc3RhdGUpKTsKKwkJCQlteEV2ZW50LmNvbnN1bWUoZXZ0KTsKKwkJCX0sCisJCQlmdW5jdGlvbiAoZXZ0KQorCQkJeworCQkJCWdyYXBoLmZpcmVNb3VzZUV2ZW50KG14RXZlbnQuTU9VU0VfTU9WRSwgbmV3IG14TW91c2VFdmVudChldnQsIHN0YXRlKSk7CisJCQl9LAorCQkJZnVuY3Rpb24gKGV2dCkKKwkJCXsKKwkJCQlncmFwaC5maXJlTW91c2VFdmVudChteEV2ZW50Lk1PVVNFX1VQLCBuZXcgbXhNb3VzZUV2ZW50KGV2dCwgc3RhdGUpKTsKKwkJCQlteEV2ZW50LmNvbnN1bWUoZXZ0KTsKKwkJCX0pOworCQkKKwkJLy8gVXNlcyBjYXB0dXJlIHBoYXNlIGZvciBldmVudCBpbnRlcmNlcHRpb24gdG8gc3RvcCBidWJibGUgcGhhc2UKKwkJaWYgKGNsaWNrSGFuZGxlciAhPSBudWxsICYmIG14Q2xpZW50LklTX0lPUykKKwkJeworCQkJbm9kZS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGZ1bmN0aW9uKGV2dCkKKwkJCXsKKwkJCQlpZiAoZmlyc3QgIT0gbnVsbCkKKwkJCQl7CisJCQkJCXZhciB0b2wgPSBncmFwaC50b2xlcmFuY2U7CisJCQkJCQorCQkJCQlpZiAoTWF0aC5hYnMoZmlyc3QueCAtIG14RXZlbnQuZ2V0Q2xpZW50WChldnQpKSA8IHRvbCAmJgorCQkJCQkJTWF0aC5hYnMoZmlyc3QueSAtIG14RXZlbnQuZ2V0Q2xpZW50WShldnQpKSA8IHRvbCkKKwkJCQkJeworCQkJCQkJY2xpY2tIYW5kbGVyLmNhbGwoY2xpY2tIYW5kbGVyLCBldnQpOworCQkJCQkJbXhFdmVudC5jb25zdW1lKGV2dCk7CisJCQkJCX0KKwkJCQl9CisJCQl9LCB0cnVlKTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gbm9kZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzU2hhcGVFdmVudAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IGlzIGZvciB0aGUgc2hhcGUgb2YgdGhlIGdpdmVuIHN0YXRlLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyB0cnVlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gd2hvc2Ugc2hhcGUgZmlyZWQgdGhlIGV2ZW50LgorICogZXZ0IC0gTW91c2UgZXZlbnQgd2hpY2ggd2FzIGZpcmVkLgorICovCitteENlbGxSZW5kZXJlci5wcm90b3R5cGUuaXNTaGFwZUV2ZW50ID0gZnVuY3Rpb24oc3RhdGUsIGV2dCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzTGFiZWxFdmVudAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IGlzIGZvciB0aGUgbGFiZWwgb2YgdGhlIGdpdmVuIHN0YXRlLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyB0cnVlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gd2hvc2UgbGFiZWwgZmlyZWQgdGhlIGV2ZW50LgorICogZXZ0IC0gTW91c2UgZXZlbnQgd2hpY2ggd2FzIGZpcmVkLgorICovCitteENlbGxSZW5kZXJlci5wcm90b3R5cGUuaXNMYWJlbEV2ZW50ID0gZnVuY3Rpb24oc3RhdGUsIGV2dCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGluc3RhbGxMaXN0ZW5lcnMKKyAqIAorICogSW5zdGFsbHMgdGhlIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIGdpdmVuIGNlbGwgc3RhdGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiBmb3Igd2hpY2ggdGhlIGV2ZW50IGxpc3RlbmVycyBzaG91bGQgYmUgaXNudGFsbGVkLgorICovCitteENlbGxSZW5kZXJlci5wcm90b3R5cGUuaW5zdGFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXZhciBncmFwaCA9IHN0YXRlLnZpZXcuZ3JhcGg7CisKKwkvLyBXb3JrYXJvdW5kIGZvciB0b3VjaCBkZXZpY2VzIHJvdXRpbmcgYWxsIGV2ZW50cyBmb3IgYSBtb3VzZQorCS8vIGdlc3R1cmUgKGRvd24sIG1vdmUsIHVwKSB2aWEgdGhlIGluaXRpYWwgRE9NIG5vZGUuIFNhbWUgZm9yCisJLy8gSFRNTCBpbWFnZXMgaW4gYWxsIElFIHZlcnNpb25zIChWTUwgaW1hZ2VzIGFyZSB3b3JraW5nKS4KKwl2YXIgZ2V0U3RhdGUgPSBmdW5jdGlvbihldnQpCisJeworCQl2YXIgcmVzdWx0ID0gc3RhdGU7CisJCQorCQlpZiAoKGdyYXBoLmRpYWxlY3QgIT0gbXhDb25zdGFudHMuRElBTEVDVF9TVkcgJiYgbXhFdmVudC5nZXRTb3VyY2UoZXZ0KS5ub2RlTmFtZSA9PSAnSU1HJykgfHwgbXhDbGllbnQuSVNfVE9VQ0gpCisJCXsKKwkJCXZhciB4ID0gbXhFdmVudC5nZXRDbGllbnRYKGV2dCk7CisJCQl2YXIgeSA9IG14RXZlbnQuZ2V0Q2xpZW50WShldnQpOworCQkJCisJCQkvLyBEaXNwYXRjaGVzIHRoZSBkcm9wIGV2ZW50IHRvIHRoZSBncmFwaCB3aGljaAorCQkJLy8gY29uc3VtZXMgYW5kIGV4ZWN1dGVzIHRoZSBzb3VyY2UgZnVuY3Rpb24KKwkJCXZhciBwdCA9IG14VXRpbHMuY29udmVydFBvaW50KGdyYXBoLmNvbnRhaW5lciwgeCwgeSk7CisJCQlyZXN1bHQgPSBncmFwaC52aWV3LmdldFN0YXRlKGdyYXBoLmdldENlbGxBdChwdC54LCBwdC55KSk7CisJCX0KKwkJCisJCXJldHVybiByZXN1bHQ7CisJfTsKKworCW14RXZlbnQuYWRkR2VzdHVyZUxpc3RlbmVycyhzdGF0ZS5zaGFwZS5ub2RlLAorCQlteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQl7CisJCQlpZiAodGhpcy5pc1NoYXBlRXZlbnQoc3RhdGUsIGV2dCkpCisJCQl7CisJCQkJZ3JhcGguZmlyZU1vdXNlRXZlbnQobXhFdmVudC5NT1VTRV9ET1dOLCBuZXcgbXhNb3VzZUV2ZW50KGV2dCwgc3RhdGUpKTsKKwkJCX0KKwkJfSksCisJCW14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJCXsKKwkJCWlmICh0aGlzLmlzU2hhcGVFdmVudChzdGF0ZSwgZXZ0KSkKKwkJCXsKKwkJCQlncmFwaC5maXJlTW91c2VFdmVudChteEV2ZW50Lk1PVVNFX01PVkUsIG5ldyBteE1vdXNlRXZlbnQoZXZ0LCBnZXRTdGF0ZShldnQpKSk7CisJCQl9CisJCX0pLAorCQlteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQl7CisJCQlpZiAodGhpcy5pc1NoYXBlRXZlbnQoc3RhdGUsIGV2dCkpCisJCQl7CisJCQkJZ3JhcGguZmlyZU1vdXNlRXZlbnQobXhFdmVudC5NT1VTRV9VUCwgbmV3IG14TW91c2VFdmVudChldnQsIGdldFN0YXRlKGV2dCkpKTsKKwkJCX0KKwkJfSkKKwkpOworCQorCS8vIFVzZXMgZG91YmxlIGNsaWNrIHRpbWVvdXQgaW4gbXhHcmFwaCBmb3IgcXVpcmtzIG1vZGUKKwlpZiAoZ3JhcGgubmF0aXZlRGJsQ2xpY2tFbmFibGVkKQorCXsKKwkJbXhFdmVudC5hZGRMaXN0ZW5lcihzdGF0ZS5zaGFwZS5ub2RlLCAnZGJsY2xpY2snLAorCQkJbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwkJCXsKKwkJCQlpZiAodGhpcy5pc1NoYXBlRXZlbnQoc3RhdGUsIGV2dCkpCisJCQkJeworCQkJCQlncmFwaC5kYmxDbGljayhldnQsIHN0YXRlLmNlbGwpOworCQkJCQlteEV2ZW50LmNvbnN1bWUoZXZ0KTsKKwkJCQl9CisJCQl9KQorCQkpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJlZHJhd0xhYmVsCisgKiAKKyAqIFJlZHJhd3MgdGhlIGxhYmVsIGZvciB0aGUgZ2l2ZW4gY2VsbCBzdGF0ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHdob3NlIGxhYmVsIHNob3VsZCBiZSByZWRyYXduLgorICovCitteENlbGxSZW5kZXJlci5wcm90b3R5cGUucmVkcmF3TGFiZWwgPSBmdW5jdGlvbihzdGF0ZSwgZm9yY2VkKQoreworCXZhciB2YWx1ZSA9IHRoaXMuZ2V0TGFiZWxWYWx1ZShzdGF0ZSk7CisJCisJaWYgKHN0YXRlLnRleHQgPT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsICYmIChteFV0aWxzLmlzTm9kZSh2YWx1ZSkgfHwgdmFsdWUubGVuZ3RoID4gMCkpCisJeworCQl0aGlzLmNyZWF0ZUxhYmVsKHN0YXRlLCB2YWx1ZSk7CisJfQorCWVsc2UgaWYgKHN0YXRlLnRleHQgIT0gbnVsbCAmJiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpCisJeworCQlzdGF0ZS50ZXh0LmRlc3Ryb3koKTsKKwkJc3RhdGUudGV4dCA9IG51bGw7CisJfQorCisJaWYgKHN0YXRlLnRleHQgIT0gbnVsbCkKKwl7CisJCXZhciBncmFwaCA9IHN0YXRlLnZpZXcuZ3JhcGg7CisKKwkJLy8gRm9yY2VkIGlzIHRydWUgaWYgdGhlIHN0eWxlIGhhcyBjaGFuZ2VkLCBzbyB0byBnZXQgdGhlIHVwZGF0ZWQKKwkJLy8gcmVzdWx0IGluIGdldExhYmVsQm91bmRzIHdlIGFwcGx5IHRoZSBuZXcgc3R5bGUgdG8gdGhlIHNoYXBlCisJCWlmIChmb3JjZWQpCisJCXsKKworCQkJLy8gQ2hlY2tzIGlmIGEgZnVsbCByZXBhaW50IGlzIG5lZWRlZAorCQkJaWYgKHN0YXRlLnRleHQubGFzdFZhbHVlICE9IG51bGwgJiYgdGhpcy5pc1RleHRTaGFwZUludmFsaWQoc3RhdGUsIHN0YXRlLnRleHQpKQorCQkJeworCQkJCS8vIEZvcmNlcyBhIGZ1bGwgcmVwYWludAorCQkJCXN0YXRlLnRleHQubGFzdFZhbHVlID0gbnVsbDsKKwkJCX0KKwkJCQorCQkJc3RhdGUudGV4dC5yZXNldFN0eWxlcygpOworCQkJc3RhdGUudGV4dC5hcHBseShzdGF0ZSk7CisJCQkKKwkJCS8vIFNwZWNpYWwgY2FzZSB3aGVyZSB2YWx1ZSBpcyBvYnRhaW5lZCB2aWEgaG9vayBpbiBncmFwaAorCQkJc3RhdGUudGV4dC52YWxpZ24gPSBncmFwaC5nZXRWZXJ0aWNhbEFsaWduKHN0YXRlKTsKKwkJfQorCQkKKwkJdmFyIGJvdW5kcyA9IHRoaXMuZ2V0TGFiZWxCb3VuZHMoc3RhdGUpOworCQl2YXIgd3JhcHBpbmcgPSBncmFwaC5pc1dyYXBwaW5nKHN0YXRlLmNlbGwpOworCQl2YXIgY2xpcHBpbmcgPSBncmFwaC5pc0xhYmVsQ2xpcHBlZChzdGF0ZS5jZWxsKTsKKwkJdmFyIGlzRm9yY2VIdG1sID0gKHN0YXRlLnZpZXcuZ3JhcGguaXNIdG1sTGFiZWwoc3RhdGUuY2VsbCkgfHwgKHZhbHVlICE9IG51bGwgJiYgbXhVdGlscy5pc05vZGUodmFsdWUpKSk7CisJCXZhciBkaWFsZWN0ID0gKGlzRm9yY2VIdG1sKSA/IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1RSSUNUSFRNTCA6IHN0YXRlLnZpZXcuZ3JhcGguZGlhbGVjdDsKKworCQkvLyBUZXh0IGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIGNoYW5nZSBvZiBkaWFsZWN0IGlzIHBvc3NpYmxlIGF0IHJ1bnRpbWUKKwkJdmFyIG92ZXJmbG93ID0gc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfT1ZFUkZMT1ddIHx8ICd2aXNpYmxlJzsKKwkJCisJCWlmIChmb3JjZWQgfHwgc3RhdGUudGV4dC52YWx1ZSAhPSB2YWx1ZSB8fCBzdGF0ZS50ZXh0LmlzV3JhcHBpbmcgIT0gd3JhcHBpbmcgfHwKKwkJCXN0YXRlLnRleHQub3ZlcmZsb3cgIT0gb3ZlcmZsb3cgfHwgc3RhdGUudGV4dC5pc0NsaXBwaW5nICE9IGNsaXBwaW5nIHx8CisJCQlzdGF0ZS50ZXh0LnNjYWxlICE9IHRoaXMuZ2V0VGV4dFNjYWxlKHN0YXRlKSB8fCBzdGF0ZS50ZXh0LmRpYWxlY3QgIT0gZGlhbGVjdCB8fAorCQkJIXN0YXRlLnRleHQuYm91bmRzLmVxdWFscyhib3VuZHMpKQorCQl7CisJCQlzdGF0ZS50ZXh0LmRpYWxlY3QgPSBkaWFsZWN0OworCQkJc3RhdGUudGV4dC52YWx1ZSA9IHZhbHVlOworCQkJc3RhdGUudGV4dC5ib3VuZHMgPSBib3VuZHM7CisJCQlzdGF0ZS50ZXh0LnNjYWxlID0gdGhpcy5nZXRUZXh0U2NhbGUoc3RhdGUpOworCQkJc3RhdGUudGV4dC53cmFwID0gd3JhcHBpbmc7CisJCQlzdGF0ZS50ZXh0LmNsaXBwZWQgPSBjbGlwcGluZzsKKwkJCXN0YXRlLnRleHQub3ZlcmZsb3cgPSBvdmVyZmxvdzsKKwkJCQorCQkJLy8gUHJlc2VydmVzIHZpc2libGUgc3RhdGUKKwkJCXZhciB2aXMgPSBzdGF0ZS50ZXh0Lm5vZGUuc3R5bGUudmlzaWJpbGl0eTsKKwkJCXRoaXMucmVkcmF3TGFiZWxTaGFwZShzdGF0ZS50ZXh0KTsKKwkJCXN0YXRlLnRleHQubm9kZS5zdHlsZS52aXNpYmlsaXR5ID0gdmlzOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNUZXh0U2hhcGVJbnZhbGlkCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3R5bGUgZm9yIHRoZSB0ZXh0IHNoYXBlIGhhcyBjaGFuZ2VkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gd2hvc2UgbGFiZWwgc2hvdWxkIGJlIGNoZWNrZWQuCisgKiBzaGFwZSAtIDxteFRleHQ+IHNoYXBlIHRvIGJlIGNoZWNrZWQuCisgKi8KK214Q2VsbFJlbmRlcmVyLnByb3RvdHlwZS5pc1RleHRTaGFwZUludmFsaWQgPSBmdW5jdGlvbihzdGF0ZSwgc2hhcGUpCit7CisJZnVuY3Rpb24gY2hlY2socHJvcGVydHksIHN0eWxlbmFtZSwgZGVmYXVsdFZhbHVlKQorCXsKKwkJLy8gV29ya2Fyb3VuZCBmb3Igc3BhY2luZyBhZGRlZCB0byBkaXJlY3Rpb25hbCBzcGFjaW5nCisJCWlmIChzdHlsZW5hbWUgPT0gJ3NwYWNpbmdUb3AnIHx8IHN0eWxlbmFtZSA9PSAnc3BhY2luZ1JpZ2h0JyB8fAorCQkJc3R5bGVuYW1lID09ICdzcGFjaW5nQm90dG9tJyB8fCBzdHlsZW5hbWUgPT0gJ3NwYWNpbmdMZWZ0JykKKwkJeworCQkJcmVzdWx0ID0gcGFyc2VGbG9hdChzaGFwZVtwcm9wZXJ0eV0pIC0gcGFyc2VGbG9hdChzaGFwZS5zcGFjaW5nKSAhPQorCQkJCShzdGF0ZS5zdHlsZVtzdHlsZW5hbWVdIHx8IGRlZmF1bHRWYWx1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXN1bHQgPSBzaGFwZVtwcm9wZXJ0eV0gIT0gKHN0YXRlLnN0eWxlW3N0eWxlbmFtZV0gfHwgZGVmYXVsdFZhbHVlKTsKKwkJfQorCQkKKwkJcmV0dXJuIHJlc3VsdDsKKwl9OworCisJcmV0dXJuIGNoZWNrKCdmb250U3R5bGUnLCBteENvbnN0YW50cy5TVFlMRV9GT05UU1RZTEUsIG14Q29uc3RhbnRzLkRFRkFVTFRfRk9OVFNUWUxFKSB8fAorCQljaGVjaygnZmFtaWx5JywgbXhDb25zdGFudHMuU1RZTEVfRk9OVEZBTUlMWSwgbXhDb25zdGFudHMuREVGQVVMVF9GT05URkFNSUxZKSB8fAorCQljaGVjaygnc2l6ZScsIG14Q29uc3RhbnRzLlNUWUxFX0ZPTlRTSVpFLCBteENvbnN0YW50cy5ERUZBVUxUX0ZPTlRTSVpFKSB8fAorCQljaGVjaygnY29sb3InLCBteENvbnN0YW50cy5TVFlMRV9GT05UQ09MT1IsICdibGFjaycpIHx8CisJCWNoZWNrKCdhbGlnbicsIG14Q29uc3RhbnRzLlNUWUxFX0FMSUdOLCAnJykgfHwKKwkJY2hlY2soJ3ZhbGlnbicsIG14Q29uc3RhbnRzLlNUWUxFX1ZFUlRJQ0FMX0FMSUdOLCAnJykgfHwKKwkJY2hlY2soJ3NwYWNpbmcnLCBteENvbnN0YW50cy5TVFlMRV9TUEFDSU5HLCAyKSB8fAorCQljaGVjaygnc3BhY2luZ1RvcCcsIG14Q29uc3RhbnRzLlNUWUxFX1NQQUNJTkdfVE9QLCAwKSB8fAorCQljaGVjaygnc3BhY2luZ1JpZ2h0JywgbXhDb25zdGFudHMuU1RZTEVfU1BBQ0lOR19SSUdIVCwgMCkgfHwKKwkJY2hlY2soJ3NwYWNpbmdCb3R0b20nLCBteENvbnN0YW50cy5TVFlMRV9TUEFDSU5HX0JPVFRPTSwgMCkgfHwKKwkJY2hlY2soJ3NwYWNpbmdMZWZ0JywgbXhDb25zdGFudHMuU1RZTEVfU1BBQ0lOR19MRUZULCAwKSB8fAorCQljaGVjaygnaG9yaXpvbnRhbCcsIG14Q29uc3RhbnRzLlNUWUxFX0hPUklaT05UQUwsIHRydWUpIHx8CisJCWNoZWNrKCdiYWNrZ3JvdW5kJywgbXhDb25zdGFudHMuU1RZTEVfTEFCRUxfQkFDS0dST1VORENPTE9SKSB8fAorCQljaGVjaygnYm9yZGVyJywgbXhDb25zdGFudHMuU1RZTEVfTEFCRUxfQk9SREVSQ09MT1IpIHx8CisJCWNoZWNrKCdvcGFjaXR5JywgbXhDb25zdGFudHMuU1RZTEVfVEVYVF9PUEFDSVRZLCAxMDApIHx8CisJCWNoZWNrKCd0ZXh0RGlyZWN0aW9uJywgbXhDb25zdGFudHMuU1RZTEVfVEVYVF9ESVJFQ1RJT04sIG14Q29uc3RhbnRzLkRFRkFVTFRfVEVYVF9ESVJFQ1RJT04pOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVkcmF3TGFiZWxTaGFwZQorICogCisgKiBDYWxsZWQgdG8gaW52b2tlZCByZWRyYXcgb24gdGhlIGdpdmVuIHRleHQgc2hhcGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHNoYXBlIC0gPG14VGV4dD4gc2hhcGUgdG8gYmUgcmVkcmF3bi4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLnJlZHJhd0xhYmVsU2hhcGUgPSBmdW5jdGlvbihzaGFwZSkKK3sKKwlzaGFwZS5yZWRyYXcoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFRleHRTY2FsZQorICogCisgKiBSZXR1cm5zIHRoZSBzY2FsaW5nIHVzZWQgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gc3RhdGUKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHdob3NlIGxhYmVsIHNjYWxlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmdldFRleHRTY2FsZSA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXJldHVybiBzdGF0ZS52aWV3LnNjYWxlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0TGFiZWxCb3VuZHMKKyAqIAorICogUmV0dXJucyB0aGUgYm91bmRzIHRvIGJlIHVzZWQgdG8gZHJhdyB0aGUgbGFiZWwgb2YgdGhlIGdpdmVuIHN0YXRlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gd2hvc2UgbGFiZWwgYm91bmRzIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmdldExhYmVsQm91bmRzID0gZnVuY3Rpb24oc3RhdGUpCit7CisJdmFyIGdyYXBoID0gc3RhdGUudmlldy5ncmFwaDsKKwl2YXIgc2NhbGUgPSBzdGF0ZS52aWV3LnNjYWxlOworCXZhciBpc0VkZ2UgPSBncmFwaC5nZXRNb2RlbCgpLmlzRWRnZShzdGF0ZS5jZWxsKTsKKwl2YXIgYm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKHN0YXRlLmFic29sdXRlT2Zmc2V0LngsIHN0YXRlLmFic29sdXRlT2Zmc2V0LnkpOworCisJaWYgKGlzRWRnZSkKKwl7CisJCXZhciBzcGFjaW5nID0gc3RhdGUudGV4dC5nZXRTcGFjaW5nKCk7CisJCWJvdW5kcy54ICs9IHNwYWNpbmcueCAqIHNjYWxlOworCQlib3VuZHMueSArPSBzcGFjaW5nLnkgKiBzY2FsZTsKKwkJCisJCXZhciBnZW8gPSBncmFwaC5nZXRDZWxsR2VvbWV0cnkoc3RhdGUuY2VsbCk7CisJCQorCQlpZiAoZ2VvICE9IG51bGwpCisJCXsKKwkJCWJvdW5kcy53aWR0aCA9IE1hdGgubWF4KDAsIGdlby53aWR0aCAqIHNjYWxlKTsKKwkJCWJvdW5kcy5oZWlnaHQgPSBNYXRoLm1heCgwLCBnZW8uaGVpZ2h0ICogc2NhbGUpOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8vIEludmVydHMgbGFiZWwgcG9zaXRpb24KKwkJaWYgKHN0YXRlLnRleHQuaXNQYWludEJvdW5kc0ludmVydGVkKCkpCisJCXsKKwkJCXZhciB0bXAgPSBib3VuZHMueDsKKwkJCWJvdW5kcy54ID0gYm91bmRzLnk7CisJCQlib3VuZHMueSA9IHRtcDsKKwkJfQorCQkKKwkJYm91bmRzLnggKz0gc3RhdGUueDsKKwkJYm91bmRzLnkgKz0gc3RhdGUueTsKKwkJCisJCS8vIE1pbmltdW0gb2YgMSBmaXhlcyBhbGlnbm1lbnQgYnVnIGluIEhUTUwgbGFiZWxzCisJCWJvdW5kcy53aWR0aCA9IE1hdGgubWF4KDEsIHN0YXRlLndpZHRoKTsKKwkJYm91bmRzLmhlaWdodCA9IE1hdGgubWF4KDEsIHN0YXRlLmhlaWdodCk7CisKKwkJdmFyIHNjID0gbXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfU1RST0tFQ09MT1IsIG14Q29uc3RhbnRzLk5PTkUpOworCQkKKwkJaWYgKHNjICE9IG14Q29uc3RhbnRzLk5PTkUgJiYgc2MgIT0gJycpCisJCXsKKwkJCXZhciBzID0gcGFyc2VGbG9hdChteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9TVFJPS0VXSURUSCwgMSkpICogc2NhbGU7CisJCQl2YXIgZHggPSAxICsgTWF0aC5mbG9vcigocyAtIDEpIC8gMik7CisJCQl2YXIgZGggPSBNYXRoLmZsb29yKHMgKyAxKTsKKwkJCQorCQkJYm91bmRzLnggKz0gZHg7CisJCQlib3VuZHMueSArPSBkeDsKKwkJCWJvdW5kcy53aWR0aCAtPSBkaDsKKwkJCWJvdW5kcy5oZWlnaHQgLT0gZGg7CisJCX0KKwl9CisKKwlpZiAoc3RhdGUudGV4dC5pc1BhaW50Qm91bmRzSW52ZXJ0ZWQoKSkKKwl7CisJCS8vIFJvdGF0ZXMgYXJvdW5kIGNlbnRlciBvZiBzdGF0ZQorCQl2YXIgdCA9IChzdGF0ZS53aWR0aCAtIHN0YXRlLmhlaWdodCkgLyAyOworCQlib3VuZHMueCArPSB0OworCQlib3VuZHMueSAtPSB0OworCQl2YXIgdG1wID0gYm91bmRzLndpZHRoOworCQlib3VuZHMud2lkdGggPSBib3VuZHMuaGVpZ2h0OworCQlib3VuZHMuaGVpZ2h0ID0gdG1wOworCX0KKwkKKwkvLyBTaGFwZSBjYW4gbW9kaWZ5IGl0cyBsYWJlbCBib3VuZHMKKwlpZiAoc3RhdGUuc2hhcGUgIT0gbnVsbCkKKwl7CisJCXZhciBocG9zID0gbXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfTEFCRUxfUE9TSVRJT04sIG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUik7CisJCXZhciB2cG9zID0gbXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfVkVSVElDQUxfTEFCRUxfUE9TSVRJT04sIG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSk7CisJCQorCQlpZiAoaHBvcyA9PSBteENvbnN0YW50cy5BTElHTl9DRU5URVIgJiYgdnBvcyA9PSBteENvbnN0YW50cy5BTElHTl9NSURETEUpCisJCXsKKwkJCWJvdW5kcyA9IHN0YXRlLnNoYXBlLmdldExhYmVsQm91bmRzKGJvdW5kcyk7CisJCX0KKwl9CisJCisJLy8gTGFiZWwgd2lkdGggc3R5bGUgb3ZlcnJpZGVzIGFjdHVhbCBsYWJlbCB3aWR0aAorCXZhciBsdyA9IG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0xBQkVMX1dJRFRILCBudWxsKTsKKwkKKwlpZiAobHcgIT0gbnVsbCkKKwl7CisJCWJvdW5kcy53aWR0aCA9IHBhcnNlRmxvYXQobHcpICogc2NhbGU7CisJfQorCQorCWlmICghaXNFZGdlKQorCXsKKwkJdGhpcy5yb3RhdGVMYWJlbEJvdW5kcyhzdGF0ZSwgYm91bmRzKTsKKwl9CisJCisJcmV0dXJuIGJvdW5kczsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJvdGF0ZUxhYmVsQm91bmRzCisgKiAKKyAqIEFkZHMgdGhlIHNoYXBlIHJvdGF0aW9uIHRvIHRoZSBnaXZlbiBsYWJlbCBib3VuZHMgYW5kCisgKiBhcHBsaWVzIHRoZSBhbGlnbm1lbnQgYW5kIG9mZnNldHMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB3aG9zZSBsYWJlbCBib3VuZHMgc2hvdWxkIGJlIHJvdGF0ZWQuCisgKiBib3VuZHMgLSA8bXhSZWN0YW5nbGU+IHRoZSByZWN0YW5nbGUgdG8gYmUgcm90YXRlZC4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLnJvdGF0ZUxhYmVsQm91bmRzID0gZnVuY3Rpb24oc3RhdGUsIGJvdW5kcykKK3sKKwlib3VuZHMueSAtPSBzdGF0ZS50ZXh0Lm1hcmdpbi55ICogYm91bmRzLmhlaWdodDsKKwlib3VuZHMueCAtPSBzdGF0ZS50ZXh0Lm1hcmdpbi54ICogYm91bmRzLndpZHRoOworCQorCWlmICghdGhpcy5sZWdhY3lTcGFjaW5nIHx8IChzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9PVkVSRkxPV10gIT0gJ2ZpbGwnICYmIHN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX09WRVJGTE9XXSAhPSAnd2lkdGgnKSkKKwl7CisJCXZhciBzID0gc3RhdGUudmlldy5zY2FsZTsKKwkJdmFyIHNwYWNpbmcgPSBzdGF0ZS50ZXh0LmdldFNwYWNpbmcoKTsKKwkJYm91bmRzLnggKz0gc3BhY2luZy54ICogczsKKwkJYm91bmRzLnkgKz0gc3BhY2luZy55ICogczsKKwkJCisJCXZhciBocG9zID0gbXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfTEFCRUxfUE9TSVRJT04sIG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUik7CisJCXZhciB2cG9zID0gbXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfVkVSVElDQUxfTEFCRUxfUE9TSVRJT04sIG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSk7CisJCXZhciBsdyA9IG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0xBQkVMX1dJRFRILCBudWxsKTsKKwkJCisJCWJvdW5kcy53aWR0aCA9IE1hdGgubWF4KDAsIGJvdW5kcy53aWR0aCAtICgoaHBvcyA9PSBteENvbnN0YW50cy5BTElHTl9DRU5URVIgJiYgbHcgPT0gbnVsbCkgPyAoc3RhdGUudGV4dC5zcGFjaW5nTGVmdCAqIHMgKyBzdGF0ZS50ZXh0LnNwYWNpbmdSaWdodCAqIHMpIDogMCkpOworCQlib3VuZHMuaGVpZ2h0ID0gTWF0aC5tYXgoMCwgYm91bmRzLmhlaWdodCAtICgodnBvcyA9PSBteENvbnN0YW50cy5BTElHTl9NSURETEUpID8gKHN0YXRlLnRleHQuc3BhY2luZ1RvcCAqIHMgKyBzdGF0ZS50ZXh0LnNwYWNpbmdCb3R0b20gKiBzKSA6IDApKTsKKwl9CisKKwl2YXIgdGhldGEgPSBzdGF0ZS50ZXh0LmdldFRleHRSb3RhdGlvbigpOworCisJLy8gT25seSBuZWVkZWQgaWYgcm90YXRlZCBhcm91bmQgYW5vdGhlciBjZW50ZXIKKwlpZiAodGhldGEgIT0gMCAmJiBzdGF0ZSAhPSBudWxsICYmIHN0YXRlLnZpZXcuZ3JhcGgubW9kZWwuaXNWZXJ0ZXgoc3RhdGUuY2VsbCkpCisJeworCQl2YXIgY3ggPSBzdGF0ZS5nZXRDZW50ZXJYKCk7CisJCXZhciBjeSA9IHN0YXRlLmdldENlbnRlclkoKTsKKwkJCisJCWlmIChib3VuZHMueCAhPSBjeCB8fCBib3VuZHMueSAhPSBjeSkKKwkJeworCQkJdmFyIHJhZCA9IHRoZXRhICogKE1hdGguUEkgLyAxODApOworCQkJcHQgPSBteFV0aWxzLmdldFJvdGF0ZWRQb2ludChuZXcgbXhQb2ludChib3VuZHMueCwgYm91bmRzLnkpLAorCQkJCQlNYXRoLmNvcyhyYWQpLCBNYXRoLnNpbihyYWQpLCBuZXcgbXhQb2ludChjeCwgY3kpKTsKKwkJCQorCQkJYm91bmRzLnggPSBwdC54OworCQkJYm91bmRzLnkgPSBwdC55OworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVkcmF3Q2VsbE92ZXJsYXlzCisgKiAKKyAqIFJlZHJhd3MgdGhlIG92ZXJsYXlzIGZvciB0aGUgZ2l2ZW4gY2VsbCBzdGF0ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHdob3NlIG92ZXJsYXlzIHNob3VsZCBiZSByZWRyYXduLgorICovCitteENlbGxSZW5kZXJlci5wcm90b3R5cGUucmVkcmF3Q2VsbE92ZXJsYXlzID0gZnVuY3Rpb24oc3RhdGUsIGZvcmNlZCkKK3sKKwl0aGlzLmNyZWF0ZUNlbGxPdmVybGF5cyhzdGF0ZSk7CisKKwlpZiAoc3RhdGUub3ZlcmxheXMgIT0gbnVsbCkKKwl7CisJCXZhciByb3QgPSBteFV0aWxzLm1vZChteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9ST1RBVElPTiwgMCksIDkwKTsKKyAgICAgICAgdmFyIHJhZCA9IG14VXRpbHMudG9SYWRpYW5zKHJvdCk7CisgICAgICAgIHZhciBjb3MgPSBNYXRoLmNvcyhyYWQpOworICAgICAgICB2YXIgc2luID0gTWF0aC5zaW4ocmFkKTsKKwkJCisJCXN0YXRlLm92ZXJsYXlzLnZpc2l0KGZ1bmN0aW9uKGlkLCBzaGFwZSkKKwkJeworCQkJdmFyIGJvdW5kcyA9IHNoYXBlLm92ZXJsYXkuZ2V0Qm91bmRzKHN0YXRlKTsKKwkJCisJCQlpZiAoIXN0YXRlLnZpZXcuZ3JhcGguZ2V0TW9kZWwoKS5pc0VkZ2Uoc3RhdGUuY2VsbCkpCisJCQl7CisJCQkJaWYgKHN0YXRlLnNoYXBlICE9IG51bGwgJiYgcm90ICE9IDApCisJCQkJeworCQkJCQl2YXIgY3ggPSBib3VuZHMuZ2V0Q2VudGVyWCgpOworCQkJCQl2YXIgY3kgPSBib3VuZHMuZ2V0Q2VudGVyWSgpOworCisJCQkJCXZhciBwb2ludCA9IG14VXRpbHMuZ2V0Um90YXRlZFBvaW50KG5ldyBteFBvaW50KGN4LCBjeSksIGNvcywgc2luLAorCQkJICAgICAgICAJCW5ldyBteFBvaW50KHN0YXRlLmdldENlbnRlclgoKSwgc3RhdGUuZ2V0Q2VudGVyWSgpKSk7CisKKwkJCSAgICAgICAgY3ggPSBwb2ludC54OworCQkJICAgICAgICBjeSA9IHBvaW50Lnk7CisJCQkgICAgICAgIGJvdW5kcy54ID0gTWF0aC5yb3VuZChjeCAtIGJvdW5kcy53aWR0aCAvIDIpOworCQkJICAgICAgICBib3VuZHMueSA9IE1hdGgucm91bmQoY3kgLSBib3VuZHMuaGVpZ2h0IC8gMik7CisJCQkJfQorCQkJfQorCQkJCisJCQlpZiAoZm9yY2VkIHx8IHNoYXBlLmJvdW5kcyA9PSBudWxsIHx8IHNoYXBlLnNjYWxlICE9IHN0YXRlLnZpZXcuc2NhbGUgfHwKKwkJCQkhc2hhcGUuYm91bmRzLmVxdWFscyhib3VuZHMpKQorCQkJeworCQkJCXNoYXBlLmJvdW5kcyA9IGJvdW5kczsKKwkJCQlzaGFwZS5zY2FsZSA9IHN0YXRlLnZpZXcuc2NhbGU7CisJCQkJc2hhcGUucmVkcmF3KCk7CisJCQl9CisJCX0pOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJlZHJhd0NvbnRyb2wKKyAqIAorICogUmVkcmF3cyB0aGUgY29udHJvbCBmb3IgdGhlIGdpdmVuIGNlbGwgc3RhdGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB3aG9zZSBjb250cm9sIHNob3VsZCBiZSByZWRyYXduLgorICovCitteENlbGxSZW5kZXJlci5wcm90b3R5cGUucmVkcmF3Q29udHJvbCA9IGZ1bmN0aW9uKHN0YXRlLCBmb3JjZWQpCit7CisJdmFyIGltYWdlID0gc3RhdGUudmlldy5ncmFwaC5nZXRGb2xkaW5nSW1hZ2Uoc3RhdGUpOworCQorCWlmIChzdGF0ZS5jb250cm9sICE9IG51bGwgJiYgaW1hZ2UgIT0gbnVsbCkKKwl7CisJCXZhciBib3VuZHMgPSB0aGlzLmdldENvbnRyb2xCb3VuZHMoc3RhdGUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQpOworCQl2YXIgciA9ICh0aGlzLmxlZ2FjeUNvbnRyb2xQb3NpdGlvbikgPworCQkJCW14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1JPVEFUSU9OLCAwKSA6CisJCQkJc3RhdGUuc2hhcGUuZ2V0VGV4dFJvdGF0aW9uKCk7CisJCXZhciBzID0gc3RhdGUudmlldy5zY2FsZTsKKwkJCisJCWlmIChmb3JjZWQgfHwgc3RhdGUuY29udHJvbC5zY2FsZSAhPSBzIHx8ICFzdGF0ZS5jb250cm9sLmJvdW5kcy5lcXVhbHMoYm91bmRzKSB8fAorCQkJc3RhdGUuY29udHJvbC5yb3RhdGlvbiAhPSByKQorCQl7CisJCQlzdGF0ZS5jb250cm9sLnJvdGF0aW9uID0gcjsKKwkJCXN0YXRlLmNvbnRyb2wuYm91bmRzID0gYm91bmRzOworCQkJc3RhdGUuY29udHJvbC5zY2FsZSA9IHM7CisJCQkKKwkJCXN0YXRlLmNvbnRyb2wucmVkcmF3KCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDb250cm9sQm91bmRzCisgKiAKKyAqIFJldHVybnMgdGhlIGJvdW5kcyB0byBiZSB1c2VkIHRvIGRyYXcgdGhlIGNvbnRyb2wgKGZvbGRpbmcgaWNvbikgb2YgdGhlCisgKiBnaXZlbiBzdGF0ZS4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLmdldENvbnRyb2xCb3VuZHMgPSBmdW5jdGlvbihzdGF0ZSwgdywgaCkKK3sKKwlpZiAoc3RhdGUuY29udHJvbCAhPSBudWxsKQorCXsKKwkJdmFyIHMgPSBzdGF0ZS52aWV3LnNjYWxlOworCQl2YXIgY3ggPSBzdGF0ZS5nZXRDZW50ZXJYKCk7CisJCXZhciBjeSA9IHN0YXRlLmdldENlbnRlclkoKTsKKwkKKwkJaWYgKCFzdGF0ZS52aWV3LmdyYXBoLmdldE1vZGVsKCkuaXNFZGdlKHN0YXRlLmNlbGwpKQorCQl7CisJCQljeCA9IHN0YXRlLnggKyB3ICogczsKKwkJCWN5ID0gc3RhdGUueSArIGggKiBzOworCQkJCisJCQlpZiAoc3RhdGUuc2hhcGUgIT0gbnVsbCkKKwkJCXsKKwkJCQkvLyBUT0RPOiBGYWN0b3Igb3V0IGNvbW1vbiBjb2RlCisJCQkJdmFyIHJvdCA9IHN0YXRlLnNoYXBlLmdldFNoYXBlUm90YXRpb24oKTsKKwkJCQkKKwkJCQlpZiAodGhpcy5sZWdhY3lDb250cm9sUG9zaXRpb24pCisJCQkJeworCQkJCQlyb3QgPSBteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9ST1RBVElPTiwgMCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmIChzdGF0ZS5zaGFwZS5pc1BhaW50Qm91bmRzSW52ZXJ0ZWQoKSkKKwkJCQkJeworCQkJCQkJdmFyIHQgPSAoc3RhdGUud2lkdGggLSBzdGF0ZS5oZWlnaHQpIC8gMjsKKwkJCQkJCWN4ICs9IHQ7CisJCQkJCQljeSAtPSB0OworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCWlmIChyb3QgIT0gMCkKKwkJCQl7CisJCQkgICAgICAgIHZhciByYWQgPSBteFV0aWxzLnRvUmFkaWFucyhyb3QpOworCQkJICAgICAgICB2YXIgY29zID0gTWF0aC5jb3MocmFkKTsKKwkJCSAgICAgICAgdmFyIHNpbiA9IE1hdGguc2luKHJhZCk7CisJCQkgICAgICAgIAorCQkJICAgICAgICB2YXIgcG9pbnQgPSBteFV0aWxzLmdldFJvdGF0ZWRQb2ludChuZXcgbXhQb2ludChjeCwgY3kpLCBjb3MsIHNpbiwKKwkJCSAgICAgICAgCQluZXcgbXhQb2ludChzdGF0ZS5nZXRDZW50ZXJYKCksIHN0YXRlLmdldENlbnRlclkoKSkpOworCQkJICAgICAgICBjeCA9IHBvaW50Lng7CisJCQkgICAgICAgIGN5ID0gcG9pbnQueTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXJldHVybiAoc3RhdGUudmlldy5ncmFwaC5nZXRNb2RlbCgpLmlzRWRnZShzdGF0ZS5jZWxsKSkgPyAKKwkJCW5ldyBteFJlY3RhbmdsZShNYXRoLnJvdW5kKGN4IC0gdyAvIDIgKiBzKSwgTWF0aC5yb3VuZChjeSAtIGggLyAyICogcyksIE1hdGgucm91bmQodyAqIHMpLCBNYXRoLnJvdW5kKGggKiBzKSkKKwkJCTogbmV3IG14UmVjdGFuZ2xlKE1hdGgucm91bmQoY3ggLSB3IC8gMiAqIHMpLCBNYXRoLnJvdW5kKGN5IC0gaCAvIDIgKiBzKSwgTWF0aC5yb3VuZCh3ICogcyksIE1hdGgucm91bmQoaCAqIHMpKTsKKwl9CisJCisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbnNlcnRTdGF0ZUFmdGVyCisgKiAKKyAqIEluc2VydHMgdGhlIGdpdmVuIGFycmF5IG9mIDxteFNoYXBlcz4gYWZ0ZXIgdGhlIGdpdmVuIG5vZGVzIGluIHRoZSBET00uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHNoYXBlcyAtIEFycmF5IG9mIDxteFNoYXBlcz4gdG8gYmUgaW5zZXJ0ZWQuCisgKiBub2RlIC0gTm9kZSBpbiA8ZHJhd1BhbmU+IGFmdGVyIHdoaWNoIHRoZSBzaGFwZXMgc2hvdWxkIGJlIGluc2VydGVkLgorICogaHRtbE5vZGUgLSBOb2RlIGluIHRoZSBncmFwaCBjb250YWluZXIgYWZ0ZXIgd2hpY2ggdGhlIHNoYXBlcyBzaG91bGQgYmUgaW5zZXJ0ZWQgdGhhdAorICogd2lsbCBub3QgZ28gaW50byB0aGUgPGRyYXdQYW5lPiAoZWcuIEhUTUwgbGFiZWxzIHdpdGhvdXQgZm9yZWlnbk9iamVjdHMpLgorICovCitteENlbGxSZW5kZXJlci5wcm90b3R5cGUuaW5zZXJ0U3RhdGVBZnRlciA9IGZ1bmN0aW9uKHN0YXRlLCBub2RlLCBodG1sTm9kZSkKK3sKKwl2YXIgc2hhcGVzID0gdGhpcy5nZXRTaGFwZXNGb3JTdGF0ZShzdGF0ZSk7CisJCisJZm9yICh2YXIgaSA9IDA7IGkgPCBzaGFwZXMubGVuZ3RoOyBpKyspCisJeworCQlpZiAoc2hhcGVzW2ldICE9IG51bGwgJiYgc2hhcGVzW2ldLm5vZGUgIT0gbnVsbCkKKwkJeworCQkJdmFyIGh0bWwgPSBzaGFwZXNbaV0ubm9kZS5wYXJlbnROb2RlICE9IHN0YXRlLnZpZXcuZ2V0RHJhd1BhbmUoKSAmJgorCQkJCXNoYXBlc1tpXS5ub2RlLnBhcmVudE5vZGUgIT0gc3RhdGUudmlldy5nZXRPdmVybGF5UGFuZSgpOworCQkJdmFyIHRlbXAgPSAoaHRtbCkgPyBodG1sTm9kZSA6IG5vZGU7CisJCQkKKwkJCWlmICh0ZW1wICE9IG51bGwgJiYgdGVtcC5uZXh0U2libGluZyAhPSBzaGFwZXNbaV0ubm9kZSkKKwkJCXsKKwkJCQlpZiAodGVtcC5uZXh0U2libGluZyA9PSBudWxsKQorCQkJCXsKKwkJCQkJdGVtcC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHNoYXBlc1tpXS5ub2RlKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdGVtcC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaGFwZXNbaV0ubm9kZSwgdGVtcC5uZXh0U2libGluZyk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAodGVtcCA9PSBudWxsKQorCQkJeworCQkJCS8vIFNwZWNpYWwgY2FzZTogRmlyc3QgSFRNTCBub2RlIHNob3VsZCBiZSBmaXJzdCBzaWJsaW5nIGFmdGVyIGNhbnZhcworCQkJCWlmIChzaGFwZXNbaV0ubm9kZS5wYXJlbnROb2RlID09IHN0YXRlLnZpZXcuZ3JhcGguY29udGFpbmVyKQorCQkJCXsKKwkJCQkJdmFyIGNhbnZhcyA9IHN0YXRlLnZpZXcuY2FudmFzOworCQkJCQkKKwkJCQkJd2hpbGUgKGNhbnZhcyAhPSBudWxsICYmIGNhbnZhcy5wYXJlbnROb2RlICE9IHN0YXRlLnZpZXcuZ3JhcGguY29udGFpbmVyKQorCQkJCQl7CisJCQkJCQljYW52YXMgPSBjYW52YXMucGFyZW50Tm9kZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKGNhbnZhcyAhPSBudWxsICYmIGNhbnZhcy5uZXh0U2libGluZyAhPSBudWxsKQorCQkJCQl7CisJCQkJCQlpZiAoY2FudmFzLm5leHRTaWJsaW5nICE9IHNoYXBlc1tpXS5ub2RlKQorCQkJCQkJeworCQkJCQkJCXNoYXBlc1tpXS5ub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNoYXBlc1tpXS5ub2RlLCBjYW52YXMubmV4dFNpYmxpbmcpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJc2hhcGVzW2ldLm5vZGUucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChzaGFwZXNbaV0ubm9kZSk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAoc2hhcGVzW2ldLm5vZGUucGFyZW50Tm9kZS5maXJzdENoaWxkICE9IG51bGwgJiYgc2hhcGVzW2ldLm5vZGUucGFyZW50Tm9kZS5maXJzdENoaWxkICE9IHNoYXBlc1tpXS5ub2RlKQorCQkJCXsKKwkJCQkJLy8gSW5zZXJ0cyB0aGUgbm9kZSBhcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIHBhcmVudCB0byBpbXBsZW1lbnQgdGhlIG9yZGVyCisJCQkJCXNoYXBlc1tpXS5ub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNoYXBlc1tpXS5ub2RlLCBzaGFwZXNbaV0ubm9kZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpOworCQkJCX0KKwkJCX0KKwkJCQorCQkJaWYgKGh0bWwpCisJCQl7CisJCQkJaHRtbE5vZGUgPSBzaGFwZXNbaV0ubm9kZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlub2RlID0gc2hhcGVzW2ldLm5vZGU7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gW25vZGUsIGh0bWxOb2RlXTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFNoYXBlc0ZvclN0YXRlCisgKiAKKyAqIFJldHVybnMgdGhlIDxteFNoYXBlcz4gZm9yIHRoZSBnaXZlbiBjZWxsIHN0YXRlIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHNob3VsZAorICogYXBwZWFyIGluIHRoZSBET00uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB3aG9zZSBzaGFwZXMgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteENlbGxSZW5kZXJlci5wcm90b3R5cGUuZ2V0U2hhcGVzRm9yU3RhdGUgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlyZXR1cm4gW3N0YXRlLnNoYXBlLCBzdGF0ZS50ZXh0LCBzdGF0ZS5jb250cm9sXTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlZHJhdworICogCisgKiBVcGRhdGVzIHRoZSBib3VuZHMgb3IgcG9pbnRzIGFuZCBzY2FsZSBvZiB0aGUgc2hhcGVzIGZvciB0aGUgZ2l2ZW4gY2VsbAorICogc3RhdGUuIFRoaXMgaXMgY2FsbGVkIGluIG14R3JhcGhWaWV3LnZhbGlkYXRlUG9pbnRzIGFzIHRoZSBsYXN0IHN0ZXAgb2YKKyAqIHVwZGF0aW5nIGFsbCBjZWxscy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IGZvciB3aGljaCB0aGUgc2hhcGVzIHNob3VsZCBiZSB1cGRhdGVkLgorICogZm9yY2UgLSBPcHRpb25hbCBib29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIHRoZSBjZWxsIHNob3VsZCBiZSByZWNvbmZpdXJlZAorICogYW5kIHJlZHJhd24gd2l0aG91dCBhbnkgYWRkaXRpb25hbCBjaGVja3MuCisgKiByZW5kZXJpbmcgLSBPcHRpb25hbCBib29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIHRoZSBjZWxsIHNob3VsZCBhY3R1YWxseQorICogYmUgZHJhd24gaW50byB0aGUgRE9NLiBJZiB0aGlzIGlzIGZhbHNlIHRoZW4gcmVkcmF3IGFuZC9vciByZWNvbmZpZ3VyZQorICogd2lsbCBub3QgYmUgY2FsbGVkIG9uIHRoZSBzaGFwZS4KKyAqLworbXhDZWxsUmVuZGVyZXIucHJvdG90eXBlLnJlZHJhdyA9IGZ1bmN0aW9uKHN0YXRlLCBmb3JjZSwgcmVuZGVyaW5nKQoreworCXZhciBzaGFwZUNoYW5nZWQgPSB0aGlzLnJlZHJhd1NoYXBlKHN0YXRlLCBmb3JjZSwgcmVuZGVyaW5nKTsKKwkKKwlpZiAoc3RhdGUuc2hhcGUgIT0gbnVsbCAmJiAocmVuZGVyaW5nID09IG51bGwgfHwgcmVuZGVyaW5nKSkKKwl7CisJCXRoaXMucmVkcmF3TGFiZWwoc3RhdGUsIHNoYXBlQ2hhbmdlZCk7CisJCXRoaXMucmVkcmF3Q2VsbE92ZXJsYXlzKHN0YXRlLCBzaGFwZUNoYW5nZWQpOworCQl0aGlzLnJlZHJhd0NvbnRyb2woc3RhdGUsIHNoYXBlQ2hhbmdlZCk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVkcmF3U2hhcGUKKyAqIAorICogUmVkcmF3cyB0aGUgc2hhcGUgZm9yIHRoZSBnaXZlbiBjZWxsIHN0YXRlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gd2hvc2UgbGFiZWwgc2hvdWxkIGJlIHJlZHJhd24uCisgKi8KK214Q2VsbFJlbmRlcmVyLnByb3RvdHlwZS5yZWRyYXdTaGFwZSA9IGZ1bmN0aW9uKHN0YXRlLCBmb3JjZSwgcmVuZGVyaW5nKQoreworCXZhciBtb2RlbCA9IHN0YXRlLnZpZXcuZ3JhcGgubW9kZWw7CisJdmFyIHNoYXBlQ2hhbmdlZCA9IGZhbHNlOworCisJLy8gRm9yY2VzIGNyZWF0aW9uIG9mIG5ldyBzaGFwZSBpZiBzaGFwZSBzdHlsZSBoYXMgY2hhbmdlZAorCWlmIChzdGF0ZS5zaGFwZSAhPSBudWxsICYmIHN0YXRlLnNoYXBlLnN0eWxlICE9IG51bGwgJiYgc3RhdGUuc3R5bGUgIT0gbnVsbCAmJgorCQlzdGF0ZS5zaGFwZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9TSEFQRV0gIT0gc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU0hBUEVdKQorCXsKKwkJc3RhdGUuc2hhcGUuZGVzdHJveSgpOworCQlzdGF0ZS5zaGFwZSA9IG51bGw7CisJfQorCQorCWlmIChzdGF0ZS5zaGFwZSA9PSBudWxsICYmIHN0YXRlLnZpZXcuZ3JhcGguY29udGFpbmVyICE9IG51bGwgJiYKKwkJc3RhdGUuY2VsbCAhPSBzdGF0ZS52aWV3LmN1cnJlbnRSb290ICYmCisJCShtb2RlbC5pc1ZlcnRleChzdGF0ZS5jZWxsKSB8fCBtb2RlbC5pc0VkZ2Uoc3RhdGUuY2VsbCkpKQorCXsKKwkJc3RhdGUuc2hhcGUgPSB0aGlzLmNyZWF0ZVNoYXBlKHN0YXRlKTsKKwkJCisJCWlmIChzdGF0ZS5zaGFwZSAhPSBudWxsKQorCQl7CisJCQlzdGF0ZS5zaGFwZS5hbnRpQWxpYXMgPSB0aGlzLmFudGlBbGlhczsKKwkKKwkJCXRoaXMuY3JlYXRlSW5kaWNhdG9yU2hhcGUoc3RhdGUpOworCQkJdGhpcy5pbml0aWFsaXplU2hhcGUoc3RhdGUpOworCQkJdGhpcy5jcmVhdGVDZWxsT3ZlcmxheXMoc3RhdGUpOworCQkJdGhpcy5pbnN0YWxsTGlzdGVuZXJzKHN0YXRlKTsKKwkJCQorCQkJLy8gRm9yY2VzIGEgcmVmcmVzaCBvZiB0aGUgaGFuZGxlciBvZiBvbmUgZXhpc3RzCisJCQlzdGF0ZS52aWV3LmdyYXBoLnNlbGVjdGlvbkNlbGxzSGFuZGxlci51cGRhdGVIYW5kbGVyKHN0YXRlKTsKKwkJfQorCX0KKwllbHNlIGlmIChzdGF0ZS5zaGFwZSAhPSBudWxsICYmICFteFV0aWxzLmVxdWFsRW50cmllcyhzdGF0ZS5zaGFwZS5zdHlsZSwgc3RhdGUuc3R5bGUpKQorCXsKKwkJc3RhdGUuc2hhcGUucmVzZXRTdHlsZXMoKTsKKwkJdGhpcy5jb25maWd1cmVTaGFwZShzdGF0ZSk7CisJCS8vIExBVEVSOiBJZ25vcmUgdXBkYXRlIGZvciByZWFsdGltZSB0byBmaXggcmVzZXQgb2YgY3VycmVudCBnZXN0dXJlCisJCXN0YXRlLnZpZXcuZ3JhcGguc2VsZWN0aW9uQ2VsbHNIYW5kbGVyLnVwZGF0ZUhhbmRsZXIoc3RhdGUpOworCQlmb3JjZSA9IHRydWU7CisJfQorCisJaWYgKHN0YXRlLnNoYXBlICE9IG51bGwpCisJeworCQkvLyBIYW5kbGVzIGNoYW5nZXMgb2YgdGhlIGNvbGxhcHNlIGljb24KKwkJdGhpcy5jcmVhdGVDb250cm9sKHN0YXRlKTsKKwkJCisJCS8vIFJlZHJhd3MgdGhlIGNlbGwgaWYgcmVxdWlyZWQsIGlnbm9yZXMgY2hhbmdlcyB0byBib3VuZHMgaWYgcG9pbnRzIGFyZQorCQkvLyBkZWZpbmVkIGFzIHRoZSBib3VuZHMgYXJlIHVwZGF0ZWQgZm9yIHRoZSBnaXZlbiBwb2ludHMgaW5zaWRlIHRoZSBzaGFwZQorCQlpZiAoZm9yY2UgfHwgdGhpcy5pc1NoYXBlSW52YWxpZChzdGF0ZSwgc3RhdGUuc2hhcGUpKQorCQl7CisJCQlpZiAoc3RhdGUuYWJzb2x1dGVQb2ludHMgIT0gbnVsbCkKKwkJCXsKKwkJCQlzdGF0ZS5zaGFwZS5wb2ludHMgPSBzdGF0ZS5hYnNvbHV0ZVBvaW50cy5zbGljZSgpOworCQkJCXN0YXRlLnNoYXBlLmJvdW5kcyA9IG51bGw7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc3RhdGUuc2hhcGUucG9pbnRzID0gbnVsbDsKKwkJCQlzdGF0ZS5zaGFwZS5ib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUoc3RhdGUueCwgc3RhdGUueSwgc3RhdGUud2lkdGgsIHN0YXRlLmhlaWdodCk7CisJCQl9CisKKwkJCXN0YXRlLnNoYXBlLnNjYWxlID0gc3RhdGUudmlldy5zY2FsZTsKKwkJCQorCQkJaWYgKHJlbmRlcmluZyA9PSBudWxsIHx8IHJlbmRlcmluZykKKwkJCXsKKwkJCQlzdGF0ZS5zaGFwZS5yZWRyYXcoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzdGF0ZS5zaGFwZS51cGRhdGVCb3VuZGluZ0JveCgpOworCQkJfQorCQkJCisJCQlzaGFwZUNoYW5nZWQgPSB0cnVlOworCQl9CisJfQorCisJcmV0dXJuIHNoYXBlQ2hhbmdlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzU2hhcGVJbnZhbGlkCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2hhcGUgbXVzdCBiZSByZXBhaW50ZWQuCisgKi8KK214Q2VsbFJlbmRlcmVyLnByb3RvdHlwZS5pc1NoYXBlSW52YWxpZCA9IGZ1bmN0aW9uKHN0YXRlLCBzaGFwZSkKK3sKKwlyZXR1cm4gc2hhcGUuYm91bmRzID09IG51bGwgfHwgc2hhcGUuc2NhbGUgIT0gc3RhdGUudmlldy5zY2FsZSB8fAorCQkoc3RhdGUuYWJzb2x1dGVQb2ludHMgPT0gbnVsbCAmJiAhc2hhcGUuYm91bmRzLmVxdWFscyhzdGF0ZSkpIHx8CisJCShzdGF0ZS5hYnNvbHV0ZVBvaW50cyAhPSBudWxsICYmICFteFV0aWxzLmVxdWFsUG9pbnRzKHNoYXBlLnBvaW50cywgc3RhdGUuYWJzb2x1dGVQb2ludHMpKQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZGVzdHJveQorICogCisgKiBEZXN0cm95cyB0aGUgc2hhcGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY2VsbCBzdGF0ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IGZvciB3aGljaCB0aGUgc2hhcGVzIHNob3VsZCBiZSBkZXN0cm95ZWQuCisgKi8KK214Q2VsbFJlbmRlcmVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oc3RhdGUpCit7CisJaWYgKHN0YXRlLnNoYXBlICE9IG51bGwpCisJeworCQlpZiAoc3RhdGUudGV4dCAhPSBudWxsKQorCQl7CQkKKwkJCXN0YXRlLnRleHQuZGVzdHJveSgpOworCQkJc3RhdGUudGV4dCA9IG51bGw7CisJCX0KKwkJCisJCWlmIChzdGF0ZS5vdmVybGF5cyAhPSBudWxsKQorCQl7CisJCQlzdGF0ZS5vdmVybGF5cy52aXNpdChmdW5jdGlvbihpZCwgc2hhcGUpCisJCQl7CisJCQkJc2hhcGUuZGVzdHJveSgpOworCQkJfSk7CisJCQkKKwkJCXN0YXRlLm92ZXJsYXlzID0gbnVsbDsKKwkJfQorCisJCWlmIChzdGF0ZS5jb250cm9sICE9IG51bGwpCisJCXsKKwkJCXN0YXRlLmNvbnRyb2wuZGVzdHJveSgpOworCQkJc3RhdGUuY29udHJvbCA9IG51bGw7CisJCX0KKwkJCisJCXN0YXRlLnNoYXBlLmRlc3Ryb3koKTsKKwkJc3RhdGUuc2hhcGUgPSBudWxsOworCX0KK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teENlbGxTdGF0ZS5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214Q2VsbFN0YXRlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNTYzYTcKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teENlbGxTdGF0ZS5qcwpAQCAtMCwwICsxLDQzMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhDZWxsU3RhdGUKKyAqIAorICogUmVwcmVzZW50cyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIGNlbGwgaW4gYSBnaXZlbiA8bXhHcmFwaFZpZXc+LgorICogCisgKiBGb3IgZWRnZXMsIHRoZSBlZGdlIGxhYmVsIHBvc2l0aW9uIGlzIHN0b3JlZCBpbiA8YWJzb2x1dGVPZmZzZXQ+LgorICogCisgKiBUaGUgc2l6ZSBmb3Igb3ZlcnNpemUgbGFiZWxzIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgdGhlIGJvdW5kaW5nQm94IHByb3BlcnR5CisgKiBvZiB0aGUgPHRleHQ+IGZpZWxkIGFzIHNob3duIGJlbG93LgorICogCisgKiAoY29kZSkKKyAqIHZhciBiYm94ID0gKHN0YXRlLnRleHQgIT0gbnVsbCkgPyBzdGF0ZS50ZXh0LmJvdW5kaW5nQm94IDogbnVsbDsKKyAqIChlbmQpCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteENlbGxTdGF0ZQorICogCisgKiBDb25zdHJ1Y3RzIGEgbmV3IG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGdpdmVuCisgKiBjZWxsIGluIHRoZSBzcGVjaWZpZWQgdmlldy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmlldyAtIDxteEdyYXBoVmlldz4gdGhhdCBjb250YWlucyB0aGUgc3RhdGUuCisgKiBjZWxsIC0gPG14Q2VsbD4gdGhhdCB0aGlzIHN0YXRlIHJlcHJlc2VudHMuCisgKiBzdHlsZSAtIEFycmF5IG9mIGtleSwgdmFsdWUgcGFpcnMgdGhhdCBjb25zdGl0dXRlIHRoZSBzdHlsZS4KKyAqLworZnVuY3Rpb24gbXhDZWxsU3RhdGUodmlldywgY2VsbCwgc3R5bGUpCit7CisJdGhpcy52aWV3ID0gdmlldzsKKwl0aGlzLmNlbGwgPSBjZWxsOworCXRoaXMuc3R5bGUgPSBzdHlsZTsKKwkKKwl0aGlzLm9yaWdpbiA9IG5ldyBteFBvaW50KCk7CisJdGhpcy5hYnNvbHV0ZU9mZnNldCA9IG5ldyBteFBvaW50KCk7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhSZWN0YW5nbGUuCisgKi8KK214Q2VsbFN0YXRlLnByb3RvdHlwZSA9IG5ldyBteFJlY3RhbmdsZSgpOworbXhDZWxsU3RhdGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhDZWxsU3RhdGU7CisKKy8qKgorICogVmFyaWFibGU6IHZpZXcKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgPG14R3JhcGhWaWV3Pi4KKyAqLworbXhDZWxsU3RhdGUucHJvdG90eXBlLnZpZXcgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjZWxsCisgKgorICogUmVmZXJlbmNlIHRvIHRoZSA8bXhDZWxsPiB0aGF0IGlzIHJlcHJlc2VudGVkIGJ5IHRoaXMgc3RhdGUuCisgKi8KK214Q2VsbFN0YXRlLnByb3RvdHlwZS5jZWxsID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogc3R5bGUKKyAqIAorICogQ29udGFpbnMgYW4gYXJyYXkgb2Yga2V5LCB2YWx1ZSBwYWlycyB0aGF0IHJlcHJlc2VudCB0aGUgc3R5bGUgb2YgdGhlCisgKiBjZWxsLgorICovCitteENlbGxTdGF0ZS5wcm90b3R5cGUuc3R5bGUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBpbnZhbGlkCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgc3RhdGUgaXMgaW52YWxpZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteENlbGxTdGF0ZS5wcm90b3R5cGUuaW52YWxpZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IG9yaWdpbgorICoKKyAqIDxteFBvaW50PiB0aGF0IGhvbGRzIHRoZSBvcmlnaW4gZm9yIGFsbCBjaGlsZCBjZWxscy4gRGVmYXVsdCBpcyBhIG5ldworICogZW1wdHkgPG14UG9pbnQ+LgorICovCitteENlbGxTdGF0ZS5wcm90b3R5cGUub3JpZ2luID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogYWJzb2x1dGVQb2ludHMKKyAqIAorICogSG9sZHMgYW4gYXJyYXkgb2YgPG14UG9pbnRzPiB0aGF0IHJlcHJlc2VudCB0aGUgYWJzb2x1dGUgcG9pbnRzIG9mIGFuCisgKiBlZGdlLgorICovCitteENlbGxTdGF0ZS5wcm90b3R5cGUuYWJzb2x1dGVQb2ludHMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBhYnNvbHV0ZU9mZnNldAorICoKKyAqIDxteFBvaW50PiB0aGF0IGhvbGRzIHRoZSBhYnNvbHV0ZSBvZmZzZXQuIEZvciBlZGdlcywgdGhpcyBpcyB0aGUKKyAqIGFic29sdXRlIGNvb3JkaW5hdGVzIG9mIHRoZSBsYWJlbCBwb3NpdGlvbi4gRm9yIHZlcnRpY2VzLCB0aGlzIGlzIHRoZQorICogb2Zmc2V0IG9mIHRoZSBsYWJlbCByZWxhdGl2ZSB0byB0aGUgdG9wLCBsZWZ0IGNvcm5lciBvZiB0aGUgdmVydGV4LiAKKyAqLworbXhDZWxsU3RhdGUucHJvdG90eXBlLmFic29sdXRlT2Zmc2V0ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogdmlzaWJsZVNvdXJjZVN0YXRlCisgKiAKKyAqIENhY2hlcyB0aGUgdmlzaWJsZSBzb3VyY2UgdGVybWluYWwgc3RhdGUuCisgKi8KK214Q2VsbFN0YXRlLnByb3RvdHlwZS52aXNpYmxlU291cmNlU3RhdGUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB2aXNpYmxlVGFyZ2V0U3RhdGUKKyAqIAorICogQ2FjaGVzIHRoZSB2aXNpYmxlIHRhcmdldCB0ZXJtaW5hbCBzdGF0ZS4KKyAqLworbXhDZWxsU3RhdGUucHJvdG90eXBlLnZpc2libGVUYXJnZXRTdGF0ZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHRlcm1pbmFsRGlzdGFuY2UKKyAqIAorICogQ2FjaGVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBlbmQgcG9pbnRzIGZvciBhbiBlZGdlLgorICovCitteENlbGxTdGF0ZS5wcm90b3R5cGUudGVybWluYWxEaXN0YW5jZSA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IGxlbmd0aAorICoKKyAqIENhY2hlcyB0aGUgbGVuZ3RoIG9mIGFuIGVkZ2UuCisgKi8KK214Q2VsbFN0YXRlLnByb3RvdHlwZS5sZW5ndGggPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBzZWdtZW50cworICogCisgKiBBcnJheSBvZiBudW1iZXJzIHRoYXQgcmVwcmVzZW50IHRoZSBjYWNoZWQgbGVuZ3RoIG9mIGVhY2ggc2VnbWVudCBvZiB0aGUKKyAqIGVkZ2UuCisgKi8KK214Q2VsbFN0YXRlLnByb3RvdHlwZS5zZWdtZW50cyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHNoYXBlCisgKiAKKyAqIEhvbGRzIHRoZSA8bXhTaGFwZT4gdGhhdCByZXByZXNlbnRzIHRoZSBjZWxsIGdyYXBoaWNhbGx5LgorICovCitteENlbGxTdGF0ZS5wcm90b3R5cGUuc2hhcGUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB0ZXh0CisgKiAKKyAqIEhvbGRzIHRoZSA8bXhUZXh0PiB0aGF0IHJlcHJlc2VudHMgdGhlIGxhYmVsIG9mIHRoZSBjZWxsLiBUaGkgc21heSBiZQorICogbnVsbCBpZiB0aGUgY2VsbCBoYXMgbm8gbGFiZWwuCisgKi8KK214Q2VsbFN0YXRlLnByb3RvdHlwZS50ZXh0ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogdW5zY2FsZWRXaWR0aAorICogCisgKiBIb2xkcyB0aGUgdW5zY2FsZWQgd2lkdGggb2YgdGhlIHN0YXRlLgorICovCitteENlbGxTdGF0ZS5wcm90b3R5cGUudW5zY2FsZWRXaWR0aCA9IG51bGw7CisKKy8qKgorICogRnVuY3Rpb246IGdldFBlcmltZXRlckJvdW5kcworICogCisgKiBSZXR1cm5zIHRoZSA8bXhSZWN0YW5nbGU+IHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIHBlcmltZXRlciBvZiB0aGUKKyAqIGNlbGwuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGJvcmRlciAtIE9wdGlvbmFsIGJvcmRlciB0byBiZSBhZGRlZCBhcm91bmQgdGhlIHBlcmltZXRlciBib3VuZHMuCisgKiBib3VuZHMgLSBPcHRpb25hbCA8bXhSZWN0YW5nbGU+IHRvIGJlIHVzZWQgYXMgdGhlIGluaXRpYWwgYm91bmRzLgorICovCitteENlbGxTdGF0ZS5wcm90b3R5cGUuZ2V0UGVyaW1ldGVyQm91bmRzID0gZnVuY3Rpb24oYm9yZGVyLCBib3VuZHMpCit7CisJYm9yZGVyID0gYm9yZGVyIHx8IDA7CisJYm91bmRzID0gKGJvdW5kcyAhPSBudWxsKSA/IGJvdW5kcyA6IG5ldyBteFJlY3RhbmdsZSh0aGlzLngsIHRoaXMueSwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpOworCQorCWlmICh0aGlzLnNoYXBlICE9IG51bGwgJiYgdGhpcy5zaGFwZS5zdGVuY2lsICE9IG51bGwgJiYgdGhpcy5zaGFwZS5zdGVuY2lsLmFzcGVjdCA9PSAnZml4ZWQnKQorCXsKKwkJdmFyIGFzcGVjdCA9IHRoaXMuc2hhcGUuc3RlbmNpbC5jb21wdXRlQXNwZWN0KHRoaXMuc3R5bGUsIGJvdW5kcy54LCBib3VuZHMueSwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKKwkJCisJCWJvdW5kcy54ID0gYXNwZWN0Lng7CisJCWJvdW5kcy55ID0gYXNwZWN0Lnk7CisJCWJvdW5kcy53aWR0aCA9IHRoaXMuc2hhcGUuc3RlbmNpbC53MCAqIGFzcGVjdC53aWR0aDsKKwkJYm91bmRzLmhlaWdodCA9IHRoaXMuc2hhcGUuc3RlbmNpbC5oMCAqIGFzcGVjdC5oZWlnaHQ7CisJfQorCQorCWlmIChib3JkZXIgIT0gMCkKKwl7CisJCWJvdW5kcy5ncm93KGJvcmRlcik7CisJfQorCQorCXJldHVybiBib3VuZHM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRBYnNvbHV0ZVRlcm1pbmFsUG9pbnQKKyAqIAorICogU2V0cyB0aGUgZmlyc3Qgb3IgbGFzdCBwb2ludCBpbiA8YWJzb2x1dGVQb2ludHM+IGRlcGVuZGluZyBvbiBpc1NvdXJjZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogcG9pbnQgLSA8bXhQb2ludD4gdGhhdCByZXByZXNlbnRzIHRoZSB0ZXJtaW5hbCBwb2ludC4KKyAqIGlzU291cmNlIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgZmlyc3Qgb3IgbGFzdCBwb2ludCBzaG91bGQKKyAqIGJlIGFzc2lnbmVkLgorICovCitteENlbGxTdGF0ZS5wcm90b3R5cGUuc2V0QWJzb2x1dGVUZXJtaW5hbFBvaW50ID0gZnVuY3Rpb24ocG9pbnQsIGlzU291cmNlKQoreworCWlmIChpc1NvdXJjZSkKKwl7CisJCWlmICh0aGlzLmFic29sdXRlUG9pbnRzID09IG51bGwpCisJCXsKKwkJCXRoaXMuYWJzb2x1dGVQb2ludHMgPSBbXTsKKwkJfQorCQkKKwkJaWYgKHRoaXMuYWJzb2x1dGVQb2ludHMubGVuZ3RoID09IDApCisJCXsKKwkJCXRoaXMuYWJzb2x1dGVQb2ludHMucHVzaChwb2ludCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLmFic29sdXRlUG9pbnRzWzBdID0gcG9pbnQ7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYgKHRoaXMuYWJzb2x1dGVQb2ludHMgPT0gbnVsbCkKKwkJeworCQkJdGhpcy5hYnNvbHV0ZVBvaW50cyA9IFtdOworCQkJdGhpcy5hYnNvbHV0ZVBvaW50cy5wdXNoKG51bGwpOworCQkJdGhpcy5hYnNvbHV0ZVBvaW50cy5wdXNoKHBvaW50KTsKKwkJfQorCQllbHNlIGlmICh0aGlzLmFic29sdXRlUG9pbnRzLmxlbmd0aCA9PSAxKQorCQl7CisJCQl0aGlzLmFic29sdXRlUG9pbnRzLnB1c2gocG9pbnQpOworCQl9CisJCWVsc2UKKwkJeworCQkJdGhpcy5hYnNvbHV0ZVBvaW50c1t0aGlzLmFic29sdXRlUG9pbnRzLmxlbmd0aCAtIDFdID0gcG9pbnQ7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRDdXJzb3IKKyAqIAorICogU2V0cyB0aGUgZ2l2ZW4gY3Vyc29yIG9uIHRoZSBzaGFwZSBhbmQgdGV4dCBzaGFwZS4KKyAqLworbXhDZWxsU3RhdGUucHJvdG90eXBlLnNldEN1cnNvciA9IGZ1bmN0aW9uKGN1cnNvcikKK3sKKwlpZiAodGhpcy5zaGFwZSAhPSBudWxsKQorCXsKKwkJdGhpcy5zaGFwZS5zZXRDdXJzb3IoY3Vyc29yKTsKKwl9CisJCisJaWYgKHRoaXMudGV4dCAhPSBudWxsKQorCXsKKwkJdGhpcy50ZXh0LnNldEN1cnNvcihjdXJzb3IpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFZpc2libGVUZXJtaW5hbAorICogCisgKiBSZXR1cm5zIHRoZSB2aXNpYmxlIHNvdXJjZSBvciB0YXJnZXQgdGVybWluYWwgY2VsbC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc291cmNlIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgc291cmNlIG9yIHRhcmdldCBjZWxsIHNob3VsZCBiZQorICogcmV0dXJuZWQuCisgKi8KK214Q2VsbFN0YXRlLnByb3RvdHlwZS5nZXRWaXNpYmxlVGVybWluYWwgPSBmdW5jdGlvbihzb3VyY2UpCit7CisJdmFyIHRtcCA9IHRoaXMuZ2V0VmlzaWJsZVRlcm1pbmFsU3RhdGUoc291cmNlKTsKKwkKKwlyZXR1cm4gKHRtcCAhPSBudWxsKSA/IHRtcC5jZWxsIDogbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFZpc2libGVUZXJtaW5hbFN0YXRlCisgKiAKKyAqIFJldHVybnMgdGhlIHZpc2libGUgc291cmNlIG9yIHRhcmdldCB0ZXJtaW5hbCBzdGF0ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc291cmNlIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgc291cmNlIG9yIHRhcmdldCBzdGF0ZSBzaG91bGQgYmUKKyAqIHJldHVybmVkLgorICovCitteENlbGxTdGF0ZS5wcm90b3R5cGUuZ2V0VmlzaWJsZVRlcm1pbmFsU3RhdGUgPSBmdW5jdGlvbihzb3VyY2UpCit7CisJcmV0dXJuIChzb3VyY2UpID8gdGhpcy52aXNpYmxlU291cmNlU3RhdGUgOiB0aGlzLnZpc2libGVUYXJnZXRTdGF0ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFZpc2libGVUZXJtaW5hbFN0YXRlCisgKiAKKyAqIFNldHMgdGhlIHZpc2libGUgc291cmNlIG9yIHRhcmdldCB0ZXJtaW5hbCBzdGF0ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdGVybWluYWxTdGF0ZSAtIDxteENlbGxTdGF0ZT4gdGhhdCByZXByZXNlbnRzIHRoZSB0ZXJtaW5hbC4KKyAqIHNvdXJjZSAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIHNvdXJjZSBvciB0YXJnZXQgc3RhdGUgc2hvdWxkIGJlIHNldC4KKyAqLworbXhDZWxsU3RhdGUucHJvdG90eXBlLnNldFZpc2libGVUZXJtaW5hbFN0YXRlID0gZnVuY3Rpb24odGVybWluYWxTdGF0ZSwgc291cmNlKQoreworCWlmIChzb3VyY2UpCisJeworCQl0aGlzLnZpc2libGVTb3VyY2VTdGF0ZSA9IHRlcm1pbmFsU3RhdGU7CisJfQorCWVsc2UKKwl7CisJCXRoaXMudmlzaWJsZVRhcmdldFN0YXRlID0gdGVybWluYWxTdGF0ZTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDZWxsQm91bmRzCisgKiAKKyAqIFJldHVybnMgdGhlIHVuc2NhbGVkLCB1bnRyYW5zbGF0ZWQgYm91bmRzLgorICovCitteENlbGxTdGF0ZS5wcm90b3R5cGUuZ2V0Q2VsbEJvdW5kcyA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5jZWxsQm91bmRzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0UGFpbnRCb3VuZHMKKyAqIAorICogUmV0dXJucyB0aGUgdW5zY2FsZWQsIHVudHJhbnNsYXRlZCBwYWludCBib3VuZHMuIFRoaXMgaXMgdGhlIHNhbWUgYXMKKyAqIDxnZXRDZWxsQm91bmRzPiBidXQgd2l0aCBhIDkwIGRlZ3JlZSByb3RhdGlvbiBpZiB0aGUgc2hhcGUncworICogaXNQYWludEJvdW5kc0ludmVydGVkIHJldHVybnMgdHJ1ZS4KKyAqLworbXhDZWxsU3RhdGUucHJvdG90eXBlLmdldFBhaW50Qm91bmRzID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLnBhaW50Qm91bmRzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlQ2FjaGVkQm91bmRzCisgKiAKKyAqIFVwZGF0ZXMgdGhlIGNlbGxCb3VuZHMgYW5kIHBhaW50Qm91bmRzLgorICovCitteENlbGxTdGF0ZS5wcm90b3R5cGUudXBkYXRlQ2FjaGVkQm91bmRzID0gZnVuY3Rpb24oKQoreworCXZhciB0ciA9IHRoaXMudmlldy50cmFuc2xhdGU7CisJdmFyIHMgPSB0aGlzLnZpZXcuc2NhbGU7CisJdGhpcy5jZWxsQm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKHRoaXMueCAvIHMgLSB0ci54LCB0aGlzLnkgLyBzIC0gdHIueSwgdGhpcy53aWR0aCAvIHMsIHRoaXMuaGVpZ2h0IC8gcyk7CisJdGhpcy5wYWludEJvdW5kcyA9IG14UmVjdGFuZ2xlLmZyb21SZWN0YW5nbGUodGhpcy5jZWxsQm91bmRzKTsKKwkKKwlpZiAodGhpcy5zaGFwZSAhPSBudWxsICYmIHRoaXMuc2hhcGUuaXNQYWludEJvdW5kc0ludmVydGVkKCkpCisJeworCQl0aGlzLnBhaW50Qm91bmRzLnJvdGF0ZTkwKCk7CisJfQorfTsKKworLyoqCisgKiBEZXN0cnVjdG9yOiBzZXRTdGF0ZQorICogCisgKiBDb3BpZXMgYWxsIGZpZWxkcyBmcm9tIHRoZSBnaXZlbiBzdGF0ZSB0byB0aGlzIHN0YXRlLgorICovCitteENlbGxTdGF0ZS5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwl0aGlzLnZpZXcgPSBzdGF0ZS52aWV3OworCXRoaXMuY2VsbCA9IHN0YXRlLmNlbGw7CisJdGhpcy5zdHlsZSA9IHN0YXRlLnN0eWxlOworCXRoaXMuYWJzb2x1dGVQb2ludHMgPSBzdGF0ZS5hYnNvbHV0ZVBvaW50czsKKwl0aGlzLm9yaWdpbiA9IHN0YXRlLm9yaWdpbjsKKwl0aGlzLmFic29sdXRlT2Zmc2V0ID0gc3RhdGUuYWJzb2x1dGVPZmZzZXQ7CisJdGhpcy5ib3VuZGluZ0JveCA9IHN0YXRlLmJvdW5kaW5nQm94OworCXRoaXMudGVybWluYWxEaXN0YW5jZSA9IHN0YXRlLnRlcm1pbmFsRGlzdGFuY2U7CisJdGhpcy5zZWdtZW50cyA9IHN0YXRlLnNlZ21lbnRzOworCXRoaXMubGVuZ3RoID0gc3RhdGUubGVuZ3RoOworCXRoaXMueCA9IHN0YXRlLng7CisJdGhpcy55ID0gc3RhdGUueTsKKwl0aGlzLndpZHRoID0gc3RhdGUud2lkdGg7CisJdGhpcy5oZWlnaHQgPSBzdGF0ZS5oZWlnaHQ7CisJdGhpcy51bnNjYWxlZFdpZHRoID0gc3RhdGUudW5zY2FsZWRXaWR0aDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNsb25lCisgKgorICogUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgPG14UG9pbnQ+LgorICovCitteENlbGxTdGF0ZS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpCit7CisgCXZhciBjbG9uZSA9IG5ldyBteENlbGxTdGF0ZSh0aGlzLnZpZXcsIHRoaXMuY2VsbCwgdGhpcy5zdHlsZSk7CisKKwkvLyBDbG9uZXMgdGhlIGFic29sdXRlIHBvaW50cworCWlmICh0aGlzLmFic29sdXRlUG9pbnRzICE9IG51bGwpCisJeworCQljbG9uZS5hYnNvbHV0ZVBvaW50cyA9IFtdOworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFic29sdXRlUG9pbnRzLmxlbmd0aDsgaSsrKQorCQl7CisJCQljbG9uZS5hYnNvbHV0ZVBvaW50c1tpXSA9IHRoaXMuYWJzb2x1dGVQb2ludHNbaV0uY2xvbmUoKTsKKwkJfQorCX0KKworCWlmICh0aGlzLm9yaWdpbiAhPSBudWxsKQorCXsKKwkJY2xvbmUub3JpZ2luID0gdGhpcy5vcmlnaW4uY2xvbmUoKTsKKwl9CisKKwlpZiAodGhpcy5hYnNvbHV0ZU9mZnNldCAhPSBudWxsKQorCXsKKwkJY2xvbmUuYWJzb2x1dGVPZmZzZXQgPSB0aGlzLmFic29sdXRlT2Zmc2V0LmNsb25lKCk7CisJfQorCisJaWYgKHRoaXMuYm91bmRpbmdCb3ggIT0gbnVsbCkKKwl7CisJCWNsb25lLmJvdW5kaW5nQm94ID0gdGhpcy5ib3VuZGluZ0JveC5jbG9uZSgpOworCX0KKworCWNsb25lLnRlcm1pbmFsRGlzdGFuY2UgPSB0aGlzLnRlcm1pbmFsRGlzdGFuY2U7CisJY2xvbmUuc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzOworCWNsb25lLmxlbmd0aCA9IHRoaXMubGVuZ3RoOworCWNsb25lLnggPSB0aGlzLng7CisJY2xvbmUueSA9IHRoaXMueTsKKwljbG9uZS53aWR0aCA9IHRoaXMud2lkdGg7CisJY2xvbmUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CisJY2xvbmUudW5zY2FsZWRXaWR0aCA9IHRoaXMudW5zY2FsZWRXaWR0aDsKKwkKKwlyZXR1cm4gY2xvbmU7Cit9OworCisvKioKKyAqIERlc3RydWN0b3I6IGRlc3Ryb3kKKyAqIAorICogRGVzdHJveXMgdGhlIHN0YXRlIGFuZCBhbGwgYXNzb2NpYXRlZCByZXNvdXJjZXMuCisgKi8KK214Q2VsbFN0YXRlLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKQoreworCXRoaXMudmlldy5ncmFwaC5jZWxsUmVuZGVyZXIuZGVzdHJveSh0aGlzKTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teENlbGxTdGF0ZVByZXZpZXcuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teENlbGxTdGF0ZVByZXZpZXcuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwOTI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214Q2VsbFN0YXRlUHJldmlldy5qcwpAQCAtMCwwICsxLDIwMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKgorICogQ2xhc3M6IG14Q2VsbFN0YXRlUHJldmlldworICogCisgKiBJbXBsZW1lbnRzIGEgbGl2ZSBwcmV2aWV3IGZvciBtb3ZpbmcgY2VsbHMuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteENlbGxTdGF0ZVByZXZpZXcKKyAqIAorICogQ29uc3RydWN0cyBhIG1vdmUgcHJldmlldyBmb3IgdGhlIGdpdmVuIGdyYXBoLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBncmFwaCAtIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEdyYXBoPi4KKyAqLworZnVuY3Rpb24gbXhDZWxsU3RhdGVQcmV2aWV3KGdyYXBoKQoreworCXRoaXMuZGVsdGFzID0gbmV3IG14RGljdGlvbmFyeSgpOworCXRoaXMuZ3JhcGggPSBncmFwaDsKK307CisKKy8qKgorICogVmFyaWFibGU6IGdyYXBoCisgKiAKKyAqIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEdyYXBoPi4KKyAqLworbXhDZWxsU3RhdGVQcmV2aWV3LnByb3RvdHlwZS5ncmFwaCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGRlbHRhcworICogCisgKiBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKi8KK214Q2VsbFN0YXRlUHJldmlldy5wcm90b3R5cGUuZGVsdGFzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogY291bnQKKyAqIAorICogQ29udGFpbnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBtYXAuCisgKi8KK214Q2VsbFN0YXRlUHJldmlldy5wcm90b3R5cGUuY291bnQgPSAwOworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0VtcHR5CisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbnRhaW5zIG5vIGVudHJpZXMuCisgKi8KK214Q2VsbFN0YXRlUHJldmlldy5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5jb3VudCA9PSAwOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogbW92ZVN0YXRlCisgKi8KK214Q2VsbFN0YXRlUHJldmlldy5wcm90b3R5cGUubW92ZVN0YXRlID0gZnVuY3Rpb24oc3RhdGUsIGR4LCBkeSwgYWRkLCBpbmNsdWRlRWRnZXMpCit7CisJYWRkID0gKGFkZCAhPSBudWxsKSA/IGFkZCA6IHRydWU7CisJaW5jbHVkZUVkZ2VzID0gKGluY2x1ZGVFZGdlcyAhPSBudWxsKSA/IGluY2x1ZGVFZGdlcyA6IHRydWU7CisJCisJdmFyIGRlbHRhID0gdGhpcy5kZWx0YXMuZ2V0KHN0YXRlLmNlbGwpOworCisJaWYgKGRlbHRhID09IG51bGwpCisJeworCQkvLyBOb3RlOiBEZWx0YXMgc3RvcmVzIHRoZSBwb2ludCBhbmQgdGhlIHN0YXRlIHNpbmNlIHRoZSBrZXkgaXMgYSBzdHJpbmcuCisJCWRlbHRhID0ge3BvaW50OiBuZXcgbXhQb2ludChkeCwgZHkpLCBzdGF0ZTogc3RhdGV9OworCQl0aGlzLmRlbHRhcy5wdXQoc3RhdGUuY2VsbCwgZGVsdGEpOworCQl0aGlzLmNvdW50Kys7CisJfQorCWVsc2UgaWYgKGFkZCkKKwl7CisJCWRlbHRhLnBvaW50LnggKz0gZHg7CisJCWRlbHRhLnBvaW50LnkgKz0gZHk7CisJfQorCWVsc2UKKwl7CisJCWRlbHRhLnBvaW50LnggPSBkeDsKKwkJZGVsdGEucG9pbnQueSA9IGR5OworCX0KKwkKKwlpZiAoaW5jbHVkZUVkZ2VzKQorCXsKKwkJdGhpcy5hZGRFZGdlcyhzdGF0ZSk7CisJfQorCQorCXJldHVybiBkZWx0YS5wb2ludDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNob3cKKyAqLworbXhDZWxsU3RhdGVQcmV2aWV3LnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24odmlzaXRvcikKK3sKKwl0aGlzLmRlbHRhcy52aXNpdChteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oa2V5LCBkZWx0YSkKKwl7CisJCXRoaXMudHJhbnNsYXRlU3RhdGUoZGVsdGEuc3RhdGUsIGRlbHRhLnBvaW50LngsIGRlbHRhLnBvaW50LnkpOworCX0pKTsKKwkKKwl0aGlzLmRlbHRhcy52aXNpdChteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oa2V5LCBkZWx0YSkKKwl7CisJCXRoaXMucmV2YWxpZGF0ZVN0YXRlKGRlbHRhLnN0YXRlLCBkZWx0YS5wb2ludC54LCBkZWx0YS5wb2ludC55LCB2aXNpdG9yKTsKKwl9KSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB0cmFuc2xhdGVTdGF0ZQorICovCitteENlbGxTdGF0ZVByZXZpZXcucHJvdG90eXBlLnRyYW5zbGF0ZVN0YXRlID0gZnVuY3Rpb24oc3RhdGUsIGR4LCBkeSkKK3sKKwlpZiAoc3RhdGUgIT0gbnVsbCkKKwl7CisJCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwkJCisJCWlmIChtb2RlbC5pc1ZlcnRleChzdGF0ZS5jZWxsKSkKKwkJeworCQkJc3RhdGUudmlldy51cGRhdGVDZWxsU3RhdGUoc3RhdGUpOworCQkJdmFyIGdlbyA9IG1vZGVsLmdldEdlb21ldHJ5KHN0YXRlLmNlbGwpOworCQkJCisJCQkvLyBNb3ZlcyBzZWxlY3Rpb24gY2VsbHMgYW5kIG5vbi1yZWxhdGl2ZSB2ZXJ0aWNlcyBpbgorCQkJLy8gdGhlIGZpcnN0IHBoYXNlIHNvIHRoYXQgZWRnZSB0ZXJtaW5hbCBwb2ludHMgd2lsbAorCQkJLy8gYmUgdXBkYXRlZCBpbiB0aGUgc2Vjb25kIHBoYXNlCisJCQlpZiAoKGR4ICE9IDAgfHwgZHkgIT0gMCkgJiYgZ2VvICE9IG51bGwgJiYgKCFnZW8ucmVsYXRpdmUgfHwgdGhpcy5kZWx0YXMuZ2V0KHN0YXRlLmNlbGwpICE9IG51bGwpKQorCQkJeworCQkJCXN0YXRlLnggKz0gZHg7CisJCQkJc3RhdGUueSArPSBkeTsKKwkJCX0KKwkJfQorCSAgICAKKwkgICAgdmFyIGNoaWxkQ291bnQgPSBtb2RlbC5nZXRDaGlsZENvdW50KHN0YXRlLmNlbGwpOworCSAgICAKKwkgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspCisJICAgIHsKKwkgICAgCXRoaXMudHJhbnNsYXRlU3RhdGUoc3RhdGUudmlldy5nZXRTdGF0ZShtb2RlbC5nZXRDaGlsZEF0KHN0YXRlLmNlbGwsIGkpKSwgZHgsIGR5KTsKKwkgICAgfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJldmFsaWRhdGVTdGF0ZQorICovCitteENlbGxTdGF0ZVByZXZpZXcucHJvdG90eXBlLnJldmFsaWRhdGVTdGF0ZSA9IGZ1bmN0aW9uKHN0YXRlLCBkeCwgZHksIHZpc2l0b3IpCit7CisJaWYgKHN0YXRlICE9IG51bGwpCisJeworCQl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCk7CisJCQorCQkvLyBVcGRhdGVzIHRoZSBlZGdlIHRlcm1pbmFsIHBvaW50cyBhbmQgcmVzdG9yZXMgdGhlCisJCS8vIChyZWxhdGl2ZSkgcG9zaXRpb25zIG9mIGFueSAocmVsYXRpdmUpIGNoaWxkcmVuCisJCWlmIChtb2RlbC5pc0VkZ2Uoc3RhdGUuY2VsbCkpCisJCXsKKwkJCXN0YXRlLnZpZXcudXBkYXRlQ2VsbFN0YXRlKHN0YXRlKTsKKwkJfQorCisJCXZhciBnZW8gPSB0aGlzLmdyYXBoLmdldENlbGxHZW9tZXRyeShzdGF0ZS5jZWxsKTsKKwkJdmFyIHBTdGF0ZSA9IHN0YXRlLnZpZXcuZ2V0U3RhdGUobW9kZWwuZ2V0UGFyZW50KHN0YXRlLmNlbGwpKTsKKwkJCisJCS8vIE1vdmVzIHNlbGVjdGlvbiB2ZXJ0aWNlcyB3aGljaCBhcmUgcmVsYXRpdmUKKwkJaWYgKChkeCAhPSAwIHx8IGR5ICE9IDApICYmIGdlbyAhPSBudWxsICYmIGdlby5yZWxhdGl2ZSAmJgorCQkJbW9kZWwuaXNWZXJ0ZXgoc3RhdGUuY2VsbCkgJiYgKHBTdGF0ZSA9PSBudWxsIHx8CisJCQltb2RlbC5pc1ZlcnRleChwU3RhdGUuY2VsbCkgfHwgdGhpcy5kZWx0YXMuZ2V0KHN0YXRlLmNlbGwpICE9IG51bGwpKQorCQl7CisJCQlzdGF0ZS54ICs9IGR4OworCQkJc3RhdGUueSArPSBkeTsKKwkJfQorCQkKKwkJdGhpcy5ncmFwaC5jZWxsUmVuZGVyZXIucmVkcmF3KHN0YXRlKTsKKwkKKwkJLy8gSW52b2tlcyB0aGUgdmlzaXRvciBvbiB0aGUgZ2l2ZW4gc3RhdGUKKwkJaWYgKHZpc2l0b3IgIT0gbnVsbCkKKwkJeworCQkJdmlzaXRvcihzdGF0ZSk7CisJCX0KKwkJCQkJCQorCSAgICB2YXIgY2hpbGRDb3VudCA9IG1vZGVsLmdldENoaWxkQ291bnQoc3RhdGUuY2VsbCk7CisJICAgIAorCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykKKwkgICAgeworCSAgICAJdGhpcy5yZXZhbGlkYXRlU3RhdGUodGhpcy5ncmFwaC52aWV3LmdldFN0YXRlKG1vZGVsLmdldENoaWxkQXQoc3RhdGUuY2VsbCwgaSkpLCBkeCwgZHksIHZpc2l0b3IpOworCSAgICB9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogYWRkRWRnZXMKKyAqLworbXhDZWxsU3RhdGVQcmV2aWV3LnByb3RvdHlwZS5hZGRFZGdlcyA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwl2YXIgZWRnZUNvdW50ID0gbW9kZWwuZ2V0RWRnZUNvdW50KHN0YXRlLmNlbGwpOworCisJZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlQ291bnQ7IGkrKykKKwl7CisJCXZhciBzID0gc3RhdGUudmlldy5nZXRTdGF0ZShtb2RlbC5nZXRFZGdlQXQoc3RhdGUuY2VsbCwgaSkpOworCisJCWlmIChzICE9IG51bGwpCisJCXsKKwkJCXRoaXMubW92ZVN0YXRlKHMsIDAsIDApOworCQl9CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214Q29ubmVjdGlvbkNvbnN0cmFpbnQuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teENvbm5lY3Rpb25Db25zdHJhaW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZDdhYjgKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teENvbm5lY3Rpb25Db25zdHJhaW50LmpzCkBAIC0wLDAgKzEsNTAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14Q29ubmVjdGlvbkNvbnN0cmFpbnQKKyAqIAorICogRGVmaW5lcyBhbiBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgY29uc3RyYWludHMgYWJvdXQgaG93IHRvIGNvbm5lY3Qgb25lCisgKiBzaWRlIG9mIGFuIGVkZ2UgdG8gaXRzIHRlcm1pbmFsLgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhDb25uZWN0aW9uQ29uc3RyYWludAorICogCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbm5lY3Rpb24gY29uc3RyYWludCBmb3IgdGhlIGdpdmVuIHBvaW50IGFuZCBib29sZWFuCisgKiBhcmd1bWVudHMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHBvaW50IC0gT3B0aW9uYWwgPG14UG9pbnQ+IHRoYXQgc3BlY2lmaWVzIHRoZSBmaXhlZCBsb2NhdGlvbiBvZiB0aGUgcG9pbnQKKyAqIGluIHJlbGF0aXZlIGNvb3JkaW5hdGVzLiBEZWZhdWx0IGlzIG51bGwuCisgKiBwZXJpbWV0ZXIgLSBPcHRpb25hbCBib29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIHRoZSBmaXhlZCBwb2ludCBzaG91bGQgYmUKKyAqIHByb2plY3RlZCBvbnRvIHRoZSBwZXJpbWV0ZXIgb2YgdGhlIHRlcm1pbmFsLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK2Z1bmN0aW9uIG14Q29ubmVjdGlvbkNvbnN0cmFpbnQocG9pbnQsIHBlcmltZXRlciwgbmFtZSkKK3sKKwl0aGlzLnBvaW50ID0gcG9pbnQ7CisJdGhpcy5wZXJpbWV0ZXIgPSAocGVyaW1ldGVyICE9IG51bGwpID8gcGVyaW1ldGVyIDogdHJ1ZTsKKwl0aGlzLm5hbWUgPSBuYW1lOworfTsKKworLyoqCisgKiBWYXJpYWJsZTogcG9pbnQKKyAqIAorICogPG14UG9pbnQ+IHRoYXQgc3BlY2lmaWVzIHRoZSBmaXhlZCBsb2NhdGlvbiBvZiB0aGUgY29ubmVjdGlvbiBwb2ludC4KKyAqLworbXhDb25uZWN0aW9uQ29uc3RyYWludC5wcm90b3R5cGUucG9pbnQgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBwZXJpbWV0ZXIKKyAqIAorICogQm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgcG9pbnQgc2hvdWxkIGJlIHByb2plY3RlZCBvbnRvIHRoZSBwZXJpbWV0ZXIKKyAqIG9mIHRoZSB0ZXJtaW5hbC4KKyAqLworbXhDb25uZWN0aW9uQ29uc3RyYWludC5wcm90b3R5cGUucGVyaW1ldGVyID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbmFtZQorICogCisgKiBPcHRpb25hbCBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGNvbnN0cmFpbnQuCisgKi8KK214Q29ubmVjdGlvbkNvbnN0cmFpbnQucHJvdG90eXBlLm5hbWUgPSBudWxsOwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3ZpZXcvbXhFZGdlU3R5bGUuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teEVkZ2VTdHlsZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGE3NWI4Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3ZpZXcvbXhFZGdlU3R5bGUuanMKQEAgLTAsMCArMSwxNTY5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCit2YXIgbXhFZGdlU3R5bGUgPQoreworCS8qKgorCSAqIENsYXNzOiBteEVkZ2VTdHlsZQorCSAqIAorCSAqIFByb3ZpZGVzIHZhcmlvdXMgZWRnZSBzdHlsZXMgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWVzIGZvcgorCSAqIDxteENvbnN0YW50cy5TVFlMRV9FREdFPiBpbiBhIGNlbGwgc3R5bGUuCisJICoKKwkgKiBFeGFtcGxlOgorCSAqIAorCSAqIChjb2RlKQorCSAqIHZhciBzdHlsZSA9IHN0eWxlc2hlZXQuZ2V0RGVmYXVsdEVkZ2VTdHlsZSgpOworCSAqIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0VER0VdID0gbXhFZGdlU3R5bGUuRWxib3dDb25uZWN0b3I7CisJICogKGVuZCkKKwkgKiAKKwkgKiBTZXRzIHRoZSBkZWZhdWx0IGVkZ2Ugc3R5bGUgdG8gPEVsYm93Q29ubmVjdG9yPi4KKwkgKiAKKwkgKiBDdXN0b20gZWRnZSBzdHlsZToKKwkgKiAKKwkgKiBUbyB3cml0ZSBhIGN1c3RvbSBlZGdlIHN0eWxlLCBhIGZ1bmN0aW9uIG11c3QgYmUgYWRkZWQgdG8gdGhlIG14RWRnZVN0eWxlCisJICogb2JqZWN0IGFzIGZvbGxvd3M6CisJICogCisJICogKGNvZGUpCisJICogbXhFZGdlU3R5bGUuTXlTdHlsZSA9IGZ1bmN0aW9uKHN0YXRlLCBzb3VyY2UsIHRhcmdldCwgcG9pbnRzLCByZXN1bHQpCisJICogeworCSAqICAgaWYgKHNvdXJjZSAhPSBudWxsICYmIHRhcmdldCAhPSBudWxsKQorCSAqICAgeworCSAqICAgICB2YXIgcHQgPSBuZXcgbXhQb2ludCh0YXJnZXQuZ2V0Q2VudGVyWCgpLCBzb3VyY2UuZ2V0Q2VudGVyWSgpKTsKKwkgKiAKKwkgKiAgICAgaWYgKG14VXRpbHMuY29udGFpbnMoc291cmNlLCBwdC54LCBwdC55KSkKKwkgKiAgICAgeworCSAqICAgICAgIHB0LnkgPSBzb3VyY2UueSArIHNvdXJjZS5oZWlnaHQ7CisJICogICAgIH0KKwkgKiAKKwkgKiAgICAgcmVzdWx0LnB1c2gocHQpOworCSAqICAgfQorCSAqIH07CisJICogKGVuZCkKKwkgKiAKKwkgKiBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgYSByaWdodCBhbmdsZSBpcyBjcmVhdGVkIHVzaW5nIGEgcG9pbnQgb24gdGhlCisJICogaG9yaXpvbnRhbCBjZW50ZXIgb2YgdGhlIHRhcmdldCB2ZXJ0ZXggYW5kIHRoZSB2ZXJ0aWNhbCBjZW50ZXIgb2YgdGhlIHNvdXJjZQorCSAqIHZlcnRleC4gVGhlIGNvZGUgY2hlY2tzIGlmIHRoYXQgcG9pbnQgaW50ZXJzZWN0cyB0aGUgc291cmNlIHZlcnRleCBhbmQgbWFrZXMKKwkgKiB0aGUgZWRnZSBzdHJhaWdodCBpZiBpdCBkb2VzLiBUaGUgcG9pbnQgaXMgdGhlbiBhZGRlZCBpbnRvIHRoZSByZXN1bHQgYXJyYXksCisJICogd2hpY2ggYWN0cyBhcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbi4KKwkgKgorCSAqIFRoZSBuZXcgZWRnZSBzdHlsZSBzaG91bGQgdGhlbiBiZSByZWdpc3RlcmVkIGluIHRoZSA8bXhTdHlsZVJlZ2lzdHJ5PiBhcyBmb2xsb3dzOgorCSAqIChjb2RlKQorCSAqIG14U3R5bGVSZWdpc3RyeS5wdXRWYWx1ZSgnbXlFZGdlU3R5bGUnLCBteEVkZ2VTdHlsZS5NeVN0eWxlKTsKKwkgKiAoZW5kKQorCSAqIAorCSAqIFRoZSBjdXN0b20gZWRnZSBzdHlsZSBhYm92ZSBjYW4gbm93IGJlIHVzZWQgaW4gYSBzcGVjaWZpYyBlZGdlIGFzIGZvbGxvd3M6CisJICogCisJICogKGNvZGUpCisJICogbW9kZWwuc2V0U3R5bGUoZWRnZSwgJ2VkZ2VTdHlsZT1teUVkZ2VTdHlsZScpOworCSAqIChlbmQpCisJICogCisJICogTm90ZSB0aGF0IHRoZSBrZXkgb2YgdGhlIDxteFN0eWxlUmVnaXN0cnk+IGVudHJ5IGZvciB0aGUgZnVuY3Rpb24gc2hvdWxkCisJICogYmUgdXNlZCBpbiBzdHJpbmcgdmFsdWVzLCB1bmxlc3MgPG14R3JhcGhWaWV3LmFsbG93RXZhbD4gaXMgdHJ1ZSwgaW4KKwkgKiB3aGljaCBjYXNlIHlvdSBjYW4gYWxzbyB1c2UgbXhFZGdlU3R5bGUuTXlTdHlsZSBmb3IgdGhlIHZhbHVlIGluIHRoZQorCSAqIGNlbGwgc3R5bGUgYWJvdmUuCisJICogCisJICogT3IgaXQgY2FuIGJlIHVzZWQgZm9yIGFsbCBlZGdlcyBpbiB0aGUgZ3JhcGggYXMgZm9sbG93czoKKwkgKiAKKwkgKiAoY29kZSkKKwkgKiB2YXIgc3R5bGUgPSBncmFwaC5nZXRTdHlsZXNoZWV0KCkuZ2V0RGVmYXVsdEVkZ2VTdHlsZSgpOworCSAqIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0VER0VdID0gbXhFZGdlU3R5bGUuTXlTdHlsZTsKKwkgKiAoZW5kKQorCSAqIAorCSAqIE5vdGUgdGhhdCB0aGUgb2JqZWN0IGNhbiBiZSB1c2VkIGRpcmVjdGx5IHdoZW4gcHJvZ3JhbW1hdGljYWxseSBzZXR0aW5nCisJICogdGhlIHZhbHVlLCBidXQgdGhlIGtleSBpbiB0aGUgPG14U3R5bGVSZWdpc3RyeT4gc2hvdWxkIGJlIHVzZWQgd2hlbgorCSAqIHNldHRpbmcgdGhlIHZhbHVlIHZpYSBhIGtleSwgdmFsdWUgcGFpciBpbiBhIGNlbGwgc3R5bGUuCisJICogCisJICogRnVuY3Rpb246IEVudGl0eVJlbGF0aW9uCisJICogCisJICogSW1wbGVtZW50cyBhbiBlbnRpdHkgcmVsYXRpb24gc3R5bGUgZm9yIGVkZ2VzIChhcyB1c2VkIGluIGRhdGFiYXNlCisJICogc2NoZW1hIGRpYWdyYW1zKS4gQXQgdGhlIHRpbWUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHJlc3VsdAorCSAqIGFycmF5IGNvbnRhaW5zIGEgcGxhY2Vob2xkZXIgKG51bGwpIGZvciB0aGUgZmlyc3QgYWJzb2x1dGUgcG9pbnQsCisJICogdGhhdCBpcywgdGhlIHBvaW50IHdoZXJlIHRoZSBlZGdlIGFuZCBzb3VyY2UgdGVybWluYWwgYXJlIGNvbm5lY3RlZC4KKwkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN0eWxlIHRoZW4gYWRkcyBhbGwgaW50ZXJtZWRpYXRlIHdheXBvaW50cworCSAqIGV4Y2VwdCBmb3IgdGhlIGxhc3QgcG9pbnQsIHRoYXQgaXMsIHRoZSBjb25uZWN0aW9uIHBvaW50IGJldHdlZW4gdGhlCisJICogZWRnZSBhbmQgdGhlIHRhcmdldCB0ZXJtaW5hbC4gVGhlIGZpcnN0IGFudCB0aGUgbGFzdCBwb2ludCBpbiB0aGUKKwkgKiByZXN1bHQgYXJyYXkgYXJlIHRoZW4gcmVwbGFjZWQgd2l0aCBteFBvaW50cyB0aGF0IHRha2UgaW50byBhY2NvdW50CisJICogdGhlIHRlcm1pbmFsJ3MgcGVyaW1ldGVyIGFuZCBuZXh0IHBvaW50IG9uIHRoZSBlZGdlLgorCSAqCisJICogUGFyYW1ldGVyczoKKwkgKiAKKwkgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gdGhhdCByZXByZXNlbnRzIHRoZSBlZGdlIHRvIGJlIHVwZGF0ZWQuCisJICogc291cmNlIC0gPG14Q2VsbFN0YXRlPiB0aGF0IHJlcHJlc2VudHMgdGhlIHNvdXJjZSB0ZXJtaW5hbC4KKwkgKiB0YXJnZXQgLSA8bXhDZWxsU3RhdGU+IHRoYXQgcmVwcmVzZW50cyB0aGUgdGFyZ2V0IHRlcm1pbmFsLgorCSAqIHBvaW50cyAtIExpc3Qgb2YgcmVsYXRpdmUgY29udHJvbCBwb2ludHMuCisJICogcmVzdWx0IC0gQXJyYXkgb2YgPG14UG9pbnRzPiB0aGF0IHJlcHJlc2VudCB0aGUgYWN0dWFsIHBvaW50cyBvZiB0aGUKKwkgKiBlZGdlLgorCSAqLworCSBFbnRpdHlSZWxhdGlvbjogZnVuY3Rpb24gKHN0YXRlLCBzb3VyY2UsIHRhcmdldCwgcG9pbnRzLCByZXN1bHQpCisJIHsKKwkJdmFyIHZpZXcgPSBzdGF0ZS52aWV3OworCSAJdmFyIGdyYXBoID0gdmlldy5ncmFwaDsKKwkgCXZhciBzZWdtZW50ID0gbXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwKKwkgCQkJbXhDb25zdGFudHMuU1RZTEVfU0VHTUVOVCwKKwkgCQkJbXhDb25zdGFudHMuRU5USVRZX1NFR01FTlQpICogdmlldy5zY2FsZTsKKwkgCQorCQl2YXIgcHRzID0gc3RhdGUuYWJzb2x1dGVQb2ludHM7CisJCXZhciBwMCA9IHB0c1swXTsKKwkJdmFyIHBlID0gcHRzW3B0cy5sZW5ndGgtMV07CisKKwkgCXZhciBpc1NvdXJjZUxlZnQgPSBmYWxzZTsKKworCQlpZiAocDAgIT0gbnVsbCkKKwkJeworCQkJc291cmNlID0gbmV3IG14Q2VsbFN0YXRlKCk7CisJCQlzb3VyY2UueCA9IHAwLng7CisJCQlzb3VyY2UueSA9IHAwLnk7CisJCX0KKwkJZWxzZSBpZiAoc291cmNlICE9IG51bGwpCisJCXsKKwkJCXZhciBjb25zdHJhaW50ID0gbXhVdGlscy5nZXRQb3J0Q29uc3RyYWludHMoc291cmNlLCBzdGF0ZSwgdHJ1ZSwgbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfTk9ORSk7CisJCQkKKwkJCWlmIChjb25zdHJhaW50ICE9IG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX05PTkUgJiYgY29uc3RyYWludCAhPSBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19XRVNUICsKKwkJCQlteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19FQVNUKQorCQkJeworCQkJCWlzU291cmNlTGVmdCA9IGNvbnN0cmFpbnQgPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfV0VTVDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCSAJdmFyIHNvdXJjZUdlb21ldHJ5ID0gZ3JhcGguZ2V0Q2VsbEdlb21ldHJ5KHNvdXJjZS5jZWxsKTsKKwkJCisJCQkgCWlmIChzb3VyY2VHZW9tZXRyeS5yZWxhdGl2ZSkKKwkJCSAJeworCQkJIAkJaXNTb3VyY2VMZWZ0ID0gc291cmNlR2VvbWV0cnkueCA8PSAwLjU7CisJCQkgCX0KKwkJCSAJZWxzZSBpZiAodGFyZ2V0ICE9IG51bGwpCisJCQkgCXsKKwkJCSAJCWlzU291cmNlTGVmdCA9IHRhcmdldC54ICsgdGFyZ2V0LndpZHRoIDwgc291cmNlLng7CisJCQkgCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybjsKKwkJfQorCSAJCisJIAl2YXIgaXNUYXJnZXRMZWZ0ID0gdHJ1ZTsKKworCQlpZiAocGUgIT0gbnVsbCkKKwkJeworCQkJdGFyZ2V0ID0gbmV3IG14Q2VsbFN0YXRlKCk7CisJCQl0YXJnZXQueCA9IHBlLng7CisJCQl0YXJnZXQueSA9IHBlLnk7CisJCX0KKwkJZWxzZSBpZiAodGFyZ2V0ICE9IG51bGwpCisJIAl7CisJCQl2YXIgY29uc3RyYWludCA9IG14VXRpbHMuZ2V0UG9ydENvbnN0cmFpbnRzKHRhcmdldCwgc3RhdGUsIGZhbHNlLCBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19OT05FKTsKKworCQkJaWYgKGNvbnN0cmFpbnQgIT0gbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfTk9ORSAmJiBjb25zdHJhaW50ICE9IG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX1dFU1QgKworCQkJCW14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX0VBU1QpCisJCQl7CisJCQkJaXNUYXJnZXRMZWZ0ID0gY29uc3RyYWludCA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19XRVNUOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJIAl2YXIgdGFyZ2V0R2VvbWV0cnkgPSBncmFwaC5nZXRDZWxsR2VvbWV0cnkodGFyZ2V0LmNlbGwpOworCQorCQkJIAlpZiAodGFyZ2V0R2VvbWV0cnkucmVsYXRpdmUpCisJCQkgCXsKKwkJCSAJCWlzVGFyZ2V0TGVmdCA9IHRhcmdldEdlb21ldHJ5LnggPD0gMC41OworCQkJIAl9CisJCQkgCWVsc2UgaWYgKHNvdXJjZSAhPSBudWxsKQorCQkJIAl7CisJCQkgCQlpc1RhcmdldExlZnQgPSBzb3VyY2UueCArIHNvdXJjZS53aWR0aCA8IHRhcmdldC54OworCQkJIAl9CisJCQl9CisJIAl9CisJCQorCQlpZiAoc291cmNlICE9IG51bGwgJiYgdGFyZ2V0ICE9IG51bGwpCisJCXsKKwkJCXZhciB4MCA9IChpc1NvdXJjZUxlZnQpID8gc291cmNlLnggOiBzb3VyY2UueCArIHNvdXJjZS53aWR0aDsKKwkJCXZhciB5MCA9IHZpZXcuZ2V0Um91dGluZ0NlbnRlclkoc291cmNlKTsKKwkJCQorCQkJdmFyIHhlID0gKGlzVGFyZ2V0TGVmdCkgPyB0YXJnZXQueCA6IHRhcmdldC54ICsgdGFyZ2V0LndpZHRoOworCQkJdmFyIHllID0gdmlldy5nZXRSb3V0aW5nQ2VudGVyWSh0YXJnZXQpOworCQorCQkJdmFyIHNlZyA9IHNlZ21lbnQ7CisJCisJCQl2YXIgZHggPSAoaXNTb3VyY2VMZWZ0KSA/IC1zZWcgOiBzZWc7CisJCQl2YXIgZGVwID0gbmV3IG14UG9pbnQoeDAgKyBkeCwgeTApOworCQkJCQkKKwkJCWR4ID0gKGlzVGFyZ2V0TGVmdCkgPyAtc2VnIDogc2VnOworCQkJdmFyIGFyciA9IG5ldyBteFBvaW50KHhlICsgZHgsIHllKTsKKwkKKwkJCS8vIEFkZHMgaW50ZXJtZWRpYXRlIHBvaW50cyBpZiBib3RoIGdvIG91dCBvbiBzYW1lIHNpZGUKKwkJCWlmIChpc1NvdXJjZUxlZnQgPT0gaXNUYXJnZXRMZWZ0KQorCQkJeworCQkJCXZhciB4ID0gKGlzU291cmNlTGVmdCkgPworCQkJCQlNYXRoLm1pbih4MCwgeGUpLXNlZ21lbnQgOgorCQkJCQlNYXRoLm1heCh4MCwgeGUpK3NlZ21lbnQ7CisJCisJCQkJcmVzdWx0LnB1c2gobmV3IG14UG9pbnQoeCwgeTApKTsKKwkJCQlyZXN1bHQucHVzaChuZXcgbXhQb2ludCh4LCB5ZSkpOworCQkJfQorCQkJZWxzZSBpZiAoKGRlcC54IDwgYXJyLngpID09IGlzU291cmNlTGVmdCkKKwkJCXsKKwkJCQl2YXIgbWlkWSA9IHkwICsgKHllIC0geTApIC8gMjsKKwkKKwkJCQlyZXN1bHQucHVzaChkZXApOworCQkJCXJlc3VsdC5wdXNoKG5ldyBteFBvaW50KGRlcC54LCBtaWRZKSk7CisJCQkJcmVzdWx0LnB1c2gobmV3IG14UG9pbnQoYXJyLngsIG1pZFkpKTsKKwkJCQlyZXN1bHQucHVzaChhcnIpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJlc3VsdC5wdXNoKGRlcCk7CisJCQkJcmVzdWx0LnB1c2goYXJyKTsKKwkJCX0KKwkJfQorCSB9LAorCisJIC8qKgorCSAqIEZ1bmN0aW9uOiBMb29wCisJICogCisJICogSW1wbGVtZW50cyBhIHNlbGYtcmVmZXJlbmNlLCBha2EuIGxvb3AuCisJICovCisJTG9vcDogZnVuY3Rpb24gKHN0YXRlLCBzb3VyY2UsIHRhcmdldCwgcG9pbnRzLCByZXN1bHQpCisJeworCQl2YXIgcHRzID0gc3RhdGUuYWJzb2x1dGVQb2ludHM7CisJCQorCQl2YXIgcDAgPSBwdHNbMF07CisJCXZhciBwZSA9IHB0c1twdHMubGVuZ3RoLTFdOworCisJCWlmIChwMCAhPSBudWxsICYmIHBlICE9IG51bGwpCisJCXsKKwkJCWlmIChwb2ludHMgIT0gbnVsbCAmJiBwb2ludHMubGVuZ3RoID4gMCkKKwkJCXsKKwkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkrKykKKwkJCQl7CisJCQkJCXZhciBwdCA9IHBvaW50c1tpXTsKKwkJCQkJcHQgPSBzdGF0ZS52aWV3LnRyYW5zZm9ybUNvbnRyb2xQb2ludChzdGF0ZSwgcHQpOworCQkJCQlyZXN1bHQucHVzaChuZXcgbXhQb2ludChwdC54LCBwdC55KSk7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm47CisJCX0KKwkJCisJCWlmIChzb3VyY2UgIT0gbnVsbCkKKwkJeworCQkJdmFyIHZpZXcgPSBzdGF0ZS52aWV3OworCQkJdmFyIGdyYXBoID0gdmlldy5ncmFwaDsKKwkJCXZhciBwdCA9IChwb2ludHMgIT0gbnVsbCAmJiBwb2ludHMubGVuZ3RoID4gMCkgPyBwb2ludHNbMF0gOiBudWxsOworCisJCQlpZiAocHQgIT0gbnVsbCkKKwkJCXsKKwkJCQlwdCA9IHZpZXcudHJhbnNmb3JtQ29udHJvbFBvaW50KHN0YXRlLCBwdCk7CisJCQkJCQorCQkJCWlmIChteFV0aWxzLmNvbnRhaW5zKHNvdXJjZSwgcHQueCwgcHQueSkpCisJCQkJeworCQkJCQlwdCA9IG51bGw7CisJCQkJfQorCQkJfQorCQkJCisJCQl2YXIgeCA9IDA7CisJCQl2YXIgZHggPSAwOworCQkJdmFyIHkgPSAwOworCQkJdmFyIGR5ID0gMDsKKwkJCQorCQkgCXZhciBzZWcgPSBteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9TRUdNRU5ULAorCQkgCQlncmFwaC5ncmlkU2l6ZSkgKiB2aWV3LnNjYWxlOworCQkJdmFyIGRpciA9IG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0RJUkVDVElPTiwKKwkJCQlteENvbnN0YW50cy5ESVJFQ1RJT05fV0VTVCk7CisJCQkKKwkJCWlmIChkaXIgPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX05PUlRIIHx8CisJCQkJZGlyID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9TT1VUSCkKKwkJCXsKKwkJCQl4ID0gdmlldy5nZXRSb3V0aW5nQ2VudGVyWChzb3VyY2UpOworCQkJCWR4ID0gc2VnOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXkgPSB2aWV3LmdldFJvdXRpbmdDZW50ZXJZKHNvdXJjZSk7CisJCQkJZHkgPSBzZWc7CisJCQl9CisJCQkKKwkJCWlmIChwdCA9PSBudWxsIHx8CisJCQkJcHQueCA8IHNvdXJjZS54IHx8CisJCQkJcHQueCA+IHNvdXJjZS54ICsgc291cmNlLndpZHRoKQorCQkJeworCQkJCWlmIChwdCAhPSBudWxsKQorCQkJCXsKKwkJCQkJeCA9IHB0Lng7CisJCQkJCWR5ID0gTWF0aC5tYXgoTWF0aC5hYnMoeSAtIHB0LnkpLCBkeSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmIChkaXIgPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX05PUlRIKQorCQkJCQl7CisJCQkJCQl5ID0gc291cmNlLnkgLSAyICogZHg7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoZGlyID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9TT1VUSCkKKwkJCQkJeworCQkJCQkJeSA9IHNvdXJjZS55ICsgc291cmNlLmhlaWdodCArIDIgKiBkeDsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChkaXIgPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX0VBU1QpCisJCQkJCXsKKwkJCQkJCXggPSBzb3VyY2UueCAtIDIgKiBkeTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXggPSBzb3VyY2UueCArIHNvdXJjZS53aWR0aCArIDIgKiBkeTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKHB0ICE9IG51bGwpCisJCQl7CisJCQkJeCA9IHZpZXcuZ2V0Um91dGluZ0NlbnRlclgoc291cmNlKTsKKwkJCQlkeCA9IE1hdGgubWF4KE1hdGguYWJzKHggLSBwdC54KSwgZHkpOworCQkJCXkgPSBwdC55OworCQkJCWR5ID0gMDsKKwkJCX0KKwkJCQorCQkJcmVzdWx0LnB1c2gobmV3IG14UG9pbnQoeCAtIGR4LCB5IC0gZHkpKTsKKwkJCXJlc3VsdC5wdXNoKG5ldyBteFBvaW50KHggKyBkeCwgeSArIGR5KSk7CisJCX0KKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBFbGJvd0Nvbm5lY3RvcgorCSAqIAorCSAqIFVzZXMgZWl0aGVyIDxTaWRlVG9TaWRlPiBvciA8VG9wVG9Cb3R0b20+IGRlcGVuZGluZyBvbiB0aGUgaG9yaXpvbnRhbAorCSAqIGZsYWcgaW4gdGhlIGNlbGwgc3R5bGUuIDxTaWRlVG9TaWRlPiBpcyB1c2VkIGlmIGhvcml6b250YWwgaXMgdHJ1ZSBvcgorCSAqIHVuc3BlY2lmaWVkLiBTZWUgPEVudGl0eVJlbGF0aW9uPiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUKKwkgKiBwYXJhbWV0ZXJzLgorCSAqLworCUVsYm93Q29ubmVjdG9yOiBmdW5jdGlvbiAoc3RhdGUsIHNvdXJjZSwgdGFyZ2V0LCBwb2ludHMsIHJlc3VsdCkKKwl7CisJCXZhciBwdCA9IChwb2ludHMgIT0gbnVsbCAmJiBwb2ludHMubGVuZ3RoID4gMCkgPyBwb2ludHNbMF0gOiBudWxsOworCisJCXZhciB2ZXJ0aWNhbCA9IGZhbHNlOworCQl2YXIgaG9yaXpvbnRhbCA9IGZhbHNlOworCQkKKwkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHRhcmdldCAhPSBudWxsKQorCQl7CisJCQlpZiAocHQgIT0gbnVsbCkKKwkJCXsKKwkJCQl2YXIgbGVmdCA9IE1hdGgubWluKHNvdXJjZS54LCB0YXJnZXQueCk7CisJCQkJdmFyIHJpZ2h0ID0gTWF0aC5tYXgoc291cmNlLnggKyBzb3VyY2Uud2lkdGgsCisJCQkJCXRhcmdldC54ICsgdGFyZ2V0LndpZHRoKTsKKwkKKwkJCQl2YXIgdG9wID0gTWF0aC5taW4oc291cmNlLnksIHRhcmdldC55KTsKKwkJCQl2YXIgYm90dG9tID0gTWF0aC5tYXgoc291cmNlLnkgKyBzb3VyY2UuaGVpZ2h0LAorCQkJCQl0YXJnZXQueSArIHRhcmdldC5oZWlnaHQpOworCisJCQkJcHQgPSBzdGF0ZS52aWV3LnRyYW5zZm9ybUNvbnRyb2xQb2ludChzdGF0ZSwgcHQpOworCQkJCQkKKwkJCQl2ZXJ0aWNhbCA9IHB0LnkgPCB0b3AgfHwgcHQueSA+IGJvdHRvbTsKKwkJCQlob3Jpem9udGFsID0gcHQueCA8IGxlZnQgfHwgcHQueCA+IHJpZ2h0OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXZhciBsZWZ0ID0gTWF0aC5tYXgoc291cmNlLngsIHRhcmdldC54KTsKKwkJCQl2YXIgcmlnaHQgPSBNYXRoLm1pbihzb3VyY2UueCArIHNvdXJjZS53aWR0aCwKKwkJCQkJdGFyZ2V0LnggKyB0YXJnZXQud2lkdGgpOworCQkJCQkKKwkJCQl2ZXJ0aWNhbCA9IGxlZnQgPT0gcmlnaHQ7CisJCQkJCisJCQkJaWYgKCF2ZXJ0aWNhbCkKKwkJCQl7CisJCQkJCXZhciB0b3AgPSBNYXRoLm1heChzb3VyY2UueSwgdGFyZ2V0LnkpOworCQkJCQl2YXIgYm90dG9tID0gTWF0aC5taW4oc291cmNlLnkgKyBzb3VyY2UuaGVpZ2h0LAorCQkJCQkJdGFyZ2V0LnkgKyB0YXJnZXQuaGVpZ2h0KTsKKwkJCQkJCQorCQkJCQlob3Jpem9udGFsID0gdG9wID09IGJvdHRvbTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoIWhvcml6b250YWwgJiYgKHZlcnRpY2FsIHx8CisJCQlzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9FTEJPV10gPT0gbXhDb25zdGFudHMuRUxCT1dfVkVSVElDQUwpKQorCQl7CisJCQlteEVkZ2VTdHlsZS5Ub3BUb0JvdHRvbShzdGF0ZSwgc291cmNlLCB0YXJnZXQsIHBvaW50cywgcmVzdWx0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW14RWRnZVN0eWxlLlNpZGVUb1NpZGUoc3RhdGUsIHNvdXJjZSwgdGFyZ2V0LCBwb2ludHMsIHJlc3VsdCk7CisJCX0KKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IFNpZGVUb1NpZGUKKwkgKiAKKwkgKiBJbXBsZW1lbnRzIGEgdmVydGljYWwgZWxib3cgZWRnZS4gU2VlIDxFbnRpdHlSZWxhdGlvbj4gZm9yIGEgZGVzY3JpcHRpb24KKwkgKiBvZiB0aGUgcGFyYW1ldGVycy4KKwkgKi8KKwlTaWRlVG9TaWRlOiBmdW5jdGlvbiAoc3RhdGUsIHNvdXJjZSwgdGFyZ2V0LCBwb2ludHMsIHJlc3VsdCkKKwl7CisJCXZhciB2aWV3ID0gc3RhdGUudmlldzsKKwkJdmFyIHB0ID0gKHBvaW50cyAhPSBudWxsICYmIHBvaW50cy5sZW5ndGggPiAwKSA/IHBvaW50c1swXSA6IG51bGw7CisJCXZhciBwdHMgPSBzdGF0ZS5hYnNvbHV0ZVBvaW50czsKKwkJdmFyIHAwID0gcHRzWzBdOworCQl2YXIgcGUgPSBwdHNbcHRzLmxlbmd0aC0xXTsKKwkJCisJCWlmIChwdCAhPSBudWxsKQorCQl7CisJCQlwdCA9IHZpZXcudHJhbnNmb3JtQ29udHJvbFBvaW50KHN0YXRlLCBwdCk7CisJCX0KKwkJCisJCWlmIChwMCAhPSBudWxsKQorCQl7CisJCQlzb3VyY2UgPSBuZXcgbXhDZWxsU3RhdGUoKTsKKwkJCXNvdXJjZS54ID0gcDAueDsKKwkJCXNvdXJjZS55ID0gcDAueTsKKwkJfQorCQkKKwkJaWYgKHBlICE9IG51bGwpCisJCXsKKwkJCXRhcmdldCA9IG5ldyBteENlbGxTdGF0ZSgpOworCQkJdGFyZ2V0LnggPSBwZS54OworCQkJdGFyZ2V0LnkgPSBwZS55OworCQl9CisJCQorCQlpZiAoc291cmNlICE9IG51bGwgJiYgdGFyZ2V0ICE9IG51bGwpCisJCXsKKwkJCXZhciBsID0gTWF0aC5tYXgoc291cmNlLngsIHRhcmdldC54KTsKKwkJCXZhciByID0gTWF0aC5taW4oc291cmNlLnggKyBzb3VyY2Uud2lkdGgsCisJCQkJCQkJIHRhcmdldC54ICsgdGFyZ2V0LndpZHRoKTsKKwkKKwkJCXZhciB4ID0gKHB0ICE9IG51bGwpID8gcHQueCA6IE1hdGgucm91bmQociArIChsIC0gcikgLyAyKTsKKwkKKwkJCXZhciB5MSA9IHZpZXcuZ2V0Um91dGluZ0NlbnRlclkoc291cmNlKTsKKwkJCXZhciB5MiA9IHZpZXcuZ2V0Um91dGluZ0NlbnRlclkodGFyZ2V0KTsKKwkKKwkJCWlmIChwdCAhPSBudWxsKQorCQkJeworCQkJCWlmIChwdC55ID49IHNvdXJjZS55ICYmIHB0LnkgPD0gc291cmNlLnkgKyBzb3VyY2UuaGVpZ2h0KQorCQkJCXsKKwkJCQkJeTEgPSBwdC55OworCQkJCX0KKwkJCQkKKwkJCQlpZiAocHQueSA+PSB0YXJnZXQueSAmJiBwdC55IDw9IHRhcmdldC55ICsgdGFyZ2V0LmhlaWdodCkKKwkJCQl7CisJCQkJCXkyID0gcHQueTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmICghbXhVdGlscy5jb250YWlucyh0YXJnZXQsIHgsIHkxKSAmJgorCQkJCSFteFV0aWxzLmNvbnRhaW5zKHNvdXJjZSwgeCwgeTEpKQorCQkJeworCQkJCXJlc3VsdC5wdXNoKG5ldyBteFBvaW50KHgsICB5MSkpOworCQkJfQorCQorCQkJaWYgKCFteFV0aWxzLmNvbnRhaW5zKHRhcmdldCwgeCwgeTIpICYmCisJCQkJIW14VXRpbHMuY29udGFpbnMoc291cmNlLCB4LCB5MikpCisJCQl7CisJCQkJcmVzdWx0LnB1c2gobmV3IG14UG9pbnQoeCwgeTIpKTsKKwkJCX0KKwkKKwkJCWlmIChyZXN1bHQubGVuZ3RoID09IDEpCisJCQl7CisJCQkJaWYgKHB0ICE9IG51bGwpCisJCQkJeworCQkJCQlpZiAoIW14VXRpbHMuY29udGFpbnModGFyZ2V0LCB4LCBwdC55KSAmJgorCQkJCQkJIW14VXRpbHMuY29udGFpbnMoc291cmNlLCB4LCBwdC55KSkKKwkJCQkJeworCQkJCQkJcmVzdWx0LnB1c2gobmV3IG14UG9pbnQoeCwgcHQueSkpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CQorCQkJCQl2YXIgdCA9IE1hdGgubWF4KHNvdXJjZS55LCB0YXJnZXQueSk7CisJCQkJCXZhciBiID0gTWF0aC5taW4oc291cmNlLnkgKyBzb3VyY2UuaGVpZ2h0LAorCQkJCQkJCSB0YXJnZXQueSArIHRhcmdldC5oZWlnaHQpOworCQkJCQkJIAorCQkJCQlyZXN1bHQucHVzaChuZXcgbXhQb2ludCh4LCB0ICsgKGIgLSB0KSAvIDIpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IFRvcFRvQm90dG9tCisJICogCisJICogSW1wbGVtZW50cyBhIGhvcml6b250YWwgZWxib3cgZWRnZS4gU2VlIDxFbnRpdHlSZWxhdGlvbj4gZm9yIGEKKwkgKiBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVycy4KKwkgKi8KKwlUb3BUb0JvdHRvbTogZnVuY3Rpb24oc3RhdGUsIHNvdXJjZSwgdGFyZ2V0LCBwb2ludHMsIHJlc3VsdCkKKwl7CisJCXZhciB2aWV3ID0gc3RhdGUudmlldzsKKwkJdmFyIHB0ID0gKHBvaW50cyAhPSBudWxsICYmIHBvaW50cy5sZW5ndGggPiAwKSA/IHBvaW50c1swXSA6IG51bGw7CisJCXZhciBwdHMgPSBzdGF0ZS5hYnNvbHV0ZVBvaW50czsKKwkJdmFyIHAwID0gcHRzWzBdOworCQl2YXIgcGUgPSBwdHNbcHRzLmxlbmd0aC0xXTsKKwkJCisJCWlmIChwdCAhPSBudWxsKQorCQl7CisJCQlwdCA9IHZpZXcudHJhbnNmb3JtQ29udHJvbFBvaW50KHN0YXRlLCBwdCk7CisJCX0KKwkJCisJCWlmIChwMCAhPSBudWxsKQorCQl7CisJCQlzb3VyY2UgPSBuZXcgbXhDZWxsU3RhdGUoKTsKKwkJCXNvdXJjZS54ID0gcDAueDsKKwkJCXNvdXJjZS55ID0gcDAueTsKKwkJfQorCQkKKwkJaWYgKHBlICE9IG51bGwpCisJCXsKKwkJCXRhcmdldCA9IG5ldyBteENlbGxTdGF0ZSgpOworCQkJdGFyZ2V0LnggPSBwZS54OworCQkJdGFyZ2V0LnkgPSBwZS55OworCQl9CisKKwkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHRhcmdldCAhPSBudWxsKQorCQl7CisJCQl2YXIgdCA9IE1hdGgubWF4KHNvdXJjZS55LCB0YXJnZXQueSk7CisJCQl2YXIgYiA9IE1hdGgubWluKHNvdXJjZS55ICsgc291cmNlLmhlaWdodCwKKwkJCQkJCQkgdGFyZ2V0LnkgKyB0YXJnZXQuaGVpZ2h0KTsKKwkKKwkJCXZhciB4ID0gdmlldy5nZXRSb3V0aW5nQ2VudGVyWChzb3VyY2UpOworCQkJCisJCQlpZiAocHQgIT0gbnVsbCAmJgorCQkJCXB0LnggPj0gc291cmNlLnggJiYKKwkJCQlwdC54IDw9IHNvdXJjZS54ICsgc291cmNlLndpZHRoKQorCQkJeworCQkJCXggPSBwdC54OworCQkJfQorCQkJCisJCQl2YXIgeSA9IChwdCAhPSBudWxsKSA/IHB0LnkgOiBNYXRoLnJvdW5kKGIgKyAodCAtIGIpIC8gMik7CisJCQkKKwkJCWlmICghbXhVdGlscy5jb250YWlucyh0YXJnZXQsIHgsIHkpICYmCisJCQkJIW14VXRpbHMuY29udGFpbnMoc291cmNlLCB4LCB5KSkKKwkJCXsKKwkJCQlyZXN1bHQucHVzaChuZXcgbXhQb2ludCh4LCB5KSk7CQkJCQkJCisJCQl9CisJCQkKKwkJCWlmIChwdCAhPSBudWxsICYmCisJCQkJcHQueCA+PSB0YXJnZXQueCAmJgorCQkJCXB0LnggPD0gdGFyZ2V0LnggKyB0YXJnZXQud2lkdGgpCisJCQl7CisJCQkJeCA9IHB0Lng7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJeCA9IHZpZXcuZ2V0Um91dGluZ0NlbnRlclgodGFyZ2V0KTsKKwkJCX0KKwkJCQorCQkJaWYgKCFteFV0aWxzLmNvbnRhaW5zKHRhcmdldCwgeCwgeSkgJiYKKwkJCQkhbXhVdGlscy5jb250YWlucyhzb3VyY2UsIHgsIHkpKQorCQkJeworCQkJCXJlc3VsdC5wdXNoKG5ldyBteFBvaW50KHgsIHkpKTsJCQkJCQkKKwkJCX0KKwkJCQorCQkJaWYgKHJlc3VsdC5sZW5ndGggPT0gMSkKKwkJCXsKKwkJCQlpZiAocHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoID09IDEpCisJCQkJeworCQkJCQlpZiAoIW14VXRpbHMuY29udGFpbnModGFyZ2V0LCBwdC54LCB5KSAmJgorCQkJCQkJIW14VXRpbHMuY29udGFpbnMoc291cmNlLCBwdC54LCB5KSkKKwkJCQkJeworCQkJCQkJcmVzdWx0LnB1c2gobmV3IG14UG9pbnQocHQueCwgeSkpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXZhciBsID0gTWF0aC5tYXgoc291cmNlLngsIHRhcmdldC54KTsKKwkJCQkJdmFyIHIgPSBNYXRoLm1pbihzb3VyY2UueCArIHNvdXJjZS53aWR0aCwKKwkJCQkJCQkgdGFyZ2V0LnggKyB0YXJnZXQud2lkdGgpOworCQkJCQkJIAorCQkJCQlyZXN1bHQucHVzaChuZXcgbXhQb2ludChsICsgKHIgLSBsKSAvIDIsIHkpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IFNlZ21lbnRDb25uZWN0b3IKKwkgKiAKKwkgKiBJbXBsZW1lbnRzIGFuIG9ydGhvZ29uYWwgZWRnZSBzdHlsZS4gVXNlIDxteEVkZ2VTZWdtZW50SGFuZGxlcj4KKwkgKiBhcyBhbiBpbnRlcmFjdGl2ZSBoYW5kbGVyIGZvciB0aGlzIHN0eWxlLgorCSAqLworCVNlZ21lbnRDb25uZWN0b3I6IGZ1bmN0aW9uKHN0YXRlLCBzb3VyY2UsIHRhcmdldCwgaGludHMsIHJlc3VsdCkKKwl7CisJCS8vIENyZWF0ZXMgYXJyYXkgb2YgYWxsIHdheS0gYW5kIHRlcm1pbmFscG9pbnRzCisJCXZhciBwdHMgPSBzdGF0ZS5hYnNvbHV0ZVBvaW50czsKKwkJdmFyIHRvbCA9IE1hdGgubWF4KDEsIHN0YXRlLnZpZXcuc2NhbGUpOworCQkKKwkJLy8gV2hldGhlciB0aGUgZmlyc3Qgc2VnbWVudCBvdXRnb2luZyBmcm9tIHRoZSBzb3VyY2UgZW5kIGlzIGhvcml6b250YWwKKwkJdmFyIGxhc3RQdXNoZWQgPSAocmVzdWx0Lmxlbmd0aCA+IDApID8gcmVzdWx0WzBdIDogbnVsbDsKKwkJdmFyIGhvcml6b250YWwgPSB0cnVlOworCQl2YXIgaGludCA9IG51bGw7CisJCQorCQkvLyBBZGRzIHdheXBvaW50cyBvbmx5IGlmIG91dHNpZGUgb2YgdG9sZXJhbmNlCisJCWZ1bmN0aW9uIHB1c2hQb2ludChwdCkKKwkJeworCQkJaWYgKGxhc3RQdXNoZWQgPT0gbnVsbCB8fCBNYXRoLmFicyhsYXN0UHVzaGVkLnggLSBwdC54KSA+PSB0b2wgfHwgTWF0aC5hYnMobGFzdFB1c2hlZC55IC0gcHQueSkgPj0gdG9sKQorCQkJeworCQkJCXJlc3VsdC5wdXNoKHB0KTsKKwkJCQlsYXN0UHVzaGVkID0gcHQ7CisJCQl9CisJCQkKKwkJCXJldHVybiBsYXN0UHVzaGVkOworCQl9OworCisJCS8vIEFkZHMgdGhlIGZpcnN0IHBvaW50CisJCXZhciBwdCA9IHB0c1swXTsKKwkJCisJCWlmIChwdCA9PSBudWxsICYmIHNvdXJjZSAhPSBudWxsKQorCQl7CisJCQlwdCA9IG5ldyBteFBvaW50KHN0YXRlLnZpZXcuZ2V0Um91dGluZ0NlbnRlclgoc291cmNlKSwgc3RhdGUudmlldy5nZXRSb3V0aW5nQ2VudGVyWShzb3VyY2UpKTsKKwkJfQorCQllbHNlIGlmIChwdCAhPSBudWxsKQorCQl7CisJCQlwdCA9IHB0LmNsb25lKCk7CisJCX0KKwkJCisJCXB0LnggPSBNYXRoLnJvdW5kKHB0LngpOworCQlwdC55ID0gTWF0aC5yb3VuZChwdC55KTsKKwkJCisJCXZhciBsYXN0SW54ID0gcHRzLmxlbmd0aCAtIDE7CisKKwkJLy8gQWRkcyB0aGUgd2F5cG9pbnRzCisJCWlmIChoaW50cyAhPSBudWxsICYmIGhpbnRzLmxlbmd0aCA+IDApCisJCXsKKwkJCS8vIENvbnZlcnRzIGFsbCBoaW50cyBhbmQgcmVtb3ZlcyBudWxscworCQkJdmFyIG5ld0hpbnRzID0gW107CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgaGludHMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJdmFyIHRtcCA9IHN0YXRlLnZpZXcudHJhbnNmb3JtQ29udHJvbFBvaW50KHN0YXRlLCBoaW50c1tpXSk7CisJCQkJCisJCQkJaWYgKHRtcCAhPSBudWxsKQorCQkJCXsKKwkJCQkJdG1wLnggPSBNYXRoLnJvdW5kKHRtcC54KTsKKwkJCQkJdG1wLnkgPSBNYXRoLnJvdW5kKHRtcC55KTsKKwkJCQkJbmV3SGludHMucHVzaCh0bXApOworCQkJCX0KKwkJCX0KKwkJCQorCQkJaWYgKG5ld0hpbnRzLmxlbmd0aCA9PSAwKQorCQkJeworCQkJCXJldHVybjsKKwkJCX0KKwkJCQorCQkJaGludHMgPSBuZXdIaW50czsKKwkJCQorCQkJLy8gQWxpZ25zIHNvdXJjZSBhbmQgdGFyZ2V0IGhpbnQgdG8gZml4ZWQgcG9pbnRzCisJCQlpZiAocHQgIT0gbnVsbCAmJiBoaW50c1swXSAhPSBudWxsKQorCQkJeworCQkJCWlmIChNYXRoLmFicyhoaW50c1swXS54IC0gcHQueCkgPCB0b2wpCisJCQkJeworCQkJCQloaW50c1swXS54ID0gcHQueDsKKwkJCQl9CisJCQkJCisJCQkJaWYgKE1hdGguYWJzKGhpbnRzWzBdLnkgLSBwdC55KSA8IHRvbCkKKwkJCQl7CisJCQkJCWhpbnRzWzBdLnkgPSBwdC55OworCQkJCX0KKwkJCX0KKwkJCQorCQkJdmFyIHBlID0gcHRzW2xhc3RJbnhdOworCQkJCisJCQlpZiAocGUgIT0gbnVsbCAmJiBoaW50c1toaW50cy5sZW5ndGggLSAxXSAhPSBudWxsKQorCQkJeworCQkJCWlmIChNYXRoLmFicyhoaW50c1toaW50cy5sZW5ndGggLSAxXS54IC0gcGUueCkgPCB0b2wpCisJCQkJeworCQkJCQloaW50c1toaW50cy5sZW5ndGggLSAxXS54ID0gcGUueDsKKwkJCQl9CisJCQkJCisJCQkJaWYgKE1hdGguYWJzKGhpbnRzW2hpbnRzLmxlbmd0aCAtIDFdLnkgLSBwZS55KSA8IHRvbCkKKwkJCQl7CisJCQkJCWhpbnRzW2hpbnRzLmxlbmd0aCAtIDFdLnkgPSBwZS55OworCQkJCX0KKwkJCX0KKwkJCQorCQkJaGludCA9IGhpbnRzWzBdOworCisJCQl2YXIgY3VycmVudFRlcm0gPSBzb3VyY2U7CisJCQl2YXIgY3VycmVudFB0ID0gcHRzWzBdOworCQkJdmFyIGhvekNoYW4gPSBmYWxzZTsKKwkJCXZhciB2ZXJ0Q2hhbiA9IGZhbHNlOworCQkJdmFyIGN1cnJlbnRIaW50ID0gaGludDsKKwkJCQorCQkJaWYgKGN1cnJlbnRQdCAhPSBudWxsKQorCQkJeworCQkJCWN1cnJlbnRQdC54ID0gTWF0aC5yb3VuZChjdXJyZW50UHQueCk7CisJCQkJY3VycmVudFB0LnkgPSBNYXRoLnJvdW5kKGN1cnJlbnRQdC55KTsKKwkJCQljdXJyZW50VGVybSA9IG51bGw7CisJCQl9CisJCQkKKwkJCS8vIENoZWNrIGZvciBhbGlnbm1lbnQgd2l0aCBmaXhlZCBwb2ludHMgYW5kIHdpdGggY2hhbm5lbHMKKwkJCS8vIGF0IHNvdXJjZSBhbmQgdGFyZ2V0IHNlZ21lbnRzIG9ubHkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJeworCQkJCXZhciBmaXhlZFZlcnRBbGlnbiA9IGN1cnJlbnRQdCAhPSBudWxsICYmIGN1cnJlbnRQdC54ID09IGN1cnJlbnRIaW50Lng7CisJCQkJdmFyIGZpeGVkSG96QWxpZ24gPSBjdXJyZW50UHQgIT0gbnVsbCAmJiBjdXJyZW50UHQueSA9PSBjdXJyZW50SGludC55OworCQkJCQorCQkJCXZhciBpbkhvekNoYW4gPSBjdXJyZW50VGVybSAhPSBudWxsICYmIChjdXJyZW50SGludC55ID49IGN1cnJlbnRUZXJtLnkgJiYKKwkJCQkJCWN1cnJlbnRIaW50LnkgPD0gY3VycmVudFRlcm0ueSArIGN1cnJlbnRUZXJtLmhlaWdodCk7CisJCQkJdmFyIGluVmVydENoYW4gPSBjdXJyZW50VGVybSAhPSBudWxsICYmIChjdXJyZW50SGludC54ID49IGN1cnJlbnRUZXJtLnggJiYKKwkJCQkJCWN1cnJlbnRIaW50LnggPD0gY3VycmVudFRlcm0ueCArIGN1cnJlbnRUZXJtLndpZHRoKTsKKworCQkJCWhvekNoYW4gPSBmaXhlZEhvekFsaWduIHx8IChjdXJyZW50UHQgPT0gbnVsbCAmJiBpbkhvekNoYW4pOworCQkJCXZlcnRDaGFuID0gZml4ZWRWZXJ0QWxpZ24gfHwgKGN1cnJlbnRQdCA9PSBudWxsICYmIGluVmVydENoYW4pOworCQkJCQorCQkJCS8vIElmIHRoZSBjdXJyZW50IGhpbnQgZmFsbHMgaW4gYm90aCB0aGUgaG9yIGFuZCB2ZXJ0IGNoYW5uZWxzIGluIHRoZSBjYXNlCisJCQkJLy8gb2YgYSBmbG9hdGluZyBwb3J0LCBvciBpZiB0aGUgaGludCBpcyBleGFjdGx5IGNvLWluY2lkZW50IHdpdGggYSAKKwkJCQkvLyBmaXhlZCBwb2ludCwgaWdub3JlIHRoZSBzb3VyY2UgYW5kIHRyeSB0byB3b3JrIG91dCB0aGUgb3JpZW50YXRpb24KKwkJCQkvLyBmcm9tIHRoZSB0YXJnZXQgZW5kCisJCQkJaWYgKGk9PTAgJiYgKChob3pDaGFuICYmIHZlcnRDaGFuKSB8fCAoZml4ZWRWZXJ0QWxpZ24gJiYgZml4ZWRIb3pBbGlnbikpKQorCQkJCXsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKGN1cnJlbnRQdCAhPSBudWxsICYmICghZml4ZWRIb3pBbGlnbiAmJiAhZml4ZWRWZXJ0QWxpZ24pICYmIChpbkhvekNoYW4gfHwgaW5WZXJ0Q2hhbikpIAorCQkJCQl7CisJCQkJCQlob3Jpem9udGFsID0gaW5Ib3pDaGFuID8gZmFsc2UgOiB0cnVlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQorCQkJCQlpZiAodmVydENoYW4gfHwgaG96Q2hhbikKKwkJCQkJeworCQkJCQkJaG9yaXpvbnRhbCA9IGhvekNoYW47CisJCQkJCQkKKwkJCQkJCWlmIChpID09IDEpCisJCQkJCQl7CisJCQkJCQkJLy8gV29yayBiYWNrIGZyb20gdGFyZ2V0IGVuZAorCQkJCQkJCWhvcml6b250YWwgPSBoaW50cy5sZW5ndGggJSAyID09IDAgPyBob3pDaGFuIDogdmVydENoYW47CisJCQkJCQl9CisJCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQljdXJyZW50VGVybSA9IHRhcmdldDsKKwkJCQljdXJyZW50UHQgPSBwdHNbbGFzdElueF07CisJCQkJCisJCQkJaWYgKGN1cnJlbnRQdCAhPSBudWxsKQorCQkJCXsKKwkJCQkJY3VycmVudFB0LnggPSBNYXRoLnJvdW5kKGN1cnJlbnRQdC54KTsKKwkJCQkJY3VycmVudFB0LnkgPSBNYXRoLnJvdW5kKGN1cnJlbnRQdC55KTsKKwkJCQkJY3VycmVudFRlcm0gPSBudWxsOworCQkJCX0KKwkJCQkKKwkJCQljdXJyZW50SGludCA9IGhpbnRzW2hpbnRzLmxlbmd0aCAtIDFdOworCQkJCQorCQkJCWlmIChmaXhlZFZlcnRBbGlnbiAmJiBmaXhlZEhvekFsaWduKQorCQkJCXsKKwkJCQkJaGludHMgPSBoaW50cy5zbGljZSgxKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChob3Jpem9udGFsICYmICgocHRzWzBdICE9IG51bGwgJiYgcHRzWzBdLnkgIT0gaGludC55KSB8fAorCQkJCShwdHNbMF0gPT0gbnVsbCAmJiBzb3VyY2UgIT0gbnVsbCAmJgorCQkJCShoaW50LnkgPCBzb3VyY2UueSB8fCBoaW50LnkgPiBzb3VyY2UueSArIHNvdXJjZS5oZWlnaHQpKSkpCisJCQl7CisJCQkJcHVzaFBvaW50KG5ldyBteFBvaW50KHB0LngsIGhpbnQueSkpOworCQkJfQorCQkJZWxzZSBpZiAoIWhvcml6b250YWwgJiYgKChwdHNbMF0gIT0gbnVsbCAmJiBwdHNbMF0ueCAhPSBoaW50LngpIHx8CisJCQkJCShwdHNbMF0gPT0gbnVsbCAmJiBzb3VyY2UgIT0gbnVsbCAmJgorCQkJCQkoaGludC54IDwgc291cmNlLnggfHwgaGludC54ID4gc291cmNlLnggKyBzb3VyY2Uud2lkdGgpKSkpCisJCQl7CisJCQkJcHVzaFBvaW50KG5ldyBteFBvaW50KGhpbnQueCwgcHQueSkpOworCQkJfQorCQkJCisJCQlpZiAoaG9yaXpvbnRhbCkKKwkJCXsKKwkJCQlwdC55ID0gaGludC55OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXB0LnggPSBoaW50Lng7CisJCQl9CisJCQorCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBoaW50cy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQlob3Jpem9udGFsID0gIWhvcml6b250YWw7CisJCQkJaGludCA9IGhpbnRzW2ldOworCQkJCQorLy8JCQkJbXhMb2cuc2hvdygpOworLy8JCQkJbXhMb2cuZGVidWcoJ2hpbnQnLCBpLCBoaW50LngsIGhpbnQueSk7CisJCQkJCisJCQkJaWYgKGhvcml6b250YWwpCisJCQkJeworCQkJCQlwdC55ID0gaGludC55OworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlwdC54ID0gaGludC54OworCQkJCX0KKwkJCisJCQkJcHVzaFBvaW50KHB0LmNsb25lKCkpOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaGludCA9IHB0OworCQkJLy8gRklYTUU6IEZpcnN0IGNsaWNrIGluIGNvbm5lY3QgcHJldmlldyB0b2dnbGVzIG9yaWVudGF0aW9uCisJCQlob3Jpem9udGFsID0gdHJ1ZTsKKwkJfQorCisJCS8vIEFkZHMgdGhlIGxhc3QgcG9pbnQKKwkJcHQgPSBwdHNbbGFzdElueF07CisKKwkJaWYgKHB0ID09IG51bGwgJiYgdGFyZ2V0ICE9IG51bGwpCisJCXsKKwkJCXB0ID0gbmV3IG14UG9pbnQoc3RhdGUudmlldy5nZXRSb3V0aW5nQ2VudGVyWCh0YXJnZXQpLCBzdGF0ZS52aWV3LmdldFJvdXRpbmdDZW50ZXJZKHRhcmdldCkpOworCQl9CisJCQorCQlpZiAocHQgIT0gbnVsbCkKKwkJeworCQkJcHQueCA9IE1hdGgucm91bmQocHQueCk7CisJCQlwdC55ID0gTWF0aC5yb3VuZChwdC55KTsKKwkJCQorCQkJaWYgKGhpbnQgIT0gbnVsbCkKKwkJCXsKKwkJCQlpZiAoaG9yaXpvbnRhbCAmJiAoKHB0c1tsYXN0SW54XSAhPSBudWxsICYmIHB0c1tsYXN0SW54XS55ICE9IGhpbnQueSkgfHwKKwkJCQkJKHB0c1tsYXN0SW54XSA9PSBudWxsICYmIHRhcmdldCAhPSBudWxsICYmCisJCQkJCShoaW50LnkgPCB0YXJnZXQueSB8fCBoaW50LnkgPiB0YXJnZXQueSArIHRhcmdldC5oZWlnaHQpKSkpCisJCQkJeworCQkJCQlwdXNoUG9pbnQobmV3IG14UG9pbnQocHQueCwgaGludC55KSk7CisJCQkJfQorCQkJCWVsc2UgaWYgKCFob3Jpem9udGFsICYmICgocHRzW2xhc3RJbnhdICE9IG51bGwgJiYgcHRzW2xhc3RJbnhdLnggIT0gaGludC54KSB8fAorCQkJCQkJKHB0c1tsYXN0SW54XSA9PSBudWxsICYmIHRhcmdldCAhPSBudWxsICYmCisJCQkJCQkoaGludC54IDwgdGFyZ2V0LnggfHwgaGludC54ID4gdGFyZ2V0LnggKyB0YXJnZXQud2lkdGgpKSkpCisJCQkJeworCQkJCQlwdXNoUG9pbnQobmV3IG14UG9pbnQoaGludC54LCBwdC55KSk7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQkvLyBSZW1vdmVzIGJlbmRzIGluc2lkZSB0aGUgc291cmNlIHRlcm1pbmFsIGZvciBmbG9hdGluZyBwb3J0cworCQlpZiAocHRzWzBdID09IG51bGwgJiYgc291cmNlICE9IG51bGwpCisJCXsKKwkJCXdoaWxlIChyZXN1bHQubGVuZ3RoID4gMSAmJiByZXN1bHRbMV0gIT0gbnVsbCAmJgorCQkJCW14VXRpbHMuY29udGFpbnMoc291cmNlLCByZXN1bHRbMV0ueCwgcmVzdWx0WzFdLnkpKQorCQkJeworCQkJCXJlc3VsdC5zcGxpY2UoMSwgMSk7CisJCQl9CisJCX0KKwkJCisJCS8vIFJlbW92ZXMgYmVuZHMgaW5zaWRlIHRoZSB0YXJnZXQgdGVybWluYWwKKwkJaWYgKHB0c1tsYXN0SW54XSA9PSBudWxsICYmIHRhcmdldCAhPSBudWxsKQorCQl7CisJCQl3aGlsZSAocmVzdWx0Lmxlbmd0aCA+IDEgJiYgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSAhPSBudWxsICYmCisJCQkJbXhVdGlscy5jb250YWlucyh0YXJnZXQsIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0ueCwgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXS55KSkKKwkJCXsKKwkJCQlyZXN1bHQuc3BsaWNlKHJlc3VsdC5sZW5ndGggLSAxLCAxKTsKKwkJCX0KKwkJfQorCQkKKwkJLy8gUmVtb3ZlcyBsYXN0IHBvaW50IGlmIGluc2lkZSB0b2xlcmFuY2Ugd2l0aCBlbmQgcG9pbnQKKwkJaWYgKHBlICE9IG51bGwgJiYgcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSAhPSBudWxsICYmCisJCQlNYXRoLmFicyhwZS54IC0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXS54KSA8IHRvbCAmJgorCQkJTWF0aC5hYnMocGUueSAtIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0ueSkgPCB0b2wpCisJCXsKKwkJCXJlc3VsdC5zcGxpY2UocmVzdWx0Lmxlbmd0aCAtIDEsIDEpOworCQkJCisJCQkvLyBMaW5lcyB1cCBzZWNvbmQgbGFzdCBwb2ludCBpbiByZXN1bHQgd2l0aCBlbmQgcG9pbnQKKwkJCWlmIChyZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdICE9IG51bGwpCisJCQl7CisJCQkJaWYgKE1hdGguYWJzKHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0ueCAtIHBlLngpIDwgdG9sKQorCQkJCXsKKwkJCQkJcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXS54ID0gcGUueDsKKwkJCQl9CisJCQkJCisJCQkJaWYgKE1hdGguYWJzKHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0ueSAtIHBlLnkpIDwgdG9sKQorCQkJCXsKKwkJCQkJcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXS55ID0gcGUueTsKKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCQorCW9ydGhCdWZmZXI6IDEwLAorCQorCW9ydGhQb2ludHNGYWxsYmFjazogdHJ1ZSwKKworCWRpclZlY3RvcnM6IFsgWyAtMSwgMCBdLAorCQkJWyAwLCAtMSBdLCBbIDEsIDAgXSwgWyAwLCAxIF0sIFsgLTEsIDAgXSwgWyAwLCAtMSBdLCBbIDEsIDAgXSBdLAorCisJd2F5UG9pbnRzMTogWyBbIDAsIDBdLCBbIDAsIDBdLCAgWyAwLCAwXSwgWyAwLCAwXSwgWyAwLCAwXSwgIFsgMCwgMF0sCisJICAgICAgICAgICAgICBbIDAsIDBdLCAgWyAwLCAwXSwgWyAwLCAwXSwgIFsgMCwgMF0sIFsgMCwgMF0sICBbIDAsIDBdIF0sCisKKwlyb3V0ZVBhdHRlcm5zOiBbCisJCVsgWyA1MTMsIDIzMDgsIDIwODEsIDI1NjIgXSwgWyA1MTMsIDEwOTAsIDUxNCwgMjE4NCwgMjExNCwgMjU2MSBdLAorCQkJWyA1MTMsIDEwOTAsIDUxNCwgMjU2NCwgMjE4NCwgMjU2MiBdLAorCQkJWyA1MTMsIDIzMDgsIDI1NjEsIDEwOTAsIDUxNCwgMjU2OCwgMjMwOCBdIF0sCisJWyBbIDUxNCwgMTA1NywgNTEzLCAyMzA4LCAyMDgxLCAyNTYyIF0sIFsgNTE0LCAyMTg0LCAyMTE0LCAyNTYxIF0sCisJCQlbIDUxNCwgMjE4NCwgMjU2MiwgMTA1NywgNTEzLCAyNTY0LCAyMTg0IF0sCisJCQlbIDUxNCwgMTA1NywgNTEzLCAyNTY4LCAyMzA4LCAyNTYxIF0gXSwKKwlbIFsgMTA5MCwgNTE0LCAxMDU3LCA1MTMsIDIzMDgsIDIwODEsIDI1NjIgXSwgWyAyMTE0LCAyNTYxIF0sCisJCQlbIDEwOTAsIDI1NjIsIDEwNTcsIDUxMywgMjU2NCwgMjE4NCBdLAorCQkJWyAxMDkwLCA1MTQsIDEwNTcsIDUxMywgMjMwOCwgMjU2MSwgMjU2OCBdIF0sCisJWyBbIDIwODEsIDI1NjIgXSwgWyAxMDU3LCA1MTMsIDEwOTAsIDUxNCwgMjE4NCwgMjExNCwgMjU2MSBdLAorCQkJWyAxMDU3LCA1MTMsIDEwOTAsIDUxNCwgMjE4NCwgMjU2MiwgMjU2NCBdLAorCQkJWyAxMDU3LCAyNTYxLCAxMDkwLCA1MTQsIDI1NjgsIDIzMDggXSBdIF0sCisJCisJaW5saW5lUm91dGVQYXR0ZXJuczogWworCQkJWyBudWxsLCBbIDIxMTQsIDI1NjggXSwgbnVsbCwgbnVsbCBdLAorCQkJWyBudWxsLCBbIDUxNCwgMjA4MSwgMjExNCwgMjU2OCBdICwgbnVsbCwgbnVsbCBdLAorCQkJWyBudWxsLCBbIDIxMTQsIDI1NjEgXSwgbnVsbCwgbnVsbCBdLAorCQkJWyBbIDIwODEsIDI1NjIgXSwgWyAxMDU3LCAyMTE0LCAyNTY4IF0sCisJCQkJCVsgMjE4NCwgMjU2MiBdLAorCQkJCQludWxsIF0gXSwKKwl2ZXJ0ZXhTZXBlcmF0aW9uczogW10sCisKKwlsaW1pdHM6IFsKKwkgICAgICAgWyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIF0sCisJICAgICAgIFsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCBdIF0sCisKKwlMRUZUX01BU0s6IDMyLAorCisJVE9QX01BU0s6IDY0LAorCisJUklHSFRfTUFTSzogMTI4LAorCisJQk9UVE9NX01BU0s6IDI1NiwKKworCUxFRlQ6IDEsCisKKwlUT1A6IDIsCisKKwlSSUdIVDogNCwKKworCUJPVFRPTTogOCwKKworCS8vIFRPRE8gcmVtb3ZlIG1hZ2ljIG51bWJlcnMKKwlTSURFX01BU0s6IDQ4MCwKKwkvL214RWRnZVN0eWxlLkxFRlRfTUFTSyB8IG14RWRnZVN0eWxlLlRPUF9NQVNLIHwgbXhFZGdlU3R5bGUuUklHSFRfTUFTSworCS8vfCBteEVkZ2VTdHlsZS5CT1RUT01fTUFTSywKKworCUNFTlRFUl9NQVNLOiA1MTIsCisKKwlTT1VSQ0VfTUFTSzogMTAyNCwKKworCVRBUkdFVF9NQVNLOiAyMDQ4LAorCisJVkVSVEVYX01BU0s6IDMwNzIsCisJLy8gbXhFZGdlU3R5bGUuU09VUkNFX01BU0sgfCBteEVkZ2VTdHlsZS5UQVJHRVRfTUFTSywKKwkKKwlnZXRKZXR0eVNpemU6IGZ1bmN0aW9uKHN0YXRlLCBzb3VyY2UsIHRhcmdldCwgcG9pbnRzLCBpc1NvdXJjZSkKKwl7CisJCXZhciB2YWx1ZSA9IG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIChpc1NvdXJjZSkgPyBteENvbnN0YW50cy5TVFlMRV9TT1VSQ0VfSkVUVFlfU0laRSA6CisJCQlteENvbnN0YW50cy5TVFlMRV9UQVJHRVRfSkVUVFlfU0laRSwgbXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwKKwkJCQkJbXhDb25zdGFudHMuU1RZTEVfSkVUVFlfU0laRSwgbXhFZGdlU3R5bGUub3J0aEJ1ZmZlcikpOworCQkKKwkJaWYgKHZhbHVlID09ICdhdXRvJykKKwkJeworCQkJLy8gQ29tcHV0ZXMgdGhlIGF1dG9tYXRpYyBqZXR0eSBzaXplCisJCQl2YXIgdHlwZSA9IG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIChpc1NvdXJjZSkgPyBteENvbnN0YW50cy5TVFlMRV9TVEFSVEFSUk9XIDogbXhDb25zdGFudHMuU1RZTEVfRU5EQVJST1csIG14Q29uc3RhbnRzLk5PTkUpOworCQkJCisJCQlpZiAodHlwZSAhPSBteENvbnN0YW50cy5OT05FKQorCQkJeworCQkJCXZhciBzaXplID0gbXhVdGlscy5nZXROdW1iZXIoc3RhdGUuc3R5bGUsIChpc1NvdXJjZSkgPyBteENvbnN0YW50cy5TVFlMRV9TVEFSVFNJWkUgOiBteENvbnN0YW50cy5TVFlMRV9FTkRTSVpFLCBteENvbnN0YW50cy5ERUZBVUxUX01BUktFUlNJWkUpOworCQkJCXZhbHVlID0gTWF0aC5tYXgoMiwgTWF0aC5jZWlsKChzaXplICsgbXhFZGdlU3R5bGUub3J0aEJ1ZmZlcikgLyBteEVkZ2VTdHlsZS5vcnRoQnVmZmVyKSkgKiBteEVkZ2VTdHlsZS5vcnRoQnVmZmVyOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXZhbHVlID0gMiAqIG14RWRnZVN0eWxlLm9ydGhCdWZmZXI7CisJCQl9CisJCX0KKwkJCisJCXJldHVybiB2YWx1ZTsKKwl9LAorCisJLyoqCisJICogRnVuY3Rpb246IE9ydGhDb25uZWN0b3IKKwkgKiAKKwkgKiBJbXBsZW1lbnRzIGEgbG9jYWwgb3J0aG9nb25hbCByb3V0ZXIgYmV0d2VlbiB0aGUgZ2l2ZW4KKwkgKiBjZWxscy4KKwkgKiAKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB0aGF0IHJlcHJlc2VudHMgdGhlIGVkZ2UgdG8gYmUgdXBkYXRlZC4KKwkgKiBzb3VyY2UgLSA8bXhDZWxsU3RhdGU+IHRoYXQgcmVwcmVzZW50cyB0aGUgc291cmNlIHRlcm1pbmFsLgorCSAqIHRhcmdldCAtIDxteENlbGxTdGF0ZT4gdGhhdCByZXByZXNlbnRzIHRoZSB0YXJnZXQgdGVybWluYWwuCisJICogcG9pbnRzIC0gTGlzdCBvZiByZWxhdGl2ZSBjb250cm9sIHBvaW50cy4KKwkgKiByZXN1bHQgLSBBcnJheSBvZiA8bXhQb2ludHM+IHRoYXQgcmVwcmVzZW50IHRoZSBhY3R1YWwgcG9pbnRzIG9mIHRoZQorCSAqIGVkZ2UuCisJICogCisJICovCisJT3J0aENvbm5lY3RvcjogZnVuY3Rpb24oc3RhdGUsIHNvdXJjZSwgdGFyZ2V0LCBwb2ludHMsIHJlc3VsdCkKKwl7CisJCXZhciBncmFwaCA9IHN0YXRlLnZpZXcuZ3JhcGg7CisJCXZhciBzb3VyY2VFZGdlID0gc291cmNlID09IG51bGwgPyBmYWxzZSA6IGdyYXBoLmdldE1vZGVsKCkuaXNFZGdlKHNvdXJjZS5jZWxsKTsKKwkJdmFyIHRhcmdldEVkZ2UgPSB0YXJnZXQgPT0gbnVsbCA/IGZhbHNlIDogZ3JhcGguZ2V0TW9kZWwoKS5pc0VkZ2UodGFyZ2V0LmNlbGwpOworCisJCXZhciBwdHMgPSBzdGF0ZS5hYnNvbHV0ZVBvaW50czsKKwkJdmFyIHAwID0gcHRzWzBdOworCQl2YXIgcGUgPSBwdHNbcHRzLmxlbmd0aC0xXTsKKworCQl2YXIgc291cmNlWCA9IHNvdXJjZSAhPSBudWxsID8gc291cmNlLnggOiBwMC54OworCQl2YXIgc291cmNlWSA9IHNvdXJjZSAhPSBudWxsID8gc291cmNlLnkgOiBwMC55OworCQl2YXIgc291cmNlV2lkdGggPSBzb3VyY2UgIT0gbnVsbCA/IHNvdXJjZS53aWR0aCA6IDA7CisJCXZhciBzb3VyY2VIZWlnaHQgPSBzb3VyY2UgIT0gbnVsbCA/IHNvdXJjZS5oZWlnaHQgOiAwOworCQkKKwkJdmFyIHRhcmdldFggPSB0YXJnZXQgIT0gbnVsbCA/IHRhcmdldC54IDogcGUueDsKKwkJdmFyIHRhcmdldFkgPSB0YXJnZXQgIT0gbnVsbCA/IHRhcmdldC55IDogcGUueTsKKwkJdmFyIHRhcmdldFdpZHRoID0gdGFyZ2V0ICE9IG51bGwgPyB0YXJnZXQud2lkdGggOiAwOworCQl2YXIgdGFyZ2V0SGVpZ2h0ID0gdGFyZ2V0ICE9IG51bGwgPyB0YXJnZXQuaGVpZ2h0IDogMDsKKworCQl2YXIgc2NhbGVkU291cmNlQnVmZmVyID0gc3RhdGUudmlldy5zY2FsZSAqIG14RWRnZVN0eWxlLmdldEpldHR5U2l6ZShzdGF0ZSwgc291cmNlLCB0YXJnZXQsIHBvaW50cywgdHJ1ZSk7CisJCXZhciBzY2FsZWRUYXJnZXRCdWZmZXIgPSBzdGF0ZS52aWV3LnNjYWxlICogbXhFZGdlU3R5bGUuZ2V0SmV0dHlTaXplKHN0YXRlLCBzb3VyY2UsIHRhcmdldCwgcG9pbnRzLCBmYWxzZSk7CisJCQorCQkvLyBXb3JrYXJvdW5kIGZvciBsb29wIHJvdXRpbmcgd2l0aGluIGJ1ZmZlciB6b25lCisJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiB0YXJnZXQgPT0gc291cmNlKQorCQl7CisJCQlzY2FsZWRUYXJnZXRCdWZmZXIgPSBNYXRoLm1heChzY2FsZWRTb3VyY2VCdWZmZXIsIHNjYWxlZFRhcmdldEJ1ZmZlcik7CisJCQlzY2FsZWRTb3VyY2VCdWZmZXIgPSBzY2FsZWRUYXJnZXRCdWZmZXI7CisJCX0KKwkJCisJCXZhciB0b3RhbEJ1ZmZlciA9IHNjYWxlZFRhcmdldEJ1ZmZlciArIHNjYWxlZFNvdXJjZUJ1ZmZlcjsKKwkJdmFyIHRvb1Nob3J0ID0gZmFsc2U7CisJCQorCQkvLyBDaGVja3MgbWluaW11bSBkaXN0YW5jZSBmb3IgZml4ZWQgcG9pbnRzIGFuZCBmYWxscyBiYWNrIHRvIHNlZ21lbnQgY29ubmVjdG9yCisJCWlmIChwMCAhPSBudWxsICYmIHBlICE9IG51bGwpCisJCXsKKwkJCXZhciBkeCA9IHBlLnggLSBwMC54OworCQkJdmFyIGR5ID0gcGUueSAtIHAwLnk7CisJCQkKKwkJCXRvb1Nob3J0ID0gZHggKiBkeCArIGR5ICogZHkgPCB0b3RhbEJ1ZmZlciAqIHRvdGFsQnVmZmVyOworCQl9CisKKwkJaWYgKHRvb1Nob3J0IHx8IChteEVkZ2VTdHlsZS5vcnRoUG9pbnRzRmFsbGJhY2sgJiYgKHBvaW50cyAhPSBudWxsICYmCisJCQlwb2ludHMubGVuZ3RoID4gMCkpIHx8IHNvdXJjZUVkZ2UgfHwgdGFyZ2V0RWRnZSkKKwkJeworCQkJbXhFZGdlU3R5bGUuU2VnbWVudENvbm5lY3RvcihzdGF0ZSwgc291cmNlLCB0YXJnZXQsIHBvaW50cywgcmVzdWx0KTsKKwkJCQorCQkJcmV0dXJuOworCQl9CisKKwkJLy8gRGV0ZXJtaW5lIHRoZSBzaWRlKHMpIG9mIHRoZSBzb3VyY2UgYW5kIHRhcmdldCB2ZXJ0aWNlcworCQkvLyB0aGF0IHRoZSBlZGdlIG1heSBjb25uZWN0IHRvCisJCS8vIHBvcnRDb25zdHJhaW50IFtzb3VyY2UsIHRhcmdldF0KKwkJdmFyIHBvcnRDb25zdHJhaW50ID0gW214Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX0FMTCwgbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfQUxMXTsKKwkJdmFyIHJvdGF0aW9uID0gMDsKKwkJCisJCWlmIChzb3VyY2UgIT0gbnVsbCkKKwkJeworCQkJcG9ydENvbnN0cmFpbnRbMF0gPSBteFV0aWxzLmdldFBvcnRDb25zdHJhaW50cyhzb3VyY2UsIHN0YXRlLCB0cnVlLCAKKwkJCQkJbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfQUxMKTsKKwkJCXJvdGF0aW9uID0gbXhVdGlscy5nZXRWYWx1ZShzb3VyY2Uuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1JPVEFUSU9OLCAwKTsKKwkJCQorCQkJaWYgKHJvdGF0aW9uICE9IDApCisJCQl7CisJCQkJdmFyIG5ld1JlY3QgPSBteFV0aWxzLmdldEJvdW5kaW5nQm94KG5ldyBteFJlY3RhbmdsZShzb3VyY2VYLCBzb3VyY2VZLCBzb3VyY2VXaWR0aCwgc291cmNlSGVpZ2h0KSwgcm90YXRpb24pOworCQkJCXNvdXJjZVggPSBuZXdSZWN0Lng7IAorCQkJCXNvdXJjZVkgPSBuZXdSZWN0Lnk7CisJCQkJc291cmNlV2lkdGggPSBuZXdSZWN0LndpZHRoOworCQkJCXNvdXJjZUhlaWdodCA9IG5ld1JlY3QuaGVpZ2h0OworCQkJfQorCQl9CisKKwkJaWYgKHRhcmdldCAhPSBudWxsKQorCQl7CisJCQlwb3J0Q29uc3RyYWludFsxXSA9IG14VXRpbHMuZ2V0UG9ydENvbnN0cmFpbnRzKHRhcmdldCwgc3RhdGUsIGZhbHNlLAorCQkJCW14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX0FMTCk7CisJCQlyb3RhdGlvbiA9IG14VXRpbHMuZ2V0VmFsdWUodGFyZ2V0LnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9ST1RBVElPTiwgMCk7CisKKwkJCWlmIChyb3RhdGlvbiAhPSAwKQorCQkJeworCQkJCXZhciBuZXdSZWN0ID0gbXhVdGlscy5nZXRCb3VuZGluZ0JveChuZXcgbXhSZWN0YW5nbGUodGFyZ2V0WCwgdGFyZ2V0WSwgdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodCksIHJvdGF0aW9uKTsKKwkJCQl0YXJnZXRYID0gbmV3UmVjdC54OworCQkJCXRhcmdldFkgPSBuZXdSZWN0Lnk7CisJCQkJdGFyZ2V0V2lkdGggPSBuZXdSZWN0LndpZHRoOworCQkJCXRhcmdldEhlaWdodCA9IG5ld1JlY3QuaGVpZ2h0OworCQkJfQorCQl9CisKKwkJLy8gQXZvaWRzIGZsb2F0aW5nIHBvaW50IG51bWJlciBlcnJvcnMKKwkJc291cmNlWCA9IE1hdGgucm91bmQoc291cmNlWCAqIDEwKSAvIDEwOworCQlzb3VyY2VZID0gTWF0aC5yb3VuZChzb3VyY2VZICogMTApIC8gMTA7CisJCXNvdXJjZVdpZHRoID0gTWF0aC5yb3VuZChzb3VyY2VXaWR0aCAqIDEwKSAvIDEwOworCQlzb3VyY2VIZWlnaHQgPSBNYXRoLnJvdW5kKHNvdXJjZUhlaWdodCAqIDEwKSAvIDEwOworCQkKKwkJdGFyZ2V0WCA9IE1hdGgucm91bmQodGFyZ2V0WCAqIDEwKSAvIDEwOworCQl0YXJnZXRZID0gTWF0aC5yb3VuZCh0YXJnZXRZICogMTApIC8gMTA7CisJCXRhcmdldFdpZHRoID0gTWF0aC5yb3VuZCh0YXJnZXRXaWR0aCAqIDEwKSAvIDEwOworCQl0YXJnZXRIZWlnaHQgPSBNYXRoLnJvdW5kKHRhcmdldEhlaWdodCAqIDEwKSAvIDEwOworCQkKKwkJdmFyIGRpciA9IFswLCAwXTsKKworCQkvLyBXb3JrIG91dCB3aGljaCBmYWNlcyBvZiB0aGUgdmVydGljZXMgcHJlc2VudCBhZ2FpbnN0IGVhY2ggb3RoZXIKKwkJLy8gaW4gYSB3YXkgdGhhdCB3b3VsZCBhbGxvdyBhIDMtc2VnbWVudCBjb25uZWN0aW9uIGlmIHBvcnQgY29uc3RyYWludHMKKwkJLy8gcGVybWl0dGVkLgorCQkvLyBnZW8gLT4gW3NvdXJjZSwgdGFyZ2V0XSBbeCwgeSwgd2lkdGgsIGhlaWdodF0KKwkJdmFyIGdlbyA9IFsgW3NvdXJjZVgsIHNvdXJjZVksIHNvdXJjZVdpZHRoLCBzb3VyY2VIZWlnaHRdICwKKwkJICAgICAgICAgICAgW3RhcmdldFgsIHRhcmdldFksIHRhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHRdIF07CisJCXZhciBidWZmZXIgPSBbc2NhbGVkU291cmNlQnVmZmVyLCBzY2FsZWRUYXJnZXRCdWZmZXJdOworCisJCWZvciAodmFyIGkgPSAwOyBpIDwgMjsgaSsrKQorCQl7CisJCQlteEVkZ2VTdHlsZS5saW1pdHNbaV1bMV0gPSBnZW9baV1bMF0gLSBidWZmZXJbaV07CisJCQlteEVkZ2VTdHlsZS5saW1pdHNbaV1bMl0gPSBnZW9baV1bMV0gLSBidWZmZXJbaV07CisJCQlteEVkZ2VTdHlsZS5saW1pdHNbaV1bNF0gPSBnZW9baV1bMF0gKyBnZW9baV1bMl0gKyBidWZmZXJbaV07CisJCQlteEVkZ2VTdHlsZS5saW1pdHNbaV1bOF0gPSBnZW9baV1bMV0gKyBnZW9baV1bM10gKyBidWZmZXJbaV07CisJCX0KKwkJCisJCS8vIFdvcmsgb3V0IHdoaWNoIHF1YWQgdGhlIHRhcmdldCBpcyBpbgorCQl2YXIgc291cmNlQ2VuWCA9IGdlb1swXVswXSArIGdlb1swXVsyXSAvIDIuMDsKKwkJdmFyIHNvdXJjZUNlblkgPSBnZW9bMF1bMV0gKyBnZW9bMF1bM10gLyAyLjA7CisJCXZhciB0YXJnZXRDZW5YID0gZ2VvWzFdWzBdICsgZ2VvWzFdWzJdIC8gMi4wOworCQl2YXIgdGFyZ2V0Q2VuWSA9IGdlb1sxXVsxXSArIGdlb1sxXVszXSAvIDIuMDsKKwkJCisJCXZhciBkeCA9IHNvdXJjZUNlblggLSB0YXJnZXRDZW5YOworCQl2YXIgZHkgPSBzb3VyY2VDZW5ZIC0gdGFyZ2V0Q2VuWTsKKworCQl2YXIgcXVhZCA9IDA7CisKKwkJaWYgKGR4IDwgMCkKKwkJeworCQkJaWYgKGR5IDwgMCkKKwkJCXsKKwkJCQlxdWFkID0gMjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlxdWFkID0gMTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChkeSA8PSAwKQorCQkJeworCQkJCXF1YWQgPSAzOworCQkJCQorCQkJCS8vIFNwZWNpYWwgY2FzZSBvbiB4ID0gMCBhbmQgbmVnYXRpdmUgeQorCQkJCWlmIChkeCA9PSAwKQorCQkJCXsKKwkJCQkJcXVhZCA9IDI7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gQ2hlY2sgZm9yIGNvbm5lY3Rpb24gY29uc3RyYWludHMKKwkJdmFyIGN1cnJlbnRUZXJtID0gbnVsbDsKKwkJCisJCWlmIChzb3VyY2UgIT0gbnVsbCkKKwkJeworCQkJY3VycmVudFRlcm0gPSBwMDsKKwkJfQorCisJCXZhciBjb25zdHJhaW50ID0gWyBbMC41LCAwLjVdICwgWzAuNSwgMC41XSBdOworCisJCWZvciAodmFyIGkgPSAwOyBpIDwgMjsgaSsrKQorCQl7CisJCQlpZiAoY3VycmVudFRlcm0gIT0gbnVsbCkKKwkJCXsKKwkJCQljb25zdHJhaW50W2ldWzBdID0gKGN1cnJlbnRUZXJtLnggLSBnZW9baV1bMF0pIC8gZ2VvW2ldWzJdOworCQkJCQorCQkJCWlmIChNYXRoLmFicyhjdXJyZW50VGVybS54IC0gZ2VvW2ldWzBdKSA8PSAxKQorCQkJCXsKKwkJCQkJZGlyW2ldID0gbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfV0VTVDsKKwkJCQl9CisJCQkJZWxzZSBpZiAoTWF0aC5hYnMoY3VycmVudFRlcm0ueCAtIGdlb1tpXVswXSAtIGdlb1tpXVsyXSkgPD0gMSkKKwkJCQl7CisJCQkJCWRpcltpXSA9IG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX0VBU1Q7CisJCQkJfQorCisJCQkJY29uc3RyYWludFtpXVsxXSA9IChjdXJyZW50VGVybS55IC0gZ2VvW2ldWzFdKSAvIGdlb1tpXVszXTsKKworCQkJCWlmIChNYXRoLmFicyhjdXJyZW50VGVybS55IC0gZ2VvW2ldWzFdKSA8PSAxKQorCQkJCXsKKwkJCQkJZGlyW2ldID0gbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfTk9SVEg7CisJCQkJfQorCQkJCWVsc2UgaWYgKE1hdGguYWJzKGN1cnJlbnRUZXJtLnkgLSBnZW9baV1bMV0gLSBnZW9baV1bM10pIDw9IDEpCisJCQkJeworCQkJCQlkaXJbaV0gPSBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19TT1VUSDsKKwkJCQl9CisJCQl9CisKKwkJCWN1cnJlbnRUZXJtID0gbnVsbDsKKwkJCQorCQkJaWYgKHRhcmdldCAhPSBudWxsKQorCQkJeworCQkJCWN1cnJlbnRUZXJtID0gcGU7CisJCQl9CisJCX0KKworCQl2YXIgc291cmNlVG9wRGlzdCA9IGdlb1swXVsxXSAtIChnZW9bMV1bMV0gKyBnZW9bMV1bM10pOworCQl2YXIgc291cmNlTGVmdERpc3QgPSBnZW9bMF1bMF0gLSAoZ2VvWzFdWzBdICsgZ2VvWzFdWzJdKTsKKwkJdmFyIHNvdXJjZUJvdHRvbURpc3QgPSBnZW9bMV1bMV0gLSAoZ2VvWzBdWzFdICsgZ2VvWzBdWzNdKTsKKwkJdmFyIHNvdXJjZVJpZ2h0RGlzdCA9IGdlb1sxXVswXSAtIChnZW9bMF1bMF0gKyBnZW9bMF1bMl0pOworCisJCW14RWRnZVN0eWxlLnZlcnRleFNlcGVyYXRpb25zWzFdID0gTWF0aC5tYXgoc291cmNlTGVmdERpc3QgLSB0b3RhbEJ1ZmZlciwgMCk7CisJCW14RWRnZVN0eWxlLnZlcnRleFNlcGVyYXRpb25zWzJdID0gTWF0aC5tYXgoc291cmNlVG9wRGlzdCAtIHRvdGFsQnVmZmVyLCAwKTsKKwkJbXhFZGdlU3R5bGUudmVydGV4U2VwZXJhdGlvbnNbNF0gPSBNYXRoLm1heChzb3VyY2VCb3R0b21EaXN0IC0gdG90YWxCdWZmZXIsIDApOworCQlteEVkZ2VTdHlsZS52ZXJ0ZXhTZXBlcmF0aW9uc1szXSA9IE1hdGgubWF4KHNvdXJjZVJpZ2h0RGlzdCAtIHRvdGFsQnVmZmVyLCAwKTsKKwkJCQkKKwkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBTdGFydCBvZiBzb3VyY2UgYW5kIHRhcmdldCBkaXJlY3Rpb24gZGV0ZXJtaW5hdGlvbgorCisJCS8vIFdvcmsgdGhyb3VnaCB0aGUgcHJlZmVycmVkIG9yaWVudGF0aW9ucyBieSByZWxhdGl2ZSBwb3NpdGlvbmluZworCQkvLyBvZiB0aGUgdmVydGljZXMgYW5kIGxpc3QgdGhlbSBpbiBwcmVmZXJyZWQgYW5kIGF2YWlsYWJsZSBvcmRlcgorCQkKKwkJdmFyIGRpclByZWYgPSBbXTsKKwkJdmFyIGhvclByZWYgPSBbXTsKKwkJdmFyIHZlcnRQcmVmID0gW107CisKKwkJaG9yUHJlZlswXSA9IChzb3VyY2VMZWZ0RGlzdCA+PSBzb3VyY2VSaWdodERpc3QpID8gbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfV0VTVAorCQkJCTogbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfRUFTVDsKKwkJdmVydFByZWZbMF0gPSAoc291cmNlVG9wRGlzdCA+PSBzb3VyY2VCb3R0b21EaXN0KSA/IG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX05PUlRICisJCQkJOiBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19TT1VUSDsKKworCQlob3JQcmVmWzFdID0gbXhVdGlscy5yZXZlcnNlUG9ydENvbnN0cmFpbnRzKGhvclByZWZbMF0pOworCQl2ZXJ0UHJlZlsxXSA9IG14VXRpbHMucmV2ZXJzZVBvcnRDb25zdHJhaW50cyh2ZXJ0UHJlZlswXSk7CisJCQorCQl2YXIgcHJlZmVycmVkSG9yaXpEaXN0ID0gc291cmNlTGVmdERpc3QgPj0gc291cmNlUmlnaHREaXN0ID8gc291cmNlTGVmdERpc3QKKwkJCQk6IHNvdXJjZVJpZ2h0RGlzdDsKKwkJdmFyIHByZWZlcnJlZFZlcnREaXN0ID0gc291cmNlVG9wRGlzdCA+PSBzb3VyY2VCb3R0b21EaXN0ID8gc291cmNlVG9wRGlzdAorCQkJCTogc291cmNlQm90dG9tRGlzdDsKKworCQl2YXIgcHJlZk9yZGVyaW5nID0gWyBbMCwgMF0gLCBbMCwgMF0gXTsKKwkJdmFyIHByZWZlcnJlZE9yZGVyU2V0ID0gZmFsc2U7CisKKwkJLy8gSWYgdGhlIHByZWZlcnJlZCBwb3J0IGlzbid0IGF2YWlsYWJsZSwgc3dpdGNoIGl0CisJCWZvciAodmFyIGkgPSAwOyBpIDwgMjsgaSsrKQorCQl7CisJCQlpZiAoZGlyW2ldICE9IDB4MCkKKwkJCXsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKChob3JQcmVmW2ldICYgcG9ydENvbnN0cmFpbnRbaV0pID09IDApCisJCQl7CisJCQkJaG9yUHJlZltpXSA9IG14VXRpbHMucmV2ZXJzZVBvcnRDb25zdHJhaW50cyhob3JQcmVmW2ldKTsKKwkJCX0KKworCQkJaWYgKCh2ZXJ0UHJlZltpXSAmIHBvcnRDb25zdHJhaW50W2ldKSA9PSAwKQorCQkJeworCQkJCXZlcnRQcmVmW2ldID0gbXhVdGlscworCQkJCQkJLnJldmVyc2VQb3J0Q29uc3RyYWludHModmVydFByZWZbaV0pOworCQkJfQorCisJCQlwcmVmT3JkZXJpbmdbaV1bMF0gPSB2ZXJ0UHJlZltpXTsKKwkJCXByZWZPcmRlcmluZ1tpXVsxXSA9IGhvclByZWZbaV07CisJCX0KKworCQlpZiAocHJlZmVycmVkVmVydERpc3QgPiAwCisJCQkJJiYgcHJlZmVycmVkSG9yaXpEaXN0ID4gMCkKKwkJeworCQkJLy8gUG9zc2liaWxpdHkgb2YgdHdvIHNlZ21lbnQgZWRnZSBjb25uZWN0aW9uCisJCQlpZiAoKChob3JQcmVmWzBdICYgcG9ydENvbnN0cmFpbnRbMF0pID4gMCkKKwkJCQkJJiYgKCh2ZXJ0UHJlZlsxXSAmIHBvcnRDb25zdHJhaW50WzFdKSA+IDApKQorCQkJeworCQkJCXByZWZPcmRlcmluZ1swXVswXSA9IGhvclByZWZbMF07CisJCQkJcHJlZk9yZGVyaW5nWzBdWzFdID0gdmVydFByZWZbMF07CisJCQkJcHJlZk9yZGVyaW5nWzFdWzBdID0gdmVydFByZWZbMV07CisJCQkJcHJlZk9yZGVyaW5nWzFdWzFdID0gaG9yUHJlZlsxXTsKKwkJCQlwcmVmZXJyZWRPcmRlclNldCA9IHRydWU7CisJCQl9CisJCQllbHNlIGlmICgoKHZlcnRQcmVmWzBdICYgcG9ydENvbnN0cmFpbnRbMF0pID4gMCkKKwkJCQkJJiYgKChob3JQcmVmWzFdICYgcG9ydENvbnN0cmFpbnRbMV0pID4gMCkpCisJCQl7CisJCQkJcHJlZk9yZGVyaW5nWzBdWzBdID0gdmVydFByZWZbMF07CisJCQkJcHJlZk9yZGVyaW5nWzBdWzFdID0gaG9yUHJlZlswXTsKKwkJCQlwcmVmT3JkZXJpbmdbMV1bMF0gPSBob3JQcmVmWzFdOworCQkJCXByZWZPcmRlcmluZ1sxXVsxXSA9IHZlcnRQcmVmWzFdOworCQkJCXByZWZlcnJlZE9yZGVyU2V0ID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKHByZWZlcnJlZFZlcnREaXN0ID4gMCAmJiAhcHJlZmVycmVkT3JkZXJTZXQpCisJCXsKKwkJCXByZWZPcmRlcmluZ1swXVswXSA9IHZlcnRQcmVmWzBdOworCQkJcHJlZk9yZGVyaW5nWzBdWzFdID0gaG9yUHJlZlswXTsKKwkJCXByZWZPcmRlcmluZ1sxXVswXSA9IHZlcnRQcmVmWzFdOworCQkJcHJlZk9yZGVyaW5nWzFdWzFdID0gaG9yUHJlZlsxXTsKKwkJCXByZWZlcnJlZE9yZGVyU2V0ID0gdHJ1ZTsKKworCQl9CisJCQorCQlpZiAocHJlZmVycmVkSG9yaXpEaXN0ID4gMCAmJiAhcHJlZmVycmVkT3JkZXJTZXQpCisJCXsKKwkJCXByZWZPcmRlcmluZ1swXVswXSA9IGhvclByZWZbMF07CisJCQlwcmVmT3JkZXJpbmdbMF1bMV0gPSB2ZXJ0UHJlZlswXTsKKwkJCXByZWZPcmRlcmluZ1sxXVswXSA9IGhvclByZWZbMV07CisJCQlwcmVmT3JkZXJpbmdbMV1bMV0gPSB2ZXJ0UHJlZlsxXTsKKwkJCXByZWZlcnJlZE9yZGVyU2V0ID0gdHJ1ZTsKKwkJfQorCisJCS8vIFRoZSBzb3VyY2UgYW5kIHRhcmdldCBwcmVmcyBhcmUgbm93IGFuIG9yZGVyZWQgbGlzdCBvZgorCQkvLyB0aGUgcHJlZmVycmVkIHBvcnQgc2VsZWN0aW9ucworCQkvLyBJdCB0aGUgbGlzdCBjYW4gY29udGFpbiBnYXBzLCBjb21wYWN0IGl0CisKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCAyOyBpKyspCisJCXsKKwkJCWlmIChkaXJbaV0gIT0gMHgwKQorCQkJeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoKHByZWZPcmRlcmluZ1tpXVswXSAmIHBvcnRDb25zdHJhaW50W2ldKSA9PSAwKQorCQkJeworCQkJCXByZWZPcmRlcmluZ1tpXVswXSA9IHByZWZPcmRlcmluZ1tpXVsxXTsKKwkJCX0KKworCQkJZGlyUHJlZltpXSA9IHByZWZPcmRlcmluZ1tpXVswXSAmIHBvcnRDb25zdHJhaW50W2ldOworCQkJZGlyUHJlZltpXSB8PSAocHJlZk9yZGVyaW5nW2ldWzFdICYgcG9ydENvbnN0cmFpbnRbaV0pIDw8IDg7CisJCQlkaXJQcmVmW2ldIHw9IChwcmVmT3JkZXJpbmdbMSAtIGldW2ldICYgcG9ydENvbnN0cmFpbnRbaV0pIDw8IDE2OworCQkJZGlyUHJlZltpXSB8PSAocHJlZk9yZGVyaW5nWzEgLSBpXVsxIC0gaV0gJiBwb3J0Q29uc3RyYWludFtpXSkgPDwgMjQ7CisKKwkJCWlmICgoZGlyUHJlZltpXSAmIDB4RikgPT0gMCkKKwkJCXsKKwkJCQlkaXJQcmVmW2ldID0gZGlyUHJlZltpXSA8PCA4OworCQkJfQorCQkJCisJCQlpZiAoKGRpclByZWZbaV0gJiAweEYwMCkgPT0gMCkKKwkJCXsKKwkJCQlkaXJQcmVmW2ldID0gKGRpclByZWZbaV0gJiAweEYpIHwgZGlyUHJlZltpXSA+PiA4OworCQkJfQorCQkJCisJCQlpZiAoKGRpclByZWZbaV0gJiAweEYwMDAwKSA9PSAwKQorCQkJeworCQkJCWRpclByZWZbaV0gPSAoZGlyUHJlZltpXSAmIDB4RkZGRikKKwkJCQkJCXwgKChkaXJQcmVmW2ldICYgMHhGMDAwMDAwKSA+PiA4KTsKKwkJCX0KKworCQkJZGlyW2ldID0gZGlyUHJlZltpXSAmIDB4RjsKKworCQkJaWYgKHBvcnRDb25zdHJhaW50W2ldID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX1dFU1QKKwkJCQkJfHwgcG9ydENvbnN0cmFpbnRbaV0gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfTk9SVEgKKwkJCQkJfHwgcG9ydENvbnN0cmFpbnRbaV0gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfRUFTVAorCQkJCQl8fCBwb3J0Q29uc3RyYWludFtpXSA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19TT1VUSCkKKwkJCXsKKwkJCQlkaXJbaV0gPSBwb3J0Q29uc3RyYWludFtpXTsKKwkJCX0KKwkJfQorCisJCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gRW5kIG9mIHNvdXJjZSBhbmQgdGFyZ2V0IGRpcmVjdGlvbiBkZXRlcm1pbmF0aW9uCisKKwkJdmFyIHNvdXJjZUluZGV4ID0gZGlyWzBdID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX0VBU1QgPyAzCisJCQkJOiBkaXJbMF07CisJCXZhciB0YXJnZXRJbmRleCA9IGRpclsxXSA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19FQVNUID8gMworCQkJCTogZGlyWzFdOworCisJCXNvdXJjZUluZGV4IC09IHF1YWQ7CisJCXRhcmdldEluZGV4IC09IHF1YWQ7CisKKwkJaWYgKHNvdXJjZUluZGV4IDwgMSkKKwkJeworCQkJc291cmNlSW5kZXggKz0gNDsKKwkJfQorCQkKKwkJaWYgKHRhcmdldEluZGV4IDwgMSkKKwkJeworCQkJdGFyZ2V0SW5kZXggKz0gNDsKKwkJfQorCisJCXZhciByb3V0ZVBhdHRlcm4gPSBteEVkZ2VTdHlsZS5yb3V0ZVBhdHRlcm5zW3NvdXJjZUluZGV4IC0gMV1bdGFyZ2V0SW5kZXggLSAxXTsKKworCQlteEVkZ2VTdHlsZS53YXlQb2ludHMxWzBdWzBdID0gZ2VvWzBdWzBdOworCQlteEVkZ2VTdHlsZS53YXlQb2ludHMxWzBdWzFdID0gZ2VvWzBdWzFdOworCisJCXN3aXRjaCAoZGlyWzBdKQorCQl7CisJCQljYXNlIG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX1dFU1Q6CisJCQkJbXhFZGdlU3R5bGUud2F5UG9pbnRzMVswXVswXSAtPSBzY2FsZWRTb3VyY2VCdWZmZXI7CisJCQkJbXhFZGdlU3R5bGUud2F5UG9pbnRzMVswXVsxXSArPSBjb25zdHJhaW50WzBdWzFdICogZ2VvWzBdWzNdOworCQkJCWJyZWFrOworCQkJY2FzZSBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19TT1VUSDoKKwkJCQlteEVkZ2VTdHlsZS53YXlQb2ludHMxWzBdWzBdICs9IGNvbnN0cmFpbnRbMF1bMF0gKiBnZW9bMF1bMl07CisJCQkJbXhFZGdlU3R5bGUud2F5UG9pbnRzMVswXVsxXSArPSBnZW9bMF1bM10gKyBzY2FsZWRTb3VyY2VCdWZmZXI7CisJCQkJYnJlYWs7CisJCQljYXNlIG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX0VBU1Q6CisJCQkJbXhFZGdlU3R5bGUud2F5UG9pbnRzMVswXVswXSArPSBnZW9bMF1bMl0gKyBzY2FsZWRTb3VyY2VCdWZmZXI7CisJCQkJbXhFZGdlU3R5bGUud2F5UG9pbnRzMVswXVsxXSArPSBjb25zdHJhaW50WzBdWzFdICogZ2VvWzBdWzNdOworCQkJCWJyZWFrOworCQkJY2FzZSBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19OT1JUSDoKKwkJCQlteEVkZ2VTdHlsZS53YXlQb2ludHMxWzBdWzBdICs9IGNvbnN0cmFpbnRbMF1bMF0gKiBnZW9bMF1bMl07CisJCQkJbXhFZGdlU3R5bGUud2F5UG9pbnRzMVswXVsxXSAtPSBzY2FsZWRTb3VyY2VCdWZmZXI7CisJCQkJYnJlYWs7CisJCX0KKworCQl2YXIgY3VycmVudEluZGV4ID0gMDsKKworCQkvLyBPcmllbnRhdGlvbiwgMCBob3Jpem9udGFsLCAxIHZlcnRpY2FsCisJCXZhciBsYXN0T3JpZW50YXRpb24gPSAoZGlyWzBdICYgKG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX0VBU1QgfCBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19XRVNUKSkgPiAwID8gMAorCQkJCTogMTsKKwkJdmFyIGluaXRpYWxPcmllbnRhdGlvbiA9IGxhc3RPcmllbnRhdGlvbjsKKwkJdmFyIGN1cnJlbnRPcmllbnRhdGlvbiA9IDA7CisKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCByb3V0ZVBhdHRlcm4ubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBuZXh0RGlyZWN0aW9uID0gcm91dGVQYXR0ZXJuW2ldICYgMHhGOworCisJCQkvLyBSb3RhdGUgdGhlIGluZGV4IG9mIHRoaXMgZGlyZWN0aW9uIGJ5IHRoZSBxdWFkCisJCQkvLyB0byBnZXQgdGhlIHJlYWwgZGlyZWN0aW9uCisJCQl2YXIgZGlyZWN0aW9uSW5kZXggPSBuZXh0RGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9NQVNLX0VBU1QgPyAzCisJCQkJCTogbmV4dERpcmVjdGlvbjsKKworCQkJZGlyZWN0aW9uSW5kZXggKz0gcXVhZDsKKworCQkJaWYgKGRpcmVjdGlvbkluZGV4ID4gNCkKKwkJCXsKKwkJCQlkaXJlY3Rpb25JbmRleCAtPSA0OworCQkJfQorCisJCQl2YXIgZGlyZWN0aW9uID0gbXhFZGdlU3R5bGUuZGlyVmVjdG9yc1tkaXJlY3Rpb25JbmRleCAtIDFdOworCisJCQljdXJyZW50T3JpZW50YXRpb24gPSAoZGlyZWN0aW9uSW5kZXggJSAyID4gMCkgPyAwIDogMTsKKwkJCS8vIE9ubHkgdXBkYXRlIHRoZSBjdXJyZW50IGluZGV4IGlmIHRoZSBwb2ludCBtb3ZlZAorCQkJLy8gaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgY3VycmVudCBzZWdtZW50IG1vdmUsCisJCQkvLyBvdGhlcndpc2UgdGhlIHNhbWUgcG9pbnQgaXMgbW92ZWQgdW50aWwgdGhlcmUgaXMgCisJCQkvLyBhIHNlZ21lbnQgZGlyZWN0aW9uIGNoYW5nZQorCQkJaWYgKGN1cnJlbnRPcmllbnRhdGlvbiAhPSBsYXN0T3JpZW50YXRpb24pCisJCQl7CisJCQkJY3VycmVudEluZGV4Kys7CisJCQkJLy8gQ29weSB0aGUgcHJldmlvdXMgd2F5IHBvaW50IGludG8gdGhlIG5ldyBvbmUKKwkJCQkvLyBXZSBjYW4ndCBiYXNlIHRoZSBuZXcgcG9zaXRpb24gb24gaW5kZXggLSAxCisJCQkJLy8gYmVjYXVzZSBzb21ldGltZSBlbGJvd3MgdHVybiBvdXQgbm90IHRvIGV4aXN0LAorCQkJCS8vIHRoZW4gd2UnZCBoYXZlIHRvIHJld2luZC4KKwkJCQlteEVkZ2VTdHlsZS53YXlQb2ludHMxW2N1cnJlbnRJbmRleF1bMF0gPSBteEVkZ2VTdHlsZS53YXlQb2ludHMxW2N1cnJlbnRJbmRleCAtIDFdWzBdOworCQkJCW14RWRnZVN0eWxlLndheVBvaW50czFbY3VycmVudEluZGV4XVsxXSA9IG14RWRnZVN0eWxlLndheVBvaW50czFbY3VycmVudEluZGV4IC0gMV1bMV07CisJCQl9CisKKwkJCXZhciB0YXIgPSAocm91dGVQYXR0ZXJuW2ldICYgbXhFZGdlU3R5bGUuVEFSR0VUX01BU0spID4gMDsKKwkJCXZhciBzb3UgPSAocm91dGVQYXR0ZXJuW2ldICYgbXhFZGdlU3R5bGUuU09VUkNFX01BU0spID4gMDsKKwkJCXZhciBzaWRlID0gKHJvdXRlUGF0dGVybltpXSAmIG14RWRnZVN0eWxlLlNJREVfTUFTSykgPj4gNTsKKwkJCXNpZGUgPSBzaWRlIDw8IHF1YWQ7CisKKwkJCWlmIChzaWRlID4gMHhGKQorCQkJeworCQkJCXNpZGUgPSBzaWRlID4+IDQ7CisJCQl9CisKKwkJCXZhciBjZW50ZXIgPSAocm91dGVQYXR0ZXJuW2ldICYgbXhFZGdlU3R5bGUuQ0VOVEVSX01BU0spID4gMDsKKworCQkJaWYgKChzb3UgfHwgdGFyKSAmJiBzaWRlIDwgOSkKKwkJCXsKKwkJCQl2YXIgbGltaXQgPSAwOworCQkJCXZhciBzb3VUYXIgPSBzb3UgPyAwIDogMTsKKworCQkJCWlmIChjZW50ZXIgJiYgY3VycmVudE9yaWVudGF0aW9uID09IDApCisJCQkJeworCQkJCQlsaW1pdCA9IGdlb1tzb3VUYXJdWzBdICsgY29uc3RyYWludFtzb3VUYXJdWzBdICogZ2VvW3NvdVRhcl1bMl07CisJCQkJfQorCQkJCWVsc2UgaWYgKGNlbnRlcikKKwkJCQl7CisJCQkJCWxpbWl0ID0gZ2VvW3NvdVRhcl1bMV0gKyBjb25zdHJhaW50W3NvdVRhcl1bMV0gKiBnZW9bc291VGFyXVszXTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbGltaXQgPSBteEVkZ2VTdHlsZS5saW1pdHNbc291VGFyXVtzaWRlXTsKKwkJCQl9CisJCQkJCisJCQkJaWYgKGN1cnJlbnRPcmllbnRhdGlvbiA9PSAwKQorCQkJCXsKKwkJCQkJdmFyIGxhc3RYID0gbXhFZGdlU3R5bGUud2F5UG9pbnRzMVtjdXJyZW50SW5kZXhdWzBdOworCQkJCQl2YXIgZGVsdGFYID0gKGxpbWl0IC0gbGFzdFgpICogZGlyZWN0aW9uWzBdOworCisJCQkJCWlmIChkZWx0YVggPiAwKQorCQkJCQl7CisJCQkJCQlteEVkZ2VTdHlsZS53YXlQb2ludHMxW2N1cnJlbnRJbmRleF1bMF0gKz0gZGlyZWN0aW9uWzBdCisJCQkJCQkJCSogZGVsdGFYOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXZhciBsYXN0WSA9IG14RWRnZVN0eWxlLndheVBvaW50czFbY3VycmVudEluZGV4XVsxXTsKKwkJCQkJdmFyIGRlbHRhWSA9IChsaW1pdCAtIGxhc3RZKSAqIGRpcmVjdGlvblsxXTsKKworCQkJCQlpZiAoZGVsdGFZID4gMCkKKwkJCQkJeworCQkJCQkJbXhFZGdlU3R5bGUud2F5UG9pbnRzMVtjdXJyZW50SW5kZXhdWzFdICs9IGRpcmVjdGlvblsxXQorCQkJCQkJCQkqIGRlbHRhWTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJZWxzZSBpZiAoY2VudGVyKQorCQkJeworCQkJCS8vIFdoaWNoIGNlbnRlciB3ZSdyZSB0cmF2ZWxsaW5nIHRvIGRlcGVuZCBvbiB0aGUgY3VycmVudCBkaXJlY3Rpb24KKwkJCQlteEVkZ2VTdHlsZS53YXlQb2ludHMxW2N1cnJlbnRJbmRleF1bMF0gKz0gZGlyZWN0aW9uWzBdCisJCQkJCQkqIE1hdGguYWJzKG14RWRnZVN0eWxlLnZlcnRleFNlcGVyYXRpb25zW2RpcmVjdGlvbkluZGV4XSAvIDIpOworCQkJCW14RWRnZVN0eWxlLndheVBvaW50czFbY3VycmVudEluZGV4XVsxXSArPSBkaXJlY3Rpb25bMV0KKwkJCQkJCSogTWF0aC5hYnMobXhFZGdlU3R5bGUudmVydGV4U2VwZXJhdGlvbnNbZGlyZWN0aW9uSW5kZXhdIC8gMik7CisJCQl9CisKKwkJCWlmIChjdXJyZW50SW5kZXggPiAwCisJCQkJCSYmIG14RWRnZVN0eWxlLndheVBvaW50czFbY3VycmVudEluZGV4XVtjdXJyZW50T3JpZW50YXRpb25dID09IG14RWRnZVN0eWxlLndheVBvaW50czFbY3VycmVudEluZGV4IC0gMV1bY3VycmVudE9yaWVudGF0aW9uXSkKKwkJCXsKKwkJCQljdXJyZW50SW5kZXgtLTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlsYXN0T3JpZW50YXRpb24gPSBjdXJyZW50T3JpZW50YXRpb247CisJCQl9CisJCX0KKworCQlmb3IgKHZhciBpID0gMDsgaSA8PSBjdXJyZW50SW5kZXg7IGkrKykKKwkJeworCQkJaWYgKGkgPT0gY3VycmVudEluZGV4KQorCQkJeworCQkJCS8vIExhc3QgcG9pbnQgY2FuIGNhdXNlIGxhc3Qgc2VnbWVudCB0byBiZSBpbgorCQkJCS8vIHNhbWUgZGlyZWN0aW9uIGFzIGpldHR5L2FwcHJvYWNoLiBJZiBzbywKKwkJCQkvLyBjaGVjayB0aGUgbnVtYmVyIG9mIHBvaW50cyBpcyBjb25zaXN0ZW50CisJCQkJLy8gd2l0aCB0aGUgcmVsYXRpdmUgb3JpZW50YXRpb24gb2Ygc291cmNlIGFuZCB0YXJnZXQKKwkJCQkvLyBqeC4gU2FtZSBvcmllbnRhdGlvbiByZXF1aXJlcyBhbiBldmVuCisJCQkJLy8gbnVtYmVyIG9mIHR1cm5zIChwb2ludHMpLCBkaWZmZXJlbnQgcmVxdWlyZXMKKwkJCQkvLyBvZGQuCisJCQkJdmFyIHRhcmdldE9yaWVudGF0aW9uID0gKGRpclsxXSAmIChteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19FQVNUIHwgbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfV0VTVCkpID4gMCA/IDAKKwkJCQkJCTogMTsKKwkJCQl2YXIgc2FtZU9yaWVudCA9IHRhcmdldE9yaWVudGF0aW9uID09IGluaXRpYWxPcmllbnRhdGlvbiA/IDAgOiAxOworCisJCQkJLy8gKGN1cnJlbnRJbmRleCArIDEpICUgMiBpcyAwIGZvciBldmVuIG51bWJlciBvZiBwb2ludHMsCisJCQkJLy8gMSBmb3Igb2RkCisJCQkJaWYgKHNhbWVPcmllbnQgIT0gKGN1cnJlbnRJbmRleCArIDEpICUgMikKKwkJCQl7CisJCQkJCS8vIFRoZSBsYXN0IHBvaW50IGlzbid0IHJlcXVpcmVkCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCQorCQkJcmVzdWx0LnB1c2gobmV3IG14UG9pbnQoTWF0aC5yb3VuZChteEVkZ2VTdHlsZS53YXlQb2ludHMxW2ldWzBdKSwgTWF0aC5yb3VuZChteEVkZ2VTdHlsZS53YXlQb2ludHMxW2ldWzFdKSkpOworCQl9CisJCQorCQkvLyBSZW1vdmVzIGR1cGxpY2F0ZXMKKwkJdmFyIGluZGV4ID0gMTsKKwkJCisJCXdoaWxlIChpbmRleCA8IHJlc3VsdC5sZW5ndGgpCisJCXsKKwkJCWlmIChyZXN1bHRbaW5kZXggLSAxXSA9PSBudWxsIHx8IHJlc3VsdFtpbmRleF0gPT0gbnVsbCB8fAorCQkJCXJlc3VsdFtpbmRleCAtIDFdLnggIT0gcmVzdWx0W2luZGV4XS54IHx8CisJCQkJcmVzdWx0W2luZGV4IC0gMV0ueSAhPSByZXN1bHRbaW5kZXhdLnkpCisJCQl7CisJCQkJaW5kZXgrKzsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXN1bHQuc3BsaWNlKGluZGV4LCAxKTsKKwkJCX0KKwkJfQorCX0sCisJCisJZ2V0Um91dGVQYXR0ZXJuOiBmdW5jdGlvbihkaXIsIHF1YWQsIGR4LCBkeSkKKwl7CisJCXZhciBzb3VyY2VJbmRleCA9IGRpclswXSA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTUFTS19FQVNUID8gMworCQkJCTogZGlyWzBdOworCQl2YXIgdGFyZ2V0SW5kZXggPSBkaXJbMV0gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX01BU0tfRUFTVCA/IDMKKwkJCQk6IGRpclsxXTsKKworCQlzb3VyY2VJbmRleCAtPSBxdWFkOworCQl0YXJnZXRJbmRleCAtPSBxdWFkOworCisJCWlmIChzb3VyY2VJbmRleCA8IDEpCisJCXsKKwkJCXNvdXJjZUluZGV4ICs9IDQ7CisJCX0KKwkJaWYgKHRhcmdldEluZGV4IDwgMSkKKwkJeworCQkJdGFyZ2V0SW5kZXggKz0gNDsKKwkJfQorCisJCXZhciByZXN1bHQgPSByb3V0ZVBhdHRlcm5zW3NvdXJjZUluZGV4IC0gMV1bdGFyZ2V0SW5kZXggLSAxXTsKKworCQlpZiAoZHggPT0gMCB8fCBkeSA9PSAwKQorCQl7CisJCQlpZiAoaW5saW5lUm91dGVQYXR0ZXJuc1tzb3VyY2VJbmRleCAtIDFdW3RhcmdldEluZGV4IC0gMV0gIT0gbnVsbCkKKwkJCXsKKwkJCQlyZXN1bHQgPSBpbmxpbmVSb3V0ZVBhdHRlcm5zW3NvdXJjZUluZGV4IC0gMV1bdGFyZ2V0SW5kZXggLSAxXTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXN1bHQ7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214R3JhcGguanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teEdyYXBoLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMmFiODYKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teEdyYXBoLmpzCkBAIC0wLDAgKzEsMTI3NjggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14R3JhcGgKKyAqCisgKiBFeHRlbmRzIDxteEV2ZW50U291cmNlPiB0byBpbXBsZW1lbnQgYSBncmFwaCBjb21wb25lbnQgZm9yCisgKiB0aGUgYnJvd3Nlci4gVGhpcyBpcyB0aGUgbWFpbiBjbGFzcyBvZiB0aGUgcGFja2FnZS4gVG8gYWN0aXZhdGUKKyAqIHBhbm5pbmcgYW5kIGNvbm5lY3Rpb25zIHVzZSA8c2V0UGFubmluZz4gYW5kIDxzZXRDb25uZWN0YWJsZT4uCisgKiBGb3IgcnViYmVyYmFuZCBzZWxlY3Rpb24geW91IG11c3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mCisgKiA8bXhSdWJiZXJiYW5kPi4gVGhlIGZvbGxvd2luZyBsaXN0ZW5lcnMgYXJlIGFkZGVkIHRvCisgKiA8bW91c2VMaXN0ZW5lcnM+IGJ5IGRlZmF1bHQ6CisgKiAKKyAqIC0gPHRvb2x0aXBIYW5kbGVyPjogPG14VG9vbHRpcEhhbmRsZXI+IHRoYXQgZGlzcGxheXMgdG9vbHRpcHMKKyAqIC0gPHBhbm5pbmdIYW5kbGVyPjogPG14UGFubmluZ0hhbmRsZXI+IGZvciBwYW5uaW5nIGFuZCBwb3B1cCBtZW51cworICogLSA8Y29ubmVjdGlvbkhhbmRsZXI+OiA8bXhDb25uZWN0aW9uSGFuZGxlcj4gZm9yIGNyZWF0aW5nIGNvbm5lY3Rpb25zCisgKiAtIDxncmFwaEhhbmRsZXI+OiA8bXhHcmFwaEhhbmRsZXI+IGZvciBtb3ZpbmcgYW5kIGNsb25pbmcgY2VsbHMKKyAqIAorICogVGhlc2UgbGlzdGVuZXJzIHdpbGwgYmUgY2FsbGVkIGluIHRoZSBhYm92ZSBvcmRlciBpZiB0aGV5IGFyZSBlbmFibGVkLgorICoKKyAqIEJhY2tncm91bmQgSW1hZ2VzOgorICogCisgKiBUbyBkaXNwbGF5IGEgYmFja2dyb3VuZCBpbWFnZSwgc2V0IHRoZSBpbWFnZSwgaW1hZ2Ugd2lkdGggYW5kCisgKiBpbWFnZSBoZWlnaHQgdXNpbmcgPHNldEJhY2tncm91bmRJbWFnZT4uIElmIG9uZSBvZiB0aGUKKyAqIGFib3ZlIHZhbHVlcyBoYXMgY2hhbmdlZCB0aGVuIHRoZSA8dmlldz4ncyA8bXhHcmFwaFZpZXcudmFsaWRhdGU+CisgKiBzaG91bGQgYmUgaW52b2tlZC4KKyAqIAorICogQ2VsbCBJbWFnZXM6CisgKiAKKyAqIFRvIHVzZSBpbWFnZXMgaW4gY2VsbHMsIGEgc2hhcGUgbXVzdCBiZSBzcGVjaWZpZWQgaW4gdGhlIGRlZmF1bHQKKyAqIHZlcnRleCBzdHlsZSAob3IgYW55IG5hbWVkIHN0eWxlKS4gUG9zc2libGUgc2hhcGVzIGFyZQorICogPG14Q29uc3RhbnRzLlNIQVBFX0lNQUdFPiBhbmQgPG14Q29uc3RhbnRzLlNIQVBFX0xBQkVMPi4KKyAqIFRoZSBjb2RlIHRvIGNoYW5nZSB0aGUgc2hhcGUgdXNlZCBpbiB0aGUgZGVmYXVsdCB2ZXJ0ZXggc3R5bGUsCisgKiB0aGUgZm9sbG93aW5nIGNvZGUgaXMgdXNlZDoKKyAqIAorICogKGNvZGUpCisgKiB2YXIgc3R5bGUgPSBncmFwaC5nZXRTdHlsZXNoZWV0KCkuZ2V0RGVmYXVsdFZlcnRleFN0eWxlKCk7CisgKiBzdHlsZVtteENvbnN0YW50cy5TVFlMRV9TSEFQRV0gPSBteENvbnN0YW50cy5TSEFQRV9JTUFHRTsKKyAqIChlbmQpCisgKiAKKyAqIEZvciB0aGUgZGVmYXVsdCB2ZXJ0ZXggc3R5bGUsIHRoZSBpbWFnZSB0byBiZSBkaXNwbGF5ZWQgY2FuIGJlCisgKiBzcGVjaWZpZWQgaW4gYSBjZWxsJ3Mgc3R5bGUgdXNpbmcgdGhlIDxteENvbnN0YW50cy5TVFlMRV9JTUFHRT4KKyAqIGtleSBhbmQgdGhlIGltYWdlIFVSTCBhcyBhIHZhbHVlLCBmb3IgZXhhbXBsZToKKyAqIAorICogKGNvZGUpCisgKiBpbWFnZT1odHRwOi8vd3d3LmV4YW1wbGUuY29tL2ltYWdlLmdpZgorICogKGVuZCkKKyAqIAorICogRm9yIGEgbmFtZWQgc3R5bGUsIHRoZSB0aGUgc3R5bGVuYW1lIG11c3QgYmUgdGhlIGZpcnN0IGVsZW1lbnQKKyAqIG9mIHRoZSBjZWxsIHN0eWxlOgorICogCisgKiAoY29kZSkKKyAqIHN0eWxlbmFtZTtpbWFnZT1odHRwOi8vd3d3LmV4YW1wbGUuY29tL2ltYWdlLmdpZgorICogKGVuZCkKKyAqIAorICogQSBjZWxsIHN0eWxlIGNhbiBoYXZlIGFueSBudW1iZXIgb2Yga2V5PXZhbHVlIHBhaXJzIGFkZGVkLCBkaXZpZGVkCisgKiBieSBhIHNlbWljb2xvbiBhcyBmb2xsb3dzOgorICogCisgKiAoY29kZSkKKyAqIFtzdHlsZW5hbWU7fGtleT12YWx1ZTtdCisgKiAoZW5kKQorICoKKyAqIExhYmVsczoKKyAqIAorICogVGhlIGNlbGwgbGFiZWxzIGFyZSBkZWZpbmVkIGJ5IDxnZXRMYWJlbD4gd2hpY2ggdXNlcyA8Y29udmVydFZhbHVlVG9TdHJpbmc+CisgKiBpZiA8bGFiZWxzVmlzaWJsZT4gaXMgdHJ1ZS4gSWYgYSBsYWJlbCBtdXN0IGJlIHJlbmRlcmVkIGFzIEhUTUwgbWFya3VwLCB0aGVuCisgKiA8aXNIdG1sTGFiZWw+IHNob3VsZCByZXR1cm4gdHJ1ZSBmb3IgdGhlIHJlc3BlY3RpdmUgY2VsbC4gSWYgYWxsIGxhYmVscworICogY29udGFpbiBIVE1MIG1hcmt1cCwgPGh0bWxMYWJlbHM+IGNhbiBiZSBzZXQgdG8gdHJ1ZS4gTk9URTogRW5hYmxpbmcgSFRNTAorICogbGFiZWxzIGNhcnJpZXMgYSBwb3NzaWJsZSBzZWN1cml0eSByaXNrIChzZWUgdGhlIHNlY3Rpb24gb24gc2VjdXJpdHkgaW4KKyAqIHRoZSBtYW51YWwpLgorICogCisgKiBJZiB3cmFwcGluZyBpcyBuZWVkZWQgZm9yIGEgbGFiZWwsIHRoZW4gPGlzSHRtbExhYmVsPiBhbmQgPGlzV3JhcHBpbmc+IG11c3QKKyAqIHJldHVybiB0cnVlIGZvciB0aGUgY2VsbCB3aG9zZSBsYWJlbCBzaG91bGQgYmUgd3JhcHBlZC4gU2VlIDxpc1dyYXBwaW5nPiBmb3IKKyAqIGFuIGV4YW1wbGUuCisgKiAKKyAqIElmIGNsaXBwaW5nIGlzIG5lZWRlZCB0byBrZWVwIHRoZSByZW5kZXJpbmcgb2YgYSBIVE1MIGxhYmVsIGluc2lkZSB0aGUKKyAqIGJvdW5kcyBvZiBpdHMgdmVydGV4LCB0aGVuIDxpc0NsaXBwaW5nPiBzaG91bGQgcmV0dXJuIHRydWUgZm9yIHRoZQorICogcmVzcGVjdGl2ZSBjZWxsLgorICogCisgKiBCeSBkZWZhdWx0LCBlZGdlIGxhYmVscyBhcmUgbW92YWJsZSBhbmQgdmVydGV4IGxhYmVscyBhcmUgZml4ZWQuIFRoaXMgY2FuIGJlCisgKiBjaGFuZ2VkIGJ5IHNldHRpbmcgPGVkZ2VMYWJlbHNNb3ZhYmxlPiBhbmQgPHZlcnRleExhYmVsc01vdmFibGU+LCBvciBieQorICogb3ZlcnJpZGluZyA8aXNMYWJlbE1vdmFibGU+LgorICoKKyAqIEluLXBsYWNlIEVkaXRpbmc6CisgKiAKKyAqIEluLXBsYWNlIGVkaXRpbmcgaXMgc3RhcnRlZCB3aXRoIGEgZG91YmxlY2xpY2sgb3IgYnkgdHlwaW5nIEYyLgorICogUHJvZ3JhbW1hdGljYWxseSwgPGVkaXQ+IGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGNlbGwgaXMgZWRpdGFibGUKKyAqICg8aXNDZWxsRWRpdGFibGU+KSBhbmQgY2FsbCA8c3RhcnRFZGl0aW5nQXRDZWxsPiwgd2hpY2ggaW52b2tlcworICogPG14Q2VsbEVkaXRvci5zdGFydEVkaXRpbmc+LiBUaGUgZWRpdG9yIHVzZXMgdGhlIHZhbHVlIHJldHVybmVkCisgKiBieSA8Z2V0RWRpdGluZ1ZhbHVlPiBhcyB0aGUgZWRpdGluZyB2YWx1ZS4KKyAqIAorICogQWZ0ZXIgaW4tcGxhY2UgZWRpdGluZywgPGxhYmVsQ2hhbmdlZD4gaXMgY2FsbGVkLCB3aGljaCBpbnZva2VzCisgKiA8bXhHcmFwaE1vZGVsLnNldFZhbHVlPiwgd2hpY2ggaW4gdHVybiBjYWxscworICogPG14R3JhcGhNb2RlbC52YWx1ZUZvckNlbGxDaGFuZ2VkPiB2aWEgPG14VmFsdWVDaGFuZ2U+LgorICogCisgKiBUaGUgZXZlbnQgdGhhdCB0cmlnZ2VycyBpbi1wbGFjZSBlZGl0aW5nIGlzIHBhc3NlZCB0aHJvdWdoIHRvIHRoZQorICogPGNlbGxFZGl0b3I+LCB3aGljaCBtYXkgdGFrZSBzcGVjaWFsIGFjdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHRoZQorICogZXZlbnQgb3IgbW91c2UgbG9jYXRpb24sIGFuZCBpcyBhbHNvIHBhc3NlZCB0byA8Z2V0RWRpdGluZ1ZhbHVlPi4gVGhlIGV2ZW50CisgKiBpcyB0aGVuIHBhc3NlZCBiYWNrIHRvIHRoZSBldmVudCBwcm9jZXNzaW5nIGZ1bmN0aW9ucyB3aGljaCBjYW4gcGVyZm9ybQorICogc3BlY2lmaWMgYWN0aW9ucyBiYXNlZCBvbiB0aGUgdHJpZ2dlciBldmVudC4KKyAqIAorICogVG9vbHRpcHM6CisgKiAKKyAqIFRvb2x0aXBzIGFyZSBpbXBsZW1lbnRlZCBieSA8Z2V0VG9vbHRpcD4sIHdoaWNoIGNhbGxzIDxnZXRUb29sdGlwRm9yQ2VsbD4KKyAqIGlmIGEgY2VsbCBpcyB1bmRlciB0aGUgbW91c2Vwb2ludGVyLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjaGVja3MgaWYKKyAqIHRoZSBjZWxsIGhhcyBhIGdldFRvb2x0aXAgZnVuY3Rpb24gYW5kIGNhbGxzIGl0IGlmIGl0IGV4aXN0cy4gSGVuY2UsIGluIG9yZGVyCisgKiB0byBwcm92aWRlIGN1c3RvbSB0b29sdGlwcywgdGhlIGNlbGwgbXVzdCBwcm92aWRlIGEgZ2V0VG9vbHRpcCBmdW5jdGlvbiwgb3IgCisgKiBvbmUgb2YgdGhlIHR3byBhYm92ZSBmdW5jdGlvbnMgbXVzdCBiZSBvdmVycmlkZGVuLgorICogCisgKiBUeXBpY2FsbHksIGZvciBjdXN0b20gY2VsbCB0b29sdGlwcywgdGhlIGxhdHRlciBmdW5jdGlvbiBpcyBvdmVycmlkZGVuIGFzCisgKiBmb2xsb3dzOgorICogCisgKiAoY29kZSkKKyAqIGdyYXBoLmdldFRvb2x0aXBGb3JDZWxsID0gZnVuY3Rpb24oY2VsbCkKKyAqIHsKKyAqICAgdmFyIGxhYmVsID0gdGhpcy5jb252ZXJ0VmFsdWVUb1N0cmluZyhjZWxsKTsKKyAqICAgcmV0dXJuICdUb29sdGlwIGZvciAnK2xhYmVsOworICogfQorICogKGVuZCkKKyAqIAorICogV2hlbiB1c2luZyBhIGNvbmZpZyBmaWxlLCB0aGUgZnVuY3Rpb24gaXMgb3ZlcnJpZGRlbiBpbiB0aGUgbXhHcmFwaCBzZWN0aW9uCisgKiB1c2luZyB0aGUgZm9sbG93aW5nIGVudHJ5OgorICogCisgKiAoY29kZSkKKyAqIDxhZGQgYXM9ImdldFRvb2x0aXBGb3JDZWxsIj48IVtDREFUQVsKKyAqICAgZnVuY3Rpb24oY2VsbCkKKyAqICAgeworICogICAgIHZhciBsYWJlbCA9IHRoaXMuY29udmVydFZhbHVlVG9TdHJpbmcoY2VsbCk7CisgKiAgICAgcmV0dXJuICdUb29sdGlwIGZvciAnK2xhYmVsOworICogICB9CisgKiBdXT48L2FkZD4KKyAqIChlbmQpCisgKiAKKyAqICJ0aGlzIiByZWZlcnMgdG8gdGhlIGdyYXBoIGluIHRoZSBpbXBsZW1lbnRhdGlvbiwgc28gZm9yIGV4YW1wbGUgdG8gY2hlY2sgaWYgCisgKiBhIGNlbGwgaXMgYW4gZWRnZSwgeW91IHVzZSB0aGlzLmdldE1vZGVsKCkuaXNFZGdlKGNlbGwpCisgKgorICogRm9yIHJlcGxhY2luZyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiA8Z2V0VG9vbHRpcEZvckNlbGw+IChyYXRoZXIgdGhhbiAKKyAqIHJlcGxhY2luZyB0aGUgZnVuY3Rpb24gb24gYSBzcGVjaWZpYyBpbnN0YW5jZSksIHRoZSBmb2xsb3dpbmcgY29kZSBzaG91bGQgYmUgCisgKiB1c2VkIGFmdGVyIGxvYWRpbmcgdGhlIEphdmFTY3JpcHQgZmlsZXMsIGJ1dCBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgbXhHcmFwaCAKKyAqIGluc3RhbmNlIHVzaW5nIDxteEdyYXBoPjoKKyAqIAorICogKGNvZGUpCisgKiBteEdyYXBoLnByb3RvdHlwZS5nZXRUb29sdGlwRm9yQ2VsbCA9IGZ1bmN0aW9uKGNlbGwpCisgKiB7CisgKiAgIHZhciBsYWJlbCA9IHRoaXMuY29udmVydFZhbHVlVG9TdHJpbmcoY2VsbCk7CisgKiAgIHJldHVybiAnVG9vbHRpcCBmb3IgJytsYWJlbDsKKyAqIH0KKyAqIChlbmQpCisgKiAKKyAqIFNoYXBlcyAmIFN0eWxlczoKKyAqIAorICogVGhlIGltcGxlbWVudGF0aW9uIG9mIG5ldyBzaGFwZXMgaXMgZGVtb25zdHJhdGVkIGluIHRoZSBleGFtcGxlcy4gV2UnbGwgYXNzdW1lCisgKiB0aGF0IHdlIGhhdmUgaW1wbGVtZW50ZWQgYSBjdXN0b20gc2hhcGUgd2l0aCB0aGUgbmFtZSBCb3hTaGFwZSB3aGljaCB3ZSB3YW50CisgKiB0byB1c2UgZm9yIGRyYXdpbmcgdmVydGljZXMuIFRvIHVzZSB0aGlzIHNoYXBlLCBpdCBtdXN0IGZpcnN0IGJlIHJlZ2lzdGVyZWQgaW4KKyAqIHRoZSBjZWxsIHJlbmRlcmVyIGFzIGZvbGxvd3M6CisgKiAKKyAqIChjb2RlKQorICogbXhDZWxsUmVuZGVyZXIucmVnaXN0ZXJTaGFwZSgnYm94JywgQm94U2hhcGUpOworICogKGVuZCkKKyAqIAorICogVGhlIGNvZGUgcmVnaXN0ZXJzIHRoZSBCb3hTaGFwZSBjb25zdHJ1Y3RvciB1bmRlciB0aGUgbmFtZSBib3ggaW4gdGhlIGNlbGwKKyAqIHJlbmRlcmVyIG9mIHRoZSBncmFwaC4gVGhlIHNoYXBlIGNhbiBub3cgYmUgcmVmZXJlbmNlZCB1c2luZyB0aGUgc2hhcGUta2V5IGluCisgKiBhIHN0eWxlIGRlZmluaXRpb24uIChUaGUgY2VsbCByZW5kZXJlciBjb250YWlucyBhIHNldCBvZiBhZGRpdGlvbmFsIHNoYXBlcywKKyAqIG5hbWVseSBvbmUgZm9yIGVhY2ggY29uc3RhbnQgd2l0aCBhIFNIQVBFLXByZWZpeCBpbiA8bXhDb25zdGFudHM+LikKKyAqCisgKiBTdHlsZXMgYXJlIGEgY29sbGVjdGlvbiBvZiBrZXksIHZhbHVlIHBhaXJzIGFuZCBhIHN0eWxlc2hlZXQgaXMgYSBjb2xsZWN0aW9uCisgKiBvZiBuYW1lZCBzdHlsZXMuIFRoZSBuYW1lcyBhcmUgcmVmZXJlbmNlZCBieSB0aGUgY2VsbHN0eWxlLCB3aGljaCBpcyBzdG9yZWQKKyAqIGluIDxteENlbGwuc3R5bGU+IHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQ6IFtzdHlsZW5hbWU7fGtleT12YWx1ZTtdLiBUaGUKKyAqIHN0cmluZyBpcyByZXNvbHZlZCB0byBhIGNvbGxlY3Rpb24gb2Yga2V5LCB2YWx1ZSBwYWlycywgd2hlcmUgdGhlIGtleXMgYXJlCisgKiBvdmVycmlkZGVuIHdpdGggdGhlIHZhbHVlcyBpbiB0aGUgc3RyaW5nLgorICoKKyAqIFdoZW4gaW50cm9kdWNpbmcgYSBuZXcgc2hhcGUsIHRoZSBuYW1lIHVuZGVyIHdoaWNoIHRoZSBzaGFwZSBpcyByZWdpc3RlcmVkCisgKiBtdXN0IGJlIHVzZWQgaW4gdGhlIHN0eWxlc2hlZXQuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIG9mIGRvaW5nIHRoaXM6CisgKiAKKyAqICAgLSBCeSBjaGFuZ2luZyB0aGUgZGVmYXVsdCBzdHlsZSwgc28gdGhhdCBhbGwgdmVydGljZXMgd2lsbCB1c2UgdGhlIG5ldworICogCQlzaGFwZQorICogICAtIEJ5IGRlZmluaW5nIGEgbmV3IHN0eWxlLCBzbyB0aGF0IG9ubHkgdmVydGljZXMgd2l0aCB0aGUgcmVzcGVjdGl2ZQorICogCQljZWxsc3R5bGUgd2lsbCB1c2UgdGhlIG5ldyBzaGFwZQorICogICAtIEJ5IHVzaW5nIHNoYXBlPWJveCBpbiB0aGUgY2VsbHN0eWxlJ3Mgb3B0aW9uYWwgbGlzdCBvZiBrZXksIHZhbHVlIHBhaXJzCisgKiAJCXRvIGJlIG92ZXJyaWRkZW4KKyAqCisgKiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIGNvZGUgdG8gZmV0Y2ggYW5kIG1vZGlmeSB0aGUgZGVmYXVsdCBzdHlsZSBmb3IKKyAqIHZlcnRpY2VzIGlzIGFzIGZvbGxvd3M6CisgKiAKKyAqIChjb2RlKQorICogdmFyIHN0eWxlID0gZ3JhcGguZ2V0U3R5bGVzaGVldCgpLmdldERlZmF1bHRWZXJ0ZXhTdHlsZSgpOworICogc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU0hBUEVdID0gJ2JveCc7CisgKiAoZW5kKQorICogCisgKiBUaGUgY29kZSB0YWtlcyB0aGUgZGVmYXVsdCB2ZXJ0ZXggc3R5bGUsIHdoaWNoIGlzIHVzZWQgZm9yIGFsbCB2ZXJ0aWNlcyB0aGF0CisgKiBkbyBub3QgaGF2ZSBhIHNwZWNpZmljIGNlbGxzdHlsZSwgYW5kIG1vZGlmaWVzIHRoZSB2YWx1ZSBmb3IgdGhlIHNoYXBlLWtleQorICogaW4tcGxhY2UgdG8gdXNlIHRoZSBuZXcgQm94U2hhcGUgZm9yIGRyYXdpbmcgdmVydGljZXMuIFRoaXMgaXMgZG9uZSBieQorICogYXNzaWduaW5nIHRoZSBib3ggdmFsdWUgaW4gdGhlIHNlY29uZCBsaW5lLCB3aGljaCByZWZlcnMgdG8gdGhlIG5hbWUgb2YgdGhlCisgKiBCb3hTaGFwZSBpbiB0aGUgY2VsbCByZW5kZXJlci4KKyAqIAorICogSW4gdGhlIHNlY29uZCBjYXNlLCBhIGNvbGxlY3Rpb24gb2Yga2V5LCB2YWx1ZSBwYWlycyBpcyBjcmVhdGVkIGFuZCB0aGVuCisgKiBhZGRlZCB0byB0aGUgc3R5bGVzaGVldCB1bmRlciBhIG5ldyBuYW1lLiBJbiBvcmRlciB0byBkaXN0aW5ndWlzaCB0aGUKKyAqIHNoYXBlbmFtZSBhbmQgdGhlIHN0eWxlbmFtZSB3ZSdsbCB1c2UgYm94c3R5bGUgZm9yIHRoZSBzdHlsZW5hbWU6CisgKiAKKyAqIChjb2RlKQorICogdmFyIHN0eWxlID0gbmV3IE9iamVjdCgpOworICogc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU0hBUEVdID0gJ2JveCc7CisgKiBzdHlsZVtteENvbnN0YW50cy5TVFlMRV9TVFJPS0VDT0xPUl0gPSAnIzAwMDAwMCc7CisgKiBzdHlsZVtteENvbnN0YW50cy5TVFlMRV9GT05UQ09MT1JdID0gJyMwMDAwMDAnOworICogZ3JhcGguZ2V0U3R5bGVzaGVldCgpLnB1dENlbGxTdHlsZSgnYm94c3R5bGUnLCBzdHlsZSk7CisgKiAoZW5kKQorICogCisgKiBUaGUgY29kZSBhZGRzIGEgbmV3IHN0eWxlIHdpdGggdGhlIG5hbWUgYm94c3R5bGUgdG8gdGhlIHN0eWxlc2hlZXQuIFRvIHVzZQorICogdGhpcyBzdHlsZSB3aXRoIGEgY2VsbCwgaXQgbXVzdCBiZSByZWZlcmVuY2VkIGZyb20gdGhlIGNlbGxzdHlsZSBhcyBmb2xsb3dzOgorICogCisgKiAoY29kZSkKKyAqIHZhciB2ZXJ0ZXggPSBncmFwaC5pbnNlcnRWZXJ0ZXgocGFyZW50LCBudWxsLCAnSGVsbG8sIFdvcmxkIScsIDIwLCAyMCwgODAsIDIwLAorICogCQkJCSdib3hzdHlsZScpOworICogKGVuZCkKKyAqIAorICogVG8gc3VtbWFyaXplLCBlYWNoIG5ldyBzaGFwZSBtdXN0IGJlIHJlZ2lzdGVyZWQgaW4gdGhlIDxteENlbGxSZW5kZXJlcj4gd2l0aAorICogYSB1bmlxdWUgbmFtZS4gVGhhdCBuYW1lIGlzIHRoZW4gdXNlZCBhcyB0aGUgdmFsdWUgb2YgdGhlIHNoYXBlLWtleSBpbiBhCisgKiBkZWZhdWx0IG9yIGN1c3RvbSBzdHlsZS4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGN1c3RvbSBzaGFwZXMsIHRoZW4gdGhlcmUKKyAqIHNob3VsZCBiZSBhIHNlcGFyYXRlIHN0eWxlIGZvciBlYWNoIHNoYXBlLgorICogCisgKiBJbmhlcml0aW5nIFN0eWxlczoKKyAqIAorICogRm9yIGZpbGwtLCBzdHJva2UtLCBncmFkaWVudC0gYW5kIGluZGljYXRvckNvbG9ycyBzcGVjaWFsIGtleXdvcmRzIGNhbiBiZQorICogdXNlZC4gVGhlIGluaGVyaXQga2V5d29yZCBmb3Igb25lIG9mIHRoZXNlIGNvbG9ycyB3aWxsIGluaGVyaXQgdGhlIGNvbG9yCisgKiBmb3IgdGhlIHNhbWUga2V5IGZyb20gdGhlIHBhcmVudCBjZWxsLiBUaGUgc3dpbWxhbmUga2V5d29yZCBkb2VzIHRoZSBzYW1lLAorICogYnV0IGluaGVyaXRzIGZyb20gdGhlIG5lYXJlc3Qgc3dpbWxhbmUgaW4gdGhlIGFuY2VzdG9yIGhpZXJhcmNoeS4gRmluYWxseSwKKyAqIHRoZSBpbmRpY2F0ZWQga2V5d29yZCB3aWxsIHVzZSB0aGUgY29sb3Igb2YgdGhlIGluZGljYXRvciBhcyB0aGUgY29sb3IgZm9yCisgKiB0aGUgZ2l2ZW4ga2V5LgorICogCisgKiBTY3JvbGxiYXJzOgorICogCisgKiBUaGUgPGNvbnRhaW5lcnM+IG92ZXJmbG93IENTUyBwcm9wZXJ0eSBkZWZpbmVzIGlmIHNjcm9sbGJhcnMgYXJlIHVzZWQgdG8KKyAqIGRpc3BsYXkgdGhlIGdyYXBoLiBGb3IgdmFsdWVzIG9mICdhdXRvJyBvciAnc2Nyb2xsJywgdGhlIHNjcm9sbGJhcnMgd2lsbAorICogYmUgc2hvd24uIE5vdGUgdGhhdCB0aGUgPHJlc2l6ZUNvbnRhaW5lcj4gZmxhZyBpcyBub3JtYWxseSBub3QgdXNlZAorICogdG9nZXRoZXIgd2l0aCBzY3JvbGxiYXJzLCBhcyBpdCB3aWxsIHJlc2l6ZSB0aGUgY29udGFpbmVyIHRvIG1hdGNoIHRoZQorICogc2l6ZSBvZiB0aGUgZ3JhcGggYWZ0ZXIgZWFjaCBjaGFuZ2UuCisgKiAKKyAqIE11bHRpcGxpY2l0aWVzIGFuZCBWYWxpZGF0aW9uOgorICogCisgKiBUbyBjb250cm9sIHRoZSBwb3NzaWJsZSBjb25uZWN0aW9ucyBpbiBteEdyYXBoLCA8Z2V0RWRnZVZhbGlkYXRpb25FcnJvcj4gaXMKKyAqIHVzZWQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBmdW5jdGlvbiB1c2VzIDxtdWx0aXBsaWNpdGllcz4sCisgKiB3aGljaCBpcyBhbiBhcnJheSBvZiA8bXhNdWx0aXBsaWNpdHk+LiBVc2luZyB0aGlzIGNsYXNzIGFsbG93cyB0byBlc3RhYmxpc2gKKyAqIHNpbXBsZSBtdWx0aXBsaWNpdGllcywgd2hpY2ggYXJlIGVuZm9yY2VkIGJ5IHRoZSBncmFwaC4KKyAqIAorICogVGhlIDxteE11bHRpcGxpY2l0eT4gdXNlcyA8bXhDZWxsLmlzPiB0byBkZXRlcm1pbmUgZm9yIHdoaWNoIHRlcm1pbmFscyBpdAorICogYXBwbGllcy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgPG14Q2VsbC5pcz4gd29ya3Mgd2l0aCBET00gbm9kZXMgKFhNTAorICogbm9kZXMpIGFuZCBjaGVja3MgaWYgdGhlIGdpdmVuIHR5cGUgcGFyYW1ldGVyIG1hdGNoZXMgdGhlIG5vZGVOYW1lIG9mIHRoZQorICogbm9kZSAoY2FzZSBpbnNlbnNpdGl2ZSkuIE9wdGlvbmFsbHksIGFuIGF0dHJpYnV0ZW5hbWUgYW5kIHZhbHVlIGNhbiBiZQorICogc3BlY2lmaWVkIHdoaWNoIGFyZSBhbHNvIGNoZWNrZWQuCisgKiAKKyAqIDxnZXRFZGdlVmFsaWRhdGlvbkVycm9yPiBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbm5lY3Rpdml0eSBvZiBhbiBlZGdlCisgKiBjaGFuZ2VzLiBJdCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvciBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZSBlZGdlIGlzCisgKiBpbnZhbGlkIG9yIG51bGwgaWYgdGhlIGVkZ2UgaXMgdmFsaWQuIElmIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgbm90IGVtcHR5CisgKiB0aGVuIGl0IGlzIGRpc3BsYXllZCBhcyBhbiBlcnJvciBtZXNzYWdlLgorICogCisgKiA8bXhNdWx0aXBsaWNpdHk+IGFsbG93cyB0byBzcGVjaWZ5IHRoZSBtdWx0aXBsaWNpdHkgYmV0d2VlbiBhIHRlcm1pbmFsIGFuZAorICogaXRzIHBvc3NpYmxlIG5laWdoYm9ycy4gRm9yIGV4YW1wbGUsIGlmIGFueSByZWN0YW5nbGUgbWF5IG9ubHkgYmUgY29ubmVjdGVkCisgKiB0bywgc2F5LCBhIG1heGltdW0gb2YgdHdvIGNpcmNsZXMgeW91IGNhbiBhZGQgdGhlIGZvbGxvd2luZyBydWxlIHRvCisgKiA8bXVsdGlwbGljaXRpZXM+OgorICogCisgKiAoY29kZSkKKyAqIGdyYXBoLm11bHRpcGxpY2l0aWVzLnB1c2gobmV3IG14TXVsdGlwbGljaXR5KAorICogICB0cnVlLCAncmVjdGFuZ2xlJywgbnVsbCwgbnVsbCwgMCwgMiwgWydjaXJjbGUnXSwKKyAqICAgJ09ubHkgMiB0YXJnZXRzIGFsbG93ZWQnLAorICogICAnT25seSBzaGFwZSB0YXJnZXRzIGFsbG93ZWQnKSk7CisgKiAoZW5kKQorICogCisgKiBUaGlzIHdpbGwgZGlzcGxheSB0aGUgZmlyc3QgZXJyb3IgbWVzc2FnZSB3aGVuZXZlciBhIHJlY3RhbmdsZSBpcyBjb25uZWN0ZWQKKyAqIHRvIG1vcmUgdGhhbiB0d28gY2lyY2xlcyBhbmQgdGhlIHNlY29uZCBlcnJvciBtZXNzYWdlIGlmIGEgcmVjdGFuZ2xlIGlzCisgKiBjb25uZWN0ZWQgdG8gYW55dGhpbmcgYnV0IGEgY2lyY2xlLgorICogCisgKiBGb3IgY2VydGFpbiBtdWx0aXBsaWNpdGllcywgc3VjaCBhcyBhIG1pbmltdW0gb2YgMSBjb25uZWN0aW9uLCB3aGljaCBjYW5ub3QKKyAqIGJlIGVuZm9yY2VkIGF0IGNlbGwgY3JlYXRpb24gdGltZSAodW5sZXNzIHRoZSBjZWxsIGlzIGNyZWF0ZWQgdG9nZXRoZXIgd2l0aAorICogdGhlIGNvbm5lY3Rpb24pLCBteEdyYXBoIG9mZmVycyA8dmFsaWRhdGU+IHdoaWNoIGNoZWNrcyBhbGwgbXVsdGlwbGljaXRpZXMKKyAqIGZvciBhbGwgY2VsbHMgYW5kIGRpc3BsYXlzIHRoZSByZXNwZWN0aXZlIGVycm9yIG1lc3NhZ2VzIGluIGFuIG92ZXJsYXkgaWNvbgorICogb24gdGhlIGNlbGxzLgorICogCisgKiBJZiBhIGNlbGwgaXMgY29sbGFwc2VkIGFuZCBjb250YWlucyB2YWxpZGF0aW9uIGVycm9ycywgYSByZXNwZWN0aXZlIHdhcm5pbmcKKyAqIGljb24gaXMgYXR0YWNoZWQgdG8gdGhlIGNvbGxhcHNlZCBjZWxsLgorICogCisgKiBBdXRvLUxheW91dDoKKyAqIAorICogRm9yIGF1dG9tYXRpYyBsYXlvdXQsIHRoZSA8Z2V0TGF5b3V0PiBob29rIGlzIHByb3ZpZGVkIGluIDxteExheW91dE1hbmFnZXI+LgorICogSXQgY2FuIGJlIG92ZXJyaWRkZW4gdG8gcmV0dXJuIGEgbGF5b3V0IGFsZ29yaXRobSBmb3IgdGhlIGNoaWxkcmVuIG9mIGEKKyAqIGdpdmVuIGNlbGwuCisgKiAKKyAqIFVuY29ubmVjdGVkIGVkZ2VzOgorICogCisgKiBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBzd2l0Y2hlcyBhcmUgZGVzaWduZWQgdG8gbWVldCB0aGUgcmVxdWlyZW1lbnRzIG9mCisgKiBnZW5lcmFsIGRpYWdyYW0gZHJhd2luZyBhcHBsaWNhdGlvbnMuIEEgdmVyeSB0eXBpY2FsIHNldCBvZiBzZXR0aW5ncyB0bworICogYXZvaWQgZWRnZXMgdGhhdCBhcmUgbm90IGNvbm5lY3RlZCBpcyB0aGUgZm9sbG93aW5nOgorICogCisgKiAoY29kZSkKKyAqIGdyYXBoLnNldEFsbG93RGFuZ2xpbmdFZGdlcyhmYWxzZSk7CisgKiBncmFwaC5zZXREaXNjb25uZWN0T25Nb3ZlKGZhbHNlKTsKKyAqIChlbmQpCisgKiAKKyAqIFNldHRpbmcgdGhlIDxjbG9uZUludmFsaWRFZGdlcz4gc3dpdGNoIHRvIHRydWUgaXMgb3B0aW9uYWwuIFRoaXMgc3dpdGNoCisgKiBjb250cm9scyBpZiBlZGdlcyBhcmUgaW5zZXJ0ZWQgYWZ0ZXIgYSBjb3B5LCBwYXN0ZSBvciBjbG9uZS1kcmFnIGlmIHRoZXkgYXJlCisgKiBpbnZhbGlkLiBGb3IgZXhhbXBsZSwgZWRnZXMgYXJlIGludmFsaWQgaWYgY29waWVkIG9yIGNvbnRyb2wtZHJhZ2dlZCB3aXRob3V0IAorICogaGF2aW5nIHNlbGVjdGVkIHRoZSBjb3JyZXNwb25kaW5nIHRlcm1pbmFscyBhbmQgYWxsb3dEYW5nbGluZ0VkZ2VzIGlzCisgKiBmYWxzZSwgaW4gd2hpY2ggY2FzZSB0aGUgZWRnZXMgd2lsbCBub3QgYmUgY2xvbmVkIGlmIHRoZSBzd2l0Y2ggaXMgZmFsc2UuCisgKiAKKyAqIE91dHB1dDoKKyAqIAorICogVG8gcHJvZHVjZSBhbiBYTUwgcmVwcmVzZW50YXRpb24gZm9yIGEgZGlhZ3JhbSwgdGhlIGZvbGxvd2luZyBjb2RlIGNhbiBiZQorICogdXNlZC4KKyAqIAorICogKGNvZGUpCisgKiB2YXIgZW5jID0gbmV3IG14Q29kZWMobXhVdGlscy5jcmVhdGVYbWxEb2N1bWVudCgpKTsKKyAqIHZhciBub2RlID0gZW5jLmVuY29kZShncmFwaC5nZXRNb2RlbCgpKTsKKyAqIChlbmQpCisgKiAKKyAqIFRoaXMgd2lsbCBwcm9kdWNlIGFuIFhNTCBub2RlIHRoYW4gY2FuIGJlIGhhbmRsZWQgdXNpbmcgdGhlIERPTSBBUEkgb3IKKyAqIHR1cm5lZCBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29kZToKKyAqIAorICogKGNvZGUpCisgKiB2YXIgeG1sID0gbXhVdGlscy5nZXRYbWwobm9kZSk7CisgKiAoZW5kKQorICogCisgKiBUbyBvYnRhaW4gYSBmb3JtYXR0ZWQgc3RyaW5nLCBteFV0aWxzLmdldFByZXR0eVhtbCBjYW4gYmUgdXNlZCBpbnN0ZWFkLgorICogCisgKiBUaGlzIHN0cmluZyBjYW4gbm93IGJlIHN0b3JlZCBpbiBhIGxvY2FsIHBlcnNpc3RlbnQgc3RvcmFnZSAoZm9yIGV4YW1wbGUKKyAqIHVzaW5nIEdvb2dsZSBHZWFycykgb3IgaXQgY2FuIGJlIHBhc3NlZCB0byBhIGJhY2tlbmQgdXNpbmcgbXhVdGlscy5wb3N0IGFzCisgKiBmb2xsb3dzLiBUaGUgdXJsIHZhcmlhYmxlIGlzIHRoZSBVUkwgb2YgdGhlIEphdmEgc2VydmxldCwgUEhQIHBhZ2Ugb3IgSFRUUAorICogaGFuZGxlciwgZGVwZW5kaW5nIG9uIHRoZSBzZXJ2ZXIuCisgKiAKKyAqIChjb2RlKQorICogdmFyIHhtbFN0cmluZyA9IGVuY29kZVVSSUNvbXBvbmVudChteFV0aWxzLmdldFhtbChub2RlKSk7CisgKiBteFV0aWxzLnBvc3QodXJsLCAneG1sPScreG1sU3RyaW5nLCBmdW5jdGlvbihyZXEpCisgKiB7CisgKiAgIC8vIFByb2Nlc3Mgc2VydmVyIHJlc3BvbnNlIHVzaW5nIHJlcSBvZiB0eXBlIG14WG1sUmVxdWVzdAorICogfSk7CisgKiAoZW5kKQorICogCisgKiBJbnB1dDoKKyAqIAorICogVG8gbG9hZCBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBkaWFncmFtIGludG8gYW4gZXhpc3RpbmcgZ3JhcGggb2JqZWN0CisgKiBteFV0aWxzLmxvYWQgY2FuIGJlIHVzZWQgYXMgZm9sbG93cy4gVGhlIHVybCB2YXJpYWJsZSBpcyB0aGUgVVJMIG9mIHRoZSBKYXZhCisgKiBzZXJ2bGV0LCBQSFAgcGFnZSBvciBIVFRQIGhhbmRsZXIgdGhhdCBwcm9kdWNlcyB0aGUgWE1MIHN0cmluZy4KKyAqIAorICogKGNvZGUpCisgKiB2YXIgeG1sRG9jID0gbXhVdGlscy5sb2FkKHVybCkuZ2V0WG1sKCk7CisgKiB2YXIgbm9kZSA9IHhtbERvYy5kb2N1bWVudEVsZW1lbnQ7CisgKiB2YXIgZGVjID0gbmV3IG14Q29kZWMobm9kZS5vd25lckRvY3VtZW50KTsKKyAqIGRlYy5kZWNvZGUobm9kZSwgZ3JhcGguZ2V0TW9kZWwoKSk7CisgKiAoZW5kKQorICogCisgKiBGb3IgY3JlYXRpbmcgYSBwYWdlIHRoYXQgbG9hZHMgdGhlIGNsaWVudCBhbmQgYSBkaWFncmFtIHVzaW5nIGEgc2luZ2xlCisgKiByZXF1ZXN0IHBsZWFzZSByZWZlciB0byB0aGUgZGVwbG95bWVudCBleGFtcGxlcyBpbiB0aGUgYmFja2VuZHMuCisgKiAKKyAqIEZ1bmN0aW9uYWwgZGVwZW5kZW5jaWVzOgorICogCisgKiAoc2VlIGltYWdlcy9jYWxsZ3JhcGgucG5nKQorICogCisgKiBSZXNvdXJjZXM6CisgKgorICogcmVzb3VyY2VzL2dyYXBoIC0gTGFuZ3VhZ2UgcmVzb3VyY2VzIGZvciBteEdyYXBoCisgKgorICogR3JvdXA6IEV2ZW50cworICogCisgKiBFdmVudDogbXhFdmVudC5ST09UCisgKiAKKyAqIEZpcmVzIGlmIHRoZSByb290IGluIHRoZSBtb2RlbCBoYXMgY2hhbmdlZC4gVGhpcyBldmVudCBoYXMgbm8gcHJvcGVydGllcy4KKyAqIAorICogRXZlbnQ6IG14RXZlbnQuQUxJR05fQ0VMTFMKKyAqIAorICogRmlyZXMgYmV0d2VlbiBiZWdpbi0gYW5kIGVuZFVwZGF0ZSBpbiA8YWxpZ25DZWxscz4uIFRoZSA8Y29kZT5jZWxsczwvY29kZT4KKyAqIGFuZCA8Y29kZT5hbGlnbjwvY29kZT4gcHJvcGVydGllcyBjb250YWluIHRoZSByZXNwZWN0aXZlIGFyZ3VtZW50cyB0aGF0IHdlcmUKKyAqIHBhc3NlZCB0byA8YWxpZ25DZWxscz4uCisgKgorICogRXZlbnQ6IG14RXZlbnQuRkxJUF9FREdFCisgKgorICogRmlyZXMgYmV0d2VlbiBiZWdpbi0gYW5kIGVuZFVwZGF0ZSBpbiA8ZmxpcEVkZ2U+LiBUaGUgPGNvZGU+ZWRnZTwvY29kZT4KKyAqIHByb3BlcnR5IGNvbnRhaW5zIHRoZSBlZGdlIHBhc3NlZCB0byA8ZmxpcEVkZ2U+LgorICogCisgKiBFdmVudDogbXhFdmVudC5PUkRFUl9DRUxMUworICogCisgKiBGaXJlcyBiZXR3ZWVuIGJlZ2luLSBhbmQgZW5kVXBkYXRlIGluIDxvcmRlckNlbGxzPi4gVGhlIDxjb2RlPmNlbGxzPC9jb2RlPgorICogYW5kIDxjb2RlPmJhY2s8L2NvZGU+IHByb3BlcnRpZXMgY29udGFpbiB0aGUgcmVzcGVjdGl2ZSBhcmd1bWVudHMgdGhhdCB3ZXJlCisgKiBwYXNzZWQgdG8gPG9yZGVyQ2VsbHM+LgorICoKKyAqIEV2ZW50OiBteEV2ZW50LkNFTExTX09SREVSRUQKKyAqCisgKiBGaXJlcyBiZXR3ZWVuIGJlZ2luLSBhbmQgZW5kVXBkYXRlIGluIDxjZWxsc09yZGVyZWQ+LiBUaGUgPGNvZGU+Y2VsbHM8L2NvZGU+CisgKiBhbmQgPGNvZGU+YmFjazwvY29kZT4gYXJndW1lbnRzIGNvbnRhaW4gdGhlIHJlc3BlY3RpdmUgYXJndW1lbnRzIHRoYXQgd2VyZQorICogcGFzc2VkIHRvIDxjZWxsc09yZGVyZWQ+LgorICogCisgKiBFdmVudDogbXhFdmVudC5HUk9VUF9DRUxMUworICogCisgKiBGaXJlcyBiZXR3ZWVuIGJlZ2luLSBhbmQgZW5kVXBkYXRlIGluIDxncm91cENlbGxzPi4gVGhlIDxjb2RlPmdyb3VwPC9jb2RlPiwKKyAqIDxjb2RlPmNlbGxzPC9jb2RlPiBhbmQgPGNvZGU+Ym9yZGVyPC9jb2RlPiBhcmd1bWVudHMgY29udGFpbiB0aGUgcmVzcGVjdGl2ZQorICogYXJndW1lbnRzIHRoYXQgd2VyZSBwYXNzZWQgdG8gPGdyb3VwQ2VsbHM+LgorICogCisgKiBFdmVudDogbXhFdmVudC5VTkdST1VQX0NFTExTCisgKiAKKyAqIEZpcmVzIGJldHdlZW4gYmVnaW4tIGFuZCBlbmRVcGRhdGUgaW4gPHVuZ3JvdXBDZWxscz4uIFRoZSA8Y29kZT5jZWxsczwvY29kZT4KKyAqIHByb3BlcnR5IGNvbnRhaW5zIHRoZSBhcnJheSBvZiBjZWxscyB0aGF0IHdhcyBwYXNzZWQgdG8gPHVuZ3JvdXBDZWxscz4uCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LlJFTU9WRV9DRUxMU19GUk9NX1BBUkVOVAorICogCisgKiBGaXJlcyBiZXR3ZWVuIGJlZ2luLSBhbmQgZW5kVXBkYXRlIGluIDxyZW1vdmVDZWxsc0Zyb21QYXJlbnQ+LiBUaGUKKyAqIDxjb2RlPmNlbGxzPC9jb2RlPiBwcm9wZXJ0eSBjb250YWlucyB0aGUgYXJyYXkgb2YgY2VsbHMgdGhhdCB3YXMgcGFzc2VkIHRvCisgKiA8cmVtb3ZlQ2VsbHNGcm9tUGFyZW50Pi4KKyAqIAorICogRXZlbnQ6IG14RXZlbnQuQUREX0NFTExTCisgKiAKKyAqIEZpcmVzIGJldHdlZW4gYmVnaW4tIGFuZCBlbmRVcGRhdGUgaW4gPGFkZENlbGxzPi4gVGhlIDxjb2RlPmNlbGxzPC9jb2RlPiwKKyAqIDxjb2RlPnBhcmVudDwvY29kZT4sIDxjb2RlPmluZGV4PC9jb2RlPiwgPGNvZGU+c291cmNlPC9jb2RlPiBhbmQKKyAqIDxjb2RlPnRhcmdldDwvY29kZT4gcHJvcGVydGllcyBjb250YWluIHRoZSByZXNwZWN0aXZlIGFyZ3VtZW50cyB0aGF0IHdlcmUKKyAqIHBhc3NlZCB0byA8YWRkQ2VsbHM+LgorICogCisgKiBFdmVudDogbXhFdmVudC5DRUxMU19BRERFRAorICogCisgKiBGaXJlcyBiZXR3ZWVuIGJlZ2luLSBhbmQgZW5kVXBkYXRlIGluIDxjZWxsc0FkZGVkPi4gVGhlIDxjb2RlPmNlbGxzPC9jb2RlPiwKKyAqIDxjb2RlPnBhcmVudDwvY29kZT4sIDxjb2RlPmluZGV4PC9jb2RlPiwgPGNvZGU+c291cmNlPC9jb2RlPiwKKyAqIDxjb2RlPnRhcmdldDwvY29kZT4gYW5kIDxjb2RlPmFic29sdXRlPC9jb2RlPiBwcm9wZXJ0aWVzIGNvbnRhaW4gdGhlCisgKiByZXNwZWN0aXZlIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIHRvIDxjZWxsc0FkZGVkPi4KKyAqIAorICogRXZlbnQ6IG14RXZlbnQuUkVNT1ZFX0NFTExTCisgKiAKKyAqIEZpcmVzIGJldHdlZW4gYmVnaW4tIGFuZCBlbmRVcGRhdGUgaW4gPHJlbW92ZUNlbGxzPi4gVGhlIDxjb2RlPmNlbGxzPC9jb2RlPgorICogYW5kIDxjb2RlPmluY2x1ZGVFZGdlczwvY29kZT4gYXJndW1lbnRzIGNvbnRhaW4gdGhlIHJlc3BlY3RpdmUgYXJndW1lbnRzCisgKiB0aGF0IHdlcmUgcGFzc2VkIHRvIDxyZW1vdmVDZWxscz4uCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LkNFTExTX1JFTU9WRUQKKyAqIAorICogRmlyZXMgYmV0d2VlbiBiZWdpbi0gYW5kIGVuZFVwZGF0ZSBpbiA8Y2VsbHNSZW1vdmVkPi4gVGhlIDxjb2RlPmNlbGxzPC9jb2RlPgorICogYXJndW1lbnQgY29udGFpbnMgdGhlIGFycmF5IG9mIGNlbGxzIHRoYXQgd2FzIHJlbW92ZWQuCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LlNQTElUX0VER0UKKyAqIAorICogRmlyZXMgYmV0d2VlbiBiZWdpbi0gYW5kIGVuZFVwZGF0ZSBpbiA8c3BsaXRFZGdlPi4gVGhlIDxjb2RlPmVkZ2U8L2NvZGU+CisgKiBwcm9wZXJ0eSBjb250YWlucyB0aGUgZWRnZSB0byBiZSBzcGxpdHRlZCwgdGhlIDxjb2RlPmNlbGxzPC9jb2RlPiwKKyAqIDxjb2RlPm5ld0VkZ2U8L2NvZGU+LCA8Y29kZT5keDwvY29kZT4gYW5kIDxjb2RlPmR5PC9jb2RlPiBwcm9wZXJ0aWVzIGNvbnRhaW4KKyAqIHRoZSByZXNwZWN0aXZlIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIHRvIDxzcGxpdEVkZ2U+LgorICogCisgKiBFdmVudDogbXhFdmVudC5UT0dHTEVfQ0VMTFMKKyAqIAorICogRmlyZXMgYmV0d2VlbiBiZWdpbi0gYW5kIGVuZFVwZGF0ZSBpbiA8dG9nZ2xlQ2VsbHM+LiBUaGUgPGNvZGU+c2hvdzwvY29kZT4sCisgKiA8Y29kZT5jZWxsczwvY29kZT4gYW5kIDxjb2RlPmluY2x1ZGVFZGdlczwvY29kZT4gcHJvcGVydGllcyBjb250YWluIHRoZQorICogcmVzcGVjdGl2ZSBhcmd1bWVudHMgdGhhdCB3ZXJlIHBhc3NlZCB0byA8dG9nZ2xlQ2VsbHM+LgorICogCisgKiBFdmVudDogbXhFdmVudC5GT0xEX0NFTExTCisgKiAKKyAqIEZpcmVzIGJldHdlZW4gYmVnaW4tIGFuZCBlbmRVcGRhdGUgaW4gPGZvbGRDZWxscz4uIFRoZQorICogPGNvZGU+Y29sbGFwc2U8L2NvZGU+LCA8Y29kZT5jZWxsczwvY29kZT4gYW5kIDxjb2RlPnJlY3Vyc2U8L2NvZGU+CisgKiBwcm9wZXJ0aWVzIGNvbnRhaW4gdGhlIHJlc3BlY3RpdmUgYXJndW1lbnRzIHRoYXQgd2VyZSBwYXNzZWQgdG8gPGZvbGRDZWxscz4uCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LkNFTExTX0ZPTERFRAorICogCisgKiBGaXJlcyBiZXR3ZWVuIGJlZ2luLSBhbmQgZW5kVXBkYXRlIGluIGNlbGxzRm9sZGVkLiBUaGUKKyAqIDxjb2RlPmNvbGxhcHNlPC9jb2RlPiwgPGNvZGU+Y2VsbHM8L2NvZGU+IGFuZCA8Y29kZT5yZWN1cnNlPC9jb2RlPgorICogcHJvcGVydGllcyBjb250YWluIHRoZSByZXNwZWN0aXZlIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIHRvCisgKiA8Y2VsbHNGb2xkZWQ+LgorICogCisgKiBFdmVudDogbXhFdmVudC5VUERBVEVfQ0VMTF9TSVpFCisgKiAKKyAqIEZpcmVzIGJldHdlZW4gYmVnaW4tIGFuZCBlbmRVcGRhdGUgaW4gPHVwZGF0ZUNlbGxTaXplPi4gVGhlCisgKiA8Y29kZT5jZWxsPC9jb2RlPiBhbmQgPGNvZGU+aWdub3JlQ2hpbGRyZW48L2NvZGU+IHByb3BlcnRpZXMgY29udGFpbiB0aGUKKyAqIHJlc3BlY3RpdmUgYXJndW1lbnRzIHRoYXQgd2VyZSBwYXNzZWQgdG8gPHVwZGF0ZUNlbGxTaXplPi4KKyAqIAorICogRXZlbnQ6IG14RXZlbnQuUkVTSVpFX0NFTExTCisgKiAKKyAqIEZpcmVzIGJldHdlZW4gYmVnaW4tIGFuZCBlbmRVcGRhdGUgaW4gPHJlc2l6ZUNlbGxzPi4gVGhlIDxjb2RlPmNlbGxzPC9jb2RlPgorICogYW5kIDxjb2RlPmJvdW5kczwvY29kZT4gcHJvcGVydGllcyBjb250YWluIHRoZSByZXNwZWN0aXZlIGFyZ3VtZW50cyB0aGF0CisgKiB3ZXJlIHBhc3NlZCB0byA8cmVzaXplQ2VsbHM+LgorICogCisgKiBFdmVudDogbXhFdmVudC5DRUxMU19SRVNJWkVECisgKiAKKyAqIEZpcmVzIGJldHdlZW4gYmVnaW4tIGFuZCBlbmRVcGRhdGUgaW4gPGNlbGxzUmVzaXplZD4uIFRoZSA8Y29kZT5jZWxsczwvY29kZT4KKyAqIGFuZCA8Y29kZT5ib3VuZHM8L2NvZGU+IHByb3BlcnRpZXMgY29udGFpbiB0aGUgcmVzcGVjdGl2ZSBhcmd1bWVudHMgdGhhdAorICogd2VyZSBwYXNzZWQgdG8gPGNlbGxzUmVzaXplZD4uCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50Lk1PVkVfQ0VMTFMKKyAqIAorICogRmlyZXMgYmV0d2VlbiBiZWdpbi0gYW5kIGVuZFVwZGF0ZSBpbiA8bW92ZUNlbGxzPi4gVGhlIDxjb2RlPmNlbGxzPC9jb2RlPiwKKyAqIDxjb2RlPmR4PC9jb2RlPiwgPGNvZGU+ZHk8L2NvZGU+LCA8Y29kZT5jbG9uZTwvY29kZT4sIDxjb2RlPnRhcmdldDwvY29kZT4KKyAqIGFuZCA8Y29kZT5ldmVudDwvY29kZT4gcHJvcGVydGllcyBjb250YWluIHRoZSByZXNwZWN0aXZlIGFyZ3VtZW50cyB0aGF0CisgKiB3ZXJlIHBhc3NlZCB0byA8bW92ZUNlbGxzPi4KKyAqIAorICogRXZlbnQ6IG14RXZlbnQuQ0VMTFNfTU9WRUQKKyAqIAorICogRmlyZXMgYmV0d2VlbiBiZWdpbi0gYW5kIGVuZFVwZGF0ZSBpbiA8Y2VsbHNNb3ZlZD4uIFRoZSA8Y29kZT5jZWxsczwvY29kZT4sCisgKiA8Y29kZT5keDwvY29kZT4sIDxjb2RlPmR5PC9jb2RlPiBhbmQgPGNvZGU+ZGlzY29ubmVjdDwvY29kZT4gcHJvcGVydGllcworICogY29udGFpbiB0aGUgcmVzcGVjdGl2ZSBhcmd1bWVudHMgdGhhdCB3ZXJlIHBhc3NlZCB0byA8Y2VsbHNNb3ZlZD4uCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LkNPTk5FQ1RfQ0VMTAorICogCisgKiBGaXJlcyBiZXR3ZWVuIGJlZ2luLSBhbmQgZW5kVXBkYXRlIGluIDxjb25uZWN0Q2VsbD4uIFRoZSA8Y29kZT5lZGdlPC9jb2RlPiwKKyAqIDxjb2RlPnRlcm1pbmFsPC9jb2RlPiBhbmQgPGNvZGU+c291cmNlPC9jb2RlPiBwcm9wZXJ0aWVzIGNvbnRhaW4gdGhlCisgKiByZXNwZWN0aXZlIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIHRvIDxjb25uZWN0Q2VsbD4uCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LkNFTExfQ09OTkVDVEVECisgKiAKKyAqIEZpcmVzIGJldHdlZW4gYmVnaW4tIGFuZCBlbmRVcGRhdGUgaW4gPGNlbGxDb25uZWN0ZWQ+LiBUaGUKKyAqIDxjb2RlPmVkZ2U8L2NvZGU+LCA8Y29kZT50ZXJtaW5hbDwvY29kZT4gYW5kIDxjb2RlPnNvdXJjZTwvY29kZT4gcHJvcGVydGllcworICogY29udGFpbiB0aGUgcmVzcGVjdGl2ZSBhcmd1bWVudHMgdGhhdCB3ZXJlIHBhc3NlZCB0byA8Y2VsbENvbm5lY3RlZD4uCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LlJFRlJFU0gKKyAqIAorICogRmlyZXMgYWZ0ZXIgPHJlZnJlc2g+IHdhcyBleGVjdXRlZC4gVGhpcyBldmVudCBoYXMgbm8gcHJvcGVydGllcy4KKyAqCisgKiBFdmVudDogbXhFdmVudC5DTElDSworICogCisgKiBGaXJlcyBpbiA8Y2xpY2s+IGFmdGVyIGEgY2xpY2sgZXZlbnQuIFRoZSA8Y29kZT5ldmVudDwvY29kZT4gcHJvcGVydHkKKyAqIGNvbnRhaW5zIHRoZSBvcmlnaW5hbCBtb3VzZSBldmVudCBhbmQgPGNvZGU+Y2VsbDwvY29kZT4gcHJvcGVydHkgY29udGFpbnMKKyAqIHRoZSBjZWxsIHVuZGVyIHRoZSBtb3VzZSBvciBudWxsIGlmIHRoZSBiYWNrZ3JvdW5kIHdhcyBjbGlja2VkLgorICogCisgKiBFdmVudDogbXhFdmVudC5ET1VCTEVfQ0xJQ0sKKyAqCisgKiBGaXJlcyBpbiA8ZGJsQ2xpY2s+IGFmdGVyIGEgZG91YmxlIGNsaWNrLiBUaGUgPGNvZGU+ZXZlbnQ8L2NvZGU+IHByb3BlcnR5CisgKiBjb250YWlucyB0aGUgb3JpZ2luYWwgbW91c2UgZXZlbnQgYW5kIHRoZSA8Y29kZT5jZWxsPC9jb2RlPiBwcm9wZXJ0eQorICogY29udGFpbnMgdGhlIGNlbGwgdW5kZXIgdGhlIG1vdXNlIG9yIG51bGwgaWYgdGhlIGJhY2tncm91bmQgd2FzIGNsaWNrZWQuCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LkdFU1RVUkUKKyAqCisgKiBGaXJlcyBpbiA8ZmlyZUdlc3R1cmVFdmVudD4gYWZ0ZXIgYSB0b3VjaCBnZXN0dXJlLiBUaGUgPGNvZGU+ZXZlbnQ8L2NvZGU+CisgKiBwcm9wZXJ0eSBjb250YWlucyB0aGUgb3JpZ2luYWwgZ2VzdHVyZSBlbmQgZXZlbnQgYW5kIHRoZSA8Y29kZT5jZWxsPC9jb2RlPgorICogcHJvcGVydHkgY29udGFpbnMgdGhlIG9wdGlvbmFsIGNlbGwgYXNzb2NpYXRlZCB3aXRoIHRoZSBnZXN0dXJlLgorICoKKyAqIEV2ZW50OiBteEV2ZW50LlRBUF9BTkRfSE9MRAorICoKKyAqIEZpcmVzIGluIDx0YXBBbmRIb2xkPiBpZiBhIHRhcCBhbmQgaG9sZCBldmVudCB3YXMgZGV0ZWN0ZWQuIFRoZSA8Y29kZT5ldmVudDwvY29kZT4KKyAqIHByb3BlcnR5IGNvbnRhaW5zIHRoZSBpbml0aWFsIHRvdWNoIGV2ZW50IGFuZCB0aGUgPGNvZGU+Y2VsbDwvY29kZT4gcHJvcGVydHkKKyAqIGNvbnRhaW5zIHRoZSBjZWxsIHVuZGVyIHRoZSBtb3VzZSBvciBudWxsIGlmIHRoZSBiYWNrZ3JvdW5kIHdhcyBjbGlja2VkLgorICoKKyAqIEV2ZW50OiBteEV2ZW50LkZJUkVfTU9VU0VfRVZFTlQKKyAqCisgKiBGaXJlcyBpbiA8ZmlyZU1vdXNlRXZlbnQ+IGJlZm9yZSB0aGUgbW91c2UgbGlzdGVuZXJzIGFyZSBpbnZva2VkLiBUaGUKKyAqIDxjb2RlPmV2ZW50TmFtZTwvY29kZT4gcHJvcGVydHkgY29udGFpbnMgdGhlIGV2ZW50IG5hbWUgYW5kIHRoZQorICogPGNvZGU+ZXZlbnQ8L2NvZGU+IHByb3BlcnR5IGNvbnRhaW5zIHRoZSA8bXhNb3VzZUV2ZW50Pi4KKyAqCisgKiBFdmVudDogbXhFdmVudC5TSVpFCisgKgorICogRmlyZXMgYWZ0ZXIgPHNpemVEaWRDaGFuZ2U+IHdhcyBleGVjdXRlZC4gVGhlIDxjb2RlPmJvdW5kczwvY29kZT4gcHJvcGVydHkKKyAqIGNvbnRhaW5zIHRoZSBuZXcgZ3JhcGggYm91bmRzLgorICoKKyAqIEV2ZW50OiBteEV2ZW50LlNUQVJUX0VESVRJTkcKKyAqCisgKiBGaXJlcyBiZWZvcmUgdGhlIGluLXBsYWNlIGVkaXRvciBzdGFydHMgaW4gPHN0YXJ0RWRpdGluZ0F0Q2VsbD4uIFRoZQorICogPGNvZGU+Y2VsbDwvY29kZT4gcHJvcGVydHkgY29udGFpbnMgdGhlIGNlbGwgdGhhdCBpcyBiZWluZyBlZGl0ZWQgYW5kIHRoZQorICogPGNvZGU+ZXZlbnQ8L2NvZGU+IHByb3BlcnR5IGNvbnRhaW5zIHRoZSBvcHRpb25hbCBldmVudCBhcmd1bWVudCB0aGF0IHdhcworICogcGFzc2VkIHRvIDxzdGFydEVkaXRpbmdBdENlbGw+LgorICogCisgKiBFdmVudDogbXhFdmVudC5FRElUSU5HX1NUQVJURUQKKyAqCisgKiBGaXJlcyBhZnRlciB0aGUgaW4tcGxhY2UgZWRpdG9yIHN0YXJ0cyBpbiA8c3RhcnRFZGl0aW5nQXRDZWxsPi4gVGhlCisgKiA8Y29kZT5jZWxsPC9jb2RlPiBwcm9wZXJ0eSBjb250YWlucyB0aGUgY2VsbCB0aGF0IGlzIGJlaW5nIGVkaXRlZCBhbmQgdGhlCisgKiA8Y29kZT5ldmVudDwvY29kZT4gcHJvcGVydHkgY29udGFpbnMgdGhlIG9wdGlvbmFsIGV2ZW50IGFyZ3VtZW50IHRoYXQgd2FzCisgKiBwYXNzZWQgdG8gPHN0YXJ0RWRpdGluZ0F0Q2VsbD4uCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LkVESVRJTkdfU1RPUFBFRAorICoKKyAqIEZpcmVzIGFmdGVyIHRoZSBpbi1wbGFjZSBlZGl0b3Igc3RvcHMgaW4gPHN0b3BFZGl0aW5nPi4KKyAqCisgKiBFdmVudDogbXhFdmVudC5MQUJFTF9DSEFOR0VECisgKgorICogRmlyZXMgYmV0d2VlbiBiZWdpbi0gYW5kIGVuZFVwZGF0ZSBpbiA8Y2VsbExhYmVsQ2hhbmdlZD4uIFRoZQorICogPGNvZGU+Y2VsbDwvY29kZT4gcHJvcGVydHkgY29udGFpbnMgdGhlIGNlbGwsIHRoZSA8Y29kZT52YWx1ZTwvY29kZT4KKyAqIHByb3BlcnR5IGNvbnRhaW5zIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBjZWxsLCB0aGUgPGNvZGU+b2xkPC9jb2RlPiBwcm9wZXJ0eQorICogY29udGFpbnMgdGhlIG9sZCB2YWx1ZSBhbmQgdGhlIG9wdGlvbmFsIDxjb2RlPmV2ZW50PC9jb2RlPiBwcm9wZXJ0eSBjb250YWlucworICogdGhlIG1vdXNlIGV2ZW50IHRoYXQgc3RhcnRlZCB0aGUgZWRpdC4KKyAqIAorICogRXZlbnQ6IG14RXZlbnQuQUREX09WRVJMQVkKKyAqCisgKiBGaXJlcyBhZnRlciBhbiBvdmVybGF5IGlzIGFkZGVkIGluIDxhZGRDZWxsT3ZlcmxheT4uIFRoZSA8Y29kZT5jZWxsPC9jb2RlPgorICogcHJvcGVydHkgY29udGFpbnMgdGhlIGNlbGwgYW5kIHRoZSA8Y29kZT5vdmVybGF5PC9jb2RlPiBwcm9wZXJ0eSBjb250YWlucworICogdGhlIDxteENlbGxPdmVybGF5PiB0aGF0IHdhcyBhZGRlZC4KKyAqCisgKiBFdmVudDogbXhFdmVudC5SRU1PVkVfT1ZFUkxBWQorICoKKyAqIEZpcmVzIGFmdGVyIGFuIG92ZXJsYXkgaXMgcmVtb3ZlZCBpbiA8cmVtb3ZlQ2VsbE92ZXJsYXk+IGFuZAorICogPHJlbW92ZUNlbGxPdmVybGF5cz4uIFRoZSA8Y29kZT5jZWxsPC9jb2RlPiBwcm9wZXJ0eSBjb250YWlucyB0aGUgY2VsbCBhbmQKKyAqIHRoZSA8Y29kZT5vdmVybGF5PC9jb2RlPiBwcm9wZXJ0eSBjb250YWlucyB0aGUgPG14Q2VsbE92ZXJsYXk+IHRoYXQgd2FzCisgKiByZW1vdmVkLgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhHcmFwaAorICogCisgKiBDb25zdHJ1Y3RzIGEgbmV3IG14R3JhcGggaW4gdGhlIHNwZWNpZmllZCBjb250YWluZXIuIE1vZGVsIGlzIGFuIG9wdGlvbmFsCisgKiBteEdyYXBoTW9kZWwuIElmIG5vIG1vZGVsIGlzIHByb3ZpZGVkLCBhIG5ldyBteEdyYXBoTW9kZWwgaW5zdGFuY2UgaXMgCisgKiB1c2VkIGFzIHRoZSBtb2RlbC4gVGhlIGNvbnRhaW5lciBtdXN0IGhhdmUgYSB2YWxpZCBvd25lciBkb2N1bWVudCBwcmlvciAKKyAqIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBpbiBJbnRlcm5ldCBFeHBsb3Jlci4gUmVuZGVySGludCBpcyBhIHN0cmluZyB0bworICogYWZmZWN0IHRoZSBkaXNwbGF5IHBlcmZvcm1hbmNlIGFuZCByZW5kZXJpbmcgaW4gSUUsIGJ1dCBub3QgaW4gU1ZHLWJhc2VkIAorICogYnJvd3NlcnMuIFRoZSBwYXJhbWV0ZXIgaXMgbWFwcGVkIHRvIDxkaWFsZWN0Piwgd2hpY2ggbWF5IAorICogYmUgb25lIG9mIDxteENvbnN0YW50cy5ESUFMRUNUX1NWRz4gZm9yIFNWRy1iYXNlZCBicm93c2VycywgCisgKiA8bXhDb25zdGFudHMuRElBTEVDVF9TVFJJQ1RIVE1MPiBmb3IgZmFzdGVzdCBkaXNwbGF5IG1vZGUsCisgKiA8bXhDb25zdGFudHMuRElBTEVDVF9QUkVGRVJIVE1MPiBmb3IgZmFzdGVyIGRpc3BsYXkgbW9kZSwKKyAqIDxteENvbnN0YW50cy5ESUFMRUNUX01JWEVESFRNTD4gZm9yIGZhc3QgYW5kIDxteENvbnN0YW50cy5ESUFMRUNUX1ZNTD4gCisgKiBmb3IgZXhhY3QgZGlzcGxheSBtb2RlIChzbG93ZXN0KS4gVGhlIGRpYWxlY3RzIGFyZSBkZWZpbmVkIGluIG14Q29uc3RhbnRzLgorICogVGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBESUFMRUNUX1NWRyBmb3IgU1ZHLWJhc2VkIGJyb3dzZXJzIGFuZAorICogRElBTEVDVF9NSVhFRCBmb3IgSUUuCisgKgorICogVGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIHJlbmRlcmluZ0hpbnQgcGFyYW1ldGVyIGFyZSBleHBsYWluZWQgYmVsb3c6CisgKiAKKyAqIGZhc3QgLSBUaGUgcGFyYW1ldGVyIGlzIGJhc2VkIG9uIHRoZSBmYWN0IHRoYXQgdGhlIGRpc3BsYXkgcGVyZm9ybWFuY2UgaXMgCisgKiBoaWdobHkgaW1wcm92ZWQgaW4gSUUgaWYgdGhlIFZNTCBpcyBub3QgY29udGFpbmVkIHdpdGhpbiBhIFZNTCBncm91cCAKKyAqIGVsZW1lbnQuIFRoZSBsYWNrIG9mIGEgZ3JvdXAgZWxlbWVudCBvbmx5IHNsaWdodGx5IGFmZmVjdHMgdGhlIGRpc3BsYXkgd2hpbGUgCisgKiBwYW5uaW5nLCBidXQgaW1wcm92ZXMgdGhlIHBlcmZvcm1hbmNlIGJ5IGFsbW9zdCBhIGZhY3RvciBvZiAyLCB3aGlsZSBrZWVwaW5nIAorICogdGhlIGRpc3BsYXkgc3VmZmljaWVudGx5IGFjY3VyYXRlLiBUaGlzIGFsc28gYWxsb3dzIHRvIHJlbmRlciBjZXJ0YWluIHNoYXBlcyBhcyBIVE1MIAorICogaWYgdGhlIGRpc3BsYXkgYWNjdXJhY3kgaXMgbm90IGFmZmVjdGVkLCB3aGljaCBpcyBpbXBsZW1lbnRlZCBieSAKKyAqIDxteFNoYXBlLmlzTWl4ZWRNb2RlSHRtbD4uIFRoaXMgaXMgdGhlIGRlZmF1bHQgc2V0dGluZyBhbmQgaXMgbWFwcGVkIHRvCisgKiBESUFMRUNUX01JWEVESFRNTC4KKyAqIGZhc3RlciAtIFNhbWUgYXMgZmFzdCwgYnV0IG1vcmUgZXhwZW5zaXZlIHNoYXBlcyBhcmUgYXZvaWRlZC4gVGhpcyBpcyAKKyAqIGNvbnRyb2xsZWQgYnkgPG14U2hhcGUucHJlZmVyTW9kZUh0bWw+LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3aWxsIAorICogYXZvaWQgZ3JhZGllbnRzIGFuZCByb3VuZGVkIHJlY3RhbmdsZXMsIGJ1dCBtb3JlIHNpZ25pZmljYW50IHNoYXBlcywgc3VjaCAKKyAqIGFzIHJob21idXMsIGVsbGlwc2UsIGFjdG9yIGFuZCBjeWxpbmRlciB3aWxsIGJlIHJlbmRlcmVkIGFjY3VyYXRlbHkuIFRoaXMgCisgKiBzZXR0aW5nIGlzIG1hcHBlZCB0byBESUFMRUNUX1BSRUZFUkhUTUwuCisgKiBmYXN0ZXN0IC0gQWxtb3N0IGFueXRoaW5nIHdpbGwgYmUgcmVuZGVyZWQgaW4gSHRtbC4gVGhpcyBhbGxvd3MgZm9yIAorICogcmVjdGFuZ2xlcywgbGFiZWxzIGFuZCBpbWFnZXMuIFRoaXMgc2V0dGluZyBpcyBtYXBwZWQgdG8KKyAqIERJQUxFQ1RfU1RSSUNUSFRNTC4KKyAqIGV4YWN0IC0gSWYgYWNjdXJhdGUgcGFubmluZyBpcyByZXF1aXJlZCBhbmQgaWYgdGhlIGRpYWdyYW0gaXMgc21hbGwgKHVwCisgKiB0byAxMDAgY2VsbHMpLCB0aGVuIHRoaXMgdmFsdWUgc2hvdWxkIGJlIHVzZWQuIEluIHRoaXMgbW9kZSwgYSBncm91cCBpcyAKKyAqIGNyZWF0ZWQgdGhhdCBjb250YWlucyB0aGUgVk1MLiBUaGlzIGFsbG93cyBmb3IgYWNjdXJhdGUgcGFubmluZyBhbmQgaXMgCisgKiBtYXBwZWQgdG8gRElBTEVDVF9WTUwuCisgKgorICogRXhhbXBsZToKKyAqIAorICogVG8gY3JlYXRlIGEgZ3JhcGggaW5zaWRlIGEgRE9NIG5vZGUgd2l0aCBhbiBpZCBvZiBncmFwaDoKKyAqIChjb2RlKQorICogdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdncmFwaCcpOworICogdmFyIGdyYXBoID0gbmV3IG14R3JhcGgoY29udGFpbmVyKTsKKyAqIChlbmQpCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNvbnRhaW5lciAtIE9wdGlvbmFsIERPTSBub2RlIHRoYXQgYWN0cyBhcyBhIGNvbnRhaW5lciBmb3IgdGhlIGdyYXBoLgorICogSWYgdGhpcyBpcyBudWxsIHRoZW4gdGhlIGNvbnRhaW5lciBjYW4gYmUgaW5pdGlhbGl6ZWQgbGF0ZXIgdXNpbmcKKyAqIDxpbml0Pi4KKyAqIG1vZGVsIC0gT3B0aW9uYWwgPG14R3JhcGhNb2RlbD4gdGhhdCBjb25zdGl0dXRlcyB0aGUgZ3JhcGggZGF0YS4KKyAqIHJlbmRlckhpbnQgLSBPcHRpb25hbCBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIGRpc3BsYXkgYWNjdXJhY3kgYW5kCisgKiBwZXJmb3JtYW5jZS4gRGVmYXVsdCBpcyBteENvbnN0YW50cy5ESUFMRUNUX01JWEVESFRNTCAoZm9yIElFKS4KKyAqIHN0eWxlc2hlZXQgLSBPcHRpb25hbCA8bXhTdHlsZXNoZWV0PiB0byBiZSB1c2VkIGluIHRoZSBncmFwaC4KKyAqLworZnVuY3Rpb24gbXhHcmFwaChjb250YWluZXIsIG1vZGVsLCByZW5kZXJIaW50LCBzdHlsZXNoZWV0KQoreworCS8vIEluaXRpYWxpemVzIHRoZSB2YXJpYWJsZSBpbiBjYXNlIHRoZSBwcm90b3R5cGUgaGFzIGJlZW4KKwkvLyBtb2RpZmllZCB0byBob2xkIHNvbWUgbGlzdGVuZXJzICh3aGljaCBpcyBwb3NzaWJsZSBiZWNhdXNlCisJLy8gdGhlIGNyZWF0ZUhhbmRsZXJzIGNhbGwgaXMgZXhlY3V0ZWQgcmVnYXJkbGVzcyBvZiB0aGUKKwkvLyBhcmd1bWVudHMgcGFzc2VkIGludG8gdGhlIGN0b3IpLgorCXRoaXMubW91c2VMaXN0ZW5lcnMgPSBudWxsOworCQorCS8vIENvbnZlcnRzIHRoZSByZW5kZXJIaW50IGludG8gYSBkaWFsZWN0CisJdGhpcy5yZW5kZXJIaW50ID0gcmVuZGVySGludDsKKworCWlmIChteENsaWVudC5JU19TVkcpCisJeworCQl0aGlzLmRpYWxlY3QgPSBteENvbnN0YW50cy5ESUFMRUNUX1NWRzsKKwl9CisJZWxzZSBpZiAocmVuZGVySGludCA9PSBteENvbnN0YW50cy5SRU5ERVJJTkdfSElOVF9FWEFDVCAmJiBteENsaWVudC5JU19WTUwpCisJeworCQl0aGlzLmRpYWxlY3QgPSBteENvbnN0YW50cy5ESUFMRUNUX1ZNTDsKKwl9CisJZWxzZSBpZiAocmVuZGVySGludCA9PSBteENvbnN0YW50cy5SRU5ERVJJTkdfSElOVF9GQVNURVNUKQorCXsKKwkJdGhpcy5kaWFsZWN0ID0gbXhDb25zdGFudHMuRElBTEVDVF9TVFJJQ1RIVE1MOworCX0KKwllbHNlIGlmIChyZW5kZXJIaW50ID09IG14Q29uc3RhbnRzLlJFTkRFUklOR19ISU5UX0ZBU1RFUikKKwl7CisJCXRoaXMuZGlhbGVjdCA9IG14Q29uc3RhbnRzLkRJQUxFQ1RfUFJFRkVSSFRNTDsKKwl9CisJZWxzZSAvLyBkZWZhdWx0IGZvciBWTUwKKwl7CisJCXRoaXMuZGlhbGVjdCA9IG14Q29uc3RhbnRzLkRJQUxFQ1RfTUlYRURIVE1MOworCX0KKwkKKwkvLyBJbml0aWFsaXplcyB0aGUgbWFpbiBtZW1iZXJzIHRoYXQgZG8gbm90IHJlcXVpcmUgYSBjb250YWluZXIKKwl0aGlzLm1vZGVsID0gKG1vZGVsICE9IG51bGwpID8gbW9kZWwgOiBuZXcgbXhHcmFwaE1vZGVsKCk7CisJdGhpcy5tdWx0aXBsaWNpdGllcyA9IFtdOworCXRoaXMuaW1hZ2VCdW5kbGVzID0gW107CisJdGhpcy5jZWxsUmVuZGVyZXIgPSB0aGlzLmNyZWF0ZUNlbGxSZW5kZXJlcigpOworCXRoaXMuc2V0U2VsZWN0aW9uTW9kZWwodGhpcy5jcmVhdGVTZWxlY3Rpb25Nb2RlbCgpKTsKKwl0aGlzLnNldFN0eWxlc2hlZXQoKHN0eWxlc2hlZXQgIT0gbnVsbCkgPyBzdHlsZXNoZWV0IDogdGhpcy5jcmVhdGVTdHlsZXNoZWV0KCkpOworCXRoaXMudmlldyA9IHRoaXMuY3JlYXRlR3JhcGhWaWV3KCk7CisJCisJLy8gQWRkcyBhIGdyYXBoIG1vZGVsIGxpc3RlbmVyIHRvIHVwZGF0ZSB0aGUgdmlldworCXRoaXMuZ3JhcGhNb2RlbENoYW5nZUxpc3RlbmVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorCXsKKwkJdGhpcy5ncmFwaE1vZGVsQ2hhbmdlZChldnQuZ2V0UHJvcGVydHkoJ2VkaXQnKS5jaGFuZ2VzKTsKKwl9KTsKKwkKKwl0aGlzLm1vZGVsLmFkZExpc3RlbmVyKG14RXZlbnQuQ0hBTkdFLCB0aGlzLmdyYXBoTW9kZWxDaGFuZ2VMaXN0ZW5lcik7CisKKwkvLyBJbnN0YWxscyBiYXNpYyBldmVudCBoYW5kbGVycyB3aXRoIGRpc2FibGVkIGRlZmF1bHQgc2V0dGluZ3MuCisJdGhpcy5jcmVhdGVIYW5kbGVycygpOworCQorCS8vIEluaXRpYWxpemVzIHRoZSBkaXNwbGF5IGlmIGEgY29udGFpbmVyIHdhcyBzcGVjaWZpZWQKKwlpZiAoY29udGFpbmVyICE9IG51bGwpCisJeworCQl0aGlzLmluaXQoY29udGFpbmVyKTsKKwl9CisJCisJdGhpcy52aWV3LnJldmFsaWRhdGUoKTsKK307CisKKy8qKgorICogSW5zdGFsbHMgdGhlIHJlcXVpcmVkIGxhbmd1YWdlIHJlc291cmNlcyBhdCBjbGFzcworICogbG9hZGluZyB0aW1lLgorICovCitpZiAobXhMb2FkUmVzb3VyY2VzKQoreworCW14UmVzb3VyY2VzLmFkZChteENsaWVudC5iYXNlUGF0aCsnL3Jlc291cmNlcy9ncmFwaCcpOworfQorCisvKioKKyAqIEV4dGVuZHMgbXhFdmVudFNvdXJjZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUgPSBuZXcgbXhFdmVudFNvdXJjZSgpOworbXhHcmFwaC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBteEdyYXBoOworCisvKioKKyAqIFZhcmlhYmxlOiBFTVBUWV9BUlJBWQorICoKKyAqIEltbXV0YWJsZSBlbXB0eSBhcnJheSBpbnN0YW5jZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuRU1QVFlfQVJSQVkgPSBbXTsKKworLyoqCisgKiBHcm91cDogVmFyaWFibGVzCisgKi8KKworLyoqCisgKiBWYXJpYWJsZTogbW91c2VMaXN0ZW5lcnMKKyAqIAorICogSG9sZHMgdGhlIG1vdXNlIGV2ZW50IGxpc3RlbmVycy4gU2VlIDxmaXJlTW91c2VFdmVudD4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLm1vdXNlTGlzdGVuZXJzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogaXNNb3VzZURvd24KKyAqIAorICogSG9sZHMgdGhlIHN0YXRlIG9mIHRoZSBtb3VzZSBidXR0b24uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzTW91c2VEb3duID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IG1vZGVsCisgKiAKKyAqIEhvbGRzIHRoZSA8bXhHcmFwaE1vZGVsPiB0aGF0IGNvbnRhaW5zIHRoZSBjZWxscyB0byBiZSBkaXNwbGF5ZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLm1vZGVsID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogdmlldworICogCisgKiBIb2xkcyB0aGUgPG14R3JhcGhWaWV3PiB0aGF0IGNhY2hlcyB0aGUgPG14Q2VsbFN0YXRlcz4gZm9yIHRoZSBjZWxscy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUudmlldyA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHN0eWxlc2hlZXQKKyAqIAorICogSG9sZHMgdGhlIDxteFN0eWxlc2hlZXQ+IHRoYXQgZGVmaW5lcyB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgY2VsbHMuCisgKiAKKyAqIAorICogRXhhbXBsZToKKyAqIAorICogVXNlIHRoZSBmb2xsb3dpbmcgY29kZSB0byByZWFkIGEgc3R5bGVzaGVldCBpbnRvIGFuIGV4aXN0aW5nIGdyYXBoLgorICogCisgKiAoY29kZSkKKyAqIHZhciByZXEgPSBteFV0aWxzLmxvYWQoJ3N0eWxlc2hlZXQueG1sJyk7CisgKiB2YXIgcm9vdCA9IHJlcS5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAqIHZhciBkZWMgPSBuZXcgbXhDb2RlYyhyb290Lm93bmVyRG9jdW1lbnQpOworICogZGVjLmRlY29kZShyb290LCBncmFwaC5zdHlsZXNoZWV0KTsKKyAqIChlbmQpCisgKi8KK214R3JhcGgucHJvdG90eXBlLnN0eWxlc2hlZXQgPSBudWxsOworCQorLyoqCisgKiBWYXJpYWJsZTogc2VsZWN0aW9uTW9kZWwKKyAqIAorICogSG9sZHMgdGhlIDxteEdyYXBoU2VsZWN0aW9uTW9kZWw+IHRoYXQgbW9kZWxzIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2VsZWN0aW9uTW9kZWwgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjZWxsRWRpdG9yCisgKiAKKyAqIEhvbGRzIHRoZSA8bXhDZWxsRWRpdG9yPiB0aGF0IGlzIHVzZWQgYXMgdGhlIGluLXBsYWNlIGVkaXRpbmcuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNlbGxFZGl0b3IgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBjZWxsUmVuZGVyZXIKKyAqIAorICogSG9sZHMgdGhlIDxteENlbGxSZW5kZXJlcj4gZm9yIHJlbmRlcmluZyB0aGUgY2VsbHMgaW4gdGhlIGdyYXBoLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jZWxsUmVuZGVyZXIgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBtdWx0aXBsaWNpdGllcworICogCisgKiBBbiBhcnJheSBvZiA8bXhNdWx0aXBsaWNpdGllcz4gZGVzY3JpYmluZyB0aGUgYWxsb3dlZAorICogY29ubmVjdGlvbnMgaW4gYSBncmFwaC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUubXVsdGlwbGljaXRpZXMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiByZW5kZXJIaW50CisgKiAKKyAqIFJlbmRlckhpbnQgYXMgaXQgd2FzIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnJlbmRlckhpbnQgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBkaWFsZWN0CisgKiAKKyAqIERpYWxlY3QgdG8gYmUgdXNlZCBmb3IgZHJhd2luZyB0aGUgZ3JhcGguIFBvc3NpYmxlIHZhbHVlcyBhcmUgYWxsCisgKiBjb25zdGFudHMgaW4gPG14Q29uc3RhbnRzPiB3aXRoIGEgRElBTEVDVC1wcmVmaXguCisgKi8KK214R3JhcGgucHJvdG90eXBlLmRpYWxlY3QgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBncmlkU2l6ZQorICogCisgKiBTcGVjaWZpZXMgdGhlIGdyaWQgc2l6ZS4gRGVmYXVsdCBpcyAxMC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ3JpZFNpemUgPSAxMDsKKwkKKy8qKgorICogVmFyaWFibGU6IGdyaWRFbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgZ3JpZCBpcyBlbmFibGVkLiBUaGlzIGlzIHVzZWQgaW4gPHNuYXA+LiBEZWZhdWx0IGlzCisgKiB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5ncmlkRW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHBvcnRzRW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgcG9ydHMgYXJlIGVuYWJsZWQuIFRoaXMgaXMgdXNlZCBpbiA8Y2VsbENvbm5lY3RlZD4gdG8gdXBkYXRlCisgKiB0aGUgcmVzcGVjdGl2ZSBzdHlsZS4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5wb3J0c0VuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBuYXRpdmVEb3VibGVDbGlja0VuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIG5hdGl2ZSBkb3VibGUgY2xpY2sgZXZlbnRzIHNob3VsZCBiZSBkZXRlY3RlZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5uYXRpdmVEYmxDbGlja0VuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBkb3VibGVUYXBFbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiBkb3VibGUgdGFwcyBvbiB0b3VjaC1iYXNlZCBkZXZpY2VzIHNob3VsZCBiZSBoYW5kbGVkIGFzIGEKKyAqIGRvdWJsZSBjbGljay4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5kb3VibGVUYXBFbmFibGVkID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogZG91YmxlVGFwVGltZW91dAorICogCisgKiBTcGVjaWZpZXMgdGhlIHRpbWVvdXQgZm9yIGRvdWJsZSB0YXBzIGFuZCBub24tbmF0aXZlIGRvdWJsZSBjbGlja3MuIERlZmF1bHQKKyAqIGlzIDUwMCBtcy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZG91YmxlVGFwVGltZW91dCA9IDUwMDsKKworLyoqCisgKiBWYXJpYWJsZTogZG91YmxlVGFwVG9sZXJhbmNlCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgdG9sZXJhbmNlIGZvciBkb3VibGUgdGFwcyBhbmQgZG91YmxlIGNsaWNrcyBpbiBxdWlya3MgbW9kZS4KKyAqIERlZmF1bHQgaXMgMjUgcGl4ZWxzLgorICovCitteEdyYXBoLnByb3RvdHlwZS5kb3VibGVUYXBUb2xlcmFuY2UgPSAyNTsKKworLyoqCisgKiBWYXJpYWJsZTogbGFzdFRvdWNoWAorICogCisgKiBIb2xkcyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBsYXN0IHRvdWNoIGV2ZW50IGZvciBkb3VibGUgdGFwIGRldGVjdGlvbi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUubGFzdFRvdWNoWSA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IGxhc3RUb3VjaFgKKyAqIAorICogSG9sZHMgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgbGFzdCB0b3VjaCBldmVudCBmb3IgZG91YmxlIHRhcCBkZXRlY3Rpb24uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmxhc3RUb3VjaFkgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBsYXN0VG91Y2hUaW1lCisgKiAKKyAqIEhvbGRzIHRoZSB0aW1lIG9mIHRoZSBsYXN0IHRvdWNoIGV2ZW50IGZvciBkb3VibGUgY2xpY2sgZGV0ZWN0aW9uLgorICovCitteEdyYXBoLnByb3RvdHlwZS5sYXN0VG91Y2hUaW1lID0gMDsKKworLyoqCisgKiBWYXJpYWJsZTogdGFwQW5kSG9sZEVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIHRhcCBhbmQgaG9sZCBzaG91bGQgYmUgdXNlZCBmb3Igc3RhcnRpbmcgY29ubmVjdGlvbnMgb24gdG91Y2gtYmFzZWQKKyAqIGRldmljZXMuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUudGFwQW5kSG9sZEVuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiB0YXBBbmRIb2xkRGVsYXkKKyAqIAorICogU3BlY2lmaWVzIHRoZSB0aW1lIGZvciBhIHRhcCBhbmQgaG9sZC4gRGVmYXVsdCBpcyA1MDAgbXMuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnRhcEFuZEhvbGREZWxheSA9IDUwMDsKKworLyoqCisgKiBWYXJpYWJsZTogdGFwQW5kSG9sZEluUHJvZ3Jlc3MKKyAqIAorICogVHJ1ZSBpZiB0aGUgdGltZXIgZm9yIHRhcCBhbmQgaG9sZCBldmVudHMgaXMgcnVubmluZy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUudGFwQW5kSG9sZEluUHJvZ3Jlc3MgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogdGFwQW5kSG9sZFZhbGlkCisgKiAKKyAqIFRydWUgYXMgbG9uZyBhcyB0aGUgdGltZXIgaXMgcnVubmluZyBhbmQgdGhlIHRvdWNoIGV2ZW50cworICogc3RheSB3aXRoaW4gdGhlIGdpdmVuIDx0YXBBbmRIb2xkVG9sZXJhbmNlPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUudGFwQW5kSG9sZFZhbGlkID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGluaXRpYWxUb3VjaFgKKyAqIAorICogSG9sZHMgdGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgaW50aWFsIHRvdWNoIGV2ZW50IGZvciB0YXAgYW5kIGhvbGQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmluaXRpYWxUb3VjaFggPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBpbml0aWFsVG91Y2hZCisgKiAKKyAqIEhvbGRzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGludGlhbCB0b3VjaCBldmVudCBmb3IgdGFwIGFuZCBob2xkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pbml0aWFsVG91Y2hZID0gMDsKKworLyoqCisgKiBWYXJpYWJsZTogdG9sZXJhbmNlCisgKiAKKyAqIFRvbGVyYW5jZSBmb3IgYSBtb3ZlIHRvIGJlIGhhbmRsZWQgYXMgYSBzaW5nbGUgY2xpY2suCisgKiBEZWZhdWx0IGlzIDQgcGl4ZWxzLgorICovCitteEdyYXBoLnByb3RvdHlwZS50b2xlcmFuY2UgPSA0OworCisvKioKKyAqIFZhcmlhYmxlOiBkZWZhdWx0T3ZlcmxhcAorICogCisgKiBWYWx1ZSByZXR1cm5lZCBieSA8Z2V0T3ZlcmxhcD4gaWYgPGlzQWxsb3dPdmVybGFwUGFyZW50PiByZXR1cm5zCisgKiB0cnVlIGZvciB0aGUgZ2l2ZW4gY2VsbC4gPGdldE92ZXJsYXA+IGlzIHVzZWQgaW4gPGNvbnN0cmFpbkNoaWxkPiBpZgorICogPGlzQ29uc3RyYWluQ2hpbGQ+IHJldHVybnMgdHJ1ZS4gVGhlIHZhbHVlIHNwZWNpZmllcyB0aGUKKyAqIHBvcnRpb24gb2YgdGhlIGNoaWxkIHdoaWNoIGlzIGFsbG93ZWQgdG8gb3ZlcmxhcCB0aGUgcGFyZW50LgorICovCitteEdyYXBoLnByb3RvdHlwZS5kZWZhdWx0T3ZlcmxhcCA9IDAuNTsKKworLyoqCisgKiBWYXJpYWJsZTogZGVmYXVsdFBhcmVudAorICogCisgKiBTcGVjaWZpZXMgdGhlIGRlZmF1bHQgcGFyZW50IHRvIGJlIHVzZWQgdG8gaW5zZXJ0IG5ldyBjZWxscy4KKyAqIFRoaXMgaXMgdXNlZCBpbiA8Z2V0RGVmYXVsdFBhcmVudD4uIERlZmF1bHQgaXMgbnVsbC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZGVmYXVsdFBhcmVudCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGFsdGVybmF0ZUVkZ2VTdHlsZQorICogCisgKiBTcGVjaWZpZXMgdGhlIGFsdGVybmF0ZSBlZGdlIHN0eWxlIHRvIGJlIHVzZWQgaWYgdGhlIG1haW4gY29udHJvbCBwb2ludAorICogb24gYW4gZWRnZSBpcyBiZWluZyBkb3VibGVjbGlja2VkLiBEZWZhdWx0IGlzIG51bGwuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmFsdGVybmF0ZUVkZ2VTdHlsZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGJhY2tncm91bmRJbWFnZQorICoKKyAqIFNwZWNpZmllcyB0aGUgPG14SW1hZ2U+IHRvIGJlIHJldHVybmVkIGJ5IDxnZXRCYWNrZ3JvdW5kSW1hZ2U+LiBEZWZhdWx0CisgKiBpcyBudWxsLgorICogCisgKiBFeGFtcGxlOgorICoKKyAqIChjb2RlKQorICogdmFyIGltZyA9IG5ldyBteEltYWdlKCdodHRwOi8vd3d3LmV4YW1wbGUuY29tL21hcHMvZXhhbXBsZW1hcC5qcGcnLCAxMDI0LCA3NjgpOworICogZ3JhcGguc2V0QmFja2dyb3VuZEltYWdlKGltZyk7CisgKiBncmFwaC52aWV3LnZhbGlkYXRlKCk7CisgKiAoZW5kKQorICovCitteEdyYXBoLnByb3RvdHlwZS5iYWNrZ3JvdW5kSW1hZ2UgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBwYWdlVmlzaWJsZQorICoKKyAqIFNwZWNpZmllcyBpZiB0aGUgYmFja2dyb3VuZCBwYWdlIHNob3VsZCBiZSB2aXNpYmxlLiBEZWZhdWx0IGlzIGZhbHNlLgorICogTm90IHlldCBpbXBsZW1lbnRlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUucGFnZVZpc2libGUgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogcGFnZUJyZWFrc1Zpc2libGUKKyAqIAorICogU3BlY2lmaWVzIGlmIGEgZGFzaGVkIGxpbmUgc2hvdWxkIGJlIGRyYXduIGJldHdlZW4gbXVsdGlwbGUgcGFnZXMuIERlZmF1bHQKKyAqIGlzIGZhbHNlLiBJZiB5b3UgY2hhbmdlIHRoaXMgdmFsdWUgd2hpbGUgYSBncmFwaCBpcyBiZWluZyBkaXNwbGF5ZWQgdGhlbiB5b3UKKyAqIHNob3VsZCBjYWxsIDxzaXplRGlkQ2hhbmdlPiB0byBmb3JjZSBhbiB1cGRhdGUgb2YgdGhlIGRpc3BsYXkuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnBhZ2VCcmVha3NWaXNpYmxlID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHBhZ2VCcmVha0NvbG9yCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgY29sb3IgZm9yIHBhZ2UgYnJlYWtzLiBEZWZhdWx0IGlzICdncmF5Jy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUucGFnZUJyZWFrQ29sb3IgPSAnZ3JheSc7CisKKy8qKgorICogVmFyaWFibGU6IHBhZ2VCcmVha0Rhc2hlZAorICogCisgKiBTcGVjaWZpZXMgdGhlIHBhZ2UgYnJlYWtzIHNob3VsZCBiZSBkYXNoZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUucGFnZUJyZWFrRGFzaGVkID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogbWluUGFnZUJyZWFrRGlzdAorICogCisgKiBTcGVjaWZpZXMgdGhlIG1pbmltdW0gZGlzdGFuY2UgZm9yIHBhZ2UgYnJlYWtzIHRvIGJlIHZpc2libGUuIERlZmF1bHQgaXMKKyAqIDIwIChpbiBwaXhlbHMpLgorICovCitteEdyYXBoLnByb3RvdHlwZS5taW5QYWdlQnJlYWtEaXN0ID0gMjA7CisKKy8qKgorICogVmFyaWFibGU6IHByZWZlclBhZ2VTaXplCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgZ3JhcGggc2l6ZSBzaG91bGQgYmUgcm91bmRlZCB0byB0aGUgbmV4dCBwYWdlIG51bWJlciBpbgorICogPHNpemVEaWRDaGFuZ2U+LiBUaGlzIGlzIG9ubHkgdXNlZCBpZiB0aGUgZ3JhcGggY29udGFpbmVyIGhhcyBzY3JvbGxiYXJzLgorICogRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUucHJlZmVyUGFnZVNpemUgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogcGFnZUZvcm1hdAorICoKKyAqIFNwZWNpZmllcyB0aGUgcGFnZSBmb3JtYXQgZm9yIHRoZSBiYWNrZ3JvdW5kIHBhZ2UuIERlZmF1bHQgaXMKKyAqIDxteENvbnN0YW50cy5QQUdFX0ZPUk1BVF9BNF9QT1JUUkFJVD4uIFRoaXMgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBpbgorICogPG14UHJpbnRQcmV2aWV3PiBhbmQgZm9yIHBhaW50aW5nIHRoZSBiYWNrZ3JvdW5kIHBhZ2UgaWYgPHBhZ2VWaXNpYmxlPiBpcworICogdHJ1ZSBhbmQgdGhlIHBhZ2VicmVha3MgaWYgPHBhZ2VCcmVha3NWaXNpYmxlPiBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5wYWdlRm9ybWF0ID0gbXhDb25zdGFudHMuUEFHRV9GT1JNQVRfQTRfUE9SVFJBSVQ7CisKKy8qKgorICogVmFyaWFibGU6IHBhZ2VTY2FsZQorICoKKyAqIFNwZWNpZmllcyB0aGUgc2NhbGUgb2YgdGhlIGJhY2tncm91bmQgcGFnZS4gRGVmYXVsdCBpcyAxLjUuCisgKiBOb3QgeWV0IGltcGxlbWVudGVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5wYWdlU2NhbGUgPSAxLjU7CisKKy8qKgorICogVmFyaWFibGU6IGVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIHRoZSByZXR1cm4gdmFsdWUgZm9yIDxpc0VuYWJsZWQ+LiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmVuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBlc2NhcGVFbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiA8bXhLZXlIYW5kbGVyPiBzaG91bGQgaW52b2tlIDxlc2NhcGU+IHdoZW4gdGhlIGVzY2FwZSBrZXkKKyAqIGlzIHByZXNzZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZXNjYXBlRW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGludm9rZXNTdG9wQ2VsbEVkaXRpbmcKKyAqIAorICogSWYgdHJ1ZSwgd2hlbiBlZGl0aW5nIGlzIHRvIGJlIHN0b3BwZWQgYnkgd2F5IG9mIHNlbGVjdGlvbiBjaGFuZ2luZywKKyAqIGRhdGEgaW4gZGlhZ3JhbSBjaGFuZ2luZyBvciBvdGhlciBtZWFucyBzdG9wQ2VsbEVkaXRpbmcgaXMgaW52b2tlZCwgYW5kCisgKiBjaGFuZ2VzIGFyZSBzYXZlZC4gVGhpcyBpcyBpbXBsZW1lbnRlZCBpbiBhIGZvY3VzIGhhbmRsZXIgaW4KKyAqIDxteENlbGxFZGl0b3I+LiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmludm9rZXNTdG9wQ2VsbEVkaXRpbmcgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBlbnRlclN0b3BzQ2VsbEVkaXRpbmcKKyAqIAorICogSWYgdHJ1ZSwgcHJlc3NpbmcgdGhlIGVudGVyIGtleSB3aXRob3V0IHByZXNzaW5nIGNvbnRyb2wgb3Igc2hpZnQgd2lsbCBzdG9wCisgKiBlZGl0aW5nIGFuZCBhY2NlcHQgdGhlIG5ldyB2YWx1ZS4gVGhpcyBpcyB1c2VkIGluIDxteENlbGxFZGl0b3I+IHRvIHN0b3AKKyAqIGNlbGwgZWRpdGluZy4gTm90ZTogWW91IGNhbiBhbHdheXMgdXNlIEYyIGFuZCBlc2NhcGUgdG8gc3RvcCBlZGl0aW5nLgorICogRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZW50ZXJTdG9wc0NlbGxFZGl0aW5nID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHVzZVNjcm9sbGJhcnNGb3JQYW5uaW5nCisgKiAKKyAqIFNwZWNpZmllcyBpZiBzY3JvbGxiYXJzIHNob3VsZCBiZSB1c2VkIGZvciBwYW5uaW5nIGluIDxwYW5HcmFwaD4gaWYKKyAqIGFueSBzY3JvbGxiYXJzIGFyZSBhdmFpbGFibGUuIElmIHNjcm9sbGJhcnMgYXJlIGVuYWJsZWQgaW4gQ1NTLCBidXQgbm8KKyAqIHNjcm9sbGJhcnMgYXBwZWFyIGJlY2F1c2UgdGhlIGdyYXBoIGlzIHNtYWxsZXIgdGhhbiB0aGUgY29udGFpbmVyIHNpemUsCisgKiB0aGVuIG5vIHBhbm5pbmcgb2NjdXJzIGlmIHRoaXMgaXMgdHJ1ZS4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS51c2VTY3JvbGxiYXJzRm9yUGFubmluZyA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGV4cG9ydEVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIHRoZSByZXR1cm4gdmFsdWUgZm9yIDxjYW5FeHBvcnRDZWxsPi4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5leHBvcnRFbmFibGVkID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogaW1wb3J0RW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgdGhlIHJldHVybiB2YWx1ZSBmb3IgPGNhbkltcG9ydENlbGw+LiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmltcG9ydEVuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBjZWxsc0xvY2tlZAorICogCisgKiBTcGVjaWZpZXMgdGhlIHJldHVybiB2YWx1ZSBmb3IgPGlzQ2VsbExvY2tlZD4uIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNlbGxzTG9ja2VkID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGNlbGxzQ2xvbmVhYmxlCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgcmV0dXJuIHZhbHVlIGZvciA8aXNDZWxsQ2xvbmVhYmxlPi4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jZWxsc0Nsb25lYWJsZSA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGZvbGRpbmdFbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiBmb2xkaW5nIChjb2xsYXBzZSBhbmQgZXhwYW5kIHZpYSBhbiBpbWFnZSBpY29uIGluIHRoZSBncmFwaAorICogc2hvdWxkIGJlIGVuYWJsZWQpLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmZvbGRpbmdFbmFibGVkID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogY2VsbHNFZGl0YWJsZQorICogCisgKiBTcGVjaWZpZXMgdGhlIHJldHVybiB2YWx1ZSBmb3IgPGlzQ2VsbEVkaXRhYmxlPi4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jZWxsc0VkaXRhYmxlID0gdHJ1ZTsKKwkJCisvKioKKyAqIFZhcmlhYmxlOiBjZWxsc0RlbGV0YWJsZQorICogCisgKiBTcGVjaWZpZXMgdGhlIHJldHVybiB2YWx1ZSBmb3IgPGlzQ2VsbERlbGV0YWJsZT4uIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY2VsbHNEZWxldGFibGUgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBjZWxsc01vdmFibGUKKyAqIAorICogU3BlY2lmaWVzIHRoZSByZXR1cm4gdmFsdWUgZm9yIDxpc0NlbGxNb3ZhYmxlPi4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jZWxsc01vdmFibGUgPSB0cnVlOworCQorLyoqCisgKiBWYXJpYWJsZTogZWRnZUxhYmVsc01vdmFibGUKKyAqIAorICogU3BlY2lmaWVzIHRoZSByZXR1cm4gdmFsdWUgZm9yIGVkZ2VzIGluIDxpc0xhYmVsTW92YWJsZT4uIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZWRnZUxhYmVsc01vdmFibGUgPSB0cnVlOworCQorLyoqCisgKiBWYXJpYWJsZTogdmVydGV4TGFiZWxzTW92YWJsZQorICogCisgKiBTcGVjaWZpZXMgdGhlIHJldHVybiB2YWx1ZSBmb3IgdmVydGljZXMgaW4gPGlzTGFiZWxNb3ZhYmxlPi4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUudmVydGV4TGFiZWxzTW92YWJsZSA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBkcm9wRW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgdGhlIHJldHVybiB2YWx1ZSBmb3IgPGlzRHJvcEVuYWJsZWQ+LiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5kcm9wRW5hYmxlZCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBzcGxpdEVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIGRyb3BwaW5nIG9udG8gZWRnZXMgc2hvdWxkIGJlIGVuYWJsZWQuIFRoaXMgaXMgaWdub3JlZCBpZgorICogPGRyb3BFbmFibGVkPiBpcyBmYWxzZS4gSWYgZW5hYmxlZCwgaXQgd2lsbCBjYWxsIDxzcGxpdEVkZ2U+IHRvIGNhcnJ5CisgKiBvdXQgdGhlIGRyb3Agb3BlcmF0aW9uLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNwbGl0RW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGNlbGxzUmVzaXphYmxlCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgcmV0dXJuIHZhbHVlIGZvciA8aXNDZWxsUmVzaXphYmxlPi4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jZWxsc1Jlc2l6YWJsZSA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGNlbGxzQmVuZGFibGUKKyAqIAorICogU3BlY2lmaWVzIHRoZSByZXR1cm4gdmFsdWUgZm9yIDxpc0NlbGxzQmVuZGFibGU+LiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNlbGxzQmVuZGFibGUgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBjZWxsc1NlbGVjdGFibGUKKyAqIAorICogU3BlY2lmaWVzIHRoZSByZXR1cm4gdmFsdWUgZm9yIDxpc0NlbGxTZWxlY3RhYmxlPi4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jZWxsc1NlbGVjdGFibGUgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBjZWxsc0Rpc2Nvbm5lY3RhYmxlCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgcmV0dXJuIHZhbHVlIGZvciA8aXNDZWxsRGlzY29ubnRhYmxlPi4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jZWxsc0Rpc2Nvbm5lY3RhYmxlID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogYXV0b1NpemVDZWxscworICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIGdyYXBoIHNob3VsZCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSB0aGUgY2VsbCBzaXplIGFmdGVyIGFuCisgKiBlZGl0LiBUaGlzIGlzIHVzZWQgaW4gPGlzQXV0b1NpemVDZWxsPi4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuYXV0b1NpemVDZWxscyA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBhdXRvU2l6ZUNlbGxzT25BZGQKKyAqIAorICogU3BlY2lmaWVzIGlmIGF1dG9TaXplIHN0eWxlIHNob3VsZCBiZSBhcHBsaWVkIHdoZW4gY2VsbHMgYXJlIGFkZGVkLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5hdXRvU2l6ZUNlbGxzT25BZGQgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogYXV0b1Njcm9sbAorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIGdyYXBoIHNob3VsZCBhdXRvbWF0aWNhbGx5IHNjcm9sbCBpZiB0aGUgbW91c2UgZ29lcyBuZWFyCisgKiB0aGUgY29udGFpbmVyIGVkZ2Ugd2hpbGUgZHJhZ2dpbmcuIFRoaXMgaXMgb25seSB0YWtlbiBpbnRvIGFjY291bnQgaWYgdGhlCisgKiBjb250YWluZXIgaGFzIHNjcm9sbGJhcnMuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqIAorICogSWYgeW91IG5lZWQgdGhpcyB0byB3b3JrIHdpdGhvdXQgc2Nyb2xsYmFycyB0aGVuIHNldCA8aWdub3JlU2Nyb2xsYmFycz4gdG8KKyAqIHRydWUuIFBsZWFzZSBjb25zdWx0IHRoZSA8aWdub3JlU2Nyb2xsYmFycz4gZm9yIGRldGFpbHMuIEluIGdlbmVyYWwsIHdpdGgKKyAqIG5vIHNjcm9sbGJhcnMsIHRoZSB1c2Ugb2YgPGFsbG93QXV0b1Bhbm5pbmc+IGlzIHJlY29tbWVuZGVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5hdXRvU2Nyb2xsID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogaWdub3JlU2Nyb2xsYmFycworICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIGdyYXBoIHNob3VsZCBhdXRvbWF0aWNhbGx5IHNjcm9sbCByZWdhcmRsZXNzIG9mIHRoZQorICogc2Nyb2xsYmFycy4gVGhpcyB3aWxsIHNjcm9sbCB0aGUgY29udGFpbmVyIHVzaW5nIHBvc2l0aXZlIHZhbHVlcyBmb3IKKyAqIHNjcm9sbCBwb3NpdGlvbnMgKGllIHVzdWFsbHkgb25seSByaWdodHdhcmRzIGFuZCBkb3dud2FyZHMpLiBUbyBhdm9pZAorICogcG9zc2libGUgY29uZmxpY3RzIHdpdGggcGFubmluZywgc2V0IDx0cmFuc2xhdGVUb1Njcm9sbFBvc2l0aW9uPiB0byB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pZ25vcmVTY3JvbGxiYXJzID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHRyYW5zbGF0ZVRvU2Nyb2xsUG9zaXRpb24KKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBncmFwaCBzaG91bGQgYXV0b21hdGljYWxseSBjb252ZXJ0IHRoZSBjdXJyZW50IHNjcm9sbAorICogcG9zaXRpb24gdG8gYSB0cmFuc2xhdGUgaW4gdGhlIGdyYXBoIHZpZXcgd2hlbiBhIG1vdXNlVXAgZXZlbnQgaXMgcmVjZWl2ZWQuCisgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF2b2lkIGNvbmZsaWN0cyB3aGVuIHVzaW5nIDxhdXRvU2Nyb2xsPiBhbmQKKyAqIDxpZ25vcmVTY3JvbGxiYXJzPiB3aXRoIG5vIHNjcm9sbGJhcnMgaW4gdGhlIGNvbnRhaW5lci4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUudHJhbnNsYXRlVG9TY3JvbGxQb3NpdGlvbiA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiB0aW1lckF1dG9TY3JvbGwKKyAqIAorICogU3BlY2lmaWVzIGlmIGF1dG9zY3JvbGxpbmcgc2hvdWxkIGJlIGNhcnJpZWQgb3V0IHZpYSBteFBhbm5pbmdNYW5hZ2VyIGV2ZW4KKyAqIGlmIHRoZSBjb250YWluZXIgaGFzIHNjcm9sbGJhcnMuIFRoaXMgZGlzYWJsZXMgPHNjcm9sbFBvaW50VG9WaXNpYmxlPiBhbmQKKyAqIHVzZXMgPG14UGFubmluZ01hbmFnZXI+IGluc3RlYWQuIElmIHRoaXMgaXMgdHJ1ZSB0aGVuIDxhdXRvRXh0ZW5kPiBpcworICogZGlzYWJsZWQuIEl0IHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBhIHNjcm9sbCBidWZmZXIgb3Igd2hlbiBzY29sbGJhcnMKKyAqIGFyZSB2aXNpYmxlIGFuZCBzY3JvbGxhYmxlIGluIGFsbCBkaXJlY3Rpb25zLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteEdyYXBoLnByb3RvdHlwZS50aW1lckF1dG9TY3JvbGwgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogYWxsb3dBdXRvUGFubmluZworICogCisgKiBTcGVjaWZpZXMgaWYgcGFubmluZyB2aWEgPHBhbkdyYXBoPiBzaG91bGQgYmUgYWxsb3dlZCB0byBpbXBsZW1lbnQgYXV0b3Njcm9sbAorICogaWYgbm8gc2Nyb2xsYmFycyBhcmUgYXZhaWxhYmxlIGluIDxzY3JvbGxQb2ludFRvVmlzaWJsZT4uIFRvIGVuYWJsZSBwYW5uaW5nCisgKiBpbnNpZGUgdGhlIGNvbnRhaW5lciwgbmVhciB0aGUgZWRnZSwgc2V0IDxteFBhbm5pbmdNYW5hZ2VyLmJvcmRlcj4gdG8gYQorICogcG9zaXRpdmUgdmFsdWUuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmFsbG93QXV0b1Bhbm5pbmcgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogYXV0b0V4dGVuZAorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIHNpemUgb2YgdGhlIGdyYXBoIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGV4dGVuZGVkIGlmIHRoZQorICogbW91c2UgZ29lcyBuZWFyIHRoZSBjb250YWluZXIgZWRnZSB3aGlsZSBkcmFnZ2luZy4gVGhpcyBpcyBvbmx5IHRha2VuIGludG8KKyAqIGFjY291bnQgaWYgdGhlIGNvbnRhaW5lciBoYXMgc2Nyb2xsYmFycy4gRGVmYXVsdCBpcyB0cnVlLiBTZWUgPGF1dG9TY3JvbGw+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5hdXRvRXh0ZW5kID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogbWF4aW11bUdyYXBoQm91bmRzCisgKiAKKyAqIDxteFJlY3RhbmdsZT4gdGhhdCBzcGVjaWZpZXMgdGhlIGFyZWEgaW4gd2hpY2ggYWxsIGNlbGxzIGluIHRoZSBkaWFncmFtCisgKiBzaG91bGQgYmUgcGxhY2VkLiBVc2VzIGluIDxnZXRNYXhpbXVtR3JhcGhCb3VuZHM+LiBVc2UgYSB3aWR0aCBvciBoZWlnaHQgb2YKKyAqIDAgaWYgeW91IG9ubHkgd2FudCB0byBnaXZlIGEgdXBwZXIsIGxlZnQgY29ybmVyLgorICovCitteEdyYXBoLnByb3RvdHlwZS5tYXhpbXVtR3JhcGhCb3VuZHMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBtaW5pbXVtR3JhcGhTaXplCisgKiAKKyAqIDxteFJlY3RhbmdsZT4gdGhhdCBzcGVjaWZpZXMgdGhlIG1pbmltdW0gc2l6ZSBvZiB0aGUgZ3JhcGguIFRoaXMgaXMgaWdub3JlZAorICogaWYgdGhlIGdyYXBoIGNvbnRhaW5lciBoYXMgbm8gc2Nyb2xsYmFycy4gRGVmYXVsdCBpcyBudWxsLgorICovCitteEdyYXBoLnByb3RvdHlwZS5taW5pbXVtR3JhcGhTaXplID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbWluaW11bUNvbnRhaW5lclNpemUKKyAqIAorICogPG14UmVjdGFuZ2xlPiB0aGF0IHNwZWNpZmllcyB0aGUgbWluaW11bSBzaXplIG9mIHRoZSA8Y29udGFpbmVyPiBpZgorICogPHJlc2l6ZUNvbnRhaW5lcj4gaXMgdHJ1ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUubWluaW11bUNvbnRhaW5lclNpemUgPSBudWxsOworCQkKKy8qKgorICogVmFyaWFibGU6IG1heGltdW1Db250YWluZXJTaXplCisgKiAKKyAqIDxteFJlY3RhbmdsZT4gdGhhdCBzcGVjaWZpZXMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY29udGFpbmVyIGlmCisgKiA8cmVzaXplQ29udGFpbmVyPiBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5tYXhpbXVtQ29udGFpbmVyU2l6ZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHJlc2l6ZUNvbnRhaW5lcgorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIGNvbnRhaW5lciBzaG91bGQgYmUgcmVzaXplZCB0byB0aGUgZ3JhcGggc2l6ZSB3aGVuCisgKiB0aGUgZ3JhcGggc2l6ZSBoYXMgY2hhbmdlZC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUucmVzaXplQ29udGFpbmVyID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGJvcmRlcgorICogCisgKiBCb3JkZXIgdG8gYmUgYWRkZWQgdG8gdGhlIGJvdHRvbSBhbmQgcmlnaHQgc2lkZSB3aGVuIHRoZSBjb250YWluZXIgaXMKKyAqIGJlaW5nIHJlc2l6ZWQgYWZ0ZXIgdGhlIGdyYXBoIGhhcyBiZWVuIGNoYW5nZWQuIERlZmF1bHQgaXMgMC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuYm9yZGVyID0gMDsKKwkJCisvKioKKyAqIFZhcmlhYmxlOiBrZWVwRWRnZXNJbkZvcmVncm91bmQKKyAqIAorICogU3BlY2lmaWVzIGlmIGVkZ2VzIHNob3VsZCBhcHBlYXIgaW4gdGhlIGZvcmVncm91bmQgcmVnYXJkbGVzcyBvZiB0aGVpciBvcmRlcgorICogaW4gdGhlIG1vZGVsLiBJZiA8a2VlcEVkZ2VzSW5Gb3JlZ3JvdW5kPiBhbmQgPGtlZXBFZGdlc0luQmFja2dyb3VuZD4gYXJlCisgKiBib3RoIHRydWUgdGhlbiB0aGUgbm9ybWFsIG9yZGVyIGlzIGFwcGxpZWQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmtlZXBFZGdlc0luRm9yZWdyb3VuZCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBrZWVwRWRnZXNJbkJhY2tncm91bmQKKyAqIAorICogU3BlY2lmaWVzIGlmIGVkZ2VzIHNob3VsZCBhcHBlYXIgaW4gdGhlIGJhY2tncm91bmQgcmVnYXJkbGVzcyBvZiB0aGVpciBvcmRlcgorICogaW4gdGhlIG1vZGVsLiBJZiA8a2VlcEVkZ2VzSW5Gb3JlZ3JvdW5kPiBhbmQgPGtlZXBFZGdlc0luQmFja2dyb3VuZD4gYXJlCisgKiBib3RoIHRydWUgdGhlbiB0aGUgbm9ybWFsIG9yZGVyIGlzIGFwcGxpZWQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmtlZXBFZGdlc0luQmFja2dyb3VuZCA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBhbGxvd05lZ2F0aXZlQ29vcmRpbmF0ZXMKKyAqIAorICogU3BlY2lmaWVzIGlmIG5lZ2F0aXZlIGNvb3JkaW5hdGVzIGZvciB2ZXJ0aWNlcyBhcmUgYWxsb3dlZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5hbGxvd05lZ2F0aXZlQ29vcmRpbmF0ZXMgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBjb25zdHJhaW5DaGlsZHJlbgorICogCisgKiBTcGVjaWZpZXMgaWYgYSBjaGlsZCBzaG91bGQgYmUgY29uc3RyYWluZWQgaW5zaWRlIHRoZSBwYXJlbnQgYm91bmRzIGFmdGVyIGEKKyAqIG1vdmUgb3IgcmVzaXplIG9mIHRoZSBjaGlsZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jb25zdHJhaW5DaGlsZHJlbiA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGNvbnN0cmFpblJlbGF0aXZlQ2hpbGRyZW4KKyAqIAorICogU3BlY2lmaWVzIGlmIGNoaWxkIGNlbGxzIHdpdGggcmVsYXRpdmUgZ2VvbWV0cmllcyBzaG91bGQgYmUgY29uc3RyYWluZWQKKyAqIGluc2lkZSB0aGUgcGFyZW50IGJvdW5kcywgaWYgPGNvbnN0cmFpbkNoaWxkcmVuPiBpcyB0cnVlLCBhbmQvb3IgdGhlCisgKiA8bWF4aW11bUdyYXBoQm91bmRzPi4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY29uc3RyYWluUmVsYXRpdmVDaGlsZHJlbiA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBleHRlbmRQYXJlbnRzCisgKiAKKyAqIFNwZWNpZmllcyBpZiBhIHBhcmVudCBzaG91bGQgY29udGFpbiB0aGUgY2hpbGQgYm91bmRzIGFmdGVyIGEgcmVzaXplIG9mCisgKiB0aGUgY2hpbGQuIERlZmF1bHQgaXMgdHJ1ZS4gVGhpcyBoYXMgcHJlY2VkZW5jZSBvdmVyIDxjb25zdHJhaW5DaGlsZHJlbj4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmV4dGVuZFBhcmVudHMgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBleHRlbmRQYXJlbnRzT25BZGQKKyAqIAorICogU3BlY2lmaWVzIGlmIHBhcmVudHMgc2hvdWxkIGJlIGV4dGVuZGVkIGFjY29yZGluZyB0byB0aGUgPGV4dGVuZFBhcmVudHM+CisgKiBzd2l0Y2ggaWYgY2VsbHMgYXJlIGFkZGVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmV4dGVuZFBhcmVudHNPbkFkZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGV4dGVuZFBhcmVudHNPbkFkZAorICogCisgKiBTcGVjaWZpZXMgaWYgcGFyZW50cyBzaG91bGQgYmUgZXh0ZW5kZWQgYWNjb3JkaW5nIHRvIHRoZSA8ZXh0ZW5kUGFyZW50cz4KKyAqIHN3aXRjaCBpZiBjZWxscyBhcmUgYWRkZWQuIERlZmF1bHQgaXMgZmFsc2UgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmxpdHkuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmV4dGVuZFBhcmVudHNPbk1vdmUgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogcmVjdXJzaXZlUmVzaXplCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgcmV0dXJuIHZhbHVlIGZvciA8aXNSZWN1cnNpdmVSZXNpemU+LiBEZWZhdWx0IGlzCisgKiBmYWxzZSBmb3IgYmFja3dhcmRzIGNvbXBhdGlibGl0eS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUucmVjdXJzaXZlUmVzaXplID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGNvbGxhcHNlVG9QcmVmZXJyZWRTaXplCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgY2VsbCBzaXplIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHRoZSBwcmVmZXJyZWQgc2l6ZSB3aGVuCisgKiBhIGNlbGwgaXMgZmlyc3QgY29sbGFwc2VkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNvbGxhcHNlVG9QcmVmZXJyZWRTaXplID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogem9vbUZhY3RvcgorICogCisgKiBTcGVjaWZpZXMgdGhlIGZhY3RvciB1c2VkIGZvciA8em9vbUluPiBhbmQgPHpvb21PdXQ+LiBEZWZhdWx0IGlzIDEuMgorICogKDEyMCUpLgorICovCitteEdyYXBoLnByb3RvdHlwZS56b29tRmFjdG9yID0gMS4yOworCisvKioKKyAqIFZhcmlhYmxlOiBrZWVwU2VsZWN0aW9uVmlzaWJsZU9uWm9vbQorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIHZpZXdwb3J0IHNob3VsZCBhdXRvbWF0aWNhbGx5IGNvbnRhaW4gdGhlIHNlbGVjdGlvbiBjZWxscworICogYWZ0ZXIgYSB6b29tIG9wZXJhdGlvbi4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUua2VlcFNlbGVjdGlvblZpc2libGVPblpvb20gPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogY2VudGVyWm9vbQorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIHpvb20gb3BlcmF0aW9ucyBzaG91bGQgZ28gaW50byB0aGUgY2VudGVyIG9mIHRoZSBhY3R1YWwKKyAqIGRpYWdyYW0gcmF0aGVyIHRoYW4gZ29pbmcgZnJvbSB0b3AsIGxlZnQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY2VudGVyWm9vbSA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHJlc2V0Vmlld09uUm9vdENoYW5nZQorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIHNjYWxlIGFuZCB0cmFuc2xhdGUgc2hvdWxkIGJlIHJlc2V0IGlmIHRoZSByb290IGNoYW5nZXMgaW4KKyAqIHRoZSBtb2RlbC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5yZXNldFZpZXdPblJvb3RDaGFuZ2UgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiByZXNldEVkZ2VzT25SZXNpemUKKyAqIAorICogU3BlY2lmaWVzIGlmIGVkZ2UgY29udHJvbCBwb2ludHMgc2hvdWxkIGJlIHJlc2V0IGFmdGVyIHRoZSByZXNpemUgb2YgYQorICogY29ubmVjdGVkIGNlbGwuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnJlc2V0RWRnZXNPblJlc2l6ZSA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiByZXNldEVkZ2VzT25Nb3ZlCisgKiAKKyAqIFNwZWNpZmllcyBpZiBlZGdlIGNvbnRyb2wgcG9pbnRzIHNob3VsZCBiZSByZXNldCBhZnRlciB0aGUgbW92ZSBvZiBhCisgKiBjb25uZWN0ZWQgY2VsbC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUucmVzZXRFZGdlc09uTW92ZSA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiByZXNldEVkZ2VzT25Db25uZWN0CisgKiAKKyAqIFNwZWNpZmllcyBpZiBlZGdlIGNvbnRyb2wgcG9pbnRzIHNob3VsZCBiZSByZXNldCBhZnRlciB0aGUgdGhlIGVkZ2UgaGFzIGJlZW4KKyAqIHJlY29ubmVjdGVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnJlc2V0RWRnZXNPbkNvbm5lY3QgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBhbGxvd0xvb3BzCisgKiAKKyAqIFNwZWNpZmllcyBpZiBsb29wcyAoYWthIHNlbGYtcmVmZXJlbmNlcykgYXJlIGFsbG93ZWQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmFsbG93TG9vcHMgPSBmYWxzZTsKKwkKKy8qKgorICogVmFyaWFibGU6IGRlZmF1bHRMb29wU3R5bGUKKyAqIAorICogPG14RWRnZVN0eWxlPiB0byBiZSB1c2VkIGZvciBsb29wcy4gVGhpcyBpcyBhIGZhbGxiYWNrIGZvciBsb29wcyBpZiB0aGUKKyAqIDxteENvbnN0YW50cy5TVFlMRV9MT09QPiBpcyB1bmRlZmluZWQuIERlZmF1bHQgaXMgPG14RWRnZVN0eWxlLkxvb3A+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5kZWZhdWx0TG9vcFN0eWxlID0gbXhFZGdlU3R5bGUuTG9vcDsKKworLyoqCisgKiBWYXJpYWJsZTogbXVsdGlncmFwaAorICogCisgKiBTcGVjaWZpZXMgaWYgbXVsdGlwbGUgZWRnZXMgaW4gdGhlIHNhbWUgZGlyZWN0aW9uIGJldHdlZW4gdGhlIHNhbWUgcGFpciBvZgorICogdmVydGljZXMgYXJlIGFsbG93ZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUubXVsdGlncmFwaCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGNvbm5lY3RhYmxlRWRnZXMKKyAqIAorICogU3BlY2lmaWVzIGlmIGVkZ2VzIGFyZSBjb25uZWN0YWJsZS4gRGVmYXVsdCBpcyBmYWxzZS4gVGhpcyBvdmVycmlkZXMgdGhlCisgKiBjb25uZWN0YWJsZSBmaWVsZCBpbiBlZGdlcy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY29ubmVjdGFibGVFZGdlcyA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBhbGxvd0RhbmdsaW5nRWRnZXMKKyAqIAorICogU3BlY2lmaWVzIGlmIGVkZ2VzIHdpdGggZGlzY29ubmVjdGVkIHRlcm1pbmFscyBhcmUgYWxsb3dlZCBpbiB0aGUgZ3JhcGguCisgKiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmFsbG93RGFuZ2xpbmdFZGdlcyA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGNsb25lSW52YWxpZEVkZ2VzCisgKiAKKyAqIFNwZWNpZmllcyBpZiBlZGdlcyB0aGF0IGFyZSBjbG9uZWQgc2hvdWxkIGJlIHZhbGlkYXRlZCBhbmQgb25seSBpbnNlcnRlZAorICogaWYgdGhleSBhcmUgdmFsaWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY2xvbmVJbnZhbGlkRWRnZXMgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogZGlzY29ubmVjdE9uTW92ZQorICogCisgKiBTcGVjaWZpZXMgaWYgZWRnZXMgc2hvdWxkIGJlIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZWlyIHRlcm1pbmFscyB3aGVuIHRoZXkKKyAqIGFyZSBtb3ZlZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5kaXNjb25uZWN0T25Nb3ZlID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogbGFiZWxzVmlzaWJsZQorICogCisgKiBTcGVjaWZpZXMgaWYgbGFiZWxzIHNob3VsZCBiZSB2aXNpYmxlLiBUaGlzIGlzIHVzZWQgaW4gPGdldExhYmVsPi4gRGVmYXVsdAorICogaXMgdHJ1ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUubGFiZWxzVmlzaWJsZSA9IHRydWU7CisJCisvKioKKyAqIFZhcmlhYmxlOiBodG1sTGFiZWxzCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgcmV0dXJuIHZhbHVlIGZvciA8aXNIdG1sTGFiZWw+LiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5odG1sTGFiZWxzID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHN3aW1sYW5lU2VsZWN0aW9uRW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgc3dpbWxhbmVzIHNob3VsZCBiZSBzZWxlY3RhYmxlIHZpYSB0aGUgY29udGVudCBpZiB0aGUKKyAqIG1vdXNlIGlzIHJlbGVhc2VkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnN3aW1sYW5lU2VsZWN0aW9uRW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHN3aW1sYW5lTmVzdGluZworICogCisgKiBTcGVjaWZpZXMgaWYgbmVzdGluZyBvZiBzd2ltbGFuZXMgaXMgYWxsb3dlZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zd2ltbGFuZU5lc3RpbmcgPSB0cnVlOworCQorLyoqCisgKiBWYXJpYWJsZTogc3dpbWxhbmVJbmRpY2F0b3JDb2xvckF0dHJpYnV0ZQorICogCisgKiBUaGUgYXR0cmlidXRlIHVzZWQgdG8gZmluZCB0aGUgY29sb3IgZm9yIHRoZSBpbmRpY2F0b3IgaWYgdGhlIGluZGljYXRvcgorICogY29sb3IgaXMgc2V0IHRvICdzd2ltbGFuZScuIERlZmF1bHQgaXMgPG14Q29uc3RhbnRzLlNUWUxFX0ZJTExDT0xPUj4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLnN3aW1sYW5lSW5kaWNhdG9yQ29sb3JBdHRyaWJ1dGUgPSBteENvbnN0YW50cy5TVFlMRV9GSUxMQ09MT1I7CisKKy8qKgorICogVmFyaWFibGU6IGltYWdlQnVuZGxlcworICogCisgKiBIb2xkcyB0aGUgbGlzdCBvZiBpbWFnZSBidW5kbGVzLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pbWFnZUJ1bmRsZXMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBtaW5GaXRTY2FsZQorICogCisgKiBTcGVjaWZpZXMgdGhlIG1pbmltdW0gc2NhbGUgdG8gYmUgYXBwbGllZCBpbiA8Zml0Pi4gRGVmYXVsdCBpcyAwLjEuIFNldCB0aGlzCisgKiB0byBudWxsIHRvIGFsbG93IGFueSB2YWx1ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUubWluRml0U2NhbGUgPSAwLjE7CisKKy8qKgorICogVmFyaWFibGU6IG1heEZpdFNjYWxlCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgbWF4aW11bSBzY2FsZSB0byBiZSBhcHBsaWVkIGluIDxmaXQ+LiBEZWZhdWx0IGlzIDguIFNldCB0aGlzCisgKiB0byBudWxsIHRvIGFsbG93IGFueSB2YWx1ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUubWF4Rml0U2NhbGUgPSA4OworCisvKioKKyAqIFZhcmlhYmxlOiBwYW5EeAorICogCisgKiBDdXJyZW50IGhvcml6b250YWwgcGFubmluZyB2YWx1ZS4gRGVmYXVsdCBpcyAwLgorICovCitteEdyYXBoLnByb3RvdHlwZS5wYW5EeCA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IHBhbkR5CisgKiAKKyAqIEN1cnJlbnQgdmVydGljYWwgcGFubmluZyB2YWx1ZS4gRGVmYXVsdCBpcyAwLgorICovCitteEdyYXBoLnByb3RvdHlwZS5wYW5EeSA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IGNvbGxhcHNlZEltYWdlCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgPG14SW1hZ2U+IHRvIGluZGljYXRlIGEgY29sbGFwc2VkIHN0YXRlLgorICogRGVmYXVsdCB2YWx1ZSBpcyBteENsaWVudC5pbWFnZUJhc2VQYXRoICsgJy9jb2xsYXBzZWQuZ2lmJworICovCitteEdyYXBoLnByb3RvdHlwZS5jb2xsYXBzZWRJbWFnZSA9IG5ldyBteEltYWdlKG14Q2xpZW50LmltYWdlQmFzZVBhdGggKyAnL2NvbGxhcHNlZC5naWYnLCA5LCA5KTsKKworLyoqCisgKiBWYXJpYWJsZTogZXhwYW5kZWRJbWFnZQorICogCisgKiBTcGVjaWZpZXMgdGhlIDxteEltYWdlPiB0byBpbmRpY2F0ZSBhIGV4cGFuZGVkIHN0YXRlLgorICogRGVmYXVsdCB2YWx1ZSBpcyBteENsaWVudC5pbWFnZUJhc2VQYXRoICsgJy9leHBhbmRlZC5naWYnCisgKi8KK214R3JhcGgucHJvdG90eXBlLmV4cGFuZGVkSW1hZ2UgPSBuZXcgbXhJbWFnZShteENsaWVudC5pbWFnZUJhc2VQYXRoICsgJy9leHBhbmRlZC5naWYnLCA5LCA5KTsKKworLyoqCisgKiBWYXJpYWJsZTogd2FybmluZ0ltYWdlCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgPG14SW1hZ2U+IGZvciB0aGUgaW1hZ2UgdG8gYmUgdXNlZCB0byBkaXNwbGF5IGEgd2FybmluZworICogb3ZlcmxheS4gU2VlIDxzZXRDZWxsV2FybmluZz4uIERlZmF1bHQgdmFsdWUgaXMgbXhDbGllbnQuaW1hZ2VCYXNlUGF0aCArCisgKiAnL3dhcm5pbmcnLiAgVGhlIGV4dGVuc2lvbiBmb3IgdGhlIGltYWdlIGRlcGVuZHMgb24gdGhlIHBsYXRmb3JtLiBJdCBpcworICogJy5wbmcnIG9uIHRoZSBNYWMgYW5kICcuZ2lmJyBvbiBhbGwgb3RoZXIgcGxhdGZvcm1zLgorICovCitteEdyYXBoLnByb3RvdHlwZS53YXJuaW5nSW1hZ2UgPSBuZXcgbXhJbWFnZShteENsaWVudC5pbWFnZUJhc2VQYXRoICsgJy93YXJuaW5nJysKKwkoKG14Q2xpZW50LklTX01BQykgPyAnLnBuZycgOiAnLmdpZicpLCAxNiwgMTYpOworCisvKioKKyAqIFZhcmlhYmxlOiBhbHJlYWR5Q29ubmVjdGVkUmVzb3VyY2UKKyAqIAorICogU3BlY2lmaWVzIHRoZSByZXNvdXJjZSBrZXkgZm9yIHRoZSBlcnJvciBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZCBpbgorICogbm9uLW11bHRpZ3JhcGhzIHdoZW4gdHdvIHZlcnRpY2VzIGFyZSBhbHJlYWR5IGNvbm5lY3RlZC4gSWYgdGhlIHJlc291cmNlCisgKiBmb3IgdGhpcyBrZXkgZG9lcyBub3QgZXhpc3QgdGhlbiB0aGUgdmFsdWUgaXMgdXNlZCBhcyB0aGUgZXJyb3IgbWVzc2FnZS4KKyAqIERlZmF1bHQgaXMgJ2FscmVhZHlDb25uZWN0ZWQnLgorICovCitteEdyYXBoLnByb3RvdHlwZS5hbHJlYWR5Q29ubmVjdGVkUmVzb3VyY2UgPSAobXhDbGllbnQubGFuZ3VhZ2UgIT0gJ25vbmUnKSA/ICdhbHJlYWR5Q29ubmVjdGVkJyA6ICcnOworCisvKioKKyAqIFZhcmlhYmxlOiBjb250YWluc1ZhbGlkYXRpb25FcnJvcnNSZXNvdXJjZQorICogCisgKiBTcGVjaWZpZXMgdGhlIHJlc291cmNlIGtleSBmb3IgdGhlIHdhcm5pbmcgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgd2hlbgorICogYSBjb2xsYXBzZWQgY2VsbCBjb250YWlucyB2YWxpZGF0aW9uIGVycm9ycy4gSWYgdGhlIHJlc291cmNlIGZvciB0aGlzCisgKiBrZXkgZG9lcyBub3QgZXhpc3QgdGhlbiB0aGUgdmFsdWUgaXMgdXNlZCBhcyB0aGUgd2FybmluZyBtZXNzYWdlLgorICogRGVmYXVsdCBpcyAnY29udGFpbnNWYWxpZGF0aW9uRXJyb3JzJy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY29udGFpbnNWYWxpZGF0aW9uRXJyb3JzUmVzb3VyY2UgPSAobXhDbGllbnQubGFuZ3VhZ2UgIT0gJ25vbmUnKSA/ICdjb250YWluc1ZhbGlkYXRpb25FcnJvcnMnIDogJyc7CisKKy8qKgorICogVmFyaWFibGU6IGNvbGxhcHNlRXhwYW5kUmVzb3VyY2UKKyAqIAorICogU3BlY2lmaWVzIHRoZSByZXNvdXJjZSBrZXkgZm9yIHRoZSB0b29sdGlwIG9uIHRoZSBjb2xsYXBzZS9leHBhbmQgaWNvbi4KKyAqIElmIHRoZSByZXNvdXJjZSBmb3IgdGhpcyBrZXkgZG9lcyBub3QgZXhpc3QgdGhlbiB0aGUgdmFsdWUgaXMgdXNlZCBhcworICogdGhlIHRvb2x0aXAuIERlZmF1bHQgaXMgJ2NvbGxhcHNlLWV4cGFuZCcuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNvbGxhcHNlRXhwYW5kUmVzb3VyY2UgPSAobXhDbGllbnQubGFuZ3VhZ2UgIT0gJ25vbmUnKSA/ICdjb2xsYXBzZS1leHBhbmQnIDogJyc7CisKKy8qKgorICogRnVuY3Rpb246IGluaXQKKyAqIAorICogSW5pdGlhbGl6ZXMgdGhlIDxjb250YWluZXI+IGFuZCBjcmVhdGVzIHRoZSByZXNwZWN0aXZlIGRhdGFzdHJ1Y3R1cmVzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjb250YWluZXIgLSBET00gbm9kZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgZ3JhcGggZGlzcGxheS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKGNvbnRhaW5lcikKK3sKKwl0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKwkKKwkvLyBJbml0aWFsaXplcyB0aGUgaW4tcGxhY2UgZWRpdG9yCisJdGhpcy5jZWxsRWRpdG9yID0gdGhpcy5jcmVhdGVDZWxsRWRpdG9yKCk7CQorCisJLy8gSW5pdGlhbGl6ZXMgdGhlIGNvbnRhaW5lciB1c2luZyB0aGUgdmlldworCXRoaXMudmlldy5pbml0KCk7CisJCisJLy8gVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyIGZvciB0aGUgY3VycmVudCBncmFwaAorCXRoaXMuc2l6ZURpZENoYW5nZSgpOworCQorCS8vIEhpZGVzIHRvb2x0aXBzIGFuZCByZXNldHMgdG9vbHRpcCB0aW1lciBpZiBtb3VzZSBsZWF2ZXMgY29udGFpbmVyCisJbXhFdmVudC5hZGRMaXN0ZW5lcihjb250YWluZXIsICdtb3VzZWxlYXZlJywgbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKCkKKwl7CisJCWlmICh0aGlzLnRvb2x0aXBIYW5kbGVyICE9IG51bGwpCisJCXsKKwkJCXRoaXMudG9vbHRpcEhhbmRsZXIuaGlkZSgpOworCQl9CisJfSkpOworCisJLy8gQXV0b21hdGljIGRlYWxsb2NhdGlvbiBvZiBtZW1vcnkKKwlpZiAobXhDbGllbnQuSVNfSUUpCisJeworCQlteEV2ZW50LmFkZExpc3RlbmVyKHdpbmRvdywgJ3VubG9hZCcsIG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbigpCisJCXsKKwkJCXRoaXMuZGVzdHJveSgpOworCQl9KSk7CisJCQorCQkvLyBEaXNhYmxlIHNoaWZ0LWNsaWNrIGZvciB0ZXh0CisJCW14RXZlbnQuYWRkTGlzdGVuZXIoY29udGFpbmVyLCAnc2VsZWN0c3RhcnQnLAorCQkJbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwkJCXsKKwkJCQlyZXR1cm4gdGhpcy5pc0VkaXRpbmcoKSB8fCAoIXRoaXMuaXNNb3VzZURvd24gJiYgIW14RXZlbnQuaXNTaGlmdERvd24oZXZ0KSk7CisJCQl9KQorCQkpOworCX0KKwkKKwkvLyBXb3JrYXJvdW5kIGZvciBtaXNzaW5nIGxhc3Qgc2hhcGUgYW5kIGNvbm5lY3QgcHJldmlldyBpbiBJRTggc3RhbmRhcmRzCisJLy8gbW9kZSBpZiBubyBpbml0aWFsIGdyYXBoIGRpc3BsYXllZCBvciBubyBsYWJlbCBmb3Igc2hhcGUgZGVmaW5lZAorCWlmIChkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gOCkKKwl7CisJCWNvbnRhaW5lci5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsICc8JyArIG14Q2xpZW50LlZNTF9QUkVGSVggKyAnOmdyb3VwJyArCisJCQknIHN0eWxlPSJESVNQTEFZOiBub25lOyI+PC8nICsgbXhDbGllbnQuVk1MX1BSRUZJWCArICc6Z3JvdXA+Jyk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlSGFuZGxlcnMKKyAqIAorICogQ3JlYXRlcyB0aGUgdG9vbHRpcC0sIHBhbm5pbmctLCBjb25uZWN0aW9uLSBhbmQgZ3JhcGgtaGFuZGxlciAoaW4gdGhpcworICogb3JkZXIpLiBUaGlzIGlzIGNhbGxlZCBpbiB0aGUgY29uc3RydWN0b3IgYmVmb3JlIDxpbml0PiBpcyBjYWxsZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNyZWF0ZUhhbmRsZXJzID0gZnVuY3Rpb24oKQoreworCXRoaXMudG9vbHRpcEhhbmRsZXIgPSB0aGlzLmNyZWF0ZVRvb2x0aXBIYW5kbGVyKCk7CisJdGhpcy50b29sdGlwSGFuZGxlci5zZXRFbmFibGVkKGZhbHNlKTsKKwl0aGlzLnNlbGVjdGlvbkNlbGxzSGFuZGxlciA9IHRoaXMuY3JlYXRlU2VsZWN0aW9uQ2VsbHNIYW5kbGVyKCk7CisJdGhpcy5jb25uZWN0aW9uSGFuZGxlciA9IHRoaXMuY3JlYXRlQ29ubmVjdGlvbkhhbmRsZXIoKTsKKwl0aGlzLmNvbm5lY3Rpb25IYW5kbGVyLnNldEVuYWJsZWQoZmFsc2UpOworCXRoaXMuZ3JhcGhIYW5kbGVyID0gdGhpcy5jcmVhdGVHcmFwaEhhbmRsZXIoKTsKKwl0aGlzLnBhbm5pbmdIYW5kbGVyID0gdGhpcy5jcmVhdGVQYW5uaW5nSGFuZGxlcigpOworCXRoaXMucGFubmluZ0hhbmRsZXIucGFubmluZ0VuYWJsZWQgPSBmYWxzZTsKKwl0aGlzLnBvcHVwTWVudUhhbmRsZXIgPSB0aGlzLmNyZWF0ZVBvcHVwTWVudUhhbmRsZXIoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVRvb2x0aXBIYW5kbGVyCisgKiAKKyAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgPG14VG9vbHRpcEhhbmRsZXI+IHRvIGJlIHVzZWQgaW4gdGhpcyBncmFwaC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY3JlYXRlVG9vbHRpcEhhbmRsZXIgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIG5ldyBteFRvb2x0aXBIYW5kbGVyKHRoaXMpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlU2VsZWN0aW9uQ2VsbHNIYW5kbGVyCisgKiAKKyAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgPG14VG9vbHRpcEhhbmRsZXI+IHRvIGJlIHVzZWQgaW4gdGhpcyBncmFwaC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY3JlYXRlU2VsZWN0aW9uQ2VsbHNIYW5kbGVyID0gZnVuY3Rpb24oKQoreworCXJldHVybiBuZXcgbXhTZWxlY3Rpb25DZWxsc0hhbmRsZXIodGhpcyk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVDb25uZWN0aW9uSGFuZGxlcgorICogCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IDxteENvbm5lY3Rpb25IYW5kbGVyPiB0byBiZSB1c2VkIGluIHRoaXMgZ3JhcGguCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNyZWF0ZUNvbm5lY3Rpb25IYW5kbGVyID0gZnVuY3Rpb24oKQoreworCXJldHVybiBuZXcgbXhDb25uZWN0aW9uSGFuZGxlcih0aGlzKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUdyYXBoSGFuZGxlcgorICogCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IDxteEdyYXBoSGFuZGxlcj4gdG8gYmUgdXNlZCBpbiB0aGlzIGdyYXBoLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jcmVhdGVHcmFwaEhhbmRsZXIgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIG5ldyBteEdyYXBoSGFuZGxlcih0aGlzKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVBhbm5pbmdIYW5kbGVyCisgKiAKKyAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgPG14UGFubmluZ0hhbmRsZXI+IHRvIGJlIHVzZWQgaW4gdGhpcyBncmFwaC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY3JlYXRlUGFubmluZ0hhbmRsZXIgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIG5ldyBteFBhbm5pbmdIYW5kbGVyKHRoaXMpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlUG9wdXBNZW51SGFuZGxlcgorICogCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IDxteFBvcHVwTWVudUhhbmRsZXI+IHRvIGJlIHVzZWQgaW4gdGhpcyBncmFwaC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY3JlYXRlUG9wdXBNZW51SGFuZGxlciA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gbmV3IG14UG9wdXBNZW51SGFuZGxlcih0aGlzKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVNlbGVjdGlvbk1vZGVsCisgKiAKKyAqIENyZWF0ZXMgYSBuZXcgPG14R3JhcGhTZWxlY3Rpb25Nb2RlbD4gdG8gYmUgdXNlZCBpbiB0aGlzIGdyYXBoLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jcmVhdGVTZWxlY3Rpb25Nb2RlbCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gbmV3IG14R3JhcGhTZWxlY3Rpb25Nb2RlbCh0aGlzKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVN0eWxlc2hlZXQKKyAqIAorICogQ3JlYXRlcyBhIG5ldyA8bXhHcmFwaFNlbGVjdGlvbk1vZGVsPiB0byBiZSB1c2VkIGluIHRoaXMgZ3JhcGguCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNyZWF0ZVN0eWxlc2hlZXQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIG5ldyBteFN0eWxlc2hlZXQoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUdyYXBoVmlldworICogCisgKiBDcmVhdGVzIGEgbmV3IDxteEdyYXBoVmlldz4gdG8gYmUgdXNlZCBpbiB0aGlzIGdyYXBoLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jcmVhdGVHcmFwaFZpZXcgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIG5ldyBteEdyYXBoVmlldyh0aGlzKTsKK307CisgCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVDZWxsUmVuZGVyZXIKKyAqIAorICogQ3JlYXRlcyBhIG5ldyA8bXhDZWxsUmVuZGVyZXI+IHRvIGJlIHVzZWQgaW4gdGhpcyBncmFwaC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY3JlYXRlQ2VsbFJlbmRlcmVyID0gZnVuY3Rpb24oKQoreworCXJldHVybiBuZXcgbXhDZWxsUmVuZGVyZXIoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUNlbGxFZGl0b3IKKyAqIAorICogQ3JlYXRlcyBhIG5ldyA8bXhDZWxsRWRpdG9yPiB0byBiZSB1c2VkIGluIHRoaXMgZ3JhcGguCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNyZWF0ZUNlbGxFZGl0b3IgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIG5ldyBteENlbGxFZGl0b3IodGhpcyk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRNb2RlbAorICogCisgKiBSZXR1cm5zIHRoZSA8bXhHcmFwaE1vZGVsPiB0aGF0IGNvbnRhaW5zIHRoZSBjZWxscy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0TW9kZWwgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMubW9kZWw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRWaWV3CisgKiAKKyAqIFJldHVybnMgdGhlIDxteEdyYXBoVmlldz4gdGhhdCBjb250YWlucyB0aGUgPG14Q2VsbFN0YXRlcz4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldFZpZXcgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMudmlldzsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFN0eWxlc2hlZXQKKyAqIAorICogUmV0dXJucyB0aGUgPG14U3R5bGVzaGVldD4gdGhhdCBkZWZpbmVzIHRoZSBzdHlsZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0U3R5bGVzaGVldCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5zdHlsZXNoZWV0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0U3R5bGVzaGVldAorICogCisgKiBTZXRzIHRoZSA8bXhTdHlsZXNoZWV0PiB0aGF0IGRlZmluZXMgdGhlIHN0eWxlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZXRTdHlsZXNoZWV0ID0gZnVuY3Rpb24oc3R5bGVzaGVldCkKK3sKKwl0aGlzLnN0eWxlc2hlZXQgPSBzdHlsZXNoZWV0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0U2VsZWN0aW9uTW9kZWwKKyAqIAorICogUmV0dXJucyB0aGUgPG14R3JhcGhTZWxlY3Rpb25Nb2RlbD4gdGhhdCBjb250YWlucyB0aGUgc2VsZWN0aW9uLgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRTZWxlY3Rpb25Nb2RlbCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5zZWxlY3Rpb25Nb2RlbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFNlbGVjdGlvbk1vZGVsCisgKiAKKyAqIFNldHMgdGhlIDxteFNlbGVjdGlvbk1vZGVsPiB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3Rpb24uCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldFNlbGVjdGlvbk1vZGVsID0gZnVuY3Rpb24oc2VsZWN0aW9uTW9kZWwpCit7CisJdGhpcy5zZWxlY3Rpb25Nb2RlbCA9IHNlbGVjdGlvbk1vZGVsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0U2VsZWN0aW9uQ2VsbHNGb3JDaGFuZ2VzCisgKiAKKyAqIFJldHVybnMgdGhlIGNlbGxzIHRvIGJlIHNlbGVjdGVkIGZvciB0aGUgZ2l2ZW4gYXJyYXkgb2YgY2hhbmdlcy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uQ2VsbHNGb3JDaGFuZ2VzID0gZnVuY3Rpb24oY2hhbmdlcykKK3sKKwl2YXIgY2VsbHMgPSBbXTsKKwkKKwlmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspCisJeworCQl2YXIgY2hhbmdlID0gY2hhbmdlc1tpXTsKKwkJCisJCWlmIChjaGFuZ2UuY29uc3RydWN0b3IgIT0gbXhSb290Q2hhbmdlKQorCQl7CisJCQl2YXIgY2VsbCA9IG51bGw7CisKKwkJCWlmIChjaGFuZ2UgaW5zdGFuY2VvZiBteENoaWxkQ2hhbmdlICYmIGNoYW5nZS5wcmV2aW91cyA9PSBudWxsKQorCQkJeworCQkJCWNlbGwgPSBjaGFuZ2UuY2hpbGQ7CisJCQl9CisJCQllbHNlIGlmIChjaGFuZ2UuY2VsbCAhPSBudWxsICYmIGNoYW5nZS5jZWxsIGluc3RhbmNlb2YgbXhDZWxsKQorCQkJeworCQkJCWNlbGwgPSBjaGFuZ2UuY2VsbDsKKwkJCX0KKwkJCQorCQkJaWYgKGNlbGwgIT0gbnVsbCAmJiBteFV0aWxzLmluZGV4T2YoY2VsbHMsIGNlbGwpIDwgMCkKKwkJCXsKKwkJCQljZWxscy5wdXNoKGNlbGwpOworCQkJfQorCQl9CisJfQorCQorCXJldHVybiB0aGlzLmdldE1vZGVsKCkuZ2V0VG9wbW9zdENlbGxzKGNlbGxzKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdyYXBoTW9kZWxDaGFuZ2VkCisgKiAKKyAqIENhbGxlZCB3aGVuIHRoZSBncmFwaCBtb2RlbCBjaGFuZ2VzLiBJbnZva2VzIDxwcm9jZXNzQ2hhbmdlPiBvbiBlYWNoCisgKiBpdGVtIG9mIHRoZSBnaXZlbiBhcnJheSB0byB1cGRhdGUgdGhlIHZpZXcgYWNjb3JkaW5nbHkuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNoYW5nZXMgLSBBcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBpbmRpdmlkdWFsIGNoYW5nZXMuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdyYXBoTW9kZWxDaGFuZ2VkID0gZnVuY3Rpb24oY2hhbmdlcykKK3sKKwlmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspCisJeworCQl0aGlzLnByb2Nlc3NDaGFuZ2UoY2hhbmdlc1tpXSk7CisJfQorCQorCXRoaXMucmVtb3ZlU2VsZWN0aW9uQ2VsbHModGhpcy5nZXRSZW1vdmVkQ2VsbHNGb3JDaGFuZ2VzKGNoYW5nZXMpKTsKKwkKKwl0aGlzLnZpZXcudmFsaWRhdGUoKTsKKwl0aGlzLnNpemVEaWRDaGFuZ2UoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFJlbW92ZWRDZWxsc0ZvckNoYW5nZXMKKyAqIAorICogUmV0dXJucyB0aGUgY2VsbHMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtb2RlbC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0UmVtb3ZlZENlbGxzRm9yQ2hhbmdlcyA9IGZ1bmN0aW9uKGNoYW5nZXMpCit7CisJdmFyIHJlc3VsdCA9IFtdOworCQorCWZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykKKwl7CisJCXZhciBjaGFuZ2UgPSBjaGFuZ2VzW2ldOworCQkKKwkJLy8gUmVzZXRzIHRoZSB2aWV3IHNldHRpbmdzLCByZW1vdmVzIGFsbCBjZWxscyBhbmQgY2xlYXJzCisJCS8vIHRoZSBzZWxlY3Rpb24gaWYgdGhlIHJvb3QgY2hhbmdlcy4KKwkJaWYgKGNoYW5nZSBpbnN0YW5jZW9mIG14Um9vdENoYW5nZSkKKwkJeworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSBpZiAoY2hhbmdlIGluc3RhbmNlb2YgbXhDaGlsZENoYW5nZSkKKwkJeworCQkJaWYgKGNoYW5nZS5wcmV2aW91cyAhPSBudWxsICYmIGNoYW5nZS5wYXJlbnQgPT0gbnVsbCkKKwkJCXsKKwkJCQlyZXN1bHQgPSByZXN1bHQuY29uY2F0KHRoaXMubW9kZWwuZ2V0RGVzY2VuZGFudHMoY2hhbmdlLmNoaWxkKSk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoY2hhbmdlIGluc3RhbmNlb2YgbXhWaXNpYmxlQ2hhbmdlKQorCQl7CisJCQlyZXN1bHQgPSByZXN1bHQuY29uY2F0KHRoaXMubW9kZWwuZ2V0RGVzY2VuZGFudHMoY2hhbmdlLmNlbGwpKTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gcmVzdWx0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcHJvY2Vzc0NoYW5nZQorICogCisgKiBQcm9jZXNzZXMgdGhlIGdpdmVuIGNoYW5nZSBhbmQgaW52YWxpZGF0ZXMgdGhlIHJlc3BlY3RpdmUgY2FjaGVkIGRhdGEKKyAqIGluIDx2aWV3Pi4gVGhpcyBmaXJlcyBhIDxyb290PiBldmVudCBpZiB0aGUgcm9vdCBoYXMgY2hhbmdlZCBpbiB0aGUKKyAqIG1vZGVsLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjaGFuZ2UgLSBPYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBjaGFuZ2Ugb24gdGhlIG1vZGVsLgorICovCitteEdyYXBoLnByb3RvdHlwZS5wcm9jZXNzQ2hhbmdlID0gZnVuY3Rpb24oY2hhbmdlKQoreworCS8vIFJlc2V0cyB0aGUgdmlldyBzZXR0aW5ncywgcmVtb3ZlcyBhbGwgY2VsbHMgYW5kIGNsZWFycworCS8vIHRoZSBzZWxlY3Rpb24gaWYgdGhlIHJvb3QgY2hhbmdlcy4KKwlpZiAoY2hhbmdlIGluc3RhbmNlb2YgbXhSb290Q2hhbmdlKQorCXsKKwkJdGhpcy5jbGVhclNlbGVjdGlvbigpOworCQl0aGlzLnNldERlZmF1bHRQYXJlbnQobnVsbCk7CisJCXRoaXMucmVtb3ZlU3RhdGVGb3JDZWxsKGNoYW5nZS5wcmV2aW91cyk7CisJCQorCQlpZiAodGhpcy5yZXNldFZpZXdPblJvb3RDaGFuZ2UpCisJCXsKKwkJCXRoaXMudmlldy5zY2FsZSA9IDE7CisJCQl0aGlzLnZpZXcudHJhbnNsYXRlLnggPSAwOworCQkJdGhpcy52aWV3LnRyYW5zbGF0ZS55ID0gMDsKKwkJfQorCisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuUk9PVCkpOworCX0KKwkKKwkvLyBBZGRzIG9yIHJlbW92ZXMgYSBjaGlsZCB0byB0aGUgdmlldyBieSBvbmxpbmUgaW52YWxpZGluZworCS8vIHRoZSBtaW5pbWFsIHJlcXVpcmVkIHBvcnRpb25zIG9mIHRoZSBjYWNoZSwgbmFtZWx5LCB0aGUKKwkvLyBvbGQgYW5kIG5ldyBwYXJlbnQgYW5kIHRoZSBjaGlsZC4KKwllbHNlIGlmIChjaGFuZ2UgaW5zdGFuY2VvZiBteENoaWxkQ2hhbmdlKQorCXsKKwkJdmFyIG5ld1BhcmVudCA9IHRoaXMubW9kZWwuZ2V0UGFyZW50KGNoYW5nZS5jaGlsZCk7CisJCXRoaXMudmlldy5pbnZhbGlkYXRlKGNoYW5nZS5jaGlsZCwgdHJ1ZSwgdHJ1ZSk7CisKKwkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IHRoaXMuaXNDZWxsQ29sbGFwc2VkKG5ld1BhcmVudCkpCisJCXsKKwkJCXRoaXMudmlldy5pbnZhbGlkYXRlKGNoYW5nZS5jaGlsZCwgdHJ1ZSwgdHJ1ZSk7CisJCQl0aGlzLnJlbW92ZVN0YXRlRm9yQ2VsbChjaGFuZ2UuY2hpbGQpOworCQkJCisJCQkvLyBIYW5kbGVzIHNwZWNpYWwgY2FzZSBvZiBjdXJyZW50IHJvb3Qgb2YgdmlldyBiZWluZyByZW1vdmVkCisJCQlpZiAodGhpcy52aWV3LmN1cnJlbnRSb290ID09IGNoYW5nZS5jaGlsZCkKKwkJCXsKKwkJCQl0aGlzLmhvbWUoKTsKKwkJCX0KKwkJfQorIAorCQlpZiAobmV3UGFyZW50ICE9IGNoYW5nZS5wcmV2aW91cykKKwkJeworCQkJLy8gUmVmcmVzaGVzIHRoZSBjb2xsYXBzZS9leHBhbmQgaWNvbnMgb24gdGhlIHBhcmVudHMKKwkJCWlmIChuZXdQYXJlbnQgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLnZpZXcuaW52YWxpZGF0ZShuZXdQYXJlbnQsIGZhbHNlLCBmYWxzZSk7CisJCQl9CisJCQkKKwkJCWlmIChjaGFuZ2UucHJldmlvdXMgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLnZpZXcuaW52YWxpZGF0ZShjaGFuZ2UucHJldmlvdXMsIGZhbHNlLCBmYWxzZSk7CisJCQl9CisJCX0KKwl9CisKKwkvLyBIYW5kbGVzIHR3byBzcGVjaWFsIGNhc2VzIHdoZXJlIHRoZSBzaGFwZSBkb2VzIG5vdCBuZWVkIHRvIGJlCisJLy8gcmVjcmVhdGVkIGZyb20gc2NyYXRjaCwgaXQgb25seSBuZWVkcyB0byBiZSBpbnZhbGlkYXRlZC4KKwllbHNlIGlmIChjaGFuZ2UgaW5zdGFuY2VvZiBteFRlcm1pbmFsQ2hhbmdlIHx8IGNoYW5nZSBpbnN0YW5jZW9mIG14R2VvbWV0cnlDaGFuZ2UpCisJeworCQkvLyBDaGVja3MgaWYgdGhlIGdlb21ldHJ5IGhhcyBjaGFuZ2VkIHRvIGF2b2lkIHVubmVzc2VjYXJ5IHJldmFsaWRhdGlvbgorCQlpZiAoY2hhbmdlIGluc3RhbmNlb2YgbXhUZXJtaW5hbENoYW5nZSB8fCAoKGNoYW5nZS5wcmV2aW91cyA9PSBudWxsICYmIGNoYW5nZS5nZW9tZXRyeSAhPSBudWxsKSB8fAorCQkJKGNoYW5nZS5wcmV2aW91cyAhPSBudWxsICYmICFjaGFuZ2UucHJldmlvdXMuZXF1YWxzKGNoYW5nZS5nZW9tZXRyeSkpKSkKKwkJeworCQkJdGhpcy52aWV3LmludmFsaWRhdGUoY2hhbmdlLmNlbGwpOworCQl9CisJfQorCisJLy8gSGFuZGxlcyB0d28gc3BlY2lhbCBjYXNlcyB3aGVyZSBvbmx5IHRoZSBzaGFwZSwgYnV0IG5vCisJLy8gZGVzY2VuZGFudHMgbmVlZCB0byBiZSByZWNyZWF0ZWQKKwllbHNlIGlmIChjaGFuZ2UgaW5zdGFuY2VvZiBteFZhbHVlQ2hhbmdlKQorCXsKKwkJdGhpcy52aWV3LmludmFsaWRhdGUoY2hhbmdlLmNlbGwsIGZhbHNlLCBmYWxzZSk7CisJfQorCQorCS8vIFJlcXVpcmVzIGEgbmV3IG14U2hhcGUgaW4gSmF2YVNjcmlwdAorCWVsc2UgaWYgKGNoYW5nZSBpbnN0YW5jZW9mIG14U3R5bGVDaGFuZ2UpCisJeworCQl0aGlzLnZpZXcuaW52YWxpZGF0ZShjaGFuZ2UuY2VsbCwgdHJ1ZSwgdHJ1ZSk7CisJCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShjaGFuZ2UuY2VsbCk7CisJCQorCQlpZiAoc3RhdGUgIT0gbnVsbCkKKwkJeworCQkJc3RhdGUuc3R5bGUgPSBudWxsOworCQl9CisJfQorCQorCS8vIFJlbW92ZXMgdGhlIHN0YXRlIGZyb20gdGhlIGNhY2hlIGJ5IGRlZmF1bHQKKwllbHNlIGlmIChjaGFuZ2UuY2VsbCAhPSBudWxsICYmIGNoYW5nZS5jZWxsIGluc3RhbmNlb2YgbXhDZWxsKQorCXsKKwkJdGhpcy5yZW1vdmVTdGF0ZUZvckNlbGwoY2hhbmdlLmNlbGwpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJlbW92ZVN0YXRlRm9yQ2VsbAorICogCisgKiBSZW1vdmVzIGFsbCBjYWNoZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBjZWxsIGFuZCBpdHMgZGVzY2VuZGFudHMuCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgY2VsbCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBtb2RlbC4KKyAqIAorICogUGFyYW10ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdGhhdCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBtb2RlbC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUucmVtb3ZlU3RhdGVGb3JDZWxsID0gZnVuY3Rpb24oY2VsbCkKK3sKKwl2YXIgY2hpbGRDb3VudCA9IHRoaXMubW9kZWwuZ2V0Q2hpbGRDb3VudChjZWxsKTsKKwkKKwlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykKKwl7CisJCXRoaXMucmVtb3ZlU3RhdGVGb3JDZWxsKHRoaXMubW9kZWwuZ2V0Q2hpbGRBdChjZWxsLCBpKSk7CisJfQorCisJdGhpcy52aWV3LmludmFsaWRhdGUoY2VsbCwgZmFsc2UsIHRydWUpOworCXRoaXMudmlldy5yZW1vdmVTdGF0ZShjZWxsKTsKK307CisKKy8qKgorICogR3JvdXA6IE92ZXJsYXlzCisgKi8KKworLyoqCisgKiBGdW5jdGlvbjogYWRkQ2VsbE92ZXJsYXkKKyAqIAorICogQWRkcyBhbiA8bXhDZWxsT3ZlcmxheT4gZm9yIHRoZSBzcGVjaWZpZWQgY2VsbC4gVGhpcyBtZXRob2QgZmlyZXMgYW4KKyAqIDxhZGRvdmVybGF5PiBldmVudCBhbmQgcmV0dXJucyB0aGUgbmV3IDxteENlbGxPdmVybGF5Pi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRvIGFkZCB0aGUgb3ZlcmxheSBmb3IuCisgKiBvdmVybGF5IC0gPG14Q2VsbE92ZXJsYXk+IHRvIGJlIGFkZGVkIGZvciB0aGUgY2VsbC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuYWRkQ2VsbE92ZXJsYXkgPSBmdW5jdGlvbihjZWxsLCBvdmVybGF5KQoreworCWlmIChjZWxsLm92ZXJsYXlzID09IG51bGwpCisJeworCQljZWxsLm92ZXJsYXlzID0gW107CisJfQorCQorCWNlbGwub3ZlcmxheXMucHVzaChvdmVybGF5KTsKKworCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShjZWxsKTsKKworCS8vIEltbWVkaWF0ZWx5IHVwZGF0ZXMgdGhlIGNlbGwgZGlzcGxheSBpZiB0aGUgc3RhdGUgZXhpc3RzCisJaWYgKHN0YXRlICE9IG51bGwpCisJeworCQl0aGlzLmNlbGxSZW5kZXJlci5yZWRyYXcoc3RhdGUpOworCX0KKwkKKwl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LkFERF9PVkVSTEFZLAorCQkJJ2NlbGwnLCBjZWxsLCAnb3ZlcmxheScsIG92ZXJsYXkpKTsKKwkKKwlyZXR1cm4gb3ZlcmxheTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldENlbGxPdmVybGF5cworICogCisgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiA8bXhDZWxsT3ZlcmxheXM+IGZvciB0aGUgZ2l2ZW4gY2VsbCBvciBudWxsLCBpZgorICogbm8gb3ZlcmxheXMgYXJlIGRlZmluZWQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBvdmVybGF5cyBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldENlbGxPdmVybGF5cyA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIGNlbGwub3ZlcmxheXM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZW1vdmVDZWxsT3ZlcmxheQorICogCisgKiBSZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBnaXZlbiA8bXhDZWxsT3ZlcmxheT4gZnJvbSB0aGUgZ2l2ZW4gY2VsbC4gVGhpcworICogbWV0aG9kIGZpcmVzIGEgPHJlbW92ZW92ZXJsYXk+IGV2ZW50LiBJZiBubyBvdmVybGF5IGlzIGdpdmVuLCB0aGVuIGFsbAorICogb3ZlcmxheXMgYXJlIHJlbW92ZWQgdXNpbmcgPHJlbW92ZU92ZXJsYXlzPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdob3NlIG92ZXJsYXkgc2hvdWxkIGJlIHJlbW92ZWQuCisgKiBvdmVybGF5IC0gT3B0aW9uYWwgPG14Q2VsbE92ZXJsYXk+IHRvIGJlIHJlbW92ZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnJlbW92ZUNlbGxPdmVybGF5ID0gZnVuY3Rpb24oY2VsbCwgb3ZlcmxheSkKK3sKKwlpZiAob3ZlcmxheSA9PSBudWxsKQorCXsKKwkJdGhpcy5yZW1vdmVDZWxsT3ZlcmxheXMoY2VsbCk7CisJfQorCWVsc2UKKwl7CisJCXZhciBpbmRleCA9IG14VXRpbHMuaW5kZXhPZihjZWxsLm92ZXJsYXlzLCBvdmVybGF5KTsKKwkJCisJCWlmIChpbmRleCA+PSAwKQorCQl7CisJCQljZWxsLm92ZXJsYXlzLnNwbGljZShpbmRleCwgMSk7CisJCQkKKwkJCWlmIChjZWxsLm92ZXJsYXlzLmxlbmd0aCA9PSAwKQorCQkJeworCQkJCWNlbGwub3ZlcmxheXMgPSBudWxsOworCQkJfQorCQkJCisJCQkvLyBJbW1lZGlhdGVseSB1cGRhdGVzIHRoZSBjZWxsIGRpc3BsYXkgaWYgdGhlIHN0YXRlIGV4aXN0cworCQkJdmFyIHN0YXRlID0gdGhpcy52aWV3LmdldFN0YXRlKGNlbGwpOworCQkJCisJCQlpZiAoc3RhdGUgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLmNlbGxSZW5kZXJlci5yZWRyYXcoc3RhdGUpOworCQkJfQorCQkJCisJCQl0aGlzLmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LlJFTU9WRV9PVkVSTEFZLAorCQkJCQknY2VsbCcsIGNlbGwsICdvdmVybGF5Jywgb3ZlcmxheSkpOwkKKwkJfQorCQllbHNlCisJCXsKKwkJCW92ZXJsYXkgPSBudWxsOworCQl9CisJfQorCQorCXJldHVybiBvdmVybGF5OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVtb3ZlQ2VsbE92ZXJsYXlzCisgKiAKKyAqIFJlbW92ZXMgYWxsIDxteENlbGxPdmVybGF5cz4gZnJvbSB0aGUgZ2l2ZW4gY2VsbC4gVGhpcyBtZXRob2QKKyAqIGZpcmVzIGEgPHJlbW92ZW92ZXJsYXk+IGV2ZW50IGZvciBlYWNoIDxteENlbGxPdmVybGF5PiBhbmQgcmV0dXJucworICogdGhlIGFycmF5IG9mIDxteENlbGxPdmVybGF5cz4gdGhhdCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBjZWxsLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2Ugb3ZlcmxheXMgc2hvdWxkIGJlIHJlbW92ZWQKKyAqLworbXhHcmFwaC5wcm90b3R5cGUucmVtb3ZlQ2VsbE92ZXJsYXlzID0gZnVuY3Rpb24oY2VsbCkKK3sKKwl2YXIgb3ZlcmxheXMgPSBjZWxsLm92ZXJsYXlzOworCQorCWlmIChvdmVybGF5cyAhPSBudWxsKQorCXsKKwkJY2VsbC5vdmVybGF5cyA9IG51bGw7CisJCQorCQkvLyBJbW1lZGlhdGVseSB1cGRhdGVzIHRoZSBjZWxsIGRpc3BsYXkgaWYgdGhlIHN0YXRlIGV4aXN0cworCQl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoY2VsbCk7CisJCQorCQlpZiAoc3RhdGUgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5jZWxsUmVuZGVyZXIucmVkcmF3KHN0YXRlKTsKKwkJfQorCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBvdmVybGF5cy5sZW5ndGg7IGkrKykKKwkJeworCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5SRU1PVkVfT1ZFUkxBWSwKKwkJCQkJJ2NlbGwnLCBjZWxsLCAnb3ZlcmxheScsIG92ZXJsYXlzW2ldKSk7CisJCX0KKwl9CisJCisJcmV0dXJuIG92ZXJsYXlzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY2xlYXJDZWxsT3ZlcmxheXMKKyAqIAorICogUmVtb3ZlcyBhbGwgPG14Q2VsbE92ZXJsYXlzPiBpbiB0aGUgZ3JhcGggZm9yIHRoZSBnaXZlbiBjZWxsIGFuZCBhbGwgaXRzCisgKiBkZXNjZW5kYW50cy4gSWYgbm8gY2VsbCBpcyBzcGVjaWZpZWQgdGhlbiBhbGwgb3ZlcmxheXMgYXJlIHJlbW92ZWQgZnJvbQorICogdGhlIGdyYXBoLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgPHJlbW92ZUNlbGxPdmVybGF5cz4gdG8gcmVtb3ZlIHRoZQorICogb3ZlcmxheXMgZnJvbSB0aGUgaW5kaXZpZHVhbCBjZWxscy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIE9wdGlvbmFsIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgcm9vdCBvZiB0aGUgc3VidHJlZSB0bworICogcmVtb3ZlIHRoZSBvdmVybGF5cyBmcm9tLiBEZWZhdWx0IGlzIHRoZSByb290IGluIHRoZSBtb2RlbC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY2xlYXJDZWxsT3ZlcmxheXMgPSBmdW5jdGlvbihjZWxsKQoreworCWNlbGwgPSAoY2VsbCAhPSBudWxsKSA/IGNlbGwgOiB0aGlzLm1vZGVsLmdldFJvb3QoKTsKKwl0aGlzLnJlbW92ZUNlbGxPdmVybGF5cyhjZWxsKTsKKwkKKwkvLyBSZWN1cnNpdmVseSByZW1vdmVzIGFsbCBvdmVybGF5cyBmcm9tIHRoZSBjaGlsZHJlbgorCXZhciBjaGlsZENvdW50ID0gdGhpcy5tb2RlbC5nZXRDaGlsZENvdW50KGNlbGwpOworCQorCWZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKQorCXsKKwkJdmFyIGNoaWxkID0gdGhpcy5tb2RlbC5nZXRDaGlsZEF0KGNlbGwsIGkpOworCQl0aGlzLmNsZWFyQ2VsbE92ZXJsYXlzKGNoaWxkKTsgLy8gcmVjdXJzZQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHNldENlbGxXYXJuaW5nCisgKiAKKyAqIENyZWF0ZXMgYW4gb3ZlcmxheSBmb3IgdGhlIGdpdmVuIGNlbGwgdXNpbmcgdGhlIHdhcm5pbmcgYW5kIGltYWdlIG9yCisgKiA8d2FybmluZ0ltYWdlPiBhbmQgcmV0dXJucyB0aGUgbmV3IDxteENlbGxPdmVybGF5Pi4gVGhlIHdhcm5pbmcgaXMKKyAqIGRpc3BsYXllZCBhcyBhIHRvb2x0aXAgaW4gYSByZWQgZm9udCBhbmQgbWF5IGNvbnRhaW4gSFRNTCBtYXJrdXAuIElmCisgKiB0aGUgd2FybmluZyBpcyBudWxsIG9yIGEgemVybyBsZW5ndGggc3RyaW5nLCB0aGVuIGFsbCBvdmVybGF5cyBhcmUKKyAqIHJlbW92ZWQgZnJvbSB0aGUgY2VsbC4KKyAqIAorICogRXhhbXBsZToKKyAqIAorICogKGNvZGUpCisgKiBncmFwaC5zZXRDZWxsV2FybmluZyhjZWxsLCAnPGI+V2FybmluZzo8L2I+OiBIZWxsbywgV29ybGQhJyk7CisgKiAoZW5kKQorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2Ugd2FybmluZyBzaG91bGQgYmUgc2V0LgorICogd2FybmluZyAtIFN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIHdhcm5pbmcgdG8gYmUgZGlzcGxheWVkLgorICogaW1nIC0gT3B0aW9uYWwgPG14SW1hZ2U+IHRvIGJlIHVzZWQgZm9yIHRoZSBvdmVybGF5LiBEZWZhdWx0IGlzCisgKiA8d2FybmluZ0ltYWdlPi4KKyAqIGlzU2VsZWN0IC0gT3B0aW9uYWwgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGEgY2xpY2sgb24gdGhlIG92ZXJsYXkKKyAqIHNob3VsZCBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgY2VsbC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0Q2VsbFdhcm5pbmcgPSBmdW5jdGlvbihjZWxsLCB3YXJuaW5nLCBpbWcsIGlzU2VsZWN0KQoreworCWlmICh3YXJuaW5nICE9IG51bGwgJiYgd2FybmluZy5sZW5ndGggPiAwKQorCXsKKwkJaW1nID0gKGltZyAhPSBudWxsKSA/IGltZyA6IHRoaXMud2FybmluZ0ltYWdlOworCQkKKwkJLy8gQ3JlYXRlcyB0aGUgb3ZlcmxheSB3aXRoIHRoZSBpbWFnZSBhbmQgd2FybmluZworCQl2YXIgb3ZlcmxheSA9IG5ldyBteENlbGxPdmVybGF5KGltZywKKwkJCSc8Zm9udCBjb2xvcj1yZWQ+Jyt3YXJuaW5nKyc8L2ZvbnQ+Jyk7CisJCQorCQkvLyBBZGRzIGEgaGFuZGxlciBmb3Igc2luZ2xlIG1vdXNlY2xpY2tzIHRvIHNlbGVjdCB0aGUgY2VsbAorCQlpZiAoaXNTZWxlY3QpCisJCXsKKwkJCW92ZXJsYXkuYWRkTGlzdGVuZXIobXhFdmVudC5DTElDSywKKwkJCQlteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oc2VuZGVyLCBldnQpCisJCQkJeworCQkJCQlpZiAodGhpcy5pc0VuYWJsZWQoKSkKKwkJCQkJeworCQkJCQkJdGhpcy5zZXRTZWxlY3Rpb25DZWxsKGNlbGwpOworCQkJCQl9CisJCQkJfSkKKwkJCSk7CisJCX0KKwkJCisJCS8vIFNldHMgYW5kIHJldHVybnMgdGhlIG92ZXJsYXkgaW4gdGhlIGdyYXBoCisJCXJldHVybiB0aGlzLmFkZENlbGxPdmVybGF5KGNlbGwsIG92ZXJsYXkpOworCX0KKwllbHNlCisJeworCQl0aGlzLnJlbW92ZUNlbGxPdmVybGF5cyhjZWxsKTsKKwl9CisJCisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEdyb3VwOiBJbi1wbGFjZSBlZGl0aW5nCisgKi8KKworLyoqCisgKiBGdW5jdGlvbjogc3RhcnRFZGl0aW5nCisgKiAKKyAqIENhbGxzIDxzdGFydEVkaXRpbmdBdENlbGw+IHVzaW5nIHRoZSBnaXZlbiBjZWxsIG9yIHRoZSBmaXJzdCBzZWxlY3Rpb24KKyAqIGNlbGwuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGV2dCAtIE9wdGlvbmFsIG1vdXNlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBlZGl0aW5nLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zdGFydEVkaXRpbmcgPSBmdW5jdGlvbihldnQpCit7CisJdGhpcy5zdGFydEVkaXRpbmdBdENlbGwobnVsbCwgZXZ0KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHN0YXJ0RWRpdGluZ0F0Q2VsbAorICogCisgKiBGaXJlcyBhIDxzdGFydEVkaXRpbmc+IGV2ZW50IGFuZCBpbnZva2VzIDxteENlbGxFZGl0b3Iuc3RhcnRFZGl0aW5nPgorICogb24gPGVkaXRvcj4uIEFmdGVyIGVkaXRpbmcgd2FzIHN0YXJ0ZWQsIGEgPGVkaXRpbmdTdGFydGVkPiBldmVudCBpcworICogZmlyZWQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0byBzdGFydCB0aGUgaW4tcGxhY2UgZWRpdG9yIGZvci4KKyAqIGV2dCAtIE9wdGlvbmFsIG1vdXNlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBlZGl0aW5nLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zdGFydEVkaXRpbmdBdENlbGwgPSBmdW5jdGlvbihjZWxsLCBldnQpCit7CisJaWYgKGV2dCA9PSBudWxsIHx8ICFteEV2ZW50LmlzTXVsdGlUb3VjaEV2ZW50KGV2dCkpCisJeworCQlpZiAoY2VsbCA9PSBudWxsKQorCQl7CisJCQljZWxsID0gdGhpcy5nZXRTZWxlY3Rpb25DZWxsKCk7CisJCQkKKwkJCWlmIChjZWxsICE9IG51bGwgJiYgIXRoaXMuaXNDZWxsRWRpdGFibGUoY2VsbCkpCisJCQl7CisJCQkJY2VsbCA9IG51bGw7CisJCQl9CisJCX0KKwkKKwkJaWYgKGNlbGwgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5TVEFSVF9FRElUSU5HLAorCQkJCQknY2VsbCcsIGNlbGwsICdldmVudCcsIGV2dCkpOworCQkJdGhpcy5jZWxsRWRpdG9yLnN0YXJ0RWRpdGluZyhjZWxsLCBldnQpOworCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5FRElUSU5HX1NUQVJURUQsCisJCQkJCSdjZWxsJywgY2VsbCwgJ2V2ZW50JywgZXZ0KSk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRFZGl0aW5nVmFsdWUKKyAqIAorICogUmV0dXJucyB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgaW4tcGxhY2UgZWRpdGluZy4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICogcmV0dXJucyA8Y29udmVydFZhbHVlVG9TdHJpbmc+IGZvciB0aGUgZ2l2ZW4gY2VsbC4gSWYgdGhpcyBmdW5jdGlvbiBpcworICogb3ZlcnJpZGRlbiwgdGhlbiA8bXhHcmFwaE1vZGVsLnZhbHVlRm9yQ2VsbENoYW5nZWQ+IHNob3VsZCB0YWtlIGNhcmUKKyAqIG9mIGNvcnJlY3RseSBzdG9yaW5nIHRoZSBhY3R1YWwgbmV3IHZhbHVlIGluc2lkZSB0aGUgdXNlciBvYmplY3QuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiBmb3Igd2hpY2ggdGhlIGluaXRpYWwgZWRpdGluZyB2YWx1ZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiBldnQgLSBPcHRpb25hbCBtb3VzZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgZWRpdG9yLgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRFZGl0aW5nVmFsdWUgPSBmdW5jdGlvbihjZWxsLCBldnQpCit7CisJcmV0dXJuIHRoaXMuY29udmVydFZhbHVlVG9TdHJpbmcoY2VsbCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzdG9wRWRpdGluZworICogCisgKiBTdG9wcyB0aGUgY3VycmVudCBlZGl0aW5nICBhbmQgZmlyZXMgYSA8ZWRpdGluZ1N0b3BwZWQ+IGV2ZW50LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjYW5jZWwgLSBCb29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIHRoZSBjdXJyZW50IGVkaXRpbmcgdmFsdWUKKyAqIHNob3VsZCBiZSBzdG9yZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnN0b3BFZGl0aW5nID0gZnVuY3Rpb24oY2FuY2VsKQoreworCXRoaXMuY2VsbEVkaXRvci5zdG9wRWRpdGluZyhjYW5jZWwpOworCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuRURJVElOR19TVE9QUEVELCAnY2FuY2VsJywgY2FuY2VsKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBsYWJlbENoYW5nZWQKKyAqIAorICogU2V0cyB0aGUgbGFiZWwgb2YgdGhlIHNwZWNpZmllZCBjZWxsIHRvIHRoZSBnaXZlbiB2YWx1ZSB1c2luZworICogPGNlbGxMYWJlbENoYW5nZWQ+IGFuZCBmaXJlcyA8bXhFdmVudC5MQUJFTF9DSEFOR0VEPiB3aGlsZSB0aGUKKyAqIHRyYW5zYWN0aW9uIGlzIGluIHByb2dyZXNzLiBSZXR1cm5zIHRoZSBjZWxsIHdob3NlIGxhYmVsIHdhcyBjaGFuZ2VkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgbGFiZWwgc2hvdWxkIGJlIGNoYW5nZWQuCisgKiB2YWx1ZSAtIE5ldyBsYWJlbCB0byBiZSBhc3NpZ25lZC4KKyAqIGV2dCAtIE9wdGlvbmFsIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBjaGFuZ2UuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmxhYmVsQ2hhbmdlZCA9IGZ1bmN0aW9uKGNlbGwsIHZhbHVlLCBldnQpCit7CisJdGhpcy5tb2RlbC5iZWdpblVwZGF0ZSgpOworCXRyeQorCXsKKwkJdmFyIG9sZCA9IGNlbGwudmFsdWU7CisJCXRoaXMuY2VsbExhYmVsQ2hhbmdlZChjZWxsLCB2YWx1ZSwgdGhpcy5pc0F1dG9TaXplQ2VsbChjZWxsKSk7CisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuTEFCRUxfQ0hBTkdFRCwKKwkJCSdjZWxsJywgY2VsbCwgJ3ZhbHVlJywgdmFsdWUsICdvbGQnLCBvbGQsICdldmVudCcsIGV2dCkpOworCX0KKwlmaW5hbGx5CisJeworCQl0aGlzLm1vZGVsLmVuZFVwZGF0ZSgpOworCX0KKwkKKwlyZXR1cm4gY2VsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNlbGxMYWJlbENoYW5nZWQKKyAqIAorICogU2V0cyB0aGUgbmV3IGxhYmVsIGZvciBhIGNlbGwuIElmIGF1dG9TaXplIGlzIHRydWUgdGhlbgorICogPGNlbGxTaXplVXBkYXRlZD4gd2lsbCBiZSBjYWxsZWQuCisgKiAKKyAqIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgdGhlIGZ1bmN0aW9uIGlzIGV4dGVuZGVkIHRvIG1hcCBjaGFuZ2VzIHRvCisgKiBhdHRyaWJ1dGVzIGluIGFuIFhNTCBub2RlLCBhcyBzaG93biBpbiA8Y29udmVydFZhbHVlVG9TdHJpbmc+LgorICogQWx0ZXJuYXRpdmVseSwgdGhlIGhhbmRsaW5nIG9mIHRoaXMgY2FuIGJlIGltcGxlbWVudGVkIGFzIHNob3duIGluCisgKiA8bXhHcmFwaE1vZGVsLnZhbHVlRm9yQ2VsbENoYW5nZWQ+IHdpdGhvdXQgdGhlIG5lZWQgdG8gY2xvbmUgdGhlCisgKiB1c2VyIG9iamVjdC4KKyAqIAorICogKGNvZGUpCisgKiB2YXIgZ3JhcGhDZWxsTGFiZWxDaGFuZ2VkID0gZ3JhcGguY2VsbExhYmVsQ2hhbmdlZDsKKyAqIGdyYXBoLmNlbGxMYWJlbENoYW5nZWQgPSBmdW5jdGlvbihjZWxsLCBuZXdWYWx1ZSwgYXV0b1NpemUpCisgKiB7CisgKiAJLy8gQ2xvbmVkIGZvciBjb3JyZWN0IHVuZG8vcmVkbworICogCXZhciBlbHQgPSBjZWxsLnZhbHVlLmNsb25lTm9kZSh0cnVlKTsKKyAqICBlbHQuc2V0QXR0cmlidXRlKCdsYWJlbCcsIG5ld1ZhbHVlKTsKKyAqICAKKyAqICBuZXdWYWx1ZSA9IGVsdDsKKyAqICBncmFwaENlbGxMYWJlbENoYW5nZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAqIH07CisgKiAoZW5kKSAKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdob3NlIGxhYmVsIHNob3VsZCBiZSBjaGFuZ2VkLgorICogdmFsdWUgLSBOZXcgbGFiZWwgdG8gYmUgYXNzaWduZWQuCisgKiBhdXRvU2l6ZSAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgPGNlbGxTaXplVXBkYXRlZD4gc2hvdWxkIGJlIGNhbGxlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY2VsbExhYmVsQ2hhbmdlZCA9IGZ1bmN0aW9uKGNlbGwsIHZhbHVlLCBhdXRvU2l6ZSkKK3sKKwl0aGlzLm1vZGVsLmJlZ2luVXBkYXRlKCk7CisJdHJ5CisJeworCQl0aGlzLm1vZGVsLnNldFZhbHVlKGNlbGwsIHZhbHVlKTsKKwkJCisJCWlmIChhdXRvU2l6ZSkKKwkJeworCQkJdGhpcy5jZWxsU2l6ZVVwZGF0ZWQoY2VsbCwgZmFsc2UpOworCQl9CisJfQorCWZpbmFsbHkKKwl7CisJCXRoaXMubW9kZWwuZW5kVXBkYXRlKCk7CisJfQorfTsKKworLyoqCisgKiBHcm91cDogRXZlbnQgcHJvY2Vzc2luZworICovCisKKy8qKgorICogRnVuY3Rpb246IGVzY2FwZQorICogCisgKiBQcm9jZXNzZXMgYW4gZXNjYXBlIGtleXN0cm9rZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZXZ0IC0gTW91c2VldmVudCB0aGF0IHJlcHJlc2VudHMgdGhlIGtleXN0cm9rZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZXNjYXBlID0gZnVuY3Rpb24oZXZ0KQoreworCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuRVNDQVBFLCAnZXZlbnQnLCBldnQpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNsaWNrCisgKiAKKyAqIFByb2Nlc3NlcyBhIHNpbmdsZWNsaWNrIG9uIGFuIG9wdGlvbmFsIGNlbGwgYW5kIGZpcmVzIGEgPGNsaWNrPiBldmVudC4KKyAqIFRoZSBjbGljayBldmVudCBpcyBmaXJlZCBpbml0aWFsbHkuIElmIHRoZSBncmFwaCBpcyBlbmFibGVkIGFuZCB0aGUKKyAqIGV2ZW50IGhhcyBub3QgYmVlbiBjb25zdW1lZCwgdGhlbiB0aGUgY2VsbCBpcyBzZWxlY3RlZCB1c2luZworICogPHNlbGVjdENlbGxGb3JFdmVudD4gb3IgdGhlIHNlbGVjdGlvbiBpcyBjbGVhcmVkIHVzaW5nCisgKiA8Y2xlYXJTZWxlY3Rpb24+LiBUaGUgZXZlbnRzIGNvbnN1bWVkIHN0YXRlIGlzIHNldCB0byB0cnVlIGlmIHRoZQorICogY29ycmVzcG9uZGluZyA8bXhNb3VzZUV2ZW50PiBoYXMgYmVlbiBjb25zdW1lZC4KKyAqCisgKiBUbyBoYW5kbGUgYSBjbGljayBldmVudCwgdXNlIHRoZSBmb2xsb3dpbmcgY29kZS4KKyAqIAorICogKGNvZGUpCisgKiBncmFwaC5hZGRMaXN0ZW5lcihteEV2ZW50LkNMSUNLLCBmdW5jdGlvbihzZW5kZXIsIGV2dCkKKyAqIHsKKyAqICAgdmFyIGUgPSBldnQuZ2V0UHJvcGVydHkoJ2V2ZW50Jyk7IC8vIG1vdXNlIGV2ZW50CisgKiAgIHZhciBjZWxsID0gZXZ0LmdldFByb3BlcnR5KCdjZWxsJyk7IC8vIGNlbGwgbWF5IGJlIG51bGwKKyAqICAgCisgKiAgIGlmIChjZWxsICE9IG51bGwpCisgKiAgIHsKKyAqICAgICAvLyBEbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggY2VsbCBhbmQgY29uc3VtZSB0aGUgZXZlbnQKKyAqICAgICBldnQuY29uc3VtZSgpOworICogICB9CisgKiB9KTsKKyAqIChlbmQpCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIG1lIC0gPG14TW91c2VFdmVudD4gdGhhdCByZXByZXNlbnRzIHRoZSBzaW5nbGUgY2xpY2suCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNsaWNrID0gZnVuY3Rpb24obWUpCit7CisJdmFyIGV2dCA9IG1lLmdldEV2ZW50KCk7CisJdmFyIGNlbGwgPSBtZS5nZXRDZWxsKCk7CisJdmFyIG14ZSA9IG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuQ0xJQ0ssICdldmVudCcsIGV2dCwgJ2NlbGwnLCBjZWxsKTsKKwkKKwlpZiAobWUuaXNDb25zdW1lZCgpKQorCXsKKwkJbXhlLmNvbnN1bWUoKTsKKwl9CisJCisJdGhpcy5maXJlRXZlbnQobXhlKTsKKwkKKwkvLyBIYW5kbGVzIHRoZSBldmVudCBpZiBpdCBoYXMgbm90IGJlZW4gY29uc3VtZWQKKwlpZiAodGhpcy5pc0VuYWJsZWQoKSAmJiAhbXhFdmVudC5pc0NvbnN1bWVkKGV2dCkgJiYgIW14ZS5pc0NvbnN1bWVkKCkpCisJeworCQlpZiAoY2VsbCAhPSBudWxsKQorCQl7CisJCQlpZiAodGhpcy5pc1RyYW5zcGFyZW50Q2xpY2tFdmVudChldnQpKQorCQkJeworCQkJCXZhciBhY3RpdmUgPSBmYWxzZTsKKwkJCQkKKwkJCQl2YXIgdG1wID0gdGhpcy5nZXRDZWxsQXQobWUuZ3JhcGhYLCBtZS5ncmFwaFksIG51bGwsIG51bGwsIG51bGwsIG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihzdGF0ZSkKKwkJCQl7CisJCQkJCXZhciBzZWxlY3RlZCA9IHRoaXMuaXNDZWxsU2VsZWN0ZWQoc3RhdGUuY2VsbCk7CisJCQkJCWFjdGl2ZSA9IGFjdGl2ZSB8fCBzZWxlY3RlZDsKKwkJCQkJCisJCQkJCXJldHVybiAhYWN0aXZlIHx8IHNlbGVjdGVkOworCQkJCX0pKTsKKwkJCQkKKwkJCQlpZiAodG1wICE9IG51bGwpCisJCQkJeworCQkJCQljZWxsID0gdG1wOworCQkJCX0KKwkJCX0KKwkJCQorCQkJdGhpcy5zZWxlY3RDZWxsRm9yRXZlbnQoY2VsbCwgZXZ0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXZhciBzd2ltbGFuZSA9IG51bGw7CisJCQkKKwkJCWlmICh0aGlzLmlzU3dpbWxhbmVTZWxlY3Rpb25FbmFibGVkKCkpCisJCQl7CisJCQkJLy8gR2V0cyB0aGUgc3dpbWxhbmUgYXQgdGhlIGxvY2F0aW9uIChpbmNsdWRlcworCQkJCS8vIGNvbnRlbnQgYXJlYSBvZiBzd2ltbGFuZXMpCisJCQkJc3dpbWxhbmUgPSB0aGlzLmdldFN3aW1sYW5lQXQobWUuZ2V0R3JhcGhYKCksIG1lLmdldEdyYXBoWSgpKTsKKwkJCX0KKworCQkJLy8gU2VsZWN0cyB0aGUgc3dpbWxhbmUgYW5kIGNvbnN1bWVzIHRoZSBldmVudAorCQkJaWYgKHN3aW1sYW5lICE9IG51bGwpCisJCQl7CisJCQkJdGhpcy5zZWxlY3RDZWxsRm9yRXZlbnQoc3dpbWxhbmUsIGV2dCk7CisJCQl9CisJCQkKKwkJCS8vIElnbm9yZXMgdGhlIGV2ZW50IGlmIHRoZSBjb250cm9sIGtleSBpcyBwcmVzc2VkCisJCQllbHNlIGlmICghdGhpcy5pc1RvZ2dsZUV2ZW50KGV2dCkpCisJCQl7CisJCQkJdGhpcy5jbGVhclNlbGVjdGlvbigpOworCQkJfQorCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZGJsQ2xpY2sKKyAqIAorICogUHJvY2Vzc2VzIGEgZG91YmxlY2xpY2sgb24gYW4gb3B0aW9uYWwgY2VsbCBhbmQgZmlyZXMgYSA8ZGJsY2xpY2s+CisgKiBldmVudC4gVGhlIGV2ZW50IGlzIGZpcmVkIGluaXRpYWxseS4gSWYgdGhlIGdyYXBoIGlzIGVuYWJsZWQgYW5kIHRoZQorICogZXZlbnQgaGFzIG5vdCBiZWVuIGNvbnN1bWVkLCB0aGVuIDxlZGl0PiBpcyBjYWxsZWQgd2l0aCB0aGUgZ2l2ZW4KKyAqIGNlbGwuIFRoZSBldmVudCBpcyBpZ25vcmVkIGlmIG5vIGNlbGwgd2FzIHNwZWNpZmllZC4KKyAqCisgKiBFeGFtcGxlIGZvciBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLgorICoKKyAqIChjb2RlKQorICogZ3JhcGguZGJsQ2xpY2sgPSBmdW5jdGlvbihldnQsIGNlbGwpCisgKiB7CisgKiAgIHZhciBteGUgPSBuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LkRPVUJMRV9DTElDSywgJ2V2ZW50JywgZXZ0LCAnY2VsbCcsIGNlbGwpOworICogICB0aGlzLmZpcmVFdmVudChteGUpOworICogICAKKyAqICAgaWYgKHRoaXMuaXNFbmFibGVkKCkgJiYgIW14RXZlbnQuaXNDb25zdW1lZChldnQpICYmICFteGUuaXNDb25zdW1lZCgpKQorICogICB7CisgKiAJICAgbXhVdGlscy5hbGVydCgnSGVsbG8sIFdvcmxkIScpOworICogICAgIG14ZS5jb25zdW1lKCk7CisgKiAgIH0KKyAqIH0KKyAqIChlbmQpCisgKiAKKyAqIEV4YW1wbGUgbGlzdGVuZXIgZm9yIHRoaXMgZXZlbnQuCisgKiAKKyAqIChjb2RlKQorICogZ3JhcGguYWRkTGlzdGVuZXIobXhFdmVudC5ET1VCTEVfQ0xJQ0ssIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorICogeworICogICB2YXIgY2VsbCA9IGV2dC5nZXRQcm9wZXJ0eSgnY2VsbCcpOworICogICAvLyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgY2VsbCBhbmQgY29uc3VtZSB0aGUKKyAqICAgLy8gZXZlbnQgdG8gcHJldmVudCBpbi1wbGFjZSBlZGl0aW5nIGZyb20gc3RhcnQKKyAqIH0pOworICogKGVuZCkgCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGV2dCAtIE1vdXNlZXZlbnQgdGhhdCByZXByZXNlbnRzIHRoZSBkb3VibGVjbGljay4KKyAqIGNlbGwgLSBPcHRpb25hbCA8bXhDZWxsPiB1bmRlciB0aGUgbW91c2Vwb2ludGVyLgorICovCitteEdyYXBoLnByb3RvdHlwZS5kYmxDbGljayA9IGZ1bmN0aW9uKGV2dCwgY2VsbCkKK3sKKwl2YXIgbXhlID0gbmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5ET1VCTEVfQ0xJQ0ssICdldmVudCcsIGV2dCwgJ2NlbGwnLCBjZWxsKTsKKwl0aGlzLmZpcmVFdmVudChteGUpOworCQorCS8vIEhhbmRsZXMgdGhlIGV2ZW50IGlmIGl0IGhhcyBub3QgYmVlbiBjb25zdW1lZAorCWlmICh0aGlzLmlzRW5hYmxlZCgpICYmICFteEV2ZW50LmlzQ29uc3VtZWQoZXZ0KSAmJiAhbXhlLmlzQ29uc3VtZWQoKSAmJgorCQljZWxsICE9IG51bGwgJiYgdGhpcy5pc0NlbGxFZGl0YWJsZShjZWxsKSAmJiAhdGhpcy5pc0VkaXRpbmcoY2VsbCkpCisJeworCQl0aGlzLnN0YXJ0RWRpdGluZ0F0Q2VsbChjZWxsLCBldnQpOworCQlteEV2ZW50LmNvbnN1bWUoZXZ0KTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB0YXBBbmRIb2xkCisgKiAKKyAqIEhhbmRsZXMgdGhlIDxteE1vdXNlRXZlbnQ+IGJ5IGhpZ2hsaWdodGluZyB0aGUgPG14Q2VsbFN0YXRlPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogbWUgLSA8bXhNb3VzZUV2ZW50PiB0aGF0IHJlcHJlc2VudHMgdGhlIHRvdWNoIGV2ZW50LgorICogc3RhdGUgLSBPcHRpb25hbCA8bXhDZWxsU3RhdGU+IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUudGFwQW5kSG9sZCA9IGZ1bmN0aW9uKG1lKQoreworCXZhciBldnQgPSBtZS5nZXRFdmVudCgpOworCXZhciBteGUgPSBuZXcgbXhFdmVudE9iamVjdChteEV2ZW50LlRBUF9BTkRfSE9MRCwgJ2V2ZW50JywgZXZ0LCAnY2VsbCcsIG1lLmdldENlbGwoKSk7CisKKwkvLyBMQVRFUjogQ2hlY2sgaWYgZXZlbnQgc2hvdWxkIGJlIGNvbnN1bWVkIGlmIG1lIGlzIGNvbnN1bWVkCisJdGhpcy5maXJlRXZlbnQobXhlKTsKKworCWlmIChteGUuaXNDb25zdW1lZCgpKQorCXsKKwkJLy8gUmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGUgcGFubmluZyBoYW5kbGVyCisJCXRoaXMucGFubmluZ0hhbmRsZXIucGFubmluZ1RyaWdnZXIgPSBmYWxzZTsKKwl9CisJCisJLy8gSGFuZGxlcyB0aGUgZXZlbnQgaWYgaXQgaGFzIG5vdCBiZWVuIGNvbnN1bWVkCisJaWYgKHRoaXMuaXNFbmFibGVkKCkgJiYgIW14RXZlbnQuaXNDb25zdW1lZChldnQpICYmICFteGUuaXNDb25zdW1lZCgpICYmIHRoaXMuY29ubmVjdGlvbkhhbmRsZXIuaXNFbmFibGVkKCkpCisJeworCQl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUodGhpcy5jb25uZWN0aW9uSGFuZGxlci5tYXJrZXIuZ2V0Q2VsbChtZSkpOworCisJCWlmIChzdGF0ZSAhPSBudWxsKQorCQl7CisJCQl0aGlzLmNvbm5lY3Rpb25IYW5kbGVyLm1hcmtlci5jdXJyZW50Q29sb3IgPSB0aGlzLmNvbm5lY3Rpb25IYW5kbGVyLm1hcmtlci52YWxpZENvbG9yOworCQkJdGhpcy5jb25uZWN0aW9uSGFuZGxlci5tYXJrZXIubWFya2VkU3RhdGUgPSBzdGF0ZTsKKwkJCXRoaXMuY29ubmVjdGlvbkhhbmRsZXIubWFya2VyLm1hcmsoKTsKKwkJCQorCQkJdGhpcy5jb25uZWN0aW9uSGFuZGxlci5maXJzdCA9IG5ldyBteFBvaW50KG1lLmdldEdyYXBoWCgpLCBtZS5nZXRHcmFwaFkoKSk7CisJCQl0aGlzLmNvbm5lY3Rpb25IYW5kbGVyLmVkZ2VTdGF0ZSA9IHRoaXMuY29ubmVjdGlvbkhhbmRsZXIuY3JlYXRlRWRnZVN0YXRlKG1lKTsKKwkJCXRoaXMuY29ubmVjdGlvbkhhbmRsZXIucHJldmlvdXMgPSBzdGF0ZTsKKwkJCXRoaXMuY29ubmVjdGlvbkhhbmRsZXIuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuU1RBUlQsICdzdGF0ZScsIHRoaXMuY29ubmVjdGlvbkhhbmRsZXIucHJldmlvdXMpKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHNjcm9sbFBvaW50VG9WaXNpYmxlCisgKiAKKyAqIFNjcm9sbHMgdGhlIGdyYXBoIHRvIHRoZSBnaXZlbiBwb2ludCwgZXh0ZW5kaW5nIHRoZSBncmFwaCBjb250YWluZXIgaWYKKyAqIHNwZWNpZmllZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2Nyb2xsUG9pbnRUb1Zpc2libGUgPSBmdW5jdGlvbih4LCB5LCBleHRlbmQsIGJvcmRlcikKK3sKKwlpZiAoIXRoaXMudGltZXJBdXRvU2Nyb2xsICYmICh0aGlzLmlnbm9yZVNjcm9sbGJhcnMgfHwgbXhVdGlscy5oYXNTY3JvbGxiYXJzKHRoaXMuY29udGFpbmVyKSkpCisJeworCQl2YXIgYyA9IHRoaXMuY29udGFpbmVyOworCQlib3JkZXIgPSAoYm9yZGVyICE9IG51bGwpID8gYm9yZGVyIDogMjA7CisJCQorCQlpZiAoeCA+PSBjLnNjcm9sbExlZnQgJiYgeSA+PSBjLnNjcm9sbFRvcCAmJiB4IDw9IGMuc2Nyb2xsTGVmdCArIGMuY2xpZW50V2lkdGggJiYKKwkJCXkgPD0gYy5zY3JvbGxUb3AgKyBjLmNsaWVudEhlaWdodCkKKwkJeworCQkJdmFyIGR4ID0gYy5zY3JvbGxMZWZ0ICsgYy5jbGllbnRXaWR0aCAtIHg7CisJCQkKKwkJCWlmIChkeCA8IGJvcmRlcikKKwkJCXsKKwkJCQl2YXIgb2xkID0gYy5zY3JvbGxMZWZ0OworCQkJCWMuc2Nyb2xsTGVmdCArPSBib3JkZXIgLSBkeDsKKworCQkJCS8vIEF1dG9tYXRpY2FsbHkgZXh0ZW5kcyB0aGUgY2FudmFzIHNpemUgdG8gdGhlIGJvdHRvbSwgcmlnaHQKKwkJCQkvLyBpZiB0aGUgZXZlbnQgaXMgb3V0c2lkZSBvZiB0aGUgY2FudmFzIGFuZCB0aGUgZWRnZSBvZiB0aGUKKwkJCQkvLyBjYW52YXMgaGFzIGJlZW4gcmVhY2hlZC4gTm90ZXM6IE5lZWRzIGZpeCBmb3IgSUUuCisJCQkJaWYgKGV4dGVuZCAmJiBvbGQgPT0gYy5zY3JvbGxMZWZ0KQorCQkJCXsKKwkJCQkJaWYgKHRoaXMuZGlhbGVjdCA9PSBteENvbnN0YW50cy5ESUFMRUNUX1NWRykKKwkJCQkJeworCQkJCQkJdmFyIHJvb3QgPSB0aGlzLnZpZXcuZ2V0RHJhd1BhbmUoKS5vd25lclNWR0VsZW1lbnQ7CisJCQkJCQl2YXIgd2lkdGggPSB0aGlzLmNvbnRhaW5lci5zY3JvbGxXaWR0aCArIGJvcmRlciAtIGR4OworCQkJCQkJCisJCQkJCQkvLyBVcGRhdGVzIHRoZSBjbGlwcGluZyByZWdpb24uIFRoaXMgaXMgYW4gZXhwZW5zaXZlCisJCQkJCQkvLyBvcGVyYXRpb24gdGhhdCBzaG91bGQgbm90IGJlIGV4ZWN1dGVkIHRvbyBvZnRlbi4KKwkJCQkJCXJvb3Quc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQl2YXIgd2lkdGggPSBNYXRoLm1heChjLmNsaWVudFdpZHRoLCBjLnNjcm9sbFdpZHRoKSArIGJvcmRlciAtIGR4OworCQkJCQkJdmFyIGNhbnZhcyA9IHRoaXMudmlldy5nZXRDYW52YXMoKTsKKwkJCQkJCWNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JzsKKwkJCQkJfQorCQkJCQkKKwkJCQkJYy5zY3JvbGxMZWZ0ICs9IGJvcmRlciAtIGR4OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkeCA9IHggLSBjLnNjcm9sbExlZnQ7CisJCQkJCisJCQkJaWYgKGR4IDwgYm9yZGVyKQorCQkJCXsKKwkJCQkJYy5zY3JvbGxMZWZ0IC09IGJvcmRlciAtIGR4OworCQkJCX0KKwkJCX0KKwkJCQorCQkJdmFyIGR5ID0gYy5zY3JvbGxUb3AgKyBjLmNsaWVudEhlaWdodCAtIHk7CisJCQkKKwkJCWlmIChkeSA8IGJvcmRlcikKKwkJCXsKKwkJCQl2YXIgb2xkID0gYy5zY3JvbGxUb3A7CisJCQkJYy5zY3JvbGxUb3AgKz0gYm9yZGVyIC0gZHk7CisKKwkJCQlpZiAob2xkID09IGMuc2Nyb2xsVG9wICYmIGV4dGVuZCkKKwkJCQl7CisJCQkJCWlmICh0aGlzLmRpYWxlY3QgPT0gbXhDb25zdGFudHMuRElBTEVDVF9TVkcpCisJCQkJCXsKKwkJCQkJCXZhciByb290ID0gdGhpcy52aWV3LmdldERyYXdQYW5lKCkub3duZXJTVkdFbGVtZW50OworCQkJCQkJdmFyIGhlaWdodCA9IHRoaXMuY29udGFpbmVyLnNjcm9sbEhlaWdodCArIGJvcmRlciAtIGR5OworCQkJCQkJCisJCQkJCQkvLyBVcGRhdGVzIHRoZSBjbGlwcGluZyByZWdpb24uIFRoaXMgaXMgYW4gZXhwZW5zaXZlCisJCQkJCQkvLyBvcGVyYXRpb24gdGhhdCBzaG91bGQgbm90IGJlIGV4ZWN1dGVkIHRvbyBvZnRlbi4KKwkJCQkJCXJvb3Quc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JzsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXZhciBoZWlnaHQgPSBNYXRoLm1heChjLmNsaWVudEhlaWdodCwgYy5zY3JvbGxIZWlnaHQpICsgYm9yZGVyIC0gZHk7CisJCQkJCQl2YXIgY2FudmFzID0gdGhpcy52aWV3LmdldENhbnZhcygpOworCQkJCQkJY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7CisJCQkJCX0KKwkJCQkJCisJCQkJCWMuc2Nyb2xsVG9wICs9IGJvcmRlciAtIGR5OworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkeSA9IHkgLSBjLnNjcm9sbFRvcDsKKwkJCQkKKwkJCQlpZiAoZHkgPCBib3JkZXIpCisJCQkJeworCQkJCQljLnNjcm9sbFRvcCAtPSBib3JkZXIgLSBkeTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiAodGhpcy5hbGxvd0F1dG9QYW5uaW5nICYmICF0aGlzLnBhbm5pbmdIYW5kbGVyLmlzQWN0aXZlKCkpCisJeworCQlpZiAodGhpcy5wYW5uaW5nTWFuYWdlciA9PSBudWxsKQorCQl7CisJCQl0aGlzLnBhbm5pbmdNYW5hZ2VyID0gdGhpcy5jcmVhdGVQYW5uaW5nTWFuYWdlcigpOworCQl9CisKKwkJdGhpcy5wYW5uaW5nTWFuYWdlci5wYW5Ubyh4ICsgdGhpcy5wYW5EeCwgeSArIHRoaXMucGFuRHkpOworCX0KK307CisKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlUGFubmluZ01hbmFnZXIKKyAqIAorICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiA8bXhQYW5uaW5nTWFuYWdlcj4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNyZWF0ZVBhbm5pbmdNYW5hZ2VyID0gZnVuY3Rpb24oKQoreworCXJldHVybiBuZXcgbXhQYW5uaW5nTWFuYWdlcih0aGlzKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEJvcmRlclNpemVzCisgKiAKKyAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJvcmRlciBhbmQgcGFkZGluZyBvbiBhbGwgZm91ciBzaWRlcyBvZiB0aGUKKyAqIGNvbnRhaW5lci4gVGhlIGxlZnQsIHRvcCwgcmlnaHQgYW5kIGJvdHRvbSBib3JkZXJzIGFyZSBzdG9yZWQgaW4gdGhlIHgsIHksCisgKiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSByZXR1cm5lZCA8bXhSZWN0YW5nbGU+LCByZXNwZWN0aXZlbHkuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldEJvcmRlclNpemVzID0gZnVuY3Rpb24oKQoreworCXZhciBjc3MgPSBteFV0aWxzLmdldEN1cnJlbnRTdHlsZSh0aGlzLmNvbnRhaW5lcik7CisJCisJcmV0dXJuIG5ldyBteFJlY3RhbmdsZShteFV0aWxzLnBhcnNlQ3NzTnVtYmVyKGNzcy5wYWRkaW5nTGVmdCkgKworCQkJKChjc3MuYm9yZGVyTGVmdFN0eWxlICE9ICdub25lJykgPyBteFV0aWxzLnBhcnNlQ3NzTnVtYmVyKGNzcy5ib3JkZXJMZWZ0V2lkdGgpIDogMCksCisJCW14VXRpbHMucGFyc2VDc3NOdW1iZXIoY3NzLnBhZGRpbmdUb3ApICsKKwkJCSgoY3NzLmJvcmRlclRvcFN0eWxlICE9ICdub25lJykgPyBteFV0aWxzLnBhcnNlQ3NzTnVtYmVyKGNzcy5ib3JkZXJUb3BXaWR0aCkgOiAwKSwKKwkJbXhVdGlscy5wYXJzZUNzc051bWJlcihjc3MucGFkZGluZ1JpZ2h0KSArCisJCQkoKGNzcy5ib3JkZXJSaWdodFN0eWxlICE9ICdub25lJykgPyBteFV0aWxzLnBhcnNlQ3NzTnVtYmVyKGNzcy5ib3JkZXJSaWdodFdpZHRoKSA6IDApLAorCQlteFV0aWxzLnBhcnNlQ3NzTnVtYmVyKGNzcy5wYWRkaW5nQm90dG9tKSArCisJCQkoKGNzcy5ib3JkZXJCb3R0b21TdHlsZSAhPSAnbm9uZScpID8gbXhVdGlscy5wYXJzZUNzc051bWJlcihjc3MuYm9yZGVyQm90dG9tV2lkdGgpIDogMCkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0UHJlZmVycmVkUGFnZVNpemUKKyAqIAorICogUmV0dXJucyB0aGUgcHJlZmVycmVkIHNpemUgb2YgdGhlIGJhY2tncm91bmQgcGFnZSBpZiA8cHJlZmVyUGFnZVNpemU+IGlzIHRydWUuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldFByZWZlcnJlZFBhZ2VTaXplID0gZnVuY3Rpb24oYm91bmRzLCB3aWR0aCwgaGVpZ2h0KQoreworCXZhciBzY2FsZSA9IHRoaXMudmlldy5zY2FsZTsKKwl2YXIgdHIgPSB0aGlzLnZpZXcudHJhbnNsYXRlOworCXZhciBmbXQgPSB0aGlzLnBhZ2VGb3JtYXQ7CisJdmFyIHBzID0gdGhpcy5wYWdlU2NhbGU7CisJdmFyIHBhZ2UgPSBuZXcgbXhSZWN0YW5nbGUoMCwgMCwgTWF0aC5jZWlsKGZtdC53aWR0aCAqIHBzKSwgTWF0aC5jZWlsKGZtdC5oZWlnaHQgKiBwcykpOworCQorCXZhciBoQ291bnQgPSAodGhpcy5wYWdlQnJlYWtzVmlzaWJsZSkgPyBNYXRoLmNlaWwod2lkdGggLyBwYWdlLndpZHRoKSA6IDE7CisJdmFyIHZDb3VudCA9ICh0aGlzLnBhZ2VCcmVha3NWaXNpYmxlKSA/IE1hdGguY2VpbChoZWlnaHQgLyBwYWdlLmhlaWdodCkgOiAxOworCQorCXJldHVybiBuZXcgbXhSZWN0YW5nbGUoMCwgMCwgaENvdW50ICogcGFnZS53aWR0aCArIDIgKyB0ci54LCB2Q291bnQgKiBwYWdlLmhlaWdodCArIDIgKyB0ci55KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGZpdAorICoKKyAqIFNjYWxlcyB0aGUgZ3JhcGggc3VjaCB0aGF0IHRoZSBjb21wbGV0ZSBkaWFncmFtIGZpdHMgaW50byA8Y29udGFpbmVyPiBhbmQKKyAqIHJldHVybnMgdGhlIGN1cnJlbnQgc2NhbGUgaW4gdGhlIHZpZXcuIFRvIGZpdCBhbiBpbml0aWFsIGdyYXBoIHByaW9yIHRvCisgKiByZW5kZXJpbmcsIHNldCA8bXhHcmFwaFZpZXcucmVuZGVyaW5nPiB0byBmYWxzZSBwcmlvciB0byBjaGFuZ2luZyB0aGUgbW9kZWwKKyAqIGFuZCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgYWZ0ZXIgY2hhbmdpbmcgdGhlIG1vZGVsLgorICogCisgKiAoY29kZSkKKyAqIGdyYXBoLmZpdCgpOworICogZ3JhcGgudmlldy5yZW5kZXJpbmcgPSB0cnVlOworICogZ3JhcGgucmVmcmVzaCgpOworICogKGVuZCkKKyAqIAorICogVG8gZml0IGFuZCBjZW50ZXIgdGhlIGdyYXBoLCB0aGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQuCisgKiAKKyAqIChjb2RlKQorICogdmFyIG1hcmdpbiA9IDI7CisgKiB2YXIgbWF4ID0gMzsKKyAqIAorICogdmFyIGJvdW5kcyA9IGdyYXBoLmdldEdyYXBoQm91bmRzKCk7CisgKiB2YXIgY3cgPSBncmFwaC5jb250YWluZXIuY2xpZW50V2lkdGggLSBtYXJnaW47CisgKiB2YXIgY2ggPSBncmFwaC5jb250YWluZXIuY2xpZW50SGVpZ2h0IC0gbWFyZ2luOworICogdmFyIHcgPSBib3VuZHMud2lkdGggLyBncmFwaC52aWV3LnNjYWxlOworICogdmFyIGggPSBib3VuZHMuaGVpZ2h0IC8gZ3JhcGgudmlldy5zY2FsZTsKKyAqIHZhciBzID0gTWF0aC5taW4obWF4LCBNYXRoLm1pbihjdyAvIHcsIGNoIC8gaCkpOworICogCisgKiBncmFwaC52aWV3LnNjYWxlQW5kVHJhbnNsYXRlKHMsCisgKiAgIChtYXJnaW4gKyBjdyAtIHcgKiBzKSAvICgyICogcykgLSBib3VuZHMueCAvIGdyYXBoLnZpZXcuc2NhbGUsCisgKiAgIChtYXJnaW4gKyBjaCAtIGggKiBzKSAvICgyICogcykgLSBib3VuZHMueSAvIGdyYXBoLnZpZXcuc2NhbGUpOworICogKGVuZCkKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogYm9yZGVyIC0gT3B0aW9uYWwgbnVtYmVyIHRoYXQgc3BlY2lmaWVzIHRoZSBib3JkZXIuIERlZmF1bHQgaXMgPGJvcmRlcj4uCisgKiBrZWVwT3JpZ2luIC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgdHJhbnNsYXRlIHNob3VsZCBiZQorICogY2hhbmdlZC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqIG1hcmdpbiAtIE9wdGlvbmFsIG1hcmdpbiBpbiBwaXhlbHMuIERlZmF1bHQgaXMgMC4KKyAqIGVuYWJsZWQgLSBPcHRpb25hbCBib29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIHRoZSBzY2FsZSBzaG91bGQgYmUgc2V0IG9yCisgKiBqdXN0IHJldHVybmVkLiBEZWZhdWx0IGlzIHRydWUuCisgKiBpZ25vcmVXaWR0aCAtIE9wdGlvbmFsIGJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIHdpZHRoIHNob3VsZCBiZQorICogaWdub3JlZC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqIGlnbm9yZUhlaWdodCAtIE9wdGlvbmFsIGJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIGhlaWdodCBzaG91bGQgYmUKKyAqIGlnbm9yZWQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmZpdCA9IGZ1bmN0aW9uKGJvcmRlciwga2VlcE9yaWdpbiwgbWFyZ2luLCBlbmFibGVkLCBpZ25vcmVXaWR0aCwgaWdub3JlSGVpZ2h0KQoreworCWlmICh0aGlzLmNvbnRhaW5lciAhPSBudWxsKQorCXsKKwkJYm9yZGVyID0gKGJvcmRlciAhPSBudWxsKSA/IGJvcmRlciA6IHRoaXMuZ2V0Qm9yZGVyKCk7CisJCWtlZXBPcmlnaW4gPSAoa2VlcE9yaWdpbiAhPSBudWxsKSA/IGtlZXBPcmlnaW4gOiBmYWxzZTsKKwkJbWFyZ2luID0gKG1hcmdpbiAhPSBudWxsKSA/IG1hcmdpbiA6IDA7CisJCWVuYWJsZWQgPSAoZW5hYmxlZCAhPSBudWxsKSA/IGVuYWJsZWQgOiB0cnVlOworCQlpZ25vcmVXaWR0aCA9IChpZ25vcmVXaWR0aCAhPSBudWxsKSA/IGlnbm9yZVdpZHRoIDogZmFsc2U7CisJCWlnbm9yZUhlaWdodCA9IChpZ25vcmVIZWlnaHQgIT0gbnVsbCkgPyBpZ25vcmVIZWlnaHQgOiBmYWxzZTsKKwkJCisJCS8vIEFkZHMgc3BhY2luZyBhbmQgYm9yZGVyIGZyb20gY3NzCisJCXZhciBjc3NCb3JkZXIgPSB0aGlzLmdldEJvcmRlclNpemVzKCk7CisJCXZhciB3MSA9IHRoaXMuY29udGFpbmVyLm9mZnNldFdpZHRoIC0gY3NzQm9yZGVyLnggLSBjc3NCb3JkZXIud2lkdGggLSAxOworCQl2YXIgaDEgPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHQgLSBjc3NCb3JkZXIueSAtIGNzc0JvcmRlci5oZWlnaHQgLSAxOworCQl2YXIgYm91bmRzID0gdGhpcy52aWV3LmdldEdyYXBoQm91bmRzKCk7CisJCQorCQlpZiAoYm91bmRzLndpZHRoID4gMCAmJiBib3VuZHMuaGVpZ2h0ID4gMCkKKwkJeworCQkJaWYgKGtlZXBPcmlnaW4gJiYgYm91bmRzLnggIT0gbnVsbCAmJiBib3VuZHMueSAhPSBudWxsKQorCQkJeworCQkJCWJvdW5kcyA9IGJvdW5kcy5jbG9uZSgpOworCQkJCWJvdW5kcy53aWR0aCArPSBib3VuZHMueDsKKwkJCQlib3VuZHMuaGVpZ2h0ICs9IGJvdW5kcy55OworCQkJCWJvdW5kcy54ID0gMDsKKwkJCQlib3VuZHMueSA9IDA7CisJCQl9CisJCQkKKwkJCS8vIExBVEVSOiBVc2UgdW5zY2FsZWQgYm91bmRpbmcgYm94ZXMgdG8gZml4IHJvdW5kaW5nIGVycm9ycworCQkJdmFyIHMgPSB0aGlzLnZpZXcuc2NhbGU7CisJCQl2YXIgdzIgPSBib3VuZHMud2lkdGggLyBzOworCQkJdmFyIGgyID0gYm91bmRzLmhlaWdodCAvIHM7CisJCQkKKwkJCS8vIEZpdHMgdG8gdGhlIHNpemUgb2YgdGhlIGJhY2tncm91bmQgaW1hZ2UgaWYgcmVxdWlyZWQKKwkJCWlmICh0aGlzLmJhY2tncm91bmRJbWFnZSAhPSBudWxsKQorCQkJeworCQkJCXcyID0gTWF0aC5tYXgodzIsIHRoaXMuYmFja2dyb3VuZEltYWdlLndpZHRoIC0gYm91bmRzLnggLyBzKTsKKwkJCQloMiA9IE1hdGgubWF4KGgyLCB0aGlzLmJhY2tncm91bmRJbWFnZS5oZWlnaHQgLSBib3VuZHMueSAvIHMpOworCQkJfQorCQkJCisJCQl2YXIgYiA9ICgoa2VlcE9yaWdpbikgPyBib3JkZXIgOiAyICogYm9yZGVyKSArIG1hcmdpbjsKKworCQkJdzEgLT0gYjsKKwkJCWgxIC09IGI7CisJCQkKKwkJCXZhciBzMiA9ICgoKGlnbm9yZVdpZHRoKSA/IGgxIC8gaDIgOiAoaWdub3JlSGVpZ2h0KSA/IHcxIC8gdzIgOgorCQkJCU1hdGgubWluKHcxIC8gdzIsIGgxIC8gaDIpKSk7CisJCQkKKwkJCWlmICh0aGlzLm1pbkZpdFNjYWxlICE9IG51bGwpCisJCQl7CisJCQkJczIgPSBNYXRoLm1heChzMiwgdGhpcy5taW5GaXRTY2FsZSk7CisJCQl9CisJCQkKKwkJCWlmICh0aGlzLm1heEZpdFNjYWxlICE9IG51bGwpCisJCQl7CisJCQkJczIgPSBNYXRoLm1pbihzMiwgdGhpcy5tYXhGaXRTY2FsZSk7CisJCQl9CisJCisJCQlpZiAoZW5hYmxlZCkKKwkJCXsKKwkJCQlpZiAoIWtlZXBPcmlnaW4pCisJCQkJeworCQkJCQlpZiAoIW14VXRpbHMuaGFzU2Nyb2xsYmFycyh0aGlzLmNvbnRhaW5lcikpCisJCQkJCXsKKwkJCQkJCXZhciB4MCA9IChib3VuZHMueCAhPSBudWxsKSA/IE1hdGguZmxvb3IodGhpcy52aWV3LnRyYW5zbGF0ZS54IC0gYm91bmRzLnggLyBzICsgYm9yZGVyIC8gczIgKyBtYXJnaW4gLyAyKSA6IGJvcmRlcjsKKwkJCQkJCXZhciB5MCA9IChib3VuZHMueSAhPSBudWxsKSA/IE1hdGguZmxvb3IodGhpcy52aWV3LnRyYW5zbGF0ZS55IC0gYm91bmRzLnkgLyBzICsgYm9yZGVyIC8gczIgKyBtYXJnaW4gLyAyKSA6IGJvcmRlcjsKKworCQkJCQkJdGhpcy52aWV3LnNjYWxlQW5kVHJhbnNsYXRlKHMyLCB4MCwgeTApOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJdGhpcy52aWV3LnNldFNjYWxlKHMyKTsKKwkJCQkJCXZhciBiMiA9IHRoaXMuZ2V0R3JhcGhCb3VuZHMoKTsKKwkJCQkJCQorCQkJCQkJaWYgKGIyLnggIT0gbnVsbCkKKwkJCQkJCXsKKwkJCQkJCQl0aGlzLmNvbnRhaW5lci5zY3JvbGxMZWZ0ID0gYjIueDsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJaWYgKGIyLnkgIT0gbnVsbCkKKwkJCQkJCXsKKwkJCQkJCQl0aGlzLmNvbnRhaW5lci5zY3JvbGxUb3AgPSBiMi55OworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHRoaXMudmlldy5zY2FsZSAhPSBzMikKKwkJCQl7CisJCQkJCXRoaXMudmlldy5zZXRTY2FsZShzMik7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBzMjsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiB0aGlzLnZpZXcuc2NhbGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzaXplRGlkQ2hhbmdlCisgKiAKKyAqIENhbGxlZCB3aGVuIHRoZSBzaXplIG9mIHRoZSBncmFwaCBoYXMgY2hhbmdlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBmaXJlcworICogYSA8c2l6ZT4gZXZlbnQgYWZ0ZXIgdXBkYXRpbmcgdGhlIGNsaXBwaW5nIHJlZ2lvbiBvZiB0aGUgU1ZHIGVsZW1lbnQgaW4KKyAqIFNWRy1iYXNlcyBicm93c2Vycy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2l6ZURpZENoYW5nZSA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgYm91bmRzID0gdGhpcy5nZXRHcmFwaEJvdW5kcygpOworCQorCWlmICh0aGlzLmNvbnRhaW5lciAhPSBudWxsKQorCXsKKwkJdmFyIGJvcmRlciA9IHRoaXMuZ2V0Qm9yZGVyKCk7CisJCQorCQl2YXIgd2lkdGggPSBNYXRoLm1heCgwLCBib3VuZHMueCArIGJvdW5kcy53aWR0aCArIGJvcmRlcik7CisJCXZhciBoZWlnaHQgPSBNYXRoLm1heCgwLCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgKyBib3JkZXIpOworCQkKKwkJaWYgKHRoaXMubWluaW11bUNvbnRhaW5lclNpemUgIT0gbnVsbCkKKwkJeworCQkJd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgdGhpcy5taW5pbXVtQ29udGFpbmVyU2l6ZS53aWR0aCk7CisJCQloZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIHRoaXMubWluaW11bUNvbnRhaW5lclNpemUuaGVpZ2h0KTsKKwkJfQorCisJCWlmICh0aGlzLnJlc2l6ZUNvbnRhaW5lcikKKwkJeworCQkJdGhpcy5kb1Jlc2l6ZUNvbnRhaW5lcih3aWR0aCwgaGVpZ2h0KTsKKwkJfQorCisJCWlmICh0aGlzLnByZWZlclBhZ2VTaXplIHx8ICghbXhDbGllbnQuSVNfSUUgJiYgdGhpcy5wYWdlVmlzaWJsZSkpCisJCXsKKwkJCXZhciBzaXplID0gdGhpcy5nZXRQcmVmZXJyZWRQYWdlU2l6ZShib3VuZHMsIE1hdGgubWF4KDEsIHdpZHRoKSwgTWF0aC5tYXgoMSwgaGVpZ2h0KSk7CisJCQkKKwkJCWlmIChzaXplICE9IG51bGwpCisJCQl7CisJCQkJd2lkdGggPSBzaXplLndpZHRoICogdGhpcy52aWV3LnNjYWxlOworCQkJCWhlaWdodCA9IHNpemUuaGVpZ2h0ICogdGhpcy52aWV3LnNjYWxlOworCQkJfQorCQl9CisJCQorCQlpZiAodGhpcy5taW5pbXVtR3JhcGhTaXplICE9IG51bGwpCisJCXsKKwkJCXdpZHRoID0gTWF0aC5tYXgod2lkdGgsIHRoaXMubWluaW11bUdyYXBoU2l6ZS53aWR0aCAqIHRoaXMudmlldy5zY2FsZSk7CisJCQloZWlnaHQgPSBNYXRoLm1heChoZWlnaHQsIHRoaXMubWluaW11bUdyYXBoU2l6ZS5oZWlnaHQgKiB0aGlzLnZpZXcuc2NhbGUpOworCQl9CisKKwkJd2lkdGggPSBNYXRoLmNlaWwod2lkdGgpOworCQloZWlnaHQgPSBNYXRoLmNlaWwoaGVpZ2h0KTsKKworCQlpZiAodGhpcy5kaWFsZWN0ID09IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHKQorCQl7CisJCQl2YXIgcm9vdCA9IHRoaXMudmlldy5nZXREcmF3UGFuZSgpLm93bmVyU1ZHRWxlbWVudDsKKwkJCQorCQkJcm9vdC5zdHlsZS5taW5XaWR0aCA9IE1hdGgubWF4KDEsIHdpZHRoKSArICdweCc7CisJCQlyb290LnN0eWxlLm1pbkhlaWdodCA9IE1hdGgubWF4KDEsIGhlaWdodCkgKyAncHgnOworCQkJcm9vdC5zdHlsZS53aWR0aCA9ICcxMDAlJzsKKwkJCXJvb3Quc3R5bGUuaGVpZ2h0ID0gJzEwMCUnOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKG14Q2xpZW50LklTX1FVSVJLUykKKwkJCXsKKwkJCQkvLyBRdWlya3MgbW9kZSBkb2VzIG5vdCBzdXBwb3J0IG1pbldpZHRoLy1IZWlnaHQKKwkJCQl0aGlzLnZpZXcudXBkYXRlSHRtbENhbnZhc1NpemUoTWF0aC5tYXgoMSwgd2lkdGgpLCBNYXRoLm1heCgxLCBoZWlnaHQpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl0aGlzLnZpZXcuY2FudmFzLnN0eWxlLm1pbldpZHRoID0gTWF0aC5tYXgoMSwgd2lkdGgpICsgJ3B4JzsKKwkJCQl0aGlzLnZpZXcuY2FudmFzLnN0eWxlLm1pbkhlaWdodCA9IE1hdGgubWF4KDEsIGhlaWdodCkgKyAncHgnOworCQkJfQorCQl9CisJCQorCQl0aGlzLnVwZGF0ZVBhZ2VCcmVha3ModGhpcy5wYWdlQnJlYWtzVmlzaWJsZSwgd2lkdGgsIGhlaWdodCk7CisJfQorCisJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5TSVpFLCAnYm91bmRzJywgYm91bmRzKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkb1Jlc2l6ZUNvbnRhaW5lcgorICogCisgKiBSZXNpemVzIHRoZSBjb250YWluZXIgZm9yIHRoZSBnaXZlbiBncmFwaCB3aWR0aCBhbmQgaGVpZ2h0LgorICovCitteEdyYXBoLnByb3RvdHlwZS5kb1Jlc2l6ZUNvbnRhaW5lciA9IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpCit7CisJaWYgKHRoaXMubWF4aW11bUNvbnRhaW5lclNpemUgIT0gbnVsbCkKKwl7CisJCXdpZHRoID0gTWF0aC5taW4odGhpcy5tYXhpbXVtQ29udGFpbmVyU2l6ZS53aWR0aCwgd2lkdGgpOworCQloZWlnaHQgPSBNYXRoLm1pbih0aGlzLm1heGltdW1Db250YWluZXJTaXplLmhlaWdodCwgaGVpZ2h0KTsKKwl9CisKKwl0aGlzLmNvbnRhaW5lci5zdHlsZS53aWR0aCA9IE1hdGguY2VpbCh3aWR0aCkgKyAncHgnOworCXRoaXMuY29udGFpbmVyLnN0eWxlLmhlaWdodCA9IE1hdGguY2VpbChoZWlnaHQpICsgJ3B4JzsKK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZVBhZ2VCcmVha3MKKyAqIAorICogSW52b2tlcyBmcm9tIDxzaXplRGlkQ2hhbmdlPiB0byByZWRyYXcgdGhlIHBhZ2UgYnJlYWtzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2aXNpYmxlIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiBwYWdlIGJyZWFrcyBzaG91bGQgYmUgc2hvd24uCisgKiB3aWR0aCAtIFNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGNvbnRhaW5lciBpbiBwaXhlbHMuCisgKiBoZWlnaHQgLSBTcGVjaWZpZXMgdGhlIGhlaWdodCBvZiB0aGUgY29udGFpbmVyIGluIHBpeGVscy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUudXBkYXRlUGFnZUJyZWFrcyA9IGZ1bmN0aW9uKHZpc2libGUsIHdpZHRoLCBoZWlnaHQpCit7CisJdmFyIHNjYWxlID0gdGhpcy52aWV3LnNjYWxlOworCXZhciB0ciA9IHRoaXMudmlldy50cmFuc2xhdGU7CisJdmFyIGZtdCA9IHRoaXMucGFnZUZvcm1hdDsKKwl2YXIgcHMgPSBzY2FsZSAqIHRoaXMucGFnZVNjYWxlOworCXZhciBib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUoMCwgMCwgZm10LndpZHRoICogcHMsIGZtdC5oZWlnaHQgKiBwcyk7CisKKwl2YXIgZ2IgPSBteFJlY3RhbmdsZS5mcm9tUmVjdGFuZ2xlKHRoaXMuZ2V0R3JhcGhCb3VuZHMoKSk7CisJZ2Iud2lkdGggPSBNYXRoLm1heCgxLCBnYi53aWR0aCk7CisJZ2IuaGVpZ2h0ID0gTWF0aC5tYXgoMSwgZ2IuaGVpZ2h0KTsKKwkKKwlib3VuZHMueCA9IE1hdGguZmxvb3IoKGdiLnggLSB0ci54ICogc2NhbGUpIC8gYm91bmRzLndpZHRoKSAqIGJvdW5kcy53aWR0aCArIHRyLnggKiBzY2FsZTsKKwlib3VuZHMueSA9IE1hdGguZmxvb3IoKGdiLnkgLSB0ci55ICogc2NhbGUpIC8gYm91bmRzLmhlaWdodCkgKiBib3VuZHMuaGVpZ2h0ICsgdHIueSAqIHNjYWxlOworCQorCWdiLndpZHRoID0gTWF0aC5jZWlsKChnYi53aWR0aCArIChnYi54IC0gYm91bmRzLngpKSAvIGJvdW5kcy53aWR0aCkgKiBib3VuZHMud2lkdGg7CisJZ2IuaGVpZ2h0ID0gTWF0aC5jZWlsKChnYi5oZWlnaHQgKyAoZ2IueSAtIGJvdW5kcy55KSkgLyBib3VuZHMuaGVpZ2h0KSAqIGJvdW5kcy5oZWlnaHQ7CisJCisJLy8gRG9lcyBub3Qgc2hvdyBwYWdlIGJyZWFrcyBpZiB0aGUgc2NhbGUgaXMgdG9vIHNtYWxsCisJdmlzaWJsZSA9IHZpc2libGUgJiYgTWF0aC5taW4oYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KSA+IHRoaXMubWluUGFnZUJyZWFrRGlzdDsKKworCXZhciBob3Jpem9udGFsQ291bnQgPSAodmlzaWJsZSkgPyBNYXRoLmNlaWwoZ2IuaGVpZ2h0IC8gYm91bmRzLmhlaWdodCkgKyAxIDogMDsKKwl2YXIgdmVydGljYWxDb3VudCA9ICh2aXNpYmxlKSA/IE1hdGguY2VpbChnYi53aWR0aCAvIGJvdW5kcy53aWR0aCkgKyAxIDogMDsKKwl2YXIgcmlnaHQgPSAodmVydGljYWxDb3VudCAtIDEpICogYm91bmRzLndpZHRoOworCXZhciBib3R0b20gPSAoaG9yaXpvbnRhbENvdW50IC0gMSkgKiBib3VuZHMuaGVpZ2h0OworCQorCWlmICh0aGlzLmhvcml6b250YWxQYWdlQnJlYWtzID09IG51bGwgJiYgaG9yaXpvbnRhbENvdW50ID4gMCkKKwl7CisJCXRoaXMuaG9yaXpvbnRhbFBhZ2VCcmVha3MgPSBbXTsKKwl9CisKKwlpZiAodGhpcy52ZXJ0aWNhbFBhZ2VCcmVha3MgPT0gbnVsbCAmJiB2ZXJ0aWNhbENvdW50ID4gMCkKKwl7CisJCXRoaXMudmVydGljYWxQYWdlQnJlYWtzID0gW107CisJfQorCQorCXZhciBkcmF3UGFnZUJyZWFrcyA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihicmVha3MpCisJeworCQlpZiAoYnJlYWtzICE9IG51bGwpCisJCXsKKwkJCXZhciBjb3VudCA9IChicmVha3MgPT0gdGhpcy5ob3Jpem9udGFsUGFnZUJyZWFrcykgPyBob3Jpem9udGFsQ291bnQgOiB2ZXJ0aWNhbENvdW50OyAKKwkJCQorCQkJZm9yICh2YXIgaSA9IDA7IGkgPD0gY291bnQ7IGkrKykKKwkJCXsKKwkJCQl2YXIgcHRzID0gKGJyZWFrcyA9PSB0aGlzLmhvcml6b250YWxQYWdlQnJlYWtzKSA/CisJCQkJCVtuZXcgbXhQb2ludChNYXRoLnJvdW5kKGJvdW5kcy54KSwgTWF0aC5yb3VuZChib3VuZHMueSArIGkgKiBib3VuZHMuaGVpZ2h0KSksCisJCQkgICAgICAgICBuZXcgbXhQb2ludChNYXRoLnJvdW5kKGJvdW5kcy54ICsgcmlnaHQpLCBNYXRoLnJvdW5kKGJvdW5kcy55ICsgaSAqIGJvdW5kcy5oZWlnaHQpKV0gOgorCQkJICAgICAgICBbbmV3IG14UG9pbnQoTWF0aC5yb3VuZChib3VuZHMueCArIGkgKiBib3VuZHMud2lkdGgpLCBNYXRoLnJvdW5kKGJvdW5kcy55KSksCisJCQkgICAgICAgICBuZXcgbXhQb2ludChNYXRoLnJvdW5kKGJvdW5kcy54ICsgaSAqIGJvdW5kcy53aWR0aCksIE1hdGgucm91bmQoYm91bmRzLnkgKyBib3R0b20pKV07CisKKwkJCQlpZiAoYnJlYWtzW2ldICE9IG51bGwpCisJCQkJeworCQkJCQlicmVha3NbaV0ucG9pbnRzID0gcHRzOworCQkJCQlicmVha3NbaV0ucmVkcmF3KCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXZhciBwYWdlQnJlYWsgPSBuZXcgbXhQb2x5bGluZShwdHMsIHRoaXMucGFnZUJyZWFrQ29sb3IpOworCQkJCQlwYWdlQnJlYWsuZGlhbGVjdCA9IHRoaXMuZGlhbGVjdDsKKwkJCQkJcGFnZUJyZWFrLnBvaW50ZXJFdmVudHMgPSBmYWxzZTsKKwkJCQkJcGFnZUJyZWFrLmlzRGFzaGVkID0gdGhpcy5wYWdlQnJlYWtEYXNoZWQ7CisJCQkJCXBhZ2VCcmVhay5pbml0KHRoaXMudmlldy5iYWNrZ3JvdW5kUGFuZSk7CisJCQkJCXBhZ2VCcmVhay5yZWRyYXcoKTsKKwkJCQkJCisJCQkJCWJyZWFrc1tpXSA9IHBhZ2VCcmVhazsKKwkJCQl9CisJCQl9CisJCQkKKwkJCWZvciAodmFyIGkgPSBjb3VudDsgaSA8IGJyZWFrcy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQlicmVha3NbaV0uZGVzdHJveSgpOworCQkJfQorCQkJCisJCQlicmVha3Muc3BsaWNlKGNvdW50LCBicmVha3MubGVuZ3RoIC0gY291bnQpOworCQl9CisJfSk7CisJCisJZHJhd1BhZ2VCcmVha3ModGhpcy5ob3Jpem9udGFsUGFnZUJyZWFrcyk7CisJZHJhd1BhZ2VCcmVha3ModGhpcy52ZXJ0aWNhbFBhZ2VCcmVha3MpOworfTsKKworLyoqCisgKiBHcm91cDogQ2VsbCBzdHlsZXMKKyAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDZWxsU3R5bGUKKyAqIAorICogUmV0dXJucyBhbiBhcnJheSBvZiBrZXksIHZhbHVlIHBhaXJzIHJlcHJlc2VudGluZyB0aGUgY2VsbCBzdHlsZSBmb3IgdGhlCisgKiBnaXZlbiBjZWxsLiBJZiBubyBzdHJpbmcgaXMgZGVmaW5lZCBpbiB0aGUgbW9kZWwgdGhhdCBzcGVjaWZpZXMgdGhlCisgKiBzdHlsZSwgdGhlbiB0aGUgZGVmYXVsdCBzdHlsZSBmb3IgdGhlIGNlbGwgaXMgcmV0dXJuZWQgb3IgPEVNUFRZX0FSUkFZPiwKKyAqIGlmIG5vdCBzdHlsZSBjYW4gYmUgZm91bmQuIE5vdGU6IFlvdSBzaG91bGQgdHJ5IGFuZCBnZXQgdGhlIGNlbGwgc3RhdGUKKyAqIGZvciB0aGUgZ2l2ZW4gY2VsbCBhbmQgdXNlIHRoZSBjYWNoZWQgc3R5bGUgaW4gdGhlIHN0YXRlIGJlZm9yZSB1c2luZworICogdGhpcyBtZXRob2QuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBzdHlsZSBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYW4gYXJyYXkuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldENlbGxTdHlsZSA9IGZ1bmN0aW9uKGNlbGwpCit7CisJdmFyIHN0eWxlbmFtZSA9IHRoaXMubW9kZWwuZ2V0U3R5bGUoY2VsbCk7CisJdmFyIHN0eWxlID0gbnVsbDsKKwkKKwkvLyBHZXRzIHRoZSBkZWZhdWx0IHN0eWxlIGZvciB0aGUgY2VsbAorCWlmICh0aGlzLm1vZGVsLmlzRWRnZShjZWxsKSkKKwl7CisJCXN0eWxlID0gdGhpcy5zdHlsZXNoZWV0LmdldERlZmF1bHRFZGdlU3R5bGUoKTsKKwl9CisJZWxzZQorCXsKKwkJc3R5bGUgPSB0aGlzLnN0eWxlc2hlZXQuZ2V0RGVmYXVsdFZlcnRleFN0eWxlKCk7CisJfQorCQorCS8vIFJlc29sdmVzIHRoZSBzdHlsZW5hbWUgdXNpbmcgdGhlIGFib3ZlIGFzIHRoZSBkZWZhdWx0CisJaWYgKHN0eWxlbmFtZSAhPSBudWxsKQorCXsKKwkJc3R5bGUgPSB0aGlzLnBvc3RQcm9jZXNzQ2VsbFN0eWxlKHRoaXMuc3R5bGVzaGVldC5nZXRDZWxsU3R5bGUoc3R5bGVuYW1lLCBzdHlsZSkpOworCX0KKwkKKwkvLyBSZXR1cm5zIGEgbm9uLW51bGwgdmFsdWUgaWYgbm8gc3R5bGUgY2FuIGJlIGZvdW5kCisJaWYgKHN0eWxlID09IG51bGwpCisJeworCQlzdHlsZSA9IG14R3JhcGgucHJvdG90eXBlLkVNUFRZX0FSUkFZOworCX0KKwkKKwlyZXR1cm4gc3R5bGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBwb3N0UHJvY2Vzc0NlbGxTdHlsZQorICogCisgKiBUcmllcyB0byByZXNvbHZlIHRoZSB2YWx1ZSBmb3IgdGhlIGltYWdlIHN0eWxlIGluIHRoZSBpbWFnZSBidW5kbGVzIGFuZAorICogdHVybnMgc2hvcnQgZGF0YSBVUklzIGFzIGRlZmluZWQgaW4gbXhJbWFnZUJ1bmRsZSB0byBkYXRhIFVSSXMgYXMKKyAqIGRlZmluZWQgaW4gUkZDIDIzOTcgb2YgdGhlIElFVEYuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnBvc3RQcm9jZXNzQ2VsbFN0eWxlID0gZnVuY3Rpb24oc3R5bGUpCit7CisJaWYgKHN0eWxlICE9IG51bGwpCisJeworCQl2YXIga2V5ID0gc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfSU1BR0VdOworCQl2YXIgaW1hZ2UgPSB0aGlzLmdldEltYWdlRnJvbUJ1bmRsZXMoa2V5KTsKKworCQlpZiAoaW1hZ2UgIT0gbnVsbCkKKwkJeworCQkJc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfSU1BR0VdID0gaW1hZ2U7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpbWFnZSA9IGtleTsKKwkJfQorCQkKKwkJLy8gQ29udmVydHMgc2hvcnQgZGF0YSB1cmlzIHRvIG5vcm1hbCBkYXRhIHVyaXMKKwkJaWYgKGltYWdlICE9IG51bGwgJiYgaW1hZ2Uuc3Vic3RyaW5nKDAsIDExKSA9PSAnZGF0YTppbWFnZS8nKQorCQl7CisJCQlpZiAoaW1hZ2Uuc3Vic3RyaW5nKDAsIDIwKSA9PSAnZGF0YTppbWFnZS9zdmcreG1sLDwnKQorCQkJeworCQkJCS8vIFJlcXVpcmVkIGZvciBGRiBhbmQgSUUxMQorCQkJCWltYWdlID0gaW1hZ2Uuc3Vic3RyaW5nKDAsIDE5KSArIGVuY29kZVVSSUNvbXBvbmVudChpbWFnZS5zdWJzdHJpbmcoMTkpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGltYWdlLnN1YnN0cmluZygwLCAyMikgIT0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbCwlM0MnKQorCQkJeworCQkJCXZhciBjb21tYSA9IGltYWdlLmluZGV4T2YoJywnKTsKKwkJCQkKKwkJCQkvLyBBZGRzIGJhc2U2NCBlbmNvZGluZyBwcmVmaXggaWYgbmVlZGVkCisJCQkJaWYgKGNvbW1hID4gMCAmJiBpbWFnZS5zdWJzdHJpbmcoY29tbWEgLSA3LCBjb21tYSArIDEpICE9ICc7YmFzZTY0LCcpCisJCQkJeworCQkJCQlpbWFnZSA9IGltYWdlLnN1YnN0cmluZygwLCBjb21tYSkgKyAnO2Jhc2U2NCwnCisJCQkJCQkrIGltYWdlLnN1YnN0cmluZyhjb21tYSArIDEpOworCQkJCX0KKwkJCX0KKwkJCQorCQkJc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfSU1BR0VdID0gaW1hZ2U7CisJCX0KKwl9CisKKwlyZXR1cm4gc3R5bGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRDZWxsU3R5bGUKKyAqIAorICogU2V0cyB0aGUgc3R5bGUgb2YgdGhlIHNwZWNpZmllZCBjZWxscy4gSWYgbm8gY2VsbHMgYXJlIGdpdmVuLCB0aGVuIHRoZQorICogc2VsZWN0aW9uIGNlbGxzIGFyZSBjaGFuZ2VkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdHlsZSAtIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5ldyBzdHlsZSBvZiB0aGUgY2VsbHMuCisgKiBjZWxscyAtIE9wdGlvbmFsIGFycmF5IG9mIDxteENlbGxzPiB0byBzZXQgdGhlIHN0eWxlIGZvci4gRGVmYXVsdCBpcyB0aGUKKyAqIHNlbGVjdGlvbiBjZWxscy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0Q2VsbFN0eWxlID0gZnVuY3Rpb24oc3R5bGUsIGNlbGxzKQoreworCWNlbGxzID0gY2VsbHMgfHwgdGhpcy5nZXRTZWxlY3Rpb25DZWxscygpOworCQorCWlmIChjZWxscyAhPSBudWxsKQorCXsKKwkJdGhpcy5tb2RlbC5iZWdpblVwZGF0ZSgpOworCQl0cnkKKwkJeworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQl0aGlzLm1vZGVsLnNldFN0eWxlKGNlbGxzW2ldLCBzdHlsZSk7CisJCQl9CisJCX0KKwkJZmluYWxseQorCQl7CisJCQl0aGlzLm1vZGVsLmVuZFVwZGF0ZSgpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogdG9nZ2xlQ2VsbFN0eWxlCisgKiAKKyAqIFRvZ2dsZXMgdGhlIGJvb2xlYW4gdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgaW4gdGhlIHN0eWxlIG9mIHRoZSBnaXZlbiBjZWxsCisgKiBhbmQgcmV0dXJucyB0aGUgbmV3IHZhbHVlIGFzIDAgb3IgMS4gSWYgbm8gY2VsbCBpcyBzcGVjaWZpZWQgdGhlbiB0aGUKKyAqIHNlbGVjdGlvbiBjZWxsIGlzIHVzZWQuCisgKiAKKyAqIFBhcmFtZXRlcjoKKyAqIAorICoga2V5IC0gU3RyaW5nIHJlcHJlc2VudGluZyB0aGUga2V5IGZvciB0aGUgYm9vbGVhbiB2YWx1ZSB0byBiZSB0b2dnbGVkLgorICogZGVmYXVsdFZhbHVlIC0gT3B0aW9uYWwgYm9vbGVhbiBkZWZhdWx0IHZhbHVlIGlmIG5vIHZhbHVlIGlzIGRlZmluZWQuCisgKiBEZWZhdWx0IGlzIGZhbHNlLgorICogY2VsbCAtIE9wdGlvbmFsIDxteENlbGw+IHdob3NlIHN0eWxlIHNob3VsZCBiZSBtb2RpZmllZC4gRGVmYXVsdCBpcworICogdGhlIHNlbGVjdGlvbiBjZWxsLgorICovCitteEdyYXBoLnByb3RvdHlwZS50b2dnbGVDZWxsU3R5bGUgPSBmdW5jdGlvbihrZXksIGRlZmF1bHRWYWx1ZSwgY2VsbCkKK3sKKwljZWxsID0gY2VsbCB8fCB0aGlzLmdldFNlbGVjdGlvbkNlbGwoKTsKKwkKKwlyZXR1cm4gdGhpcy50b2dnbGVDZWxsU3R5bGVzKGtleSwgZGVmYXVsdFZhbHVlLCBbY2VsbF0pOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdG9nZ2xlQ2VsbFN0eWxlcworICogCisgKiBUb2dnbGVzIHRoZSBib29sZWFuIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBzdHlsZSBvZiB0aGUgZ2l2ZW4gY2VsbHMKKyAqIGFuZCByZXR1cm5zIHRoZSBuZXcgdmFsdWUgYXMgMCBvciAxLiBJZiBubyBjZWxscyBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoZQorICogc2VsZWN0aW9uIGNlbGxzIGFyZSB1c2VkLiBGb3IgZXhhbXBsZSwgdGhpcyBjYW4gYmUgdXNlZCB0byB0b2dnbGUKKyAqIDxteENvbnN0YW50cy5TVFlMRV9ST1VOREVEPiBvciBhbnkgb3RoZXIgc3R5bGUgd2l0aCBhIGJvb2xlYW4gdmFsdWUuCisgKiAKKyAqIFBhcmFtZXRlcjoKKyAqIAorICoga2V5IC0gU3RyaW5nIHJlcHJlc2VudGluZyB0aGUga2V5IGZvciB0aGUgYm9vbGVhbiB2YWx1ZSB0byBiZSB0b2dnbGVkLgorICogZGVmYXVsdFZhbHVlIC0gT3B0aW9uYWwgYm9vbGVhbiBkZWZhdWx0IHZhbHVlIGlmIG5vIHZhbHVlIGlzIGRlZmluZWQuCisgKiBEZWZhdWx0IGlzIGZhbHNlLgorICogY2VsbHMgLSBPcHRpb25hbCBhcnJheSBvZiA8bXhDZWxscz4gd2hvc2Ugc3R5bGVzIHNob3VsZCBiZSBtb2RpZmllZC4KKyAqIERlZmF1bHQgaXMgdGhlIHNlbGVjdGlvbiBjZWxscy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUudG9nZ2xlQ2VsbFN0eWxlcyA9IGZ1bmN0aW9uKGtleSwgZGVmYXVsdFZhbHVlLCBjZWxscykKK3sKKwlkZWZhdWx0VmFsdWUgPSAoZGVmYXVsdFZhbHVlICE9IG51bGwpID8gZGVmYXVsdFZhbHVlIDogZmFsc2U7CisJY2VsbHMgPSBjZWxscyB8fCB0aGlzLmdldFNlbGVjdGlvbkNlbGxzKCk7CisJdmFyIHZhbHVlID0gbnVsbDsKKwkKKwlpZiAoY2VsbHMgIT0gbnVsbCAmJiBjZWxscy5sZW5ndGggPiAwKQorCXsKKwkJdmFyIHN0YXRlID0gdGhpcy52aWV3LmdldFN0YXRlKGNlbGxzWzBdKTsKKwkJdmFyIHN0eWxlID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuc3R5bGUgOiB0aGlzLmdldENlbGxTdHlsZShjZWxsc1swXSk7CisJCQorCQlpZiAoc3R5bGUgIT0gbnVsbCkKKwkJeworCQkJdmFsdWUgPSAobXhVdGlscy5nZXRWYWx1ZShzdHlsZSwga2V5LCBkZWZhdWx0VmFsdWUpKSA/IDAgOiAxOworCQkJdGhpcy5zZXRDZWxsU3R5bGVzKGtleSwgdmFsdWUsIGNlbGxzKTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRDZWxsU3R5bGVzCisgKiAKKyAqIFNldHMgdGhlIGtleSB0byB2YWx1ZSBpbiB0aGUgc3R5bGVzIG9mIHRoZSBnaXZlbiBjZWxscy4gVGhpcyB3aWxsIG1vZGlmeQorICogdGhlIGV4aXN0aW5nIGNlbGwgc3R5bGVzIGluLXBsYWNlIGFuZCBvdmVycmlkZSBhbnkgZXhpc3RpbmcgYXNzaWdubWVudAorICogZm9yIHRoZSBnaXZlbiBrZXkuIElmIG5vIGNlbGxzIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHNlbGVjdGlvbiBjZWxscworICogYXJlIGNoYW5nZWQuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgcmVzcGVjdGl2ZSBrZXkgaXMKKyAqIHJlbW92ZWQgZnJvbSB0aGUgc3R5bGVzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBrZXkgLSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBrZXkgdG8gYmUgYXNzaWduZWQuCisgKiB2YWx1ZSAtIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGtleS4KKyAqIGNlbGxzIC0gT3B0aW9uYWwgYXJyYXkgb2YgPG14Q2VsbHM+IHRvIGNoYW5nZSB0aGUgc3R5bGUgZm9yLiBEZWZhdWx0IGlzCisgKiB0aGUgc2VsZWN0aW9uIGNlbGxzLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZXRDZWxsU3R5bGVzID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSwgY2VsbHMpCit7CisJY2VsbHMgPSBjZWxscyB8fCB0aGlzLmdldFNlbGVjdGlvbkNlbGxzKCk7CisJbXhVdGlscy5zZXRDZWxsU3R5bGVzKHRoaXMubW9kZWwsIGNlbGxzLCBrZXksIHZhbHVlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHRvZ2dsZUNlbGxTdHlsZUZsYWdzCisgKiAKKyAqIFRvZ2dsZXMgdGhlIGdpdmVuIGJpdCBmb3IgdGhlIGdpdmVuIGtleSBpbiB0aGUgc3R5bGVzIG9mIHRoZSBzcGVjaWZpZWQKKyAqIGNlbGxzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBrZXkgLSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBrZXkgdG8gdG9nZ2xlIHRoZSBmbGFnIGluLgorICogZmxhZyAtIEludGVnZXIgdGhhdCByZXByZXNlbnRzIHRoZSBiaXQgdG8gYmUgdG9nZ2xlZC4KKyAqIGNlbGxzIC0gT3B0aW9uYWwgYXJyYXkgb2YgPG14Q2VsbHM+IHRvIGNoYW5nZSB0aGUgc3R5bGUgZm9yLiBEZWZhdWx0IGlzCisgKiB0aGUgc2VsZWN0aW9uIGNlbGxzLgorICovCitteEdyYXBoLnByb3RvdHlwZS50b2dnbGVDZWxsU3R5bGVGbGFncyA9IGZ1bmN0aW9uKGtleSwgZmxhZywgY2VsbHMpCit7CisJdGhpcy5zZXRDZWxsU3R5bGVGbGFncyhrZXksIGZsYWcsIG51bGwsIGNlbGxzKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldENlbGxTdHlsZUZsYWdzCisgKiAKKyAqIFNldHMgb3IgdG9nZ2xlcyB0aGUgZ2l2ZW4gYml0IGZvciB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBzdHlsZXMgb2YgdGhlCisgKiBzcGVjaWZpZWQgY2VsbHMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGtleSAtIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIGtleSB0byB0b2dnbGUgdGhlIGZsYWcgaW4uCisgKiBmbGFnIC0gSW50ZWdlciB0aGF0IHJlcHJlc2VudHMgdGhlIGJpdCB0byBiZSB0b2dnbGVkLgorICogdmFsdWUgLSBCb29sZWFuIHZhbHVlIHRvIGJlIHVzZWQgb3IgbnVsbCBpZiB0aGUgdmFsdWUgc2hvdWxkIGJlIHRvZ2dsZWQuCisgKiBjZWxscyAtIE9wdGlvbmFsIGFycmF5IG9mIDxteENlbGxzPiB0byBjaGFuZ2UgdGhlIHN0eWxlIGZvci4gRGVmYXVsdCBpcworICogdGhlIHNlbGVjdGlvbiBjZWxscy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0Q2VsbFN0eWxlRmxhZ3MgPSBmdW5jdGlvbihrZXksIGZsYWcsIHZhbHVlLCBjZWxscykKK3sKKwljZWxscyA9IGNlbGxzIHx8IHRoaXMuZ2V0U2VsZWN0aW9uQ2VsbHMoKTsKKwkKKwlpZiAoY2VsbHMgIT0gbnVsbCAmJiBjZWxscy5sZW5ndGggPiAwKQorCXsKKwkJaWYgKHZhbHVlID09IG51bGwpCisJCXsKKwkJCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShjZWxsc1swXSk7CisJCQl2YXIgc3R5bGUgPSAoc3RhdGUgIT0gbnVsbCkgPyBzdGF0ZS5zdHlsZSA6IHRoaXMuZ2V0Q2VsbFN0eWxlKGNlbGxzWzBdKTsKKwkJCQorCQkJaWYgKHN0eWxlICE9IG51bGwpCisJCQl7CisJCQkJdmFyIGN1cnJlbnQgPSBwYXJzZUludChzdHlsZVtrZXldIHx8IDApOworCQkJCXZhbHVlID0gISgoY3VycmVudCAmIGZsYWcpID09IGZsYWcpOworCQkJfQorCQl9CisKKwkJbXhVdGlscy5zZXRDZWxsU3R5bGVGbGFncyh0aGlzLm1vZGVsLCBjZWxscywga2V5LCBmbGFnLCB2YWx1ZSk7CisJfQorfTsKKworLyoqCisgKiBHcm91cDogQ2VsbCBhbGlnbm1lbnQgYW5kIG9yaWVudGF0aW9uCisgKi8KKworLyoqCisgKiBGdW5jdGlvbjogYWxpZ25DZWxscworICogCisgKiBBbGlnbnMgdGhlIGdpdmVuIGNlbGxzIHZlcnRpY2FsbHkgb3IgaG9yaXpvbnRhbGx5IGFjY29yZGluZyB0byB0aGUgZ2l2ZW4KKyAqIGFsaWdubWVudCB1c2luZyB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyIGFzIHRoZSBjb29yZGluYXRlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBhbGlnbiAtIFNwZWNpZmllcyB0aGUgYWxpZ25tZW50LiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGFsbCBjb25zdGFudHMgaW4KKyAqIG14Q29uc3RhbnRzIHdpdGggYW4gQUxJR04gcHJlZml4LgorICogY2VsbHMgLSBBcnJheSBvZiA8bXhDZWxscz4gdG8gYmUgYWxpZ25lZC4KKyAqIHBhcmFtIC0gT3B0aW9uYWwgY29vcmRpbmF0ZSBmb3IgdGhlIGFsaWdubWVudC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuYWxpZ25DZWxscyA9IGZ1bmN0aW9uKGFsaWduLCBjZWxscywgcGFyYW0pCit7CisJaWYgKGNlbGxzID09IG51bGwpCisJeworCQljZWxscyA9IHRoaXMuZ2V0U2VsZWN0aW9uQ2VsbHMoKTsKKwl9CisJCisJaWYgKGNlbGxzICE9IG51bGwgJiYgY2VsbHMubGVuZ3RoID4gMSkKKwl7CisJCS8vIEZpbmRzIHRoZSByZXF1aXJlZCBjb29yZGluYXRlIGZvciB0aGUgYWxpZ25tZW50CisJCWlmIChwYXJhbSA9PSBudWxsKQorCQl7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShjZWxsc1tpXSk7CisJCQkJCisJCQkJaWYgKHN0YXRlICE9IG51bGwgJiYgIXRoaXMubW9kZWwuaXNFZGdlKGNlbGxzW2ldKSkKKwkJCQl7CisJCQkJCWlmIChwYXJhbSA9PSBudWxsKQorCQkJCQl7CisJCQkJCQlpZiAoYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fQ0VOVEVSKQorCQkJCQkJeworCQkJCQkJCXBhcmFtID0gc3RhdGUueCArIHN0YXRlLndpZHRoIC8gMjsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKGFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX1JJR0hUKQorCQkJCQkJeworCQkJCQkJCXBhcmFtID0gc3RhdGUueCArIHN0YXRlLndpZHRoOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fVE9QKQorCQkJCQkJeworCQkJCQkJCXBhcmFtID0gc3RhdGUueTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKGFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSkKKwkJCQkJCXsKKwkJCQkJCQlwYXJhbSA9IHN0YXRlLnkgKyBzdGF0ZS5oZWlnaHQgLyAyOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAoYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fQk9UVE9NKQorCQkJCQkJeworCQkJCQkJCXBhcmFtID0gc3RhdGUueSArIHN0YXRlLmhlaWdodDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwYXJhbSA9IHN0YXRlLng7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlpZiAoYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fUklHSFQpCisJCQkJCQl7CisJCQkJCQkJcGFyYW0gPSBNYXRoLm1heChwYXJhbSwgc3RhdGUueCArIHN0YXRlLndpZHRoKTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKGFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX1RPUCkKKwkJCQkJCXsKKwkJCQkJCQlwYXJhbSA9IE1hdGgubWluKHBhcmFtLCBzdGF0ZS55KTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYgKGFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX0JPVFRPTSkKKwkJCQkJCXsKKwkJCQkJCQlwYXJhbSA9IE1hdGgubWF4KHBhcmFtLCBzdGF0ZS55ICsgc3RhdGUuaGVpZ2h0KTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlwYXJhbSA9IE1hdGgubWluKHBhcmFtLCBzdGF0ZS54KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIEFsaWducyB0aGUgY2VsbHMgdG8gdGhlIGNvb3JkaW5hdGUKKwkJaWYgKHBhcmFtICE9IG51bGwpCisJCXsKKwkJCXZhciBzID0gdGhpcy52aWV3LnNjYWxlOworCisJCQl0aGlzLm1vZGVsLmJlZ2luVXBkYXRlKCk7CisJCQl0cnkKKwkJCXsKKwkJCQlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorCQkJCXsKKwkJCQkJdmFyIHN0YXRlID0gdGhpcy52aWV3LmdldFN0YXRlKGNlbGxzW2ldKTsKKwkJCQkJCisJCQkJCWlmIChzdGF0ZSAhPSBudWxsKQorCQkJCQl7CisJCQkJCQl2YXIgZ2VvID0gdGhpcy5nZXRDZWxsR2VvbWV0cnkoY2VsbHNbaV0pOworCQkJCQkJCisJCQkJCQlpZiAoZ2VvICE9IG51bGwgJiYgIXRoaXMubW9kZWwuaXNFZGdlKGNlbGxzW2ldKSkKKwkJCQkJCXsKKwkJCQkJCQlnZW8gPSBnZW8uY2xvbmUoKTsKKwkJCQkJCQkKKwkJCQkJCQlpZiAoYWxpZ24gPT0gbXhDb25zdGFudHMuQUxJR05fQ0VOVEVSKQorCQkJCQkJCXsKKwkJCQkJCQkJZ2VvLnggKz0gKHBhcmFtIC0gc3RhdGUueCAtIHN0YXRlLndpZHRoIC8gMikgLyBzOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmIChhbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9SSUdIVCkKKwkJCQkJCQl7CisJCQkJCQkJCWdlby54ICs9IChwYXJhbSAtIHN0YXRlLnggLSBzdGF0ZS53aWR0aCkgLyBzOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmIChhbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9UT1ApCisJCQkJCQkJeworCQkJCQkJCQlnZW8ueSArPSAocGFyYW0gLSBzdGF0ZS55KSAvIHM7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYgKGFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSkKKwkJCQkJCQl7CisJCQkJCQkJCWdlby55ICs9IChwYXJhbSAtIHN0YXRlLnkgLSBzdGF0ZS5oZWlnaHQgLyAyKSAvIHM7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYgKGFsaWduID09IG14Q29uc3RhbnRzLkFMSUdOX0JPVFRPTSkKKwkJCQkJCQl7CisJCQkJCQkJCWdlby55ICs9IChwYXJhbSAtIHN0YXRlLnkgLSBzdGF0ZS5oZWlnaHQpIC8gczsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJZ2VvLnggKz0gKHBhcmFtIC0gc3RhdGUueCkgLyBzOworCQkJCQkJCX0KKwkJCQkJCQkKKwkJCQkJCQl0aGlzLnJlc2l6ZUNlbGwoY2VsbHNbaV0sIGdlbyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5BTElHTl9DRUxMUywKKwkJCQkJCSdhbGlnbicsIGFsaWduLCAnY2VsbHMnLCBjZWxscykpOworCQkJfQorCQkJZmluYWxseQorCQkJeworCQkJCXRoaXMubW9kZWwuZW5kVXBkYXRlKCk7CisJCQl9CisJCX0KKwl9CisJCisJcmV0dXJuIGNlbGxzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZmxpcEVkZ2UKKyAqIAorICogVG9nZ2xlcyB0aGUgc3R5bGUgb2YgdGhlIGdpdmVuIGVkZ2UgYmV0d2VlbiBudWxsIChvciBlbXB0eSkgYW5kCisgKiA8YWx0ZXJuYXRlRWRnZVN0eWxlPi4gVGhpcyBtZXRob2QgZmlyZXMgPG14RXZlbnQuRkxJUF9FREdFPiB3aGlsZSB0aGUKKyAqIHRyYW5zYWN0aW9uIGlzIGluIHByb2dyZXNzLiBSZXR1cm5zIHRoZSBlZGdlIHRoYXQgd2FzIGZsaXBwZWQuCisgKiAKKyAqIEhlcmUgaXMgYW4gZXhhbXBsZSB0aGF0IG92ZXJyaWRlcyB0aGlzIGltcGxlbWVudGF0aW9uIHRvIGludmVydCB0aGUKKyAqIHZhbHVlIG9mIDxteENvbnN0YW50cy5TVFlMRV9FTEJPVz4gd2l0aG91dCByZW1vdmluZyBhbnkgZXhpc3Rpbmcgc3R5bGVzLgorICogCisgKiAoY29kZSkKKyAqIGdyYXBoLmZsaXBFZGdlID0gZnVuY3Rpb24oZWRnZSkKKyAqIHsKKyAqICAgaWYgKGVkZ2UgIT0gbnVsbCkKKyAqICAgeworICogICAgIHZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShlZGdlKTsKKyAqICAgICB2YXIgc3R5bGUgPSAoc3RhdGUgIT0gbnVsbCkgPyBzdGF0ZS5zdHlsZSA6IHRoaXMuZ2V0Q2VsbFN0eWxlKGVkZ2UpOworICogICAgIAorICogICAgIGlmIChzdHlsZSAhPSBudWxsKQorICogICAgIHsKKyAqICAgICAgIHZhciBlbGJvdyA9IG14VXRpbHMuZ2V0VmFsdWUoc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0VMQk9XLAorICogICAgICAgICAgIG14Q29uc3RhbnRzLkVMQk9XX0hPUklaT05UQUwpOworICogICAgICAgdmFyIHZhbHVlID0gKGVsYm93ID09IG14Q29uc3RhbnRzLkVMQk9XX0hPUklaT05UQUwpID8KKyAqICAgICAgICAgICBteENvbnN0YW50cy5FTEJPV19WRVJUSUNBTCA6IG14Q29uc3RhbnRzLkVMQk9XX0hPUklaT05UQUw7CisgKiAgICAgICB0aGlzLnNldENlbGxTdHlsZXMobXhDb25zdGFudHMuU1RZTEVfRUxCT1csIHZhbHVlLCBbZWRnZV0pOworICogICAgIH0KKyAqICAgfQorICogfTsKKyAqIChlbmQpCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGVkZ2UgLSA8bXhDZWxsPiB3aG9zZSBzdHlsZSBzaG91bGQgYmUgY2hhbmdlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZmxpcEVkZ2UgPSBmdW5jdGlvbihlZGdlKQoreworCWlmIChlZGdlICE9IG51bGwgJiYKKwkJdGhpcy5hbHRlcm5hdGVFZGdlU3R5bGUgIT0gbnVsbCkKKwl7CisJCXRoaXMubW9kZWwuYmVnaW5VcGRhdGUoKTsKKwkJdHJ5CisJCXsKKwkJCXZhciBzdHlsZSA9IHRoaXMubW9kZWwuZ2V0U3R5bGUoZWRnZSk7CisKKwkJCWlmIChzdHlsZSA9PSBudWxsIHx8IHN0eWxlLmxlbmd0aCA9PSAwKQorCQkJeworCQkJCXRoaXMubW9kZWwuc2V0U3R5bGUoZWRnZSwgdGhpcy5hbHRlcm5hdGVFZGdlU3R5bGUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXRoaXMubW9kZWwuc2V0U3R5bGUoZWRnZSwgbnVsbCk7CisJCQl9CisKKwkJCS8vIFJlbW92ZXMgYWxsIGV4aXN0aW5nIGNvbnRyb2wgcG9pbnRzCisJCQl0aGlzLnJlc2V0RWRnZShlZGdlKTsKKwkJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuRkxJUF9FREdFLCAnZWRnZScsIGVkZ2UpKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCXRoaXMubW9kZWwuZW5kVXBkYXRlKCk7CisJCX0KKwl9CisKKwlyZXR1cm4gZWRnZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZEltYWdlQnVuZGxlCisgKgorICogQWRkcyB0aGUgc3BlY2lmaWVkIDxteEltYWdlQnVuZGxlPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuYWRkSW1hZ2VCdW5kbGUgPSBmdW5jdGlvbihidW5kbGUpCit7CisJdGhpcy5pbWFnZUJ1bmRsZXMucHVzaChidW5kbGUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVtb3ZlSW1hZ2VCdW5kbGUKKyAqIAorICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIDxteEltYWdlQnVuZGxlPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUucmVtb3ZlSW1hZ2VCdW5kbGUgPSBmdW5jdGlvbihidW5kbGUpCit7CisJdmFyIHRtcCA9IFtdOworCQorCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5pbWFnZUJ1bmRsZXMubGVuZ3RoOyBpKyspCisJeworCQlpZiAodGhpcy5pbWFnZUJ1bmRsZXNbaV0gIT0gYnVuZGxlKQorCQl7CisJCQl0bXAucHVzaCh0aGlzLmltYWdlQnVuZGxlc1tpXSk7CisJCX0KKwl9CisJCisJdGhpcy5pbWFnZUJ1bmRsZXMgPSB0bXA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRJbWFnZUZyb21CdW5kbGVzCisgKgorICogU2VhcmNoZXMgYWxsIDxpbWFnZUJ1bmRsZXM+IGZvciB0aGUgc3BlY2lmaWVkIGtleSBhbmQgcmV0dXJucyB0aGUgdmFsdWUKKyAqIGZvciB0aGUgZmlyc3QgbWF0Y2ggb3IgbnVsbCBpZiB0aGUga2V5IGlzIG5vdCBmb3VuZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0SW1hZ2VGcm9tQnVuZGxlcyA9IGZ1bmN0aW9uKGtleSkKK3sKKwlpZiAoa2V5ICE9IG51bGwpCisJeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuaW1hZ2VCdW5kbGVzLmxlbmd0aDsgaSsrKQorCQl7CisJCQl2YXIgaW1hZ2UgPSB0aGlzLmltYWdlQnVuZGxlc1tpXS5nZXRJbWFnZShrZXkpOworCQkJCisJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKKwkJCXsKKwkJCQlyZXR1cm4gaW1hZ2U7CisJCQl9CisJCX0KKwl9CisJCisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEdyb3VwOiBPcmRlcgorICovCisKKy8qKgorICogRnVuY3Rpb246IG9yZGVyQ2VsbHMKKyAqIAorICogTW92ZXMgdGhlIGdpdmVuIGNlbGxzIHRvIHRoZSBmcm9udCBvciBiYWNrLiBUaGUgY2hhbmdlIGlzIGNhcnJpZWQgb3V0CisgKiB1c2luZyA8Y2VsbHNPcmRlcmVkPi4gVGhpcyBtZXRob2QgZmlyZXMgPG14RXZlbnQuT1JERVJfQ0VMTFM+IHdoaWxlIHRoZQorICogdHJhbnNhY3Rpb24gaXMgaW4gcHJvZ3Jlc3MuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGJhY2sgLSBCb29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIHRoZSBjZWxscyBzaG91bGQgYmUgbW92ZWQgdG8gYmFjay4KKyAqIGNlbGxzIC0gQXJyYXkgb2YgPG14Q2VsbHM+IHRvIG1vdmUgdG8gdGhlIGJhY2tncm91bmQuIElmIG51bGwgaXMKKyAqIHNwZWNpZmllZCB0aGVuIHRoZSBzZWxlY3Rpb24gY2VsbHMgYXJlIHVzZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLm9yZGVyQ2VsbHMgPSBmdW5jdGlvbihiYWNrLCBjZWxscykKK3sKKwlpZiAoY2VsbHMgPT0gbnVsbCkKKwl7CisJCWNlbGxzID0gbXhVdGlscy5zb3J0Q2VsbHModGhpcy5nZXRTZWxlY3Rpb25DZWxscygpLCB0cnVlKTsKKwl9CisKKwl0aGlzLm1vZGVsLmJlZ2luVXBkYXRlKCk7CisJdHJ5CisJeworCQl0aGlzLmNlbGxzT3JkZXJlZChjZWxscywgYmFjayk7CisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuT1JERVJfQ0VMTFMsCisJCQkJJ2JhY2snLCBiYWNrLCAnY2VsbHMnLCBjZWxscykpOworCX0KKwlmaW5hbGx5CisJeworCQl0aGlzLm1vZGVsLmVuZFVwZGF0ZSgpOworCX0KKworCXJldHVybiBjZWxsczsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNlbGxzT3JkZXJlZAorICogCisgKiBNb3ZlcyB0aGUgZ2l2ZW4gY2VsbHMgdG8gdGhlIGZyb250IG9yIGJhY2suIFRoaXMgbWV0aG9kIGZpcmVzCisgKiA8bXhFdmVudC5DRUxMU19PUkRFUkVEPiB3aGlsZSB0aGUgdHJhbnNhY3Rpb24gaXMgaW4gcHJvZ3Jlc3MuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGxzIC0gQXJyYXkgb2YgPG14Q2VsbHM+IHdob3NlIG9yZGVyIHNob3VsZCBiZSBjaGFuZ2VkLgorICogYmFjayAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIGNlbGxzIHNob3VsZCBiZSBtb3ZlZCB0byBiYWNrLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jZWxsc09yZGVyZWQgPSBmdW5jdGlvbihjZWxscywgYmFjaykKK3sKKwlpZiAoY2VsbHMgIT0gbnVsbCkKKwl7CisJCXRoaXMubW9kZWwuYmVnaW5VcGRhdGUoKTsKKwkJdHJ5CisJCXsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJdmFyIHBhcmVudCA9IHRoaXMubW9kZWwuZ2V0UGFyZW50KGNlbGxzW2ldKTsKKworCQkJCWlmIChiYWNrKQorCQkJCXsKKwkJCQkJdGhpcy5tb2RlbC5hZGQocGFyZW50LCBjZWxsc1tpXSwgaSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXRoaXMubW9kZWwuYWRkKHBhcmVudCwgY2VsbHNbaV0sCisJCQkJCQkJdGhpcy5tb2RlbC5nZXRDaGlsZENvdW50KHBhcmVudCkgLSAxKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuQ0VMTFNfT1JERVJFRCwKKwkJCQkJJ2JhY2snLCBiYWNrLCAnY2VsbHMnLCBjZWxscykpOworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJdGhpcy5tb2RlbC5lbmRVcGRhdGUoKTsKKwkJfQorCX0KK307CisKKy8qKgorICogR3JvdXA6IEdyb3VwaW5nCisgKi8KKworLyoqCisgKiBGdW5jdGlvbjogZ3JvdXBDZWxscworICogCisgKiBBZGRzIHRoZSBjZWxscyBpbnRvIHRoZSBnaXZlbiBncm91cC4gVGhlIGNoYW5nZSBpcyBjYXJyaWVkIG91dCB1c2luZworICogPGNlbGxzQWRkZWQ+LCA8Y2VsbHNNb3ZlZD4gYW5kIDxjZWxsc1Jlc2l6ZWQ+LiBUaGlzIG1ldGhvZCBmaXJlcworICogPG14RXZlbnQuR1JPVVBfQ0VMTFM+IHdoaWxlIHRoZSB0cmFuc2FjdGlvbiBpcyBpbiBwcm9ncmVzcy4gUmV0dXJucyB0aGUKKyAqIG5ldyBncm91cC4gQSBncm91cCBpcyBvbmx5IGNyZWF0ZWQgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGVudHJ5IGluIHRoZQorICogZ2l2ZW4gYXJyYXkgb2YgY2VsbHMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGdyb3VwIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSB0YXJnZXQgZ3JvdXAuIElmIG51bGwgaXMgc3BlY2lmaWVkCisgKiB0aGVuIGEgbmV3IGdyb3VwIGlzIGNyZWF0ZWQgdXNpbmcgPGNyZWF0ZUdyb3VwQ2VsbD4uCisgKiBib3JkZXIgLSBPcHRpb25hbCBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSBib3JkZXIgYmV0d2VlbiB0aGUgY2hpbGQKKyAqIGFyZWEgYW5kIHRoZSBncm91cCBib3VuZHMuIERlZmF1bHQgaXMgMC4KKyAqIGNlbGxzIC0gT3B0aW9uYWwgYXJyYXkgb2YgPG14Q2VsbHM+IHRvIGJlIGdyb3VwZWQuIElmIG51bGwgaXMgc3BlY2lmaWVkCisgKiB0aGVuIHRoZSBzZWxlY3Rpb24gY2VsbHMgYXJlIHVzZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdyb3VwQ2VsbHMgPSBmdW5jdGlvbihncm91cCwgYm9yZGVyLCBjZWxscykKK3sKKwlpZiAoY2VsbHMgPT0gbnVsbCkKKwl7CisJCWNlbGxzID0gbXhVdGlscy5zb3J0Q2VsbHModGhpcy5nZXRTZWxlY3Rpb25DZWxscygpLCB0cnVlKTsKKwl9CisKKwljZWxscyA9IHRoaXMuZ2V0Q2VsbHNGb3JHcm91cChjZWxscyk7CisKKwlpZiAoZ3JvdXAgPT0gbnVsbCkKKwl7CisJCWdyb3VwID0gdGhpcy5jcmVhdGVHcm91cENlbGwoY2VsbHMpOworCX0KKworCXZhciBib3VuZHMgPSB0aGlzLmdldEJvdW5kc0Zvckdyb3VwKGdyb3VwLCBjZWxscywgYm9yZGVyKTsKKworCWlmIChjZWxscy5sZW5ndGggPiAwICYmIGJvdW5kcyAhPSBudWxsKQorCXsKKwkJLy8gVXNlcyBwYXJlbnQgb2YgZ3JvdXAgb3IgcHJldmlvdXMgcGFyZW50IG9mIGZpcnN0IGNoaWxkCisJCXZhciBwYXJlbnQgPSB0aGlzLm1vZGVsLmdldFBhcmVudChncm91cCk7CisJCQorCQlpZiAocGFyZW50ID09IG51bGwpCisJCXsKKwkJCXBhcmVudCA9IHRoaXMubW9kZWwuZ2V0UGFyZW50KGNlbGxzWzBdKTsKKwkJfQorCisJCXRoaXMubW9kZWwuYmVnaW5VcGRhdGUoKTsKKwkJdHJ5CisJCXsKKwkJCS8vIENoZWNrcyBpZiB0aGUgZ3JvdXAgaGFzIGEgZ2VvbWV0cnkgYW5kCisJCQkvLyBjcmVhdGVzIG9uZSBpZiBvbmUgZG9lcyBub3QgZXhpc3QKKwkJCWlmICh0aGlzLmdldENlbGxHZW9tZXRyeShncm91cCkgPT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLm1vZGVsLnNldEdlb21ldHJ5KGdyb3VwLCBuZXcgbXhHZW9tZXRyeSgpKTsKKwkJCX0KKworCQkJLy8gQWRkcyB0aGUgZ3JvdXAgaW50byB0aGUgcGFyZW50CisJCQl2YXIgaW5kZXggPSB0aGlzLm1vZGVsLmdldENoaWxkQ291bnQocGFyZW50KTsKKwkJCXRoaXMuY2VsbHNBZGRlZChbZ3JvdXBdLCBwYXJlbnQsIGluZGV4LCBudWxsLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKworCQkJLy8gQWRkcyB0aGUgY2hpbGRyZW4gaW50byB0aGUgZ3JvdXAgYW5kIG1vdmVzCisJCQlpbmRleCA9IHRoaXMubW9kZWwuZ2V0Q2hpbGRDb3VudChncm91cCk7CisJCQl0aGlzLmNlbGxzQWRkZWQoY2VsbHMsIGdyb3VwLCBpbmRleCwgbnVsbCwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisJCQl0aGlzLmNlbGxzTW92ZWQoY2VsbHMsIC1ib3VuZHMueCwgLWJvdW5kcy55LCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKworCQkJLy8gUmVzaXplcyB0aGUgZ3JvdXAKKwkJCXRoaXMuY2VsbHNSZXNpemVkKFtncm91cF0sIFtib3VuZHNdLCBmYWxzZSk7CisKKwkJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuR1JPVVBfQ0VMTFMsCisJCQkJCSdncm91cCcsIGdyb3VwLCAnYm9yZGVyJywgYm9yZGVyLCAnY2VsbHMnLCBjZWxscykpOworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJdGhpcy5tb2RlbC5lbmRVcGRhdGUoKTsKKwkJfQorCX0KKworCXJldHVybiBncm91cDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldENlbGxzRm9yR3JvdXAKKyAqIAorICogUmV0dXJucyB0aGUgY2VsbHMgd2l0aCB0aGUgc2FtZSBwYXJlbnQgYXMgdGhlIGZpcnN0IGNlbGwKKyAqIGluIHRoZSBnaXZlbiBhcnJheS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0Q2VsbHNGb3JHcm91cCA9IGZ1bmN0aW9uKGNlbGxzKQoreworCXZhciByZXN1bHQgPSBbXTsKKworCWlmIChjZWxscyAhPSBudWxsICYmIGNlbGxzLmxlbmd0aCA+IDApCisJeworCQl2YXIgcGFyZW50ID0gdGhpcy5tb2RlbC5nZXRQYXJlbnQoY2VsbHNbMF0pOworCQlyZXN1bHQucHVzaChjZWxsc1swXSk7CisKKwkJLy8gRmlsdGVycyBzZWxlY3Rpb24gY2VsbHMgd2l0aCB0aGUgc2FtZSBwYXJlbnQKKwkJZm9yICh2YXIgaSA9IDE7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkJeworCQkJaWYgKHRoaXMubW9kZWwuZ2V0UGFyZW50KGNlbGxzW2ldKSA9PSBwYXJlbnQpCisJCQl7CisJCQkJcmVzdWx0LnB1c2goY2VsbHNbaV0pOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEJvdW5kc0Zvckdyb3VwCisgKiAKKyAqIFJldHVybnMgdGhlIGJvdW5kcyB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gZ3JvdXAgYW5kIGNoaWxkcmVuLgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRCb3VuZHNGb3JHcm91cCA9IGZ1bmN0aW9uKGdyb3VwLCBjaGlsZHJlbiwgYm9yZGVyKQoreworCXZhciByZXN1bHQgPSB0aGlzLmdldEJvdW5kaW5nQm94RnJvbUdlb21ldHJ5KGNoaWxkcmVuLCB0cnVlKTsKKwkKKwlpZiAocmVzdWx0ICE9IG51bGwpCisJeworCQlpZiAodGhpcy5pc1N3aW1sYW5lKGdyb3VwKSkKKwkJeworCQkJdmFyIHNpemUgPSB0aGlzLmdldFN0YXJ0U2l6ZShncm91cCk7CisJCQkKKwkJCXJlc3VsdC54IC09IHNpemUud2lkdGg7CisJCQlyZXN1bHQueSAtPSBzaXplLmhlaWdodDsKKwkJCXJlc3VsdC53aWR0aCArPSBzaXplLndpZHRoOworCQkJcmVzdWx0LmhlaWdodCArPSBzaXplLmhlaWdodDsKKwkJfQorCQkKKwkJLy8gQWRkcyB0aGUgYm9yZGVyCisJCWlmIChib3JkZXIgIT0gbnVsbCkKKwkJeworCQkJcmVzdWx0LnggLT0gYm9yZGVyOworCQkJcmVzdWx0LnkgLT0gYm9yZGVyOworCQkJcmVzdWx0LndpZHRoICs9IDIgKiBib3JkZXI7CisJCQlyZXN1bHQuaGVpZ2h0ICs9IDIgKiBib3JkZXI7CisJCX0KKwl9CQkJCisJCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUdyb3VwQ2VsbAorICogCisgKiBIb29rIGZvciBjcmVhdGluZyB0aGUgZ3JvdXAgY2VsbCB0byBob2xkIHRoZSBnaXZlbiBhcnJheSBvZiA8bXhDZWxscz4gaWYKKyAqIG5vIGdyb3VwIGNlbGwgd2FzIGdpdmVuIHRvIHRoZSA8Z3JvdXA+IGZ1bmN0aW9uLgorICogCisgKiBUaGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBzdHlsZSBvZiBuZXcgZ3JvdXAgY2VsbHMuCisgKiAKKyAqIChjb2RlKQorICogdmFyIGdyYXBoQ3JlYXRlR3JvdXBDZWxsID0gZ3JhcGguY3JlYXRlR3JvdXBDZWxsOworICogZ3JhcGguY3JlYXRlR3JvdXBDZWxsID0gZnVuY3Rpb24oY2VsbHMpCisgKiB7CisgKiAgIHZhciBncm91cCA9IGdyYXBoQ3JlYXRlR3JvdXBDZWxsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgKiAgIGdyb3VwLnNldFN0eWxlKCdncm91cCcpOworICogICAKKyAqICAgcmV0dXJuIGdyb3VwOworICogfTsKKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY3JlYXRlR3JvdXBDZWxsID0gZnVuY3Rpb24oY2VsbHMpCit7CisJdmFyIGdyb3VwID0gbmV3IG14Q2VsbCgnJyk7CisJZ3JvdXAuc2V0VmVydGV4KHRydWUpOworCWdyb3VwLnNldENvbm5lY3RhYmxlKGZhbHNlKTsKKwkKKwlyZXR1cm4gZ3JvdXA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1bmdyb3VwQ2VsbHMKKyAqIAorICogVW5ncm91cHMgdGhlIGdpdmVuIGNlbGxzIGJ5IG1vdmluZyB0aGUgY2hpbGRyZW4gdGhlIGNoaWxkcmVuIHRvIHRoZWlyCisgKiBwYXJlbnRzIHBhcmVudCBhbmQgcmVtb3ZpbmcgdGhlIGVtcHR5IGdyb3Vwcy4gUmV0dXJucyB0aGUgY2hpbGRyZW4gdGhhdAorICogaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZ3JvdXBzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxscyAtIEFycmF5IG9mIGNlbGxzIHRvIGJlIHVuZ3JvdXBlZC4gSWYgbnVsbCBpcyBzcGVjaWZpZWQgdGhlbiB0aGUKKyAqIHNlbGVjdGlvbiBjZWxscyBhcmUgdXNlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUudW5ncm91cENlbGxzID0gZnVuY3Rpb24oY2VsbHMpCit7CisJdmFyIHJlc3VsdCA9IFtdOworCQorCWlmIChjZWxscyA9PSBudWxsKQorCXsKKwkJY2VsbHMgPSB0aGlzLmdldFNlbGVjdGlvbkNlbGxzKCk7CisKKwkJLy8gRmluZHMgdGhlIGNlbGxzIHdpdGggY2hpbGRyZW4KKwkJdmFyIHRtcCA9IFtdOworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkJeworCQkJaWYgKHRoaXMubW9kZWwuZ2V0Q2hpbGRDb3VudChjZWxsc1tpXSkgPiAwKQorCQkJeworCQkJCXRtcC5wdXNoKGNlbGxzW2ldKTsKKwkJCX0KKwkJfQorCisJCWNlbGxzID0gdG1wOworCX0KKwkKKwlpZiAoY2VsbHMgIT0gbnVsbCAmJiBjZWxscy5sZW5ndGggPiAwKQorCXsKKwkJdGhpcy5tb2RlbC5iZWdpblVwZGF0ZSgpOworCQl0cnkKKwkJeworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQl2YXIgY2hpbGRyZW4gPSB0aGlzLm1vZGVsLmdldENoaWxkcmVuKGNlbGxzW2ldKTsKKwkJCQkKKwkJCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKQorCQkJCXsKKwkJCQkJY2hpbGRyZW4gPSBjaGlsZHJlbi5zbGljZSgpOworCQkJCQl2YXIgcGFyZW50ID0gdGhpcy5tb2RlbC5nZXRQYXJlbnQoY2VsbHNbaV0pOworCQkJCQl2YXIgaW5kZXggPSB0aGlzLm1vZGVsLmdldENoaWxkQ291bnQocGFyZW50KTsKKworCQkJCQl0aGlzLmNlbGxzQWRkZWQoY2hpbGRyZW4sIHBhcmVudCwgaW5kZXgsIG51bGwsIG51bGwsIHRydWUpOworCQkJCQlyZXN1bHQgPSByZXN1bHQuY29uY2F0KGNoaWxkcmVuKTsKKwkJCQl9CisJCQl9CisKKwkJCXRoaXMucmVtb3ZlQ2VsbHNBZnRlclVuZ3JvdXAoY2VsbHMpOworCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5VTkdST1VQX0NFTExTLCAnY2VsbHMnLCBjZWxscykpOworCQl9CisJCWZpbmFsbHkKKwkJeworCQkJdGhpcy5tb2RlbC5lbmRVcGRhdGUoKTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gcmVzdWx0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVtb3ZlQ2VsbHNBZnRlclVuZ3JvdXAKKyAqIAorICogSG9vayB0byByZW1vdmUgdGhlIGdyb3VwcyBhZnRlciA8dW5ncm91cENlbGxzPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbHMgLSBBcnJheSBvZiA8bXhDZWxscz4gdGhhdCB3ZXJlIHVuZ3JvdXBlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUucmVtb3ZlQ2VsbHNBZnRlclVuZ3JvdXAgPSBmdW5jdGlvbihjZWxscykKK3sKKwl0aGlzLmNlbGxzUmVtb3ZlZCh0aGlzLmFkZEFsbEVkZ2VzKGNlbGxzKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZW1vdmVDZWxsc0Zyb21QYXJlbnQKKyAqIAorICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGNlbGxzIGZyb20gdGhlaXIgcGFyZW50cyBhbmQgYWRkcyB0aGVtIHRvIHRoZQorICogZGVmYXVsdCBwYXJlbnQuIFJldHVybnMgdGhlIGNlbGxzIHRoYXQgd2VyZSByZW1vdmVkIGZyb20gdGhlaXIgcGFyZW50cy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbHMgLSBBcnJheSBvZiA8bXhDZWxscz4gdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZWlyIHBhcmVudHMuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnJlbW92ZUNlbGxzRnJvbVBhcmVudCA9IGZ1bmN0aW9uKGNlbGxzKQoreworCWlmIChjZWxscyA9PSBudWxsKQorCXsKKwkJY2VsbHMgPSB0aGlzLmdldFNlbGVjdGlvbkNlbGxzKCk7CisJfQorCQorCXRoaXMubW9kZWwuYmVnaW5VcGRhdGUoKTsKKwl0cnkKKwl7CisJCXZhciBwYXJlbnQgPSB0aGlzLmdldERlZmF1bHRQYXJlbnQoKTsKKwkJdmFyIGluZGV4ID0gdGhpcy5tb2RlbC5nZXRDaGlsZENvdW50KHBhcmVudCk7CisKKwkJdGhpcy5jZWxsc0FkZGVkKGNlbGxzLCBwYXJlbnQsIGluZGV4LCBudWxsLCBudWxsLCB0cnVlKTsKKwkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5SRU1PVkVfQ0VMTFNfRlJPTV9QQVJFTlQsICdjZWxscycsIGNlbGxzKSk7CisJfQorCWZpbmFsbHkKKwl7CisJCXRoaXMubW9kZWwuZW5kVXBkYXRlKCk7CisJfQorCisJcmV0dXJuIGNlbGxzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlR3JvdXBCb3VuZHMKKyAqIAorICogVXBkYXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBncm91cHMgdG8gaW5jbHVkZSBhbGwgY2hpbGRyZW4gYW5kIHJldHVybnMKKyAqIHRoZSBwYXNzZWQtaW4gY2VsbHMuIENhbGwgdGhpcyB3aXRoIHRoZSBncm91cHMgaW4gcGFyZW50IHRvIGNoaWxkIG9yZGVyLAorICogdG9wLW1vc3QgZ3JvdXAgZmlyc3QsIHRoZSBjZWxscyBhcmUgcHJvY2Vzc2VkIGluIHJldmVyc2Ugb3JkZXIgYW5kIGNlbGxzCisgKiB3aXRoIG5vIGNoaWxkcmVuIGFyZSBpZ25vcmVkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxscyAtIFRoZSBncm91cHMgd2hvc2UgYm91bmRzIHNob3VsZCBiZSB1cGRhdGVkLiBJZiB0aGlzIGlzIG51bGwsIHRoZW4KKyAqIHRoZSBzZWxlY3Rpb24gY2VsbHMgYXJlIHVzZWQuCisgKiBib3JkZXIgLSBPcHRpb25hbCBib3JkZXIgdG8gYmUgYWRkZWQgaW4gdGhlIGdyb3VwLiBEZWZhdWx0IGlzIDAuCisgKiBtb3ZlR3JvdXAgLSBPcHRpb25hbCBib29sZWFuIHRoYXQgYWxsb3dzIHRoZSBncm91cCB0byBiZSBtb3ZlZC4gRGVmYXVsdAorICogaXMgZmFsc2UuCisgKiB0b3BCb3JkZXIgLSBPcHRpb25hbCB0b3AgYm9yZGVyIHRvIGJlIGFkZGVkIGluIHRoZSBncm91cC4gRGVmYXVsdCBpcyAwLgorICogcmlnaHRCb3JkZXIgLSBPcHRpb25hbCB0b3AgYm9yZGVyIHRvIGJlIGFkZGVkIGluIHRoZSBncm91cC4gRGVmYXVsdCBpcyAwLgorICogYm90dG9tQm9yZGVyIC0gT3B0aW9uYWwgdG9wIGJvcmRlciB0byBiZSBhZGRlZCBpbiB0aGUgZ3JvdXAuIERlZmF1bHQgaXMgMC4KKyAqIGxlZnRCb3JkZXIgLSBPcHRpb25hbCB0b3AgYm9yZGVyIHRvIGJlIGFkZGVkIGluIHRoZSBncm91cC4gRGVmYXVsdCBpcyAwLgorICovCitteEdyYXBoLnByb3RvdHlwZS51cGRhdGVHcm91cEJvdW5kcyA9IGZ1bmN0aW9uKGNlbGxzLCBib3JkZXIsIG1vdmVHcm91cCwgdG9wQm9yZGVyLCByaWdodEJvcmRlciwgYm90dG9tQm9yZGVyLCBsZWZ0Qm9yZGVyKQoreworCWlmIChjZWxscyA9PSBudWxsKQorCXsKKwkJY2VsbHMgPSB0aGlzLmdldFNlbGVjdGlvbkNlbGxzKCk7CisJfQorCQorCWJvcmRlciA9IChib3JkZXIgIT0gbnVsbCkgPyBib3JkZXIgOiAwOworCW1vdmVHcm91cCA9IChtb3ZlR3JvdXAgIT0gbnVsbCkgPyBtb3ZlR3JvdXAgOiBmYWxzZTsKKwl0b3BCb3JkZXIgPSAodG9wQm9yZGVyICE9IG51bGwpID8gdG9wQm9yZGVyIDogMDsKKwlyaWdodEJvcmRlciA9IChyaWdodEJvcmRlciAhPSBudWxsKSA/IHJpZ2h0Qm9yZGVyIDogMDsKKwlib3R0b21Cb3JkZXIgPSAoYm90dG9tQm9yZGVyICE9IG51bGwpID8gYm90dG9tQm9yZGVyIDogMDsKKwlsZWZ0Qm9yZGVyID0gKGxlZnRCb3JkZXIgIT0gbnVsbCkgPyBsZWZ0Qm9yZGVyIDogMDsKKworCXRoaXMubW9kZWwuYmVnaW5VcGRhdGUoKTsKKwl0cnkKKwl7CisJCWZvciAodmFyIGkgPSBjZWxscy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKKwkJeworCQkJdmFyIGdlbyA9IHRoaXMuZ2V0Q2VsbEdlb21ldHJ5KGNlbGxzW2ldKTsKKwkJCQorCQkJaWYgKGdlbyAhPSBudWxsKQorCQkJeworCQkJCXZhciBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRDZWxscyhjZWxsc1tpXSk7CisJCQkJCisJCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkKKwkJCQl7CisJCQkJCXZhciBib3VuZHMgPSB0aGlzLmdldEJvdW5kaW5nQm94RnJvbUdlb21ldHJ5KGNoaWxkcmVuLCB0cnVlKTsKKwkJCQkJCisJCQkJCWlmIChib3VuZHMgIT0gbnVsbCAmJiBib3VuZHMud2lkdGggPiAwICYmIGJvdW5kcy5oZWlnaHQgPiAwKQorCQkJCQl7CisJCQkJCQl2YXIgbGVmdCA9IDA7CisJCQkJCQl2YXIgdG9wID0gMDsKKwkJCQkJCQorCQkJCQkJLy8gQWRkcyB0aGUgc2l6ZSBvZiB0aGUgdGl0bGUgYXJlYSBmb3Igc3dpbWxhbmVzCisJCQkJCQlpZiAodGhpcy5pc1N3aW1sYW5lKGNlbGxzW2ldKSkKKwkJCQkJCXsKKwkJCQkJCQl2YXIgc2l6ZSA9IHRoaXMuZ2V0U3RhcnRTaXplKGNlbGxzW2ldKTsKKwkJCQkJCQlsZWZ0ID0gc2l6ZS53aWR0aDsKKwkJCQkJCQl0b3AgPSBzaXplLmhlaWdodDsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJZ2VvID0gZ2VvLmNsb25lKCk7CisJCQkJCQkKKwkJCQkJCWlmIChtb3ZlR3JvdXApCisJCQkJCQl7CisJCQkJCQkJZ2VvLnggPSBNYXRoLnJvdW5kKGdlby54ICsgYm91bmRzLnggLSBib3JkZXIgLSBsZWZ0IC0gbGVmdEJvcmRlcik7CisJCQkJCQkJZ2VvLnkgPSBNYXRoLnJvdW5kKGdlby55ICsgYm91bmRzLnkgLSBib3JkZXIgLSB0b3AgLSB0b3BCb3JkZXIpOworCQkJCQkJfQorCQkJCQkJCisJCQkJCQlnZW8ud2lkdGggPSBNYXRoLnJvdW5kKGJvdW5kcy53aWR0aCArIDIgKiBib3JkZXIgKyBsZWZ0ICsgbGVmdEJvcmRlciArIHJpZ2h0Qm9yZGVyKTsKKwkJCQkJCWdlby5oZWlnaHQgPSBNYXRoLnJvdW5kKGJvdW5kcy5oZWlnaHQgKyAyICogYm9yZGVyICsgdG9wICsgdG9wQm9yZGVyICsgYm90dG9tQm9yZGVyKTsKKwkJCQkJCQorCQkJCQkJdGhpcy5tb2RlbC5zZXRHZW9tZXRyeShjZWxsc1tpXSwgZ2VvKTsKKwkJCQkJCXRoaXMubW92ZUNlbGxzKGNoaWxkcmVuLCBib3JkZXIgKyBsZWZ0IC0gYm91bmRzLnggKyBsZWZ0Qm9yZGVyLAorCQkJCQkJCQlib3JkZXIgKyB0b3AgLSBib3VuZHMueSArIHRvcEJvcmRlcik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZmluYWxseQorCXsKKwkJdGhpcy5tb2RlbC5lbmRVcGRhdGUoKTsKKwl9CisKKwlyZXR1cm4gY2VsbHM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRCb3VuZGluZ0JveAorICogCisgKiBSZXR1cm5zIHRoZSBib3VuZGluZyBib3ggZm9yIHRoZSBnaXZlbiBhcnJheSBvZiA8bXhDZWxscz4uIFRoZSBib3VuZGluZyBib3ggZm9yCisgKiBlYWNoIGNlbGwgYW5kIGl0cyBkZXNjZW5kYW50cyBpcyBjb21wdXRlZCB1c2luZyA8bXhHcmFwaFZpZXcuZ2V0Qm91bmRpbmdCb3g+LgorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogY2VsbHMgLSBBcnJheSBvZiA8bXhDZWxscz4gd2hvc2UgYm91bmRpbmcgYm94IHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0Qm91bmRpbmdCb3ggPSBmdW5jdGlvbihjZWxscykKK3sKKwl2YXIgcmVzdWx0ID0gbnVsbDsKKwkKKwlpZiAoY2VsbHMgIT0gbnVsbCAmJiBjZWxscy5sZW5ndGggPiAwKQorCXsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkJeworCQkJaWYgKHRoaXMubW9kZWwuaXNWZXJ0ZXgoY2VsbHNbaV0pIHx8IHRoaXMubW9kZWwuaXNFZGdlKGNlbGxzW2ldKSkKKwkJCXsKKwkJCQl2YXIgYmJveCA9IHRoaXMudmlldy5nZXRCb3VuZGluZ0JveCh0aGlzLnZpZXcuZ2V0U3RhdGUoY2VsbHNbaV0pLCB0cnVlKTsKKwkJCQorCQkJCWlmIChiYm94ICE9IG51bGwpCisJCQkJeworCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCXsKKwkJCQkJCXJlc3VsdCA9IG14UmVjdGFuZ2xlLmZyb21SZWN0YW5nbGUoYmJveCk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlyZXN1bHQuYWRkKGJib3gpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9OworCisvKioKKyAqIEdyb3VwOiBDZWxsIGNsb25pbmcsIGluc2VydGlvbiBhbmQgcmVtb3ZhbAorICovCisKKy8qKgorICogRnVuY3Rpb246IGNsb25lQ2VsbHMKKyAqIAorICogUmV0dXJucyB0aGUgY2xvbmVzIGZvciB0aGUgZ2l2ZW4gY2VsbHMuIFRoZSBjbG9uZXMgYXJlIGNyZWF0ZWQgcmVjdXJzaXZlbHkKKyAqIHVzaW5nIDxteEdyYXBoTW9kZWwuY2xvbmVDZWxscz4uIElmIHRoZSB0ZXJtaW5hbCBvZiBhbiBlZGdlIGlzIG5vdCBpbiB0aGUKKyAqIGdpdmVuIGFycmF5LCB0aGVuIHRoZSByZXNwZWN0aXZlIGVuZCBpcyBhc3NpZ25lZCBhIHRlcm1pbmFsIHBvaW50IGFuZCB0aGUKKyAqIHRlcm1pbmFsIGlzIHJlbW92ZWQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGxzIC0gQXJyYXkgb2YgPG14Q2VsbHM+IHRvIGJlIGNsb25lZC4KKyAqIGFsbG93SW52YWxpZEVkZ2VzIC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiBpbnZhbGlkIGVkZ2VzCisgKiBzaG91bGQgYmUgY2xvbmVkLiBEZWZhdWx0IGlzIHRydWUuCisgKiBtYXBwaW5nIC0gT3B0aW9uYWwgbWFwcGluZyBmb3IgZXhpc3RpbmcgY2xvbmVzLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jbG9uZUNlbGxzID0gZnVuY3Rpb24oY2VsbHMsIGFsbG93SW52YWxpZEVkZ2VzLCBtYXBwaW5nKQoreworCWFsbG93SW52YWxpZEVkZ2VzID0gKGFsbG93SW52YWxpZEVkZ2VzICE9IG51bGwpID8gYWxsb3dJbnZhbGlkRWRnZXMgOiB0cnVlOworCXZhciBjbG9uZXMgPSBudWxsOworCQorCWlmIChjZWxscyAhPSBudWxsKQorCXsKKwkJLy8gQ3JlYXRlcyBhIGRpY3Rpb25hcnkgZm9yIGZhc3QgbG9va3VwcworCQl2YXIgZGljdCA9IG5ldyBteERpY3Rpb25hcnkoKTsKKwkJdmFyIHRtcCA9IFtdOworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkJeworCQkJZGljdC5wdXQoY2VsbHNbaV0sIHRydWUpOworCQkJdG1wLnB1c2goY2VsbHNbaV0pOworCQl9CisJCQorCQlpZiAodG1wLmxlbmd0aCA+IDApCisJCXsKKwkJCXZhciBzY2FsZSA9IHRoaXMudmlldy5zY2FsZTsKKwkJCXZhciB0cmFucyA9IHRoaXMudmlldy50cmFuc2xhdGU7CisJCQljbG9uZXMgPSB0aGlzLm1vZGVsLmNsb25lQ2VsbHMoY2VsbHMsIHRydWUsIG1hcHBpbmcpOworCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJaWYgKCFhbGxvd0ludmFsaWRFZGdlcyAmJiB0aGlzLm1vZGVsLmlzRWRnZShjbG9uZXNbaV0pICYmCisJCQkJCXRoaXMuZ2V0RWRnZVZhbGlkYXRpb25FcnJvcihjbG9uZXNbaV0sCisJCQkJCQl0aGlzLm1vZGVsLmdldFRlcm1pbmFsKGNsb25lc1tpXSwgdHJ1ZSksCisJCQkJCQl0aGlzLm1vZGVsLmdldFRlcm1pbmFsKGNsb25lc1tpXSwgZmFsc2UpKSAhPSBudWxsKQorCQkJCXsKKwkJCQkJY2xvbmVzW2ldID0gbnVsbDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdmFyIGcgPSB0aGlzLm1vZGVsLmdldEdlb21ldHJ5KGNsb25lc1tpXSk7CisJCQkJCQorCQkJCQlpZiAoZyAhPSBudWxsKQorCQkJCQl7CisJCQkJCQl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoY2VsbHNbaV0pOworCQkJCQkJdmFyIHBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZSh0aGlzLm1vZGVsLmdldFBhcmVudChjZWxsc1tpXSkpOworCQkJCQkJCisJCQkJCQlpZiAoc3RhdGUgIT0gbnVsbCAmJiBwc3RhdGUgIT0gbnVsbCkKKwkJCQkJCXsKKwkJCQkJCQl2YXIgZHggPSBwc3RhdGUub3JpZ2luLng7CisJCQkJCQkJdmFyIGR5ID0gcHN0YXRlLm9yaWdpbi55OworCQkJCQkJCQorCQkJCQkJCWlmICh0aGlzLm1vZGVsLmlzRWRnZShjbG9uZXNbaV0pKQorCQkJCQkJCXsKKwkJCQkJCQkJdmFyIHB0cyA9IHN0YXRlLmFic29sdXRlUG9pbnRzOworCQkJCQkJCQkKKwkJCQkJCQkJLy8gQ2hlY2tzIGlmIHRoZSBzb3VyY2UgaXMgY2xvbmVkIG9yIHNldHMgdGhlIHRlcm1pbmFsIHBvaW50CisJCQkJCQkJCXZhciBzcmMgPSB0aGlzLm1vZGVsLmdldFRlcm1pbmFsKGNlbGxzW2ldLCB0cnVlKTsKKwkJCQkJCQkJCisJCQkJCQkJCXdoaWxlIChzcmMgIT0gbnVsbCAmJiAhZGljdC5nZXQoc3JjKSkKKwkJCQkJCQkJeworCQkJCQkJCQkJc3JjID0gdGhpcy5tb2RlbC5nZXRQYXJlbnQoc3JjKTsKKwkJCQkJCQkJfQorCQkJCQkJCQkKKwkJCQkJCQkJaWYgKHNyYyA9PSBudWxsKQorCQkJCQkJCQl7CisJCQkJCQkJCQlnLnNldFRlcm1pbmFsUG9pbnQoCisJCQkJCQkJCQkJbmV3IG14UG9pbnQocHRzWzBdLnggLyBzY2FsZSAtIHRyYW5zLngsCisJCQkJCQkJCQkJCXB0c1swXS55IC8gc2NhbGUgLSB0cmFucy55KSwgdHJ1ZSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJCisJCQkJCQkJCS8vIENoZWNrcyBpZiB0aGUgdGFyZ2V0IGlzIGNsb25lZCBvciBzZXRzIHRoZSB0ZXJtaW5hbCBwb2ludAorCQkJCQkJCQl2YXIgdHJnID0gdGhpcy5tb2RlbC5nZXRUZXJtaW5hbChjZWxsc1tpXSwgZmFsc2UpOworCQkJCQkJCQkKKwkJCQkJCQkJd2hpbGUgKHRyZyAhPSBudWxsICYmICFkaWN0LmdldCh0cmcpKQorCQkJCQkJCQl7CisJCQkJCQkJCQl0cmcgPSB0aGlzLm1vZGVsLmdldFBhcmVudCh0cmcpOworCQkJCQkJCQl9CisJCQkJCQkJCQorCQkJCQkJCQlpZiAodHJnID09IG51bGwpCisJCQkJCQkJCXsKKwkJCQkJCQkJCXZhciBuID0gcHRzLmxlbmd0aCAtIDE7CisJCQkJCQkJCQlnLnNldFRlcm1pbmFsUG9pbnQoCisJCQkJCQkJCQkJbmV3IG14UG9pbnQocHRzW25dLnggLyBzY2FsZSAtIHRyYW5zLngsCisJCQkJCQkJCQkJCXB0c1tuXS55IC8gc2NhbGUgLSB0cmFucy55KSwgZmFsc2UpOworCQkJCQkJCQl9CisJCQkJCQkJCQorCQkJCQkJCQkvLyBUcmFuc2xhdGVzIHRoZSBjb250cm9sIHBvaW50cworCQkJCQkJCQl2YXIgcG9pbnRzID0gZy5wb2ludHM7CisJCQkJCQkJCQorCQkJCQkJCQlpZiAocG9pbnRzICE9IG51bGwpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWZvciAodmFyIGogPSAwOyBqIDwgcG9pbnRzLmxlbmd0aDsgaisrKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCXBvaW50c1tqXS54ICs9IGR4OworCQkJCQkJCQkJCXBvaW50c1tqXS55ICs9IGR5OworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJCWcudHJhbnNsYXRlKGR4LCBkeSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJY2xvbmVzID0gW107CisJCX0KKwl9CisJCisJcmV0dXJuIGNsb25lczsKK307CisKKy8qKgorICogRnVuY3Rpb246IGluc2VydFZlcnRleAorICogCisgKiBBZGRzIGEgbmV3IHZlcnRleCBpbnRvIHRoZSBnaXZlbiBwYXJlbnQgPG14Q2VsbD4gdXNpbmcgdmFsdWUgYXMgdGhlIHVzZXIKKyAqIG9iamVjdCBhbmQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzIGFzIHRoZSA8bXhHZW9tZXRyeT4gb2YgdGhlIG5ldyB2ZXJ0ZXguCisgKiBUaGUgaWQgYW5kIHN0eWxlIGFyZSB1c2VkIGZvciB0aGUgcmVzcGVjdGl2ZSBwcm9wZXJ0aWVzIG9mIHRoZSBuZXcKKyAqIDxteENlbGw+LCB3aGljaCBpcyByZXR1cm5lZC4KKyAqCisgKiBXaGVuIGFkZGluZyBuZXcgdmVydGljZXMgZnJvbSBhIG1vdXNlIGV2ZW50LCBvbmUgc2hvdWxkIHRha2UgaW50bworICogYWNjb3VudCB0aGUgb2Zmc2V0IG9mIHRoZSBncmFwaCBjb250YWluZXIgYW5kIHRoZSBzY2FsZSBhbmQgdHJhbnNsYXRpb24KKyAqIG9mIHRoZSB2aWV3IGluIG9yZGVyIHRvIGZpbmQgdGhlIGNvcnJlY3QgdW5zY2FsZWQsIHVudHJhbnNsYXRlZAorICogY29vcmRpbmF0ZXMgdXNpbmcgPG14R3JhcGguZ2V0UG9pbnRGb3JFdmVudD4gYXMgZm9sbG93czoKKyAqIAorICogKGNvZGUpCisgKiB2YXIgcHQgPSBncmFwaC5nZXRQb2ludEZvckV2ZW50KGV2dCk7CisgKiB2YXIgcGFyZW50ID0gZ3JhcGguZ2V0RGVmYXVsdFBhcmVudCgpOworICogZ3JhcGguaW5zZXJ0VmVydGV4KHBhcmVudCwgbnVsbCwKKyAqIAkJCSdIZWxsbywgV29ybGQhJywgeCwgeSwgMjIwLCAzMCk7CisgKiAoZW5kKQorICogCisgKiBGb3IgYWRkaW5nIGltYWdlIGNlbGxzLCB0aGUgc3R5bGUgcGFyYW1ldGVyIGNhbiBiZSBhc3NpZ25lZCBhcworICogCisgKiAoY29kZSkKKyAqIHN0eWxlbmFtZTtpbWFnZT1pbWFnZVVybAorICogKGVuZCkKKyAqIAorICogU2VlIDxteEdyYXBoPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2luZyBpbWFnZXMuCisgKgorICogUGFyYW1ldGVyczoKKyAqIAorICogcGFyZW50IC0gPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIHBhcmVudCBvZiB0aGUgbmV3IHZlcnRleC4KKyAqIGlkIC0gT3B0aW9uYWwgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgSWQgb2YgdGhlIG5ldyB2ZXJ0ZXguCisgKiB2YWx1ZSAtIE9iamVjdCB0byBiZSB1c2VkIGFzIHRoZSB1c2VyIG9iamVjdC4KKyAqIHggLSBJbnRlZ2VyIHRoYXQgZGVmaW5lcyB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB2ZXJ0ZXguCisgKiB5IC0gSW50ZWdlciB0aGF0IGRlZmluZXMgdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdmVydGV4LgorICogd2lkdGggLSBJbnRlZ2VyIHRoYXQgZGVmaW5lcyB0aGUgd2lkdGggb2YgdGhlIHZlcnRleC4KKyAqIGhlaWdodCAtIEludGVnZXIgdGhhdCBkZWZpbmVzIHRoZSBoZWlnaHQgb2YgdGhlIHZlcnRleC4KKyAqIHN0eWxlIC0gT3B0aW9uYWwgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgY2VsbCBzdHlsZS4KKyAqIHJlbGF0aXZlIC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgZ2VvbWV0cnkgaXMgcmVsYXRpdmUuCisgKiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pbnNlcnRWZXJ0ZXggPSBmdW5jdGlvbihwYXJlbnQsIGlkLCB2YWx1ZSwKKwl4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzdHlsZSwgcmVsYXRpdmUpCit7CisJdmFyIHZlcnRleCA9IHRoaXMuY3JlYXRlVmVydGV4KHBhcmVudCwgaWQsIHZhbHVlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzdHlsZSwgcmVsYXRpdmUpOworCisJcmV0dXJuIHRoaXMuYWRkQ2VsbCh2ZXJ0ZXgsIHBhcmVudCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVWZXJ0ZXgKKyAqIAorICogSG9vayBtZXRob2QgdGhhdCBjcmVhdGVzIHRoZSBuZXcgdmVydGV4IGZvciA8aW5zZXJ0VmVydGV4Pi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY3JlYXRlVmVydGV4ID0gZnVuY3Rpb24ocGFyZW50LCBpZCwgdmFsdWUsCisJCXgsIHksIHdpZHRoLCBoZWlnaHQsIHN0eWxlLCByZWxhdGl2ZSkKK3sKKwkvLyBDcmVhdGVzIHRoZSBnZW9tZXRyeSBmb3IgdGhlIHZlcnRleAorCXZhciBnZW9tZXRyeSA9IG5ldyBteEdlb21ldHJ5KHgsIHksIHdpZHRoLCBoZWlnaHQpOworCWdlb21ldHJ5LnJlbGF0aXZlID0gKHJlbGF0aXZlICE9IG51bGwpID8gcmVsYXRpdmUgOiBmYWxzZTsKKwkKKwkvLyBDcmVhdGVzIHRoZSB2ZXJ0ZXgKKwl2YXIgdmVydGV4ID0gbmV3IG14Q2VsbCh2YWx1ZSwgZ2VvbWV0cnksIHN0eWxlKTsKKwl2ZXJ0ZXguc2V0SWQoaWQpOworCXZlcnRleC5zZXRWZXJ0ZXgodHJ1ZSk7CisJdmVydGV4LnNldENvbm5lY3RhYmxlKHRydWUpOworCQorCXJldHVybiB2ZXJ0ZXg7Cit9OworCQorLyoqCisgKiBGdW5jdGlvbjogaW5zZXJ0RWRnZQorICogCisgKiBBZGRzIGEgbmV3IGVkZ2UgaW50byB0aGUgZ2l2ZW4gcGFyZW50IDxteENlbGw+IHVzaW5nIHZhbHVlIGFzIHRoZSB1c2VyCisgKiBvYmplY3QgYW5kIHRoZSBnaXZlbiBzb3VyY2UgYW5kIHRhcmdldCBhcyB0aGUgdGVybWluYWxzIG9mIHRoZSBuZXcgZWRnZS4KKyAqIFRoZSBpZCBhbmQgc3R5bGUgYXJlIHVzZWQgZm9yIHRoZSByZXNwZWN0aXZlIHByb3BlcnRpZXMgb2YgdGhlIG5ldworICogPG14Q2VsbD4sIHdoaWNoIGlzIHJldHVybmVkLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHBhcmVudCAtIDxteENlbGw+IHRoYXQgc3BlY2lmaWVzIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBlZGdlLgorICogaWQgLSBPcHRpb25hbCBzdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBJZCBvZiB0aGUgbmV3IGVkZ2UuCisgKiB2YWx1ZSAtIEphdmFTY3JpcHQgb2JqZWN0IHRvIGJlIHVzZWQgYXMgdGhlIHVzZXIgb2JqZWN0LgorICogc291cmNlIC0gPG14Q2VsbD4gdGhhdCBkZWZpbmVzIHRoZSBzb3VyY2Ugb2YgdGhlIGVkZ2UuCisgKiB0YXJnZXQgLSA8bXhDZWxsPiB0aGF0IGRlZmluZXMgdGhlIHRhcmdldCBvZiB0aGUgZWRnZS4KKyAqIHN0eWxlIC0gT3B0aW9uYWwgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgY2VsbCBzdHlsZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaW5zZXJ0RWRnZSA9IGZ1bmN0aW9uKHBhcmVudCwgaWQsIHZhbHVlLCBzb3VyY2UsIHRhcmdldCwgc3R5bGUpCit7CisJdmFyIGVkZ2UgPSB0aGlzLmNyZWF0ZUVkZ2UocGFyZW50LCBpZCwgdmFsdWUsIHNvdXJjZSwgdGFyZ2V0LCBzdHlsZSk7CisJCisJcmV0dXJuIHRoaXMuYWRkRWRnZShlZGdlLCBwYXJlbnQsIHNvdXJjZSwgdGFyZ2V0KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUVkZ2UKKyAqIAorICogSG9vayBtZXRob2QgdGhhdCBjcmVhdGVzIHRoZSBuZXcgZWRnZSBmb3IgPGluc2VydEVkZ2U+LiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzZXQgdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9mIHRoZSBlZGdlLCB0aGVzZQorICogYXJlIHNldCB3aGVuIHRoZSBlZGdlIGlzIGFkZGVkIHRvIHRoZSBtb2RlbC4KKyAqIAorICovCitteEdyYXBoLnByb3RvdHlwZS5jcmVhdGVFZGdlID0gZnVuY3Rpb24ocGFyZW50LCBpZCwgdmFsdWUsIHNvdXJjZSwgdGFyZ2V0LCBzdHlsZSkKK3sKKwkvLyBDcmVhdGVzIHRoZSBlZGdlCisJdmFyIGVkZ2UgPSBuZXcgbXhDZWxsKHZhbHVlLCBuZXcgbXhHZW9tZXRyeSgpLCBzdHlsZSk7CisJZWRnZS5zZXRJZChpZCk7CisJZWRnZS5zZXRFZGdlKHRydWUpOworCWVkZ2UuZ2VvbWV0cnkucmVsYXRpdmUgPSB0cnVlOworCQorCXJldHVybiBlZGdlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYWRkRWRnZQorICogCisgKiBBZGRzIHRoZSBlZGdlIHRvIHRoZSBwYXJlbnQgYW5kIGNvbm5lY3RzIGl0IHRvIHRoZSBnaXZlbiBzb3VyY2UgYW5kCisgKiB0YXJnZXQgdGVybWluYWxzLiBUaGlzIGlzIGEgc2hvcnRjdXQgbWV0aG9kLiBSZXR1cm5zIHRoZSBlZGdlIHRoYXQgd2FzCisgKiBhZGRlZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZWRnZSAtIDxteENlbGw+IHRvIGJlIGluc2VydGVkIGludG8gdGhlIGdpdmVuIHBhcmVudC4KKyAqIHBhcmVudCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgbmV3IHBhcmVudC4gSWYgbm8gcGFyZW50IGlzCisgKiBnaXZlbiB0aGVuIHRoZSBkZWZhdWx0IHBhcmVudCBpcyB1c2VkLgorICogc291cmNlIC0gT3B0aW9uYWwgPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBzb3VyY2UgdGVybWluYWwuCisgKiB0YXJnZXQgLSBPcHRpb25hbCA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHRhcmdldCB0ZXJtaW5hbC4KKyAqIGluZGV4IC0gT3B0aW9uYWwgaW5kZXggdG8gaW5zZXJ0IHRoZSBjZWxscyBhdC4gRGVmYXVsdCBpcyB0byBhcHBlbmQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmFkZEVkZ2UgPSBmdW5jdGlvbihlZGdlLCBwYXJlbnQsIHNvdXJjZSwgdGFyZ2V0LCBpbmRleCkKK3sKKwlyZXR1cm4gdGhpcy5hZGRDZWxsKGVkZ2UsIHBhcmVudCwgaW5kZXgsIHNvdXJjZSwgdGFyZ2V0KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZENlbGwKKyAqIAorICogQWRkcyB0aGUgY2VsbCB0byB0aGUgcGFyZW50IGFuZCBjb25uZWN0cyBpdCB0byB0aGUgZ2l2ZW4gc291cmNlIGFuZAorICogdGFyZ2V0IHRlcm1pbmFscy4gVGhpcyBpcyBhIHNob3J0Y3V0IG1ldGhvZC4gUmV0dXJucyB0aGUgY2VsbCB0aGF0IHdhcworICogYWRkZWQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBnaXZlbiBwYXJlbnQuCisgKiBwYXJlbnQgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIG5ldyBwYXJlbnQuIElmIG5vIHBhcmVudCBpcworICogZ2l2ZW4gdGhlbiB0aGUgZGVmYXVsdCBwYXJlbnQgaXMgdXNlZC4KKyAqIGluZGV4IC0gT3B0aW9uYWwgaW5kZXggdG8gaW5zZXJ0IHRoZSBjZWxscyBhdC4gRGVmYXVsdCBpcyB0byBhcHBlbmQuCisgKiBzb3VyY2UgLSBPcHRpb25hbCA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHNvdXJjZSB0ZXJtaW5hbC4KKyAqIHRhcmdldCAtIE9wdGlvbmFsIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgdGFyZ2V0IHRlcm1pbmFsLgorICovCitteEdyYXBoLnByb3RvdHlwZS5hZGRDZWxsID0gZnVuY3Rpb24oY2VsbCwgcGFyZW50LCBpbmRleCwgc291cmNlLCB0YXJnZXQpCit7CisJcmV0dXJuIHRoaXMuYWRkQ2VsbHMoW2NlbGxdLCBwYXJlbnQsIGluZGV4LCBzb3VyY2UsIHRhcmdldClbMF07Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRDZWxscworICogCisgKiBBZGRzIHRoZSBjZWxscyB0byB0aGUgcGFyZW50IGF0IHRoZSBnaXZlbiBpbmRleCwgY29ubmVjdGluZyBlYWNoIGNlbGwgdG8KKyAqIHRoZSBvcHRpb25hbCBzb3VyY2UgYW5kIHRhcmdldCB0ZXJtaW5hbC4gVGhlIGNoYW5nZSBpcyBjYXJyaWVkIG91dCB1c2luZworICogPGNlbGxzQWRkZWQ+LiBUaGlzIG1ldGhvZCBmaXJlcyA8bXhFdmVudC5BRERfQ0VMTFM+IHdoaWxlIHRoZQorICogdHJhbnNhY3Rpb24gaXMgaW4gcHJvZ3Jlc3MuIFJldHVybnMgdGhlIGNlbGxzIHRoYXQgd2VyZSBhZGRlZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbHMgLSBBcnJheSBvZiA8bXhDZWxscz4gdG8gYmUgaW5zZXJ0ZWQuCisgKiBwYXJlbnQgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIG5ldyBwYXJlbnQuIElmIG5vIHBhcmVudCBpcworICogZ2l2ZW4gdGhlbiB0aGUgZGVmYXVsdCBwYXJlbnQgaXMgdXNlZC4KKyAqIGluZGV4IC0gT3B0aW9uYWwgaW5kZXggdG8gaW5zZXJ0IHRoZSBjZWxscyBhdC4gRGVmYXVsdCBpcyB0byBhcHBlbmQuCisgKiBzb3VyY2UgLSBPcHRpb25hbCBzb3VyY2UgPG14Q2VsbD4gZm9yIGFsbCBpbnNlcnRlZCBjZWxscy4KKyAqIHRhcmdldCAtIE9wdGlvbmFsIHRhcmdldCA8bXhDZWxsPiBmb3IgYWxsIGluc2VydGVkIGNlbGxzLgorICovCitteEdyYXBoLnByb3RvdHlwZS5hZGRDZWxscyA9IGZ1bmN0aW9uKGNlbGxzLCBwYXJlbnQsIGluZGV4LCBzb3VyY2UsIHRhcmdldCkKK3sKKwlpZiAocGFyZW50ID09IG51bGwpCisJeworCQlwYXJlbnQgPSB0aGlzLmdldERlZmF1bHRQYXJlbnQoKTsKKwl9CisJCisJaWYgKGluZGV4ID09IG51bGwpCisJeworCQlpbmRleCA9IHRoaXMubW9kZWwuZ2V0Q2hpbGRDb3VudChwYXJlbnQpOworCX0KKwkKKwl0aGlzLm1vZGVsLmJlZ2luVXBkYXRlKCk7CisJdHJ5CisJeworCQl0aGlzLmNlbGxzQWRkZWQoY2VsbHMsIHBhcmVudCwgaW5kZXgsIHNvdXJjZSwgdGFyZ2V0LCBmYWxzZSwgdHJ1ZSk7CisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuQUREX0NFTExTLCAnY2VsbHMnLCBjZWxscywKKwkJCQkncGFyZW50JywgcGFyZW50LCAnaW5kZXgnLCBpbmRleCwgJ3NvdXJjZScsIHNvdXJjZSwgJ3RhcmdldCcsIHRhcmdldCkpOworCX0KKwlmaW5hbGx5CisJeworCQl0aGlzLm1vZGVsLmVuZFVwZGF0ZSgpOworCX0KKworCXJldHVybiBjZWxsczsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNlbGxzQWRkZWQKKyAqIAorICogQWRkcyB0aGUgc3BlY2lmaWVkIGNlbGxzIHRvIHRoZSBnaXZlbiBwYXJlbnQuIFRoaXMgbWV0aG9kIGZpcmVzCisgKiA8bXhFdmVudC5DRUxMU19BRERFRD4gd2hpbGUgdGhlIHRyYW5zYWN0aW9uIGlzIGluIHByb2dyZXNzLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jZWxsc0FkZGVkID0gZnVuY3Rpb24oY2VsbHMsIHBhcmVudCwgaW5kZXgsIHNvdXJjZSwgdGFyZ2V0LCBhYnNvbHV0ZSwgY29uc3RyYWluLCBleHRlbmQpCit7CisJaWYgKGNlbGxzICE9IG51bGwgJiYgcGFyZW50ICE9IG51bGwgJiYgaW5kZXggIT0gbnVsbCkKKwl7CisJCXRoaXMubW9kZWwuYmVnaW5VcGRhdGUoKTsKKwkJdHJ5CisJCXsKKwkJCXZhciBwYXJlbnRTdGF0ZSA9IChhYnNvbHV0ZSkgPyB0aGlzLnZpZXcuZ2V0U3RhdGUocGFyZW50KSA6IG51bGw7CisJCQl2YXIgbzEgPSAocGFyZW50U3RhdGUgIT0gbnVsbCkgPyBwYXJlbnRTdGF0ZS5vcmlnaW4gOiBudWxsOworCQkJdmFyIHplcm8gPSBuZXcgbXhQb2ludCgwLCAwKTsKKworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQlpZiAoY2VsbHNbaV0gPT0gbnVsbCkKKwkJCQl7CisJCQkJCWluZGV4LS07CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXZhciBwcmV2aW91cyA9IHRoaXMubW9kZWwuZ2V0UGFyZW50KGNlbGxzW2ldKTsKKwkKKwkJCQkJLy8gS2VlcHMgdGhlIGNlbGwgYXQgaXRzIGFic29sdXRlIGxvY2F0aW9uCisJCQkJCWlmIChvMSAhPSBudWxsICYmIGNlbGxzW2ldICE9IHBhcmVudCAmJiBwYXJlbnQgIT0gcHJldmlvdXMpCisJCQkJCXsKKwkJCQkJCXZhciBvbGRTdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShwcmV2aW91cyk7CisJCQkJCQl2YXIgbzIgPSAob2xkU3RhdGUgIT0gbnVsbCkgPyBvbGRTdGF0ZS5vcmlnaW4gOiB6ZXJvOworCQkJCQkJdmFyIGdlbyA9IHRoaXMubW9kZWwuZ2V0R2VvbWV0cnkoY2VsbHNbaV0pOworCQorCQkJCQkJaWYgKGdlbyAhPSBudWxsKQorCQkJCQkJeworCQkJCQkJCXZhciBkeCA9IG8yLnggLSBvMS54OworCQkJCQkJCXZhciBkeSA9IG8yLnkgLSBvMS55OworCQorCQkJCQkJCS8vIEZJWE1FOiBDZWxscyBzaG91bGQgYWx3YXlzIGJlIGluc2VydGVkIGZpcnN0IGJlZm9yZSBhbnkgb3RoZXIgZWRpdAorCQkJCQkJCS8vIHRvIGF2b2lkIGZvcndhcmQgcmVmZXJlbmNlcyBpbiBzZXNzaW9ucy4KKwkJCQkJCQlnZW8gPSBnZW8uY2xvbmUoKTsKKwkJCQkJCQlnZW8udHJhbnNsYXRlKGR4LCBkeSk7CisJCQkJCQkJCisJCQkJCQkJaWYgKCFnZW8ucmVsYXRpdmUgJiYgdGhpcy5tb2RlbC5pc1ZlcnRleChjZWxsc1tpXSkgJiYKKwkJCQkJCQkJIXRoaXMuaXNBbGxvd05lZ2F0aXZlQ29vcmRpbmF0ZXMoKSkKKwkJCQkJCQl7CisJCQkJCQkJCWdlby54ID0gTWF0aC5tYXgoMCwgZ2VvLngpOworCQkJCQkJCQlnZW8ueSA9IE1hdGgubWF4KDAsIGdlby55KTsKKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkJdGhpcy5tb2RlbC5zZXRHZW9tZXRyeShjZWxsc1tpXSwgZ2VvKTsKKwkJCQkJCX0KKwkJCQkJfQorCQorCQkJCQkvLyBEZWNyZW1lbnRzIGFsbCBmb2xsb3dpbmcgaW5kaWNlcworCQkJCQkvLyBpZiBjZWxsIGlzIGFscmVhZHkgaW4gcGFyZW50CisJCQkJCWlmIChwYXJlbnQgPT0gcHJldmlvdXMgJiYgaW5kZXggKyBpID4gdGhpcy5tb2RlbC5nZXRDaGlsZENvdW50KHBhcmVudCkpCisJCQkJCXsKKwkJCQkJCWluZGV4LS07CisJCQkJCX0KKworCQkJCQl0aGlzLm1vZGVsLmFkZChwYXJlbnQsIGNlbGxzW2ldLCBpbmRleCArIGkpOworCQkJCQkKKwkJCQkJaWYgKHRoaXMuYXV0b1NpemVDZWxsc09uQWRkKQorCQkJCQl7CisJCQkJCQl0aGlzLmF1dG9TaXplQ2VsbChjZWxsc1tpXSwgdHJ1ZSk7CisJCQkJCX0KKworCQkJCQkvLyBFeHRlbmRzIHRoZSBwYXJlbnQgb3IgY29uc3RyYWlucyB0aGUgY2hpbGQKKwkJCQkJaWYgKChleHRlbmQgPT0gbnVsbCB8fCBleHRlbmQpICYmCisJCQkJCQl0aGlzLmlzRXh0ZW5kUGFyZW50c09uQWRkKGNlbGxzW2ldKSAmJiB0aGlzLmlzRXh0ZW5kUGFyZW50KGNlbGxzW2ldKSkKKwkJCQkJeworCQkJCQkJdGhpcy5leHRlbmRQYXJlbnQoY2VsbHNbaV0pOworCQkJCQl9CisJCQkJCQorCQkJCQkvLyBBZGRpdGlvbmFsbHkgY29uc3RyYWlucyB0aGUgY2hpbGQgYWZ0ZXIgZXh0ZW5kaW5nIHRoZSBwYXJlbnQKKwkJCQkJaWYgKGNvbnN0cmFpbiA9PSBudWxsIHx8IGNvbnN0cmFpbikKKwkJCQkJeworCQkJCQkJdGhpcy5jb25zdHJhaW5DaGlsZChjZWxsc1tpXSk7CisJCQkJCX0KKwkJCQkJCisJCQkJCS8vIFNldHMgdGhlIHNvdXJjZSB0ZXJtaW5hbAorCQkJCQlpZiAoc291cmNlICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCXRoaXMuY2VsbENvbm5lY3RlZChjZWxsc1tpXSwgc291cmNlLCB0cnVlKTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJLy8gU2V0cyB0aGUgdGFyZ2V0IHRlcm1pbmFsCisJCQkJCWlmICh0YXJnZXQgIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJdGhpcy5jZWxsQ29ubmVjdGVkKGNlbGxzW2ldLCB0YXJnZXQsIGZhbHNlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQorCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5DRUxMU19BRERFRCwgJ2NlbGxzJywgY2VsbHMsCisJCQkJJ3BhcmVudCcsIHBhcmVudCwgJ2luZGV4JywgaW5kZXgsICdzb3VyY2UnLCBzb3VyY2UsICd0YXJnZXQnLCB0YXJnZXQsCisJCQkJJ2Fic29sdXRlJywgYWJzb2x1dGUpKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCXRoaXMubW9kZWwuZW5kVXBkYXRlKCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhdXRvU2l6ZUNlbGwKKyAqIAorICogUmVzaXplcyB0aGUgc3BlY2lmaWVkIGNlbGwgdG8ganVzdCBmaXQgYXJvdW5kIHRoZSBpdHMgbGFiZWwgYW5kL29yIGNoaWxkcmVuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxscz4gdG8gYmUgcmVzaXplZC4KKyAqIHJlY3Vyc2UgLSBPcHRpb25hbCBib29sZWFuIHdoaWNoIHNwZWNpZmllcyBpZiBhbGwgZGVzY2VuZGFudHMgc2hvdWxkIGJlCisgKiBhdXRvc2l6ZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuYXV0b1NpemVDZWxsID0gZnVuY3Rpb24oY2VsbCwgcmVjdXJzZSkKK3sKKwlyZWN1cnNlID0gKHJlY3Vyc2UgIT0gbnVsbCkgPyByZWN1cnNlIDogdHJ1ZTsKKwkKKwlpZiAocmVjdXJzZSkKKwl7CisJCXZhciBjaGlsZENvdW50ID0gdGhpcy5tb2RlbC5nZXRDaGlsZENvdW50KGNlbGwpOworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspCisJCXsKKwkJCXRoaXMuYXV0b1NpemVDZWxsKHRoaXMubW9kZWwuZ2V0Q2hpbGRBdChjZWxsLCBpKSk7CisJCX0KKwl9CisKKwlpZiAodGhpcy5nZXRNb2RlbCgpLmlzVmVydGV4KGNlbGwpICYmIHRoaXMuaXNBdXRvU2l6ZUNlbGwoY2VsbCkpCisJeworCQl0aGlzLnVwZGF0ZUNlbGxTaXplKGNlbGwpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJlbW92ZUNlbGxzCisgKiAKKyAqIFJlbW92ZXMgdGhlIGdpdmVuIGNlbGxzIGZyb20gdGhlIGdyYXBoIGluY2x1ZGluZyBhbGwgY29ubmVjdGVkIGVkZ2VzIGlmCisgKiBpbmNsdWRlRWRnZXMgaXMgdHJ1ZS4gVGhlIGNoYW5nZSBpcyBjYXJyaWVkIG91dCB1c2luZyA8Y2VsbHNSZW1vdmVkPi4KKyAqIFRoaXMgbWV0aG9kIGZpcmVzIDxteEV2ZW50LlJFTU9WRV9DRUxMUz4gd2hpbGUgdGhlIHRyYW5zYWN0aW9uIGlzIGluCisgKiBwcm9ncmVzcy4gVGhlIHJlbW92ZWQgY2VsbHMgYXJlIHJldHVybmVkIGFzIGFuIGFycmF5LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxscyAtIEFycmF5IG9mIDxteENlbGxzPiB0byByZW1vdmUuIElmIG51bGwgaXMgc3BlY2lmaWVkIHRoZW4gdGhlCisgKiBzZWxlY3Rpb24gY2VsbHMgd2hpY2ggYXJlIGRlbGV0YWJsZSBhcmUgdXNlZC4KKyAqIGluY2x1ZGVFZGdlcyAtIE9wdGlvbmFsIGJvb2xlYW4gd2hpY2ggc3BlY2lmaWVzIGlmIGFsbCBjb25uZWN0ZWQgZWRnZXMKKyAqIHNob3VsZCBiZSByZW1vdmVkIGFzIHdlbGwuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUucmVtb3ZlQ2VsbHMgPSBmdW5jdGlvbihjZWxscywgaW5jbHVkZUVkZ2VzKQoreworCWluY2x1ZGVFZGdlcyA9IChpbmNsdWRlRWRnZXMgIT0gbnVsbCkgPyBpbmNsdWRlRWRnZXMgOiB0cnVlOworCQorCWlmIChjZWxscyA9PSBudWxsKQorCXsKKwkJY2VsbHMgPSB0aGlzLmdldERlbGV0YWJsZUNlbGxzKHRoaXMuZ2V0U2VsZWN0aW9uQ2VsbHMoKSk7CisJfQorCisJLy8gQWRkcyBhbGwgZWRnZXMgdG8gdGhlIGNlbGxzCisJaWYgKGluY2x1ZGVFZGdlcykKKwl7CisJCS8vIEZJWE1FOiBSZW1vdmUgZHVwbGljYXRlIGNlbGxzIGluIHJlc3VsdCBvciBkbyBub3QgYWRkIGlmCisJCS8vIGluIGNlbGxzIG9yIGRlc2NlbmRhbnQgb2YgY2VsbHMKKwkJY2VsbHMgPSB0aGlzLmdldERlbGV0YWJsZUNlbGxzKHRoaXMuYWRkQWxsRWRnZXMoY2VsbHMpKTsKKwl9CisKKwl0aGlzLm1vZGVsLmJlZ2luVXBkYXRlKCk7CisJdHJ5CisJeworCQl0aGlzLmNlbGxzUmVtb3ZlZChjZWxscyk7CisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuUkVNT1ZFX0NFTExTLCAKKwkJCQknY2VsbHMnLCBjZWxscywgJ2luY2x1ZGVFZGdlcycsIGluY2x1ZGVFZGdlcykpOworCX0KKwlmaW5hbGx5CisJeworCQl0aGlzLm1vZGVsLmVuZFVwZGF0ZSgpOworCX0KKwkKKwlyZXR1cm4gY2VsbHM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjZWxsc1JlbW92ZWQKKyAqIAorICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY2VsbHMgZnJvbSB0aGUgbW9kZWwuIFRoaXMgbWV0aG9kIGZpcmVzCisgKiA8bXhFdmVudC5DRUxMU19SRU1PVkVEPiB3aGlsZSB0aGUgdHJhbnNhY3Rpb24gaXMgaW4gcHJvZ3Jlc3MuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGxzIC0gQXJyYXkgb2YgPG14Q2VsbHM+IHRvIHJlbW92ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY2VsbHNSZW1vdmVkID0gZnVuY3Rpb24oY2VsbHMpCit7CisJaWYgKGNlbGxzICE9IG51bGwgJiYgY2VsbHMubGVuZ3RoID4gMCkKKwl7CisJCXZhciBzY2FsZSA9IHRoaXMudmlldy5zY2FsZTsKKwkJdmFyIHRyID0gdGhpcy52aWV3LnRyYW5zbGF0ZTsKKwkJCisJCXRoaXMubW9kZWwuYmVnaW5VcGRhdGUoKTsKKwkJdHJ5CisJCXsKKwkJCS8vIENyZWF0ZXMgaGFzaHRhYmxlIGZvciBmYXN0ZXIgbG9va3VwCisJCQl2YXIgZGljdCA9IG5ldyBteERpY3Rpb25hcnkoKTsKKwkJCQorCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQlkaWN0LnB1dChjZWxsc1tpXSwgdHJ1ZSk7CisJCQl9CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJLy8gRGlzY29ubmVjdHMgZWRnZXMgd2hpY2ggYXJlIG5vdCBpbiBjZWxscworCQkJCXZhciBlZGdlcyA9IHRoaXMuZ2V0QWxsRWRnZXMoW2NlbGxzW2ldXSk7CisJCQkJCisJCQkJdmFyIGRpc2Nvbm5lY3RUZXJtaW5hbCA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihlZGdlLCBzb3VyY2UpCisJCQkJeworCQkJCQl2YXIgZ2VvID0gdGhpcy5tb2RlbC5nZXRHZW9tZXRyeShlZGdlKTsKKworCQkJCQlpZiAoZ2VvICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShlZGdlKTsKKwkJCQkJCQkJCisJCQkJCQlpZiAoc3RhdGUgIT0gbnVsbCkKKwkJCQkJCXsKKwkJCQkJCQkvLyBDaGVja3Mgd2hpY2ggc2lkZSBvZiB0aGUgZWRnZSBpcyBiZWluZyBkaXNjb25uZWN0ZWQKKwkJCQkJCQl2YXIgdG1wID0gc3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsKHNvdXJjZSk7CisJCQkJCQkJdmFyIGNvbm5lY3RlZCA9IGZhbHNlOworCQkJCQkJCQorCQkJCQkJCXdoaWxlICh0bXAgIT0gbnVsbCkKKwkJCQkJCQl7CisJCQkJCQkJCWlmIChjZWxsc1tpXSA9PSB0bXApCisJCQkJCQkJCXsKKwkJCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJfQorCQkJCQkJCQkKKwkJCQkJCQkJdG1wID0gdGhpcy5tb2RlbC5nZXRQYXJlbnQodG1wKTsKKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkJaWYgKGNvbm5lY3RlZCkKKwkJCQkJCQl7CisJCQkJCQkJCXZhciBkeCA9IHRyLng7CisJCQkJCQkJCXZhciBkeSA9IHRyLnk7CisJCQkJCQkJCXZhciBwYXJlbnRTdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZSh0aGlzLm1vZGVsLmdldFBhcmVudChlZGdlKSk7CisJCQkJCQkJCQorCQkJCQkJCQlpZiAocGFyZW50U3RhdGUgIT0gbnVsbCAmJiB0aGlzLm1vZGVsLmlzVmVydGV4KHBhcmVudFN0YXRlLmNlbGwpKQorCQkJCQkJCQl7CisJCQkJCQkJCQlkeCA9IHBhcmVudFN0YXRlLnggLyBzY2FsZTsKKwkJCQkJCQkJCWR5ID0gcGFyZW50U3RhdGUueSAvIHNjYWxlOworCQkJCQkJCQl9CisJCQkJCQkJCQorCQkJCQkJCQlnZW8gPSBnZW8uY2xvbmUoKTsKKwkJCQkJCQkJdmFyIHB0cyA9IHN0YXRlLmFic29sdXRlUG9pbnRzOworCQkJCQkJCQl2YXIgbiA9IChzb3VyY2UpID8gMCA6IHB0cy5sZW5ndGggLSAxOworCQkJCQkJCQlnZW8uc2V0VGVybWluYWxQb2ludChuZXcgbXhQb2ludChwdHNbbl0ueCAvIHNjYWxlIC0gZHgsIHB0c1tuXS55IC8gc2NhbGUgLSBkeSksIHNvdXJjZSk7CisJCQkJCQkJCXRoaXMubW9kZWwuc2V0VGVybWluYWwoZWRnZXNbal0sIG51bGwsIHNvdXJjZSk7CisJCQkJCQkJCXRoaXMubW9kZWwuc2V0R2VvbWV0cnkoZWRnZXNbal0sIGdlbyk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfSk7CisJCQkJCisJCQkJZm9yICh2YXIgaiA9IDA7IGogPCBlZGdlcy5sZW5ndGg7IGorKykKKwkJCQl7CisJCQkJCWlmICghZGljdC5nZXQoZWRnZXNbal0pKQorCQkJCQl7CisJCQkJCQlkaXNjb25uZWN0VGVybWluYWwoZWRnZXNbal0sIHRydWUpOworCQkJCQkJZGlzY29ubmVjdFRlcm1pbmFsKGVkZ2VzW2pdLCBmYWxzZSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQl0aGlzLm1vZGVsLnJlbW92ZShjZWxsc1tpXSk7CisJCQl9CisJCQkKKwkJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuQ0VMTFNfUkVNT1ZFRCwgJ2NlbGxzJywgY2VsbHMpKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCXRoaXMubW9kZWwuZW5kVXBkYXRlKCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzcGxpdEVkZ2UKKyAqIAorICogU3BsaXRzIHRoZSBnaXZlbiBlZGdlIGJ5IGFkZGluZyB0aGUgbmV3RWRnZSBiZXR3ZWVuIHRoZSBwcmV2aW91cyBzb3VyY2UKKyAqIGFuZCB0aGUgZ2l2ZW4gY2VsbCBhbmQgcmVjb25uZWN0aW5nIHRoZSBzb3VyY2Ugb2YgdGhlIGdpdmVuIGVkZ2UgdG8gdGhlCisgKiBnaXZlbiBjZWxsLiBUaGlzIG1ldGhvZCBmaXJlcyA8bXhFdmVudC5TUExJVF9FREdFPiB3aGlsZSB0aGUgdHJhbnNhY3Rpb24KKyAqIGlzIGluIHByb2dyZXNzLiBSZXR1cm5zIHRoZSBuZXcgZWRnZSB0aGF0IHdhcyBpbnNlcnRlZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZWRnZSAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgZWRnZSB0byBiZSBzcGxpdHRlZC4KKyAqIGNlbGxzIC0gPG14Q2VsbHM+IHRoYXQgcmVwcmVzZW50cyB0aGUgY2VsbHMgdG8gaW5zZXJ0IGludG8gdGhlIGVkZ2UuCisgKiBuZXdFZGdlIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBlZGdlIHRvIGJlIGluc2VydGVkLgorICogZHggLSBPcHRpb25hbCBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSB2ZWN0b3IgdG8gbW92ZSB0aGUgY2VsbHMuCisgKiBkeSAtIE9wdGlvbmFsIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHZlY3RvciB0byBtb3ZlIHRoZSBjZWxscy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc3BsaXRFZGdlID0gZnVuY3Rpb24oZWRnZSwgY2VsbHMsIG5ld0VkZ2UsIGR4LCBkeSkKK3sKKwlkeCA9IGR4IHx8IDA7CisJZHkgPSBkeSB8fCAwOworCisJdmFyIHBhcmVudCA9IHRoaXMubW9kZWwuZ2V0UGFyZW50KGVkZ2UpOworCXZhciBzb3VyY2UgPSB0aGlzLm1vZGVsLmdldFRlcm1pbmFsKGVkZ2UsIHRydWUpOworCisJdGhpcy5tb2RlbC5iZWdpblVwZGF0ZSgpOworCXRyeQorCXsKKwkJaWYgKG5ld0VkZ2UgPT0gbnVsbCkKKwkJeworCQkJbmV3RWRnZSA9IHRoaXMuY2xvbmVDZWxscyhbZWRnZV0pWzBdOworCQkJCisJCQkvLyBSZW1vdmVzIHdheXBvaW50cyBiZWZvcmUvYWZ0ZXIgbmV3IGNlbGwKKwkJCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShlZGdlKTsKKwkJCXZhciBnZW8gPSB0aGlzLmdldENlbGxHZW9tZXRyeShuZXdFZGdlKTsKKwkJCQorCQkJaWYgKGdlbyAhPSBudWxsICYmIGdlby5wb2ludHMgIT0gbnVsbCAmJiBzdGF0ZSAhPSBudWxsKQorCQkJeworCQkJCXZhciB0ID0gdGhpcy52aWV3LnRyYW5zbGF0ZTsKKwkJCQl2YXIgcyA9IHRoaXMudmlldy5zY2FsZTsKKwkJCQl2YXIgaWR4ID0gbXhVdGlscy5maW5kTmVhcmVzdFNlZ21lbnQoc3RhdGUsIChkeCArIHQueCkgKiBzLCAoZHkgKyB0LnkpICogcyk7CisJCQkJZ2VvLnBvaW50cyA9IGdlby5wb2ludHMuc2xpY2UoMCwgaWR4KTsKKwkJCQkJCQkJCisJCQkJZ2VvID0gdGhpcy5nZXRDZWxsR2VvbWV0cnkoZWRnZSk7CisJCQkJCisJCQkJaWYgKGdlbyAhPSBudWxsICYmIGdlby5wb2ludHMgIT0gbnVsbCkKKwkJCQl7CisJCQkJCWdlbyA9IGdlby5jbG9uZSgpOworCQkJCQlnZW8ucG9pbnRzID0gZ2VvLnBvaW50cy5zbGljZShpZHgpOworCQkJCQl0aGlzLm1vZGVsLnNldEdlb21ldHJ5KGVkZ2UsIGdlbyk7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQl0aGlzLmNlbGxzTW92ZWQoY2VsbHMsIGR4LCBkeSwgZmFsc2UsIGZhbHNlKTsKKwkJdGhpcy5jZWxsc0FkZGVkKGNlbGxzLCBwYXJlbnQsIHRoaXMubW9kZWwuZ2V0Q2hpbGRDb3VudChwYXJlbnQpLCBudWxsLCBudWxsLAorCQkJCXRydWUpOworCQl0aGlzLmNlbGxzQWRkZWQoW25ld0VkZ2VdLCBwYXJlbnQsIHRoaXMubW9kZWwuZ2V0Q2hpbGRDb3VudChwYXJlbnQpLAorCQkJCXNvdXJjZSwgY2VsbHNbMF0sIGZhbHNlKTsKKwkJdGhpcy5jZWxsQ29ubmVjdGVkKGVkZ2UsIGNlbGxzWzBdLCB0cnVlKTsKKwkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5TUExJVF9FREdFLCAnZWRnZScsIGVkZ2UsCisJCQkJJ2NlbGxzJywgY2VsbHMsICduZXdFZGdlJywgbmV3RWRnZSwgJ2R4JywgZHgsICdkeScsIGR5KSk7CisJfQorCWZpbmFsbHkKKwl7CisJCXRoaXMubW9kZWwuZW5kVXBkYXRlKCk7CisJfQorCisJcmV0dXJuIG5ld0VkZ2U7Cit9OworCisvKioKKyAqIEdyb3VwOiBDZWxsIHZpc2liaWxpdHkKKyAqLworCisvKioKKyAqIEZ1bmN0aW9uOiB0b2dnbGVDZWxscworICogCisgKiBTZXRzIHRoZSB2aXNpYmxlIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY2VsbHMgYW5kIGFsbCBjb25uZWN0ZWQgZWRnZXMKKyAqIGlmIGluY2x1ZGVFZGdlcyBpcyB0cnVlLiBUaGUgY2hhbmdlIGlzIGNhcnJpZWQgb3V0IHVzaW5nIDxjZWxsc1RvZ2dsZWQ+LgorICogVGhpcyBtZXRob2QgZmlyZXMgPG14RXZlbnQuVE9HR0xFX0NFTExTPiB3aGlsZSB0aGUgdHJhbnNhY3Rpb24gaXMgaW4KKyAqIHByb2dyZXNzLiBSZXR1cm5zIHRoZSBjZWxscyB3aG9zZSB2aXNpYmxlIHN0YXRlIHdhcyBjaGFuZ2VkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzaG93IC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyB0aGUgdmlzaWJsZSBzdGF0ZSB0byBiZSBhc3NpZ25lZC4KKyAqIGNlbGxzIC0gQXJyYXkgb2YgPG14Q2VsbHM+IHdob3NlIHZpc2libGUgc3RhdGUgc2hvdWxkIGJlIGNoYW5nZWQuIElmCisgKiBudWxsIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBzZWxlY3Rpb24gY2VsbHMgYXJlIHVzZWQuCisgKiBpbmNsdWRlRWRnZXMgLSBPcHRpb25hbCBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHZpc2libGUgc3RhdGUgb2YgYWxsCisgKiBjb25uZWN0ZWQgZWRnZXMgc2hvdWxkIGJlIGNoYW5nZWQgYXMgd2VsbC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoLnByb3RvdHlwZS50b2dnbGVDZWxscyA9IGZ1bmN0aW9uKHNob3csIGNlbGxzLCBpbmNsdWRlRWRnZXMpCit7CisJaWYgKGNlbGxzID09IG51bGwpCisJeworCQljZWxscyA9IHRoaXMuZ2V0U2VsZWN0aW9uQ2VsbHMoKTsKKwl9CisKKwkvLyBBZGRzIGFsbCBjb25uZWN0ZWQgZWRnZXMgcmVjdXJzaXZlbHkKKwlpZiAoaW5jbHVkZUVkZ2VzKQorCXsKKwkJY2VsbHMgPSB0aGlzLmFkZEFsbEVkZ2VzKGNlbGxzKTsKKwl9CisKKwl0aGlzLm1vZGVsLmJlZ2luVXBkYXRlKCk7CisJdHJ5CisJeworCQl0aGlzLmNlbGxzVG9nZ2xlZChjZWxscywgc2hvdyk7CisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuVE9HR0xFX0NFTExTLAorCQkJJ3Nob3cnLCBzaG93LCAnY2VsbHMnLCBjZWxscywgJ2luY2x1ZGVFZGdlcycsIGluY2x1ZGVFZGdlcykpOworCX0KKwlmaW5hbGx5CisJeworCQl0aGlzLm1vZGVsLmVuZFVwZGF0ZSgpOworCX0KKworCXJldHVybiBjZWxsczsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNlbGxzVG9nZ2xlZAorICogCisgKiBTZXRzIHRoZSB2aXNpYmxlIHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY2VsbHMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGxzIC0gQXJyYXkgb2YgPG14Q2VsbHM+IHdob3NlIHZpc2libGUgc3RhdGUgc2hvdWxkIGJlIGNoYW5nZWQuCisgKiBzaG93IC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyB0aGUgdmlzaWJsZSBzdGF0ZSB0byBiZSBhc3NpZ25lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY2VsbHNUb2dnbGVkID0gZnVuY3Rpb24oY2VsbHMsIHNob3cpCit7CisJaWYgKGNlbGxzICE9IG51bGwgJiYgY2VsbHMubGVuZ3RoID4gMCkKKwl7CisJCXRoaXMubW9kZWwuYmVnaW5VcGRhdGUoKTsKKwkJdHJ5CisJCXsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJdGhpcy5tb2RlbC5zZXRWaXNpYmxlKGNlbGxzW2ldLCBzaG93KTsKKwkJCX0KKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCXRoaXMubW9kZWwuZW5kVXBkYXRlKCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEdyb3VwOiBGb2xkaW5nCisgKi8KKworLyoqCisgKiBGdW5jdGlvbjogZm9sZENlbGxzCisgKiAKKyAqIFNldHMgdGhlIGNvbGxhcHNlZCBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNlbGxzIGFuZCBhbGwgZGVzY2VuZGFudHMKKyAqIGlmIHJlY3Vyc2UgaXMgdHJ1ZS4gVGhlIGNoYW5nZSBpcyBjYXJyaWVkIG91dCB1c2luZyA8Y2VsbHNGb2xkZWQ+LgorICogVGhpcyBtZXRob2QgZmlyZXMgPG14RXZlbnQuRk9MRF9DRUxMUz4gd2hpbGUgdGhlIHRyYW5zYWN0aW9uIGlzIGluCisgKiBwcm9ncmVzcy4gUmV0dXJucyB0aGUgY2VsbHMgd2hvc2UgY29sbGFwc2VkIHN0YXRlIHdhcyBjaGFuZ2VkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjb2xsYXBzZWQgLSBCb29sZWFuIGluZGljYXRpbmcgdGhlIGNvbGxhcHNlZCBzdGF0ZSB0byBiZSBhc3NpZ25lZC4KKyAqIHJlY3Vyc2UgLSBPcHRpb25hbCBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGNvbGxhcHNlZCBzdGF0ZSBvZiBhbGwKKyAqIGRlc2NlbmRhbnRzIHNob3VsZCBiZSBzZXQuIERlZmF1bHQgaXMgZmFsc2UuCisgKiBjZWxscyAtIEFycmF5IG9mIDxteENlbGxzPiB3aG9zZSBjb2xsYXBzZWQgc3RhdGUgc2hvdWxkIGJlIHNldC4gSWYKKyAqIG51bGwgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZvbGRhYmxlIHNlbGVjdGlvbiBjZWxscyBhcmUgdXNlZC4KKyAqIGNoZWNrRm9sZGFibGUgLSBPcHRpb25hbCBib29sZWFuIGluZGljYXRpbmcgb2YgaXNDZWxsRm9sZGFibGUgc2hvdWxkIGJlCisgKiBjaGVja2VkLiBEZWZhdWx0IGlzIGZhbHNlLgorICogZXZ0IC0gT3B0aW9uYWwgbmF0aXZlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBpbnZvY2F0aW9uLgorICovCitteEdyYXBoLnByb3RvdHlwZS5mb2xkQ2VsbHMgPSBmdW5jdGlvbihjb2xsYXBzZSwgcmVjdXJzZSwgY2VsbHMsIGNoZWNrRm9sZGFibGUsIGV2dCkKK3sKKwlyZWN1cnNlID0gKHJlY3Vyc2UgIT0gbnVsbCkgPyByZWN1cnNlIDogZmFsc2U7CisJCisJaWYgKGNlbGxzID09IG51bGwpCisJeworCQljZWxscyA9IHRoaXMuZ2V0Rm9sZGFibGVDZWxscyh0aGlzLmdldFNlbGVjdGlvbkNlbGxzKCksIGNvbGxhcHNlKTsKKwl9CisKKwl0aGlzLnN0b3BFZGl0aW5nKGZhbHNlKTsKKworCXRoaXMubW9kZWwuYmVnaW5VcGRhdGUoKTsKKwl0cnkKKwl7CisJCXRoaXMuY2VsbHNGb2xkZWQoY2VsbHMsIGNvbGxhcHNlLCByZWN1cnNlLCBjaGVja0ZvbGRhYmxlKTsKKwkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5GT0xEX0NFTExTLAorCQkJJ2NvbGxhcHNlJywgY29sbGFwc2UsICdyZWN1cnNlJywgcmVjdXJzZSwgJ2NlbGxzJywgY2VsbHMpKTsKKwl9CisJZmluYWxseQorCXsKKwkJdGhpcy5tb2RlbC5lbmRVcGRhdGUoKTsKKwl9CisKKwlyZXR1cm4gY2VsbHM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjZWxsc0ZvbGRlZAorICogCisgKiBTZXRzIHRoZSBjb2xsYXBzZWQgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjZWxscy4gVGhpcyBtZXRob2QgZmlyZXMKKyAqIDxteEV2ZW50LkNFTExTX0ZPTERFRD4gd2hpbGUgdGhlIHRyYW5zYWN0aW9uIGlzIGluIHByb2dyZXNzLiBSZXR1cm5zIHRoZQorICogY2VsbHMgd2hvc2UgY29sbGFwc2VkIHN0YXRlIHdhcyBjaGFuZ2VkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxscyAtIEFycmF5IG9mIDxteENlbGxzPiB3aG9zZSBjb2xsYXBzZWQgc3RhdGUgc2hvdWxkIGJlIHNldC4KKyAqIGNvbGxhcHNlZCAtIEJvb2xlYW4gaW5kaWNhdGluZyB0aGUgY29sbGFwc2VkIHN0YXRlIHRvIGJlIGFzc2lnbmVkLgorICogcmVjdXJzZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY29sbGFwc2VkIHN0YXRlIG9mIGFsbCBkZXNjZW5kYW50cworICogc2hvdWxkIGJlIHNldC4KKyAqIGNoZWNrRm9sZGFibGUgLSBPcHRpb25hbCBib29sZWFuIGluZGljYXRpbmcgb2YgaXNDZWxsRm9sZGFibGUgc2hvdWxkIGJlCisgKiBjaGVja2VkLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jZWxsc0ZvbGRlZCA9IGZ1bmN0aW9uKGNlbGxzLCBjb2xsYXBzZSwgcmVjdXJzZSwgY2hlY2tGb2xkYWJsZSkKK3sKKwlpZiAoY2VsbHMgIT0gbnVsbCAmJiBjZWxscy5sZW5ndGggPiAwKQorCXsKKwkJdGhpcy5tb2RlbC5iZWdpblVwZGF0ZSgpOworCQl0cnkKKwkJeworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQlpZiAoKCFjaGVja0ZvbGRhYmxlIHx8IHRoaXMuaXNDZWxsRm9sZGFibGUoY2VsbHNbaV0sIGNvbGxhcHNlKSkgJiYKKwkJCQkJY29sbGFwc2UgIT0gdGhpcy5pc0NlbGxDb2xsYXBzZWQoY2VsbHNbaV0pKQorCQkJCXsKKwkJCQkJdGhpcy5tb2RlbC5zZXRDb2xsYXBzZWQoY2VsbHNbaV0sIGNvbGxhcHNlKTsKKwkJCQkJdGhpcy5zd2FwQm91bmRzKGNlbGxzW2ldLCBjb2xsYXBzZSk7CisKKwkJCQkJaWYgKHRoaXMuaXNFeHRlbmRQYXJlbnQoY2VsbHNbaV0pKQorCQkJCQl7CisJCQkJCQl0aGlzLmV4dGVuZFBhcmVudChjZWxsc1tpXSk7CisJCQkJCX0KKworCQkJCQlpZiAocmVjdXJzZSkKKwkJCQkJeworCQkJCQkJdmFyIGNoaWxkcmVuID0gdGhpcy5tb2RlbC5nZXRDaGlsZHJlbihjZWxsc1tpXSk7CisJCQkJCQl0aGlzLmZvbGRDZWxscyhjaGlsZHJlbiwgY29sbGFwc2UsIHJlY3Vyc2UpOworCQkJCQl9CisJCQkJCQorCQkJCQl0aGlzLmNvbnN0cmFpbkNoaWxkKGNlbGxzW2ldKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuQ0VMTFNfRk9MREVELAorCQkJCSdjZWxscycsIGNlbGxzLCAnY29sbGFwc2UnLCBjb2xsYXBzZSwgJ3JlY3Vyc2UnLCByZWN1cnNlKSk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCQl0aGlzLm1vZGVsLmVuZFVwZGF0ZSgpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogc3dhcEJvdW5kcworICogCisgKiBTd2FwcyB0aGUgYWx0ZXJuYXRlIGFuZCB0aGUgYWN0dWFsIGJvdW5kcyBpbiB0aGUgZ2VvbWV0cnkgb2YgdGhlIGdpdmVuCisgKiBjZWxsIGludm9raW5nIDx1cGRhdGVBbHRlcm5hdGVCb3VuZHM+IGJlZm9yZSBjYXJyeWluZyBvdXQgdGhlIHN3YXAuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiBmb3Igd2hpY2ggdGhlIGJvdW5kcyBzaG91bGQgYmUgc3dhcHBlZC4KKyAqIHdpbGxDb2xsYXBzZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY2VsbCBpcyBnb2luZyB0byBiZSBjb2xsYXBzZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnN3YXBCb3VuZHMgPSBmdW5jdGlvbihjZWxsLCB3aWxsQ29sbGFwc2UpCit7CisJaWYgKGNlbGwgIT0gbnVsbCkKKwl7CisJCXZhciBnZW8gPSB0aGlzLm1vZGVsLmdldEdlb21ldHJ5KGNlbGwpOworCQkKKwkJaWYgKGdlbyAhPSBudWxsKQorCQl7CisJCQlnZW8gPSBnZW8uY2xvbmUoKTsKKwkJCQorCQkJdGhpcy51cGRhdGVBbHRlcm5hdGVCb3VuZHMoY2VsbCwgZ2VvLCB3aWxsQ29sbGFwc2UpOworCQkJZ2VvLnN3YXAoKTsKKwkJCQorCQkJdGhpcy5tb2RlbC5zZXRHZW9tZXRyeShjZWxsLCBnZW8pOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlQWx0ZXJuYXRlQm91bmRzCisgKiAKKyAqIFVwZGF0ZXMgb3Igc2V0cyB0aGUgYWx0ZXJuYXRlIGJvdW5kcyBpbiB0aGUgZ2l2ZW4gZ2VvbWV0cnkgZm9yIHRoZSBnaXZlbgorICogY2VsbCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY2VsbCBpcyBnb2luZyB0byBiZSBjb2xsYXBzZWQuIElmIG5vCisgKiBhbHRlcm5hdGUgYm91bmRzIGFyZSBkZWZpbmVkIGluIHRoZSBnZW9tZXRyeSBhbmQKKyAqIDxjb2xsYXBzZVRvUHJlZmVycmVkU2l6ZT4gaXMgdHJ1ZSwgdGhlbiB0aGUgcHJlZmVycmVkIHNpemUgaXMgdXNlZCBmb3IKKyAqIHRoZSBhbHRlcm5hdGUgYm91bmRzLiBUaGUgdG9wLCBsZWZ0IGNvcm5lciBpcyBhbHdheXMga2VwdCBhdCB0aGUgc2FtZQorICogbG9jYXRpb24uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiBmb3Igd2hpY2ggdGhlIGdlb21ldHJ5IGlzIGJlaW5nIHVkcGF0ZWQuCisgKiBnIC0gPG14R2VvbWV0cnk+IGZvciB3aGljaCB0aGUgYWx0ZXJuYXRlIGJvdW5kcyBzaG91bGQgYmUgdXBkYXRlZC4KKyAqIHdpbGxDb2xsYXBzZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY2VsbCBpcyBnb2luZyB0byBiZSBjb2xsYXBzZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnVwZGF0ZUFsdGVybmF0ZUJvdW5kcyA9IGZ1bmN0aW9uKGNlbGwsIGdlbywgd2lsbENvbGxhcHNlKQoreworCWlmIChjZWxsICE9IG51bGwgJiYgZ2VvICE9IG51bGwpCisJeworCQl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoY2VsbCk7CisJCXZhciBzdHlsZSA9IChzdGF0ZSAhPSBudWxsKSA/IHN0YXRlLnN0eWxlIDogdGhpcy5nZXRDZWxsU3R5bGUoY2VsbCk7CisKKwkJaWYgKGdlby5hbHRlcm5hdGVCb3VuZHMgPT0gbnVsbCkKKwkJeworCQkJdmFyIGJvdW5kcyA9IGdlbzsKKwkJCQorCQkJaWYgKHRoaXMuY29sbGFwc2VUb1ByZWZlcnJlZFNpemUpCisJCQl7CisJCQkJdmFyIHRtcCA9IHRoaXMuZ2V0UHJlZmVycmVkU2l6ZUZvckNlbGwoY2VsbCk7CisJCQkJCisJCQkJaWYgKHRtcCAhPSBudWxsKQorCQkJCXsKKwkJCQkJYm91bmRzID0gdG1wOworCisJCQkJCXZhciBzdGFydFNpemUgPSBteFV0aWxzLmdldFZhbHVlKHN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9TVEFSVFNJWkUpOworCisJCQkJCWlmIChzdGFydFNpemUgPiAwKQorCQkJCQl7CisJCQkJCQlib3VuZHMuaGVpZ2h0ID0gTWF0aC5tYXgoYm91bmRzLmhlaWdodCwgc3RhcnRTaXplKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQorCQkJZ2VvLmFsdGVybmF0ZUJvdW5kcyA9IG5ldyBteFJlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOworCQl9CisJCQorCQlpZiAoZ2VvLmFsdGVybmF0ZUJvdW5kcyAhPSBudWxsKQorCQl7CisJCQlnZW8uYWx0ZXJuYXRlQm91bmRzLnggPSBnZW8ueDsKKwkJCWdlby5hbHRlcm5hdGVCb3VuZHMueSA9IGdlby55OworCQkJCisJCQl2YXIgYWxwaGEgPSBteFV0aWxzLnRvUmFkaWFucyhzdHlsZVtteENvbnN0YW50cy5TVFlMRV9ST1RBVElPTl0gfHwgMCk7CisJCQkKKwkJCWlmIChhbHBoYSAhPSAwKQorCQkJeworCQkJCXZhciBkeCA9IGdlby5hbHRlcm5hdGVCb3VuZHMuZ2V0Q2VudGVyWCgpIC0gZ2VvLmdldENlbnRlclgoKTsKKwkJCQl2YXIgZHkgPSBnZW8uYWx0ZXJuYXRlQm91bmRzLmdldENlbnRlclkoKSAtIGdlby5nZXRDZW50ZXJZKCk7CisJCisJCQkJdmFyIGNvcyA9IE1hdGguY29zKGFscGhhKTsKKwkJCQl2YXIgc2luID0gTWF0aC5zaW4oYWxwaGEpOworCQorCQkJCXZhciBkeDIgPSBjb3MgKiBkeCAtIHNpbiAqIGR5OworCQkJCXZhciBkeTIgPSBzaW4gKiBkeCArIGNvcyAqIGR5OworCQkJCQorCQkJCWdlby5hbHRlcm5hdGVCb3VuZHMueCArPSBkeDIgLSBkeDsKKwkJCQlnZW8uYWx0ZXJuYXRlQm91bmRzLnkgKz0gZHkyIC0gZHk7CisJCQl9CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRBbGxFZGdlcworICogCisgKiBSZXR1cm5zIGFuIGFycmF5IHdpdGggdGhlIGdpdmVuIGNlbGxzIGFuZCBhbGwgZWRnZXMgdGhhdCBhcmUgY29ubmVjdGVkCisgKiB0byBhIGNlbGwgb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuYWRkQWxsRWRnZXMgPSBmdW5jdGlvbihjZWxscykKK3sKKwl2YXIgYWxsQ2VsbHMgPSBjZWxscy5zbGljZSgpOworCQorCXJldHVybiBteFV0aWxzLnJlbW92ZUR1cGxpY2F0ZXMoYWxsQ2VsbHMuY29uY2F0KHRoaXMuZ2V0QWxsRWRnZXMoY2VsbHMpKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRBbGxFZGdlcworICogCisgKiBSZXR1cm5zIGFsbCBlZGdlcyBjb25uZWN0ZWQgdG8gdGhlIGdpdmVuIGNlbGxzIG9yIGl0cyBkZXNjZW5kYW50cy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0QWxsRWRnZXMgPSBmdW5jdGlvbihjZWxscykKK3sKKwl2YXIgZWRnZXMgPSBbXTsKKwkKKwlpZiAoY2VsbHMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBlZGdlQ291bnQgPSB0aGlzLm1vZGVsLmdldEVkZ2VDb3VudChjZWxsc1tpXSk7CisJCQkKKwkJCWZvciAodmFyIGogPSAwOyBqIDwgZWRnZUNvdW50OyBqKyspCisJCQl7CisJCQkJZWRnZXMucHVzaCh0aGlzLm1vZGVsLmdldEVkZ2VBdChjZWxsc1tpXSwgaikpOworCQkJfQorCisJCQkvLyBSZWN1cnNlcworCQkJdmFyIGNoaWxkcmVuID0gdGhpcy5tb2RlbC5nZXRDaGlsZHJlbihjZWxsc1tpXSk7CisJCQllZGdlcyA9IGVkZ2VzLmNvbmNhdCh0aGlzLmdldEFsbEVkZ2VzKGNoaWxkcmVuKSk7CisJCX0KKwl9CisJCisJcmV0dXJuIGVkZ2VzOworfTsKKworLyoqCisgKiBHcm91cDogQ2VsbCBzaXppbmcKKyAqLworCisvKioKKyAqIEZ1bmN0aW9uOiB1cGRhdGVDZWxsU2l6ZQorICogCisgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoZSBnaXZlbiBjZWxsIGluIHRoZSBtb2RlbCB1c2luZyA8Y2VsbFNpemVVcGRhdGVkPi4KKyAqIFRoaXMgbWV0aG9kIGZpcmVzIDxteEV2ZW50LlVQREFURV9DRUxMX1NJWkU+IHdoaWxlIHRoZSB0cmFuc2FjdGlvbiBpcyBpbgorICogcHJvZ3Jlc3MuIFJldHVybnMgdGhlIGNlbGwgd2hvc2Ugc2l6ZSB3YXMgdXBkYXRlZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdob3NlIHNpemUgc2hvdWxkIGJlIHVwZGF0ZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnVwZGF0ZUNlbGxTaXplID0gZnVuY3Rpb24oY2VsbCwgaWdub3JlQ2hpbGRyZW4pCit7CisJaWdub3JlQ2hpbGRyZW4gPSAoaWdub3JlQ2hpbGRyZW4gIT0gbnVsbCkgPyBpZ25vcmVDaGlsZHJlbiA6IGZhbHNlOworCQorCXRoaXMubW9kZWwuYmVnaW5VcGRhdGUoKTsJCQkJCisJdHJ5CisJeworCQl0aGlzLmNlbGxTaXplVXBkYXRlZChjZWxsLCBpZ25vcmVDaGlsZHJlbik7CisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuVVBEQVRFX0NFTExfU0laRSwKKwkJCQknY2VsbCcsIGNlbGwsICdpZ25vcmVDaGlsZHJlbicsIGlnbm9yZUNoaWxkcmVuKSk7CisJfQorCWZpbmFsbHkKKwl7CisJCXRoaXMubW9kZWwuZW5kVXBkYXRlKCk7CisJfQorCQorCXJldHVybiBjZWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY2VsbFNpemVVcGRhdGVkCisgKiAKKyAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhlIGdpdmVuIGNlbGwgaW4gdGhlIG1vZGVsIHVzaW5nCisgKiA8Z2V0UHJlZmVycmVkU2l6ZUZvckNlbGw+IHRvIGdldCB0aGUgbmV3IHNpemUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiBmb3Igd2hpY2ggdGhlIHNpemUgc2hvdWxkIGJlIGNoYW5nZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNlbGxTaXplVXBkYXRlZCA9IGZ1bmN0aW9uKGNlbGwsIGlnbm9yZUNoaWxkcmVuKQoreworCWlmIChjZWxsICE9IG51bGwpCisJeworCQl0aGlzLm1vZGVsLmJlZ2luVXBkYXRlKCk7CQkJCQorCQl0cnkKKwkJeworCQkJdmFyIHNpemUgPSB0aGlzLmdldFByZWZlcnJlZFNpemVGb3JDZWxsKGNlbGwpOworCQkJdmFyIGdlbyA9IHRoaXMubW9kZWwuZ2V0R2VvbWV0cnkoY2VsbCk7CisJCQkKKwkJCWlmIChzaXplICE9IG51bGwgJiYgZ2VvICE9IG51bGwpCisJCQl7CisJCQkJdmFyIGNvbGxhcHNlZCA9IHRoaXMuaXNDZWxsQ29sbGFwc2VkKGNlbGwpOworCQkJCWdlbyA9IGdlby5jbG9uZSgpOworCisJCQkJaWYgKHRoaXMuaXNTd2ltbGFuZShjZWxsKSkKKwkJCQl7CisJCQkJCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShjZWxsKTsKKwkJCQkJdmFyIHN0eWxlID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuc3R5bGUgOiB0aGlzLmdldENlbGxTdHlsZShjZWxsKTsKKwkJCQkJdmFyIGNlbGxTdHlsZSA9IHRoaXMubW9kZWwuZ2V0U3R5bGUoY2VsbCk7CisKKwkJCQkJaWYgKGNlbGxTdHlsZSA9PSBudWxsKQorCQkJCQl7CisJCQkJCQljZWxsU3R5bGUgPSAnJzsKKwkJCQkJfQorCisJCQkJCWlmIChteFV0aWxzLmdldFZhbHVlKHN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9IT1JJWk9OVEFMLCB0cnVlKSkKKwkJCQkJeworCQkJCQkJY2VsbFN0eWxlID0gbXhVdGlscy5zZXRTdHlsZShjZWxsU3R5bGUsCisJCQkJCQkJCW14Q29uc3RhbnRzLlNUWUxFX1NUQVJUU0laRSwgc2l6ZS5oZWlnaHQgKyA4KTsKKworCQkJCQkJaWYgKGNvbGxhcHNlZCkKKwkJCQkJCXsKKwkJCQkJCQlnZW8uaGVpZ2h0ID0gc2l6ZS5oZWlnaHQgKyA4OworCQkJCQkJfQorCisJCQkJCQlnZW8ud2lkdGggPSBzaXplLndpZHRoOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJY2VsbFN0eWxlID0gbXhVdGlscy5zZXRTdHlsZShjZWxsU3R5bGUsCisJCQkJCQkJCW14Q29uc3RhbnRzLlNUWUxFX1NUQVJUU0laRSwgc2l6ZS53aWR0aCArIDgpOworCisJCQkJCQlpZiAoY29sbGFwc2VkKQorCQkJCQkJeworCQkJCQkJCWdlby53aWR0aCA9IHNpemUud2lkdGggKyA4OworCQkJCQkJfQorCisJCQkJCQlnZW8uaGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7CisJCQkJCX0KKworCQkJCQl0aGlzLm1vZGVsLnNldFN0eWxlKGNlbGwsIGNlbGxTdHlsZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWdlby53aWR0aCA9IHNpemUud2lkdGg7CisJCQkJCWdlby5oZWlnaHQgPSBzaXplLmhlaWdodDsKKwkJCQl9CisKKwkJCQlpZiAoIWlnbm9yZUNoaWxkcmVuICYmICFjb2xsYXBzZWQpCisJCQkJeworCQkJCQl2YXIgYm91bmRzID0gdGhpcy52aWV3LmdldEJvdW5kcyh0aGlzLm1vZGVsLmdldENoaWxkcmVuKGNlbGwpKTsKKworCQkJCQlpZiAoYm91bmRzICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCXZhciB0ciA9IHRoaXMudmlldy50cmFuc2xhdGU7CisJCQkJCQl2YXIgc2NhbGUgPSB0aGlzLnZpZXcuc2NhbGU7CisKKwkJCQkJCXZhciB3aWR0aCA9IChib3VuZHMueCArIGJvdW5kcy53aWR0aCkgLyBzY2FsZSAtIGdlby54IC0gdHIueDsKKwkJCQkJCXZhciBoZWlnaHQgPSAoYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KSAvIHNjYWxlIC0gZ2VvLnkgLSB0ci55OworCisJCQkJCQlnZW8ud2lkdGggPSBNYXRoLm1heChnZW8ud2lkdGgsIHdpZHRoKTsKKwkJCQkJCWdlby5oZWlnaHQgPSBNYXRoLm1heChnZW8uaGVpZ2h0LCBoZWlnaHQpOworCQkJCQl9CisJCQkJfQorCisJCQkJdGhpcy5jZWxsc1Jlc2l6ZWQoW2NlbGxdLCBbZ2VvXSwgZmFsc2UpOworCQkJfQorCQl9CisJCWZpbmFsbHkKKwkJeworCQkJdGhpcy5tb2RlbC5lbmRVcGRhdGUoKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFByZWZlcnJlZFNpemVGb3JDZWxsCisgKiAKKyAqIFJldHVybnMgdGhlIHByZWZlcnJlZCB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBnaXZlbiA8bXhDZWxsPiBhcyBhbgorICogPG14UmVjdGFuZ2xlPi4gVG8gaW1wbGVtZW50IGEgbWluaW11bSB3aWR0aCwgYWRkIGEgbmV3IHN0eWxlIGVnLgorICogbWluV2lkdGggaW4gdGhlIHZlcnRleCBhbmQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgZm9sbG93cy4KKyAqIAorICogKGNvZGUpCisgKiB2YXIgZ3JhcGhHZXRQcmVmZXJyZWRTaXplRm9yQ2VsbCA9IGdyYXBoLmdldFByZWZlcnJlZFNpemVGb3JDZWxsOworICogZ3JhcGguZ2V0UHJlZmVycmVkU2l6ZUZvckNlbGwgPSBmdW5jdGlvbihjZWxsKQorICogeworICogICB2YXIgcmVzdWx0ID0gZ3JhcGhHZXRQcmVmZXJyZWRTaXplRm9yQ2VsbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICogICB2YXIgc3R5bGUgPSB0aGlzLmdldENlbGxTdHlsZShjZWxsKTsKKyAqICAgCisgKiAgIGlmIChzdHlsZVsnbWluV2lkdGgnXSA+IDApCisgKiAgIHsKKyAqICAgICByZXN1bHQud2lkdGggPSBNYXRoLm1heChzdHlsZVsnbWluV2lkdGgnXSwgcmVzdWx0LndpZHRoKTsKKyAqICAgfQorICogCisgKiAgIHJldHVybiByZXN1bHQ7CisgKiB9OworICogKGVuZCkKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IGZvciB3aGljaCB0aGUgcHJlZmVycmVkIHNpemUgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRQcmVmZXJyZWRTaXplRm9yQ2VsbCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJdmFyIHJlc3VsdCA9IG51bGw7CisJCisJaWYgKGNlbGwgIT0gbnVsbCkKKwl7CisJCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShjZWxsKSB8fCB0aGlzLnZpZXcuY3JlYXRlU3RhdGUoY2VsbCk7CisJCXZhciBzdHlsZSA9IHN0YXRlLnN0eWxlOworCisJCWlmICghdGhpcy5tb2RlbC5pc0VkZ2UoY2VsbCkpCisJCXsKKwkJCXZhciBmb250U2l6ZSA9IHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0ZPTlRTSVpFXSB8fCBteENvbnN0YW50cy5ERUZBVUxUX0ZPTlRTSVpFOworCQkJdmFyIGR4ID0gMDsKKwkJCXZhciBkeSA9IDA7CisJCQkKKwkJCS8vIEFkZHMgZGltZW5zaW9uIG9mIGltYWdlIGlmIHNoYXBlIGlzIGEgbGFiZWwKKwkJCWlmICh0aGlzLmdldEltYWdlKHN0YXRlKSAhPSBudWxsIHx8IHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0lNQUdFXSAhPSBudWxsKQorCQkJeworCQkJCWlmIChzdHlsZVtteENvbnN0YW50cy5TVFlMRV9TSEFQRV0gPT0gbXhDb25zdGFudHMuU0hBUEVfTEFCRUwpCisJCQkJeworCQkJCQlpZiAoc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfVkVSVElDQUxfQUxJR05dID09IG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSkKKwkJCQkJeworCQkJCQkJZHggKz0gcGFyc2VGbG9hdChzdHlsZVtteENvbnN0YW50cy5TVFlMRV9JTUFHRV9XSURUSF0pIHx8IG14TGFiZWwucHJvdG90eXBlLmltYWdlU2l6ZTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0FMSUdOXSAhPSBteENvbnN0YW50cy5BTElHTl9DRU5URVIpCisJCQkJCXsKKwkJCQkJCWR5ICs9IHBhcnNlRmxvYXQoc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfSU1BR0VfSEVJR0hUXSkgfHwgbXhMYWJlbC5wcm90b3R5cGUuaW1hZ2VTaXplOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQkvLyBBZGRzIHNwYWNpbmdzCisJCQlkeCArPSAyICogKHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1NQQUNJTkddIHx8IDApOworCQkJZHggKz0gc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU1BBQ0lOR19MRUZUXSB8fCAwOworCQkJZHggKz0gc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU1BBQ0lOR19SSUdIVF0gfHwgMDsKKworCQkJZHkgKz0gMiAqIChzdHlsZVtteENvbnN0YW50cy5TVFlMRV9TUEFDSU5HXSB8fCAwKTsKKwkJCWR5ICs9IHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1NQQUNJTkdfVE9QXSB8fCAwOworCQkJZHkgKz0gc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU1BBQ0lOR19CT1RUT01dIHx8IDA7CisJCQkKKwkJCS8vIEFkZCBzcGFjaW5nIGZvciBjb2xsYXBzZS9leHBhbmQgaWNvbgorCQkJLy8gTEFURVI6IENoZWNrIGFsaWdubWVudCBhbmQgdXNlIGNvbnN0YW50cworCQkJLy8gZm9yIGltYWdlIHNwYWNpbmcKKwkJCXZhciBpbWFnZSA9IHRoaXMuZ2V0Rm9sZGluZ0ltYWdlKHN0YXRlKTsKKwkJCQorCQkJaWYgKGltYWdlICE9IG51bGwpCisJCQl7CisJCQkJZHggKz0gaW1hZ2Uud2lkdGggKyA4OworCQkJfQorCisJCQkvLyBBZGRzIHNwYWNlIGZvciBsYWJlbAorCQkJdmFyIHZhbHVlID0gdGhpcy5jZWxsUmVuZGVyZXIuZ2V0TGFiZWxWYWx1ZShzdGF0ZSk7CisKKwkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCA+IDApCisJCQl7CisJCQkJaWYgKCF0aGlzLmlzSHRtbExhYmVsKHN0YXRlLmNlbGwpKQorCQkJCXsKKwkJCQkJdmFsdWUgPSBteFV0aWxzLmh0bWxFbnRpdGllcyh2YWx1ZSk7CisJCQkJfQorCQkJCQorCQkJCXZhbHVlID0gdmFsdWUucmVwbGFjZSgvXG4vZywgJzxicj4nKTsKKwkJCQkKKwkJCQl2YXIgc2l6ZSA9IG14VXRpbHMuZ2V0U2l6ZUZvclN0cmluZyh2YWx1ZSwgZm9udFNpemUsIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0ZPTlRGQU1JTFldKTsKKwkJCQl2YXIgd2lkdGggPSBzaXplLndpZHRoICsgZHg7CisJCQkJdmFyIGhlaWdodCA9IHNpemUuaGVpZ2h0ICsgZHk7CisJCQkJCisJCQkJaWYgKCFteFV0aWxzLmdldFZhbHVlKHN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9IT1JJWk9OVEFMLCB0cnVlKSkKKwkJCQl7CisJCQkJCXZhciB0bXAgPSBoZWlnaHQ7CisJCQkJCQorCQkJCQloZWlnaHQgPSB3aWR0aDsKKwkJCQkJd2lkdGggPSB0bXA7CisJCQkJfQorCQkJCisJCQkJaWYgKHRoaXMuZ3JpZEVuYWJsZWQpCisJCQkJeworCQkJCQl3aWR0aCA9IHRoaXMuc25hcCh3aWR0aCArIHRoaXMuZ3JpZFNpemUgLyAyKTsKKwkJCQkJaGVpZ2h0ID0gdGhpcy5zbmFwKGhlaWdodCArIHRoaXMuZ3JpZFNpemUgLyAyKTsKKwkJCQl9CisKKwkJCQlyZXN1bHQgPSBuZXcgbXhSZWN0YW5nbGUoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdmFyIGdzMiA9IDQgKiB0aGlzLmdyaWRTaXplOworCQkJCXJlc3VsdCA9IG5ldyBteFJlY3RhbmdsZSgwLCAwLCBnczIsIGdzMik7CisJCQl9CisJCX0KKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlc2l6ZUNlbGwKKyAqIAorICogU2V0cyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBjZWxsIHVzaW5nIDxyZXNpemVDZWxscz4uIFJldHVybnMgdGhlCisgKiBjZWxsIHdoaWNoIHdhcyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgYm91bmRzIHNob3VsZCBiZSBjaGFuZ2VkLgorICogYm91bmRzIC0gPG14UmVjdGFuZ2xlPiB0aGF0IHJlcHJlc2VudHMgdGhlIG5ldyBib3VuZHMuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnJlc2l6ZUNlbGwgPSBmdW5jdGlvbihjZWxsLCBib3VuZHMsIHJlY3Vyc2UpCit7CisJcmV0dXJuIHRoaXMucmVzaXplQ2VsbHMoW2NlbGxdLCBbYm91bmRzXSwgcmVjdXJzZSlbMF07Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZXNpemVDZWxscworICogCisgKiBTZXRzIHRoZSBib3VuZHMgb2YgdGhlIGdpdmVuIGNlbGxzIGFuZCBmaXJlcyBhIDxteEV2ZW50LlJFU0laRV9DRUxMUz4KKyAqIGV2ZW50IHdoaWxlIHRoZSB0cmFuc2FjdGlvbiBpcyBpbiBwcm9ncmVzcy4gUmV0dXJucyB0aGUgY2VsbHMgd2hpY2gKKyAqIGhhdmUgYmVlbiBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxscyAtIEFycmF5IG9mIDxteENlbGxzPiB3aG9zZSBib3VuZHMgc2hvdWxkIGJlIGNoYW5nZWQuCisgKiBib3VuZHMgLSBBcnJheSBvZiA8bXhSZWN0YW5nbGVzPiB0aGF0IHJlcHJlc2VudCB0aGUgbmV3IGJvdW5kcy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUucmVzaXplQ2VsbHMgPSBmdW5jdGlvbihjZWxscywgYm91bmRzLCByZWN1cnNlKQoreworCXJlY3Vyc2UgPSAocmVjdXJzZSAhPSBudWxsKSA/IHJlY3Vyc2UgOiB0aGlzLmlzUmVjdXJzaXZlUmVzaXplKCk7CisJCisJdGhpcy5tb2RlbC5iZWdpblVwZGF0ZSgpOworCXRyeQorCXsKKwkJdGhpcy5jZWxsc1Jlc2l6ZWQoY2VsbHMsIGJvdW5kcywgcmVjdXJzZSk7CisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuUkVTSVpFX0NFTExTLAorCQkJCSdjZWxscycsIGNlbGxzLCAnYm91bmRzJywgYm91bmRzKSk7CisJfQorCWZpbmFsbHkKKwl7CisJCXRoaXMubW9kZWwuZW5kVXBkYXRlKCk7CisJfQorCisJcmV0dXJuIGNlbGxzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY2VsbHNSZXNpemVkCisgKiAKKyAqIFNldHMgdGhlIGJvdW5kcyBvZiB0aGUgZ2l2ZW4gY2VsbHMgYW5kIGZpcmVzIGEgPG14RXZlbnQuQ0VMTFNfUkVTSVpFRD4KKyAqIGV2ZW50LiBJZiA8ZXh0ZW5kUGFyZW50cz4gaXMgdHJ1ZSwgdGhlbiB0aGUgcGFyZW50IGlzIGV4dGVuZGVkIGlmIGEKKyAqIGNoaWxkIHNpemUgaXMgY2hhbmdlZCBzbyB0aGF0IGl0IG92ZXJsYXBzIHdpdGggdGhlIHBhcmVudC4KKyAqIAorICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBjb250cm9sIGdyb3VwIHJlc2l6ZXMgdG8gbWFrZSBzdXJlCisgKiB0aGF0IGFsbCBjaGlsZCBjZWxscyBzdGF5IHdpdGhpbiB0aGUgZ3JvdXAuCisgKiAKKyAqIChjb2RlKQorICogZ3JhcGguYWRkTGlzdGVuZXIobXhFdmVudC5DRUxMU19SRVNJWkVELCBmdW5jdGlvbihzZW5kZXIsIGV2dCkKKyAqIHsKKyAqICAgdmFyIGNlbGxzID0gZXZ0LmdldFByb3BlcnR5KCdjZWxscycpOworICogICAKKyAqICAgaWYgKGNlbGxzICE9IG51bGwpCisgKiAgIHsKKyAqICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorICogICAgIHsKKyAqICAgICAgIGlmIChncmFwaC5nZXRNb2RlbCgpLmdldENoaWxkQ291bnQoY2VsbHNbaV0pID4gMCkKKyAqICAgICAgIHsKKyAqICAgICAgICAgdmFyIGdlbyA9IGdyYXBoLmdldENlbGxHZW9tZXRyeShjZWxsc1tpXSk7CisgKiAgICAgICAgIAorICogICAgICAgICBpZiAoZ2VvICE9IG51bGwpCisgKiAgICAgICAgIHsKKyAqICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBncmFwaC5nZXRDaGlsZENlbGxzKGNlbGxzW2ldLCB0cnVlLCB0cnVlKTsKKyAqICAgICAgICAgICB2YXIgYm91bmRzID0gZ3JhcGguZ2V0Qm91bmRpbmdCb3hGcm9tR2VvbWV0cnkoY2hpbGRyZW4sIHRydWUpOworICogICAgICAgICAgIAorICogICAgICAgICAgIGdlbyA9IGdlby5jbG9uZSgpOworICogICAgICAgICAgIGdlby53aWR0aCA9IE1hdGgubWF4KGdlby53aWR0aCwgYm91bmRzLndpZHRoKTsKKyAqICAgICAgICAgICBnZW8uaGVpZ2h0ID0gTWF0aC5tYXgoZ2VvLmhlaWdodCwgYm91bmRzLmhlaWdodCk7CisgKiAgICAgICAgICAgCisgKiAgICAgICAgICAgZ3JhcGguZ2V0TW9kZWwoKS5zZXRHZW9tZXRyeShjZWxsc1tpXSwgZ2VvKTsKKyAqICAgICAgICAgfQorICogICAgICAgfQorICogICAgIH0KKyAqICAgfQorICogfSk7CisgKiAoZW5kKQorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxscyAtIEFycmF5IG9mIDxteENlbGxzPiB3aG9zZSBib3VuZHMgc2hvdWxkIGJlIGNoYW5nZWQuCisgKiBib3VuZHMgLSBBcnJheSBvZiA8bXhSZWN0YW5nbGVzPiB0aGF0IHJlcHJlc2VudCB0aGUgbmV3IGJvdW5kcy4KKyAqIHJlY3Vyc2UgLSBPcHRpb25hbCBib29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIHRoZSBjaGlsZHJlbiBzaG91bGQgYmUgcmVzaXplZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY2VsbHNSZXNpemVkID0gZnVuY3Rpb24oY2VsbHMsIGJvdW5kcywgcmVjdXJzZSkKK3sKKwlyZWN1cnNlID0gKHJlY3Vyc2UgIT0gbnVsbCkgPyByZWN1cnNlIDogZmFsc2U7CisJCisJaWYgKGNlbGxzICE9IG51bGwgJiYgYm91bmRzICE9IG51bGwgJiYgY2VsbHMubGVuZ3RoID09IGJvdW5kcy5sZW5ndGgpCisJeworCQl0aGlzLm1vZGVsLmJlZ2luVXBkYXRlKCk7CisJCXRyeQorCQl7CisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCXRoaXMuY2VsbFJlc2l6ZWQoY2VsbHNbaV0sIGJvdW5kc1tpXSwgZmFsc2UsIHJlY3Vyc2UpOworCisJCQkJaWYgKHRoaXMuaXNFeHRlbmRQYXJlbnQoY2VsbHNbaV0pKQorCQkJCXsKKwkJCQkJdGhpcy5leHRlbmRQYXJlbnQoY2VsbHNbaV0pOworCQkJCX0KKwkJCQkKKwkJCQl0aGlzLmNvbnN0cmFpbkNoaWxkKGNlbGxzW2ldKTsKKwkJCX0KKworCQkJaWYgKHRoaXMucmVzZXRFZGdlc09uUmVzaXplKQorCQkJeworCQkJCXRoaXMucmVzZXRFZGdlcyhjZWxscyk7CisJCQl9CisJCQkKKwkJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuQ0VMTFNfUkVTSVpFRCwKKwkJCQkJJ2NlbGxzJywgY2VsbHMsICdib3VuZHMnLCBib3VuZHMpKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCXRoaXMubW9kZWwuZW5kVXBkYXRlKCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjZWxsUmVzaXplZAorICogCisgKiBSZXNpemVzIHRoZSBwYXJlbnRzIHJlY3Vyc2l2ZWx5IHNvIHRoYXQgdGhleSBjb250YWluIHRoZSBjb21wbGV0ZSBhcmVhCisgKiBvZiB0aGUgcmVzaXplZCBjaGlsZCBjZWxsLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgYm91bmRzIHNob3VsZCBiZSBjaGFuZ2VkLgorICogYm91bmRzIC0gPG14UmVjdGFuZ2xlcz4gdGhhdCByZXByZXNlbnQgdGhlIG5ldyBib3VuZHMuCisgKiBpZ25vcmVSZWxhdGl2ZSAtIEJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgaWYgcmVsYXRpdmUgY2VsbHMgc2hvdWxkIGJlIGlnbm9yZWQuCisgKiByZWN1cnNlIC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgY2hpbGRyZW4gc2hvdWxkIGJlIHJlc2l6ZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNlbGxSZXNpemVkID0gZnVuY3Rpb24oY2VsbCwgYm91bmRzLCBpZ25vcmVSZWxhdGl2ZSwgcmVjdXJzZSkKK3sKKwl2YXIgZ2VvID0gdGhpcy5tb2RlbC5nZXRHZW9tZXRyeShjZWxsKTsKKworCWlmIChnZW8gIT0gbnVsbCAmJiAoZ2VvLnggIT0gYm91bmRzLnggfHwgZ2VvLnkgIT0gYm91bmRzLnkgfHwKKwkJZ2VvLndpZHRoICE9IGJvdW5kcy53aWR0aCB8fCBnZW8uaGVpZ2h0ICE9IGJvdW5kcy5oZWlnaHQpKQorCXsKKwkJZ2VvID0gZ2VvLmNsb25lKCk7CisKKwkJaWYgKCFpZ25vcmVSZWxhdGl2ZSAmJiBnZW8ucmVsYXRpdmUpCisJCXsKKwkJCXZhciBvZmZzZXQgPSBnZW8ub2Zmc2V0OworCisJCQlpZiAob2Zmc2V0ICE9IG51bGwpCisJCQl7CisJCQkJb2Zmc2V0LnggKz0gYm91bmRzLnggLSBnZW8ueDsKKwkJCQlvZmZzZXQueSArPSBib3VuZHMueSAtIGdlby55OworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZ2VvLnggPSBib3VuZHMueDsKKwkJCWdlby55ID0gYm91bmRzLnk7CisJCX0KKworCQlnZW8ud2lkdGggPSBib3VuZHMud2lkdGg7CisJCWdlby5oZWlnaHQgPSBib3VuZHMuaGVpZ2h0OworCisJCWlmICghZ2VvLnJlbGF0aXZlICYmIHRoaXMubW9kZWwuaXNWZXJ0ZXgoY2VsbCkgJiYgIXRoaXMuaXNBbGxvd05lZ2F0aXZlQ29vcmRpbmF0ZXMoKSkKKwkJeworCQkJZ2VvLnggPSBNYXRoLm1heCgwLCBnZW8ueCk7CisJCQlnZW8ueSA9IE1hdGgubWF4KDAsIGdlby55KTsKKwkJfQorCisJCXRoaXMubW9kZWwuYmVnaW5VcGRhdGUoKTsKKwkJdHJ5CisJCXsKKwkJCWlmIChyZWN1cnNlKQorCQkJeworCQkJCXRoaXMucmVzaXplQ2hpbGRDZWxscyhjZWxsLCBnZW8pOworCQkJfQorCQkJCQkJCisJCQl0aGlzLm1vZGVsLnNldEdlb21ldHJ5KGNlbGwsIGdlbyk7CisJCQl0aGlzLmNvbnN0cmFpbkNoaWxkQ2VsbHMoY2VsbCk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCQl0aGlzLm1vZGVsLmVuZFVwZGF0ZSgpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVzaXplQ2hpbGRDZWxscworICogCisgKiBSZXNpemVzIHRoZSBjaGlsZCBjZWxscyBvZiB0aGUgZ2l2ZW4gY2VsbCBmb3IgdGhlIGdpdmVuIG5ldyBnZW9tZXRyeSB3aXRoCisgKiByZXNwZWN0IHRvIHRoZSBjdXJyZW50IGdlb21ldHJ5IG9mIHRoZSBjZWxsLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdGhhdCBoYXMgYmVlbiByZXNpemVkLgorICogbmV3R2VvIC0gPG14R2VvbWV0cnk+IHRoYXQgcmVwcmVzZW50cyB0aGUgbmV3IGJvdW5kcy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUucmVzaXplQ2hpbGRDZWxscyA9IGZ1bmN0aW9uKGNlbGwsIG5ld0dlbykKK3sKKwl2YXIgZ2VvID0gdGhpcy5tb2RlbC5nZXRHZW9tZXRyeShjZWxsKTsKKwl2YXIgZHggPSBuZXdHZW8ud2lkdGggLyBnZW8ud2lkdGg7CisJdmFyIGR5ID0gbmV3R2VvLmhlaWdodCAvIGdlby5oZWlnaHQ7CisJdmFyIGNoaWxkQ291bnQgPSB0aGlzLm1vZGVsLmdldENoaWxkQ291bnQoY2VsbCk7CisJCisJZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspCisJeworCQl0aGlzLnNjYWxlQ2VsbCh0aGlzLm1vZGVsLmdldENoaWxkQXQoY2VsbCwgaSksIGR4LCBkeSwgdHJ1ZSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY29uc3RyYWluQ2hpbGRDZWxscworICogCisgKiBDb25zdHJhaW5zIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gY2VsbCB1c2luZyA8Y29uc3RyYWluQ2hpbGQ+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdGhhdCBoYXMgYmVlbiByZXNpemVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jb25zdHJhaW5DaGlsZENlbGxzID0gZnVuY3Rpb24oY2VsbCkKK3sKKwl2YXIgY2hpbGRDb3VudCA9IHRoaXMubW9kZWwuZ2V0Q2hpbGRDb3VudChjZWxsKTsKKwkKKwlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykKKwl7CisJCXRoaXMuY29uc3RyYWluQ2hpbGQodGhpcy5tb2RlbC5nZXRDaGlsZEF0KGNlbGwsIGkpKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzY2FsZUNlbGwKKyAqIAorICogU2NhbGVzIHRoZSBwb2ludHMsIHBvc2l0aW9uIGFuZCBzaXplIG9mIHRoZSBnaXZlbiBjZWxsIGFjY29yZGluZyB0byB0aGUKKyAqIGdpdmVuIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHNjYWxpbmcgZmFjdG9ycy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdob3NlIGdlb21ldHJ5IHNob3VsZCBiZSBzY2FsZWQuCisgKiBkeCAtIEhvcml6b250YWwgc2NhbGluZyBmYWN0b3IuCisgKiBkeSAtIFZlcnRpY2FsIHNjYWxpbmcgZmFjdG9yLgorICogcmVjdXJzZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY2hpbGQgY2VsbHMgc2hvdWxkIGJlIHNjYWxlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2NhbGVDZWxsID0gZnVuY3Rpb24oY2VsbCwgZHgsIGR5LCByZWN1cnNlKQoreworCXZhciBnZW8gPSB0aGlzLm1vZGVsLmdldEdlb21ldHJ5KGNlbGwpOworCQorCWlmIChnZW8gIT0gbnVsbCkKKwl7CisJCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShjZWxsKTsKKwkJdmFyIHN0eWxlID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuc3R5bGUgOiB0aGlzLmdldENlbGxTdHlsZShjZWxsKTsKKwkJCisJCWdlbyA9IGdlby5jbG9uZSgpOworCQkKKwkJLy8gU3RvcmVzIHZhbHVlcyBmb3IgcmVzdG9yaW5nIGJhc2VkIG9uIHN0eWxlCisJCXZhciB4ID0gZ2VvLng7CisJCXZhciB5ID0gZ2VvLnkKKwkJdmFyIHcgPSBnZW8ud2lkdGg7CisJCXZhciBoID0gZ2VvLmhlaWdodDsKKwkJCisJCWdlby5zY2FsZShkeCwgZHksIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0FTUEVDVF0gPT0gJ2ZpeGVkJyk7CisJCQorCQlpZiAoc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfUkVTSVpFX1dJRFRIXSA9PSAnMScpCisJCXsKKwkJCWdlby53aWR0aCA9IHcgKiBkeDsKKwkJfQorCQllbHNlIGlmIChzdHlsZVtteENvbnN0YW50cy5TVFlMRV9SRVNJWkVfV0lEVEhdID09ICcwJykKKwkJeworCQkJZ2VvLndpZHRoID0gdzsKKwkJfQorCQkKKwkJaWYgKHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1JFU0laRV9IRUlHSFRdID09ICcxJykKKwkJeworCQkJZ2VvLmhlaWdodCA9IGggKiBkeTsKKwkJfQorCQllbHNlIGlmIChzdHlsZVtteENvbnN0YW50cy5TVFlMRV9SRVNJWkVfSEVJR0hUXSA9PSAnMCcpCisJCXsKKwkJCWdlby5oZWlnaHQgPSBoOworCQl9CisJCQorCQlpZiAoIXRoaXMuaXNDZWxsTW92YWJsZShjZWxsKSkKKwkJeworCQkJZ2VvLnggPSB4OworCQkJZ2VvLnkgPSB5OworCQl9CisJCQorCQlpZiAoIXRoaXMuaXNDZWxsUmVzaXphYmxlKGNlbGwpKQorCQl7CisJCQlnZW8ud2lkdGggPSB3OworCQkJZ2VvLmhlaWdodCA9IGg7CisJCX0KKworCQlpZiAodGhpcy5tb2RlbC5pc1ZlcnRleChjZWxsKSkKKwkJeworCQkJdGhpcy5jZWxsUmVzaXplZChjZWxsLCBnZW8sIHRydWUsIHJlY3Vyc2UpOworCQl9CisJCWVsc2UKKwkJeworCQkJdGhpcy5tb2RlbC5zZXRHZW9tZXRyeShjZWxsLCBnZW8pOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZXh0ZW5kUGFyZW50CisgKiAKKyAqIFJlc2l6ZXMgdGhlIHBhcmVudHMgcmVjdXJzaXZlbHkgc28gdGhhdCB0aGV5IGNvbnRhaW4gdGhlIGNvbXBsZXRlIGFyZWEKKyAqIG9mIHRoZSByZXNpemVkIGNoaWxkIGNlbGwuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGF0IGhhcyBiZWVuIHJlc2l6ZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmV4dGVuZFBhcmVudCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJaWYgKGNlbGwgIT0gbnVsbCkKKwl7CisJCXZhciBwYXJlbnQgPSB0aGlzLm1vZGVsLmdldFBhcmVudChjZWxsKTsKKwkJdmFyIHAgPSB0aGlzLmdldENlbGxHZW9tZXRyeShwYXJlbnQpOworCQkKKwkJaWYgKHBhcmVudCAhPSBudWxsICYmIHAgIT0gbnVsbCAmJiAhdGhpcy5pc0NlbGxDb2xsYXBzZWQocGFyZW50KSkKKwkJeworCQkJdmFyIGdlbyA9IHRoaXMuZ2V0Q2VsbEdlb21ldHJ5KGNlbGwpOworCQkJCisJCQlpZiAoZ2VvICE9IG51bGwgJiYgIWdlby5yZWxhdGl2ZSAmJgorCQkJCShwLndpZHRoIDwgZ2VvLnggKyBnZW8ud2lkdGggfHwKKwkJCQlwLmhlaWdodCA8IGdlby55ICsgZ2VvLmhlaWdodCkpCisJCQl7CisJCQkJcCA9IHAuY2xvbmUoKTsKKwkJCQkKKwkJCQlwLndpZHRoID0gTWF0aC5tYXgocC53aWR0aCwgZ2VvLnggKyBnZW8ud2lkdGgpOworCQkJCXAuaGVpZ2h0ID0gTWF0aC5tYXgocC5oZWlnaHQsIGdlby55ICsgZ2VvLmhlaWdodCk7CisJCQkJCisJCQkJdGhpcy5jZWxsc1Jlc2l6ZWQoW3BhcmVudF0sIFtwXSwgZmFsc2UpOworCQkJfQorCQl9CisJfQorfTsKKworLyoqCisgKiBHcm91cDogQ2VsbCBtb3ZpbmcKKyAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBpbXBvcnRDZWxscworICogCisgKiBDbG9uZXMgYW5kIGluc2VydHMgdGhlIGdpdmVuIGNlbGxzIGludG8gdGhlIGdyYXBoIHVzaW5nIHRoZSBtb3ZlCisgKiBtZXRob2QgYW5kIHJldHVybnMgdGhlIGluc2VydGVkIGNlbGxzLiBUaGlzIHNob3J0Y3V0IGlzIHVzZWQgaWYKKyAqIGNlbGxzIGFyZSBpbnNlcnRlZCB2aWEgZGF0YXRyYW5zZmVyLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxscyAtIEFycmF5IG9mIDxteENlbGxzPiB0byBiZSBpbXBvcnRlZC4KKyAqIGR4IC0gSW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSB2ZWN0b3IuIERlZmF1bHQgaXMgMC4KKyAqIGR5IC0gSW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgeS1jb29yZGluYXRlIG9mIHRoZSB2ZWN0b3IuIERlZmF1bHQgaXMgMC4KKyAqIHRhcmdldCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgbmV3IHBhcmVudCBvZiB0aGUgY2VsbHMuCisgKiBldnQgLSBNb3VzZWV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBpbnZvY2F0aW9uLgorICogbWFwcGluZyAtIE9wdGlvbmFsIG1hcHBpbmcgZm9yIGV4aXN0aW5nIGNsb25lcy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaW1wb3J0Q2VsbHMgPSBmdW5jdGlvbihjZWxscywgZHgsIGR5LCB0YXJnZXQsIGV2dCwgbWFwcGluZykKK3sJCisJcmV0dXJuIHRoaXMubW92ZUNlbGxzKGNlbGxzLCBkeCwgZHksIHRydWUsIHRhcmdldCwgZXZ0LCBtYXBwaW5nKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdmVDZWxscworICogCisgKiBNb3ZlcyBvciBjbG9uZXMgdGhlIHNwZWNpZmllZCBjZWxscyBhbmQgbW92ZXMgdGhlIGNlbGxzIG9yIGNsb25lcyBieSB0aGUKKyAqIGdpdmVuIGFtb3VudCwgYWRkaW5nIHRoZW0gdG8gdGhlIG9wdGlvbmFsIHRhcmdldCBjZWxsLiBUaGUgZXZ0IGlzIHRoZQorICogbW91c2UgZXZlbnQgYXMgdGhlIG1vdXNlIHdhcyByZWxlYXNlZC4gVGhlIGNoYW5nZSBpcyBjYXJyaWVkIG91dCB1c2luZworICogPGNlbGxzTW92ZWQ+LiBUaGlzIG1ldGhvZCBmaXJlcyA8bXhFdmVudC5NT1ZFX0NFTExTPiB3aGlsZSB0aGUKKyAqIHRyYW5zYWN0aW9uIGlzIGluIHByb2dyZXNzLiBSZXR1cm5zIHRoZSBjZWxscyB0aGF0IHdlcmUgbW92ZWQuCisgKiAKKyAqIFVzZSB0aGUgZm9sbG93aW5nIGNvZGUgdG8gbW92ZSBhbGwgY2VsbHMgaW4gdGhlIGdyYXBoLgorICogCisgKiAoY29kZSkKKyAqIGdyYXBoLm1vdmVDZWxscyhncmFwaC5nZXRDaGlsZENlbGxzKG51bGwsIHRydWUsIHRydWUpLCAxMCwgMTApOworICogKGVuZCkKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbHMgLSBBcnJheSBvZiA8bXhDZWxscz4gdG8gYmUgbW92ZWQsIGNsb25lZCBvciBhZGRlZCB0byB0aGUgdGFyZ2V0LgorICogZHggLSBJbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHZlY3Rvci4gRGVmYXVsdCBpcyAwLgorICogZHkgLSBJbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHZlY3Rvci4gRGVmYXVsdCBpcyAwLgorICogY2xvbmUgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGNlbGxzIHNob3VsZCBiZSBjbG9uZWQuIERlZmF1bHQgaXMgZmFsc2UuCisgKiB0YXJnZXQgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIG5ldyBwYXJlbnQgb2YgdGhlIGNlbGxzLgorICogZXZ0IC0gTW91c2VldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgaW52b2NhdGlvbi4KKyAqIG1hcHBpbmcgLSBPcHRpb25hbCBtYXBwaW5nIGZvciBleGlzdGluZyBjbG9uZXMuCisgKi8KK214R3JhcGgucHJvdG90eXBlLm1vdmVDZWxscyA9IGZ1bmN0aW9uKGNlbGxzLCBkeCwgZHksIGNsb25lLCB0YXJnZXQsIGV2dCwgbWFwcGluZykKK3sKKwlkeCA9IChkeCAhPSBudWxsKSA/IGR4IDogMDsKKwlkeSA9IChkeSAhPSBudWxsKSA/IGR5IDogMDsKKwljbG9uZSA9IChjbG9uZSAhPSBudWxsKSA/IGNsb25lIDogZmFsc2U7CisJCisJaWYgKGNlbGxzICE9IG51bGwgJiYgKGR4ICE9IDAgfHwgZHkgIT0gMCB8fCBjbG9uZSB8fCB0YXJnZXQgIT0gbnVsbCkpCisJeworCQkvLyBSZW1vdmVzIGRlc2NhbmRhbnRzIHdpdGggYW5jZXN0b3JzIGluIGNlbGxzIHRvIGF2b2lkIG11bHRpcGxlIG1vdmluZworCQljZWxscyA9IHRoaXMubW9kZWwuZ2V0VG9wbW9zdENlbGxzKGNlbGxzKTsKKworCQl0aGlzLm1vZGVsLmJlZ2luVXBkYXRlKCk7CisJCXRyeQorCQl7CisJCQkvLyBGYXN0ZXIgY2VsbCBsb29rdXBzIHRvIHJlbW92ZSByZWxhdGl2ZSBlZGdlIGxhYmVscyB3aXRoIHNlbGVjdGVkCisJCQkvLyB0ZXJtaW5hbHMgdG8gYXZvaWQgZXhwbGljaXQgYW5kIGltcGxpY2l0IG1vdmUgYXQgc2FtZSB0aW1lCisJCQl2YXIgZGljdCA9IG5ldyBteERpY3Rpb25hcnkoKTsKKwkJCQorCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQlkaWN0LnB1dChjZWxsc1tpXSwgdHJ1ZSk7CisJCQl9CisJCQkKKwkJCXZhciBpc1NlbGVjdGVkID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGNlbGwpCisJCQl7CisJCQkJd2hpbGUgKGNlbGwgIT0gbnVsbCkKKwkJCQl7CisJCQkJCWlmIChkaWN0LmdldChjZWxsKSkKKwkJCQkJeworCQkJCQkJcmV0dXJuIHRydWU7CisJCQkJCX0KKwkJCQkJCisJCQkJCWNlbGwgPSB0aGlzLm1vZGVsLmdldFBhcmVudChjZWxsKTsKKwkJCQl9CisJCQkJCisJCQkJcmV0dXJuIGZhbHNlOworCQkJfSk7CisJCQkKKwkJCS8vIFJlbW92ZXMgcmVsYXRpdmUgZWRnZSBsYWJlbHMgd2l0aCBzZWxlY3RlZCB0ZXJtaW5hbHMKKwkJCXZhciBjaGVja2VkID0gW107CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJdmFyIGdlbyA9IHRoaXMuZ2V0Q2VsbEdlb21ldHJ5KGNlbGxzW2ldKTsKKwkJCQl2YXIgcGFyZW50ID0gdGhpcy5tb2RlbC5nZXRQYXJlbnQoY2VsbHNbaV0pOworCQkKKwkJCQlpZiAoKGdlbyA9PSBudWxsIHx8ICFnZW8ucmVsYXRpdmUpIHx8ICF0aGlzLm1vZGVsLmlzRWRnZShwYXJlbnQpIHx8CisJCQkJCSghaXNTZWxlY3RlZCh0aGlzLm1vZGVsLmdldFRlcm1pbmFsKHBhcmVudCwgdHJ1ZSkpICYmCisJCQkJCSFpc1NlbGVjdGVkKHRoaXMubW9kZWwuZ2V0VGVybWluYWwocGFyZW50LCBmYWxzZSkpKSkKKwkJCQl7CisJCQkJCWNoZWNrZWQucHVzaChjZWxsc1tpXSk7CisJCQkJfQorCQkJfQorCisJCQljZWxscyA9IGNoZWNrZWQ7CisJCQkKKwkJCWlmIChjbG9uZSkKKwkJCXsKKwkJCQljZWxscyA9IHRoaXMuY2xvbmVDZWxscyhjZWxscywgdGhpcy5pc0Nsb25lSW52YWxpZEVkZ2VzKCksIG1hcHBpbmcpOworCisJCQkJaWYgKHRhcmdldCA9PSBudWxsKQorCQkJCXsKKwkJCQkJdGFyZ2V0ID0gdGhpcy5nZXREZWZhdWx0UGFyZW50KCk7CisJCQkJfQorCQkJfQorCisJCQkvLyBGSVhNRTogQ2VsbHMgc2hvdWxkIGFsd2F5cyBiZSBpbnNlcnRlZCBmaXJzdCBiZWZvcmUgYW55IG90aGVyIGVkaXQKKwkJCS8vIHRvIGF2b2lkIGZvcndhcmQgcmVmZXJlbmNlcyBpbiBzZXNzaW9ucy4KKwkJCS8vIE5lZWQgdG8gZGlzYWJsZSBhbGxvd05lZ2F0aXZlQ29vcmRpbmF0ZXMgaWYgdGFyZ2V0IG5vdCBudWxsIHRvCisJCQkvLyBhbGxvdyBmb3IgdGVtcG9yYXJ5IG5lZ2F0aXZlIG51bWJlcnMgdW50aWwgY2VsbHNBZGRlZCBpcyBjYWxsZWQuCisJCQl2YXIgcHJldmlvdXMgPSB0aGlzLmlzQWxsb3dOZWdhdGl2ZUNvb3JkaW5hdGVzKCk7CisJCQkKKwkJCWlmICh0YXJnZXQgIT0gbnVsbCkKKwkJCXsKKwkJCQl0aGlzLnNldEFsbG93TmVnYXRpdmVDb29yZGluYXRlcyh0cnVlKTsKKwkJCX0KKwkJCQorCQkJdGhpcy5jZWxsc01vdmVkKGNlbGxzLCBkeCwgZHksICFjbG9uZSAmJiB0aGlzLmlzRGlzY29ubmVjdE9uTW92ZSgpCisJCQkJCSYmIHRoaXMuaXNBbGxvd0RhbmdsaW5nRWRnZXMoKSwgdGFyZ2V0ID09IG51bGwsCisJCQkJCXRoaXMuaXNFeHRlbmRQYXJlbnRzT25Nb3ZlKCkgJiYgdGFyZ2V0ID09IG51bGwpOworCQkJCisJCQl0aGlzLnNldEFsbG93TmVnYXRpdmVDb29yZGluYXRlcyhwcmV2aW91cyk7CisKKwkJCWlmICh0YXJnZXQgIT0gbnVsbCkKKwkJCXsKKwkJCQl2YXIgaW5kZXggPSB0aGlzLm1vZGVsLmdldENoaWxkQ291bnQodGFyZ2V0KTsKKwkJCQl0aGlzLmNlbGxzQWRkZWQoY2VsbHMsIHRhcmdldCwgaW5kZXgsIG51bGwsIG51bGwsIHRydWUpOworCQkJfQorCisJCQkvLyBEaXNwYXRjaGVzIGEgbW92ZSBldmVudAorCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5NT1ZFX0NFTExTLCAnY2VsbHMnLCBjZWxscywKKwkJCQknZHgnLCBkeCwgJ2R5JywgZHksICdjbG9uZScsIGNsb25lLCAndGFyZ2V0JywgdGFyZ2V0LCAnZXZlbnQnLCBldnQpKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCXRoaXMubW9kZWwuZW5kVXBkYXRlKCk7CisJCX0KKwl9CisKKwlyZXR1cm4gY2VsbHM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjZWxsc01vdmVkCisgKiAKKyAqIE1vdmVzIHRoZSBzcGVjaWZpZWQgY2VsbHMgYnkgdGhlIGdpdmVuIHZlY3RvciwgZGlzY29ubmVjdGluZyB0aGUgY2VsbHMKKyAqIHVzaW5nIGRpc2Nvbm5lY3RHcmFwaCBpcyBkaXNjb25uZWN0IGlzIHRydWUuIFRoaXMgbWV0aG9kIGZpcmVzCisgKiA8bXhFdmVudC5DRUxMU19NT1ZFRD4gd2hpbGUgdGhlIHRyYW5zYWN0aW9uIGlzIGluIHByb2dyZXNzLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jZWxsc01vdmVkID0gZnVuY3Rpb24oY2VsbHMsIGR4LCBkeSwgZGlzY29ubmVjdCwgY29uc3RyYWluLCBleHRlbmQpCit7CisJaWYgKGNlbGxzICE9IG51bGwgJiYgKGR4ICE9IDAgfHwgZHkgIT0gMCkpCisJeworCQlleHRlbmQgPSAoZXh0ZW5kICE9IG51bGwpID8gZXh0ZW5kIDogZmFsc2U7CisKKwkJdGhpcy5tb2RlbC5iZWdpblVwZGF0ZSgpOworCQl0cnkKKwkJeworCQkJaWYgKGRpc2Nvbm5lY3QpCisJCQl7CisJCQkJdGhpcy5kaXNjb25uZWN0R3JhcGgoY2VsbHMpOworCQkJfQorCisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCXRoaXMudHJhbnNsYXRlQ2VsbChjZWxsc1tpXSwgZHgsIGR5KTsKKwkJCQkKKwkJCQlpZiAoZXh0ZW5kICYmIHRoaXMuaXNFeHRlbmRQYXJlbnQoY2VsbHNbaV0pKQorCQkJCXsKKwkJCQkJdGhpcy5leHRlbmRQYXJlbnQoY2VsbHNbaV0pOworCQkJCX0KKwkJCQllbHNlIGlmIChjb25zdHJhaW4pCisJCQkJeworCQkJCQl0aGlzLmNvbnN0cmFpbkNoaWxkKGNlbGxzW2ldKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICh0aGlzLnJlc2V0RWRnZXNPbk1vdmUpCisJCQl7CisJCQkJdGhpcy5yZXNldEVkZ2VzKGNlbGxzKTsKKwkJCX0KKwkJCQorCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5DRUxMU19NT1ZFRCwKKwkJCQknY2VsbHMnLCBjZWxscywgJ2R4JywgZHgsICdkeScsIGR5LCAnZGlzY29ubmVjdCcsIGRpc2Nvbm5lY3QpKTsKKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCXRoaXMubW9kZWwuZW5kVXBkYXRlKCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB0cmFuc2xhdGVDZWxsCisgKiAKKyAqIFRyYW5zbGF0ZXMgdGhlIGdlb21ldHJ5IG9mIHRoZSBnaXZlbiBjZWxsIGFuZCBzdG9yZXMgdGhlIG5ldywKKyAqIHRyYW5zbGF0ZWQgZ2VvbWV0cnkgaW4gdGhlIG1vZGVsIGFzIGFuIGF0b21pYyBjaGFuZ2UuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnRyYW5zbGF0ZUNlbGwgPSBmdW5jdGlvbihjZWxsLCBkeCwgZHkpCit7CisJdmFyIGdlbyA9IHRoaXMubW9kZWwuZ2V0R2VvbWV0cnkoY2VsbCk7CisKKwlpZiAoZ2VvICE9IG51bGwpCisJeworCQlkeCA9IHBhcnNlRmxvYXQoZHgpOworCQlkeSA9IHBhcnNlRmxvYXQoZHkpOworCQlnZW8gPSBnZW8uY2xvbmUoKTsKKwkJZ2VvLnRyYW5zbGF0ZShkeCwgZHkpOworCisJCWlmICghZ2VvLnJlbGF0aXZlICYmIHRoaXMubW9kZWwuaXNWZXJ0ZXgoY2VsbCkgJiYgIXRoaXMuaXNBbGxvd05lZ2F0aXZlQ29vcmRpbmF0ZXMoKSkKKwkJeworCQkJZ2VvLnggPSBNYXRoLm1heCgwLCBwYXJzZUZsb2F0KGdlby54KSk7CisJCQlnZW8ueSA9IE1hdGgubWF4KDAsIHBhcnNlRmxvYXQoZ2VvLnkpKTsKKwkJfQorCQkKKwkJaWYgKGdlby5yZWxhdGl2ZSAmJiAhdGhpcy5tb2RlbC5pc0VkZ2UoY2VsbCkpCisJCXsKKwkJCXZhciBwYXJlbnQgPSB0aGlzLm1vZGVsLmdldFBhcmVudChjZWxsKTsKKwkJCXZhciBhbmdsZSA9IDA7CisJCQkKKwkJCWlmICh0aGlzLm1vZGVsLmlzVmVydGV4KHBhcmVudCkpCisJCQl7CisJCQkJdmFyIHN0YXRlID0gdGhpcy52aWV3LmdldFN0YXRlKHBhcmVudCk7CisJCQkJdmFyIHN0eWxlID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuc3R5bGUgOiB0aGlzLmdldENlbGxTdHlsZShwYXJlbnQpOworCQkJCQorCQkJCWFuZ2xlID0gbXhVdGlscy5nZXRWYWx1ZShzdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfUk9UQVRJT04sIDApOworCQkJfQorCQkJCisJCQlpZiAoYW5nbGUgIT0gMCkKKwkJCXsKKwkJCQl2YXIgcmFkID0gbXhVdGlscy50b1JhZGlhbnMoLWFuZ2xlKTsKKwkJCQl2YXIgY29zID0gTWF0aC5jb3MocmFkKTsKKwkJCQl2YXIgc2luID0gTWF0aC5zaW4ocmFkKTsKKwkJCQl2YXIgcHQgPSBteFV0aWxzLmdldFJvdGF0ZWRQb2ludChuZXcgbXhQb2ludChkeCwgZHkpLCBjb3MsIHNpbiwgbmV3IG14UG9pbnQoMCwgMCkpOworCQkJCWR4ID0gcHQueDsKKwkJCQlkeSA9IHB0Lnk7CisJCQl9CisJCQkKKwkJCWlmIChnZW8ub2Zmc2V0ID09IG51bGwpCisJCQl7CisJCQkJZ2VvLm9mZnNldCA9IG5ldyBteFBvaW50KGR4LCBkeSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZ2VvLm9mZnNldC54ID0gcGFyc2VGbG9hdChnZW8ub2Zmc2V0LngpICsgZHg7CisJCQkJZ2VvLm9mZnNldC55ID0gcGFyc2VGbG9hdChnZW8ub2Zmc2V0LnkpICsgZHk7CisJCQl9CisJCX0KKworCQl0aGlzLm1vZGVsLnNldEdlb21ldHJ5KGNlbGwsIGdlbyk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q2VsbENvbnRhaW5tZW50QXJlYQorICogCisgKiBSZXR1cm5zIHRoZSA8bXhSZWN0YW5nbGU+IGluc2lkZSB3aGljaCBhIGNlbGwgaXMgdG8gYmUga2VwdC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IGZvciB3aGljaCB0aGUgYXJlYSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldENlbGxDb250YWlubWVudEFyZWEgPSBmdW5jdGlvbihjZWxsKQoreworCWlmIChjZWxsICE9IG51bGwgJiYgIXRoaXMubW9kZWwuaXNFZGdlKGNlbGwpKQorCXsKKwkJdmFyIHBhcmVudCA9IHRoaXMubW9kZWwuZ2V0UGFyZW50KGNlbGwpOworCQkKKwkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudCAhPSB0aGlzLmdldERlZmF1bHRQYXJlbnQoKSkKKwkJeworCQkJdmFyIGcgPSB0aGlzLm1vZGVsLmdldEdlb21ldHJ5KHBhcmVudCk7CisJCQkKKwkJCWlmIChnICE9IG51bGwpCisJCQl7CisJCQkJdmFyIHggPSAwOworCQkJCXZhciB5ID0gMDsKKwkJCQl2YXIgdyA9IGcud2lkdGg7CisJCQkJdmFyIGggPSBnLmhlaWdodDsKKwkJCQkKKwkJCQlpZiAodGhpcy5pc1N3aW1sYW5lKHBhcmVudCkpCisJCQkJeworCQkJCQl2YXIgc2l6ZSA9IHRoaXMuZ2V0U3RhcnRTaXplKHBhcmVudCk7CisJCQkJCQorCQkJCQl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUocGFyZW50KTsKKwkJCQkJdmFyIHN0eWxlID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuc3R5bGUgOiB0aGlzLmdldENlbGxTdHlsZShwYXJlbnQpOworCQkJCQl2YXIgZGlyID0gbXhVdGlscy5nZXRWYWx1ZShzdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfRElSRUNUSU9OLCBteENvbnN0YW50cy5ESVJFQ1RJT05fRUFTVCk7CisJCQkJCXZhciBmbGlwSCA9IG14VXRpbHMuZ2V0VmFsdWUoc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0ZMSVBILCAwKSA9PSAxOworCQkJCQl2YXIgZmxpcFYgPSBteFV0aWxzLmdldFZhbHVlKHN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9GTElQViwgMCkgPT0gMTsKKwkJCQkJCisJCQkJCWlmIChkaXIgPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX1NPVVRIIHx8IGRpciA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEgpCisJCQkJCXsKKwkJCQkJCXZhciB0bXAgPSBzaXplLndpZHRoOworCQkJCQkJc2l6ZS53aWR0aCA9IHNpemUuaGVpZ2h0OworCQkJCQkJc2l6ZS5oZWlnaHQgPSB0bXA7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmICgoZGlyID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9FQVNUICYmICFmbGlwVikgfHwgKGRpciA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEggJiYgIWZsaXBIKSB8fAorCQkJCQkJKGRpciA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fV0VTVCAmJiBmbGlwVikgfHwgKGRpciA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fU09VVEggJiYgZmxpcEgpKQorCQkJCQl7CisJCQkJCQl4ID0gc2l6ZS53aWR0aDsKKwkJCQkJCXkgPSBzaXplLmhlaWdodDsKKwkJCQkJfQorCisJCQkJCXcgLT0gc2l6ZS53aWR0aDsKKwkJCQkJaCAtPSBzaXplLmhlaWdodDsKKwkJCQl9CisJCQkJCisJCQkJcmV0dXJuIG5ldyBteFJlY3RhbmdsZSh4LCB5LCB3LCBoKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldE1heGltdW1HcmFwaEJvdW5kcworICogCisgKiBSZXR1cm5zIHRoZSBib3VuZHMgaW5zaWRlIHdoaWNoIHRoZSBkaWFncmFtIHNob3VsZCBiZSBrZXB0IGFzIGFuCisgKiA8bXhSZWN0YW5nbGU+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRNYXhpbXVtR3JhcGhCb3VuZHMgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMubWF4aW11bUdyYXBoQm91bmRzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY29uc3RyYWluQ2hpbGQKKyAqIAorICogS2VlcHMgdGhlIGdpdmVuIGNlbGwgaW5zaWRlIHRoZSBib3VuZHMgcmV0dXJuZWQgYnkKKyAqIDxnZXRDZWxsQ29udGFpbm1lbnRBcmVhPiBmb3IgaXRzIHBhcmVudCwgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBkZWZpbmVkIGJ5CisgKiA8Z2V0T3ZlcmxhcD4gYW5kIDxpc0NvbnN0cmFpbkNoaWxkPi4gVGhpcyBtb2RpZmllcyB0aGUgY2VsbCdzIGdlb21ldHJ5CisgKiBpbi1wbGFjZSBhbmQgZG9lcyBub3QgY2xvbmUgaXQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGxzIC0gPG14Q2VsbD4gd2hpY2ggc2hvdWxkIGJlIGNvbnN0cmFpbmVkLgorICogc2l6ZUZpcnN0IC0gU3BlY2lmaWVzIGlmIHRoZSBzaXplIHNob3VsZCBiZSBjaGFuZ2VkIGZpcnN0LiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNvbnN0cmFpbkNoaWxkID0gZnVuY3Rpb24oY2VsbCwgc2l6ZUZpcnN0KQoreworCXNpemVGaXJzdCA9IChzaXplRmlyc3QgIT0gbnVsbCkgPyBzaXplRmlyc3QgOiB0cnVlOworCQorCWlmIChjZWxsICE9IG51bGwpCisJeworCQl2YXIgZ2VvID0gdGhpcy5nZXRDZWxsR2VvbWV0cnkoY2VsbCk7CisJCQorCQlpZiAoZ2VvICE9IG51bGwgJiYgKHRoaXMuaXNDb25zdHJhaW5SZWxhdGl2ZUNoaWxkcmVuKCkgfHwgIWdlby5yZWxhdGl2ZSkpCisJCXsKKwkJCXZhciBwYXJlbnQgPSB0aGlzLm1vZGVsLmdldFBhcmVudChjZWxsKTsKKwkJCXZhciBwZ2VvID0gdGhpcy5nZXRDZWxsR2VvbWV0cnkocGFyZW50KTsKKwkJCXZhciBtYXggPSB0aGlzLmdldE1heGltdW1HcmFwaEJvdW5kcygpOworCQkJCisJCQkvLyBGaW5kcyBwYXJlbnQgb2Zmc2V0CisJCQlpZiAobWF4ICE9IG51bGwpCisJCQl7CisJCQkJdmFyIG9mZiA9IHRoaXMuZ2V0Qm91bmRpbmdCb3hGcm9tR2VvbWV0cnkoW3BhcmVudF0sIGZhbHNlKTsKKwkJCQkKKwkJCQlpZiAob2ZmICE9IG51bGwpCisJCQkJeworCQkJCQltYXggPSBteFJlY3RhbmdsZS5mcm9tUmVjdGFuZ2xlKG1heCk7CisJCQkJCQorCQkJCQltYXgueCAtPSBvZmYueDsKKwkJCQkJbWF4LnkgLT0gb2ZmLnk7CisJCQkJfQorCQkJfQorCQkJCisJCQlpZiAodGhpcy5pc0NvbnN0cmFpbkNoaWxkKGNlbGwpKQorCQkJeworCQkJCXZhciB0bXAgPSB0aGlzLmdldENlbGxDb250YWlubWVudEFyZWEoY2VsbCk7CisJCQkJCisJCQkJaWYgKHRtcCAhPSBudWxsKQorCQkJCXsKKwkJCQkJdmFyIG92ZXJsYXAgPSB0aGlzLmdldE92ZXJsYXAoY2VsbCk7CisJCisJCQkJCWlmIChvdmVybGFwID4gMCkKKwkJCQkJeworCQkJCQkJdG1wID0gbXhSZWN0YW5nbGUuZnJvbVJlY3RhbmdsZSh0bXApOworCQkJCQkJCisJCQkJCQl0bXAueCAtPSB0bXAud2lkdGggKiBvdmVybGFwOworCQkJCQkJdG1wLnkgLT0gdG1wLmhlaWdodCAqIG92ZXJsYXA7CisJCQkJCQl0bXAud2lkdGggKz0gMiAqIHRtcC53aWR0aCAqIG92ZXJsYXA7CisJCQkJCQl0bXAuaGVpZ2h0ICs9IDIgKiB0bXAuaGVpZ2h0ICogb3ZlcmxhcDsKKwkJCQkJfQorCQkJCQkKKwkJCQkJLy8gRmluZCB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gbWF4IGFuZCB0bXAKKwkJCQkJaWYgKG1heCA9PSBudWxsKQorCQkJCQl7CisJCQkJCQltYXggPSB0bXA7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQltYXggPSBteFJlY3RhbmdsZS5mcm9tUmVjdGFuZ2xlKG1heCk7CisJCQkJCQltYXguaW50ZXJzZWN0KHRtcCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkKKwkJCWlmIChtYXggIT0gbnVsbCkKKwkJCXsKKwkJCQl2YXIgY2VsbHMgPSBbY2VsbF07CisJCQkJCisJCQkJaWYgKCF0aGlzLmlzQ2VsbENvbGxhcHNlZChjZWxsKSkKKwkJCQl7CisJCQkJCXZhciBkZXNjID0gdGhpcy5tb2RlbC5nZXREZXNjZW5kYW50cyhjZWxsKTsKKwkJCQkJCisJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZGVzYy5sZW5ndGg7IGkrKykKKwkJCQkJeworCQkJCQkJaWYgKHRoaXMuaXNDZWxsVmlzaWJsZShkZXNjW2ldKSkKKwkJCQkJCXsKKwkJCQkJCQljZWxscy5wdXNoKGRlc2NbaV0pOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCXZhciBiYm94ID0gdGhpcy5nZXRCb3VuZGluZ0JveEZyb21HZW9tZXRyeShjZWxscywgZmFsc2UpOworCQkJCQorCQkJCWlmIChiYm94ICE9IG51bGwpCisJCQkJeworCQkJCQlnZW8gPSBnZW8uY2xvbmUoKTsKKwkJCQkJCisJCQkJCS8vIEN1bXVsYXRpdmUgaG9yaXpvbnRhbCBtb3ZlbWVudAorCQkJCQl2YXIgZHggPSAwOworCQkJCQkKKwkJCQkJaWYgKGdlby53aWR0aCA+IG1heC53aWR0aCkKKwkJCQkJeworCQkJCQkJZHggPSBnZW8ud2lkdGggLSBtYXgud2lkdGg7CisJCQkJCQlnZW8ud2lkdGggLT0gZHg7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmIChiYm94LnggKyBiYm94LndpZHRoID4gbWF4LnggKyBtYXgud2lkdGgpCisJCQkJCXsKKwkJCQkJCWR4IC09IGJib3gueCArIGJib3gud2lkdGggLSBtYXgueCAtIG1heC53aWR0aCAtIGR4OworCQkJCQl9CisJCQkJCQorCQkJCQkvLyBDdW11bGF0aXZlIHZlcnRpY2FsIG1vdmVtZW50CisJCQkJCXZhciBkeSA9IDA7CisJCQkJCQorCQkJCQlpZiAoZ2VvLmhlaWdodCA+IG1heC5oZWlnaHQpCisJCQkJCXsKKwkJCQkJCWR5ID0gZ2VvLmhlaWdodCAtIG1heC5oZWlnaHQ7CisJCQkJCQlnZW8uaGVpZ2h0IC09IGR5OworCQkJCQl9CisJCQkJCQorCQkJCQlpZiAoYmJveC55ICsgYmJveC5oZWlnaHQgPiBtYXgueSArIG1heC5oZWlnaHQpCisJCQkJCXsKKwkJCQkJCWR5IC09IGJib3gueSArIGJib3guaGVpZ2h0IC0gbWF4LnkgLSBtYXguaGVpZ2h0IC0gZHk7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmIChiYm94LnggPCBtYXgueCkKKwkJCQkJeworCQkJCQkJZHggLT0gYmJveC54IC0gbWF4Lng7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmIChiYm94LnkgPCBtYXgueSkKKwkJCQkJeworCQkJCQkJZHkgLT0gYmJveC55IC0gbWF4Lnk7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmIChkeCAhPSAwIHx8IGR5ICE9IDApCisJCQkJCXsKKwkJCQkJCWlmIChnZW8ucmVsYXRpdmUpCisJCQkJCQl7CisJCQkJCQkJLy8gUmVsYXRpdmUgZ2VvbWV0cmllcyBhcmUgbW92ZWQgdmlhIGFic29sdXRlIG9mZnNldAorCQkJCQkJCWlmIChnZW8ub2Zmc2V0ID09IG51bGwpCisJCQkJCQkJeworCQkJCQkJCQlnZW8ub2Zmc2V0ID0gbmV3IG14UG9pbnQoKTsKKwkJCQkJCQl9CisJCQkJCQkKKwkJCQkJCQlnZW8ub2Zmc2V0LnggKz0gZHg7CisJCQkJCQkJZ2VvLm9mZnNldC55ICs9IGR5OworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWdlby54ICs9IGR4OworCQkJCQkJCWdlby55ICs9IGR5OworCQkJCQkJfQorCQkJCQl9CisJCQkJCQorCQkJCQl0aGlzLm1vZGVsLnNldEdlb21ldHJ5KGNlbGwsIGdlbyk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVzZXRFZGdlcworICogCisgKiBSZXNldHMgdGhlIGNvbnRyb2wgcG9pbnRzIG9mIHRoZSBlZGdlcyB0aGF0IGFyZSBjb25uZWN0ZWQgdG8gdGhlIGdpdmVuCisgKiBjZWxscyBpZiBub3QgYm90aCBlbmRzIG9mIHRoZSBlZGdlIGFyZSBpbiB0aGUgZ2l2ZW4gY2VsbHMgYXJyYXkuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGxzIC0gQXJyYXkgb2YgPG14Q2VsbHM+IGZvciB3aGljaCB0aGUgY29ubmVjdGVkIGVkZ2VzIHNob3VsZCBiZQorICogcmVzZXQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnJlc2V0RWRnZXMgPSBmdW5jdGlvbihjZWxscykKK3sKKwlpZiAoY2VsbHMgIT0gbnVsbCkKKwl7CisJCS8vIFByZXBhcmVzIGZhc3RlciBjZWxscyBsb29rdXAKKwkJdmFyIGRpY3QgPSBuZXcgbXhEaWN0aW9uYXJ5KCk7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorCQl7CisJCQlkaWN0LnB1dChjZWxsc1tpXSwgdHJ1ZSk7CisJCX0KKwkJCisJCXRoaXMubW9kZWwuYmVnaW5VcGRhdGUoKTsKKwkJdHJ5CisJCXsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJdmFyIGVkZ2VzID0gdGhpcy5tb2RlbC5nZXRFZGdlcyhjZWxsc1tpXSk7CisJCQkJCisJCQkJaWYgKGVkZ2VzICE9IG51bGwpCisJCQkJeworCQkJCQlmb3IgKHZhciBqID0gMDsgaiA8IGVkZ2VzLmxlbmd0aDsgaisrKQorCQkJCQl7CisJCQkJCQl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoZWRnZXNbal0pOworCQkJCQkJCisJCQkJCQl2YXIgc291cmNlID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsKHRydWUpIDogdGhpcy52aWV3LmdldFZpc2libGVUZXJtaW5hbChlZGdlc1tqXSwgdHJ1ZSk7CisJCQkJCQl2YXIgdGFyZ2V0ID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsKGZhbHNlKSA6IHRoaXMudmlldy5nZXRWaXNpYmxlVGVybWluYWwoZWRnZXNbal0sIGZhbHNlKTsKKwkJCQkJCQorCQkJCQkJLy8gQ2hlY2tzIGlmIG9uZSBvZiB0aGUgdGVybWluYWxzIGlzIG5vdCBpbiB0aGUgZ2l2ZW4gYXJyYXkKKwkJCQkJCWlmICghZGljdC5nZXQoc291cmNlKSB8fCAhZGljdC5nZXQodGFyZ2V0KSkKKwkJCQkJCXsKKwkJCQkJCQl0aGlzLnJlc2V0RWRnZShlZGdlc1tqXSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJdGhpcy5yZXNldEVkZ2VzKHRoaXMubW9kZWwuZ2V0Q2hpbGRyZW4oY2VsbHNbaV0pKTsKKwkJCX0KKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCXRoaXMubW9kZWwuZW5kVXBkYXRlKCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZXNldEVkZ2UKKyAqIAorICogUmVzZXRzIHRoZSBjb250cm9sIHBvaW50cyBvZiB0aGUgZ2l2ZW4gZWRnZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZWRnZSAtIDxteENlbGw+IHdob3NlIHBvaW50cyBzaG91bGQgYmUgcmVzZXQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnJlc2V0RWRnZSA9IGZ1bmN0aW9uKGVkZ2UpCit7CisJdmFyIGdlbyA9IHRoaXMubW9kZWwuZ2V0R2VvbWV0cnkoZWRnZSk7CisJCisJLy8gUmVzZXRzIHRoZSBjb250cm9sIHBvaW50cworCWlmIChnZW8gIT0gbnVsbCAmJiBnZW8ucG9pbnRzICE9IG51bGwgJiYgZ2VvLnBvaW50cy5sZW5ndGggPiAwKQorCXsKKwkJZ2VvID0gZ2VvLmNsb25lKCk7CisJCWdlby5wb2ludHMgPSBbXTsKKwkJdGhpcy5tb2RlbC5zZXRHZW9tZXRyeShlZGdlLCBnZW8pOworCX0KKwkKKwlyZXR1cm4gZWRnZTsKK307CisKKy8qKgorICogR3JvdXA6IENlbGwgY29ubmVjdGluZyBhbmQgY29ubmVjdGlvbiBjb25zdHJhaW50cworICovCisKKy8qKgorICogRnVuY3Rpb246IGdldE91dGxpbmVDb25zdHJhaW50CisgKiAKKyAqIFJldHVybnMgdGhlIGNvbnN0cmFpbnQgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBvdXRsaW5lIG9mIHRoZSBnaXZlbiBzdGF0ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0T3V0bGluZUNvbnN0cmFpbnQgPSBmdW5jdGlvbihwb2ludCwgdGVybWluYWxTdGF0ZSwgbWUpCit7CisJaWYgKHRlcm1pbmFsU3RhdGUuc2hhcGUgIT0gbnVsbCkKKwl7CisJCXZhciBib3VuZHMgPSB0aGlzLnZpZXcuZ2V0UGVyaW1ldGVyQm91bmRzKHRlcm1pbmFsU3RhdGUpOworCQl2YXIgZGlyZWN0aW9uID0gdGVybWluYWxTdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9ESVJFQ1RJT05dOworCQkKKwkJaWYgKGRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEggfHwgZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9TT1VUSCkKKwkJeworCQkJYm91bmRzLnggKz0gYm91bmRzLndpZHRoIC8gMiAtIGJvdW5kcy5oZWlnaHQgLyAyOworCQkJYm91bmRzLnkgKz0gYm91bmRzLmhlaWdodCAvIDIgLSBib3VuZHMud2lkdGggLyAyOworCQkJdmFyIHRtcCA9IGJvdW5kcy53aWR0aDsKKwkJCWJvdW5kcy53aWR0aCA9IGJvdW5kcy5oZWlnaHQ7CisJCQlib3VuZHMuaGVpZ2h0ID0gdG1wOworCQl9CisJCisJCXZhciBhbHBoYSA9IG14VXRpbHMudG9SYWRpYW5zKHRlcm1pbmFsU3RhdGUuc2hhcGUuZ2V0U2hhcGVSb3RhdGlvbigpKTsKKwkJCisJCWlmIChhbHBoYSAhPSAwKQorCQl7CisJCQl2YXIgY29zID0gTWF0aC5jb3MoLWFscGhhKTsKKwkJCXZhciBzaW4gPSBNYXRoLnNpbigtYWxwaGEpOworCQorCQkJdmFyIGN0ID0gbmV3IG14UG9pbnQoYm91bmRzLmdldENlbnRlclgoKSwgYm91bmRzLmdldENlbnRlclkoKSk7CisJCQlwb2ludCA9IG14VXRpbHMuZ2V0Um90YXRlZFBvaW50KHBvaW50LCBjb3MsIHNpbiwgY3QpOworCQl9CisKKwkJdmFyIHN4ID0gMTsKKwkJdmFyIHN5ID0gMTsKKwkJdmFyIGR4ID0gMDsKKwkJdmFyIGR5ID0gMDsKKwkJCisJCS8vIExBVEVSOiBBZGQgZmxpcHBpbmcgc3VwcG9ydCBmb3IgaW1hZ2Ugc2hhcGVzCisJCWlmICh0aGlzLmdldE1vZGVsKCkuaXNWZXJ0ZXgodGVybWluYWxTdGF0ZS5jZWxsKSkKKwkJeworCQkJdmFyIGZsaXBIID0gdGVybWluYWxTdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9GTElQSF07CisJCQl2YXIgZmxpcFYgPSB0ZXJtaW5hbFN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0ZMSVBWXTsKKwkJCQorCQkJLy8gTGVnYWN5IHN1cHBvcnQgZm9yIHN0ZW5jaWxGbGlwSC9WCisJCQlpZiAodGVybWluYWxTdGF0ZS5zaGFwZSAhPSBudWxsICYmIHRlcm1pbmFsU3RhdGUuc2hhcGUuc3RlbmNpbCAhPSBudWxsKQorCQkJeworCQkJCWZsaXBIID0gbXhVdGlscy5nZXRWYWx1ZSh0ZXJtaW5hbFN0YXRlLnN0eWxlLCAnc3RlbmNpbEZsaXBIJywgMCkgPT0gMSB8fCBmbGlwSDsKKwkJCQlmbGlwViA9IG14VXRpbHMuZ2V0VmFsdWUodGVybWluYWxTdGF0ZS5zdHlsZSwgJ3N0ZW5jaWxGbGlwVicsIDApID09IDEgfHwgZmxpcFY7CisJCQl9CisJCQkKKwkJCWlmIChkaXJlY3Rpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX05PUlRIIHx8IGRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fU09VVEgpCisJCQl7CisJCQkJdmFyIHRtcCA9IGZsaXBIOworCQkJCWZsaXBIID0gZmxpcFY7CisJCQkJZmxpcFYgPSB0bXA7CisJCQl9CisJCQkKKwkJCWlmIChmbGlwSCkKKwkJCXsKKwkJCQlzeCA9IC0xOworCQkJCWR4ID0gLWJvdW5kcy53aWR0aDsKKwkJCX0KKwkJCQorCQkJaWYgKGZsaXBWKQorCQkJeworCQkJCXN5ID0gLTE7CisJCQkJZHkgPSAtYm91bmRzLmhlaWdodCA7CisJCQl9CisJCX0KKwkJCisJCXBvaW50ID0gbmV3IG14UG9pbnQoKHBvaW50LnggLSBib3VuZHMueCkgKiBzeCAtIGR4ICsgYm91bmRzLngsIChwb2ludC55IC0gYm91bmRzLnkpICogc3kgLSBkeSArIGJvdW5kcy55KTsKKwkJCisJCXZhciB4ID0gTWF0aC5yb3VuZCgocG9pbnQueCAtIGJvdW5kcy54KSAqIDEwMDAgLyBib3VuZHMud2lkdGgpIC8gMTAwMDsKKwkJdmFyIHkgPSBNYXRoLnJvdW5kKChwb2ludC55IC0gYm91bmRzLnkpICogMTAwMCAvIGJvdW5kcy5oZWlnaHQpIC8gMTAwMDsKKwkJCisJCXJldHVybiBuZXcgbXhDb25uZWN0aW9uQ29uc3RyYWludChuZXcgbXhQb2ludCh4LCB5KSwgZmFsc2UpOworCX0KKwkKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEFsbENvbm5lY3Rpb25Db25zdHJhaW50cworICogCisgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCA8bXhDb25uZWN0aW9uQ29uc3RyYWludHM+IGZvciB0aGUgZ2l2ZW4gdGVybWluYWwuIElmCisgKiB0aGUgc2hhcGUgb2YgdGhlIGdpdmVuIHRlcm1pbmFsIGlzIGEgPG14U3RlbmNpbFNoYXBlPiB0aGVuIHRoZSBjb25zdHJhaW50cworICogb2YgdGhlIGNvcnJlc3BvbmRpbmcgPG14U3RlbmNpbD4gYXJlIHJldHVybmVkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB0ZXJtaW5hbCAtIDxteENlbGxTdGF0ZT4gdGhhdCByZXByZXNlbnRzIHRoZSB0ZXJtaW5hbC4KKyAqIHNvdXJjZSAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIHRlcm1pbmFsIGlzIHRoZSBzb3VyY2Ugb3IgdGFyZ2V0LgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRBbGxDb25uZWN0aW9uQ29uc3RyYWludHMgPSBmdW5jdGlvbih0ZXJtaW5hbCwgc291cmNlKQoreworCWlmICh0ZXJtaW5hbCAhPSBudWxsICYmIHRlcm1pbmFsLnNoYXBlICE9IG51bGwgJiYgdGVybWluYWwuc2hhcGUuc3RlbmNpbCAhPSBudWxsKQorCXsKKwkJcmV0dXJuIHRlcm1pbmFsLnNoYXBlLnN0ZW5jaWwuY29uc3RyYWludHM7CisJfQorCisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDb25uZWN0aW9uQ29uc3RyYWludAorICogCisgKiBSZXR1cm5zIGFuIDxteENvbm5lY3Rpb25Db25zdHJhaW50PiB0aGF0IGRlc2NyaWJlcyB0aGUgZ2l2ZW4gY29ubmVjdGlvbgorICogcG9pbnQuIFRoaXMgcmVzdWx0IGNhbiB0aGVuIGJlIHBhc3NlZCB0byA8Z2V0Q29ubmVjdGlvblBvaW50Pi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZWRnZSAtIDxteENlbGxTdGF0ZT4gdGhhdCByZXByZXNlbnRzIHRoZSBlZGdlLgorICogdGVybWluYWwgLSA8bXhDZWxsU3RhdGU+IHRoYXQgcmVwcmVzZW50cyB0aGUgdGVybWluYWwuCisgKiBzb3VyY2UgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIHRlcm1pbmFsIGlzIHRoZSBzb3VyY2Ugb3IgdGFyZ2V0LgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRDb25uZWN0aW9uQ29uc3RyYWludCA9IGZ1bmN0aW9uKGVkZ2UsIHRlcm1pbmFsLCBzb3VyY2UpCit7CisJdmFyIHBvaW50ID0gbnVsbDsKKwl2YXIgeCA9IGVkZ2Uuc3R5bGVbKHNvdXJjZSkgPyBteENvbnN0YW50cy5TVFlMRV9FWElUX1ggOiBteENvbnN0YW50cy5TVFlMRV9FTlRSWV9YXTsKKworCWlmICh4ICE9IG51bGwpCisJeworCQl2YXIgeSA9IGVkZ2Uuc3R5bGVbKHNvdXJjZSkgPyBteENvbnN0YW50cy5TVFlMRV9FWElUX1kgOiBteENvbnN0YW50cy5TVFlMRV9FTlRSWV9ZXTsKKwkJCisJCWlmICh5ICE9IG51bGwpCisJCXsKKwkJCXBvaW50ID0gbmV3IG14UG9pbnQocGFyc2VGbG9hdCh4KSwgcGFyc2VGbG9hdCh5KSk7CisJCX0KKwl9CisJCisJdmFyIHBlcmltZXRlciA9IGZhbHNlOworCQorCWlmIChwb2ludCAhPSBudWxsKQorCXsKKwkJcGVyaW1ldGVyID0gbXhVdGlscy5nZXRWYWx1ZShlZGdlLnN0eWxlLCAoc291cmNlKSA/IG14Q29uc3RhbnRzLlNUWUxFX0VYSVRfUEVSSU1FVEVSIDoKKwkJCW14Q29uc3RhbnRzLlNUWUxFX0VOVFJZX1BFUklNRVRFUiwgdHJ1ZSk7CisJfQorCQorCXJldHVybiBuZXcgbXhDb25uZWN0aW9uQ29uc3RyYWludChwb2ludCwgcGVyaW1ldGVyKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldENvbm5lY3Rpb25Db25zdHJhaW50CisgKiAKKyAqIFNldHMgdGhlIDxteENvbm5lY3Rpb25Db25zdHJhaW50PiB0aGF0IGRlc2NyaWJlcyB0aGUgZ2l2ZW4gY29ubmVjdGlvbiBwb2ludC4KKyAqIElmIG5vIGNvbnN0cmFpbnQgaXMgZ2l2ZW4gdGhlbiBub3RoaW5nIGlzIGNoYW5nZWQuIFRvIHJlbW92ZSBhbiBleGlzdGluZworICogY29uc3RyYWludCBmcm9tIHRoZSBnaXZlbiBlZGdlLCB1c2UgYW4gZW1wdHkgY29uc3RyYWludCBpbnN0ZWFkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBlZGdlLgorICogdGVybWluYWwgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHRlcm1pbmFsLgorICogc291cmNlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSB0ZXJtaW5hbCBpcyB0aGUgc291cmNlIG9yIHRhcmdldC4KKyAqIGNvbnN0cmFpbnQgLSBPcHRpb25hbCA8bXhDb25uZWN0aW9uQ29uc3RyYWludD4gdG8gYmUgdXNlZCBmb3IgdGhpcworICogY29ubmVjdGlvbi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0Q29ubmVjdGlvbkNvbnN0cmFpbnQgPSBmdW5jdGlvbihlZGdlLCB0ZXJtaW5hbCwgc291cmNlLCBjb25zdHJhaW50KQoreworCWlmIChjb25zdHJhaW50ICE9IG51bGwpCisJeworCQl0aGlzLm1vZGVsLmJlZ2luVXBkYXRlKCk7CisJCQorCQl0cnkKKwkJeworCQkJaWYgKGNvbnN0cmFpbnQgPT0gbnVsbCB8fCBjb25zdHJhaW50LnBvaW50ID09IG51bGwpCisJCQl7CisJCQkJdGhpcy5zZXRDZWxsU3R5bGVzKChzb3VyY2UpID8gbXhDb25zdGFudHMuU1RZTEVfRVhJVF9YIDoKKwkJCQkJbXhDb25zdGFudHMuU1RZTEVfRU5UUllfWCwgbnVsbCwgW2VkZ2VdKTsKKwkJCQl0aGlzLnNldENlbGxTdHlsZXMoKHNvdXJjZSkgPyBteENvbnN0YW50cy5TVFlMRV9FWElUX1kgOgorCQkJCQlteENvbnN0YW50cy5TVFlMRV9FTlRSWV9ZLCBudWxsLCBbZWRnZV0pOworCQkJCXRoaXMuc2V0Q2VsbFN0eWxlcygoc291cmNlKSA/IG14Q29uc3RhbnRzLlNUWUxFX0VYSVRfUEVSSU1FVEVSIDoKKwkJCQkJbXhDb25zdGFudHMuU1RZTEVfRU5UUllfUEVSSU1FVEVSLCBudWxsLCBbZWRnZV0pOworCQkJfQorCQkJZWxzZSBpZiAoY29uc3RyYWludC5wb2ludCAhPSBudWxsKQorCQkJeworCQkJCXRoaXMuc2V0Q2VsbFN0eWxlcygoc291cmNlKSA/IG14Q29uc3RhbnRzLlNUWUxFX0VYSVRfWCA6CisJCQkJCW14Q29uc3RhbnRzLlNUWUxFX0VOVFJZX1gsIGNvbnN0cmFpbnQucG9pbnQueCwgW2VkZ2VdKTsKKwkJCQl0aGlzLnNldENlbGxTdHlsZXMoKHNvdXJjZSkgPyBteENvbnN0YW50cy5TVFlMRV9FWElUX1kgOgorCQkJCQlteENvbnN0YW50cy5TVFlMRV9FTlRSWV9ZLCBjb25zdHJhaW50LnBvaW50LnksIFtlZGdlXSk7CisJCQkJCisJCQkJLy8gT25seSB3cml0ZXMgMCBzaW5jZSAxIGlzIGRlZmF1bHQKKwkJCQlpZiAoIWNvbnN0cmFpbnQucGVyaW1ldGVyKQorCQkJCXsKKwkJCQkJdGhpcy5zZXRDZWxsU3R5bGVzKChzb3VyY2UpID8gbXhDb25zdGFudHMuU1RZTEVfRVhJVF9QRVJJTUVURVIgOgorCQkJCQkJbXhDb25zdGFudHMuU1RZTEVfRU5UUllfUEVSSU1FVEVSLCAnMCcsIFtlZGdlXSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXRoaXMuc2V0Q2VsbFN0eWxlcygoc291cmNlKSA/IG14Q29uc3RhbnRzLlNUWUxFX0VYSVRfUEVSSU1FVEVSIDoKKwkJCQkJCW14Q29uc3RhbnRzLlNUWUxFX0VOVFJZX1BFUklNRVRFUiwgbnVsbCwgW2VkZ2VdKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZmluYWxseQorCQl7CisJCQl0aGlzLm1vZGVsLmVuZFVwZGF0ZSgpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q29ubmVjdGlvblBvaW50CisgKgorICogUmV0dXJucyB0aGUgbmVhcmVzdCBwb2ludCBpbiB0aGUgbGlzdCBvZiBhYnNvbHV0ZSBwb2ludHMgb3IgdGhlIGNlbnRlcgorICogb2YgdGhlIG9wcG9zaXRlIHRlcm1pbmFsLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2ZXJ0ZXggLSA8bXhDZWxsU3RhdGU+IHRoYXQgcmVwcmVzZW50cyB0aGUgdmVydGV4LgorICogY29uc3RyYWludCAtIDxteENvbm5lY3Rpb25Db25zdHJhaW50PiB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbm5lY3Rpb24gcG9pbnQKKyAqIGNvbnN0cmFpbnQgYXMgcmV0dXJuZWQgYnkgPGdldENvbm5lY3Rpb25Db25zdHJhaW50Pi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0Q29ubmVjdGlvblBvaW50ID0gZnVuY3Rpb24odmVydGV4LCBjb25zdHJhaW50KQoreworCXZhciBwb2ludCA9IG51bGw7CisJCisJaWYgKHZlcnRleCAhPSBudWxsICYmIGNvbnN0cmFpbnQucG9pbnQgIT0gbnVsbCkKKwl7CisJCXZhciBib3VuZHMgPSB0aGlzLnZpZXcuZ2V0UGVyaW1ldGVyQm91bmRzKHZlcnRleCk7CisgICAgICAgIHZhciBjeCA9IG5ldyBteFBvaW50KGJvdW5kcy5nZXRDZW50ZXJYKCksIGJvdW5kcy5nZXRDZW50ZXJZKCkpOworCQl2YXIgZGlyZWN0aW9uID0gdmVydGV4LnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0RJUkVDVElPTl07CisJCXZhciByMSA9IDA7CisJCQorCQkvLyBCb3VuZHMgbmVlZCB0byBiZSByb3RhdGVkIGJ5IDkwIGRlZ3JlZXMgZm9yIGZ1cnRoZXIgY29tcHV0YXRpb24KKwkJaWYgKGRpcmVjdGlvbiAhPSBudWxsKQorCQl7CisJCQlpZiAoZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9OT1JUSCkKKwkJCXsKKwkJCQlyMSArPSAyNzA7CisJCQl9CisJCQllbHNlIGlmIChkaXJlY3Rpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX1dFU1QpCisJCQl7CisJCQkJcjEgKz0gMTgwOworCQkJfQorCQkJZWxzZSBpZiAoZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9TT1VUSCkKKwkJCXsKKwkJCQlyMSArPSA5MDsKKwkJCX0KKworCQkJLy8gQm91bmRzIG5lZWQgdG8gYmUgcm90YXRlZCBieSA5MCBkZWdyZWVzIGZvciBmdXJ0aGVyIGNvbXB1dGF0aW9uCisJCQlpZiAoZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9OT1JUSCB8fCBkaXJlY3Rpb24gPT0gbXhDb25zdGFudHMuRElSRUNUSU9OX1NPVVRIKQorCQkJeworCQkJCWJvdW5kcy5yb3RhdGU5MCgpOworCQkJfQorCQl9CisKKwkJcG9pbnQgPSBuZXcgbXhQb2ludChib3VuZHMueCArIGNvbnN0cmFpbnQucG9pbnQueCAqIGJvdW5kcy53aWR0aCwKKwkJCQlib3VuZHMueSArIGNvbnN0cmFpbnQucG9pbnQueSAqIGJvdW5kcy5oZWlnaHQpOworCQkKKwkJLy8gUm90YXRpb24gZm9yIGRpcmVjdGlvbiBiZWZvcmUgcHJvamVjdGlvbiBvbiBwZXJpbWV0ZXIKKwkJdmFyIHIyID0gdmVydGV4LnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1JPVEFUSU9OXSB8fCAwOworCQkKKwkJaWYgKGNvbnN0cmFpbnQucGVyaW1ldGVyKQorCQl7CisJCQlpZiAocjEgIT0gMCkKKwkJCXsKKwkJCQkvLyBPbmx5IDkwIGRlZ3JlZXMgc3RlcHMgcG9zc2libGUgaGVyZSBzbyBubyB0cmlnIG5lZWRlZAorCQkJCXZhciBjb3MgPSAwOworCQkJCXZhciBzaW4gPSAwOworCQkJCQorCQkJCWlmIChyMSA9PSA5MCkKKwkJCQl7CisJCQkJCXNpbiA9IDE7CisJCQkJfQorCQkJCWVsc2UgaWYgKHIxID09IDE4MCkKKwkJCQl7CisJCQkJCWNvcyA9IC0xOworCQkJCX0KKwkJCQllbHNlIGlmIChyMSA9PSAyNzApCisJCQkJeworCQkJCQlzaW4gPSAtMTsKKwkJCQl9CisJCQkJCisJCSAgICAgICAgcG9pbnQgPSBteFV0aWxzLmdldFJvdGF0ZWRQb2ludChwb2ludCwgY29zLCBzaW4sIGN4KTsKKwkJCX0KKwkKKwkJCXBvaW50ID0gdGhpcy52aWV3LmdldFBlcmltZXRlclBvaW50KHZlcnRleCwgcG9pbnQsIGZhbHNlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXIyICs9IHIxOworCQkJCisJCQlpZiAodGhpcy5nZXRNb2RlbCgpLmlzVmVydGV4KHZlcnRleC5jZWxsKSkKKwkJCXsKKwkJCQl2YXIgZmxpcEggPSB2ZXJ0ZXguc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRkxJUEhdID09IDE7CisJCQkJdmFyIGZsaXBWID0gdmVydGV4LnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0ZMSVBWXSA9PSAxOworCQkJCQorCQkJCS8vIExlZ2FjeSBzdXBwb3J0IGZvciBzdGVuY2lsRmxpcEgvVgorCQkJCWlmICh2ZXJ0ZXguc2hhcGUgIT0gbnVsbCAmJiB2ZXJ0ZXguc2hhcGUuc3RlbmNpbCAhPSBudWxsKQorCQkJCXsKKwkJCQkJZmxpcEggPSAobXhVdGlscy5nZXRWYWx1ZSh2ZXJ0ZXguc3R5bGUsICdzdGVuY2lsRmxpcEgnLCAwKSA9PSAxKSB8fCBmbGlwSDsKKwkJCQkJZmxpcFYgPSAobXhVdGlscy5nZXRWYWx1ZSh2ZXJ0ZXguc3R5bGUsICdzdGVuY2lsRmxpcFYnLCAwKSA9PSAxKSB8fCBmbGlwVjsKKwkJCQl9CisJCQkJCisJCQkJaWYgKGZsaXBIKQorCQkJCXsKKwkJCQkJcG9pbnQueCA9IDIgKiBib3VuZHMuZ2V0Q2VudGVyWCgpIC0gcG9pbnQueDsKKwkJCQl9CisJCQkJCisJCQkJaWYgKGZsaXBWKQorCQkJCXsKKwkJCQkJcG9pbnQueSA9IDIgKiBib3VuZHMuZ2V0Q2VudGVyWSgpIC0gcG9pbnQueTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvLyBHZW5lcmljIHJvdGF0aW9uIGFmdGVyIHByb2plY3Rpb24gb24gcGVyaW1ldGVyCisJCWlmIChyMiAhPSAwICYmIHBvaW50ICE9IG51bGwpCisJCXsKKwkgICAgICAgIHZhciByYWQgPSBteFV0aWxzLnRvUmFkaWFucyhyMik7CisJICAgICAgICB2YXIgY29zID0gTWF0aC5jb3MocmFkKTsKKwkgICAgICAgIHZhciBzaW4gPSBNYXRoLnNpbihyYWQpOworCSAgICAgICAgCisJICAgICAgICBwb2ludCA9IG14VXRpbHMuZ2V0Um90YXRlZFBvaW50KHBvaW50LCBjb3MsIHNpbiwgY3gpOworCQl9CisJfQorCQorCWlmIChwb2ludCAhPSBudWxsKQorCXsKKwkJcG9pbnQueCA9IE1hdGgucm91bmQocG9pbnQueCk7CisJCXBvaW50LnkgPSBNYXRoLnJvdW5kKHBvaW50LnkpOworCX0KKworCXJldHVybiBwb2ludDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNvbm5lY3RDZWxsCisgKiAKKyAqIENvbm5lY3RzIHRoZSBzcGVjaWZpZWQgZW5kIG9mIHRoZSBnaXZlbiBlZGdlIHRvIHRoZSBnaXZlbiB0ZXJtaW5hbAorICogdXNpbmcgPGNlbGxDb25uZWN0ZWQ+IGFuZCBmaXJlcyA8bXhFdmVudC5DT05ORUNUX0NFTEw+IHdoaWxlIHRoZQorICogdHJhbnNhY3Rpb24gaXMgaW4gcHJvZ3Jlc3MuIFJldHVybnMgdGhlIHVwZGF0ZWQgZWRnZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZWRnZSAtIDxteENlbGw+IHdob3NlIHRlcm1pbmFsIHNob3VsZCBiZSB1cGRhdGVkLgorICogdGVybWluYWwgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIG5ldyB0ZXJtaW5hbCB0byBiZSB1c2VkLgorICogc291cmNlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBuZXcgdGVybWluYWwgaXMgdGhlIHNvdXJjZSBvciB0YXJnZXQuCisgKiBjb25zdHJhaW50IC0gT3B0aW9uYWwgPG14Q29ubmVjdGlvbkNvbnN0cmFpbnQ+IHRvIGJlIHVzZWQgZm9yIHRoaXMKKyAqIGNvbm5lY3Rpb24uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNvbm5lY3RDZWxsID0gZnVuY3Rpb24oZWRnZSwgdGVybWluYWwsIHNvdXJjZSwgY29uc3RyYWludCkKK3sKKwl0aGlzLm1vZGVsLmJlZ2luVXBkYXRlKCk7CisJdHJ5CisJeworCQl2YXIgcHJldmlvdXMgPSB0aGlzLm1vZGVsLmdldFRlcm1pbmFsKGVkZ2UsIHNvdXJjZSk7CisJCXRoaXMuY2VsbENvbm5lY3RlZChlZGdlLCB0ZXJtaW5hbCwgc291cmNlLCBjb25zdHJhaW50KTsKKwkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5DT05ORUNUX0NFTEwsCisJCQknZWRnZScsIGVkZ2UsICd0ZXJtaW5hbCcsIHRlcm1pbmFsLCAnc291cmNlJywgc291cmNlLAorCQkJJ3ByZXZpb3VzJywgcHJldmlvdXMpKTsKKwl9CisJZmluYWxseQorCXsKKwkJdGhpcy5tb2RlbC5lbmRVcGRhdGUoKTsKKwl9CisKKwlyZXR1cm4gZWRnZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNlbGxDb25uZWN0ZWQKKyAqIAorICogU2V0cyB0aGUgbmV3IHRlcm1pbmFsIGZvciB0aGUgZ2l2ZW4gZWRnZSBhbmQgcmVzZXRzIHRoZSBlZGdlIHBvaW50cyBpZgorICogPHJlc2V0RWRnZXNPbkNvbm5lY3Q+IGlzIHRydWUuIFRoaXMgbWV0aG9kIGZpcmVzCisgKiA8bXhFdmVudC5DRUxMX0NPTk5FQ1RFRD4gd2hpbGUgdGhlIHRyYW5zYWN0aW9uIGlzIGluIHByb2dyZXNzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbD4gd2hvc2UgdGVybWluYWwgc2hvdWxkIGJlIHVwZGF0ZWQuCisgKiB0ZXJtaW5hbCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgbmV3IHRlcm1pbmFsIHRvIGJlIHVzZWQuCisgKiBzb3VyY2UgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIG5ldyB0ZXJtaW5hbCBpcyB0aGUgc291cmNlIG9yIHRhcmdldC4KKyAqIGNvbnN0cmFpbnQgLSA8bXhDb25uZWN0aW9uQ29uc3RyYWludD4gdG8gYmUgdXNlZCBmb3IgdGhpcyBjb25uZWN0aW9uLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jZWxsQ29ubmVjdGVkID0gZnVuY3Rpb24oZWRnZSwgdGVybWluYWwsIHNvdXJjZSwgY29uc3RyYWludCkKK3sKKwlpZiAoZWRnZSAhPSBudWxsKQorCXsKKwkJdGhpcy5tb2RlbC5iZWdpblVwZGF0ZSgpOworCQl0cnkKKwkJeworCQkJdmFyIHByZXZpb3VzID0gdGhpcy5tb2RlbC5nZXRUZXJtaW5hbChlZGdlLCBzb3VyY2UpOworCisJCQkvLyBVcGRhdGVzIHRoZSBjb25zdHJhaW50CisJCQl0aGlzLnNldENvbm5lY3Rpb25Db25zdHJhaW50KGVkZ2UsIHRlcm1pbmFsLCBzb3VyY2UsIGNvbnN0cmFpbnQpOworCQkJCisJCQkvLyBDaGVja3MgaWYgdGhlIG5ldyB0ZXJtaW5hbCBpcyBhIHBvcnQsIHVzZXMgdGhlIElEIG9mIHRoZSBwb3J0IGluIHRoZQorCQkJLy8gc3R5bGUgYW5kIHRoZSBwYXJlbnQgb2YgdGhlIHBvcnQgYXMgdGhlIGFjdHVhbCB0ZXJtaW5hbCBvZiB0aGUgZWRnZS4KKwkJCWlmICh0aGlzLmlzUG9ydHNFbmFibGVkKCkpCisJCQl7CisJCQkJdmFyIGlkID0gbnVsbDsKKwkKKwkJCQlpZiAodGhpcy5pc1BvcnQodGVybWluYWwpKQorCQkJCXsKKwkJCQkJaWQgPSB0ZXJtaW5hbC5nZXRJZCgpOworCQkJCQl0ZXJtaW5hbCA9IHRoaXMuZ2V0VGVybWluYWxGb3JQb3J0KHRlcm1pbmFsLCBzb3VyY2UpOworCQkJCX0KKwkJCQkKKwkJCQkvLyBTZXRzIG9yIHJlc2V0cyBhbGwgcHJldmlvdXMgaW5mb3JtYXRpb24gZm9yIGNvbm5lY3RpbmcgdG8gYSBjaGlsZCBwb3J0CisJCQkJdmFyIGtleSA9IChzb3VyY2UpID8gbXhDb25zdGFudHMuU1RZTEVfU09VUkNFX1BPUlQgOgorCQkJCQlteENvbnN0YW50cy5TVFlMRV9UQVJHRVRfUE9SVDsKKwkJCQl0aGlzLnNldENlbGxTdHlsZXMoa2V5LCBpZCwgW2VkZ2VdKTsKKwkJCX0KKwkJCQorCQkJdGhpcy5tb2RlbC5zZXRUZXJtaW5hbChlZGdlLCB0ZXJtaW5hbCwgc291cmNlKTsKKwkJCQorCQkJaWYgKHRoaXMucmVzZXRFZGdlc09uQ29ubmVjdCkKKwkJCXsKKwkJCQl0aGlzLnJlc2V0RWRnZShlZGdlKTsKKwkJCX0KKworCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5DRUxMX0NPTk5FQ1RFRCwKKwkJCQknZWRnZScsIGVkZ2UsICd0ZXJtaW5hbCcsIHRlcm1pbmFsLCAnc291cmNlJywgc291cmNlLAorCQkJCSdwcmV2aW91cycsIHByZXZpb3VzKSk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCQl0aGlzLm1vZGVsLmVuZFVwZGF0ZSgpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZGlzY29ubmVjdEdyYXBoCisgKiAKKyAqIERpc2Nvbm5lY3RzIHRoZSBnaXZlbiBlZGdlcyBmcm9tIHRoZSB0ZXJtaW5hbHMgd2hpY2ggYXJlIG5vdCBpbiB0aGUKKyAqIGdpdmVuIGFycmF5LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxscyAtIEFycmF5IG9mIDxteENlbGxzPiB0byBiZSBkaXNjb25uZWN0ZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmRpc2Nvbm5lY3RHcmFwaCA9IGZ1bmN0aW9uKGNlbGxzKQoreworCWlmIChjZWxscyAhPSBudWxsKQorCXsKKwkJdGhpcy5tb2RlbC5iZWdpblVwZGF0ZSgpOworCQl0cnkKKwkJewkJCQkJCQkKKwkJCXZhciBzY2FsZSA9IHRoaXMudmlldy5zY2FsZTsKKwkJCXZhciB0ciA9IHRoaXMudmlldy50cmFuc2xhdGU7CisJCQkKKwkJCS8vIEZhc3QgbG9va3VwIGZvciBmaW5kaW5nIGNlbGxzIGluIGFycmF5CisJCQl2YXIgZGljdCA9IG5ldyBteERpY3Rpb25hcnkoKTsKKwkJCQorCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQlkaWN0LnB1dChjZWxsc1tpXSwgdHJ1ZSk7CisJCQl9CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJaWYgKHRoaXMubW9kZWwuaXNFZGdlKGNlbGxzW2ldKSkKKwkJCQl7CisJCQkJCXZhciBnZW8gPSB0aGlzLm1vZGVsLmdldEdlb21ldHJ5KGNlbGxzW2ldKTsKKwkJCQkJCisJCQkJCWlmIChnZW8gIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJdmFyIHN0YXRlID0gdGhpcy52aWV3LmdldFN0YXRlKGNlbGxzW2ldKTsKKwkJCQkJCXZhciBwc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoCisJCQkJCQkJdGhpcy5tb2RlbC5nZXRQYXJlbnQoY2VsbHNbaV0pKTsKKwkJCQkJCQorCQkJCQkJaWYgKHN0YXRlICE9IG51bGwgJiYKKwkJCQkJCQlwc3RhdGUgIT0gbnVsbCkKKwkJCQkJCXsKKwkJCQkJCQlnZW8gPSBnZW8uY2xvbmUoKTsKKwkJCQkJCQkKKwkJCQkJCQl2YXIgZHggPSAtcHN0YXRlLm9yaWdpbi54OworCQkJCQkJCXZhciBkeSA9IC1wc3RhdGUub3JpZ2luLnk7CisJCQkJCQkJdmFyIHB0cyA9IHN0YXRlLmFic29sdXRlUG9pbnRzOworCisJCQkJCQkJdmFyIHNyYyA9IHRoaXMubW9kZWwuZ2V0VGVybWluYWwoY2VsbHNbaV0sIHRydWUpOworCQkJCQkJCQorCQkJCQkJCWlmIChzcmMgIT0gbnVsbCAmJiB0aGlzLmlzQ2VsbERpc2Nvbm5lY3RhYmxlKGNlbGxzW2ldLCBzcmMsIHRydWUpKQorCQkJCQkJCXsKKwkJCQkJCQkJd2hpbGUgKHNyYyAhPSBudWxsICYmICFkaWN0LmdldChzcmMpKQorCQkJCQkJCQl7CisJCQkJCQkJCQlzcmMgPSB0aGlzLm1vZGVsLmdldFBhcmVudChzcmMpOworCQkJCQkJCQl9CisJCQkJCQkJCQorCQkJCQkJCQlpZiAoc3JjID09IG51bGwpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWdlby5zZXRUZXJtaW5hbFBvaW50KAorCQkJCQkJCQkJCW5ldyBteFBvaW50KHB0c1swXS54IC8gc2NhbGUgLSB0ci54ICsgZHgsCisJCQkJCQkJCQkJCXB0c1swXS55IC8gc2NhbGUgLSB0ci55ICsgZHkpLCB0cnVlKTsKKwkJCQkJCQkJCXRoaXMubW9kZWwuc2V0VGVybWluYWwoY2VsbHNbaV0sIG51bGwsIHRydWUpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJCQorCQkJCQkJCXZhciB0cmcgPSB0aGlzLm1vZGVsLmdldFRlcm1pbmFsKGNlbGxzW2ldLCBmYWxzZSk7CisJCQkJCQkJCisJCQkJCQkJaWYgKHRyZyAhPSBudWxsICYmIHRoaXMuaXNDZWxsRGlzY29ubmVjdGFibGUoY2VsbHNbaV0sIHRyZywgZmFsc2UpKQorCQkJCQkJCXsKKwkJCQkJCQkJd2hpbGUgKHRyZyAhPSBudWxsICYmICFkaWN0LmdldCh0cmcpKQorCQkJCQkJCQl7CisJCQkJCQkJCQl0cmcgPSB0aGlzLm1vZGVsLmdldFBhcmVudCh0cmcpOworCQkJCQkJCQl9CisJCQkJCQkJCQorCQkJCQkJCQlpZiAodHJnID09IG51bGwpCisJCQkJCQkJCXsKKwkJCQkJCQkJCXZhciBuID0gcHRzLmxlbmd0aCAtIDE7CisJCQkJCQkJCQlnZW8uc2V0VGVybWluYWxQb2ludCgKKwkJCQkJCQkJCQluZXcgbXhQb2ludChwdHNbbl0ueCAvIHNjYWxlIC0gdHIueCArIGR4LAorCQkJCQkJCQkJCQlwdHNbbl0ueSAvIHNjYWxlIC0gdHIueSArIGR5KSwgZmFsc2UpOworCQkJCQkJCQkJdGhpcy5tb2RlbC5zZXRUZXJtaW5hbChjZWxsc1tpXSwgbnVsbCwgZmFsc2UpOworCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJdGhpcy5tb2RlbC5zZXRHZW9tZXRyeShjZWxsc1tpXSwgZ2VvKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlmaW5hbGx5CisJCXsKKwkJCXRoaXMubW9kZWwuZW5kVXBkYXRlKCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEdyb3VwOiBEcmlsbGRvd24KKyAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDdXJyZW50Um9vdAorICogCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJvb3Qgb2YgdGhlIGRpc3BsYXllZCBjZWxsIGhpZXJhcmNoeS4gVGhpcyBpcyBhCisgKiBzaG9ydGN1dCB0byA8bXhHcmFwaFZpZXcuY3VycmVudFJvb3Q+IGluIDx2aWV3Pi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0Q3VycmVudFJvb3QgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMudmlldy5jdXJyZW50Um9vdDsKK307CisgCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRUcmFuc2xhdGVGb3JSb290CisgKiAKKyAqIFJldHVybnMgdGhlIHRyYW5zbGF0aW9uIHRvIGJlIHVzZWQgaWYgdGhlIGdpdmVuIGNlbGwgaXMgdGhlIHJvb3QgY2VsbCBhcworICogYW4gPG14UG9pbnQ+LiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKyAqIAorICogRXhhbXBsZToKKyAqIAorICogVG8ga2VlcCB0aGUgY2hpbGRyZW4gYXQgdGhlaXIgYWJzb2x1dGUgcG9zaXRpb24gd2hpbGUgc3RlcHBpbmcgaW50byBncm91cHMsCisgKiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBvdmVycmlkZGVuIGFzIGZvbGxvd3MuCisgKiAKKyAqIChjb2RlKQorICogdmFyIG9mZnNldCA9IG5ldyBteFBvaW50KDAsIDApOworICogCisgKiB3aGlsZSAoY2VsbCAhPSBudWxsKQorICogeworICogICB2YXIgZ2VvID0gdGhpcy5tb2RlbC5nZXRHZW9tZXRyeShjZWxsKTsKKyAqIAorICogICBpZiAoZ2VvICE9IG51bGwpCisgKiAgIHsKKyAqICAgICBvZmZzZXQueCAtPSBnZW8ueDsKKyAqICAgICBvZmZzZXQueSAtPSBnZW8ueTsKKyAqICAgfQorICogCisgKiAgIGNlbGwgPSB0aGlzLm1vZGVsLmdldFBhcmVudChjZWxsKTsKKyAqIH0KKyAqIAorICogcmV0dXJuIG9mZnNldDsKKyAqIChlbmQpCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHJvb3QuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldFRyYW5zbGF0ZUZvclJvb3QgPSBmdW5jdGlvbihjZWxsKQoreworCXJldHVybiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNQb3J0CisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbCBpcyBhICJwb3J0IiwgdGhhdCBpcywgd2hlbiBjb25uZWN0aW5nIHRvCisgKiBpdCwgdGhlIGNlbGwgcmV0dXJuZWQgYnkgZ2V0VGVybWluYWxGb3JQb3J0IHNob3VsZCBiZSB1c2VkIGFzIHRoZQorICogdGVybWluYWwgYW5kIHRoZSBwb3J0IHNob3VsZCBiZSByZWZlcmVuY2VkIGJ5IHRoZSBJRCBpbiBlaXRoZXIgdGhlCisgKiBteENvbnN0YW50cy5TVFlMRV9TT1VSQ0VfUE9SVCBvciB0aGUgb3IgdGhlCisgKiBteENvbnN0YW50cy5TVFlMRV9UQVJHRVRfUE9SVC4gTm90ZSB0aGF0IGEgcG9ydCBzaG91bGQgbm90IGJlIG1vdmFibGUuCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIGZhbHNlLgorICogCisgKiBBIHR5cGljYWwgaW1wbGVtZW50YXRpb24gaXMgdGhlIGZvbGxvd2luZzoKKyAqIAorICogKGNvZGUpCisgKiBncmFwaC5pc1BvcnQgPSBmdW5jdGlvbihjZWxsKQorICogeworICogICB2YXIgZ2VvID0gdGhpcy5nZXRDZWxsR2VvbWV0cnkoY2VsbCk7CisgKiAgIAorICogICByZXR1cm4gKGdlbyAhPSBudWxsKSA/IGdlby5yZWxhdGl2ZSA6IGZhbHNlOworICogfTsKKyAqIChlbmQpCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHBvcnQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzUG9ydCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0VGVybWluYWxGb3JQb3J0CisgKiAKKyAqIFJldHVybnMgdGhlIHRlcm1pbmFsIHRvIGJlIHVzZWQgZm9yIGEgZ2l2ZW4gcG9ydC4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICogYWx3YXlzIHJldHVybnMgdGhlIHBhcmVudCBjZWxsLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBwb3J0LgorICogc291cmNlIC0gSWYgdGhlIGNlbGwgaXMgdGhlIHNvdXJjZSBvciB0YXJnZXQgcG9ydC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0VGVybWluYWxGb3JQb3J0ID0gZnVuY3Rpb24oY2VsbCwgc291cmNlKQoreworCXJldHVybiB0aGlzLm1vZGVsLmdldFBhcmVudChjZWxsKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldENoaWxkT2Zmc2V0Rm9yQ2VsbAorICogCisgKiBSZXR1cm5zIHRoZSBvZmZzZXQgdG8gYmUgdXNlZCBmb3IgdGhlIGNlbGxzIGluc2lkZSB0aGUgZ2l2ZW4gY2VsbC4gVGhlCisgKiByb290IGFuZCBsYXllciBjZWxscyBtYXkgYmUgaWRlbnRpZmllZCB1c2luZyA8bXhHcmFwaE1vZGVsLmlzUm9vdD4gYW5kCisgKiA8bXhHcmFwaE1vZGVsLmlzTGF5ZXI+LiBGb3IgYWxsIG90aGVyIGN1cnJlbnQgcm9vdHMsIHRoZQorICogPG14R3JhcGhWaWV3LmN1cnJlbnRSb290PiBmaWVsZCBwb2ludHMgdG8gdGhlIHJlc3BlY3RpdmUgY2VsbCwgc28gdGhhdAorICogdGhlIGZvbGxvd2luZyBob2xkczogY2VsbCA9PSB0aGlzLnZpZXcuY3VycmVudFJvb3QuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIHJldHVybnMgbnVsbC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdob3NlIG9mZnNldCBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldENoaWxkT2Zmc2V0Rm9yQ2VsbCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBlbnRlckdyb3VwCisgKiAKKyAqIFVzZXMgdGhlIGdpdmVuIGNlbGwgYXMgdGhlIHJvb3Qgb2YgdGhlIGRpc3BsYXllZCBjZWxsIGhpZXJhcmNoeS4gSWYgbm8KKyAqIGNlbGwgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIHNlbGVjdGlvbiBjZWxsIGlzIHVzZWQuIFRoZSBjZWxsIGlzIG9ubHkgdXNlZAorICogaWYgPGlzVmFsaWRSb290PiByZXR1cm5zIHRydWUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSBPcHRpb25hbCA8bXhDZWxsPiB0byBiZSB1c2VkIGFzIHRoZSBuZXcgcm9vdC4gRGVmYXVsdCBpcyB0aGUKKyAqIHNlbGVjdGlvbiBjZWxsLgorICovCitteEdyYXBoLnByb3RvdHlwZS5lbnRlckdyb3VwID0gZnVuY3Rpb24oY2VsbCkKK3sKKwljZWxsID0gY2VsbCB8fCB0aGlzLmdldFNlbGVjdGlvbkNlbGwoKTsKKwkKKwlpZiAoY2VsbCAhPSBudWxsICYmIHRoaXMuaXNWYWxpZFJvb3QoY2VsbCkpCisJeworCQl0aGlzLnZpZXcuc2V0Q3VycmVudFJvb3QoY2VsbCk7CisJCXRoaXMuY2xlYXJTZWxlY3Rpb24oKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBleGl0R3JvdXAKKyAqIAorICogQ2hhbmdlcyB0aGUgY3VycmVudCByb290IHRvIHRoZSBuZXh0IHZhbGlkIHJvb3QgaW4gdGhlIGRpc3BsYXllZCBjZWxsCisgKiBoaWVyYXJjaHkuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmV4aXRHcm91cCA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgcm9vdCA9IHRoaXMubW9kZWwuZ2V0Um9vdCgpOworCXZhciBjdXJyZW50ID0gdGhpcy5nZXRDdXJyZW50Um9vdCgpOworCQorCWlmIChjdXJyZW50ICE9IG51bGwpCisJeworCQl2YXIgbmV4dCA9IHRoaXMubW9kZWwuZ2V0UGFyZW50KGN1cnJlbnQpOworCQkKKwkJLy8gRmluZHMgdGhlIG5leHQgdmFsaWQgcm9vdCBpbiB0aGUgaGllcmFyY2h5CisJCXdoaWxlIChuZXh0ICE9IHJvb3QgJiYgIXRoaXMuaXNWYWxpZFJvb3QobmV4dCkgJiYKKwkJCQl0aGlzLm1vZGVsLmdldFBhcmVudChuZXh0KSAhPSByb290KQorCQl7CisJCQluZXh0ID0gdGhpcy5tb2RlbC5nZXRQYXJlbnQobmV4dCk7CisJCX0KKwkJCisJCS8vIENsZWFycyB0aGUgY3VycmVudCByb290IGlmIHRoZSBuZXcgcm9vdCBpcworCQkvLyB0aGUgbW9kZWwncyByb290IG9yIG9uZSBvZiB0aGUgbGF5ZXJzLgorCQlpZiAobmV4dCA9PSByb290IHx8IHRoaXMubW9kZWwuZ2V0UGFyZW50KG5leHQpID09IHJvb3QpCisJCXsKKwkJCXRoaXMudmlldy5zZXRDdXJyZW50Um9vdChudWxsKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRoaXMudmlldy5zZXRDdXJyZW50Um9vdChuZXh0KTsKKwkJfQorCQkKKwkJdmFyIHN0YXRlID0gdGhpcy52aWV3LmdldFN0YXRlKGN1cnJlbnQpOworCQkKKwkJLy8gU2VsZWN0cyB0aGUgcHJldmlvdXMgcm9vdCBpbiB0aGUgZ3JhcGgKKwkJaWYgKHN0YXRlICE9IG51bGwpCisJCXsKKwkJCXRoaXMuc2V0U2VsZWN0aW9uQ2VsbChjdXJyZW50KTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGhvbWUKKyAqIAorICogVXNlcyB0aGUgcm9vdCBvZiB0aGUgbW9kZWwgYXMgdGhlIHJvb3Qgb2YgdGhlIGRpc3BsYXllZCBjZWxsIGhpZXJhcmNoeQorICogYW5kIHNlbGVjdHMgdGhlIHByZXZpb3VzIHJvb3QuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmhvbWUgPSBmdW5jdGlvbigpCit7CisJdmFyIGN1cnJlbnQgPSB0aGlzLmdldEN1cnJlbnRSb290KCk7CisJCisJaWYgKGN1cnJlbnQgIT0gbnVsbCkKKwl7CisJCXRoaXMudmlldy5zZXRDdXJyZW50Um9vdChudWxsKTsKKwkJdmFyIHN0YXRlID0gdGhpcy52aWV3LmdldFN0YXRlKGN1cnJlbnQpOworCQkKKwkJaWYgKHN0YXRlICE9IG51bGwpCisJCXsKKwkJCXRoaXMuc2V0U2VsZWN0aW9uQ2VsbChjdXJyZW50KTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGlzVmFsaWRSb290CisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbCBpcyBhIHZhbGlkIHJvb3QgZm9yIHRoZSBjZWxsIGRpc3BsYXkKKyAqIGhpZXJhcmNoeS4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgZm9yIGFsbCBub24tbnVsbCB2YWx1ZXMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBhcyBhIHBvc3NpYmxlIHJvb3QuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzVmFsaWRSb290ID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gKGNlbGwgIT0gbnVsbCk7Cit9OworCisvKioKKyAqIEdyb3VwOiBHcmFwaCBkaXNwbGF5CisgKi8KKyAKKy8qKgorICogRnVuY3Rpb246IGdldEdyYXBoQm91bmRzCisgKiAKKyAqIFJldHVybnMgdGhlIGJvdW5kcyBvZiB0aGUgdmlzaWJsZSBncmFwaC4gU2hvcnRjdXQgdG8KKyAqIDxteEdyYXBoVmlldy5nZXRHcmFwaEJvdW5kcz4uIFNlZSBhbHNvOiA8Z2V0Qm91bmRpbmdCb3hGcm9tR2VvbWV0cnk+LgorICovCisgbXhHcmFwaC5wcm90b3R5cGUuZ2V0R3JhcGhCb3VuZHMgPSBmdW5jdGlvbigpCisgeworIAlyZXR1cm4gdGhpcy52aWV3LmdldEdyYXBoQm91bmRzKCk7CisgfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q2VsbEJvdW5kcworICogCisgKiBSZXR1cm5zIHRoZSBzY2FsZWQsIHRyYW5zbGF0ZWQgYm91bmRzIGZvciB0aGUgZ2l2ZW4gY2VsbC4gU2VlCisgKiA8bXhHcmFwaFZpZXcuZ2V0Qm91bmRzPiBmb3IgYXJyYXlzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgYm91bmRzIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqIGluY2x1ZGVFZGdlIC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgYm91bmRzIG9mCisgKiB0aGUgY29ubmVjdGVkIGVkZ2VzIHNob3VsZCBiZSBpbmNsdWRlZC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqIGluY2x1ZGVEZXNjZW5kYW50cyAtIE9wdGlvbmFsIGJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIGJvdW5kcworICogb2YgYWxsIGRlc2NlbmRhbnRzIHNob3VsZCBiZSBpbmNsdWRlZC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0Q2VsbEJvdW5kcyA9IGZ1bmN0aW9uKGNlbGwsIGluY2x1ZGVFZGdlcywgaW5jbHVkZURlc2NlbmRhbnRzKQoreworCXZhciBjZWxscyA9IFtjZWxsXTsKKwkKKwkvLyBJbmNsdWRlcyBhbGwgY29ubmVjdGVkIGVkZ2VzCisJaWYgKGluY2x1ZGVFZGdlcykKKwl7CisJCWNlbGxzID0gY2VsbHMuY29uY2F0KHRoaXMubW9kZWwuZ2V0RWRnZXMoY2VsbCkpOworCX0KKwkKKwl2YXIgcmVzdWx0ID0gdGhpcy52aWV3LmdldEJvdW5kcyhjZWxscyk7CisJCisJLy8gUmVjdXJzaXZlbHkgaW5jbHVkZXMgdGhlIGJvdW5kcyBvZiB0aGUgY2hpbGRyZW4KKwlpZiAoaW5jbHVkZURlc2NlbmRhbnRzKQorCXsKKwkJdmFyIGNoaWxkQ291bnQgPSB0aGlzLm1vZGVsLmdldENoaWxkQ291bnQoY2VsbCk7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykKKwkJeworCQkJdmFyIHRtcCA9IHRoaXMuZ2V0Q2VsbEJvdW5kcyh0aGlzLm1vZGVsLmdldENoaWxkQXQoY2VsbCwgaSksCisJCQkJaW5jbHVkZUVkZ2VzLCB0cnVlKTsKKworCQkJaWYgKHJlc3VsdCAhPSBudWxsKQorCQkJeworCQkJCXJlc3VsdC5hZGQodG1wKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXN1bHQgPSB0bXA7CisJCQl9CisJCX0KKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEJvdW5kaW5nQm94RnJvbUdlb21ldHJ5CisgKiAKKyAqIFJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBmb3IgdGhlIGdlb21ldHJpZXMgb2YgdGhlIHZlcnRpY2VzIGluIHRoZQorICogZ2l2ZW4gYXJyYXkgb2YgY2VsbHMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZmluZCB0aGUgZ3JhcGggYm91bmRzIGR1cmluZworICogYSBsYXlvdXQgb3BlcmF0aW9uIChpZS4gYmVmb3JlIHRoZSBsYXN0IGVuZFVwZGF0ZSkgYXMgZm9sbG93czoKKyAqIAorICogKGNvZGUpCisgKiB2YXIgY2VsbHMgPSBncmFwaC5nZXRDaGlsZENlbGxzKGdyYXBoLmdldERlZmF1bHRQYXJlbnQoKSwgdHJ1ZSwgdHJ1ZSk7CisgKiB2YXIgYm91bmRzID0gZ3JhcGguZ2V0Qm91bmRpbmdCb3hGcm9tR2VvbWV0cnkoY2VsbHMsIHRydWUpOworICogKGVuZCkKKyAqIAorICogVGhpcyBjYW4gdGhlbiBiZSB1c2VkIHRvIG1vdmUgY2VsbHMgdG8gdGhlIG9yaWdpbjoKKyAqIAorICogKGNvZGUpCisgKiBpZiAoYm91bmRzLnggPCAwIHx8IGJvdW5kcy55IDwgMCkKKyAqIHsKKyAqICAgZ3JhcGgubW92ZUNlbGxzKGNlbGxzLCAtTWF0aC5taW4oYm91bmRzLngsIDApLCAtTWF0aC5taW4oYm91bmRzLnksIDApKQorICogfQorICogKGVuZCkKKyAqIAorICogT3IgdG8gdHJhbnNsYXRlIHRoZSBncmFwaCB2aWV3OgorICogCisgKiAoY29kZSkKKyAqIGlmIChib3VuZHMueCA8IDAgfHwgYm91bmRzLnkgPCAwKQorICogeworICogICBncmFwaC52aWV3LnNldFRyYW5zbGF0ZSgtTWF0aC5taW4oYm91bmRzLngsIDApLCAtTWF0aC5taW4oYm91bmRzLnksIDApKTsKKyAqIH0KKyAqIChlbmQpCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGxzIC0gQXJyYXkgb2YgPG14Q2VsbHM+IHdob3NlIGJvdW5kcyBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiBpbmNsdWRlRWRnZXMgLSBTcGVjaWZpZXMgaWYgZWRnZSBib3VuZHMgc2hvdWxkIGJlIGluY2x1ZGVkIGJ5IGNvbXB1dGluZworICogdGhlIGJvdW5kaW5nIGJveCBmb3IgYWxsIHBvaW50cyBpbiBnZW9tZXRyeS4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0Qm91bmRpbmdCb3hGcm9tR2VvbWV0cnkgPSBmdW5jdGlvbihjZWxscywgaW5jbHVkZUVkZ2VzKQoreworCWluY2x1ZGVFZGdlcyA9IChpbmNsdWRlRWRnZXMgIT0gbnVsbCkgPyBpbmNsdWRlRWRnZXMgOiBmYWxzZTsKKwl2YXIgcmVzdWx0ID0gbnVsbDsKKwkKKwlpZiAoY2VsbHMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCWlmIChpbmNsdWRlRWRnZXMgfHwgdGhpcy5tb2RlbC5pc1ZlcnRleChjZWxsc1tpXSkpCisJCQl7CisJCQkJLy8gQ29tcHV0ZXMgdGhlIGJvdW5kaW5nIGJveCBmb3IgdGhlIHBvaW50cyBpbiB0aGUgZ2VvbWV0cnkKKwkJCQl2YXIgZ2VvID0gdGhpcy5nZXRDZWxsR2VvbWV0cnkoY2VsbHNbaV0pOworCQkJCQorCQkJCWlmIChnZW8gIT0gbnVsbCkKKwkJCQl7CisJCQkJCXZhciBiYm94ID0gbnVsbDsKKwkJCQkJCisJCQkJCWlmICh0aGlzLm1vZGVsLmlzRWRnZShjZWxsc1tpXSkpCisJCQkJCXsKKwkJCQkJCXZhciBhZGRQb2ludCA9IGZ1bmN0aW9uKHB0KQorCQkJCQkJeworCQkJCQkJCWlmIChwdCAhPSBudWxsKQorCQkJCQkJCXsKKwkJCQkJCQkJaWYgKHRtcCA9PSBudWxsKQorCQkJCQkJCQl7CisJCQkJCQkJCQl0bXAgPSBuZXcgbXhSZWN0YW5nbGUocHQueCwgcHQueSwgMCwgMCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZQorCQkJCQkJCQl7CisJCQkJCQkJCQl0bXAuYWRkKG5ldyBteFJlY3RhbmdsZShwdC54LCBwdC55LCAwLCAwKSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9OworCQkJCQkJCisJCQkJCQlpZiAodGhpcy5tb2RlbC5nZXRUZXJtaW5hbChjZWxsc1tpXSwgdHJ1ZSkgPT0gbnVsbCkKKwkJCQkJCXsKKwkJCQkJCQlhZGRQb2ludChnZW8uZ2V0VGVybWluYWxQb2ludCh0cnVlKSk7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWlmICh0aGlzLm1vZGVsLmdldFRlcm1pbmFsKGNlbGxzW2ldLCBmYWxzZSkgPT0gbnVsbCkKKwkJCQkJCXsKKwkJCQkJCQlhZGRQb2ludChnZW8uZ2V0VGVybWluYWxQb2ludChmYWxzZSkpOworCQkJCQkJfQorCQkJCQkJCQkJCQkJCisJCQkJCQl2YXIgcHRzID0gZ2VvLnBvaW50czsKKwkJCQkJCQorCQkJCQkJaWYgKHB0cyAhPSBudWxsICYmIHB0cy5sZW5ndGggPiAwKQorCQkJCQkJeworCQkJCQkJCXZhciB0bXAgPSBuZXcgbXhSZWN0YW5nbGUocHRzWzBdLngsIHB0c1swXS55LCAwLCAwKTsKKworCQkJCQkJCWZvciAodmFyIGogPSAxOyBqIDwgcHRzLmxlbmd0aDsgaisrKQorCQkJCQkJCXsKKwkJCQkJCQkJYWRkUG9pbnQocHRzW2pdKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWJib3ggPSB0bXA7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQl2YXIgcGFyZW50ID0gdGhpcy5tb2RlbC5nZXRQYXJlbnQoY2VsbHNbaV0pOworCQkJCQkJCisJCQkJCQlpZiAoZ2VvLnJlbGF0aXZlKQorCQkJCQkJeworCQkJCQkJCWlmICh0aGlzLm1vZGVsLmlzVmVydGV4KHBhcmVudCkgJiYgcGFyZW50ICE9IHRoaXMudmlldy5jdXJyZW50Um9vdCkKKwkJCQkJCQl7CisJCQkJCQkJCXZhciB0bXAgPSB0aGlzLmdldEJvdW5kaW5nQm94RnJvbUdlb21ldHJ5KFtwYXJlbnRdLCBmYWxzZSk7CisJCQkJCQkJCQorCQkJCQkJCQlpZiAodG1wICE9IG51bGwpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWJib3ggPSBuZXcgbXhSZWN0YW5nbGUoZ2VvLnggKiB0bXAud2lkdGgsIGdlby55ICogdG1wLmhlaWdodCwgZ2VvLndpZHRoLCBnZW8uaGVpZ2h0KTsKKwkJCQkJCQkJCQorCQkJCQkJCQkJaWYgKG14VXRpbHMuaW5kZXhPZihjZWxscywgcGFyZW50KSA+PSAwKQorCQkJCQkJCQkJeworCQkJCQkJCQkJCWJib3gueCArPSB0bXAueDsKKwkJCQkJCQkJCQliYm94LnkgKz0gdG1wLnk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJYmJveCA9IG14UmVjdGFuZ2xlLmZyb21SZWN0YW5nbGUoZ2VvKTsKKwkJCQkJCQkKKwkJCQkJCQlpZiAodGhpcy5tb2RlbC5pc1ZlcnRleChwYXJlbnQpICYmIG14VXRpbHMuaW5kZXhPZihjZWxscywgcGFyZW50KSA+PSAwKQorCQkJCQkJCXsKKwkJCQkJCQkJdmFyIHRtcCA9IHRoaXMuZ2V0Qm91bmRpbmdCb3hGcm9tR2VvbWV0cnkoW3BhcmVudF0sIGZhbHNlKTsKKworCQkJCQkJCQlpZiAodG1wICE9IG51bGwpCisJCQkJCQkJCXsKKwkJCQkJCQkJCWJib3gueCArPSB0bXAueDsKKwkJCQkJCQkJCWJib3gueSArPSB0bXAueTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJaWYgKGJib3ggIT0gbnVsbCAmJiBnZW8ub2Zmc2V0ICE9IG51bGwpCisJCQkJCQl7CisJCQkJCQkJYmJveC54ICs9IGdlby5vZmZzZXQueDsKKwkJCQkJCQliYm94LnkgKz0gZ2VvLm9mZnNldC55OworCQkJCQkJfQorCQkJCQl9CisJCQkJCQorCQkJCQlpZiAoYmJveCAhPSBudWxsKQorCQkJCQl7CisJCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCisJCQkJCQl7CisJCQkJCQkJcmVzdWx0ID0gbXhSZWN0YW5nbGUuZnJvbVJlY3RhbmdsZShiYm94KTsKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlyZXN1bHQuYWRkKGJib3gpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWZyZXNoCisgKiAKKyAqIENsZWFycyBhbGwgY2VsbCBzdGF0ZXMgb3IgdGhlIHN0YXRlcyBmb3IgdGhlIGhpZXJhcmNoeSBzdGFydGluZyBhdCB0aGUKKyAqIGdpdmVuIGNlbGwgYW5kIHZhbGlkYXRlcyB0aGUgZ3JhcGguIFRoaXMgZmlyZXMgYSByZWZyZXNoIGV2ZW50IGFzIHRoZQorICogbGFzdCBzdGVwLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gT3B0aW9uYWwgPG14Q2VsbD4gZm9yIHdoaWNoIHRoZSBjZWxsIHN0YXRlcyBzaG91bGQgYmUgY2xlYXJlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUucmVmcmVzaCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJdGhpcy52aWV3LmNsZWFyKGNlbGwsIGNlbGwgPT0gbnVsbCk7CisJdGhpcy52aWV3LnZhbGlkYXRlKCk7CisJdGhpcy5zaXplRGlkQ2hhbmdlKCk7CisJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5SRUZSRVNIKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzbmFwCisgKiAKKyAqIFNuYXBzIHRoZSBnaXZlbiBudW1lcmljIHZhbHVlIHRvIHRoZSBncmlkIGlmIDxncmlkRW5hYmxlZD4gaXMgdHJ1ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBOdW1lcmljIHZhbHVlIHRvIGJlIHNuYXBwZWQgdG8gdGhlIGdyaWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNuYXAgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwlpZiAodGhpcy5ncmlkRW5hYmxlZCkKKwl7CisJCXZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSAvIHRoaXMuZ3JpZFNpemUgKSAqIHRoaXMuZ3JpZFNpemU7CisJfQorCQorCXJldHVybiB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHBhbkdyYXBoCisgKiAKKyAqIFNoaWZ0cyB0aGUgZ3JhcGggZGlzcGxheSBieSB0aGUgZ2l2ZW4gYW1vdW50LiBUaGlzIGlzIHVzZWQgdG8gcHJldmlldworICogcGFubmluZyBvcGVyYXRpb25zLCB1c2UgPG14R3JhcGhWaWV3LnNldFRyYW5zbGF0ZT4gdG8gc2V0IGEgcGVyc2lzdGVudAorICogdHJhbnNsYXRpb24gb2YgdGhlIHZpZXcuIEZpcmVzIDxteEV2ZW50LlBBTj4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGR4IC0gQW1vdW50IHRvIHNoaWZ0IHRoZSBncmFwaCBhbG9uZyB0aGUgeC1heGlzLgorICogZHkgLSBBbW91bnQgdG8gc2hpZnQgdGhlIGdyYXBoIGFsb25nIHRoZSB5LWF4aXMuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnBhbkdyYXBoID0gZnVuY3Rpb24oZHgsIGR5KQoreworCWlmICh0aGlzLnVzZVNjcm9sbGJhcnNGb3JQYW5uaW5nICYmIG14VXRpbHMuaGFzU2Nyb2xsYmFycyh0aGlzLmNvbnRhaW5lcikpCisJeworCQl0aGlzLmNvbnRhaW5lci5zY3JvbGxMZWZ0ID0gLWR4OworCQl0aGlzLmNvbnRhaW5lci5zY3JvbGxUb3AgPSAtZHk7CisJfQorCWVsc2UKKwl7CisJCXZhciBjYW52YXMgPSB0aGlzLnZpZXcuZ2V0Q2FudmFzKCk7CisJCQorCQlpZiAodGhpcy5kaWFsZWN0ID09IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHKQorCQl7CisJCQkvLyBQdXRzIGV2ZXJ5dGhpbmcgaW5zaWRlIHRoZSBjb250YWluZXIgaW4gYSBESVYgc28gdGhhdCBpdAorCQkJLy8gY2FuIGJlIG1vdmVkIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHN0YXRlIG9mIHRoZSBjb250YWluZXIKKwkJCWlmIChkeCA9PSAwICYmIGR5ID09IDApCisJCQl7CisJCQkJLy8gV29ya2Fyb3VuZCBmb3IgaWdub3JlZCByZW1vdmVBdHRyaWJ1dGUgb24gU1ZHIGVsZW1lbnQgaW4gSUU5IHN0YW5kYXJkcworCQkJCWlmIChteENsaWVudC5JU19JRSkKKwkJCQl7CisJCQkJCWNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIGR4ICsgJywnICsgZHkgKyAnKScpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQljYW52YXMucmVtb3ZlQXR0cmlidXRlKCd0cmFuc2Zvcm0nKTsKKwkJCQl9CisJCQkJCisJCQkJaWYgKHRoaXMuc2hpZnRQcmV2aWV3MSAhPSBudWxsKQorCQkJCXsKKwkJCQkJdmFyIGNoaWxkID0gdGhpcy5zaGlmdFByZXZpZXcxLmZpcnN0Q2hpbGQ7CisJCQkJCQorCQkJCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJdmFyIG5leHQgPSBjaGlsZC5uZXh0U2libGluZzsKKwkJCQkJCXRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKGNoaWxkKTsKKwkJCQkJCWNoaWxkID0gbmV4dDsKKwkJCQkJfQorCisJCQkJCWlmICh0aGlzLnNoaWZ0UHJldmlldzEucGFyZW50Tm9kZSAhPSBudWxsKQorCQkJCQl7CisJCQkJCQl0aGlzLnNoaWZ0UHJldmlldzEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnNoaWZ0UHJldmlldzEpOworCQkJCQl9CisJCQkJCQorCQkJCQl0aGlzLnNoaWZ0UHJldmlldzEgPSBudWxsOworCQkJCQkKKwkJCQkJdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoY2FudmFzLnBhcmVudE5vZGUpOworCQkJCQkKKwkJCQkJY2hpbGQgPSB0aGlzLnNoaWZ0UHJldmlldzIuZmlyc3RDaGlsZDsKKwkJCQkJCisJCQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKQorCQkJCQl7CisJCQkJCQl2YXIgbmV4dCA9IGNoaWxkLm5leHRTaWJsaW5nOworCQkJCQkJdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQoY2hpbGQpOworCQkJCQkJY2hpbGQgPSBuZXh0OworCQkJCQl9CisKKwkJCQkJaWYgKHRoaXMuc2hpZnRQcmV2aWV3Mi5wYXJlbnROb2RlICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCXRoaXMuc2hpZnRQcmV2aWV3Mi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2hpZnRQcmV2aWV3Mik7CisJCQkJCX0KKwkJCQkJCisJCQkJCXRoaXMuc2hpZnRQcmV2aWV3MiA9IG51bGw7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWNhbnZhcy5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIGR4ICsgJywnICsgZHkgKyAnKScpOworCQkJCQorCQkJCWlmICh0aGlzLnNoaWZ0UHJldmlldzEgPT0gbnVsbCkKKwkJCQl7CisJCQkJCS8vIE5lZWRzIHR3byBkaXZzIGZvciBzdHVmZiBiZWZvcmUgYW5kIGFmdGVyIHRoZSBTVkcgZWxlbWVudAorCQkJCQl0aGlzLnNoaWZ0UHJldmlldzEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKwkJCQkJdGhpcy5zaGlmdFByZXZpZXcxLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKwkJCQkJdGhpcy5zaGlmdFByZXZpZXcxLnN0eWxlLm92ZXJmbG93ID0gJ3Zpc2libGUnOworCQkJCQkKKwkJCQkJdGhpcy5zaGlmdFByZXZpZXcyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCQkJCXRoaXMuc2hpZnRQcmV2aWV3Mi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisJCQkJCXRoaXMuc2hpZnRQcmV2aWV3Mi5zdHlsZS5vdmVyZmxvdyA9ICd2aXNpYmxlJzsKKworCQkJCQl2YXIgY3VycmVudCA9IHRoaXMuc2hpZnRQcmV2aWV3MTsKKwkJCQkJdmFyIGNoaWxkID0gdGhpcy5jb250YWluZXIuZmlyc3RDaGlsZDsKKwkJCQkJCisJCQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKQorCQkJCQl7CisJCQkJCQl2YXIgbmV4dCA9IGNoaWxkLm5leHRTaWJsaW5nOworCQkJCQkJCisJCQkJCQkvLyBTVkcgZWxlbWVudCBpcyBtb3ZlZCB2aWEgdHJhbnNmb3JtIGF0dHJpYnV0ZQorCQkJCQkJaWYgKGNoaWxkICE9IGNhbnZhcy5wYXJlbnROb2RlKQorCQkJCQkJeworCQkJCQkJCWN1cnJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWN1cnJlbnQgPSB0aGlzLnNoaWZ0UHJldmlldzI7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCWNoaWxkID0gbmV4dDsKKwkJCQkJfQorCQkJCQkKKwkJCQkJLy8gSW5zZXJ0cyBlbGVtZW50cyBvbmx5IGlmIG5vdCBlbXB0eQorCQkJCQlpZiAodGhpcy5zaGlmdFByZXZpZXcxLmZpcnN0Q2hpbGQgIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuc2hpZnRQcmV2aWV3MSwgY2FudmFzLnBhcmVudE5vZGUpOworCQkJCQl9CisJCQkJCQorCQkJCQlpZiAodGhpcy5zaGlmdFByZXZpZXcyLmZpcnN0Q2hpbGQgIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zaGlmdFByZXZpZXcyKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQl0aGlzLnNoaWZ0UHJldmlldzEuc3R5bGUubGVmdCA9IGR4ICsgJ3B4JzsKKwkJCQl0aGlzLnNoaWZ0UHJldmlldzEuc3R5bGUudG9wID0gZHkgKyAncHgnOworCQkJCXRoaXMuc2hpZnRQcmV2aWV3Mi5zdHlsZS5sZWZ0ID0gZHggKyAncHgnOworCQkJCXRoaXMuc2hpZnRQcmV2aWV3Mi5zdHlsZS50b3AgPSBkeSArICdweCc7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQljYW52YXMuc3R5bGUubGVmdCA9IGR4ICsgJ3B4JzsKKwkJCWNhbnZhcy5zdHlsZS50b3AgPSBkeSArICdweCc7CisJCX0KKwkJCisJCXRoaXMucGFuRHggPSBkeDsKKwkJdGhpcy5wYW5EeSA9IGR5OworCisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuUEFOKSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogem9vbUluCisgKiAKKyAqIFpvb21zIGludG8gdGhlIGdyYXBoIGJ5IDx6b29tRmFjdG9yPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuem9vbUluID0gZnVuY3Rpb24oKQoreworCXRoaXMuem9vbSh0aGlzLnpvb21GYWN0b3IpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogem9vbU91dAorICogCisgKiBab29tcyBvdXQgb2YgdGhlIGdyYXBoIGJ5IDx6b29tRmFjdG9yPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuem9vbU91dCA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnpvb20oMSAvIHRoaXMuem9vbUZhY3Rvcik7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB6b29tQWN0dWFsCisgKiAKKyAqIFJlc2V0cyB0aGUgem9vbSBhbmQgcGFubmluZyBpbiB0aGUgdmlldy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuem9vbUFjdHVhbCA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAodGhpcy52aWV3LnNjYWxlID09IDEpCisJeworCQl0aGlzLnZpZXcuc2V0VHJhbnNsYXRlKDAsIDApOworCX0KKwllbHNlCisJeworCQl0aGlzLnZpZXcudHJhbnNsYXRlLnggPSAwOworCQl0aGlzLnZpZXcudHJhbnNsYXRlLnkgPSAwOworCisJCXRoaXMudmlldy5zZXRTY2FsZSgxKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB6b29tVG8KKyAqIAorICogWm9vbXMgdGhlIGdyYXBoIHRvIHRoZSBnaXZlbiBzY2FsZSB3aXRoIGFuIG9wdGlvbmFsIGJvb2xlYW4gY2VudGVyCisgKiBhcmd1bWVudCwgd2hpY2ggaXMgcGFzc2QgdG8gPHpvb20+LgorICovCitteEdyYXBoLnByb3RvdHlwZS56b29tVG8gPSBmdW5jdGlvbihzY2FsZSwgY2VudGVyKQoreworCXRoaXMuem9vbShzY2FsZSAvIHRoaXMudmlldy5zY2FsZSwgY2VudGVyKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNlbnRlcgorICogCisgKiBDZW50ZXJzIHRoZSBncmFwaCBpbiB0aGUgY29udGFpbmVyLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBob3Jpem9udGFsIC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgZ3JhcGggc2hvdWxkIGJlIGNlbnRlcmVkCisgKiBob3Jpem9udGFsbHkuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqIHZlcnRpY2FsIC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgZ3JhcGggc2hvdWxkIGJlIGNlbnRlcmVkCisgKiB2ZXJ0aWNhbGx5LiBEZWZhdWx0IGlzIHRydWUuCisgKiBjeCAtIE9wdGlvbmFsIGZsb2F0IHRoYXQgc3BlY2lmaWVzIHRoZSBob3Jpem9udGFsIGNlbnRlci4gRGVmYXVsdCBpcyAwLjUuCisgKiBjeSAtIE9wdGlvbmFsIGZsb2F0IHRoYXQgc3BlY2lmaWVzIHRoZSB2ZXJ0aWNhbCBjZW50ZXIuIERlZmF1bHQgaXMgMC41LgorICovCitteEdyYXBoLnByb3RvdHlwZS5jZW50ZXIgPSBmdW5jdGlvbihob3Jpem9udGFsLCB2ZXJ0aWNhbCwgY3gsIGN5KQoreworCWhvcml6b250YWwgPSAoaG9yaXpvbnRhbCAhPSBudWxsKSA/IGhvcml6b250YWwgOiB0cnVlOworCXZlcnRpY2FsID0gKHZlcnRpY2FsICE9IG51bGwpID8gdmVydGljYWwgOiB0cnVlOworCWN4ID0gKGN4ICE9IG51bGwpID8gY3ggOiAwLjU7CisJY3kgPSAoY3kgIT0gbnVsbCkgPyBjeSA6IDAuNTsKKwkKKwl2YXIgaGFzU2Nyb2xsYmFycyA9IG14VXRpbHMuaGFzU2Nyb2xsYmFycyh0aGlzLmNvbnRhaW5lcik7CisJdmFyIGN3ID0gdGhpcy5jb250YWluZXIuY2xpZW50V2lkdGg7CisJdmFyIGNoID0gdGhpcy5jb250YWluZXIuY2xpZW50SGVpZ2h0OworCXZhciBib3VuZHMgPSB0aGlzLmdldEdyYXBoQm91bmRzKCk7CisKKwl2YXIgdCA9IHRoaXMudmlldy50cmFuc2xhdGU7CisJdmFyIHMgPSB0aGlzLnZpZXcuc2NhbGU7CisKKwl2YXIgZHggPSAoaG9yaXpvbnRhbCkgPyBjdyAtIGJvdW5kcy53aWR0aCA6IDA7CisJdmFyIGR5ID0gKHZlcnRpY2FsKSA/IGNoIC0gYm91bmRzLmhlaWdodCA6IDA7CisJCisJaWYgKCFoYXNTY3JvbGxiYXJzKQorCXsKKwkJdGhpcy52aWV3LnNldFRyYW5zbGF0ZSgoaG9yaXpvbnRhbCkgPyBNYXRoLmZsb29yKHQueCAtIGJvdW5kcy54ICogcyArIGR4ICogY3ggLyBzKSA6IHQueCwKKwkJCSh2ZXJ0aWNhbCkgPyBNYXRoLmZsb29yKHQueSAtIGJvdW5kcy55ICogcyArIGR5ICogY3kgLyBzKSA6IHQueSk7CisJfQorCWVsc2UKKwl7CisJCWJvdW5kcy54IC09IHQueDsKKwkJYm91bmRzLnkgLT0gdC55OworCQorCQl2YXIgc3cgPSB0aGlzLmNvbnRhaW5lci5zY3JvbGxXaWR0aDsKKwkJdmFyIHNoID0gdGhpcy5jb250YWluZXIuc2Nyb2xsSGVpZ2h0OworCQkKKwkJaWYgKHN3ID4gY3cpCisJCXsKKwkJCWR4ID0gMDsKKwkJfQorCQkKKwkJaWYgKHNoID4gY2gpCisJCXsKKwkJCWR5ID0gMDsKKwkJfQorCisJCXRoaXMudmlldy5zZXRUcmFuc2xhdGUoTWF0aC5mbG9vcihkeCAvIDIgLSBib3VuZHMueCksIE1hdGguZmxvb3IoZHkgLyAyIC0gYm91bmRzLnkpKTsKKwkJdGhpcy5jb250YWluZXIuc2Nyb2xsTGVmdCA9IChzdyAtIGN3KSAvIDI7CisJCXRoaXMuY29udGFpbmVyLnNjcm9sbFRvcCA9IChzaCAtIGNoKSAvIDI7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogem9vbQorICogCisgKiBab29tcyB0aGUgZ3JhcGggdXNpbmcgdGhlIGdpdmVuIGZhY3Rvci4gQ2VudGVyIGlzIGFuIG9wdGlvbmFsIGJvb2xlYW4KKyAqIGFyZ3VtZW50IHRoYXQga2VlcHMgdGhlIGdyYXBoIHNjcm9sbGVkIHRvIHRoZSBjZW50ZXIuIElmIHRoZSBjZW50ZXIgYXJndW1lbnQKKyAqIGlzIG9taXR0ZWQsIHRoZW4gPGNlbnRlclpvb20+IHdpbGwgYmUgdXNlZCBhcyBpdHMgdmFsdWUuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnpvb20gPSBmdW5jdGlvbihmYWN0b3IsIGNlbnRlcikKK3sKKwljZW50ZXIgPSAoY2VudGVyICE9IG51bGwpID8gY2VudGVyIDogdGhpcy5jZW50ZXJab29tOworCXZhciBzY2FsZSA9IE1hdGgucm91bmQodGhpcy52aWV3LnNjYWxlICogZmFjdG9yICogMTAwKSAvIDEwMDsKKwl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUodGhpcy5nZXRTZWxlY3Rpb25DZWxsKCkpOworCWZhY3RvciA9IHNjYWxlIC8gdGhpcy52aWV3LnNjYWxlOworCQorCWlmICh0aGlzLmtlZXBTZWxlY3Rpb25WaXNpYmxlT25ab29tICYmIHN0YXRlICE9IG51bGwpCisJeworCQl2YXIgcmVjdCA9IG5ldyBteFJlY3RhbmdsZShzdGF0ZS54ICogZmFjdG9yLCBzdGF0ZS55ICogZmFjdG9yLAorCQkJc3RhdGUud2lkdGggKiBmYWN0b3IsIHN0YXRlLmhlaWdodCAqIGZhY3Rvcik7CisJCQorCQkvLyBSZWZyZXNoZXMgdGhlIGRpc3BsYXkgb25seSBvbmNlIGlmIGEgc2Nyb2xsIGlzIGNhcnJpZWQgb3V0CisJCXRoaXMudmlldy5zY2FsZSA9IHNjYWxlOworCQkKKwkJaWYgKCF0aGlzLnNjcm9sbFJlY3RUb1Zpc2libGUocmVjdCkpCisJCXsKKwkJCXRoaXMudmlldy5yZXZhbGlkYXRlKCk7CisJCQkKKwkJCS8vIEZvcmNlcyBhbiBldmVudCB0byBiZSBmaXJlZCBidXQgZG9lcyBub3QgcmV2YWxpZGF0ZSBhZ2FpbgorCQkJdGhpcy52aWV3LnNldFNjYWxlKHNjYWxlKTsKKwkJfQorCX0KKwllbHNlCisJeworCQl2YXIgaGFzU2Nyb2xsYmFycyA9IG14VXRpbHMuaGFzU2Nyb2xsYmFycyh0aGlzLmNvbnRhaW5lcik7CisJCQorCQlpZiAoY2VudGVyICYmICFoYXNTY3JvbGxiYXJzKQorCQl7CisJCQl2YXIgZHggPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aDsKKwkJCXZhciBkeSA9IHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodDsKKwkJCQorCQkJaWYgKGZhY3RvciA+IDEpCisJCQl7CisJCQkJdmFyIGYgPSAoZmFjdG9yIC0gMSkgLyAoc2NhbGUgKiAyKTsKKwkJCQlkeCAqPSAtZjsKKwkJCQlkeSAqPSAtZjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl2YXIgZiA9ICgxIC8gZmFjdG9yIC0gMSkgLyAodGhpcy52aWV3LnNjYWxlICogMik7CisJCQkJZHggKj0gZjsKKwkJCQlkeSAqPSBmOworCQkJfQorCisJCQl0aGlzLnZpZXcuc2NhbGVBbmRUcmFuc2xhdGUoc2NhbGUsCisJCQkJdGhpcy52aWV3LnRyYW5zbGF0ZS54ICsgZHgsCisJCQkJdGhpcy52aWV3LnRyYW5zbGF0ZS55ICsgZHkpOworCQl9CisJCWVsc2UKKwkJeworCQkJLy8gQWxsb3dzIGZvciBjaGFuZ2VzIG9mIHRyYW5zbGF0ZSBhbmQgc2Nyb2xsYmFycyBkdXJpbmcgc2V0c2NhbGUKKwkJCXZhciB0eCA9IHRoaXMudmlldy50cmFuc2xhdGUueDsKKwkJCXZhciB0eSA9IHRoaXMudmlldy50cmFuc2xhdGUueTsKKwkJCXZhciBzbCA9IHRoaXMuY29udGFpbmVyLnNjcm9sbExlZnQ7CisJCQl2YXIgc3QgPSB0aGlzLmNvbnRhaW5lci5zY3JvbGxUb3A7CisJCQkKKwkJCXRoaXMudmlldy5zZXRTY2FsZShzY2FsZSk7CisJCQkKKwkJCWlmIChoYXNTY3JvbGxiYXJzKQorCQkJeworCQkJCXZhciBkeCA9IDA7CisJCQkJdmFyIGR5ID0gMDsKKwkJCQkKKwkJCQlpZiAoY2VudGVyKQorCQkJCXsKKwkJCQkJZHggPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aCAqIChmYWN0b3IgLSAxKSAvIDI7CisJCQkJCWR5ID0gdGhpcy5jb250YWluZXIub2Zmc2V0SGVpZ2h0ICogKGZhY3RvciAtIDEpIC8gMjsKKwkJCQl9CisJCQkJCisJCQkJdGhpcy5jb250YWluZXIuc2Nyb2xsTGVmdCA9ICh0aGlzLnZpZXcudHJhbnNsYXRlLnggLSB0eCkgKiB0aGlzLnZpZXcuc2NhbGUgKyBNYXRoLnJvdW5kKHNsICogZmFjdG9yICsgZHgpOworCQkJCXRoaXMuY29udGFpbmVyLnNjcm9sbFRvcCA9ICh0aGlzLnZpZXcudHJhbnNsYXRlLnkgLSB0eSkgKiB0aGlzLnZpZXcuc2NhbGUgKyBNYXRoLnJvdW5kKHN0ICogZmFjdG9yICsgZHkpOworCQkJfQorCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogem9vbVRvUmVjdAorICogCisgKiBab29tcyB0aGUgZ3JhcGggdG8gdGhlIHNwZWNpZmllZCByZWN0YW5nbGUuIElmIHRoZSByZWN0YW5nbGUgZG9lcyBub3QgaGF2ZSBzYW1lIGFzcGVjdAorICogcmF0aW8gYXMgdGhlIGRpc3BsYXkgY29udGFpbmVyLCBpdCBpcyBpbmNyZWFzZWQgaW4gdGhlIHNtYWxsZXIgcmVsYXRpdmUgZGltZW5zaW9uIG9ubHkKKyAqIHVudGlsIHRoZSBhc3BlY3QgbWF0Y2guIFRoZSBvcmlnaW5hbCByZWN0YW5nbGUgaXMgY2VudHJhbGlzZWQgd2l0aGluIHRoaXMgZXhwYW5kZWQgb25lLgorICogCisgKiBOb3RlIHRoYXQgdGhlIGlucHV0IHJlY3Rhbmd1bGFyIG11c3QgYmUgdW4tc2NhbGVkIGFuZCB1bi10cmFuc2xhdGVkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiByZWN0IC0gVGhlIHVuLXNjYWxlZCBhbmQgdW4tdHJhbnNsYXRlZCByZWN0YW5nbHVhciByZWdpb24gdGhhdCBzaG91bGQgYmUganVzdCB2aXNpYmxlIAorICogYWZ0ZXIgdGhlIG9wZXJhdGlvbgorICovCitteEdyYXBoLnByb3RvdHlwZS56b29tVG9SZWN0ID0gZnVuY3Rpb24ocmVjdCkKK3sKKwl2YXIgc2NhbGVYID0gdGhpcy5jb250YWluZXIuY2xpZW50V2lkdGggLyByZWN0LndpZHRoOworCXZhciBzY2FsZVkgPSB0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQgLyByZWN0LmhlaWdodDsKKwl2YXIgYXNwZWN0RmFjdG9yID0gc2NhbGVYIC8gc2NhbGVZOworCisJLy8gUmVtb3ZlIGFueSBvdmVybGFwIG9mIHRoZSByZWN0IG91dHNpZGUgdGhlIGNsaWVudCBhcmVhCisJcmVjdC54ID0gTWF0aC5tYXgoMCwgcmVjdC54KTsKKwlyZWN0LnkgPSBNYXRoLm1heCgwLCByZWN0LnkpOworCXZhciByZWN0UmlnaHQgPSBNYXRoLm1pbih0aGlzLmNvbnRhaW5lci5zY3JvbGxXaWR0aCwgcmVjdC54ICsgcmVjdC53aWR0aCk7CisJdmFyIHJlY3RCb3R0b20gPSBNYXRoLm1pbih0aGlzLmNvbnRhaW5lci5zY3JvbGxIZWlnaHQsIHJlY3QueSArIHJlY3QuaGVpZ2h0KTsKKwlyZWN0LndpZHRoID0gcmVjdFJpZ2h0IC0gcmVjdC54OworCXJlY3QuaGVpZ2h0ID0gcmVjdEJvdHRvbSAtIHJlY3QueTsKKworCS8vIFRoZSBzZWxlY3Rpb24gYXJlYSBoYXMgdG8gYmUgaW5jcmVhc2VkIHRvIHRoZSBzYW1lIGFzcGVjdAorCS8vIHJhdGlvIGFzIHRoZSBjb250YWluZXIsIGNlbnRyZWQgYXJvdW5kIHRoZSBjZW50cmUgcG9pbnQgb2YgdGhlIAorCS8vIG9yaWdpbmFsIHJlY3QgcGFzc2VkIGluLgorCWlmIChhc3BlY3RGYWN0b3IgPCAxLjApCisJeworCQkvLyBIZWlnaHQgbmVlZHMgaW5jcmVhc2luZworCQl2YXIgbmV3SGVpZ2h0ID0gcmVjdC5oZWlnaHQgLyBhc3BlY3RGYWN0b3I7CisJCXZhciBkZWx0YUhlaWdodEJ1ZmZlciA9IChuZXdIZWlnaHQgLSByZWN0LmhlaWdodCkgLyAyLjA7CisJCXJlY3QuaGVpZ2h0ID0gbmV3SGVpZ2h0OworCQkKKwkJLy8gQXNzaWduIHVwIHRvIGhhbGYgdGhlIGJ1ZmZlciB0byB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcmVjdCwgbm90IGNyb3NzaW5nIDAKKwkJLy8gcHV0IHRoZSByZXN0IG9uIHRoZSBib3R0b20KKwkJdmFyIHVwcGVyQnVmZmVyID0gTWF0aC5taW4ocmVjdC55ICwgZGVsdGFIZWlnaHRCdWZmZXIpOworCQlyZWN0LnkgPSByZWN0LnkgLSB1cHBlckJ1ZmZlcjsKKwkJCisJCS8vIENoZWNrIGlmIHRoZSBib3R0b20gaGFzIGV4dGVuZGVkIHRvbyBmYXIKKwkJcmVjdEJvdHRvbSA9IE1hdGgubWluKHRoaXMuY29udGFpbmVyLnNjcm9sbEhlaWdodCwgcmVjdC55ICsgcmVjdC5oZWlnaHQpOworCQlyZWN0LmhlaWdodCA9IHJlY3RCb3R0b20gLSByZWN0Lnk7CisJfQorCWVsc2UKKwl7CisJCS8vIFdpZHRoIG5lZWRzIGluY3JlYXNpbmcKKwkJdmFyIG5ld1dpZHRoID0gcmVjdC53aWR0aCAqIGFzcGVjdEZhY3RvcjsKKwkJdmFyIGRlbHRhV2lkdGhCdWZmZXIgPSAobmV3V2lkdGggLSByZWN0LndpZHRoKSAvIDIuMDsKKwkJcmVjdC53aWR0aCA9IG5ld1dpZHRoOworCQkKKwkJLy8gQXNzaWduIHVwIHRvIGhhbGYgdGhlIGJ1ZmZlciB0byB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcmVjdCwgbm90IGNyb3NzaW5nIDAKKwkJLy8gcHV0IHRoZSByZXN0IG9uIHRoZSBib3R0b20KKwkJdmFyIGxlZnRCdWZmZXIgPSBNYXRoLm1pbihyZWN0LnggLCBkZWx0YVdpZHRoQnVmZmVyKTsKKwkJcmVjdC54ID0gcmVjdC54IC0gbGVmdEJ1ZmZlcjsKKwkJCisJCS8vIENoZWNrIGlmIHRoZSByaWdodCBoYW5kIHNpZGUgaGFzIGV4dGVuZGVkIHRvbyBmYXIKKwkJcmVjdFJpZ2h0ID0gTWF0aC5taW4odGhpcy5jb250YWluZXIuc2Nyb2xsV2lkdGgsIHJlY3QueCArIHJlY3Qud2lkdGgpOworCQlyZWN0LndpZHRoID0gcmVjdFJpZ2h0IC0gcmVjdC54OworCX0KKworCXZhciBzY2FsZSA9IHRoaXMuY29udGFpbmVyLmNsaWVudFdpZHRoIC8gcmVjdC53aWR0aDsKKwl2YXIgbmV3U2NhbGUgPSB0aGlzLnZpZXcuc2NhbGUgKiBzY2FsZTsKKworCWlmICghbXhVdGlscy5oYXNTY3JvbGxiYXJzKHRoaXMuY29udGFpbmVyKSkKKwl7CisJCXRoaXMudmlldy5zY2FsZUFuZFRyYW5zbGF0ZShuZXdTY2FsZSwgKHRoaXMudmlldy50cmFuc2xhdGUueCAtIHJlY3QueCAvIHRoaXMudmlldy5zY2FsZSksICh0aGlzLnZpZXcudHJhbnNsYXRlLnkgLSByZWN0LnkgLyB0aGlzLnZpZXcuc2NhbGUpKTsKKwl9CisJZWxzZQorCXsKKwkJdGhpcy52aWV3LnNldFNjYWxlKG5ld1NjYWxlKTsKKwkJdGhpcy5jb250YWluZXIuc2Nyb2xsTGVmdCA9IE1hdGgucm91bmQocmVjdC54ICogc2NhbGUpOworCQl0aGlzLmNvbnRhaW5lci5zY3JvbGxUb3AgPSBNYXRoLnJvdW5kKHJlY3QueSAqIHNjYWxlKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzY3JvbGxDZWxsVG9WaXNpYmxlCisgKiAKKyAqIFBhbnMgdGhlIGdyYXBoIHNvIHRoYXQgaXQgc2hvd3MgdGhlIGdpdmVuIGNlbGwuIE9wdGlvbmFsbHkgdGhlIGNlbGwgbWF5CisgKiBiZSBjZW50ZXJlZCBpbiB0aGUgY29udGFpbmVyLgorICogCisgKiBUbyBjZW50ZXIgYSBnaXZlbiBncmFwaCBpZiB0aGUgPGNvbnRhaW5lcj4gaGFzIG5vIHNjcm9sbGJhcnMsIHVzZSB0aGUgZm9sbG93aW5nIGNvZGUuCisgKiAKKyAqIFtjb2RlXQorICogdmFyIGJvdW5kcyA9IGdyYXBoLmdldEdyYXBoQm91bmRzKCk7CisgKiBncmFwaC52aWV3LnNldFRyYW5zbGF0ZSgtYm91bmRzLnggLSAoYm91bmRzLndpZHRoIC0gY29udGFpbmVyLmNsaWVudFdpZHRoKSAvIDIsCisgKiAJCQkJCQkgICAtYm91bmRzLnkgLSAoYm91bmRzLmhlaWdodCAtIGNvbnRhaW5lci5jbGllbnRIZWlnaHQpIC8gMik7CisgKiBbL2NvZGVdCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0byBiZSBtYWRlIHZpc2libGUuCisgKiBjZW50ZXIgLSBPcHRpb25hbCBib29sZWFuIGZsYWcuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNjcm9sbENlbGxUb1Zpc2libGUgPSBmdW5jdGlvbihjZWxsLCBjZW50ZXIpCit7CisJdmFyIHggPSAtdGhpcy52aWV3LnRyYW5zbGF0ZS54OworCXZhciB5ID0gLXRoaXMudmlldy50cmFuc2xhdGUueTsKKworCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShjZWxsKTsKKworCWlmIChzdGF0ZSAhPSBudWxsKQorCXsKKwkJdmFyIGJvdW5kcyA9IG5ldyBteFJlY3RhbmdsZSh4ICsgc3RhdGUueCwgeSArIHN0YXRlLnksIHN0YXRlLndpZHRoLAorCQkJc3RhdGUuaGVpZ2h0KTsKKworCQlpZiAoY2VudGVyICYmIHRoaXMuY29udGFpbmVyICE9IG51bGwpCisJCXsKKwkJCXZhciB3ID0gdGhpcy5jb250YWluZXIuY2xpZW50V2lkdGg7CisJCQl2YXIgaCA9IHRoaXMuY29udGFpbmVyLmNsaWVudEhlaWdodDsKKworCQkJYm91bmRzLnggPSBib3VuZHMuZ2V0Q2VudGVyWCgpIC0gdyAvIDI7CisJCQlib3VuZHMud2lkdGggPSB3OworCQkJYm91bmRzLnkgPSBib3VuZHMuZ2V0Q2VudGVyWSgpIC0gaCAvIDI7CisJCQlib3VuZHMuaGVpZ2h0ID0gaDsKKwkJfQorCQkKKwkJdmFyIHRyID0gbmV3IG14UG9pbnQodGhpcy52aWV3LnRyYW5zbGF0ZS54LCB0aGlzLnZpZXcudHJhbnNsYXRlLnkpOworCisJCWlmICh0aGlzLnNjcm9sbFJlY3RUb1Zpc2libGUoYm91bmRzKSkKKwkJeworCQkJLy8gVHJpZ2dlcnMgYW4gdXBkYXRlIHZpYSB0aGUgdmlldydzIGV2ZW50IHNvdXJjZQorCQkJdmFyIHRyMiA9IG5ldyBteFBvaW50KHRoaXMudmlldy50cmFuc2xhdGUueCwgdGhpcy52aWV3LnRyYW5zbGF0ZS55KTsKKwkJCXRoaXMudmlldy50cmFuc2xhdGUueCA9IHRyLng7CisJCQl0aGlzLnZpZXcudHJhbnNsYXRlLnkgPSB0ci55OworCQkJdGhpcy52aWV3LnNldFRyYW5zbGF0ZSh0cjIueCwgdHIyLnkpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2Nyb2xsUmVjdFRvVmlzaWJsZQorICogCisgKiBQYW5zIHRoZSBncmFwaCBzbyB0aGF0IGl0IHNob3dzIHRoZSBnaXZlbiByZWN0YW5nbGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHJlY3QgLSA8bXhSZWN0YW5nbGU+IHRvIGJlIG1hZGUgdmlzaWJsZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2Nyb2xsUmVjdFRvVmlzaWJsZSA9IGZ1bmN0aW9uKHJlY3QpCit7CisJdmFyIGlzQ2hhbmdlZCA9IGZhbHNlOworCQorCWlmIChyZWN0ICE9IG51bGwpCisJeworCQl2YXIgdyA9IHRoaXMuY29udGFpbmVyLm9mZnNldFdpZHRoOworCQl2YXIgaCA9IHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodDsKKworICAgICAgICB2YXIgd2lkdGhMaW1pdCA9IE1hdGgubWluKHcsIHJlY3Qud2lkdGgpOworICAgICAgICB2YXIgaGVpZ2h0TGltaXQgPSBNYXRoLm1pbihoLCByZWN0LmhlaWdodCk7CisKKwkJaWYgKG14VXRpbHMuaGFzU2Nyb2xsYmFycyh0aGlzLmNvbnRhaW5lcikpCisJCXsKKwkJCXZhciBjID0gdGhpcy5jb250YWluZXI7CisJCQlyZWN0LnggKz0gdGhpcy52aWV3LnRyYW5zbGF0ZS54OworCQkJcmVjdC55ICs9IHRoaXMudmlldy50cmFuc2xhdGUueTsKKwkJCXZhciBkeCA9IGMuc2Nyb2xsTGVmdCAtIHJlY3QueDsKKwkJCXZhciBkZHggPSBNYXRoLm1heChkeCAtIGMuc2Nyb2xsTGVmdCwgMCk7CisKKwkJCWlmIChkeCA+IDApCisJCQl7CisJCQkJYy5zY3JvbGxMZWZ0IC09IGR4ICsgMjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkeCA9IHJlY3QueCArIHdpZHRoTGltaXQgLSBjLnNjcm9sbExlZnQgLSBjLmNsaWVudFdpZHRoOworCisJCQkJaWYgKGR4ID4gMCkKKwkJCQl7CisJCQkJCWMuc2Nyb2xsTGVmdCArPSBkeCArIDI7CisJCQkJfQorCQkJfQorCisJCQl2YXIgZHkgPSBjLnNjcm9sbFRvcCAtIHJlY3QueTsKKwkJCXZhciBkZHkgPSBNYXRoLm1heCgwLCBkeSAtIGMuc2Nyb2xsVG9wKTsKKworCQkJaWYgKGR5ID4gMCkKKwkJCXsKKwkJCQljLnNjcm9sbFRvcCAtPSBkeSArIDI7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZHkgPSByZWN0LnkgKyBoZWlnaHRMaW1pdCAtIGMuc2Nyb2xsVG9wIC0gYy5jbGllbnRIZWlnaHQ7CisKKwkJCQlpZiAoZHkgPiAwKQorCQkJCXsKKwkJCQkJYy5zY3JvbGxUb3AgKz0gZHkgKyAyOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCF0aGlzLnVzZVNjcm9sbGJhcnNGb3JQYW5uaW5nICYmIChkZHggIT0gMCB8fCBkZHkgIT0gMCkpCisJCQl7CisJCQkJdGhpcy52aWV3LnNldFRyYW5zbGF0ZShkZHgsIGRkeSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQl2YXIgeCA9IC10aGlzLnZpZXcudHJhbnNsYXRlLng7CisJCQl2YXIgeSA9IC10aGlzLnZpZXcudHJhbnNsYXRlLnk7CisKKwkJCXZhciBzID0gdGhpcy52aWV3LnNjYWxlOworCisJCQlpZiAocmVjdC54ICsgd2lkdGhMaW1pdCA+IHggKyB3KQorCQkJeworCQkJCXRoaXMudmlldy50cmFuc2xhdGUueCAtPSAocmVjdC54ICsgd2lkdGhMaW1pdCAtIHcgLSB4KSAvIHM7CisJCQkJaXNDaGFuZ2VkID0gdHJ1ZTsKKwkJCX0KKworCQkJaWYgKHJlY3QueSArIGhlaWdodExpbWl0ID4geSArIGgpCisJCQl7CisJCQkJdGhpcy52aWV3LnRyYW5zbGF0ZS55IC09IChyZWN0LnkgKyBoZWlnaHRMaW1pdCAtIGggLSB5KSAvIHM7CisJCQkJaXNDaGFuZ2VkID0gdHJ1ZTsKKwkJCX0KKworCQkJaWYgKHJlY3QueCA8IHgpCisJCQl7CisJCQkJdGhpcy52aWV3LnRyYW5zbGF0ZS54ICs9ICh4IC0gcmVjdC54KSAvIHM7CisJCQkJaXNDaGFuZ2VkID0gdHJ1ZTsKKwkJCX0KKworCQkJaWYgKHJlY3QueSAgPCB5KQorCQkJeworCQkJCXRoaXMudmlldy50cmFuc2xhdGUueSArPSAoeSAtIHJlY3QueSkgLyBzOworCQkJCWlzQ2hhbmdlZCA9IHRydWU7CisJCQl9CisKKwkJCWlmIChpc0NoYW5nZWQpCisJCQl7CisJCQkJdGhpcy52aWV3LnJlZnJlc2goKTsKKwkJCQkKKwkJCQkvLyBSZXBhaW50cyBzZWxlY3Rpb24gbWFya2VyICh0aWNrZXQgMTgpCisJCQkJaWYgKHRoaXMuc2VsZWN0aW9uQ2VsbHNIYW5kbGVyICE9IG51bGwpCisJCQkJeworCQkJCQl0aGlzLnNlbGVjdGlvbkNlbGxzSGFuZGxlci5yZWZyZXNoKCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGlzQ2hhbmdlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldENlbGxHZW9tZXRyeQorICogCisgKiBSZXR1cm5zIHRoZSA8bXhHZW9tZXRyeT4gZm9yIHRoZSBnaXZlbiBjZWxsLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMKKyAqIDxteEdyYXBoTW9kZWwuZ2V0R2VvbWV0cnk+LiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIHRvIGltcGxlbWVudAorICogc3BlY2lmaWMgZ2VvbWV0cmllcyBmb3IgY2VsbHMgaW4gb25seSBvbmUgZ3JhcGgsIHRoYXQgaXMsIGl0IGNhbiByZXR1cm4KKyAqIGdlb21ldHJpZXMgdGhhdCBkZXBlbmQgb24gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZpZXcuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBnZW9tZXRyeSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldENlbGxHZW9tZXRyeSA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIHRoaXMubW9kZWwuZ2V0R2VvbWV0cnkoY2VsbCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NlbGxWaXNpYmxlCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbCBpcyB2aXNpYmxlIGluIHRoaXMgZ3JhcGguIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIHVzZXMgPG14R3JhcGhNb2RlbC5pc1Zpc2libGU+LiBTdWJjbGFzc2VycyBjYW4gb3ZlcnJpZGUKKyAqIHRoaXMgdG8gaW1wbGVtZW50IHNwZWNpZmljIHZpc2liaWxpdHkgZm9yIGNlbGxzIGluIG9ubHkgb25lIGdyYXBoLCB0aGF0CisgKiBpcywgd2l0aG91dCBhZmZlY3RpbmcgdGhlIHZpc2libGUgc3RhdGUgb2YgdGhlIGNlbGwuCisgKiAKKyAqIFdoZW4gdXNpbmcgZHluYW1pYyBmaWx0ZXIgZXhwcmVzc2lvbnMgZm9yIGNlbGwgdmlzaWJpbGl0eSwgdGhlbiB0aGUKKyAqIGdyYXBoIHNob3VsZCBiZSByZXZhbGlkYXRlZCBhZnRlciB0aGUgZmlsdGVyIGV4cHJlc3Npb24gaGFzIGNoYW5nZWQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSB2aXNpYmxlIHN0YXRlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNDZWxsVmlzaWJsZSA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIHRoaXMubW9kZWwuaXNWaXNpYmxlKGNlbGwpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDZWxsQ29sbGFwc2VkCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbCBpcyBjb2xsYXBzZWQgaW4gdGhpcyBncmFwaC4gVGhpcworICogaW1wbGVtZW50YXRpb24gdXNlcyA8bXhHcmFwaE1vZGVsLmlzQ29sbGFwc2VkPi4gU3ViY2xhc3NlcnMgY2FuIG92ZXJyaWRlCisgKiB0aGlzIHRvIGltcGxlbWVudCBzcGVjaWZpYyBjb2xsYXBzZWQgc3RhdGVzIGZvciBjZWxscyBpbiBvbmx5IG9uZSBncmFwaCwKKyAqIHRoYXQgaXMsIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjb2xsYXBzZWQgc3RhdGUgb2YgdGhlIGNlbGwuCisgKiAKKyAqIFdoZW4gdXNpbmcgZHluYW1pYyBmaWx0ZXIgZXhwcmVzc2lvbnMgZm9yIHRoZSBjb2xsYXBzZWQgc3RhdGUsIHRoZW4gdGhlCisgKiBncmFwaCBzaG91bGQgYmUgcmV2YWxpZGF0ZWQgYWZ0ZXIgdGhlIGZpbHRlciBleHByZXNzaW9uIGhhcyBjaGFuZ2VkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgY29sbGFwc2VkIHN0YXRlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNDZWxsQ29sbGFwc2VkID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gdGhpcy5tb2RlbC5pc0NvbGxhcHNlZChjZWxsKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQ2VsbENvbm5lY3RhYmxlCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbCBpcyBjb25uZWN0YWJsZSBpbiB0aGlzIGdyYXBoLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiB1c2VzIDxteEdyYXBoTW9kZWwuaXNDb25uZWN0YWJsZT4uIFN1YmNsYXNzZXJzIGNhbiBvdmVycmlkZQorICogdGhpcyB0byBpbXBsZW1lbnQgc3BlY2lmaWMgY29ubmVjdGFibGUgc3RhdGVzIGZvciBjZWxscyBpbiBvbmx5IG9uZSBncmFwaCwKKyAqIHRoYXQgaXMsIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjb25uZWN0YWJsZSBzdGF0ZSBvZiB0aGUgY2VsbCBpbiB0aGUgbW9kZWwuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBjb25uZWN0YWJsZSBzdGF0ZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzQ2VsbENvbm5lY3RhYmxlID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gdGhpcy5tb2RlbC5pc0Nvbm5lY3RhYmxlKGNlbGwpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNPcnRob2dvbmFsCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiBwZXJpbWV0ZXIgcG9pbnRzIHNob3VsZCBiZSBjb21wdXRlZCBzdWNoIHRoYXQgdGhlCisgKiByZXN1bHRpbmcgZWRnZSBoYXMgb25seSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHNlZ21lbnRzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbFN0YXRlPiB0aGF0IHJlcHJlc2VudHMgdGhlIGVkZ2UuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzT3J0aG9nb25hbCA9IGZ1bmN0aW9uKGVkZ2UpCit7CisJdmFyIG9ydGhvZ29uYWwgPSBlZGdlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX09SVEhPR09OQUxdOworCQorCWlmIChvcnRob2dvbmFsICE9IG51bGwpCisJeworCQlyZXR1cm4gb3J0aG9nb25hbDsKKwl9CisJCisJdmFyIHRtcCA9IHRoaXMudmlldy5nZXRFZGdlU3R5bGUoZWRnZSk7CisJCisJcmV0dXJuIHRtcCA9PSBteEVkZ2VTdHlsZS5TZWdtZW50Q29ubmVjdG9yIHx8CisJCXRtcCA9PSBteEVkZ2VTdHlsZS5FbGJvd0Nvbm5lY3RvciB8fAorCQl0bXAgPT0gbXhFZGdlU3R5bGUuU2lkZVRvU2lkZSB8fAorCQl0bXAgPT0gbXhFZGdlU3R5bGUuVG9wVG9Cb3R0b20gfHwKKwkJdG1wID09IG14RWRnZVN0eWxlLkVudGl0eVJlbGF0aW9uIHx8CisJCXRtcCA9PSBteEVkZ2VTdHlsZS5PcnRoQ29ubmVjdG9yOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNMb29wCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbCBzdGF0ZSBpcyBhIGxvb3AuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB0aGF0IHJlcHJlc2VudHMgYSBwb3RlbnRpYWwgbG9vcC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNMb29wID0gZnVuY3Rpb24oc3RhdGUpCit7CisJdmFyIHNyYyA9IHN0YXRlLmdldFZpc2libGVUZXJtaW5hbFN0YXRlKHRydWUpOworCXZhciB0cmcgPSBzdGF0ZS5nZXRWaXNpYmxlVGVybWluYWxTdGF0ZShmYWxzZSk7CisJCisJcmV0dXJuIChzcmMgIT0gbnVsbCAmJiBzcmMgPT0gdHJnKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQ2xvbmVFdmVudAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGV2ZW50IGlzIGEgY2xvbmUgZXZlbnQuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIHJldHVybnMgdHJ1ZSBpZiBjb250cm9sIGlzIHByZXNzZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzQ2xvbmVFdmVudCA9IGZ1bmN0aW9uKGV2dCkKK3sKKwlyZXR1cm4gbXhFdmVudC5pc0NvbnRyb2xEb3duKGV2dCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1RyYW5zcGFyZW50Q2xpY2tFdmVudAorICogCisgKiBIb29rIGZvciBpbXBsZW1lbnRpbmcgY2xpY2stdGhyb3VnaCBiZWhhdmlvdXIgb24gc2VsZWN0ZWQgY2VsbHMuIElmIHRoaXMKKyAqIHJldHVybnMgdHJ1ZSB0aGUgY2VsbCBiZWhpbmQgdGhlIHNlbGVjdGVkIGNlbGwgd2lsbCBiZSBzZWxlY3RlZC4gVGhpcworICogaW1wbGVtZW50YXRpb24gcmV0dXJucyBmYWxzZTsKKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNUcmFuc3BhcmVudENsaWNrRXZlbnQgPSBmdW5jdGlvbihldnQpCit7CisJcmV0dXJuIGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNUb2dnbGVFdmVudAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGV2ZW50IGlzIGEgdG9nZ2xlIGV2ZW50LiBUaGlzIGltcGxlbWVudGF0aW9uCisgKiByZXR1cm5zIHRydWUgaWYgdGhlIG1ldGEga2V5IChDbWQpIGlzIHByZXNzZWQgb24gTWFjcyBvciBpZiBjb250cm9sIGlzCisgKiBwcmVzc2VkIG9uIGFueSBvdGhlciBwbGF0Zm9ybS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNUb2dnbGVFdmVudCA9IGZ1bmN0aW9uKGV2dCkKK3sKKwlyZXR1cm4gKG14Q2xpZW50LklTX01BQykgPyBteEV2ZW50LmlzTWV0YURvd24oZXZ0KSA6IG14RXZlbnQuaXNDb250cm9sRG93bihldnQpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNHcmlkRW5hYmxlZEV2ZW50CisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbW91c2UgZXZlbnQgc2hvdWxkIGJlIGFsaWduZWQgdG8gdGhlIGdyaWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzR3JpZEVuYWJsZWRFdmVudCA9IGZ1bmN0aW9uKGV2dCkKK3sKKwlyZXR1cm4gZXZ0ICE9IG51bGwgJiYgIW14RXZlbnQuaXNBbHREb3duKGV2dCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NvbnN0cmFpbmVkRXZlbnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb3VzZSBldmVudCBzaG91bGQgYmUgYWxpZ25lZCB0byB0aGUgZ3JpZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNDb25zdHJhaW5lZEV2ZW50ID0gZnVuY3Rpb24oZXZ0KQoreworCXJldHVybiBteEV2ZW50LmlzU2hpZnREb3duKGV2dCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0lnbm9yZVRlcm1pbmFsRXZlbnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb3VzZSBldmVudCBzaG91bGQgbm90IGFsbG93IGFueSBjb25uZWN0aW9ucyB0byBiZQorICogbWFkZS4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGZhbHNlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0lnbm9yZVRlcm1pbmFsRXZlbnQgPSBmdW5jdGlvbihldnQpCit7CisJcmV0dXJuIGZhbHNlOworfTsKKworLyoqCisgKiBHcm91cDogVmFsaWRhdGlvbgorICovCisKKy8qKgorICogRnVuY3Rpb246IHZhbGlkYXRpb25BbGVydAorICogCisgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gdmFsaWRhdGlvbiBlcnJvciBpbiBhIGRpYWxvZy4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzCisgKiBteFV0aWxzLmFsZXJ0LgorICovCitteEdyYXBoLnByb3RvdHlwZS52YWxpZGF0aW9uQWxlcnQgPSBmdW5jdGlvbihtZXNzYWdlKQoreworCW14VXRpbHMuYWxlcnQobWVzc2FnZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0VkZ2VWYWxpZAorICogCisgKiBDaGVja3MgaWYgdGhlIHJldHVybiB2YWx1ZSBvZiA8Z2V0RWRnZVZhbGlkYXRpb25FcnJvcj4gZm9yIHRoZSBnaXZlbgorICogYXJndW1lbnRzIGlzIG51bGwuCisgKiAgCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBlZGdlIHRvIHZhbGlkYXRlLgorICogc291cmNlIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBzb3VyY2UgdGVybWluYWwuCisgKiB0YXJnZXQgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHRhcmdldCB0ZXJtaW5hbC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNFZGdlVmFsaWQgPSBmdW5jdGlvbihlZGdlLCBzb3VyY2UsIHRhcmdldCkKK3sKKwlyZXR1cm4gdGhpcy5nZXRFZGdlVmFsaWRhdGlvbkVycm9yKGVkZ2UsIHNvdXJjZSwgdGFyZ2V0KSA9PSBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0RWRnZVZhbGlkYXRpb25FcnJvcgorICogCisgKiBSZXR1cm5zIHRoZSB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIHdoZW4gaW5zZXJ0aW5nIG9yCisgKiBjaGFuZ2luZyBhbiBlZGdlcycgY29ubmVjdGl2aXR5LiBBIHJldHVybiB2YWx1ZSBvZiBudWxsIG1lYW5zIHRoZSBlZGdlCisgKiBpcyB2YWxpZCwgYSByZXR1cm4gdmFsdWUgb2YgJycgbWVhbnMgaXQncyBub3QgdmFsaWQsIGJ1dCBkbyBub3QgZGlzcGxheQorICogYW4gZXJyb3IgbWVzc2FnZS4gQW55IG90aGVyIChub24tZW1wdHkpIHN0cmluZyByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kCisgKiBpcyBkaXNwbGF5ZWQgYXMgYW4gZXJyb3IgbWVzc2FnZSB3aGVuIHRyeWluZyB0byBjb25uZWN0IGFuIGVkZ2UgdG8gYQorICogc291cmNlIGFuZCB0YXJnZXQuIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgPG11bHRpcGxpY2l0aWVzPiwgYW5kCisgKiBjaGVja3MgPG11bHRpZ3JhcGg+LCA8YWxsb3dEYW5nbGluZ0VkZ2VzPiBhbmQgPGFsbG93TG9vcHM+IHRvIGdlbmVyYXRlCisgKiB2YWxpZGF0aW9uIGVycm9ycy4KKyAqIAorICogRm9yIGV4dGVuZGluZyB0aGlzIG1ldGhvZCB3aXRoIHNwZWNpZmljIGNoZWNrcyBmb3Igc291cmNlL3RhcmdldCBjZWxscywKKyAqIHRoZSBtZXRob2QgY2FuIGJlIGV4dGVuZGVkIGFzIGZvbGxvd3MuIFJldHVybmluZyBhbiBlbXB0eSBzdHJpbmcgbWVhbnMKKyAqIHRoZSBlZGdlIGlzIGludmFsaWQgd2l0aCBubyBlcnJvciBtZXNzYWdlLCBhIG5vbi1udWxsIHN0cmluZyBzcGVjaWZpZXMKKyAqIHRoZSBlcnJvciBtZXNzYWdlLCBhbmQgbnVsbCBtZWFucyB0aGUgZWRnZSBpcyB2YWxpZC4KKyAqIAorICogKGNvZGUpCisgKiBncmFwaC5nZXRFZGdlVmFsaWRhdGlvbkVycm9yID0gZnVuY3Rpb24oZWRnZSwgc291cmNlLCB0YXJnZXQpCisgKiB7CisgKiAgIGlmIChzb3VyY2UgIT0gbnVsbCAmJiB0YXJnZXQgIT0gbnVsbCAmJgorICogICAgIHRoaXMubW9kZWwuZ2V0VmFsdWUoc291cmNlKSAhPSBudWxsICYmCisgKiAgICAgdGhpcy5tb2RlbC5nZXRWYWx1ZSh0YXJnZXQpICE9IG51bGwpCisgKiAgIHsKKyAqICAgICBpZiAodGFyZ2V0IGlzIG5vdCB2YWxpZCBmb3Igc291cmNlKQorICogICAgIHsKKyAqICAgICAgIHJldHVybiAnSW52YWxpZCBUYXJnZXQnOworICogICAgIH0KKyAqICAgfQorICogICAKKyAqICAgLy8gIlN1cGVyY2FsbCIKKyAqICAgcmV0dXJuIG14R3JhcGgucHJvdG90eXBlLmdldEVkZ2VWYWxpZGF0aW9uRXJyb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAqIH0KKyAqIChlbmQpCisgKiAgCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBlZGdlIHRvIHZhbGlkYXRlLgorICogc291cmNlIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBzb3VyY2UgdGVybWluYWwuCisgKiB0YXJnZXQgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHRhcmdldCB0ZXJtaW5hbC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0RWRnZVZhbGlkYXRpb25FcnJvciA9IGZ1bmN0aW9uKGVkZ2UsIHNvdXJjZSwgdGFyZ2V0KQoreworCWlmIChlZGdlICE9IG51bGwgJiYgIXRoaXMuaXNBbGxvd0RhbmdsaW5nRWRnZXMoKSAmJiAoc291cmNlID09IG51bGwgfHwgdGFyZ2V0ID09IG51bGwpKQorCXsKKwkJcmV0dXJuICcnOworCX0KKwkKKwlpZiAoZWRnZSAhPSBudWxsICYmIHRoaXMubW9kZWwuZ2V0VGVybWluYWwoZWRnZSwgdHJ1ZSkgPT0gbnVsbCAmJgorCQl0aGlzLm1vZGVsLmdldFRlcm1pbmFsKGVkZ2UsIGZhbHNlKSA9PSBudWxsKQkKKwl7CisJCXJldHVybiBudWxsOworCX0KKwkKKwkvLyBDaGVja3MgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgbG9vcAorCWlmICghdGhpcy5hbGxvd0xvb3BzICYmIHNvdXJjZSA9PSB0YXJnZXQgJiYgc291cmNlICE9IG51bGwpCisJeworCQlyZXR1cm4gJyc7CisJfQorCQorCS8vIENoZWNrcyBpZiB0aGUgY29ubmVjdGlvbiBpcyBnZW5lcmFsbHkgYWxsb3dlZAorCWlmICghdGhpcy5pc1ZhbGlkQ29ubmVjdGlvbihzb3VyY2UsIHRhcmdldCkpCisJeworCQlyZXR1cm4gJyc7CisJfQorCisJaWYgKHNvdXJjZSAhPSBudWxsICYmIHRhcmdldCAhPSBudWxsKQorCXsKKwkJdmFyIGVycm9yID0gJyc7CisKKwkJLy8gQ2hlY2tzIGlmIHRoZSBjZWxscyBhcmUgYWxyZWFkeSBjb25uZWN0ZWQKKwkJLy8gYW5kIGFkZHMgYW4gZXJyb3IgbWVzc2FnZSBpZiByZXF1aXJlZAkJCQorCQlpZiAoIXRoaXMubXVsdGlncmFwaCkKKwkJeworCQkJdmFyIHRtcCA9IHRoaXMubW9kZWwuZ2V0RWRnZXNCZXR3ZWVuKHNvdXJjZSwgdGFyZ2V0LCB0cnVlKTsKKwkJCQorCQkJLy8gQ2hlY2tzIGlmIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBhcmUgbm90IGNvbm5lY3RlZCBieSBhbm90aGVyIGVkZ2UKKwkJCWlmICh0bXAubGVuZ3RoID4gMSB8fCAodG1wLmxlbmd0aCA9PSAxICYmIHRtcFswXSAhPSBlZGdlKSkKKwkJCXsKKwkJCQllcnJvciArPSAobXhSZXNvdXJjZXMuZ2V0KHRoaXMuYWxyZWFkeUNvbm5lY3RlZFJlc291cmNlKSB8fAorCQkJCQl0aGlzLmFscmVhZHlDb25uZWN0ZWRSZXNvdXJjZSkrJ1xuJzsKKwkJCX0KKwkJfQorCisJCS8vIEdldHMgdGhlIG51bWJlciBvZiBvdXRnb2luZyBlZGdlcyBmcm9tIHRoZSBzb3VyY2UKKwkJLy8gYW5kIHRoZSBudW1iZXIgb2YgaW5jb21pbmcgZWRnZXMgZnJvbSB0aGUgdGFyZ2V0CisJCS8vIHdpdGhvdXQgY291bnRpbmcgdGhlIGVkZ2UgYmVpbmcgY3VycmVudGx5IGNoYW5nZWQuCisJCXZhciBzb3VyY2VPdXQgPSB0aGlzLm1vZGVsLmdldERpcmVjdGVkRWRnZUNvdW50KHNvdXJjZSwgdHJ1ZSwgZWRnZSk7CisJCXZhciB0YXJnZXRJbiA9IHRoaXMubW9kZWwuZ2V0RGlyZWN0ZWRFZGdlQ291bnQodGFyZ2V0LCBmYWxzZSwgZWRnZSk7CisKKwkJLy8gQ2hlY2tzIHRoZSBjaGFuZ2UgYWdhaW5zdCBlYWNoIG11bHRpcGxpY2l0eSBydWxlCisJCWlmICh0aGlzLm11bHRpcGxpY2l0aWVzICE9IG51bGwpCisJCXsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5tdWx0aXBsaWNpdGllcy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQl2YXIgZXJyID0gdGhpcy5tdWx0aXBsaWNpdGllc1tpXS5jaGVjayh0aGlzLCBlZGdlLCBzb3VyY2UsCisJCQkJCXRhcmdldCwgc291cmNlT3V0LCB0YXJnZXRJbik7CisJCQkJCisJCQkJaWYgKGVyciAhPSBudWxsKQorCQkJCXsKKwkJCQkJZXJyb3IgKz0gZXJyOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIFZhbGlkYXRlcyB0aGUgc291cmNlIGFuZCB0YXJnZXQgdGVybWluYWxzIGluZGVwZW5kZW50bHkKKwkJdmFyIGVyciA9IHRoaXMudmFsaWRhdGVFZGdlKGVkZ2UsIHNvdXJjZSwgdGFyZ2V0KTsKKwkJCisJCWlmIChlcnIgIT0gbnVsbCkKKwkJeworCQkJZXJyb3IgKz0gZXJyOworCQl9CisJCQorCQlyZXR1cm4gKGVycm9yLmxlbmd0aCA+IDApID8gZXJyb3IgOiBudWxsOworCX0KKwkKKwlyZXR1cm4gKHRoaXMuYWxsb3dEYW5nbGluZ0VkZ2VzKSA/IG51bGwgOiAnJzsKK307CisKKy8qKgorICogRnVuY3Rpb246IHZhbGlkYXRlRWRnZQorICogCisgKiBIb29rIG1ldGhvZCBmb3Igc3ViY2xhc3NlcnMgdG8gcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBnaXZlbgorICogZWRnZSBhbmQgdGVybWluYWxzLiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZWRnZSAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgZWRnZSB0byB2YWxpZGF0ZS4KKyAqIHNvdXJjZSAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgc291cmNlIHRlcm1pbmFsLgorICogdGFyZ2V0IC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSB0YXJnZXQgdGVybWluYWwuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnZhbGlkYXRlRWRnZSA9IGZ1bmN0aW9uKGVkZ2UsIHNvdXJjZSwgdGFyZ2V0KQoreworCXJldHVybiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdmFsaWRhdGVHcmFwaAorICogCisgKiBWYWxpZGF0ZXMgdGhlIGdyYXBoIGJ5IHZhbGlkYXRpbmcgZWFjaCBkZXNjZW5kYW50IG9mIHRoZSBnaXZlbiBjZWxsIG9yCisgKiB0aGUgcm9vdCBvZiB0aGUgbW9kZWwuIENvbnRleHQgaXMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHZhbGlkYXRpb24KKyAqIHN0YXRlIGZvciB0aGUgY29tcGxldGUgdmFsaWRhdGlvbiBydW4uIFRoZSB2YWxpZGF0aW9uIGVycm9ycyBhcmUKKyAqIGF0dGFjaGVkIHRvIHRoZWlyIGNlbGxzIHVzaW5nIDxzZXRDZWxsV2FybmluZz4uIFJldHVybnMgbnVsbCBpbiB0aGUgY2FzZSBvZgorICogc3VjY2Vzc2Z1bCB2YWxpZGF0aW9uIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MgKHdhcm5pbmdzKSBpbiB0aGUgY2FzZSBvZgorICogZmFpbGVkIHZhbGlkYXRpb25zLgorICogCisgKiBQYXJhbXRlcnM6CisgKiAKKyAqIGNlbGwgLSBPcHRpb25hbCA8bXhDZWxsPiB0byBzdGFydCB0aGUgdmFsaWRhdGlvbiByZWN1cnNpb24uIERlZmF1bHQgaXMKKyAqIHRoZSBncmFwaCByb290LgorICogY29udGV4dCAtIE9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGdsb2JhbCB2YWxpZGF0aW9uIHN0YXRlLgorICovCitteEdyYXBoLnByb3RvdHlwZS52YWxpZGF0ZUdyYXBoID0gZnVuY3Rpb24oY2VsbCwgY29udGV4dCkKK3sKKwljZWxsID0gKGNlbGwgIT0gbnVsbCkgPyBjZWxsIDogdGhpcy5tb2RlbC5nZXRSb290KCk7CisJY29udGV4dCA9IChjb250ZXh0ICE9IG51bGwpID8gY29udGV4dCA6IG5ldyBPYmplY3QoKTsKKwkKKwl2YXIgaXNWYWxpZCA9IHRydWU7CisJdmFyIGNoaWxkQ291bnQgPSB0aGlzLm1vZGVsLmdldENoaWxkQ291bnQoY2VsbCk7CisJCisJZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspCisJeworCQl2YXIgdG1wID0gdGhpcy5tb2RlbC5nZXRDaGlsZEF0KGNlbGwsIGkpOworCQl2YXIgY3R4ID0gY29udGV4dDsKKwkJCisJCWlmICh0aGlzLmlzVmFsaWRSb290KHRtcCkpCisJCXsKKwkJCWN0eCA9IG5ldyBPYmplY3QoKTsKKwkJfQorCQkKKwkJdmFyIHdhcm4gPSB0aGlzLnZhbGlkYXRlR3JhcGgodG1wLCBjdHgpOworCQkKKwkJaWYgKHdhcm4gIT0gbnVsbCkKKwkJeworCQkJdGhpcy5zZXRDZWxsV2FybmluZyh0bXAsIHdhcm4ucmVwbGFjZSgvXG4vZywgJzxicj4nKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLnNldENlbGxXYXJuaW5nKHRtcCwgbnVsbCk7CisJCX0KKwkJCisJCWlzVmFsaWQgPSBpc1ZhbGlkICYmIHdhcm4gPT0gbnVsbDsKKwl9CisJCisJdmFyIHdhcm5pbmcgPSAnJzsKKwkKKwkvLyBBZGRzIGVycm9yIGZvciBpbnZhbGlkIGNoaWxkcmVuIGlmIGNvbGxhcHNlZCAoY2hpbGRyZW4gaW52aXNpYmxlKQorCWlmICh0aGlzLmlzQ2VsbENvbGxhcHNlZChjZWxsKSAmJiAhaXNWYWxpZCkKKwl7CisJCXdhcm5pbmcgKz0gKG14UmVzb3VyY2VzLmdldCh0aGlzLmNvbnRhaW5zVmFsaWRhdGlvbkVycm9yc1Jlc291cmNlKSB8fAorCQkJdGhpcy5jb250YWluc1ZhbGlkYXRpb25FcnJvcnNSZXNvdXJjZSkgKyAnXG4nOworCX0KKwkKKwkvLyBDaGVja3MgZWRnZXMgYW5kIGNlbGxzIHVzaW5nIHRoZSBkZWZpbmVkIG11bHRpcGxpY2l0aWVzCisJaWYgKHRoaXMubW9kZWwuaXNFZGdlKGNlbGwpKQorCXsKKwkJd2FybmluZyArPSB0aGlzLmdldEVkZ2VWYWxpZGF0aW9uRXJyb3IoY2VsbCwKKwkJdGhpcy5tb2RlbC5nZXRUZXJtaW5hbChjZWxsLCB0cnVlKSwKKwkJdGhpcy5tb2RlbC5nZXRUZXJtaW5hbChjZWxsLCBmYWxzZSkpIHx8ICcnOworCX0KKwllbHNlCisJeworCQl3YXJuaW5nICs9IHRoaXMuZ2V0Q2VsbFZhbGlkYXRpb25FcnJvcihjZWxsKSB8fCAnJzsKKwl9CisJCisJLy8gQ2hlY2tzIGN1c3RvbSB2YWxpZGF0aW9uIHJ1bGVzCisJdmFyIGVyciA9IHRoaXMudmFsaWRhdGVDZWxsKGNlbGwsIGNvbnRleHQpOworCQorCWlmIChlcnIgIT0gbnVsbCkKKwl7CisJCXdhcm5pbmcgKz0gZXJyOworCX0KKwkKKwkvLyBVcGRhdGVzIHRoZSBkaXNwbGF5IHdpdGggdGhlIHdhcm5pbmcgaWNvbnMKKwkvLyBiZWZvcmUgYW55IHBvdGVudGlhbCBhbGVydHMgYXJlIGRpc3BsYXllZC4KKwkvLyBMQVRFUjogTW92ZSB0aGlzIGludG8gYWRkQ2VsbE92ZXJsYXkuIFJlZHJhdworCS8vIHNob3VsZCBjaGVjayBpZiBvdmVybGF5IHdhcyBhZGRlZCBvciByZW1vdmVkLgorCWlmICh0aGlzLm1vZGVsLmdldFBhcmVudChjZWxsKSA9PSBudWxsKQorCXsKKwkJdGhpcy52aWV3LnZhbGlkYXRlKCk7CisJfQorCisJcmV0dXJuICh3YXJuaW5nLmxlbmd0aCA+IDAgfHwgIWlzVmFsaWQpID8gd2FybmluZyA6IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDZWxsVmFsaWRhdGlvbkVycm9yCisgKiAKKyAqIENoZWNrcyBhbGwgPG11bHRpcGxpY2l0aWVzPiB0aGF0IGNhbm5vdCBiZSBlbmZvcmNlZCB3aGlsZSB0aGUgZ3JhcGggaXMKKyAqIGJlaW5nIG1vZGlmaWVkLCBuYW1lbHksIGFsbCBtdWx0aXBsaWNpdGllcyB0aGF0IHJlcXVpcmUgYSBtaW5pbXVtIG9mCisgKiAxIGVkZ2UuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiBmb3Igd2hpY2ggdGhlIG11bHRpcGxpY2l0aWVzIHNob3VsZCBiZSBjaGVja2VkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRDZWxsVmFsaWRhdGlvbkVycm9yID0gZnVuY3Rpb24oY2VsbCkKK3sKKwl2YXIgb3V0Q291bnQgPSB0aGlzLm1vZGVsLmdldERpcmVjdGVkRWRnZUNvdW50KGNlbGwsIHRydWUpOworCXZhciBpbkNvdW50ID0gdGhpcy5tb2RlbC5nZXREaXJlY3RlZEVkZ2VDb3VudChjZWxsLCBmYWxzZSk7CisJdmFyIHZhbHVlID0gdGhpcy5tb2RlbC5nZXRWYWx1ZShjZWxsKTsKKwl2YXIgZXJyb3IgPSAnJzsKKworCWlmICh0aGlzLm11bHRpcGxpY2l0aWVzICE9IG51bGwpCisJeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubXVsdGlwbGljaXRpZXMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBydWxlID0gdGhpcy5tdWx0aXBsaWNpdGllc1tpXTsKKwkJCQorCQkJaWYgKHJ1bGUuc291cmNlICYmIG14VXRpbHMuaXNOb2RlKHZhbHVlLCBydWxlLnR5cGUsCisJCQkJcnVsZS5hdHRyLCBydWxlLnZhbHVlKSAmJiAob3V0Q291bnQgPiBydWxlLm1heCB8fAorCQkJCW91dENvdW50IDwgcnVsZS5taW4pKQorCQkJeworCQkJCWVycm9yICs9IHJ1bGUuY291bnRFcnJvciArICdcbic7CisJCQl9CisJCQllbHNlIGlmICghcnVsZS5zb3VyY2UgJiYgbXhVdGlscy5pc05vZGUodmFsdWUsIHJ1bGUudHlwZSwKKwkJCQkJcnVsZS5hdHRyLCBydWxlLnZhbHVlKSAmJiAoaW5Db3VudCA+IHJ1bGUubWF4IHx8CisJCQkJCWluQ291bnQgPCBydWxlLm1pbikpCisJCQl7CisJCQkJZXJyb3IgKz0gcnVsZS5jb3VudEVycm9yICsgJ1xuJzsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAoZXJyb3IubGVuZ3RoID4gMCkgPyBlcnJvciA6IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB2YWxpZGF0ZUNlbGwKKyAqIAorICogSG9vayBtZXRob2QgZm9yIHN1YmNsYXNzZXJzIHRvIHJldHVybiBhbiBlcnJvciBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4KKyAqIGNlbGwgYW5kIHZhbGlkYXRpb24gY29udGV4dC4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuIEFueSBIVE1MCisgKiBicmVha3Mgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gbGluZWZlZWRzIGluIHRoZSBjYWxsaW5nIG1ldGhvZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgY2VsbCB0byB2YWxpZGF0ZS4KKyAqIGNvbnRleHQgLSBPYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBnbG9iYWwgdmFsaWRhdGlvbiBzdGF0ZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUudmFsaWRhdGVDZWxsID0gZnVuY3Rpb24oY2VsbCwgY29udGV4dCkKK3sKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogR3JvdXA6IEdyYXBoIGFwcGVhcmFuY2UKKyAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRCYWNrZ3JvdW5kSW1hZ2UKKyAqIAorICogUmV0dXJucyB0aGUgPGJhY2tncm91bmRJbWFnZT4gYXMgYW4gPG14SW1hZ2U+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRCYWNrZ3JvdW5kSW1hZ2UgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuYmFja2dyb3VuZEltYWdlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0QmFja2dyb3VuZEltYWdlCisgKiAKKyAqIFNldHMgdGhlIG5ldyA8YmFja2dyb3VuZEltYWdlPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogaW1hZ2UgLSBOZXcgPG14SW1hZ2U+IHRvIGJlIHVzZWQgZm9yIHRoZSBiYWNrZ3JvdW5kLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZXRCYWNrZ3JvdW5kSW1hZ2UgPSBmdW5jdGlvbihpbWFnZSkKK3sKKwl0aGlzLmJhY2tncm91bmRJbWFnZSA9IGltYWdlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Rm9sZGluZ0ltYWdlCisgKiAKKyAqIFJldHVybnMgdGhlIDxteEltYWdlPiB1c2VkIHRvIGRpc3BsYXkgdGhlIGNvbGxhcHNlZCBzdGF0ZSBvZgorICogdGhlIHNwZWNpZmllZCBjZWxsIHN0YXRlLiBUaGlzIHJldHVybnMgbnVsbCBmb3IgYWxsIGVkZ2VzLgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRGb2xkaW5nSW1hZ2UgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlpZiAoc3RhdGUgIT0gbnVsbCAmJiB0aGlzLmZvbGRpbmdFbmFibGVkICYmICF0aGlzLmdldE1vZGVsKCkuaXNFZGdlKHN0YXRlLmNlbGwpKQorCXsKKwkJdmFyIHRtcCA9IHRoaXMuaXNDZWxsQ29sbGFwc2VkKHN0YXRlLmNlbGwpOworCQkKKwkJaWYgKHRoaXMuaXNDZWxsRm9sZGFibGUoc3RhdGUuY2VsbCwgIXRtcCkpCisJCXsKKwkJCXJldHVybiAodG1wKSA/IHRoaXMuY29sbGFwc2VkSW1hZ2UgOiB0aGlzLmV4cGFuZGVkSW1hZ2U7CisJCX0KKwl9CisJCisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjb252ZXJ0VmFsdWVUb1N0cmluZworICogCisgKiBSZXR1cm5zIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgZ2l2ZW4gY2VsbC4gVGhpcworICogaW1wbGVtZW50YXRpb24gcmV0dXJucyB0aGUgbm9kZW5hbWUgb3Igc3RyaW5nLXJlcHJlc2VudGF0aW9uIG9mIHRoZSB1c2VyCisgKiBvYmplY3QuCisgKgorICogRXhhbXBsZToKKyAqIAorICogVGhlIGZvbGxvd2luZyByZXR1cm5zIHRoZSBsYWJlbCBhdHRyaWJ1dGUgZnJvbSB0aGUgY2VsbHMgdXNlcgorICogb2JqZWN0IGlmIGl0IGlzIGFuIFhNTCBub2RlLgorICogCisgKiAoY29kZSkKKyAqIGdyYXBoLmNvbnZlcnRWYWx1ZVRvU3RyaW5nID0gZnVuY3Rpb24oY2VsbCkKKyAqIHsKKyAqIAlyZXR1cm4gY2VsbC5nZXRBdHRyaWJ1dGUoJ2xhYmVsJyk7CisgKiB9CisgKiAoZW5kKQorICogCisgKiBTZWUgYWxzbzogPGNlbGxMYWJlbENoYW5nZWQ+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNvbnZlcnRWYWx1ZVRvU3RyaW5nID0gZnVuY3Rpb24oY2VsbCkKK3sKKwl2YXIgdmFsdWUgPSB0aGlzLm1vZGVsLmdldFZhbHVlKGNlbGwpOworCQorCWlmICh2YWx1ZSAhPSBudWxsKQorCXsKKwkJaWYgKG14VXRpbHMuaXNOb2RlKHZhbHVlKSkKKwkJeworCQkJcmV0dXJuIHZhbHVlLm5vZGVOYW1lOworCQl9CisJCWVsc2UgaWYgKHR5cGVvZih2YWx1ZS50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJykKKwkJeworCQkJcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7CisJCX0KKwl9CisJCisJcmV0dXJuICcnOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0TGFiZWwKKyAqIAorICogUmV0dXJucyBhIHN0cmluZyBvciBET00gbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGxhYmVsIGZvciB0aGUgZ2l2ZW4KKyAqIGNlbGwuIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyA8Y29udmVydFZhbHVlVG9TdHJpbmc+IGlmIDxsYWJlbHNWaXNpYmxlPgorICogaXMgdHJ1ZS4gT3RoZXJ3aXNlIGl0IHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgorICogCisgKiBUbyB0cnVuY2F0ZSBhIGxhYmVsIHRvIG1hdGNoIHRoZSBzaXplIG9mIHRoZSBjZWxsLCB0aGUgZm9sbG93aW5nIGNvZGUKKyAqIGNhbiBiZSB1c2VkLgorICogCisgKiAoY29kZSkKKyAqIGdyYXBoLmdldExhYmVsID0gZnVuY3Rpb24oY2VsbCkKKyAqIHsKKyAqICAgdmFyIGxhYmVsID0gbXhHcmFwaC5wcm90b3R5cGUuZ2V0TGFiZWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKyAqIAorICogICBpZiAobGFiZWwgIT0gbnVsbCAmJiB0aGlzLm1vZGVsLmlzVmVydGV4KGNlbGwpKQorICogICB7CisgKiAgICAgdmFyIGdlbyA9IHRoaXMuZ2V0Q2VsbEdlb21ldHJ5KGNlbGwpOworICogCisgKiAgICAgaWYgKGdlbyAhPSBudWxsKQorICogICAgIHsKKyAqICAgICAgIHZhciBtYXggPSBwYXJzZUludChnZW8ud2lkdGggLyA4KTsKKyAqIAorICogICAgICAgaWYgKGxhYmVsLmxlbmd0aCA+IG1heCkKKyAqICAgICAgIHsKKyAqICAgICAgICAgbGFiZWwgPSBsYWJlbC5zdWJzdHJpbmcoMCwgbWF4KSsnLi4uJzsKKyAqICAgICAgIH0KKyAqICAgICB9CisgKiAgIH0gCisgKiAgIHJldHVybiBteFV0aWxzLmh0bWxFbnRpdGllcyhsYWJlbCk7CisgKiB9CisgKiAoZW5kKQorICogCisgKiBBIHJlc2l6ZSBsaXN0ZW5lciBpcyBuZWVkZWQgaW4gdGhlIGdyYXBoIHRvIGZvcmNlIGEgcmVwYWludCBvZiB0aGUgbGFiZWwKKyAqIGFmdGVyIGEgcmVzaXplLgorICogCisgKiAoY29kZSkKKyAqIGdyYXBoLmFkZExpc3RlbmVyKG14RXZlbnQuUkVTSVpFX0NFTExTLCBmdW5jdGlvbihzZW5kZXIsIGV2dCkKKyAqIHsKKyAqICAgdmFyIGNlbGxzID0gZXZ0LmdldFByb3BlcnR5KCdjZWxscycpOworICogCisgKiAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisgKiAgIHsKKyAqICAgICB0aGlzLnZpZXcucmVtb3ZlU3RhdGUoY2VsbHNbaV0pOworICogICB9CisgKiB9KTsKKyAqIChlbmQpCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBsYWJlbCBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldExhYmVsID0gZnVuY3Rpb24oY2VsbCkKK3sKKwl2YXIgcmVzdWx0ID0gJyc7CisJCisJaWYgKHRoaXMubGFiZWxzVmlzaWJsZSAmJiBjZWxsICE9IG51bGwpCisJeworCQl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoY2VsbCk7CisJCXZhciBzdHlsZSA9IChzdGF0ZSAhPSBudWxsKSA/IHN0YXRlLnN0eWxlIDogdGhpcy5nZXRDZWxsU3R5bGUoY2VsbCk7CisJCQorCQlpZiAoIW14VXRpbHMuZ2V0VmFsdWUoc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX05PTEFCRUwsIGZhbHNlKSkKKwkJeworCQkJcmVzdWx0ID0gdGhpcy5jb252ZXJ0VmFsdWVUb1N0cmluZyhjZWxsKTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gcmVzdWx0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNIdG1sTGFiZWwKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBsYWJlbCBtdXN0IGJlIHJlbmRlcmVkIGFzIEhUTUwgbWFya3VwLiBUaGUgZGVmYXVsdAorICogaW1wbGVtZW50YXRpb24gcmV0dXJucyA8aHRtbExhYmVscz4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBsYWJlbCBzaG91bGQgYmUgZGlzcGxheWVkIGFzIEhUTUwgbWFya3VwLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0h0bWxMYWJlbCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIHRoaXMuaXNIdG1sTGFiZWxzKCk7Cit9OworIAorLyoqCisgKiBGdW5jdGlvbjogaXNIdG1sTGFiZWxzCisgKiAKKyAqIFJldHVybnMgPGh0bWxMYWJlbHM+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0h0bWxMYWJlbHMgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuaHRtbExhYmVsczsKK307CisgCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRIdG1sTGFiZWxzCisgKiAKKyAqIFNldHMgPGh0bWxMYWJlbHM+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZXRIdG1sTGFiZWxzID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5odG1sTGFiZWxzID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1dyYXBwaW5nCisgKiAKKyAqIFRoaXMgZW5hYmxlcyB3cmFwcGluZyBmb3IgSFRNTCBsYWJlbHMuCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiBubyB3aGl0ZS1zcGFjZSBDU1Mgc3R5bGUgZGlyZWN0aXZlIHNob3VsZCBiZSB1c2VkIGZvcgorICogZGlzcGxheWluZyB0aGUgZ2l2ZW4gY2VsbHMgbGFiZWwuIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmCisgKiA8bXhDb25zdGFudHMuU1RZTEVfV0hJVEVfU1BBQ0U+IGluIHRoZSBzdHlsZSBvZiB0aGUgZ2l2ZW4gY2VsbCBpcyAnd3JhcCcuCisgKiAKKyAqIFRoaXMgaXMgdXNlZCBhcyBhIHdvcmthcm91bmQgZm9yIElFIGlnbm9yaW5nIHRoZSB3aGl0ZS1zcGFjZSBkaXJlY3RpdmUKKyAqIG9mIGNoaWxkIGVsZW1lbnRzIGlmIHRoZSBkaXJlY3RpdmUgYXBwZWFycyBpbiBhIHBhcmVudCBlbGVtZW50LiBJdAorICogc2hvdWxkIGJlIG92ZXJyaWRkZW4gdG8gcmV0dXJuIHRydWUgaWYgYSB3aGl0ZS1zcGFjZSBkaXJlY3RpdmUgaXMgdXNlZAorICogaW4gdGhlIEhUTUwgbWFya3VwIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gY2VsbHMgbGFiZWwuIEluIG9yZGVyIGZvcgorICogSFRNTCBtYXJrdXAgdG8gd29yayBpbiBsYWJlbHMsIDxpc0h0bWxMYWJlbD4gbXVzdCBhbHNvIHJldHVybiB0cnVlCisgKiBmb3IgdGhlIGdpdmVuIGNlbGwuCisgKiAKKyAqIEV4YW1wbGU6CisgKiAKKyAqIChjb2RlKQorICogZ3JhcGguZ2V0TGFiZWwgPSBmdW5jdGlvbihjZWxsKQorICogeworICogICB2YXIgdG1wID0gbXhHcmFwaC5wcm90b3R5cGUuZ2V0TGFiZWwuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gInN1cGVyY2FsbCIKKyAqICAgCisgKiAgIGlmICh0aGlzLm1vZGVsLmlzRWRnZShjZWxsKSkKKyAqICAgeworICogICAgIHRtcCA9ICc8ZGl2IHN0eWxlPSJ3aWR0aDogMTUwcHg7IHdoaXRlLXNwYWNlOm5vcm1hbDsiPicrdG1wKyc8L2Rpdj4nOworICogICB9CisgKiAgIAorICogICByZXR1cm4gdG1wOworICogfQorICogCisgKiBncmFwaC5pc1dyYXBwaW5nID0gZnVuY3Rpb24oc3RhdGUpCisgKiB7CisgKiAJIHJldHVybiB0aGlzLm1vZGVsLmlzRWRnZShzdGF0ZS5jZWxsKTsKKyAqIH0KKyAqIChlbmQpCisgKiAKKyAqIE1ha2VzIHN1cmUgbm8gZWRnZSBsYWJlbCBpcyB3aWRlciB0aGFuIDE1MCBwaXhlbHMsIG90aGVyd2lzZSB0aGUgY29udGVudAorICogaXMgd3JhcHBlZC4gTm90ZTogTm8gd2lkdGggbXVzdCBiZSBzcGVjaWZpZWQgZm9yIHdyYXBwZWQgdmVydGV4IGxhYmVscyBhcworICogdGhlIHZlcnRleCBkZWZpbmVzIHRoZSB3aWR0aCBpbiBpdHMgZ2VvbWV0cnkuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbD4gd2hvc2UgbGFiZWwgc2hvdWxkIGJlIHdyYXBwZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzV3JhcHBpbmcgPSBmdW5jdGlvbihjZWxsKQoreworCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShjZWxsKTsKKwl2YXIgc3R5bGUgPSAoc3RhdGUgIT0gbnVsbCkgPyBzdGF0ZS5zdHlsZSA6IHRoaXMuZ2V0Q2VsbFN0eWxlKGNlbGwpOworCisJcmV0dXJuIChzdHlsZSAhPSBudWxsKSA/IHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1dISVRFX1NQQUNFXSA9PSAnd3JhcCcgOiBmYWxzZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzTGFiZWxDbGlwcGVkCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb3ZlcmZsb3cgcG9ydGlvbiBvZiBsYWJlbHMgc2hvdWxkIGJlIGhpZGRlbi4gSWYgdGhpcworICogcmV0dXJucyB0cnVlIHRoZW4gdmVydGV4IGxhYmVscyB3aWxsIGJlIGNsaXBwZWQgdG8gdGhlIHNpemUgb2YgdGhlIHZlcnRpY2VzLgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgaWYgPG14Q29uc3RhbnRzLlNUWUxFX09WRVJGTE9XPiBpbiB0aGUKKyAqIHN0eWxlIG9mIHRoZSBnaXZlbiBjZWxsIGlzICdoaWRkZW4nLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGw+IHdob3NlIGxhYmVsIHNob3VsZCBiZSBjbGlwcGVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0xhYmVsQ2xpcHBlZCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJdmFyIHN0YXRlID0gdGhpcy52aWV3LmdldFN0YXRlKGNlbGwpOworCXZhciBzdHlsZSA9IChzdGF0ZSAhPSBudWxsKSA/IHN0YXRlLnN0eWxlIDogdGhpcy5nZXRDZWxsU3R5bGUoY2VsbCk7CisKKwlyZXR1cm4gKHN0eWxlICE9IG51bGwpID8gc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfT1ZFUkZMT1ddID09ICdoaWRkZW4nIDogZmFsc2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRUb29sdGlwCisgKiAKKyAqIFJldHVybnMgdGhlIHN0cmluZyBvciBET00gbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIHRvb2x0aXAgZm9yIHRoZSBnaXZlbgorICogc3RhdGUsIG5vZGUgYW5kIGNvb3JkaW5hdGUgcGFpci4gVGhpcyBpbXBsZW1lbnRhdGlvbiBjaGVja3MgaWYgdGhlIGdpdmVuCisgKiBub2RlIGlzIGEgZm9sZGluZyBpY29uIG9yIG92ZXJsYXkgYW5kIHJldHVybnMgdGhlIHJlc3BlY3RpdmUgdG9vbHRpcC4gSWYKKyAqIHRoaXMgZG9lcyBub3QgcmVzdWx0IGluIGEgdG9vbHRpcCwgdGhlIGhhbmRsZXIgZm9yIHRoZSBjZWxsIGlzIHJldHJpZXZlZAorICogZnJvbSA8c2VsZWN0aW9uQ2VsbHNIYW5kbGVyPiBhbmQgdGhlIG9wdGlvbmFsIGdldFRvb2x0aXBGb3JOb2RlIG1ldGhvZCBpcworICogY2FsbGVkLiBJZiBubyBzcGVjaWFsIHRvb2x0aXAgZXhpc3RzIGhlcmUgdGhlbiA8Z2V0VG9vbHRpcEZvckNlbGw+IGlzIHVzZWQKKyAqIHdpdGggdGhlIGNlbGwgaW4gdGhlIGdpdmVuIHN0YXRlIGFzIHRoZSBhcmd1bWVudCB0byByZXR1cm4gYSB0b29sdGlwIGZvciB0aGUKKyAqIGdpdmVuIHN0YXRlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gd2hvc2UgdG9vbHRpcCBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiBub2RlIC0gRE9NIG5vZGUgdGhhdCBpcyBjdXJyZW50bHkgdW5kZXIgdGhlIG1vdXNlLgorICogeCAtIFgtY29vcmRpbmF0ZSBvZiB0aGUgbW91c2UuCisgKiB5IC0gWS1jb29yZGluYXRlIG9mIHRoZSBtb3VzZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0VG9vbHRpcCA9IGZ1bmN0aW9uKHN0YXRlLCBub2RlLCB4LCB5KQoreworCXZhciB0aXAgPSBudWxsOworCQorCWlmIChzdGF0ZSAhPSBudWxsKQorCXsKKwkJLy8gQ2hlY2tzIGlmIHRoZSBtb3VzZSBpcyBvdmVyIHRoZSBmb2xkaW5nIGljb24KKwkJaWYgKHN0YXRlLmNvbnRyb2wgIT0gbnVsbCAmJiAobm9kZSA9PSBzdGF0ZS5jb250cm9sLm5vZGUgfHwKKwkJCW5vZGUucGFyZW50Tm9kZSA9PSBzdGF0ZS5jb250cm9sLm5vZGUpKQorCQl7CisJCQl0aXAgPSB0aGlzLmNvbGxhcHNlRXhwYW5kUmVzb3VyY2U7CisJCQl0aXAgPSBteFV0aWxzLmh0bWxFbnRpdGllcyhteFJlc291cmNlcy5nZXQodGlwKSB8fCB0aXApLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpOworCQl9CisKKwkJaWYgKHRpcCA9PSBudWxsICYmIHN0YXRlLm92ZXJsYXlzICE9IG51bGwpCisJCXsKKwkJCXN0YXRlLm92ZXJsYXlzLnZpc2l0KGZ1bmN0aW9uKGlkLCBzaGFwZSkKKwkJCXsKKwkJCQkvLyBMQVRFUjogRXhpdCBsb29wIGlmIHRpcCBpcyBub3QgbnVsbAorCQkJCWlmICh0aXAgPT0gbnVsbCAmJiAobm9kZSA9PSBzaGFwZS5ub2RlIHx8IG5vZGUucGFyZW50Tm9kZSA9PSBzaGFwZS5ub2RlKSkKKwkJCQl7CisJCQkJCXRpcCA9IHNoYXBlLm92ZXJsYXkudG9TdHJpbmcoKTsKKwkJCQl9CisJCQl9KTsKKwkJfQorCQkKKwkJaWYgKHRpcCA9PSBudWxsKQorCQl7CisJCQl2YXIgaGFuZGxlciA9IHRoaXMuc2VsZWN0aW9uQ2VsbHNIYW5kbGVyLmdldEhhbmRsZXIoc3RhdGUuY2VsbCk7CisJCQkKKwkJCWlmIChoYW5kbGVyICE9IG51bGwgJiYgdHlwZW9mKGhhbmRsZXIuZ2V0VG9vbHRpcEZvck5vZGUpID09ICdmdW5jdGlvbicpCisJCQl7CisJCQkJdGlwID0gaGFuZGxlci5nZXRUb29sdGlwRm9yTm9kZShub2RlKTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKHRpcCA9PSBudWxsKQorCQl7CisJCQl0aXAgPSB0aGlzLmdldFRvb2x0aXBGb3JDZWxsKHN0YXRlLmNlbGwpOworCQl9CisJfQorCQorCXJldHVybiB0aXA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRUb29sdGlwRm9yQ2VsbAorICogCisgKiBSZXR1cm5zIHRoZSBzdHJpbmcgb3IgRE9NIG5vZGUgdG8gYmUgdXNlZCBhcyB0aGUgdG9vbHRpcCBmb3IgdGhlIGdpdmVuCisgKiBjZWxsLiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIGNlbGxzIGdldFRvb2x0aXAgZnVuY3Rpb24gaWYgaXQKKyAqIGV4aXN0cywgb3IgZWxzZSBpdCByZXR1cm5zIDxjb252ZXJ0VmFsdWVUb1N0cmluZz4gZm9yIHRoZSBjZWxsLgorICogCisgKiBFeGFtcGxlOgorICogCisgKiAoY29kZSkKKyAqIGdyYXBoLmdldFRvb2x0aXBGb3JDZWxsID0gZnVuY3Rpb24oY2VsbCkKKyAqIHsKKyAqICAgcmV0dXJuICdIZWxsbywgV29ybGQhJzsKKyAqIH0KKyAqIChlbmQpCisgKiAKKyAqIFJlcGxhY2VzIGFsbCB0b29sdGlwcyB3aXRoIHRoZSBzdHJpbmcgSGVsbG8sIFdvcmxkIQorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgdG9vbHRpcCBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldFRvb2x0aXBGb3JDZWxsID0gZnVuY3Rpb24oY2VsbCkKK3sKKwl2YXIgdGlwID0gbnVsbDsKKwkKKwlpZiAoY2VsbCAhPSBudWxsICYmIGNlbGwuZ2V0VG9vbHRpcCAhPSBudWxsKQorCXsKKwkJdGlwID0gY2VsbC5nZXRUb29sdGlwKCk7CisJfQorCWVsc2UKKwl7CisJCXRpcCA9IHRoaXMuY29udmVydFZhbHVlVG9TdHJpbmcoY2VsbCk7CisJfQorCQorCXJldHVybiB0aXA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDdXJzb3JGb3JNb3VzZUV2ZW50CisgKiAKKyAqIFJldHVybnMgdGhlIGN1cnNvciB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgQ1NTIG9mIHRoZSBzaGFwZSBmb3IgdGhlCisgKiBnaXZlbiBldmVudC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBjYWxscyA8Z2V0Q3Vyc29yRm9yQ2VsbD4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIG1lIC0gPG14TW91c2VFdmVudD4gd2hvc2UgY3Vyc29yIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0Q3Vyc29yRm9yTW91c2VFdmVudCA9IGZ1bmN0aW9uKG1lKQoreworCXJldHVybiB0aGlzLmdldEN1cnNvckZvckNlbGwobWUuZ2V0Q2VsbCgpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEN1cnNvckZvckNlbGwKKyAqIAorICogUmV0dXJucyB0aGUgY3Vyc29yIHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBDU1Mgb2YgdGhlIHNoYXBlIGZvciB0aGUKKyAqIGdpdmVuIGNlbGwuIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgY3Vyc29yIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0Q3Vyc29yRm9yQ2VsbCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTdGFydFNpemUKKyAqIAorICogUmV0dXJucyB0aGUgc3RhcnQgc2l6ZSBvZiB0aGUgZ2l2ZW4gc3dpbWxhbmUsIHRoYXQgaXMsIHRoZSB3aWR0aCBvcgorICogaGVpZ2h0IG9mIHRoZSBwYXJ0IHRoYXQgY29udGFpbnMgdGhlIHRpdGxlLCBkZXBlbmRpbmcgb24gdGhlCisgKiBob3Jpem9udGFsIHN0eWxlLiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIDxteFJlY3RhbmdsZT4gd2l0aCBlaXRoZXIKKyAqIHdpZHRoIG9yIGhlaWdodCBzZXQgYXMgYXBwcm9wcmlhdGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN3aW1sYW5lIC0gPG14Q2VsbD4gd2hvc2Ugc3RhcnQgc2l6ZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldFN0YXJ0U2l6ZSA9IGZ1bmN0aW9uKHN3aW1sYW5lKQoreworCXZhciByZXN1bHQgPSBuZXcgbXhSZWN0YW5nbGUoKTsKKwl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoc3dpbWxhbmUpOworCXZhciBzdHlsZSA9IChzdGF0ZSAhPSBudWxsKSA/IHN0YXRlLnN0eWxlIDogdGhpcy5nZXRDZWxsU3R5bGUoc3dpbWxhbmUpOworCQorCWlmIChzdHlsZSAhPSBudWxsKQorCXsKKwkJdmFyIHNpemUgPSBwYXJzZUludChteFV0aWxzLmdldFZhbHVlKHN0eWxlLAorCQkJbXhDb25zdGFudHMuU1RZTEVfU1RBUlRTSVpFLCBteENvbnN0YW50cy5ERUZBVUxUX1NUQVJUU0laRSkpOworCQkKKwkJaWYgKG14VXRpbHMuZ2V0VmFsdWUoc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0hPUklaT05UQUwsIHRydWUpKQorCQl7CisJCQlyZXN1bHQuaGVpZ2h0ID0gc2l6ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJlc3VsdC53aWR0aCA9IHNpemU7CisJCX0KKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEltYWdlCisgKiAKKyAqIFJldHVybnMgdGhlIGltYWdlIFVSTCBmb3IgdGhlIGdpdmVuIGNlbGwgc3RhdGUuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIHJldHVybnMgdGhlIHZhbHVlIHN0b3JlZCB1bmRlciA8bXhDb25zdGFudHMuU1RZTEVfSU1BR0U+IGluIHRoZSBjZWxsCisgKiBzdHlsZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHdob3NlIGltYWdlIFVSTCBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldEltYWdlID0gZnVuY3Rpb24oc3RhdGUpCit7CisJcmV0dXJuIChzdGF0ZSAhPSBudWxsICYmIHN0YXRlLnN0eWxlICE9IG51bGwpID8gc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfSU1BR0VdIDogbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFZlcnRpY2FsQWxpZ24KKyAqIAorICogUmV0dXJucyB0aGUgdmVydGljYWwgYWxpZ25tZW50IGZvciB0aGUgZ2l2ZW4gY2VsbCBzdGF0ZS4gVGhpcworICogaW1wbGVtZW50YXRpb24gcmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkIHVuZGVyCisgKiA8bXhDb25zdGFudHMuU1RZTEVfVkVSVElDQUxfQUxJR04+IGluIHRoZSBjZWxsIHN0eWxlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gd2hvc2UgdmVydGljYWwgYWxpZ25tZW50IHNob3VsZCBiZQorICogcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldFZlcnRpY2FsQWxpZ24gPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlyZXR1cm4gKHN0YXRlICE9IG51bGwgJiYgc3RhdGUuc3R5bGUgIT0gbnVsbCkgPworCQkoc3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfVkVSVElDQUxfQUxJR05dIHx8CisJCW14Q29uc3RhbnRzLkFMSUdOX01JRERMRSkgOiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0SW5kaWNhdG9yQ29sb3IKKyAqIAorICogUmV0dXJucyB0aGUgaW5kaWNhdG9yIGNvbG9yIGZvciB0aGUgZ2l2ZW4gY2VsbCBzdGF0ZS4gVGhpcworICogaW1wbGVtZW50YXRpb24gcmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkIHVuZGVyCisgKiA8bXhDb25zdGFudHMuU1RZTEVfSU5ESUNBVE9SX0NPTE9SPiBpbiB0aGUgY2VsbCBzdHlsZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHdob3NlIGluZGljYXRvciBjb2xvciBzaG91bGQgYmUKKyAqIHJldHVybmVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRJbmRpY2F0b3JDb2xvciA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXJldHVybiAoc3RhdGUgIT0gbnVsbCAmJiBzdGF0ZS5zdHlsZSAhPSBudWxsKSA/IHN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0lORElDQVRPUl9DT0xPUl0gOiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0SW5kaWNhdG9yR3JhZGllbnRDb2xvcgorICogCisgKiBSZXR1cm5zIHRoZSBpbmRpY2F0b3IgZ3JhZGllbnQgY29sb3IgZm9yIHRoZSBnaXZlbiBjZWxsIHN0YXRlLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBzdG9yZWQgdW5kZXIKKyAqIDxteENvbnN0YW50cy5TVFlMRV9JTkRJQ0FUT1JfR1JBRElFTlRDT0xPUj4gaW4gdGhlIGNlbGwgc3R5bGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB3aG9zZSBpbmRpY2F0b3IgZ3JhZGllbnQgY29sb3Igc2hvdWxkIGJlCisgKiByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0SW5kaWNhdG9yR3JhZGllbnRDb2xvciA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXJldHVybiAoc3RhdGUgIT0gbnVsbCAmJiBzdGF0ZS5zdHlsZSAhPSBudWxsKSA/IHN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0lORElDQVRPUl9HUkFESUVOVENPTE9SXSA6IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRJbmRpY2F0b3JTaGFwZQorICogCisgKiBSZXR1cm5zIHRoZSBpbmRpY2F0b3Igc2hhcGUgZm9yIHRoZSBnaXZlbiBjZWxsIHN0YXRlLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBzdG9yZWQgdW5kZXIKKyAqIDxteENvbnN0YW50cy5TVFlMRV9JTkRJQ0FUT1JfU0hBUEU+IGluIHRoZSBjZWxsIHN0eWxlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gd2hvc2UgaW5kaWNhdG9yIHNoYXBlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0SW5kaWNhdG9yU2hhcGUgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlyZXR1cm4gKHN0YXRlICE9IG51bGwgJiYgc3RhdGUuc3R5bGUgIT0gbnVsbCkgPyBzdGF0ZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9JTkRJQ0FUT1JfU0hBUEVdIDogbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEluZGljYXRvckltYWdlCisgKiAKKyAqIFJldHVybnMgdGhlIGluZGljYXRvciBpbWFnZSBmb3IgdGhlIGdpdmVuIGNlbGwgc3RhdGUuIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIHZhbHVlIHN0b3JlZCB1bmRlcgorICogPG14Q29uc3RhbnRzLlNUWUxFX0lORElDQVRPUl9JTUFHRT4gaW4gdGhlIGNlbGwgc3R5bGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB3aG9zZSBpbmRpY2F0b3IgaW1hZ2Ugc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRJbmRpY2F0b3JJbWFnZSA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXJldHVybiAoc3RhdGUgIT0gbnVsbCAmJiBzdGF0ZS5zdHlsZSAhPSBudWxsKSA/IHN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0lORElDQVRPUl9JTUFHRV0gOiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Qm9yZGVyCisgKiAKKyAqIFJldHVybnMgdGhlIHZhbHVlIG9mIDxib3JkZXI+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRCb3JkZXIgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuYm9yZGVyOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0Qm9yZGVyCisgKiAKKyAqIFNldHMgdGhlIHZhbHVlIG9mIDxib3JkZXI+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIFBvc2l0aXZlIGludGVnZXIgdGhhdCByZXByZXNlbnRzIHRoZSBib3JkZXIgdG8gYmUgdXNlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0Qm9yZGVyID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5ib3JkZXIgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzU3dpbWxhbmUKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjZWxsIGlzIGEgc3dpbWxhbmUgaW4gdGhlIGdyYXBoLiBBIHN3aW1sYW5lIGlzCisgKiBhIGNvbnRhaW5lciBjZWxsIHdpdGggc29tZSBzcGVjaWZpYyBiZWhhdmlvdXIuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIGNoZWNrcyBpZiB0aGUgc2hhcGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBjZWxsIGlzIGEgPG14U3dpbWxhbmU+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdG8gYmUgY2hlY2tlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNTd2ltbGFuZSA9IGZ1bmN0aW9uIChjZWxsKQoreworCWlmIChjZWxsICE9IG51bGwpCisJeworCQlpZiAodGhpcy5tb2RlbC5nZXRQYXJlbnQoY2VsbCkgIT0gdGhpcy5tb2RlbC5nZXRSb290KCkpCisJCXsKKwkJCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShjZWxsKTsKKwkJCXZhciBzdHlsZSA9IChzdGF0ZSAhPSBudWxsKSA/IHN0YXRlLnN0eWxlIDogdGhpcy5nZXRDZWxsU3R5bGUoY2VsbCk7CisKKwkJCWlmIChzdHlsZSAhPSBudWxsICYmICF0aGlzLm1vZGVsLmlzRWRnZShjZWxsKSkKKwkJCXsKKwkJCQlyZXR1cm4gc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU0hBUEVdID09IG14Q29uc3RhbnRzLlNIQVBFX1NXSU1MQU5FOworCQkJfQorCQl9CisJfQorCQorCXJldHVybiBmYWxzZTsKK307CisKKy8qKgorICogR3JvdXA6IEdyYXBoIGJlaGF2aW91cgorICovCisKKy8qKgorICogRnVuY3Rpb246IGlzUmVzaXplQ29udGFpbmVyCisgKiAKKyAqIFJldHVybnMgPHJlc2l6ZUNvbnRhaW5lcj4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzUmVzaXplQ29udGFpbmVyID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLnJlc2l6ZUNvbnRhaW5lcjsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFJlc2l6ZUNvbnRhaW5lcgorICogCisgKiBTZXRzIDxyZXNpemVDb250YWluZXI+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY29udGFpbmVyIHNob3VsZCBiZSByZXNpemVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZXRSZXNpemVDb250YWluZXIgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLnJlc2l6ZUNvbnRhaW5lciA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFbmFibGVkCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ3JhcGggaXMgPGVuYWJsZWQ+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuZW5hYmxlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBncmFwaCBzaG91bGQgYWxsb3cgYW55IGludGVyYWN0aW9ucy4gVGhpcworICogaW1wbGVtZW50YXRpb24gdXBkYXRlcyA8ZW5hYmxlZD4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbHVlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBncmFwaCBzaG91bGQgYmUgZW5hYmxlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0RW5hYmxlZCA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuZW5hYmxlZCA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFc2NhcGVFbmFibGVkCisgKiAKKyAqIFJldHVybnMgPGVzY2FwZUVuYWJsZWQ+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0VzY2FwZUVuYWJsZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuZXNjYXBlRW5hYmxlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEVzY2FwZUVuYWJsZWQKKyAqIAorICogU2V0cyA8ZXNjYXBlRW5hYmxlZD4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGVuYWJsZWQgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgZXNjYXBlIHNob3VsZCBiZSBlbmFibGVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZXRFc2NhcGVFbmFibGVkID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5lc2NhcGVFbmFibGVkID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0ludm9rZXNTdG9wQ2VsbEVkaXRpbmcKKyAqIAorICogUmV0dXJucyA8aW52b2tlc1N0b3BDZWxsRWRpdGluZz4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzSW52b2tlc1N0b3BDZWxsRWRpdGluZyA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5pbnZva2VzU3RvcENlbGxFZGl0aW5nOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0SW52b2tlc1N0b3BDZWxsRWRpdGluZworICogCisgKiBTZXRzIDxpbnZva2VzU3RvcENlbGxFZGl0aW5nPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0SW52b2tlc1N0b3BDZWxsRWRpdGluZyA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuaW52b2tlc1N0b3BDZWxsRWRpdGluZyA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFbnRlclN0b3BzQ2VsbEVkaXRpbmcKKyAqIAorICogUmV0dXJucyA8ZW50ZXJTdG9wc0NlbGxFZGl0aW5nPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNFbnRlclN0b3BzQ2VsbEVkaXRpbmcgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuZW50ZXJTdG9wc0NlbGxFZGl0aW5nOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0RW50ZXJTdG9wc0NlbGxFZGl0aW5nCisgKiAKKyAqIFNldHMgPGVudGVyU3RvcHNDZWxsRWRpdGluZz4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldEVudGVyU3RvcHNDZWxsRWRpdGluZyA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuZW50ZXJTdG9wc0NlbGxFZGl0aW5nID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NlbGxMb2NrZWQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjZWxsIG1heSBub3QgYmUgbW92ZWQsIHNpemVkLCBiZW5kZWQsCisgKiBkaXNjb25uZWN0ZWQsIGVkaXRlZCBvciBzZWxlY3RlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgZm9yCisgKiBhbGwgdmVydGljZXMgd2l0aCBhIHJlbGF0aXZlIGdlb21ldHJ5IGlmIDxsb2NrZWQ+IGlzIGZhbHNlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgbG9ja2VkIHN0YXRlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNDZWxsTG9ja2VkID0gZnVuY3Rpb24oY2VsbCkKK3sKKwl2YXIgZ2VvbWV0cnkgPSB0aGlzLm1vZGVsLmdldEdlb21ldHJ5KGNlbGwpOworCQorCXJldHVybiB0aGlzLmlzQ2VsbHNMb2NrZWQoKSB8fCAoZ2VvbWV0cnkgIT0gbnVsbCAmJiB0aGlzLm1vZGVsLmlzVmVydGV4KGNlbGwpICYmIGdlb21ldHJ5LnJlbGF0aXZlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQ2VsbHNMb2NrZWQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjZWxsIG1heSBub3QgYmUgbW92ZWQsIHNpemVkLCBiZW5kZWQsCisgKiBkaXNjb25uZWN0ZWQsIGVkaXRlZCBvciBzZWxlY3RlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgZm9yCisgKiBhbGwgdmVydGljZXMgd2l0aCBhIHJlbGF0aXZlIGdlb21ldHJ5IGlmIDxsb2NrZWQ+IGlzIGZhbHNlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgbG9ja2VkIHN0YXRlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNDZWxsc0xvY2tlZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5jZWxsc0xvY2tlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldExvY2tlZAorICogCisgKiBTZXRzIGlmIGFueSBjZWxsIG1heSBiZSBtb3ZlZCwgc2l6ZWQsIGJlbmRlZCwgZGlzY29ubmVjdGVkLCBlZGl0ZWQgb3IKKyAqIHNlbGVjdGVkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIEJvb2xlYW4gdGhhdCBkZWZpbmVzIHRoZSBuZXcgdmFsdWUgZm9yIDxjZWxsc0xvY2tlZD4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldENlbGxzTG9ja2VkID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5jZWxsc0xvY2tlZCA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q2xvbmVhYmxlQ2VsbHMKKyAqIAorICogUmV0dXJucyB0aGUgY2VsbHMgd2hpY2ggbWF5IGJlIGV4cG9ydGVkIGluIHRoZSBnaXZlbiBhcnJheSBvZiBjZWxscy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0Q2xvbmVhYmxlQ2VsbHMgPSBmdW5jdGlvbihjZWxscykKK3sKKwlyZXR1cm4gdGhpcy5tb2RlbC5maWx0ZXJDZWxscyhjZWxscywgbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGNlbGwpCisJeworCQlyZXR1cm4gdGhpcy5pc0NlbGxDbG9uZWFibGUoY2VsbCk7CisJfSkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDZWxsQ2xvbmVhYmxlCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbCBpcyBjbG9uZWFibGUuIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucworICogPGlzQ2VsbHNDbG9uZWFibGU+IGZvciBhbGwgY2VsbHMgdW5sZXNzIGEgY2VsbCBzdHlsZSBzcGVjaWZpZXMKKyAqIDxteENvbnN0YW50cy5TVFlMRV9DTE9ORUFCTEU+IHRvIGJlIDAuIAorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gT3B0aW9uYWwgPG14Q2VsbD4gd2hvc2UgY2xvbmVhYmxlIHN0YXRlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNDZWxsQ2xvbmVhYmxlID0gZnVuY3Rpb24oY2VsbCkKK3sKKwl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoY2VsbCk7CisJdmFyIHN0eWxlID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuc3R5bGUgOiB0aGlzLmdldENlbGxTdHlsZShjZWxsKTsKKworCXJldHVybiB0aGlzLmlzQ2VsbHNDbG9uZWFibGUoKSAmJiBzdHlsZVtteENvbnN0YW50cy5TVFlMRV9DTE9ORUFCTEVdICE9IDA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NlbGxzQ2xvbmVhYmxlCisgKiAKKyAqIFJldHVybnMgPGNlbGxzQ2xvbmVhYmxlPiwgdGhhdCBpcywgaWYgdGhlIGdyYXBoIGFsbG93cyBjbG9uaW5nIG9mIGNlbGxzCisgKiBieSB1c2luZyBjb250cm9sLWRyYWcuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzQ2VsbHNDbG9uZWFibGUgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuY2VsbHNDbG9uZWFibGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRDZWxsc0Nsb25lYWJsZQorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIGdyYXBoIHNob3VsZCBhbGxvdyBjbG9uaW5nIG9mIGNlbGxzIGJ5IGhvbGRpbmcgZG93biB0aGUKKyAqIGNvbnRyb2wga2V5IHdoaWxlIGNlbGxzIGFyZSBiZWluZyBtb3ZlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1cGRhdGVzCisgKiA8Y2VsbHNDbG9uZWFibGU+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgZ3JhcGggc2hvdWxkIGJlIGNsb25lYWJsZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0Q2VsbHNDbG9uZWFibGUgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmNlbGxzQ2xvbmVhYmxlID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRFeHBvcnRhYmxlQ2VsbHMKKyAqIAorICogUmV0dXJucyB0aGUgY2VsbHMgd2hpY2ggbWF5IGJlIGV4cG9ydGVkIGluIHRoZSBnaXZlbiBhcnJheSBvZiBjZWxscy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0RXhwb3J0YWJsZUNlbGxzID0gZnVuY3Rpb24oY2VsbHMpCit7CisJcmV0dXJuIHRoaXMubW9kZWwuZmlsdGVyQ2VsbHMoY2VsbHMsIG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihjZWxsKQorCXsKKwkJcmV0dXJuIHRoaXMuY2FuRXhwb3J0Q2VsbChjZWxsKTsKKwl9KSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjYW5FeHBvcnRDZWxsCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbCBtYXkgYmUgZXhwb3J0ZWQgdG8gdGhlIGNsaXBib2FyZC4gVGhpcworICogaW1wbGVtZW50YXRpb24gcmV0dXJucyA8ZXhwb3J0RW5hYmxlZD4gZm9yIGFsbCBjZWxscy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgY2VsbCB0byBiZSBleHBvcnRlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuY2FuRXhwb3J0Q2VsbCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIHRoaXMuZXhwb3J0RW5hYmxlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEltcG9ydGFibGVDZWxscworICogCisgKiBSZXR1cm5zIHRoZSBjZWxscyB3aGljaCBtYXkgYmUgaW1wb3J0ZWQgaW4gdGhlIGdpdmVuIGFycmF5IG9mIGNlbGxzLgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRJbXBvcnRhYmxlQ2VsbHMgPSBmdW5jdGlvbihjZWxscykKK3sKKwlyZXR1cm4gdGhpcy5tb2RlbC5maWx0ZXJDZWxscyhjZWxscywgbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGNlbGwpCisJeworCQlyZXR1cm4gdGhpcy5jYW5JbXBvcnRDZWxsKGNlbGwpOworCX0pKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNhbkltcG9ydENlbGwKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjZWxsIG1heSBiZSBpbXBvcnRlZCBmcm9tIHRoZSBjbGlwYm9hcmQuCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGltcG9ydEVuYWJsZWQ+IGZvciBhbGwgY2VsbHMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIGNlbGwgdG8gYmUgaW1wb3J0ZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNhbkltcG9ydENlbGwgPSBmdW5jdGlvbihjZWxsKQoreworCXJldHVybiB0aGlzLmltcG9ydEVuYWJsZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NlbGxTZWxlY3RhYmxlCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjZWxsIGlzIHNlbGVjdGFibGUuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIHJldHVybnMgPGNlbGxzU2VsZWN0YWJsZT4uCisgKiAKKyAqIFRvIGFkZCBhIG5ldyBzdHlsZSBmb3IgbWFraW5nIGNlbGxzICh1bilzZWxlY3RhYmxlLCB1c2UgdGhlIGZvbGxvd2luZyBjb2RlLgorICogCisgKiAoY29kZSkKKyAqIG14R3JhcGgucHJvdG90eXBlLmlzQ2VsbFNlbGVjdGFibGUgPSBmdW5jdGlvbihjZWxsKQorICogeworICogICB2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoY2VsbCk7CisgKiAgIHZhciBzdHlsZSA9IChzdGF0ZSAhPSBudWxsKSA/IHN0YXRlLnN0eWxlIDogdGhpcy5nZXRDZWxsU3R5bGUoY2VsbCk7CisgKiAgIAorICogICByZXR1cm4gdGhpcy5pc0NlbGxzU2VsZWN0YWJsZSgpICYmICF0aGlzLmlzQ2VsbExvY2tlZChjZWxsKSAmJiBzdHlsZVsnc2VsZWN0YWJsZSddICE9IDA7CisgKiB9OworICogKGVuZCkKKyAqIAorICogWW91IGNhbiB0aGVuIHVzZSB0aGUgbmV3IHN0eWxlIGFzIHNob3duIGluIHRoaXMgZXhhbXBsZS4KKyAqIAorICogKGNvZGUpCisgKiBncmFwaC5pbnNlcnRWZXJ0ZXgocGFyZW50LCBudWxsLCAnSGVsbG8sJywgMjAsIDIwLCA4MCwgMzAsICdzZWxlY3RhYmxlPTAnKTsKKyAqIChlbmQpCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBzZWxlY3RhYmxlIHN0YXRlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNDZWxsU2VsZWN0YWJsZSA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIHRoaXMuaXNDZWxsc1NlbGVjdGFibGUoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQ2VsbHNTZWxlY3RhYmxlCisgKgorICogUmV0dXJucyA8Y2VsbHNTZWxlY3RhYmxlPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNDZWxsc1NlbGVjdGFibGUgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuY2VsbHNTZWxlY3RhYmxlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0Q2VsbHNTZWxlY3RhYmxlCisgKgorICogU2V0cyA8Y2VsbHNTZWxlY3RhYmxlPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0Q2VsbHNTZWxlY3RhYmxlID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5jZWxsc1NlbGVjdGFibGUgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldERlbGV0YWJsZUNlbGxzCisgKiAKKyAqIFJldHVybnMgdGhlIGNlbGxzIHdoaWNoIG1heSBiZSBleHBvcnRlZCBpbiB0aGUgZ2l2ZW4gYXJyYXkgb2YgY2VsbHMuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldERlbGV0YWJsZUNlbGxzID0gZnVuY3Rpb24oY2VsbHMpCit7CisJcmV0dXJuIHRoaXMubW9kZWwuZmlsdGVyQ2VsbHMoY2VsbHMsIG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihjZWxsKQorCXsKKwkJcmV0dXJuIHRoaXMuaXNDZWxsRGVsZXRhYmxlKGNlbGwpOworCX0pKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQ2VsbERlbGV0YWJsZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbCBpcyBtb3ZlYWJsZS4gVGhpcyByZXR1cm5zCisgKiA8Y2VsbHNEZWxldGFibGU+IGZvciBhbGwgZ2l2ZW4gY2VsbHMgaWYgYSBjZWxscyBzdHlsZSBkb2VzIG5vdCBzcGVjaWZ5CisgKiA8bXhDb25zdGFudHMuU1RZTEVfREVMRVRBQkxFPiB0byBiZSAwLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgZGVsZXRhYmxlIHN0YXRlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNDZWxsRGVsZXRhYmxlID0gZnVuY3Rpb24oY2VsbCkKK3sKKwl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoY2VsbCk7CisJdmFyIHN0eWxlID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuc3R5bGUgOiB0aGlzLmdldENlbGxTdHlsZShjZWxsKTsKKwkKKwlyZXR1cm4gdGhpcy5pc0NlbGxzRGVsZXRhYmxlKCkgJiYgc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfREVMRVRBQkxFXSAhPSAwOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDZWxsc0RlbGV0YWJsZQorICoKKyAqIFJldHVybnMgPGNlbGxzRGVsZXRhYmxlPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNDZWxsc0RlbGV0YWJsZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5jZWxsc0RlbGV0YWJsZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldENlbGxzRGVsZXRhYmxlCisgKiAKKyAqIFNldHMgPGNlbGxzRGVsZXRhYmxlPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGdyYXBoIHNob3VsZCBhbGxvdyBkZWxldGlvbiBvZiBjZWxscy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0Q2VsbHNEZWxldGFibGUgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmNlbGxzRGVsZXRhYmxlID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0xhYmVsTW92YWJsZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZWRnZXMncyBsYWJlbCBpcyBtb3ZlYWJsZS4gVGhpcyByZXR1cm5zCisgKiA8bW92YWJsZT4gZm9yIGFsbCBnaXZlbiBjZWxscyBpZiA8aXNMb2NrZWQ+IGRvZXMgbm90IHJldHVybiB0cnVlCisgKiBmb3IgdGhlIGdpdmVuIGNlbGwuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBsYWJlbCBzaG91bGQgYmUgbW92ZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzTGFiZWxNb3ZhYmxlID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gIXRoaXMuaXNDZWxsTG9ja2VkKGNlbGwpICYmCisJCSgodGhpcy5tb2RlbC5pc0VkZ2UoY2VsbCkgJiYgdGhpcy5lZGdlTGFiZWxzTW92YWJsZSkgfHwKKwkJKHRoaXMubW9kZWwuaXNWZXJ0ZXgoY2VsbCkgJiYgdGhpcy52ZXJ0ZXhMYWJlbHNNb3ZhYmxlKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NlbGxSb3RhdGFibGUKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGNlbGwgaXMgcm90YXRhYmxlLiBUaGlzIHJldHVybnMgdHJ1ZSBmb3IgdGhlIGdpdmVuCisgKiBjZWxsIGlmIGl0cyBzdHlsZSBkb2VzIG5vdCBzcGVjaWZ5IDxteENvbnN0YW50cy5TVFlMRV9ST1RBVEFCTEU+IHRvIGJlIDAuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSByb3RhdGFibGUgc3RhdGUgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0NlbGxSb3RhdGFibGUgPSBmdW5jdGlvbihjZWxsKQoreworCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShjZWxsKTsKKwl2YXIgc3R5bGUgPSAoc3RhdGUgIT0gbnVsbCkgPyBzdGF0ZS5zdHlsZSA6IHRoaXMuZ2V0Q2VsbFN0eWxlKGNlbGwpOworCQorCXJldHVybiBzdHlsZVtteENvbnN0YW50cy5TVFlMRV9ST1RBVEFCTEVdICE9IDA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRNb3ZhYmxlQ2VsbHMKKyAqIAorICogUmV0dXJucyB0aGUgY2VsbHMgd2hpY2ggYXJlIG1vdmFibGUgaW4gdGhlIGdpdmVuIGFycmF5IG9mIGNlbGxzLgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRNb3ZhYmxlQ2VsbHMgPSBmdW5jdGlvbihjZWxscykKK3sKKwlyZXR1cm4gdGhpcy5tb2RlbC5maWx0ZXJDZWxscyhjZWxscywgbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGNlbGwpCisJeworCQlyZXR1cm4gdGhpcy5pc0NlbGxNb3ZhYmxlKGNlbGwpOworCX0pKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQ2VsbE1vdmFibGUKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGNlbGwgaXMgbW92ZWFibGUuIFRoaXMgcmV0dXJucyA8Y2VsbHNNb3ZhYmxlPgorICogZm9yIGFsbCBnaXZlbiBjZWxscyBpZiA8aXNDZWxsTG9ja2VkPiBkb2VzIG5vdCByZXR1cm4gdHJ1ZSBmb3IgdGhlIGdpdmVuCisgKiBjZWxsIGFuZCBpdHMgc3R5bGUgZG9lcyBub3Qgc3BlY2lmeSA8bXhDb25zdGFudHMuU1RZTEVfTU9WQUJMRT4gdG8gYmUgMC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdob3NlIG1vdmFibGUgc3RhdGUgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0NlbGxNb3ZhYmxlID0gZnVuY3Rpb24oY2VsbCkKK3sKKwl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoY2VsbCk7CisJdmFyIHN0eWxlID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuc3R5bGUgOiB0aGlzLmdldENlbGxTdHlsZShjZWxsKTsKKwkKKwlyZXR1cm4gdGhpcy5pc0NlbGxzTW92YWJsZSgpICYmICF0aGlzLmlzQ2VsbExvY2tlZChjZWxsKSAmJiBzdHlsZVtteENvbnN0YW50cy5TVFlMRV9NT1ZBQkxFXSAhPSAwOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDZWxsc01vdmFibGUKKyAqCisgKiBSZXR1cm5zIDxjZWxsc01vdmFibGU+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0NlbGxzTW92YWJsZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5jZWxsc01vdmFibGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRDZWxsc01vdmFibGUKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBncmFwaCBzaG91bGQgYWxsb3cgbW92aW5nIG9mIGNlbGxzLiBUaGlzIGltcGxlbWVudGF0aW9uCisgKiB1cGRhdGVzIDxjZWxsc01zb3ZhYmxlPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGdyYXBoIHNob3VsZCBhbGxvdyBtb3Zpbmcgb2YgY2VsbHMuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldENlbGxzTW92YWJsZSA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuY2VsbHNNb3ZhYmxlID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0dyaWRFbmFibGVkCisgKgorICogUmV0dXJucyA8Z3JpZEVuYWJsZWQ+IGFzIGEgYm9vbGVhbi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNHcmlkRW5hYmxlZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5ncmlkRW5hYmxlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEdyaWRFbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgZ3JpZCBzaG91bGQgYmUgZW5hYmxlZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGdyaWQgc2hvdWxkIGJlIGVuYWJsZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldEdyaWRFbmFibGVkID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5ncmlkRW5hYmxlZCA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNQb3J0c0VuYWJsZWQKKyAqCisgKiBSZXR1cm5zIDxwb3J0c0VuYWJsZWQ+IGFzIGEgYm9vbGVhbi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNQb3J0c0VuYWJsZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMucG9ydHNFbmFibGVkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0UG9ydHNFbmFibGVkCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgcG9ydHMgc2hvdWxkIGJlIGVuYWJsZWQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbHVlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBwb3J0cyBzaG91bGQgYmUgZW5hYmxlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0UG9ydHNFbmFibGVkID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5wb3J0c0VuYWJsZWQgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEdyaWRTaXplCisgKgorICogUmV0dXJucyA8Z3JpZFNpemU+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRHcmlkU2l6ZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5ncmlkU2l6ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEdyaWRTaXplCisgKiAKKyAqIFNldHMgPGdyaWRTaXplPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0R3JpZFNpemUgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmdyaWRTaXplID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRUb2xlcmFuY2UKKyAqCisgKiBSZXR1cm5zIDx0b2xlcmFuY2U+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRUb2xlcmFuY2UgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMudG9sZXJhbmNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0VG9sZXJhbmNlCisgKiAKKyAqIFNldHMgPHRvbGVyYW5jZT4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldFRvbGVyYW5jZSA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMudG9sZXJhbmNlID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1ZlcnRleExhYmVsc01vdmFibGUKKyAqCisgKiBSZXR1cm5zIDx2ZXJ0ZXhMYWJlbHNNb3ZhYmxlPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNWZXJ0ZXhMYWJlbHNNb3ZhYmxlID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLnZlcnRleExhYmVsc01vdmFibGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRWZXJ0ZXhMYWJlbHNNb3ZhYmxlCisgKiAKKyAqIFNldHMgPHZlcnRleExhYmVsc01vdmFibGU+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZXRWZXJ0ZXhMYWJlbHNNb3ZhYmxlID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy52ZXJ0ZXhMYWJlbHNNb3ZhYmxlID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0VkZ2VMYWJlbHNNb3ZhYmxlCisgKgorICogUmV0dXJucyA8ZWRnZUxhYmVsc01vdmFibGU+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0VkZ2VMYWJlbHNNb3ZhYmxlID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmVkZ2VMYWJlbHNNb3ZhYmxlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFZGdlTGFiZWxzTW92YWJsZQorICogCisgKiBTZXRzIDxlZGdlTGFiZWxzTW92YWJsZT4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldEVkZ2VMYWJlbHNNb3ZhYmxlID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5lZGdlTGFiZWxzTW92YWJsZSA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNTd2ltbGFuZU5lc3RpbmcKKyAqCisgKiBSZXR1cm5zIDxzd2ltbGFuZU5lc3Rpbmc+IGFzIGEgYm9vbGVhbi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNTd2ltbGFuZU5lc3RpbmcgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuc3dpbWxhbmVOZXN0aW5nOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0U3dpbWxhbmVOZXN0aW5nCisgKiAKKyAqIFNwZWNpZmllcyBpZiBzd2ltbGFuZXMgY2FuIGJlIG5lc3RlZCBieSBkcmFnIGFuZCBkcm9wLiBUaGlzIGlzIG9ubHkKKyAqIHRha2VuIGludG8gYWNjb3VudCBpZiBkcm9wRW5hYmxlZCBpcyB0cnVlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiBzd2ltbGFuZXMgY2FuIGJlIG5lc3RlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0U3dpbWxhbmVOZXN0aW5nID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5zd2ltbGFuZU5lc3RpbmcgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzU3dpbWxhbmVTZWxlY3Rpb25FbmFibGVkCisgKgorICogUmV0dXJucyA8c3dpbWxhbmVTZWxlY3Rpb25FbmFibGVkPiBhcyBhIGJvb2xlYW4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzU3dpbWxhbmVTZWxlY3Rpb25FbmFibGVkID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLnN3aW1sYW5lU2VsZWN0aW9uRW5hYmxlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFN3aW1sYW5lU2VsZWN0aW9uRW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgc3dpbWxhbmVzIHNob3VsZCBiZSBzZWxlY3RlZCBpZiB0aGUgbW91c2UgaXMgcmVsZWFzZWQKKyAqIG92ZXIgdGhlaXIgY29udGVudCBhcmVhLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiBzd2ltbGFuZXMgY29udGVudCBhcmVhcworICogc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gdGhlIG1vdXNlIGlzIHJlbGVhc2VkIG92ZXIgdGhlbS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0U3dpbWxhbmVTZWxlY3Rpb25FbmFibGVkID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5zd2ltbGFuZVNlbGVjdGlvbkVuYWJsZWQgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzTXVsdGlncmFwaAorICoKKyAqIFJldHVybnMgPG11bHRpZ3JhcGg+IGFzIGEgYm9vbGVhbi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNNdWx0aWdyYXBoID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLm11bHRpZ3JhcGg7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRNdWx0aWdyYXBoCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgZ3JhcGggc2hvdWxkIGFsbG93IG11bHRpcGxlIGNvbm5lY3Rpb25zIGJldHdlZW4gdGhlCisgKiBzYW1lIHBhaXIgb2YgdmVydGljZXMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbHVlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBncmFwaCBhbGxvd3MgbXVsdGlwbGUgY29ubmVjdGlvbnMKKyAqIGJldHdlZW4gdGhlIHNhbWUgcGFpciBvZiB2ZXJ0aWNlcy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0TXVsdGlncmFwaCA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMubXVsdGlncmFwaCA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNBbGxvd0xvb3BzCisgKgorICogUmV0dXJucyA8YWxsb3dMb29wcz4gYXMgYSBib29sZWFuLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0FsbG93TG9vcHMgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuYWxsb3dMb29wczsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEFsbG93RGFuZ2xpbmdFZGdlcworICogCisgKiBTcGVjaWZpZXMgaWYgZGFuZ2xpbmcgZWRnZXMgYXJlIGFsbG93ZWQsIHRoYXQgaXMsIGlmIGVkZ2VzIGFyZSBhbGxvd2VkCisgKiB0aGF0IGRvIG5vdCBoYXZlIGEgc291cmNlIGFuZC9vciB0YXJnZXQgdGVybWluYWwgZGVmaW5lZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgZGFuZ2xpbmcgZWRnZXMgYXJlIGFsbG93ZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldEFsbG93RGFuZ2xpbmdFZGdlcyA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuYWxsb3dEYW5nbGluZ0VkZ2VzID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0FsbG93RGFuZ2xpbmdFZGdlcworICoKKyAqIFJldHVybnMgPGFsbG93RGFuZ2xpbmdFZGdlcz4gYXMgYSBib29sZWFuLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0FsbG93RGFuZ2xpbmdFZGdlcyA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5hbGxvd0RhbmdsaW5nRWRnZXM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRDb25uZWN0YWJsZUVkZ2VzCisgKiAKKyAqIFNwZWNpZmllcyBpZiBlZGdlcyBzaG91bGQgYmUgY29ubmVjdGFibGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbHVlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIGVkZ2VzIHNob3VsZCBiZSBjb25uZWN0YWJsZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0Q29ubmVjdGFibGVFZGdlcyA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuY29ubmVjdGFibGVFZGdlcyA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDb25uZWN0YWJsZUVkZ2VzCisgKgorICogUmV0dXJucyA8Y29ubmVjdGFibGVFZGdlcz4gYXMgYSBib29sZWFuLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0Nvbm5lY3RhYmxlRWRnZXMgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuY29ubmVjdGFibGVFZGdlczsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldENsb25lSW52YWxpZEVkZ2VzCisgKiAKKyAqIFNwZWNpZmllcyBpZiBlZGdlcyBzaG91bGQgYmUgaW5zZXJ0ZWQgd2hlbiBjbG9uZWQgYnV0IG5vdCB2YWxpZCB3cnQuCisgKiA8Z2V0RWRnZVZhbGlkYXRpb25FcnJvcj4uIElmIGZhbHNlIHN1Y2ggZWRnZXMgd2lsbCBiZSBzaWxlbnRseSBpZ25vcmVkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiBjbG9uZWQgaW52YWxpZCBlZGdlcyBzaG91bGQgYmUKKyAqIGluc2VydGVkIGludG8gdGhlIGdyYXBoIG9yIGlnbm9yZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldENsb25lSW52YWxpZEVkZ2VzID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5jbG9uZUludmFsaWRFZGdlcyA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDbG9uZUludmFsaWRFZGdlcworICoKKyAqIFJldHVybnMgPGNsb25lSW52YWxpZEVkZ2VzPiBhcyBhIGJvb2xlYW4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzQ2xvbmVJbnZhbGlkRWRnZXMgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuY2xvbmVJbnZhbGlkRWRnZXM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRBbGxvd0xvb3BzCisgKiAKKyAqIFNwZWNpZmllcyBpZiBsb29wcyBhcmUgYWxsb3dlZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgbG9vcHMgYXJlIGFsbG93ZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldEFsbG93TG9vcHMgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmFsbG93TG9vcHMgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzRGlzY29ubmVjdE9uTW92ZQorICoKKyAqIFJldHVybnMgPGRpc2Nvbm5lY3RPbk1vdmU+IGFzIGEgYm9vbGVhbi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNEaXNjb25uZWN0T25Nb3ZlID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmRpc2Nvbm5lY3RPbk1vdmU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXREaXNjb25uZWN0T25Nb3ZlCisgKiAKKyAqIFNwZWNpZmllcyBpZiBlZGdlcyBzaG91bGQgYmUgZGlzY29ubmVjdGVkIHdoZW4gbW92ZWQuIChOb3RlOiBDbG9uZWQKKyAqIGVkZ2VzIGFyZSBhbHdheXMgZGlzY29ubmVjdGVkLikKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgZWRnZXMgc2hvdWxkIGJlIGRpc2Nvbm5lY3RlZAorICogd2hlbiBtb3ZlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0RGlzY29ubmVjdE9uTW92ZSA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuZGlzY29ubmVjdE9uTW92ZSA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNEcm9wRW5hYmxlZAorICoKKyAqIFJldHVybnMgPGRyb3BFbmFibGVkPiBhcyBhIGJvb2xlYW4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzRHJvcEVuYWJsZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuZHJvcEVuYWJsZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXREcm9wRW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIGdyYXBoIHNob3VsZCBhbGxvdyBkcm9wcGluZyBvZiBjZWxscyBvbnRvIG9yIGludG8gb3RoZXIKKyAqIGNlbGxzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBkcm9wRW5hYmxlZCAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgZ3JhcGggc2hvdWxkIGFsbG93IGRyb3BwaW5nCisgKiBvZiBjZWxscyBpbnRvIG90aGVyIGNlbGxzLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZXREcm9wRW5hYmxlZCA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuZHJvcEVuYWJsZWQgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzU3BsaXRFbmFibGVkCisgKgorICogUmV0dXJucyA8c3BsaXRFbmFibGVkPiBhcyBhIGJvb2xlYW4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzU3BsaXRFbmFibGVkID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLnNwbGl0RW5hYmxlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFNwbGl0RW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIGdyYXBoIHNob3VsZCBhbGxvdyBkcm9wcGluZyBvZiBjZWxscyBvbnRvIG9yIGludG8gb3RoZXIKKyAqIGNlbGxzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBkcm9wRW5hYmxlZCAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgZ3JhcGggc2hvdWxkIGFsbG93IGRyb3BwaW5nCisgKiBvZiBjZWxscyBpbnRvIG90aGVyIGNlbGxzLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZXRTcGxpdEVuYWJsZWQgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLnNwbGl0RW5hYmxlZCA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDZWxsUmVzaXphYmxlCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjZWxsIGlzIHJlc2l6YWJsZS4gVGhpcyByZXR1cm5zCisgKiA8Y2VsbHNSZXNpemFibGU+IGZvciBhbGwgZ2l2ZW4gY2VsbHMgaWYgPGlzQ2VsbExvY2tlZD4gZG9lcyBub3QgcmV0dXJuCisgKiB0cnVlIGZvciB0aGUgZ2l2ZW4gY2VsbCBhbmQgaXRzIHN0eWxlIGRvZXMgbm90IHNwZWNpZnkKKyAqIDxteENvbnN0YW50cy5TVFlMRV9SRVNJWkFCTEU+IHRvIGJlIDAuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSByZXNpemFibGUgc3RhdGUgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0NlbGxSZXNpemFibGUgPSBmdW5jdGlvbihjZWxsKQoreworCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShjZWxsKTsKKwl2YXIgc3R5bGUgPSAoc3RhdGUgIT0gbnVsbCkgPyBzdGF0ZS5zdHlsZSA6IHRoaXMuZ2V0Q2VsbFN0eWxlKGNlbGwpOworCisJcmV0dXJuIHRoaXMuaXNDZWxsc1Jlc2l6YWJsZSgpICYmICF0aGlzLmlzQ2VsbExvY2tlZChjZWxsKSAmJgorCQlteFV0aWxzLmdldFZhbHVlKHN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9SRVNJWkFCTEUsICcxJykgIT0gJzAnOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDZWxsc1Jlc2l6YWJsZQorICoKKyAqIFJldHVybnMgPGNlbGxzUmVzaXphYmxlPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNDZWxsc1Jlc2l6YWJsZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5jZWxsc1Jlc2l6YWJsZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldENlbGxzUmVzaXphYmxlCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgZ3JhcGggc2hvdWxkIGFsbG93IHJlc2l6aW5nIG9mIGNlbGxzLiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiB1cGRhdGVzIDxjZWxsc1Jlc2l6YWJsZT4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbHVlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBncmFwaCBzaG91bGQgYWxsb3cgcmVzaXppbmcgb2YKKyAqIGNlbGxzLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZXRDZWxsc1Jlc2l6YWJsZSA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuY2VsbHNSZXNpemFibGUgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzVGVybWluYWxQb2ludE1vdmFibGUKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHRlcm1pbmFsIHBvaW50IGlzIG1vdmFibGUuIFRoaXMgaXMgaW5kZXBlbmRlbnQKKyAqIGZyb20gPGlzQ2VsbENvbm5lY3RhYmxlPiBhbmQgPGlzQ2VsbERpc2Nvbm5lY3RhYmxlPiBhbmQgY29udHJvbHMgaWYgdGVybWluYWwKKyAqIHBvaW50cyBjYW4gYmUgbW92ZWQgaW4gdGhlIGdyYXBoIGlmIHRoZSBlZGdlIGlzIG5vdCBjb25uZWN0ZWQuIE5vdGUgdGhhdCBpdAorICogaXMgcmVxdWlyZWQgZm9yIHRoaXMgdG8gcmV0dXJuIHRydWUgdG8gY29ubmVjdCB1bmNvbm5lY3RlZCBlZGdlcy4gVGhpcworICogaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgdGVybWluYWwgcG9pbnQgc2hvdWxkIGJlIG1vdmVkLgorICogc291cmNlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBzb3VyY2Ugb3IgdGFyZ2V0IHRlcm1pbmFsIHNob3VsZCBiZSBtb3ZlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNUZXJtaW5hbFBvaW50TW92YWJsZSA9IGZ1bmN0aW9uKGNlbGwsIHNvdXJjZSkKK3sKKwlyZXR1cm4gdHJ1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQ2VsbEJlbmRhYmxlCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjZWxsIGlzIGJlbmRhYmxlLiBUaGlzIHJldHVybnMgPGNlbGxzQmVuZGFibGU+CisgKiBmb3IgYWxsIGdpdmVuIGNlbGxzIGlmIDxpc0xvY2tlZD4gZG9lcyBub3QgcmV0dXJuIHRydWUgZm9yIHRoZSBnaXZlbgorICogY2VsbCBhbmQgaXRzIHN0eWxlIGRvZXMgbm90IHNwZWNpZnkgPG14Q29uc3RhbnRzLlNUWUxFX0JFTkRBQkxFPiB0byBiZSAwLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgYmVuZGFibGUgc3RhdGUgc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0NlbGxCZW5kYWJsZSA9IGZ1bmN0aW9uKGNlbGwpCit7CisJdmFyIHN0YXRlID0gdGhpcy52aWV3LmdldFN0YXRlKGNlbGwpOworCXZhciBzdHlsZSA9IChzdGF0ZSAhPSBudWxsKSA/IHN0YXRlLnN0eWxlIDogdGhpcy5nZXRDZWxsU3R5bGUoY2VsbCk7CisJCisJcmV0dXJuIHRoaXMuaXNDZWxsc0JlbmRhYmxlKCkgJiYgIXRoaXMuaXNDZWxsTG9ja2VkKGNlbGwpICYmIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0JFTkRBQkxFXSAhPSAwOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDZWxsc0JlbmRhYmxlCisgKgorICogUmV0dXJucyA8Y2VsbHNCZW5hZGFibGU+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0NlbGxzQmVuZGFibGUgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuY2VsbHNCZW5kYWJsZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldENlbGxzQmVuZGFibGUKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBncmFwaCBzaG91bGQgYWxsb3cgYmVuZGluZyBvZiBlZGdlcy4gVGhpcworICogaW1wbGVtZW50YXRpb24gdXBkYXRlcyA8YmVuZGFibGU+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgZ3JhcGggc2hvdWxkIGFsbG93IGJlbmRpbmcgb2YKKyAqIGVkZ2VzLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZXRDZWxsc0JlbmRhYmxlID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5jZWxsc0JlbmRhYmxlID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NlbGxFZGl0YWJsZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbCBpcyBlZGl0YWJsZS4gVGhpcyByZXR1cm5zIDxjZWxsc0VkaXRhYmxlPiBmb3IKKyAqIGFsbCBnaXZlbiBjZWxscyBpZiA8aXNDZWxsTG9ja2VkPiBkb2VzIG5vdCByZXR1cm4gdHJ1ZSBmb3IgdGhlIGdpdmVuIGNlbGwKKyAqIGFuZCBpdHMgc3R5bGUgZG9lcyBub3Qgc3BlY2lmeSA8bXhDb25zdGFudHMuU1RZTEVfRURJVEFCTEU+IHRvIGJlIDAuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBlZGl0YWJsZSBzdGF0ZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzQ2VsbEVkaXRhYmxlID0gZnVuY3Rpb24oY2VsbCkKK3sKKwl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoY2VsbCk7CisJdmFyIHN0eWxlID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuc3R5bGUgOiB0aGlzLmdldENlbGxTdHlsZShjZWxsKTsKKwkKKwlyZXR1cm4gdGhpcy5pc0NlbGxzRWRpdGFibGUoKSAmJiAhdGhpcy5pc0NlbGxMb2NrZWQoY2VsbCkgJiYgc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRURJVEFCTEVdICE9IDA7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NlbGxzRWRpdGFibGUKKyAqCisgKiBSZXR1cm5zIDxjZWxsc0VkaXRhYmxlPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNDZWxsc0VkaXRhYmxlID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmNlbGxzRWRpdGFibGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRDZWxsc0VkaXRhYmxlCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgZ3JhcGggc2hvdWxkIGFsbG93IGluLXBsYWNlIGVkaXRpbmcgZm9yIGNlbGwgbGFiZWxzLgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1cGRhdGVzIDxjZWxsc0VkaXRhYmxlPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGdyYXBoIHNob3VsZCBhbGxvdyBpbi1wbGFjZQorICogZWRpdGluZy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0Q2VsbHNFZGl0YWJsZSA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuY2VsbHNFZGl0YWJsZSA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDZWxsRGlzY29ubmVjdGFibGUKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGNlbGwgaXMgZGlzY29ubmVjdGFibGUgZnJvbSB0aGUgc291cmNlIG9yCisgKiB0YXJnZXQgdGVybWluYWwuIFRoaXMgcmV0dXJucyA8aXNDZWxsc0Rpc2Nvbm5lY3RhYmxlPiBmb3IgYWxsIGdpdmVuCisgKiBjZWxscyBpZiA8aXNDZWxsTG9ja2VkPiBkb2VzIG5vdCByZXR1cm4gdHJ1ZSBmb3IgdGhlIGdpdmVuIGNlbGwuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBkaXNjb25uZWN0YWJsZSBzdGF0ZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiB0ZXJtaW5hbCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgc291cmNlIG9yIHRhcmdldCB0ZXJtaW5hbC4KKyAqIHNvdXJjZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgc291cmNlIG9yIHRhcmdldCB0ZXJtaW5hbCBpcyB0byBiZQorICogZGlzY29ubmVjdGVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0NlbGxEaXNjb25uZWN0YWJsZSA9IGZ1bmN0aW9uKGNlbGwsIHRlcm1pbmFsLCBzb3VyY2UpCit7CisJcmV0dXJuIHRoaXMuaXNDZWxsc0Rpc2Nvbm5lY3RhYmxlKCkgJiYgIXRoaXMuaXNDZWxsTG9ja2VkKGNlbGwpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDZWxsc0Rpc2Nvbm5lY3RhYmxlCisgKgorICogUmV0dXJucyA8Y2VsbHNEaXNjb25uZWN0YWJsZT4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzQ2VsbHNEaXNjb25uZWN0YWJsZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5jZWxsc0Rpc2Nvbm5lY3RhYmxlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0Q2VsbHNEaXNjb25uZWN0YWJsZQorICoKKyAqIFNldHMgPGNlbGxzRGlzY29ubmVjdGFibGU+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZXRDZWxsc0Rpc2Nvbm5lY3RhYmxlID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5jZWxsc0Rpc2Nvbm5lY3RhYmxlID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1ZhbGlkU291cmNlCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbCBpcyBhIHZhbGlkIHNvdXJjZSBmb3IgbmV3IGNvbm5lY3Rpb25zLgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgZm9yIGFsbCBub24tbnVsbCB2YWx1ZXMgYW5kIGlzCisgKiBjYWxsZWQgYnkgaXMgY2FsbGVkIGJ5IDxpc1ZhbGlkQ29ubmVjdGlvbj4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgYSBwb3NzaWJsZSBzb3VyY2Ugb3IgbnVsbC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNWYWxpZFNvdXJjZSA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIChjZWxsID09IG51bGwgJiYgdGhpcy5hbGxvd0RhbmdsaW5nRWRnZXMpIHx8CisJCShjZWxsICE9IG51bGwgJiYgKCF0aGlzLm1vZGVsLmlzRWRnZShjZWxsKSB8fAorCQl0aGlzLmNvbm5lY3RhYmxlRWRnZXMpICYmIHRoaXMuaXNDZWxsQ29ubmVjdGFibGUoY2VsbCkpOworfTsKKwkKKy8qKgorICogRnVuY3Rpb246IGlzVmFsaWRUYXJnZXQKKyAqIAorICogUmV0dXJucyA8aXNWYWxpZFNvdXJjZT4gZm9yIHRoZSBnaXZlbiBjZWxsLiBUaGlzIGlzIGNhbGxlZCBieQorICogPGlzVmFsaWRDb25uZWN0aW9uPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyBhIHBvc3NpYmxlIHRhcmdldCBvciBudWxsLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc1ZhbGlkVGFyZ2V0ID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gdGhpcy5pc1ZhbGlkU291cmNlKGNlbGwpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNWYWxpZENvbm5lY3Rpb24KKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiB0YXJnZXQgY2VsbCBpcyBhIHZhbGlkIHRhcmdldCBmb3Igc291cmNlLgorICogVGhpcyBpcyBhIGJvb2xlYW4gaW1wbGVtZW50YXRpb24gZm9yIG5vdCBhbGxvd2luZyBjb25uZWN0aW9ucyBiZXR3ZWVuCisgKiBjZXJ0YWluIHBhaXJzIG9mIHZlcnRpY2VzIGFuZCBpcyBjYWxsZWQgYnkgPGdldEVkZ2VWYWxpZGF0aW9uRXJyb3I+LgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgaWYgPGlzVmFsaWRTb3VyY2U+IHJldHVybnMgdHJ1ZSBmb3IKKyAqIHRoZSBzb3VyY2UgYW5kIDxpc1ZhbGlkVGFyZ2V0PiByZXR1cm5zIHRydWUgZm9yIHRoZSB0YXJnZXQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHNvdXJjZSAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgc291cmNlIGNlbGwuCisgKiB0YXJnZXQgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIHRhcmdldCBjZWxsLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc1ZhbGlkQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0KQoreworCXJldHVybiB0aGlzLmlzVmFsaWRTb3VyY2Uoc291cmNlKSAmJiB0aGlzLmlzVmFsaWRUYXJnZXQodGFyZ2V0KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldENvbm5lY3RhYmxlCisgKiAKKyAqIFNwZWNpZmllcyBpZiB0aGUgZ3JhcGggc2hvdWxkIGFsbG93IG5ldyBjb25uZWN0aW9ucy4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICogdXBkYXRlcyA8bXhDb25uZWN0aW9uSGFuZGxlci5lbmFibGVkPiBpbiA8Y29ubmVjdGlvbkhhbmRsZXI+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjb25uZWN0YWJsZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiBuZXcgY29ubmVjdGlvbnMgc2hvdWxkIGJlIGFsbG93ZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldENvbm5lY3RhYmxlID0gZnVuY3Rpb24oY29ubmVjdGFibGUpCit7CisJdGhpcy5jb25uZWN0aW9uSGFuZGxlci5zZXRFbmFibGVkKGNvbm5lY3RhYmxlKTsKK307CisJCisvKioKKyAqIEZ1bmN0aW9uOiBpc0Nvbm5lY3RhYmxlCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgPGNvbm5lY3Rpb25IYW5kbGVyPiBpcyBlbmFibGVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0Nvbm5lY3RhYmxlID0gZnVuY3Rpb24oY29ubmVjdGFibGUpCit7CisJcmV0dXJuIHRoaXMuY29ubmVjdGlvbkhhbmRsZXIuaXNFbmFibGVkKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRUb29sdGlwcworICogCisgKiBTcGVjaWZpZXMgaWYgdG9vbHRpcHMgc2hvdWxkIGJlIGVuYWJsZWQuIFRoaXMgaW1wbGVtZW50YXRpb24gdXBkYXRlcworICogPG14VG9vbHRpcEhhbmRsZXIuZW5hYmxlZD4gaW4gPHRvb2x0aXBIYW5kbGVyPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZW5hYmxlZCAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0b29sdGlwcyBzaG91bGQgYmUgZW5hYmxlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0VG9vbHRpcHMgPSBmdW5jdGlvbiAoZW5hYmxlZCkKK3sKKwl0aGlzLnRvb2x0aXBIYW5kbGVyLnNldEVuYWJsZWQoZW5hYmxlZCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRQYW5uaW5nCisgKiAKKyAqIFNwZWNpZmllcyBpZiBwYW5uaW5nIHNob3VsZCBiZSBlbmFibGVkLiBUaGlzIGltcGxlbWVudGF0aW9uIHVwZGF0ZXMKKyAqIDxteFBhbm5pbmdIYW5kbGVyLnBhbm5pbmdFbmFibGVkPiBpbiA8cGFubmluZ0hhbmRsZXI+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlbmFibGVkIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHBhbm5pbmcgc2hvdWxkIGJlIGVuYWJsZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldFBhbm5pbmcgPSBmdW5jdGlvbihlbmFibGVkKQoreworCXRoaXMucGFubmluZ0hhbmRsZXIucGFubmluZ0VuYWJsZWQgPSBlbmFibGVkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFZGl0aW5nCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbCBpcyBjdXJyZW50bHkgYmVpbmcgZWRpdGVkLgorICogSWYgbm8gY2VsbCBpcyBzcGVjaWZpZWQgdGhlbiB0aGlzIHJldHVybnMgdHJ1ZSBpZiBhbnkKKyAqIGNlbGwgaXMgY3VycmVudGx5IGJlaW5nIGVkaXRlZC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdGhhdCBzaG91bGQgYmUgY2hlY2tlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNFZGl0aW5nID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlpZiAodGhpcy5jZWxsRWRpdG9yICE9IG51bGwpCisJeworCQl2YXIgZWRpdGluZ0NlbGwgPSB0aGlzLmNlbGxFZGl0b3IuZ2V0RWRpdGluZ0NlbGwoKTsKKwkJCisJCXJldHVybiAoY2VsbCA9PSBudWxsKSA/IGVkaXRpbmdDZWxsICE9IG51bGwgOiBjZWxsID09IGVkaXRpbmdDZWxsOworCX0KKwkKKwlyZXR1cm4gZmFsc2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0F1dG9TaXplQ2VsbAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNpemUgb2YgdGhlIGdpdmVuIGNlbGwgc2hvdWxkIGF1dG9tYXRpY2FsbHkgYmUKKyAqIHVwZGF0ZWQgYWZ0ZXIgYSBjaGFuZ2Ugb2YgdGhlIGxhYmVsLiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMKKyAqIDxhdXRvU2l6ZUNlbGxzPiBvciBjaGVja3MgaWYgdGhlIGNlbGwgc3R5bGUgZG9lcyBzcGVjaWZ5CisgKiA8bXhDb25zdGFudHMuU1RZTEVfQVVUT1NJWkU+IHRvIGJlIDEuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGF0IHNob3VsZCBiZSByZXNpemVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0F1dG9TaXplQ2VsbCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJdmFyIHN0YXRlID0gdGhpcy52aWV3LmdldFN0YXRlKGNlbGwpOworCXZhciBzdHlsZSA9IChzdGF0ZSAhPSBudWxsKSA/IHN0YXRlLnN0eWxlIDogdGhpcy5nZXRDZWxsU3R5bGUoY2VsbCk7CisJCisJcmV0dXJuIHRoaXMuaXNBdXRvU2l6ZUNlbGxzKCkgfHwgc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfQVVUT1NJWkVdID09IDE7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0F1dG9TaXplQ2VsbHMKKyAqIAorICogUmV0dXJucyA8YXV0b1NpemVDZWxscz4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzQXV0b1NpemVDZWxscyA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5hdXRvU2l6ZUNlbGxzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0QXV0b1NpemVDZWxscworICogCisgKiBTcGVjaWZpZXMgaWYgY2VsbCBzaXplcyBzaG91bGQgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkIGFmdGVyIGEgbGFiZWwKKyAqIGNoYW5nZS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBzZXRzIDxhdXRvU2l6ZUNlbGxzPiB0byB0aGUgZ2l2ZW4gcGFyYW1ldGVyLgorICogVG8gdXBkYXRlIHRoZSBzaXplIG9mIGNlbGxzIHdoZW4gdGhlIGNlbGxzIGFyZSBhZGRlZCwgc2V0CisgKiA8YXV0b1NpemVDZWxsc09uQWRkPiB0byB0cnVlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiBjZWxscyBzaG91bGQgYmUgcmVzaXplZAorICogYXV0b21hdGljYWxseS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0QXV0b1NpemVDZWxscyA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuYXV0b1NpemVDZWxscyA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFeHRlbmRQYXJlbnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBwYXJlbnQgb2YgdGhlIGdpdmVuIGNlbGwgc2hvdWxkIGJlIGV4dGVuZGVkIGlmIHRoZQorICogY2hpbGQgaGFzIGJlZW4gcmVzaXplZCBzbyB0aGF0IGl0IG92ZXJsYXBzIHRoZSBwYXJlbnQuIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGlzRXh0ZW5kUGFyZW50cz4gaWYgdGhlIGNlbGwgaXMgbm90IGFuIGVkZ2UuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGF0IGhhcyBiZWVuIHJlc2l6ZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzRXh0ZW5kUGFyZW50ID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gIXRoaXMuZ2V0TW9kZWwoKS5pc0VkZ2UoY2VsbCkgJiYgdGhpcy5pc0V4dGVuZFBhcmVudHMoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzRXh0ZW5kUGFyZW50cworICogCisgKiBSZXR1cm5zIDxleHRlbmRQYXJlbnRzPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNFeHRlbmRQYXJlbnRzID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmV4dGVuZFBhcmVudHM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRFeHRlbmRQYXJlbnRzCisgKiAKKyAqIFNldHMgPGV4dGVuZFBhcmVudHM+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB2YWx1ZSAtIE5ldyBib29sZWFuIHZhbHVlIGZvciA8ZXh0ZW5kUGFyZW50cz4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldEV4dGVuZFBhcmVudHMgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmV4dGVuZFBhcmVudHMgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzRXh0ZW5kUGFyZW50c09uQWRkCisgKiAKKyAqIFJldHVybnMgPGV4dGVuZFBhcmVudHNPbkFkZD4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzRXh0ZW5kUGFyZW50c09uQWRkID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gdGhpcy5leHRlbmRQYXJlbnRzT25BZGQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRFeHRlbmRQYXJlbnRzT25BZGQKKyAqIAorICogU2V0cyA8ZXh0ZW5kUGFyZW50c09uQWRkPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBOZXcgYm9vbGVhbiB2YWx1ZSBmb3IgPGV4dGVuZFBhcmVudHNPbkFkZD4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldEV4dGVuZFBhcmVudHNPbkFkZCA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuZXh0ZW5kUGFyZW50c09uQWRkID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0V4dGVuZFBhcmVudHNPbk1vdmUKKyAqIAorICogUmV0dXJucyA8ZXh0ZW5kUGFyZW50c09uTW92ZT4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzRXh0ZW5kUGFyZW50c09uTW92ZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5leHRlbmRQYXJlbnRzT25Nb3ZlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0RXh0ZW5kUGFyZW50c09uTW92ZQorICogCisgKiBTZXRzIDxleHRlbmRQYXJlbnRzT25Nb3ZlPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBOZXcgYm9vbGVhbiB2YWx1ZSBmb3IgPGV4dGVuZFBhcmVudHNPbkFkZD4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldEV4dGVuZFBhcmVudHNPbk1vdmUgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmV4dGVuZFBhcmVudHNPbk1vdmUgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzUmVjdXJzaXZlUmVzaXplCisgKiAKKyAqIFJldHVybnMgPHJlY3Vyc2l2ZVJlc2l6ZT4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB0aGF0IGlzIGJlaW5nIHJlc2l6ZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzUmVjdXJzaXZlUmVzaXplID0gZnVuY3Rpb24oc3RhdGUpCit7CisJcmV0dXJuIHRoaXMucmVjdXJzaXZlUmVzaXplOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0UmVjdXJzaXZlUmVzaXplCisgKiAKKyAqIFNldHMgPHJlY3Vyc2l2ZVJlc2l6ZT4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbHVlIC0gTmV3IGJvb2xlYW4gdmFsdWUgZm9yIDxyZWN1cnNpdmVSZXNpemU+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZXRSZWN1cnNpdmVSZXNpemUgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLnJlY3Vyc2l2ZVJlc2l6ZSA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDb25zdHJhaW5DaGlsZAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGNlbGwgc2hvdWxkIGJlIGtlcHQgaW5zaWRlIHRoZSBib3VuZHMgb2YgaXRzCisgKiBwYXJlbnQgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBkZWZpbmVkIGJ5IDxnZXRPdmVybGFwPiBhbmQKKyAqIDxpc0FsbG93T3ZlcmxhcFBhcmVudD4uIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBmYWxzZSBmb3IgYWxsIGNoaWxkcmVuCisgKiBvZiBlZGdlcyBhbmQgPGlzQ29uc3RyYWluQ2hpbGRyZW4+IG90aGVyd2lzZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRoYXQgc2hvdWxkIGJlIGNvbnN0cmFpbmVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0NvbnN0cmFpbkNoaWxkID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gdGhpcy5pc0NvbnN0cmFpbkNoaWxkcmVuKCkgJiYgIXRoaXMuZ2V0TW9kZWwoKS5pc0VkZ2UodGhpcy5nZXRNb2RlbCgpLmdldFBhcmVudChjZWxsKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NvbnN0cmFpbkNoaWxkcmVuCisgKiAKKyAqIFJldHVybnMgPGNvbnN0cmFpbkNoaWxkcmVuPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNDb25zdHJhaW5DaGlsZHJlbiA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5jb25zdHJhaW5DaGlsZHJlbjsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldENvbnN0cmFpbkNoaWxkcmVuCisgKiAKKyAqIFNldHMgPGNvbnN0cmFpbkNoaWxkcmVuPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0Q29uc3RyYWluQ2hpbGRyZW4gPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmNvbnN0cmFpbkNoaWxkcmVuID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NvbnN0cmFpblJlbGF0aXZlQ2hpbGRyZW4KKyAqIAorICogUmV0dXJucyA8Y29uc3RyYWluUmVsYXRpdmVDaGlsZHJlbj4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzQ29uc3RyYWluUmVsYXRpdmVDaGlsZHJlbiA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5jb25zdHJhaW5SZWxhdGl2ZUNoaWxkcmVuOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0Q29uc3RyYWluUmVsYXRpdmVDaGlsZHJlbgorICogCisgKiBTZXRzIDxjb25zdHJhaW5SZWxhdGl2ZUNoaWxkcmVuPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2V0Q29uc3RyYWluUmVsYXRpdmVDaGlsZHJlbiA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuY29uc3RyYWluUmVsYXRpdmVDaGlsZHJlbiA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDb25zdHJhaW5DaGlsZHJlbgorICogCisgKiBSZXR1cm5zIDxhbGxvd05lZ2F0aXZlQ29vcmRpbmF0ZXM+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0FsbG93TmVnYXRpdmVDb29yZGluYXRlcyA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5hbGxvd05lZ2F0aXZlQ29vcmRpbmF0ZXM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRDb25zdHJhaW5DaGlsZHJlbgorICogCisgKiBTZXRzIDxhbGxvd05lZ2F0aXZlQ29vcmRpbmF0ZXM+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZXRBbGxvd05lZ2F0aXZlQ29vcmRpbmF0ZXMgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmFsbG93TmVnYXRpdmVDb29yZGluYXRlcyA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0T3ZlcmxhcAorICogCisgKiBSZXR1cm5zIGEgZGVjaW1hbCBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBhbW91bnQgb2YgdGhlIHdpZHRoIGFuZCBoZWlnaHQKKyAqIG9mIHRoZSBnaXZlbiBjZWxsIHRoYXQgaXMgYWxsb3dlZCB0byBvdmVybGFwIGl0cyBwYXJlbnQuIEEgdmFsdWUgb2YgMAorICogbWVhbnMgYWxsIGNoaWxkcmVuIG11c3Qgc3RheSBpbnNpZGUgdGhlIHBhcmVudCwgMSBtZWFucyB0aGUgY2hpbGQgaXMKKyAqIGFsbG93ZWQgdG8gYmUgcGxhY2VkIG91dHNpZGUgb2YgdGhlIHBhcmVudCBzdWNoIHRoYXQgaXQgdG91Y2hlcyBvbmUgb2YKKyAqIHRoZSBwYXJlbnRzIHNpZGVzLiBJZiA8aXNBbGxvd092ZXJsYXBQYXJlbnQ+IHJldHVybnMgZmFsc2UgZm9yIHRoZSBnaXZlbgorICogY2VsbCwgdGhlbiB0aGlzIG1ldGhvZCByZXR1cm5zIDAuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiBmb3Igd2hpY2ggdGhlIG92ZXJsYXAgcmF0aW8gc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRPdmVybGFwID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gKHRoaXMuaXNBbGxvd092ZXJsYXBQYXJlbnQoY2VsbCkpID8gdGhpcy5kZWZhdWx0T3ZlcmxhcCA6IDA7Cit9OworCQorLyoqCisgKiBGdW5jdGlvbjogaXNBbGxvd092ZXJsYXBQYXJlbnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjZWxsIGlzIGFsbG93ZWQgdG8gYmUgcGxhY2VkIG91dHNpZGUgb2YgdGhlCisgKiBwYXJlbnRzIGFyZWEuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGF0IHJlcHJlc2VudHMgdGhlIGNoaWxkIHRvIGJlIGNoZWNrZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzQWxsb3dPdmVybGFwUGFyZW50ID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRGb2xkYWJsZUNlbGxzCisgKiAKKyAqIFJldHVybnMgdGhlIGNlbGxzIHdoaWNoIGFyZSBtb3ZhYmxlIGluIHRoZSBnaXZlbiBhcnJheSBvZiBjZWxscy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0Rm9sZGFibGVDZWxscyA9IGZ1bmN0aW9uKGNlbGxzLCBjb2xsYXBzZSkKK3sKKwlyZXR1cm4gdGhpcy5tb2RlbC5maWx0ZXJDZWxscyhjZWxscywgbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGNlbGwpCisJeworCQlyZXR1cm4gdGhpcy5pc0NlbGxGb2xkYWJsZShjZWxsLCBjb2xsYXBzZSk7CisJfSkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDZWxsRm9sZGFibGUKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjZWxsIGlzIGZvbGRhYmxlLiBUaGlzIGltcGxlbWVudGF0aW9uCisgKiByZXR1cm5zIHRydWUgaWYgdGhlIGNlbGwgaGFzIGF0IGxlYXN0IG9uZSBjaGlsZCBhbmQgaXRzIHN0eWxlCisgKiBkb2VzIG5vdCBzcGVjaWZ5IDxteENvbnN0YW50cy5TVFlMRV9GT0xEQUJMRT4gdG8gYmUgMC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHdob3NlIGZvbGRhYmxlIHN0YXRlIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNDZWxsRm9sZGFibGUgPSBmdW5jdGlvbihjZWxsLCBjb2xsYXBzZSkKK3sKKwl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoY2VsbCk7CisJdmFyIHN0eWxlID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuc3R5bGUgOiB0aGlzLmdldENlbGxTdHlsZShjZWxsKTsKKwkKKwlyZXR1cm4gdGhpcy5tb2RlbC5nZXRDaGlsZENvdW50KGNlbGwpID4gMCAmJiBzdHlsZVtteENvbnN0YW50cy5TVFlMRV9GT0xEQUJMRV0gIT0gMDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzVmFsaWREcm9wVGFyZ2V0CisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjZWxsIGlzIGEgdmFsaWQgZHJvcCB0YXJnZXQgZm9yIHRoZSBzcGVjaWZpZWQKKyAqIGNlbGxzLiBJZiA8c3BsaXRFbmFibGVkPiBpcyB0cnVlIHRoZW4gdGhpcyByZXR1cm5zIDxpc1NwbGl0VGFyZ2V0PiBmb3IKKyAqIHRoZSBnaXZlbiBhcmd1bWVudHMgZWxzZSBpdCByZXR1cm5zIHRydWUgaWYgdGhlIGNlbGwgaXMgbm90IGNvbGxhcHNlZAorICogYW5kIGl0cyBjaGlsZCBjb3VudCBpcyBncmVhdGVyIHRoYW4gMC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgcG9zc2libGUgZHJvcCB0YXJnZXQuCisgKiBjZWxscyAtIDxteENlbGxzPiB0aGF0IHNob3VsZCBiZSBkcm9wcGVkIGludG8gdGhlIHRhcmdldC4KKyAqIGV2dCAtIE1vdXNlZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIGludm9jYXRpb24uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzVmFsaWREcm9wVGFyZ2V0ID0gZnVuY3Rpb24oY2VsbCwgY2VsbHMsIGV2dCkKK3sKKwlyZXR1cm4gY2VsbCAhPSBudWxsICYmICgodGhpcy5pc1NwbGl0RW5hYmxlZCgpICYmCisJCXRoaXMuaXNTcGxpdFRhcmdldChjZWxsLCBjZWxscywgZXZ0KSkgfHwgKCF0aGlzLm1vZGVsLmlzRWRnZShjZWxsKSAmJgorCQkodGhpcy5pc1N3aW1sYW5lKGNlbGwpIHx8ICh0aGlzLm1vZGVsLmdldENoaWxkQ291bnQoY2VsbCkgPiAwICYmCisJCSF0aGlzLmlzQ2VsbENvbGxhcHNlZChjZWxsKSkpKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1NwbGl0VGFyZ2V0CisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBlZGdlIG1heSBiZSBzcGxpdHRlZCBpbnRvIHR3byBlZGdlcyB3aXRoIHRoZQorICogZ2l2ZW4gY2VsbCBhcyBhIG5ldyB0ZXJtaW5hbCBiZXR3ZWVuIHRoZSB0d28uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHRhcmdldCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgZWRnZSB0byBiZSBzcGxpdHRlZC4KKyAqIGNlbGxzIC0gPG14Q2VsbHM+IHRoYXQgc2hvdWxkIHNwbGl0IHRoZSBlZGdlLgorICogZXZ0IC0gTW91c2VldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgaW52b2NhdGlvbi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNTcGxpdFRhcmdldCA9IGZ1bmN0aW9uKHRhcmdldCwgY2VsbHMsIGV2dCkKK3sKKwlpZiAodGhpcy5tb2RlbC5pc0VkZ2UodGFyZ2V0KSAmJiBjZWxscyAhPSBudWxsICYmIGNlbGxzLmxlbmd0aCA9PSAxICYmCisJCXRoaXMuaXNDZWxsQ29ubmVjdGFibGUoY2VsbHNbMF0pICYmIHRoaXMuZ2V0RWRnZVZhbGlkYXRpb25FcnJvcih0YXJnZXQsCisJCQl0aGlzLm1vZGVsLmdldFRlcm1pbmFsKHRhcmdldCwgdHJ1ZSksIGNlbGxzWzBdKSA9PSBudWxsKQorCXsKKwkJdmFyIHNyYyA9IHRoaXMubW9kZWwuZ2V0VGVybWluYWwodGFyZ2V0LCB0cnVlKTsKKwkJdmFyIHRyZyA9IHRoaXMubW9kZWwuZ2V0VGVybWluYWwodGFyZ2V0LCBmYWxzZSk7CisKKwkJcmV0dXJuICghdGhpcy5tb2RlbC5pc0FuY2VzdG9yKGNlbGxzWzBdLCBzcmMpICYmCisJCQkJIXRoaXMubW9kZWwuaXNBbmNlc3RvcihjZWxsc1swXSwgdHJnKSk7CisJfQorCisJcmV0dXJuIGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0RHJvcFRhcmdldAorICogCisgKiBSZXR1cm5zIHRoZSBnaXZlbiBjZWxsIGlmIGl0IGlzIGEgZHJvcCB0YXJnZXQgZm9yIHRoZSBnaXZlbiBjZWxscyBvciB0aGUKKyAqIG5lYXJlc3QgYW5jZXN0b3IgdGhhdCBtYXkgYmUgdXNlZCBhcyBhIGRyb3AgdGFyZ2V0IGZvciB0aGUgZ2l2ZW4gY2VsbHMuCisgKiBJZiB0aGUgZ2l2ZW4gYXJyYXkgY29udGFpbnMgYSBzd2ltbGFuZSBhbmQgPHN3aW1sYW5lTmVzdGluZz4gaXMgZmFsc2UKKyAqIHRoZW4gdGhpcyBhbHdheXMgcmV0dXJucyBudWxsLiBJZiBubyBjZWxsIGlzIGdpdmVuLCB0aGVuIHRoZSBib3R0b21tb3N0CisgKiBzd2ltbGFuZSBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIGdpdmVuIGV2ZW50IGlzIHJldHVybmVkLgorICogCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgPGlzRHJvcEVuYWJsZWQ+IHJldHVybnMgdHJ1ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbHMgLSBBcnJheSBvZiA8bXhDZWxscz4gd2hpY2ggYXJlIHRvIGJlIGRyb3BwZWQgb250byB0aGUgdGFyZ2V0LgorICogZXZ0IC0gTW91c2VldmVudCBmb3IgdGhlIGRyYWcgYW5kIGRyb3AuCisgKiBjZWxsIC0gPG14Q2VsbD4gdGhhdCBpcyB1bmRlciB0aGUgbW91c2Vwb2ludGVyLgorICogY2xvbmUgLSBPcHRpb25hbCBib29sZWFuIHRvIGluZGljYXRlIG9mIGNlbGxzIHdpbGwgYmUgY2xvbmVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXREcm9wVGFyZ2V0ID0gZnVuY3Rpb24oY2VsbHMsIGV2dCwgY2VsbCwgY2xvbmUpCit7CisJaWYgKCF0aGlzLmlzU3dpbWxhbmVOZXN0aW5nKCkpCisJeworCQlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorCQl7CisJCQlpZiAodGhpcy5pc1N3aW1sYW5lKGNlbGxzW2ldKSkKKwkJCXsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCX0KKworCXZhciBwdCA9IG14VXRpbHMuY29udmVydFBvaW50KHRoaXMuY29udGFpbmVyLAorCQlteEV2ZW50LmdldENsaWVudFgoZXZ0KSwgbXhFdmVudC5nZXRDbGllbnRZKGV2dCkpOworCXB0LnggLT0gdGhpcy5wYW5EeDsKKwlwdC55IC09IHRoaXMucGFuRHk7CisJdmFyIHN3aW1sYW5lID0gdGhpcy5nZXRTd2ltbGFuZUF0KHB0LngsIHB0LnkpOworCQorCWlmIChjZWxsID09IG51bGwpCisJeworCQljZWxsID0gc3dpbWxhbmU7CisJfQorCWVsc2UgaWYgKHN3aW1sYW5lICE9IG51bGwpCisJeworCQkvLyBDaGVja3MgaWYgdGhlIGNlbGwgaXMgYW4gYW5jZXN0b3Igb2YgdGhlIHN3aW1sYW5lCisJCS8vIHVuZGVyIHRoZSBtb3VzZSBhbmQgdXNlcyB0aGUgc3dpbWxhbmUgaW4gdGhhdCBjYXNlCisJCXZhciB0bXAgPSB0aGlzLm1vZGVsLmdldFBhcmVudChzd2ltbGFuZSk7CisJCQorCQl3aGlsZSAodG1wICE9IG51bGwgJiYgdGhpcy5pc1N3aW1sYW5lKHRtcCkgJiYgdG1wICE9IGNlbGwpCisJCXsKKwkJCXRtcCA9IHRoaXMubW9kZWwuZ2V0UGFyZW50KHRtcCk7CisJCX0KKwkJCisJCWlmICh0bXAgPT0gY2VsbCkKKwkJeworCQkJY2VsbCA9IHN3aW1sYW5lOworCQl9CisJfQorCQorCXdoaWxlIChjZWxsICE9IG51bGwgJiYgIXRoaXMuaXNWYWxpZERyb3BUYXJnZXQoY2VsbCwgY2VsbHMsIGV2dCkgJiYKKwkJIXRoaXMubW9kZWwuaXNMYXllcihjZWxsKSkKKwl7CisJCWNlbGwgPSB0aGlzLm1vZGVsLmdldFBhcmVudChjZWxsKTsKKwl9CisJCisJLy8gQ2hlY2tzIGlmIHBhcmVudCBpcyBkcm9wcGVkIGludG8gY2hpbGQgaWYgbm90IGNsb25pbmcKKwlpZiAoY2xvbmUgPT0gbnVsbCB8fCAhY2xvbmUpCisJeworCQl2YXIgcGFyZW50ID0gY2VsbDsKKwkJCisJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiBteFV0aWxzLmluZGV4T2YoY2VsbHMsIHBhcmVudCkgPCAwKQorCQl7CisJCQlwYXJlbnQgPSB0aGlzLm1vZGVsLmdldFBhcmVudChwYXJlbnQpOworCQl9CisJfQorCisJcmV0dXJuICghdGhpcy5tb2RlbC5pc0xheWVyKGNlbGwpICYmIHBhcmVudCA9PSBudWxsKSA/IGNlbGwgOiBudWxsOworfTsKKworLyoqCisgKiBHcm91cDogQ2VsbCByZXRyaWV2YWwKKyAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXREZWZhdWx0UGFyZW50CisgKiAKKyAqIFJldHVybnMgPGRlZmF1bHRQYXJlbnQ+IG9yIDxteEdyYXBoVmlldy5jdXJyZW50Um9vdD4gb3IgdGhlIGZpcnN0IGNoaWxkCisgKiBjaGlsZCBvZiA8bXhHcmFwaE1vZGVsLnJvb3Q+IGlmIGJvdGggYXJlIG51bGwuIFRoZSB2YWx1ZSByZXR1cm5lZCBieQorICogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCBhcyB0aGUgcGFyZW50IGZvciBuZXcgY2VsbHMgKGFrYSBkZWZhdWx0CisgKiBsYXllcikuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldERlZmF1bHRQYXJlbnQgPSBmdW5jdGlvbigpCit7CisJdmFyIHBhcmVudCA9IHRoaXMuZ2V0Q3VycmVudFJvb3QoKTsKKwkKKwlpZiAocGFyZW50ID09IG51bGwpCisJeworCQlwYXJlbnQgPSB0aGlzLmRlZmF1bHRQYXJlbnQ7CisJCQorCQlpZiAocGFyZW50ID09IG51bGwpCisJCXsKKwkJCXZhciByb290ID0gdGhpcy5tb2RlbC5nZXRSb290KCk7CisJCQlwYXJlbnQgPSB0aGlzLm1vZGVsLmdldENoaWxkQXQocm9vdCwgMCk7CisJCX0KKwl9CisJCisJcmV0dXJuIHBhcmVudDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldERlZmF1bHRQYXJlbnQKKyAqIAorICogU2V0cyB0aGUgPGRlZmF1bHRQYXJlbnQ+IHRvIHRoZSBnaXZlbiBjZWxsLiBTZXQgdGhpcyB0byBudWxsIHRvIHJldHVybgorICogdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSByb290IGluIGdldERlZmF1bHRQYXJlbnQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldERlZmF1bHRQYXJlbnQgPSBmdW5jdGlvbihjZWxsKQoreworCXRoaXMuZGVmYXVsdFBhcmVudCA9IGNlbGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTd2ltbGFuZQorICogCisgKiBSZXR1cm5zIHRoZSBuZWFyZXN0IGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBjZWxsIHdoaWNoIGlzIGEgc3dpbWxhbmUsIG9yCisgKiB0aGUgZ2l2ZW4gY2VsbCwgaWYgaXQgaXMgaXRzZWxmIGEgc3dpbWxhbmUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiBmb3Igd2hpY2ggdGhlIGFuY2VzdG9yIHN3aW1sYW5lIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0U3dpbWxhbmUgPSBmdW5jdGlvbihjZWxsKQoreworCXdoaWxlIChjZWxsICE9IG51bGwgJiYgIXRoaXMuaXNTd2ltbGFuZShjZWxsKSkKKwl7CisJCWNlbGwgPSB0aGlzLm1vZGVsLmdldFBhcmVudChjZWxsKTsKKwl9CisJCisJcmV0dXJuIGNlbGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTd2ltbGFuZUF0CisgKiAKKyAqIFJldHVybnMgdGhlIGJvdHRvbS1tb3N0IHN3aW1sYW5lIHRoYXQgaW50ZXJzZWN0cyB0aGUgZ2l2ZW4gcG9pbnQgKHgsIHkpCisgKiBpbiB0aGUgY2VsbCBoaWVyYXJjaHkgdGhhdCBzdGFydHMgYXQgdGhlIGdpdmVuIHBhcmVudC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogeCAtIFgtY29vcmRpbmF0ZSBvZiB0aGUgbG9jYXRpb24gdG8gYmUgY2hlY2tlZC4KKyAqIHkgLSBZLWNvb3JkaW5hdGUgb2YgdGhlIGxvY2F0aW9uIHRvIGJlIGNoZWNrZWQuCisgKiBwYXJlbnQgLSA8bXhDZWxsPiB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIHRoZSByb290IG9mIHRoZSByZWN1cnNpb24uCisgKiBEZWZhdWx0IGlzIDxkZWZhdWx0UGFyZW50Pi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0U3dpbWxhbmVBdCA9IGZ1bmN0aW9uICh4LCB5LCBwYXJlbnQpCit7CisJcGFyZW50ID0gcGFyZW50IHx8IHRoaXMuZ2V0RGVmYXVsdFBhcmVudCgpOworCQorCWlmIChwYXJlbnQgIT0gbnVsbCkKKwl7CisJCXZhciBjaGlsZENvdW50ID0gdGhpcy5tb2RlbC5nZXRDaGlsZENvdW50KHBhcmVudCk7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykKKwkJeworCQkJdmFyIGNoaWxkID0gdGhpcy5tb2RlbC5nZXRDaGlsZEF0KHBhcmVudCwgaSk7CisJCQl2YXIgcmVzdWx0ID0gdGhpcy5nZXRTd2ltbGFuZUF0KHgsIHksIGNoaWxkKTsKKwkJCQorCQkJaWYgKHJlc3VsdCAhPSBudWxsKQorCQkJeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQllbHNlIGlmICh0aGlzLmlzU3dpbWxhbmUoY2hpbGQpKQorCQkJeworCQkJCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShjaGlsZCk7CisJCQkJCisJCQkJaWYgKHRoaXMuaW50ZXJzZWN0cyhzdGF0ZSwgeCwgeSkpCisJCQkJeworCQkJCQlyZXR1cm4gY2hpbGQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXJldHVybiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q2VsbEF0CisgKiAKKyAqIFJldHVybnMgdGhlIGJvdHRvbS1tb3N0IGNlbGwgdGhhdCBpbnRlcnNlY3RzIHRoZSBnaXZlbiBwb2ludCAoeCwgeSkgaW4KKyAqIHRoZSBjZWxsIGhpZXJhcmNoeSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gcGFyZW50LiBUaGlzIHdpbGwgYWxzbyByZXR1cm4KKyAqIHN3aW1sYW5lcyBpZiB0aGUgZ2l2ZW4gbG9jYXRpb24gaW50ZXJzZWN0cyB0aGUgY29udGVudCBhcmVhIG9mIHRoZQorICogc3dpbWxhbmUuIElmIHRoaXMgaXMgbm90IGRlc2lyZWQsIHRoZW4gdGhlIDxoaXRzU3dpbWxhbmVDb250ZW50PiBtYXkgYmUKKyAqIHVzZWQgaWYgdGhlIHJldHVybmVkIGNlbGwgaXMgYSBzd2ltbGFuZSB0byBkZXRlcm1pbmUgaWYgdGhlIGxvY2F0aW9uCisgKiBpcyBpbnNpZGUgdGhlIGNvbnRlbnQgYXJlYSBvciBvbiB0aGUgYWN0dWFsIHRpdGxlIG9mIHRoZSBzd2ltbGFuZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogeCAtIFgtY29vcmRpbmF0ZSBvZiB0aGUgbG9jYXRpb24gdG8gYmUgY2hlY2tlZC4KKyAqIHkgLSBZLWNvb3JkaW5hdGUgb2YgdGhlIGxvY2F0aW9uIHRvIGJlIGNoZWNrZWQuCisgKiBwYXJlbnQgLSA8bXhDZWxsPiB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIHRoZSByb290IG9mIHRoZSByZWN1cnNpb24uCisgKiBEZWZhdWx0IGlzIGN1cnJlbnQgcm9vdCBvZiB0aGUgdmlldyBvciB0aGUgcm9vdCBvZiB0aGUgbW9kZWwuCisgKiB2ZXJ0aWNlcyAtIE9wdGlvbmFsIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB2ZXJ0aWNlcyBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiBEZWZhdWx0IGlzIHRydWUuCisgKiBlZGdlcyAtIE9wdGlvbmFsIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBlZGdlcyBzaG91bGQgYmUgcmV0dXJuZWQuIERlZmF1bHQKKyAqIGlzIHRydWUuCisgKiBpZ25vcmVGbiAtIE9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIGNlbGwgc2hvdWxkIGJlIGlnbm9yZWQuCisgKiBUaGUgZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBjZWxsIHN0YXRlIGFuZCB0aGUgeCBhbmQgeSBwYXJhbWV0ZXIuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldENlbGxBdCA9IGZ1bmN0aW9uKHgsIHksIHBhcmVudCwgdmVydGljZXMsIGVkZ2VzLCBpZ25vcmVGbikKK3sKKwl2ZXJ0aWNlcyA9ICh2ZXJ0aWNlcyAhPSBudWxsKSA/IHZlcnRpY2VzIDogdHJ1ZTsKKwllZGdlcyA9IChlZGdlcyAhPSBudWxsKSA/IGVkZ2VzIDogdHJ1ZTsKKworCWlmIChwYXJlbnQgPT0gbnVsbCkKKwl7CisJCXBhcmVudCA9IHRoaXMuZ2V0Q3VycmVudFJvb3QoKTsKKwkJCisJCWlmIChwYXJlbnQgPT0gbnVsbCkKKwkJeworCQkJcGFyZW50ID0gdGhpcy5nZXRNb2RlbCgpLmdldFJvb3QoKTsKKwkJfQorCX0KKworCWlmIChwYXJlbnQgIT0gbnVsbCkKKwl7CisJCXZhciBjaGlsZENvdW50ID0gdGhpcy5tb2RlbC5nZXRDaGlsZENvdW50KHBhcmVudCk7CisJCQorCQlmb3IgKHZhciBpID0gY2hpbGRDb3VudCAtIDE7IGkgPj0gMDsgaS0tKQorCQl7CisJCQl2YXIgY2VsbCA9IHRoaXMubW9kZWwuZ2V0Q2hpbGRBdChwYXJlbnQsIGkpOworCQkJdmFyIHJlc3VsdCA9IHRoaXMuZ2V0Q2VsbEF0KHgsIHksIGNlbGwsIHZlcnRpY2VzLCBlZGdlcywgaWdub3JlRm4pOworCQkJCisJCQlpZiAocmVzdWx0ICE9IG51bGwpCisJCQl7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWVsc2UgaWYgKHRoaXMuaXNDZWxsVmlzaWJsZShjZWxsKSAmJiAoZWRnZXMgJiYgdGhpcy5tb2RlbC5pc0VkZ2UoY2VsbCkgfHwKKwkJCQl2ZXJ0aWNlcyAmJiB0aGlzLm1vZGVsLmlzVmVydGV4KGNlbGwpKSkKKwkJCXsKKwkJCQl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoY2VsbCk7CisKKwkJCQlpZiAoc3RhdGUgIT0gbnVsbCAmJiAoaWdub3JlRm4gPT0gbnVsbCB8fCAhaWdub3JlRm4oc3RhdGUsIHgsIHkpKSAmJgorCQkJCQl0aGlzLmludGVyc2VjdHMoc3RhdGUsIHgsIHkpKQorCQkJCXsKKwkJCQkJcmV0dXJuIGNlbGw7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXJldHVybiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaW50ZXJzZWN0cworICogCisgKiBSZXR1cm5zIHRoZSBib3R0b20tbW9zdCBjZWxsIHRoYXQgaW50ZXJzZWN0cyB0aGUgZ2l2ZW4gcG9pbnQgKHgsIHkpIGluCisgKiB0aGUgY2VsbCBoaWVyYXJjaHkgdGhhdCBzdGFydHMgYXQgdGhlIGdpdmVuIHBhcmVudC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHRoYXQgcmVwcmVzZW50cyB0aGUgY2VsbCBzdGF0ZS4KKyAqIHggLSBYLWNvb3JkaW5hdGUgb2YgdGhlIGxvY2F0aW9uIHRvIGJlIGNoZWNrZWQuCisgKiB5IC0gWS1jb29yZGluYXRlIG9mIHRoZSBsb2NhdGlvbiB0byBiZSBjaGVja2VkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5pbnRlcnNlY3RzID0gZnVuY3Rpb24oc3RhdGUsIHgsIHkpCit7CisJaWYgKHN0YXRlICE9IG51bGwpCisJeworCQl2YXIgcHRzID0gc3RhdGUuYWJzb2x1dGVQb2ludHM7CisKKwkJaWYgKHB0cyAhPSBudWxsKQorCQl7CisJCQl2YXIgdDIgPSB0aGlzLnRvbGVyYW5jZSAqIHRoaXMudG9sZXJhbmNlOworCQkJdmFyIHB0ID0gcHRzWzBdOworCQkJCisJCQlmb3IgKHZhciBpID0gMTsgaSA8IHB0cy5sZW5ndGg7IGkrKykKKwkJCXsKKwkJCQl2YXIgbmV4dCA9IHB0c1tpXTsKKwkJCQl2YXIgZGlzdCA9IG14VXRpbHMucHRTZWdEaXN0U3EocHQueCwgcHQueSwgbmV4dC54LCBuZXh0LnksIHgsIHkpOworCQkJCQorCQkJCWlmIChkaXN0IDw9IHQyKQorCQkJCXsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCQorCQkJCXB0ID0gbmV4dDsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXZhciBhbHBoYSA9IG14VXRpbHMudG9SYWRpYW5zKG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX1JPVEFUSU9OKSB8fCAwKTsKKwkJCQorCQkJaWYgKGFscGhhICE9IDApCisJCQl7CisJCQkJdmFyIGNvcyA9IE1hdGguY29zKC1hbHBoYSk7CisJCQkJdmFyIHNpbiA9IE1hdGguc2luKC1hbHBoYSk7CisJCQkJdmFyIGN4ID0gbmV3IG14UG9pbnQoc3RhdGUuZ2V0Q2VudGVyWCgpLCBzdGF0ZS5nZXRDZW50ZXJZKCkpOworCQkJCXZhciBwdCA9IG14VXRpbHMuZ2V0Um90YXRlZFBvaW50KG5ldyBteFBvaW50KHgsIHkpLCBjb3MsIHNpbiwgY3gpOworCQkJCXggPSBwdC54OworCQkJCXkgPSBwdC55OworCQkJfQorCQkJCisJCQlpZiAobXhVdGlscy5jb250YWlucyhzdGF0ZSwgeCwgeSkpCisJCQl7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwl9CisJCisJcmV0dXJuIGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaGl0c1N3aW1sYW5lQ29udGVudAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGNvb3JkaW5hdGUgcGFpciBpcyBpbnNpZGUgdGhlIGNvbnRlbnQKKyAqIGFyZSBvZiB0aGUgZ2l2ZW4gc3dpbWxhbmUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN3aW1sYW5lIC0gPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIHN3aW1sYW5lLgorICogeCAtIFgtY29vcmRpbmF0ZSBvZiB0aGUgbW91c2UgZXZlbnQuCisgKiB5IC0gWS1jb29yZGluYXRlIG9mIHRoZSBtb3VzZSBldmVudC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaGl0c1N3aW1sYW5lQ29udGVudCA9IGZ1bmN0aW9uKHN3aW1sYW5lLCB4LCB5KQoreworCXZhciBzdGF0ZSA9IHRoaXMuZ2V0VmlldygpLmdldFN0YXRlKHN3aW1sYW5lKTsKKwl2YXIgc2l6ZSA9IHRoaXMuZ2V0U3RhcnRTaXplKHN3aW1sYW5lKTsKKwkKKwlpZiAoc3RhdGUgIT0gbnVsbCkKKwl7CisJCXZhciBzY2FsZSA9IHRoaXMuZ2V0VmlldygpLmdldFNjYWxlKCk7CisJCXggLT0gc3RhdGUueDsKKwkJeSAtPSBzdGF0ZS55OworCQkKKwkJaWYgKHNpemUud2lkdGggPiAwICYmIHggPiAwICYmIHggPiBzaXplLndpZHRoICogc2NhbGUpCisJCXsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWVsc2UgaWYgKHNpemUuaGVpZ2h0ID4gMCAmJiB5ID4gMCAmJiB5ID4gc2l6ZS5oZWlnaHQgKiBzY2FsZSkKKwkJeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJCisJcmV0dXJuIGZhbHNlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q2hpbGRWZXJ0aWNlcworICogCisgKiBSZXR1cm5zIHRoZSB2aXNpYmxlIGNoaWxkIHZlcnRpY2VzIG9mIHRoZSBnaXZlbiBwYXJlbnQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHBhcmVudCAtIDxteENlbGw+IHdob3NlIGNoaWxkcmVuIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0Q2hpbGRWZXJ0aWNlcyA9IGZ1bmN0aW9uKHBhcmVudCkKK3sKKwlyZXR1cm4gdGhpcy5nZXRDaGlsZENlbGxzKHBhcmVudCwgdHJ1ZSwgZmFsc2UpOworfTsKKwkKKy8qKgorICogRnVuY3Rpb246IGdldENoaWxkRWRnZXMKKyAqIAorICogUmV0dXJucyB0aGUgdmlzaWJsZSBjaGlsZCBlZGdlcyBvZiB0aGUgZ2l2ZW4gcGFyZW50LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBwYXJlbnQgLSA8bXhDZWxsPiB3aG9zZSBjaGlsZCB2ZXJ0aWNlcyBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldENoaWxkRWRnZXMgPSBmdW5jdGlvbihwYXJlbnQpCit7CisJcmV0dXJuIHRoaXMuZ2V0Q2hpbGRDZWxscyhwYXJlbnQsIGZhbHNlLCB0cnVlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldENoaWxkQ2VsbHMKKyAqIAorICogUmV0dXJucyB0aGUgdmlzaWJsZSBjaGlsZCB2ZXJ0aWNlcyBvciBlZGdlcyBpbiB0aGUgZ2l2ZW4gcGFyZW50LiBJZgorICogdmVydGljZXMgYW5kIGVkZ2VzIGlzIGZhbHNlLCB0aGVuIGFsbCBjaGlsZHJlbiBhcmUgcmV0dXJuZWQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHBhcmVudCAtIDxteENlbGw+IHdob3NlIGNoaWxkcmVuIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqIHZlcnRpY2VzIC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiBjaGlsZCB2ZXJ0aWNlcyBzaG91bGQKKyAqIGJlIHJldHVybmVkLiBEZWZhdWx0IGlzIGZhbHNlLgorICogZWRnZXMgLSBPcHRpb25hbCBib29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIGNoaWxkIGVkZ2VzIHNob3VsZAorICogYmUgcmV0dXJuZWQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldENoaWxkQ2VsbHMgPSBmdW5jdGlvbihwYXJlbnQsIHZlcnRpY2VzLCBlZGdlcykKK3sKKwlwYXJlbnQgPSAocGFyZW50ICE9IG51bGwpID8gcGFyZW50IDogdGhpcy5nZXREZWZhdWx0UGFyZW50KCk7CisJdmVydGljZXMgPSAodmVydGljZXMgIT0gbnVsbCkgPyB2ZXJ0aWNlcyA6IGZhbHNlOworCWVkZ2VzID0gKGVkZ2VzICE9IG51bGwpID8gZWRnZXMgOiBmYWxzZTsKKworCXZhciBjZWxscyA9IHRoaXMubW9kZWwuZ2V0Q2hpbGRDZWxscyhwYXJlbnQsIHZlcnRpY2VzLCBlZGdlcyk7CisJdmFyIHJlc3VsdCA9IFtdOworCisJLy8gRmlsdGVycyBvdXQgdGhlIG5vbi12aXNpYmxlIGNoaWxkIGNlbGxzCisJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwl7CisJCWlmICh0aGlzLmlzQ2VsbFZpc2libGUoY2VsbHNbaV0pKQorCQl7CisJCQlyZXN1bHQucHVzaChjZWxsc1tpXSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfTsKKwkKKy8qKgorICogRnVuY3Rpb246IGdldENvbm5lY3Rpb25zCisgKiAKKyAqIFJldHVybnMgYWxsIHZpc2libGUgZWRnZXMgY29ubmVjdGVkIHRvIHRoZSBnaXZlbiBjZWxsIHdpdGhvdXQgbG9vcHMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBjb25uZWN0aW9ucyBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiBwYXJlbnQgLSBPcHRpb25hbCBwYXJlbnQgb2YgdGhlIG9wcG9zaXRlIGVuZCBmb3IgYSBjb25uZWN0aW9uIHRvIGJlCisgKiByZXR1cm5lZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0Q29ubmVjdGlvbnMgPSBmdW5jdGlvbihjZWxsLCBwYXJlbnQpCit7CisJcmV0dXJuIHRoaXMuZ2V0RWRnZXMoY2VsbCwgcGFyZW50LCB0cnVlLCB0cnVlLCBmYWxzZSk7Cit9OworCQorLyoqCisgKiBGdW5jdGlvbjogZ2V0SW5jb21pbmdFZGdlcworICogCisgKiBSZXR1cm5zIHRoZSB2aXNpYmxlIGluY29taW5nIGVkZ2VzIGZvciB0aGUgZ2l2ZW4gY2VsbC4gSWYgdGhlIG9wdGlvbmFsCisgKiBwYXJlbnQgYXJndW1lbnQgaXMgc3BlY2lmaWVkLCB0aGVuIG9ubHkgY2hpbGQgZWRnZXMgb2YgdGhlIGdpdmVuIHBhcmVudAorICogYXJlIHJldHVybmVkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgaW5jb21pbmcgZWRnZXMgc2hvdWxkIGJlIHJldHVybmVkLgorICogcGFyZW50IC0gT3B0aW9uYWwgcGFyZW50IG9mIHRoZSBvcHBvc2l0ZSBlbmQgZm9yIGFuIGVkZ2UgdG8gYmUKKyAqIHJldHVybmVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRJbmNvbWluZ0VkZ2VzID0gZnVuY3Rpb24oY2VsbCwgcGFyZW50KQoreworCXJldHVybiB0aGlzLmdldEVkZ2VzKGNlbGwsIHBhcmVudCwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKK307CisJCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRPdXRnb2luZ0VkZ2VzCisgKiAKKyAqIFJldHVybnMgdGhlIHZpc2libGUgb3V0Z29pbmcgZWRnZXMgZm9yIHRoZSBnaXZlbiBjZWxsLiBJZiB0aGUgb3B0aW9uYWwKKyAqIHBhcmVudCBhcmd1bWVudCBpcyBzcGVjaWZpZWQsIHRoZW4gb25seSBjaGlsZCBlZGdlcyBvZiB0aGUgZ2l2ZW4gcGFyZW50CisgKiBhcmUgcmV0dXJuZWQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB3aG9zZSBvdXRnb2luZyBlZGdlcyBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiBwYXJlbnQgLSBPcHRpb25hbCBwYXJlbnQgb2YgdGhlIG9wcG9zaXRlIGVuZCBmb3IgYW4gZWRnZSB0byBiZQorICogcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldE91dGdvaW5nRWRnZXMgPSBmdW5jdGlvbihjZWxsLCBwYXJlbnQpCit7CisJcmV0dXJuIHRoaXMuZ2V0RWRnZXMoY2VsbCwgcGFyZW50LCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOworfTsKKwkKKy8qKgorICogRnVuY3Rpb246IGdldEVkZ2VzCisgKiAKKyAqIFJldHVybnMgdGhlIGluY29taW5nIGFuZC9vciBvdXRnb2luZyBlZGdlcyBmb3IgdGhlIGdpdmVuIGNlbGwuCisgKiBJZiB0aGUgb3B0aW9uYWwgcGFyZW50IGFyZ3VtZW50IGlzIHNwZWNpZmllZCwgdGhlbiBvbmx5IGVkZ2VzIGFyZSByZXR1cm5lZAorICogd2hlcmUgdGhlIG9wcG9zaXRlIGlzIGluIHRoZSBnaXZlbiBwYXJlbnQgY2VsbC4gSWYgYXQgbGVhc3Qgb25lIG9mIGluY29taW5nCisgKiBvciBvdXRnb2luZyBpcyB0cnVlLCB0aGVuIGxvb3BzIGFyZSBpZ25vcmVkLCBpZiBib3RoIGFyZSBmYWxzZSwgdGhlbiBhbGwKKyAqIGVkZ2VzIGNvbm5lY3RlZCB0byB0aGUgZ2l2ZW4gY2VsbCBhcmUgcmV0dXJuZWQgaW5jbHVkaW5nIGxvb3BzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgZWRnZXMgc2hvdWxkIGJlIHJldHVybmVkLgorICogcGFyZW50IC0gT3B0aW9uYWwgcGFyZW50IG9mIHRoZSBvcHBvc2l0ZSBlbmQgZm9yIGFuIGVkZ2UgdG8gYmUKKyAqIHJldHVybmVkLgorICogaW5jb21pbmcgLSBPcHRpb25hbCBib29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIGluY29taW5nIGVkZ2VzIHNob3VsZAorICogYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC4gRGVmYXVsdCBpcyB0cnVlLgorICogb3V0Z29pbmcgLSBPcHRpb25hbCBib29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIG91dGdvaW5nIGVkZ2VzIHNob3VsZAorICogYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC4gRGVmYXVsdCBpcyB0cnVlLgorICogaW5jbHVkZUxvb3BzIC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiBsb29wcyBzaG91bGQgYmUKKyAqIGluY2x1ZGVkIGluIHRoZSByZXN1bHQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqIHJlY3Vyc2UgLSBPcHRpb25hbCBib29sZWFuIHRoZSBzcGVjaWZpZXMgaWYgdGhlIHBhcmVudCBzcGVjaWZpZWQgb25seSAKKyAqIG5lZWQgYmUgYW4gYW5jZXN0cmFsIHBhcmVudCwgdHJ1ZSwgb3IgdGhlIGRpcmVjdCBwYXJlbnQsIGZhbHNlLgorICogRGVmYXVsdCBpcyBmYWxzZQorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRFZGdlcyA9IGZ1bmN0aW9uKGNlbGwsIHBhcmVudCwgaW5jb21pbmcsIG91dGdvaW5nLCBpbmNsdWRlTG9vcHMsIHJlY3Vyc2UpCit7CisJaW5jb21pbmcgPSAoaW5jb21pbmcgIT0gbnVsbCkgPyBpbmNvbWluZyA6IHRydWU7CisJb3V0Z29pbmcgPSAob3V0Z29pbmcgIT0gbnVsbCkgPyBvdXRnb2luZyA6IHRydWU7CisJaW5jbHVkZUxvb3BzID0gKGluY2x1ZGVMb29wcyAhPSBudWxsKSA/IGluY2x1ZGVMb29wcyA6IHRydWU7CisJcmVjdXJzZSA9IChyZWN1cnNlICE9IG51bGwpID8gcmVjdXJzZSA6IGZhbHNlOworCQorCXZhciBlZGdlcyA9IFtdOworCXZhciBpc0NvbGxhcHNlZCA9IHRoaXMuaXNDZWxsQ29sbGFwc2VkKGNlbGwpOworCXZhciBjaGlsZENvdW50ID0gdGhpcy5tb2RlbC5nZXRDaGlsZENvdW50KGNlbGwpOworCisJZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspCisJeworCQl2YXIgY2hpbGQgPSB0aGlzLm1vZGVsLmdldENoaWxkQXQoY2VsbCwgaSk7CisKKwkJaWYgKGlzQ29sbGFwc2VkIHx8ICF0aGlzLmlzQ2VsbFZpc2libGUoY2hpbGQpKQorCQl7CisJCQllZGdlcyA9IGVkZ2VzLmNvbmNhdCh0aGlzLm1vZGVsLmdldEVkZ2VzKGNoaWxkLCBpbmNvbWluZywgb3V0Z29pbmcpKTsKKwkJfQorCX0KKworCWVkZ2VzID0gZWRnZXMuY29uY2F0KHRoaXMubW9kZWwuZ2V0RWRnZXMoY2VsbCwgaW5jb21pbmcsIG91dGdvaW5nKSk7CisJdmFyIHJlc3VsdCA9IFtdOworCQorCWZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspCisJeworCQl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoZWRnZXNbaV0pOworCQkKKwkJdmFyIHNvdXJjZSA9IChzdGF0ZSAhPSBudWxsKSA/IHN0YXRlLmdldFZpc2libGVUZXJtaW5hbCh0cnVlKSA6IHRoaXMudmlldy5nZXRWaXNpYmxlVGVybWluYWwoZWRnZXNbaV0sIHRydWUpOworCQl2YXIgdGFyZ2V0ID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsKGZhbHNlKSA6IHRoaXMudmlldy5nZXRWaXNpYmxlVGVybWluYWwoZWRnZXNbaV0sIGZhbHNlKTsKKworCQlpZiAoKGluY2x1ZGVMb29wcyAmJiBzb3VyY2UgPT0gdGFyZ2V0KSB8fCAoKHNvdXJjZSAhPSB0YXJnZXQpICYmICgoaW5jb21pbmcgJiYKKwkJCXRhcmdldCA9PSBjZWxsICYmIChwYXJlbnQgPT0gbnVsbCB8fCB0aGlzLmlzVmFsaWRBbmNlc3Rvcihzb3VyY2UsIHBhcmVudCwgcmVjdXJzZSkpKSB8fAorCQkJKG91dGdvaW5nICYmIHNvdXJjZSA9PSBjZWxsICYmIChwYXJlbnQgPT0gbnVsbCB8fAorCQkJCQl0aGlzLmlzVmFsaWRBbmNlc3Rvcih0YXJnZXQsIHBhcmVudCwgcmVjdXJzZSkpKSkpKQorCQl7CisJCQlyZXN1bHQucHVzaChlZGdlc1tpXSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNWYWxpZEFuY2VzdG9yCisgKiAKKyAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBwYXJlbnQgaXMgYSB2YWxpZAorICogYW5jZXN0b3Igb2YgdGhlIHNwZWNpZmllZCBjZWxsLCBlaXRoZXIgZGlyZWN0IG9yIGluZGlyZWN0bHkKKyAqIGJhc2VkIG9uIHdoZXRoZXIgYW5jZXN0b3IgcmVjdXJzaW9uIGlzIGVuYWJsZWQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0aGUgcG9zc2libGUgY2hpbGQgY2VsbAorICogcGFyZW50IC0gPG14Q2VsbD4gdGhlIHBvc3NpYmxlIHBhcmVudCBjZWxsCisgKiByZWN1cnNlIC0gYm9vbGVhbiB3aGV0aGVyIG9yIG5vdCB0byByZWN1cnNlIHRoZSBjaGlsZCBhbmNlc3RvcnMKKyAqLworbXhHcmFwaC5wcm90b3R5cGUuaXNWYWxpZEFuY2VzdG9yID0gZnVuY3Rpb24oY2VsbCwgcGFyZW50LCByZWN1cnNlKQoreworCXJldHVybiAocmVjdXJzZSA/IHRoaXMubW9kZWwuaXNBbmNlc3RvcihwYXJlbnQsIGNlbGwpIDogdGhpcy5tb2RlbAorCQkJLmdldFBhcmVudChjZWxsKSA9PSBwYXJlbnQpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0T3Bwb3NpdGVzCisgKiAKKyAqIFJldHVybnMgYWxsIGRpc3RpbmN0IHZpc2libGUgb3Bwb3NpdGUgY2VsbHMgZm9yIHRoZSBzcGVjaWZpZWQgdGVybWluYWwKKyAqIG9uIHRoZSBnaXZlbiBlZGdlcy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZWRnZXMgLSBBcnJheSBvZiA8bXhDZWxscz4gdGhhdCBjb250YWlucyB0aGUgZWRnZXMgd2hvc2Ugb3Bwb3NpdGUKKyAqIHRlcm1pbmFscyBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiB0ZXJtaW5hbCAtIFRlcm1pbmFsIHRoYXQgc3BlY2lmaWVzIHRoZSBlbmQgd2hvc2Ugb3Bwb3NpdGUgc2hvdWxkIGJlCisgKiByZXR1cm5lZC4KKyAqIHNvdXJjZSAtIE9wdGlvbmFsIGJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgc291cmNlIHRlcm1pbmFscyBzaG91bGQgYmUKKyAqIGluY2x1ZGVkIGluIHRoZSByZXN1bHQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqIHRhcmdldHMgLSBPcHRpb25hbCBib29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIHRhcmdlciB0ZXJtaW5hbHMgc2hvdWxkIGJlCisgKiBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldE9wcG9zaXRlcyA9IGZ1bmN0aW9uKGVkZ2VzLCB0ZXJtaW5hbCwgc291cmNlcywgdGFyZ2V0cykKK3sKKwlzb3VyY2VzID0gKHNvdXJjZXMgIT0gbnVsbCkgPyBzb3VyY2VzIDogdHJ1ZTsKKwl0YXJnZXRzID0gKHRhcmdldHMgIT0gbnVsbCkgPyB0YXJnZXRzIDogdHJ1ZTsKKwkKKwl2YXIgdGVybWluYWxzID0gW107CisJCisJLy8gRmFzdCBsb29rdXAgdG8gYXZvaWQgZHVwbGljYXRlcyBpbiB0ZXJtaW5hbHMgYXJyYXkKKwl2YXIgZGljdCA9IG5ldyBteERpY3Rpb25hcnkoKTsKKwkKKwlpZiAoZWRnZXMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShlZGdlc1tpXSk7CisJCQkKKwkJCXZhciBzb3VyY2UgPSAoc3RhdGUgIT0gbnVsbCkgPyBzdGF0ZS5nZXRWaXNpYmxlVGVybWluYWwodHJ1ZSkgOiB0aGlzLnZpZXcuZ2V0VmlzaWJsZVRlcm1pbmFsKGVkZ2VzW2ldLCB0cnVlKTsKKwkJCXZhciB0YXJnZXQgPSAoc3RhdGUgIT0gbnVsbCkgPyBzdGF0ZS5nZXRWaXNpYmxlVGVybWluYWwoZmFsc2UpIDogdGhpcy52aWV3LmdldFZpc2libGVUZXJtaW5hbChlZGdlc1tpXSwgZmFsc2UpOworCQkJCisJCQkvLyBDaGVja3MgaWYgdGhlIHRlcm1pbmFsIGlzIHRoZSBzb3VyY2Ugb2YgdGhlIGVkZ2UgYW5kIGlmIHRoZQorCQkJLy8gdGFyZ2V0IHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIHJlc3VsdAorCQkJaWYgKHNvdXJjZSA9PSB0ZXJtaW5hbCAmJiB0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQgIT0gdGVybWluYWwgJiYgdGFyZ2V0cykKKwkJCXsKKwkJCQlpZiAoIWRpY3QuZ2V0KHRhcmdldCkpCisJCQkJeworCQkJCQlkaWN0LnB1dCh0YXJnZXQsIHRydWUpOworCQkJCQl0ZXJtaW5hbHMucHVzaCh0YXJnZXQpOworCQkJCX0KKwkJCX0KKwkJCQorCQkJLy8gQ2hlY2tzIGlmIHRoZSB0ZXJtaW5hbCBpcyB0aGUgdGFnZXQgb2YgdGhlIGVkZ2UgYW5kIGlmIHRoZQorCQkJLy8gc291cmNlIHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIHJlc3VsdAorCQkJZWxzZSBpZiAodGFyZ2V0ID09IHRlcm1pbmFsICYmIHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZSAhPSB0ZXJtaW5hbCAmJiBzb3VyY2VzKQorCQkJeworCQkJCWlmICghZGljdC5nZXQoc291cmNlKSkKKwkJCQl7CisJCQkJCWRpY3QucHV0KHNvdXJjZSwgdHJ1ZSk7CisJCQkJCXRlcm1pbmFscy5wdXNoKHNvdXJjZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXJldHVybiB0ZXJtaW5hbHM7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRFZGdlc0JldHdlZW4KKyAqIAorICogUmV0dXJucyB0aGUgZWRnZXMgYmV0d2VlbiB0aGUgZ2l2ZW4gc291cmNlIGFuZCB0YXJnZXQuIFRoaXMgdGFrZXMgaW50bworICogYWNjb3VudCBjb2xsYXBzZWQgYW5kIGludmlzaWJsZSBjZWxscyBhbmQgcmV0dXJucyB0aGUgY29ubmVjdGVkIGVkZ2VzCisgKiBhcyBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc291cmNlIC0KKyAqIHRhcmdldCAtCisgKiBkaXJlY3RlZCAtCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldEVkZ2VzQmV0d2VlbiA9IGZ1bmN0aW9uKHNvdXJjZSwgdGFyZ2V0LCBkaXJlY3RlZCkKK3sKKwlkaXJlY3RlZCA9IChkaXJlY3RlZCAhPSBudWxsKSA/IGRpcmVjdGVkIDogZmFsc2U7CisJdmFyIGVkZ2VzID0gdGhpcy5nZXRFZGdlcyhzb3VyY2UpOworCXZhciByZXN1bHQgPSBbXTsKKworCS8vIENoZWNrcyBpZiB0aGUgZWRnZSBpcyBjb25uZWN0ZWQgdG8gdGhlIGNvcnJlY3QKKwkvLyBjZWxsIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBtYXRjaAorCWZvciAodmFyIGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspCisJeworCQl2YXIgc3RhdGUgPSB0aGlzLnZpZXcuZ2V0U3RhdGUoZWRnZXNbaV0pOworCQkKKwkJdmFyIHNyYyA9IChzdGF0ZSAhPSBudWxsKSA/IHN0YXRlLmdldFZpc2libGVUZXJtaW5hbCh0cnVlKSA6IHRoaXMudmlldy5nZXRWaXNpYmxlVGVybWluYWwoZWRnZXNbaV0sIHRydWUpOworCQl2YXIgdHJnID0gKHN0YXRlICE9IG51bGwpID8gc3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsKGZhbHNlKSA6IHRoaXMudmlldy5nZXRWaXNpYmxlVGVybWluYWwoZWRnZXNbaV0sIGZhbHNlKTsKKworCQlpZiAoKHNyYyA9PSBzb3VyY2UgJiYgdHJnID09IHRhcmdldCkgfHwgKCFkaXJlY3RlZCAmJiBzcmMgPT0gdGFyZ2V0ICYmIHRyZyA9PSBzb3VyY2UpKQorCQl7CisJCQlyZXN1bHQucHVzaChlZGdlc1tpXSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0UG9pbnRGb3JFdmVudAorICogCisgKiBSZXR1cm5zIGFuIDxteFBvaW50PiByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGV2ZW50IGluIHRoZSB1bnNjYWxlZCwKKyAqIG5vbi10cmFuc2xhdGVkIGNvb3JkaW5hdGUgc3BhY2Ugb2YgPGNvbnRhaW5lcj4gYW5kIGFwcGxpZXMgdGhlIGdyaWQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGV2dCAtIE1vdXNldmVudCB0aGF0IGNvbnRhaW5zIHRoZSBtb3VzZSBwb2ludGVyIGxvY2F0aW9uLgorICogYWRkT2Zmc2V0IC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgcG9zaXRpb24gc2hvdWxkIGJlCisgKiBvZmZzZXQgYnkgaGFsZiBvZiB0aGUgPGdyaWRTaXplPi4gRGVmYXVsdCBpcyB0cnVlLgorICovCisgbXhHcmFwaC5wcm90b3R5cGUuZ2V0UG9pbnRGb3JFdmVudCA9IGZ1bmN0aW9uKGV2dCwgYWRkT2Zmc2V0KQorIHsKKwl2YXIgcCA9IG14VXRpbHMuY29udmVydFBvaW50KHRoaXMuY29udGFpbmVyLAorCQlteEV2ZW50LmdldENsaWVudFgoZXZ0KSwgbXhFdmVudC5nZXRDbGllbnRZKGV2dCkpOworCQorCXZhciBzID0gdGhpcy52aWV3LnNjYWxlOworCXZhciB0ciA9IHRoaXMudmlldy50cmFuc2xhdGU7CisJdmFyIG9mZiA9IChhZGRPZmZzZXQgIT0gZmFsc2UpID8gdGhpcy5ncmlkU2l6ZSAvIDIgOiAwOworCQorCXAueCA9IHRoaXMuc25hcChwLnggLyBzIC0gdHIueCAtIG9mZik7CisJcC55ID0gdGhpcy5zbmFwKHAueSAvIHMgLSB0ci55IC0gb2ZmKTsKKwkKKwlyZXR1cm4gcDsKKyB9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDZWxscworICogCisgKiBSZXR1cm5zIHRoZSBjaGlsZCB2ZXJ0aWNlcyBhbmQgZWRnZXMgb2YgdGhlIGdpdmVuIHBhcmVudCB0aGF0IGFyZSBjb250YWluZWQKKyAqIGluIHRoZSBnaXZlbiByZWN0YW5nbGUuIFRoZSByZXN1bHQgaXMgYWRkZWQgdG8gdGhlIG9wdGlvbmFsIHJlc3VsdCBhcnJheSwKKyAqIHdoaWNoIGlzIHJldHVybmVkLiBJZiBubyByZXN1bHQgYXJyYXkgaXMgc3BlY2lmaWVkIHRoZW4gYSBuZXcgYXJyYXkgaXMKKyAqIGNyZWF0ZWQgYW5kIHJldHVybmVkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB4IC0gWC1jb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgKiB5IC0gWS1jb29yZGluYXRlIG9mIHRoZSByZWN0YW5nbGUuCisgKiB3aWR0aCAtIFdpZHRoIG9mIHRoZSByZWN0YW5nbGUuCisgKiBoZWlnaHQgLSBIZWlnaHQgb2YgdGhlIHJlY3RhbmdsZS4KKyAqIHBhcmVudCAtIDxteENlbGw+IHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIHJvb3Qgb2YgdGhlIHJlY3Vyc2lvbi4KKyAqIERlZmF1bHQgaXMgY3VycmVudCByb290IG9mIHRoZSB2aWV3IG9yIHRoZSByb290IG9mIHRoZSBtb2RlbC4KKyAqIHJlc3VsdCAtIE9wdGlvbmFsIGFycmF5IHRvIHN0b3JlIHRoZSByZXN1bHQgaW4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldENlbGxzID0gZnVuY3Rpb24oeCwgeSwgd2lkdGgsIGhlaWdodCwgcGFyZW50LCByZXN1bHQpCit7CisJcmVzdWx0ID0gKHJlc3VsdCAhPSBudWxsKSA/IHJlc3VsdCA6IFtdOworCQorCWlmICh3aWR0aCA+IDAgfHwgaGVpZ2h0ID4gMCkKKwl7CisJCXZhciBtb2RlbCA9IHRoaXMuZ2V0TW9kZWwoKTsKKwkJdmFyIHJpZ2h0ID0geCArIHdpZHRoOworCQl2YXIgYm90dG9tID0geSArIGhlaWdodDsKKworCQlpZiAocGFyZW50ID09IG51bGwpCisJCXsKKwkJCXBhcmVudCA9IHRoaXMuZ2V0Q3VycmVudFJvb3QoKTsKKwkJCQorCQkJaWYgKHBhcmVudCA9PSBudWxsKQorCQkJeworCQkJCXBhcmVudCA9IG1vZGVsLmdldFJvb3QoKTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKHBhcmVudCAhPSBudWxsKQorCQl7CisJCQl2YXIgY2hpbGRDb3VudCA9IG1vZGVsLmdldENoaWxkQ291bnQocGFyZW50KTsKKwkJCQorCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspCisJCQl7CisJCQkJdmFyIGNlbGwgPSBtb2RlbC5nZXRDaGlsZEF0KHBhcmVudCwgaSk7CisJCQkJdmFyIHN0YXRlID0gdGhpcy52aWV3LmdldFN0YXRlKGNlbGwpOworCQkJCQorCQkJCWlmIChzdGF0ZSAhPSBudWxsICYmIHRoaXMuaXNDZWxsVmlzaWJsZShjZWxsKSkKKwkJCQl7CisJCQkJCXZhciBkZWcgPSBteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9ST1RBVElPTikgfHwgMDsKKwkJCQkJdmFyIGJveCA9IHN0YXRlOworCQkJCQkKKwkJCQkJaWYgKGRlZyAhPSAwKQorCQkJCQl7CisJCQkJCQlib3ggPSBteFV0aWxzLmdldEJvdW5kaW5nQm94KGJveCwgZGVnKTsKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKChtb2RlbC5pc0VkZ2UoY2VsbCkgfHwgbW9kZWwuaXNWZXJ0ZXgoY2VsbCkpICYmCisJCQkJCQlib3gueCA+PSB4ICYmIGJveC55ICsgYm94LmhlaWdodCA8PSBib3R0b20gJiYKKwkJCQkJCWJveC55ID49IHkgJiYgYm94LnggKyBib3gud2lkdGggPD0gcmlnaHQpCisJCQkJCXsKKwkJCQkJCXJlc3VsdC5wdXNoKGNlbGwpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJdGhpcy5nZXRDZWxscyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjZWxsLCByZXN1bHQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDZWxsc0JleW9uZAorICogCisgKiBSZXR1cm5zIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gcGFyZW50IHRoYXQgYXJlIGNvbnRhaW5lZCBpbiB0aGUKKyAqIGhhbGZwYW5lIGZyb20gdGhlIGdpdmVuIHBvaW50ICh4MCwgeTApIHJpZ2h0d2FyZHMgb3IgZG93bndhcmRzCisgKiBkZXBlbmRpbmcgb24gcmlnaHRIYWxmcGFuZSBhbmQgYm90dG9tSGFsZnBhbmUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHgwIC0gWC1jb29yZGluYXRlIG9mIHRoZSBvcmlnaW4uCisgKiB5MCAtIFktY29vcmRpbmF0ZSBvZiB0aGUgb3JpZ2luLgorICogcGFyZW50IC0gT3B0aW9uYWwgPG14Q2VsbD4gd2hvc2UgY2hpbGRyZW4gc2hvdWxkIGJlIGNoZWNrZWQuIERlZmF1bHQgaXMKKyAqIDxkZWZhdWx0UGFyZW50Pi4KKyAqIHJpZ2h0SGFsZnBhbmUgLSBCb29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGNlbGxzIGluIHRoZSByaWdodCBoYWxmcGFuZQorICogZnJvbSB0aGUgb3JpZ2luIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqIGJvdHRvbUhhbGZwYW5lIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBjZWxscyBpbiB0aGUgYm90dG9tIGhhbGZwYW5lCisgKiBmcm9tIHRoZSBvcmlnaW4gc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRDZWxsc0JleW9uZCA9IGZ1bmN0aW9uKHgwLCB5MCwgcGFyZW50LCByaWdodEhhbGZwYW5lLCBib3R0b21IYWxmcGFuZSkKK3sKKwl2YXIgcmVzdWx0ID0gW107CisJCisJaWYgKHJpZ2h0SGFsZnBhbmUgfHwgYm90dG9tSGFsZnBhbmUpCisJeworCQlpZiAocGFyZW50ID09IG51bGwpCisJCXsKKwkJCXBhcmVudCA9IHRoaXMuZ2V0RGVmYXVsdFBhcmVudCgpOworCQl9CisJCQorCQlpZiAocGFyZW50ICE9IG51bGwpCisJCXsKKwkJCXZhciBjaGlsZENvdW50ID0gdGhpcy5tb2RlbC5nZXRDaGlsZENvdW50KHBhcmVudCk7CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKQorCQkJeworCQkJCXZhciBjaGlsZCA9IHRoaXMubW9kZWwuZ2V0Q2hpbGRBdChwYXJlbnQsIGkpOworCQkJCXZhciBzdGF0ZSA9IHRoaXMudmlldy5nZXRTdGF0ZShjaGlsZCk7CisJCQkJCisJCQkJaWYgKHRoaXMuaXNDZWxsVmlzaWJsZShjaGlsZCkgJiYgc3RhdGUgIT0gbnVsbCkKKwkJCQl7CisJCQkJCWlmICgoIXJpZ2h0SGFsZnBhbmUgfHwgc3RhdGUueCA+PSB4MCkgJiYKKwkJCQkJCSghYm90dG9tSGFsZnBhbmUgfHwgc3RhdGUueSA+PSB5MCkpCisJCQkJCXsKKwkJCQkJCXJlc3VsdC5wdXNoKGNoaWxkKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gcmVzdWx0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZmluZFRyZWVSb290cworICogCisgKiBSZXR1cm5zIGFsbCBjaGlsZHJlbiBpbiB0aGUgZ2l2ZW4gcGFyZW50IHdoaWNoIGRvIG5vdCBoYXZlIGluY29taW5nCisgKiBlZGdlcy4gSWYgdGhlIHJlc3VsdCBpcyBlbXB0eSB0aGVuIHRoZSB3aXRoIHRoZSBncmVhdGVzdCBkaWZmZXJlbmNlCisgKiBiZXR3ZWVuIGluY29taW5nIGFuZCBvdXRnb2luZyBlZGdlcyBpcyByZXR1cm5lZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogcGFyZW50IC0gPG14Q2VsbD4gd2hvc2UgY2hpbGRyZW4gc2hvdWxkIGJlIGNoZWNrZWQuCisgKiBpc29sYXRlIC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiBlZGdlcyBzaG91bGQgYmUgaWdub3JlZCBpZgorICogdGhlIG9wcG9zaXRlIGVuZCBpcyBub3QgYSBjaGlsZCBvZiB0aGUgZ2l2ZW4gcGFyZW50IGNlbGwuIERlZmF1bHQgaXMKKyAqIGZhbHNlLgorICogaW52ZXJ0IC0gT3B0aW9uYWwgYm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiBvdXRnb2luZyBvciBpbmNvbWluZyBlZGdlcworICogc2hvdWxkIGJlIGNvdW50ZWQgZm9yIGEgdHJlZSByb290LiBJZiBmYWxzZSB0aGVuIG91dGdvaW5nIGVkZ2VzIHdpbGwgYmUKKyAqIGNvdW50ZWQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmZpbmRUcmVlUm9vdHMgPSBmdW5jdGlvbihwYXJlbnQsIGlzb2xhdGUsIGludmVydCkKK3sKKwlpc29sYXRlID0gKGlzb2xhdGUgIT0gbnVsbCkgPyBpc29sYXRlIDogZmFsc2U7CisJaW52ZXJ0ID0gKGludmVydCAhPSBudWxsKSA/IGludmVydCA6IGZhbHNlOworCXZhciByb290cyA9IFtdOworCQorCWlmIChwYXJlbnQgIT0gbnVsbCkKKwl7CisJCXZhciBtb2RlbCA9IHRoaXMuZ2V0TW9kZWwoKTsKKwkJdmFyIGNoaWxkQ291bnQgPSBtb2RlbC5nZXRDaGlsZENvdW50KHBhcmVudCk7CisJCXZhciBiZXN0ID0gbnVsbDsKKwkJdmFyIG1heERpZmYgPSAwOworCQkKKwkJZm9yICh2YXIgaT0wOyBpPGNoaWxkQ291bnQ7IGkrKykKKwkJeworCQkJdmFyIGNlbGwgPSBtb2RlbC5nZXRDaGlsZEF0KHBhcmVudCwgaSk7CisJCQkKKwkJCWlmICh0aGlzLm1vZGVsLmlzVmVydGV4KGNlbGwpICYmIHRoaXMuaXNDZWxsVmlzaWJsZShjZWxsKSkKKwkJCXsKKwkJCQl2YXIgY29ubnMgPSB0aGlzLmdldENvbm5lY3Rpb25zKGNlbGwsIChpc29sYXRlKSA/IHBhcmVudCA6IG51bGwpOworCQkJCXZhciBmYW5PdXQgPSAwOworCQkJCXZhciBmYW5JbiA9IDA7CisJCQkJCisJCQkJZm9yICh2YXIgaiA9IDA7IGogPCBjb25ucy5sZW5ndGg7IGorKykKKwkJCQl7CisJCQkJCXZhciBzcmMgPSB0aGlzLnZpZXcuZ2V0VmlzaWJsZVRlcm1pbmFsKGNvbm5zW2pdLCB0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc3JjID09IGNlbGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbk91dCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFuSW4rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCQkJCX0KKwkJCQkKKwkJCQlpZiAoKGludmVydCAmJiBmYW5PdXQgPT0gMCAmJiBmYW5JbiA+IDApIHx8CisJCQkJCSghaW52ZXJ0ICYmIGZhbkluID09IDAgJiYgZmFuT3V0ID4gMCkpCisJCQkJeworCQkJCQlyb290cy5wdXNoKGNlbGwpOworCQkJCX0KKwkJCQkKKwkJCQl2YXIgZGlmZiA9IChpbnZlcnQpID8gZmFuSW4gLSBmYW5PdXQgOiBmYW5PdXQgLSBmYW5JbjsKKwkJCQkKKwkJCQlpZiAoZGlmZiA+IG1heERpZmYpCisJCQkJeworCQkJCQltYXhEaWZmID0gZGlmZjsKKwkJCQkJYmVzdCA9IGNlbGw7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlpZiAocm9vdHMubGVuZ3RoID09IDAgJiYgYmVzdCAhPSBudWxsKQorCQl7CisJCQlyb290cy5wdXNoKGJlc3QpOworCQl9CisJfQorCQorCXJldHVybiByb290czsKK307CisKKy8qKgorICogRnVuY3Rpb246IHRyYXZlcnNlCisgKiAKKyAqIFRyYXZlcnNlcyB0aGUgKGRpcmVjdGVkKSBncmFwaCBpbnZva2luZyB0aGUgZ2l2ZW4gZnVuY3Rpb24gZm9yIGVhY2gKKyAqIHZpc2l0ZWQgdmVydGV4IGFuZCBlZGdlLiBUaGUgZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIHRoZSBjdXJyZW50IHZlcnRleAorICogYW5kIHRoZSBpbmNvbWluZyBlZGdlIGFzIGEgcGFyYW1ldGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIG1ha2VzIHN1cmUKKyAqIGVhY2ggdmVydGV4IGlzIG9ubHkgdmlzaXRlZCBvbmNlLiBUaGUgZnVuY3Rpb24gbWF5IHJldHVybiBmYWxzZSBpZiB0aGUKKyAqIHRyYXZlcnNhbCBzaG91bGQgc3RvcCBhdCB0aGUgZ2l2ZW4gdmVydGV4LgorICogCisgKiBFeGFtcGxlOgorICogCisgKiAoY29kZSkKKyAqIG14TG9nLnNob3coKTsKKyAqIHZhciBjZWxsID0gZ3JhcGguZ2V0U2VsZWN0aW9uQ2VsbCgpOworICogZ3JhcGgudHJhdmVyc2UoY2VsbCwgZmFsc2UsIGZ1bmN0aW9uKHZlcnRleCwgZWRnZSkKKyAqIHsKKyAqICAgbXhMb2cuZGVidWcoZ3JhcGguZ2V0TGFiZWwodmVydGV4KSk7CisgKiB9KTsKKyAqIChlbmQpCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZlcnRleCAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgdmVydGV4IHdoZXJlIHRoZSB0cmF2ZXJzYWwgc3RhcnRzLgorICogZGlyZWN0ZWQgLSBPcHRpb25hbCBib29sZWFuIGluZGljYXRpbmcgaWYgZWRnZXMgc2hvdWxkIG9ubHkgYmUgdHJhdmVyc2VkCisgKiBmcm9tIHNvdXJjZSB0byB0YXJnZXQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqIGZ1bmMgLSBWaXNpdG9yIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIGN1cnJlbnQgdmVydGV4IGFuZCB0aGUgaW5jb21pbmcKKyAqIGVkZ2UgYXMgYXJndW1lbnRzLiBUaGUgdHJhdmVyc2FsIHN0b3BzIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLgorICogZWRnZSAtIE9wdGlvbmFsIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgaW5jb21pbmcgZWRnZS4gVGhpcyBpcworICogbnVsbCBmb3IgdGhlIGZpcnN0IHN0ZXAgb2YgdGhlIHRyYXZlcnNhbC4KKyAqIHZpc2l0ZWQgLSBPcHRpb25hbCA8bXhEaWN0aW9uYXJ5PiBmcm9tIGNlbGxzIHRvIHRydWUgZm9yIHRoZSB2aXNpdGVkIGNlbGxzLgorICogaW52ZXJzZSAtIE9wdGlvbmFsIGJvb2xlYW4gdG8gdHJhdmVyc2UgaW4gaW52ZXJzZSBkaXJlY3Rpb24uIERlZmF1bHQgaXMgZmFsc2UuCisgKiBUaGlzIGlzIGlnbm9yZWQgaWYgZGlyZWN0ZWQgaXMgZmFsc2UuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnRyYXZlcnNlID0gZnVuY3Rpb24odmVydGV4LCBkaXJlY3RlZCwgZnVuYywgZWRnZSwgdmlzaXRlZCwgaW52ZXJzZSkKK3sKKwlpZiAoZnVuYyAhPSBudWxsICYmIHZlcnRleCAhPSBudWxsKQorCXsKKwkJZGlyZWN0ZWQgPSAoZGlyZWN0ZWQgIT0gbnVsbCkgPyBkaXJlY3RlZCA6IHRydWU7CisJCWludmVyc2UgPSAoaW52ZXJzZSAhPSBudWxsKSA/IGludmVyc2UgOiBmYWxzZTsKKwkJdmlzaXRlZCA9IHZpc2l0ZWQgfHwgbmV3IG14RGljdGlvbmFyeSgpOworCQkKKwkJaWYgKCF2aXNpdGVkLmdldCh2ZXJ0ZXgpKQorCQl7CisJCQl2aXNpdGVkLnB1dCh2ZXJ0ZXgsIHRydWUpOworCQkJdmFyIHJlc3VsdCA9IGZ1bmModmVydGV4LCBlZGdlKTsKKwkJCQorCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdCkKKwkJCXsKKwkJCQl2YXIgZWRnZUNvdW50ID0gdGhpcy5tb2RlbC5nZXRFZGdlQ291bnQodmVydGV4KTsKKwkJCQkKKwkJCQlpZiAoZWRnZUNvdW50ID4gMCkKKwkJCQl7CisJCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWRnZUNvdW50OyBpKyspCisJCQkJCXsKKwkJCQkJCXZhciBlID0gdGhpcy5tb2RlbC5nZXRFZGdlQXQodmVydGV4LCBpKTsKKwkJCQkJCXZhciBpc1NvdXJjZSA9IHRoaXMubW9kZWwuZ2V0VGVybWluYWwoZSwgdHJ1ZSkgPT0gdmVydGV4OworCQkJCQkJCisJCQkJCQlpZiAoIWRpcmVjdGVkIHx8ICghaW52ZXJzZSA9PSBpc1NvdXJjZSkpCisJCQkJCQl7CisJCQkJCQkJdmFyIG5leHQgPSB0aGlzLm1vZGVsLmdldFRlcm1pbmFsKGUsICFpc1NvdXJjZSk7CisJCQkJCQkJdGhpcy50cmF2ZXJzZShuZXh0LCBkaXJlY3RlZCwgZnVuYywgZSwgdmlzaXRlZCwgaW52ZXJzZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9OworCisvKioKKyAqIEdyb3VwOiBTZWxlY3Rpb24KKyAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NlbGxTZWxlY3RlZAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGNlbGwgaXMgc2VsZWN0ZWQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiBmb3Igd2hpY2ggdGhlIHNlbGVjdGlvbiBzdGF0ZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzQ2VsbFNlbGVjdGVkID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlyZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25Nb2RlbCgpLmlzU2VsZWN0ZWQoY2VsbCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1NlbGVjdGlvbkVtcHR5CisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0aW9uIGlzIGVtcHR5LgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc1NlbGVjdGlvbkVtcHR5ID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmdldFNlbGVjdGlvbk1vZGVsKCkuaXNFbXB0eSgpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY2xlYXJTZWxlY3Rpb24KKyAqIAorICogQ2xlYXJzIHRoZSBzZWxlY3Rpb24gdXNpbmcgPG14R3JhcGhTZWxlY3Rpb25Nb2RlbC5jbGVhcj4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNsZWFyU2VsZWN0aW9uID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmdldFNlbGVjdGlvbk1vZGVsKCkuY2xlYXIoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFNlbGVjdGlvbkNvdW50CisgKiAKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBzZWxlY3RlZCBjZWxscy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uQ291bnQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuZ2V0U2VsZWN0aW9uTW9kZWwoKS5jZWxscy5sZW5ndGg7Cit9OworCQorLyoqCisgKiBGdW5jdGlvbjogZ2V0U2VsZWN0aW9uQ2VsbAorICogCisgKiBSZXR1cm5zIHRoZSBmaXJzdCBjZWxsIGZyb20gdGhlIGFycmF5IG9mIHNlbGVjdGVkIDxteENlbGxzPi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uQ2VsbCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25Nb2RlbCgpLmNlbGxzWzBdOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0U2VsZWN0aW9uQ2VsbHMKKyAqIAorICogUmV0dXJucyB0aGUgYXJyYXkgb2Ygc2VsZWN0ZWQgPG14Q2VsbHM+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5nZXRTZWxlY3Rpb25DZWxscyA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5nZXRTZWxlY3Rpb25Nb2RlbCgpLmNlbGxzLnNsaWNlKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRTZWxlY3Rpb25DZWxsCisgKiAKKyAqIFNldHMgdGhlIHNlbGVjdGlvbiBjZWxsLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdG8gYmUgc2VsZWN0ZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNldFNlbGVjdGlvbkNlbGwgPSBmdW5jdGlvbihjZWxsKQoreworCXRoaXMuZ2V0U2VsZWN0aW9uTW9kZWwoKS5zZXRDZWxsKGNlbGwpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0U2VsZWN0aW9uQ2VsbHMKKyAqIAorICogU2V0cyB0aGUgc2VsZWN0aW9uIGNlbGwuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGxzIC0gQXJyYXkgb2YgPG14Q2VsbHM+IHRvIGJlIHNlbGVjdGVkLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZXRTZWxlY3Rpb25DZWxscyA9IGZ1bmN0aW9uKGNlbGxzKQoreworCXRoaXMuZ2V0U2VsZWN0aW9uTW9kZWwoKS5zZXRDZWxscyhjZWxscyk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRTZWxlY3Rpb25DZWxsCisgKiAKKyAqIEFkZHMgdGhlIGdpdmVuIGNlbGwgdG8gdGhlIHNlbGVjdGlvbi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRvIGJlIGFkZCB0byB0aGUgc2VsZWN0aW9uLgorICovCitteEdyYXBoLnByb3RvdHlwZS5hZGRTZWxlY3Rpb25DZWxsID0gZnVuY3Rpb24oY2VsbCkKK3sKKwl0aGlzLmdldFNlbGVjdGlvbk1vZGVsKCkuYWRkQ2VsbChjZWxsKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZFNlbGVjdGlvbkNlbGxzCisgKiAKKyAqIEFkZHMgdGhlIGdpdmVuIGNlbGxzIHRvIHRoZSBzZWxlY3Rpb24uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGxzIC0gQXJyYXkgb2YgPG14Q2VsbHM+IHRvIGJlIGFkZGVkIHRvIHRoZSBzZWxlY3Rpb24uCisgKi8KK214R3JhcGgucHJvdG90eXBlLmFkZFNlbGVjdGlvbkNlbGxzID0gZnVuY3Rpb24oY2VsbHMpCit7CisJdGhpcy5nZXRTZWxlY3Rpb25Nb2RlbCgpLmFkZENlbGxzKGNlbGxzKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlbW92ZVNlbGVjdGlvbkNlbGwKKyAqIAorICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY2VsbCBmcm9tIHRoZSBzZWxlY3Rpb24uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0byBiZSByZW1vdmVkIGZyb20gdGhlIHNlbGVjdGlvbi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUucmVtb3ZlU2VsZWN0aW9uQ2VsbCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJdGhpcy5nZXRTZWxlY3Rpb25Nb2RlbCgpLnJlbW92ZUNlbGwoY2VsbCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZW1vdmVTZWxlY3Rpb25DZWxscworICogCisgKiBSZW1vdmVzIHRoZSBnaXZlbiBjZWxscyBmcm9tIHRoZSBzZWxlY3Rpb24uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGxzIC0gQXJyYXkgb2YgPG14Q2VsbHM+IHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uLgorICovCitteEdyYXBoLnByb3RvdHlwZS5yZW1vdmVTZWxlY3Rpb25DZWxscyA9IGZ1bmN0aW9uKGNlbGxzKQoreworCXRoaXMuZ2V0U2VsZWN0aW9uTW9kZWwoKS5yZW1vdmVDZWxscyhjZWxscyk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZWxlY3RSZWdpb24KKyAqIAorICogU2VsZWN0cyBhbmQgcmV0dXJucyB0aGUgY2VsbHMgaW5zaWRlIHRoZSBnaXZlbiByZWN0YW5nbGUgZm9yIHRoZQorICogc3BlY2lmaWVkIGV2ZW50LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiByZWN0IC0gPG14UmVjdGFuZ2xlPiB0aGF0IHJlcHJlc2VudHMgdGhlIHJlZ2lvbiB0byBiZSBzZWxlY3RlZC4KKyAqIGV2dCAtIE1vdXNlZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIHNlbGVjdGlvbi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2VsZWN0UmVnaW9uID0gZnVuY3Rpb24ocmVjdCwgZXZ0KQoreworCXZhciBjZWxscyA9IHRoaXMuZ2V0Q2VsbHMocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKKwl0aGlzLnNlbGVjdENlbGxzRm9yRXZlbnQoY2VsbHMsIGV2dCk7CisJCisJcmV0dXJuIGNlbGxzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2VsZWN0TmV4dENlbGwKKyAqIAorICogU2VsZWN0cyB0aGUgbmV4dCBjZWxsLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZWxlY3ROZXh0Q2VsbCA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnNlbGVjdENlbGwodHJ1ZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZWxlY3RQcmV2aW91c0NlbGwKKyAqIAorICogU2VsZWN0cyB0aGUgcHJldmlvdXMgY2VsbC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2VsZWN0UHJldmlvdXNDZWxsID0gZnVuY3Rpb24oKQoreworCXRoaXMuc2VsZWN0Q2VsbCgpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2VsZWN0UGFyZW50Q2VsbAorICogCisgKiBTZWxlY3RzIHRoZSBwYXJlbnQgY2VsbC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2VsZWN0UGFyZW50Q2VsbCA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnNlbGVjdENlbGwoZmFsc2UsIHRydWUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2VsZWN0Q2hpbGRDZWxsCisgKiAKKyAqIFNlbGVjdHMgdGhlIGZpcnN0IGNoaWxkIGNlbGwuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNlbGVjdENoaWxkQ2VsbCA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnNlbGVjdENlbGwoZmFsc2UsIGZhbHNlLCB0cnVlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNlbGVjdENlbGwKKyAqIAorICogU2VsZWN0cyB0aGUgbmV4dCwgcGFyZW50LCBmaXJzdCBjaGlsZCBvciBwcmV2aW91cyBjZWxsLCBpZiBhbGwgYXJndW1lbnRzCisgKiBhcmUgZmFsc2UuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGlzTmV4dCAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgbmV4dCBjZWxsIHNob3VsZCBiZSBzZWxlY3RlZC4KKyAqIGlzUGFyZW50IC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBwYXJlbnQgY2VsbCBzaG91bGQgYmUgc2VsZWN0ZWQuCisgKiBpc0NoaWxkIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBmaXJzdCBjaGlsZCBjZWxsIHNob3VsZCBiZSBzZWxlY3RlZC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2VsZWN0Q2VsbCA9IGZ1bmN0aW9uKGlzTmV4dCwgaXNQYXJlbnQsIGlzQ2hpbGQpCit7CisJdmFyIHNlbCA9IHRoaXMuc2VsZWN0aW9uTW9kZWw7CisJdmFyIGNlbGwgPSAoc2VsLmNlbGxzLmxlbmd0aCA+IDApID8gc2VsLmNlbGxzWzBdIDogbnVsbDsKKwkKKwlpZiAoc2VsLmNlbGxzLmxlbmd0aCA+IDEpCisJeworCQlzZWwuY2xlYXIoKTsKKwl9CisJCisJdmFyIHBhcmVudCA9IChjZWxsICE9IG51bGwpID8KKwkJdGhpcy5tb2RlbC5nZXRQYXJlbnQoY2VsbCkgOgorCQl0aGlzLmdldERlZmF1bHRQYXJlbnQoKTsKKwkKKwl2YXIgY2hpbGRDb3VudCA9IHRoaXMubW9kZWwuZ2V0Q2hpbGRDb3VudChwYXJlbnQpOworCQorCWlmIChjZWxsID09IG51bGwgJiYgY2hpbGRDb3VudCA+IDApCisJeworCQl2YXIgY2hpbGQgPSB0aGlzLm1vZGVsLmdldENoaWxkQXQocGFyZW50LCAwKTsKKwkJdGhpcy5zZXRTZWxlY3Rpb25DZWxsKGNoaWxkKTsKKwl9CisJZWxzZSBpZiAoKGNlbGwgPT0gbnVsbCB8fCBpc1BhcmVudCkgJiYKKwkJdGhpcy52aWV3LmdldFN0YXRlKHBhcmVudCkgIT0gbnVsbCAmJgorCQl0aGlzLm1vZGVsLmdldEdlb21ldHJ5KHBhcmVudCkgIT0gbnVsbCkKKwl7CisJCWlmICh0aGlzLmdldEN1cnJlbnRSb290KCkgIT0gcGFyZW50KQorCQl7CisJCQl0aGlzLnNldFNlbGVjdGlvbkNlbGwocGFyZW50KTsKKwkJfQorCX0KKwllbHNlIGlmIChjZWxsICE9IG51bGwgJiYgaXNDaGlsZCkKKwl7CisJCXZhciB0bXAgPSB0aGlzLm1vZGVsLmdldENoaWxkQ291bnQoY2VsbCk7CisJCQorCQlpZiAodG1wID4gMCkKKwkJeworCQkJdmFyIGNoaWxkID0gdGhpcy5tb2RlbC5nZXRDaGlsZEF0KGNlbGwsIDApOworCQkJdGhpcy5zZXRTZWxlY3Rpb25DZWxsKGNoaWxkKTsKKwkJfQorCX0KKwllbHNlIGlmIChjaGlsZENvdW50ID4gMCkKKwl7CisJCXZhciBpID0gcGFyZW50LmdldEluZGV4KGNlbGwpOworCQkKKwkJaWYgKGlzTmV4dCkKKwkJeworCQkJaSsrOworCQkJdmFyIGNoaWxkID0gdGhpcy5tb2RlbC5nZXRDaGlsZEF0KHBhcmVudCwgaSAlIGNoaWxkQ291bnQpOworCQkJdGhpcy5zZXRTZWxlY3Rpb25DZWxsKGNoaWxkKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWktLTsKKwkJCXZhciBpbmRleCA9ICAoaSA8IDApID8gY2hpbGRDb3VudCAtIDEgOiBpOworCQkJdmFyIGNoaWxkID0gdGhpcy5tb2RlbC5nZXRDaGlsZEF0KHBhcmVudCwgaW5kZXgpOworCQkJdGhpcy5zZXRTZWxlY3Rpb25DZWxsKGNoaWxkKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHNlbGVjdEFsbAorICogCisgKiBTZWxlY3RzIGFsbCBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gcGFyZW50IGNlbGwgb3IgdGhlIGNoaWxkcmVuIG9mIHRoZQorICogZGVmYXVsdCBwYXJlbnQgaWYgbm8gcGFyZW50IGlzIHNwZWNpZmllZC4gVG8gc2VsZWN0IGxlYWYgdmVydGljZXMgYW5kL29yCisgKiBlZGdlcyB1c2UgPHNlbGVjdENlbGxzPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogcGFyZW50IC0gT3B0aW9uYWwgPG14Q2VsbD4gd2hvc2UgY2hpbGRyZW4gc2hvdWxkIGJlIHNlbGVjdGVkLgorICogRGVmYXVsdCBpcyA8ZGVmYXVsdFBhcmVudD4uCisgKiBkZXNjZW5kYW50cyAtIE9wdGlvbmFsIGJvb2xlYW4gc3BlY2lmeWluZyB3aGV0aGVyIGFsbCBkZXNjZW5kYW50cyBzaG91bGQgYmUKKyAqIHNlbGVjdGVkLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZWxlY3RBbGwgPSBmdW5jdGlvbihwYXJlbnQsIGRlc2NlbmRhbnRzKQoreworCXBhcmVudCA9IHBhcmVudCB8fCB0aGlzLmdldERlZmF1bHRQYXJlbnQoKTsKKwkKKwl2YXIgY2VsbHMgPSAoZGVzY2VuZGFudHMpID8gdGhpcy5tb2RlbC5maWx0ZXJEZXNjZW5kYW50cyhmdW5jdGlvbihjZWxsKQorCXsKKwkJcmV0dXJuIGNlbGwgIT0gcGFyZW50OworCX0sIHBhcmVudCkgOiB0aGlzLm1vZGVsLmdldENoaWxkcmVuKHBhcmVudCk7CisJCisJaWYgKGNlbGxzICE9IG51bGwpCisJeworCQl0aGlzLnNldFNlbGVjdGlvbkNlbGxzKGNlbGxzKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZWxlY3RWZXJ0aWNlcworICogCisgKiBTZWxlY3QgYWxsIHZlcnRpY2VzIGluc2lkZSB0aGUgZ2l2ZW4gcGFyZW50IG9yIHRoZSBkZWZhdWx0IHBhcmVudC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2VsZWN0VmVydGljZXMgPSBmdW5jdGlvbihwYXJlbnQpCit7CisJdGhpcy5zZWxlY3RDZWxscyh0cnVlLCBmYWxzZSwgcGFyZW50KTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNlbGVjdFZlcnRpY2VzCisgKiAKKyAqIFNlbGVjdCBhbGwgdmVydGljZXMgaW5zaWRlIHRoZSBnaXZlbiBwYXJlbnQgb3IgdGhlIGRlZmF1bHQgcGFyZW50LgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZWxlY3RFZGdlcyA9IGZ1bmN0aW9uKHBhcmVudCkKK3sKKwl0aGlzLnNlbGVjdENlbGxzKGZhbHNlLCB0cnVlLCBwYXJlbnQpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2VsZWN0Q2VsbHMKKyAqIAorICogU2VsZWN0cyBhbGwgdmVydGljZXMgYW5kL29yIGVkZ2VzIGRlcGVuZGluZyBvbiB0aGUgZ2l2ZW4gYm9vbGVhbgorICogYXJndW1lbnRzIHJlY3Vyc2l2ZWx5LCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gcGFyZW50IG9yIHRoZSBkZWZhdWx0CisgKiBwYXJlbnQgaWYgbm8gcGFyZW50IGlzIHNwZWNpZmllZC4gVXNlIDxzZWxlY3RBbGw+IHRvIHNlbGVjdCBhbGwgY2VsbHMuCisgKiBGb3IgdmVydGljZXMsIG9ubHkgY2VsbHMgd2l0aCBubyBjaGlsZHJlbiBhcmUgc2VsZWN0ZWQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZlcnRpY2VzIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHZlcnRpY2VzIHNob3VsZCBiZSBzZWxlY3RlZC4KKyAqIGVkZ2VzIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIGVkZ2VzIHNob3VsZCBiZSBzZWxlY3RlZC4KKyAqIHBhcmVudCAtIE9wdGlvbmFsIDxteENlbGw+IHRoYXQgYWN0cyBhcyB0aGUgcm9vdCBvZiB0aGUgcmVjdXJzaW9uLgorICogRGVmYXVsdCBpcyA8ZGVmYXVsdFBhcmVudD4uCisgKi8KK214R3JhcGgucHJvdG90eXBlLnNlbGVjdENlbGxzID0gZnVuY3Rpb24odmVydGljZXMsIGVkZ2VzLCBwYXJlbnQpCit7CisJcGFyZW50ID0gcGFyZW50IHx8IHRoaXMuZ2V0RGVmYXVsdFBhcmVudCgpOworCQorCXZhciBmaWx0ZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oY2VsbCkKKwl7CisJCXJldHVybiB0aGlzLnZpZXcuZ2V0U3RhdGUoY2VsbCkgIT0gbnVsbCAmJgorCQkJKCh0aGlzLm1vZGVsLmdldENoaWxkQ291bnQoY2VsbCkgPT0gMCAmJiB0aGlzLm1vZGVsLmlzVmVydGV4KGNlbGwpICYmIHZlcnRpY2VzCisJCQkmJiAhdGhpcy5tb2RlbC5pc0VkZ2UodGhpcy5tb2RlbC5nZXRQYXJlbnQoY2VsbCkpKSB8fAorCQkJKHRoaXMubW9kZWwuaXNFZGdlKGNlbGwpICYmIGVkZ2VzKSk7CisJfSk7CisJCisJdmFyIGNlbGxzID0gdGhpcy5tb2RlbC5maWx0ZXJEZXNjZW5kYW50cyhmaWx0ZXIsIHBhcmVudCk7CisJdGhpcy5zZXRTZWxlY3Rpb25DZWxscyhjZWxscyk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZWxlY3RDZWxsRm9yRXZlbnQKKyAqIAorICogU2VsZWN0cyB0aGUgZ2l2ZW4gY2VsbCBieSBlaXRoZXIgYWRkaW5nIGl0IHRvIHRoZSBzZWxlY3Rpb24gb3IKKyAqIHJlcGxhY2luZyB0aGUgc2VsZWN0aW9uIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBnaXZlbiBtb3VzZSBldmVudCBpcyBhCisgKiB0b2dnbGUgZXZlbnQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0byBiZSBzZWxlY3RlZC4KKyAqIGV2dCAtIE9wdGlvbmFsIG1vdXNlZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIHNlbGVjdGlvbi4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuc2VsZWN0Q2VsbEZvckV2ZW50ID0gZnVuY3Rpb24oY2VsbCwgZXZ0KQoreworCXZhciBpc1NlbGVjdGVkID0gdGhpcy5pc0NlbGxTZWxlY3RlZChjZWxsKTsKKwkKKwlpZiAodGhpcy5pc1RvZ2dsZUV2ZW50KGV2dCkpCisJeworCQlpZiAoaXNTZWxlY3RlZCkKKwkJeworCQkJdGhpcy5yZW1vdmVTZWxlY3Rpb25DZWxsKGNlbGwpOworCQl9CisJCWVsc2UKKwkJeworCQkJdGhpcy5hZGRTZWxlY3Rpb25DZWxsKGNlbGwpOworCQl9CisJfQorCWVsc2UgaWYgKCFpc1NlbGVjdGVkIHx8IHRoaXMuZ2V0U2VsZWN0aW9uQ291bnQoKSAhPSAxKQorCXsKKwkJdGhpcy5zZXRTZWxlY3Rpb25DZWxsKGNlbGwpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHNlbGVjdENlbGxzRm9yRXZlbnQKKyAqIAorICogU2VsZWN0cyB0aGUgZ2l2ZW4gY2VsbHMgYnkgZWl0aGVyIGFkZGluZyB0aGVtIHRvIHRoZSBzZWxlY3Rpb24gb3IKKyAqIHJlcGxhY2luZyB0aGUgc2VsZWN0aW9uIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBnaXZlbiBtb3VzZSBldmVudCBpcyBhCisgKiB0b2dnbGUgZXZlbnQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGxzIC0gQXJyYXkgb2YgPG14Q2VsbHM+IHRvIGJlIHNlbGVjdGVkLgorICogZXZ0IC0gT3B0aW9uYWwgbW91c2VldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgc2VsZWN0aW9uLgorICovCitteEdyYXBoLnByb3RvdHlwZS5zZWxlY3RDZWxsc0ZvckV2ZW50ID0gZnVuY3Rpb24oY2VsbHMsIGV2dCkKK3sKKwlpZiAodGhpcy5pc1RvZ2dsZUV2ZW50KGV2dCkpCisJeworCQl0aGlzLmFkZFNlbGVjdGlvbkNlbGxzKGNlbGxzKTsKKwl9CisJZWxzZQorCXsKKwkJdGhpcy5zZXRTZWxlY3Rpb25DZWxscyhjZWxscyk7CisJfQorfTsKKworLyoqCisgKiBHcm91cDogU2VsZWN0aW9uIHN0YXRlCisgKi8KKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlSGFuZGxlcgorICogCisgKiBDcmVhdGVzIGEgbmV3IGhhbmRsZXIgZm9yIHRoZSBnaXZlbiBjZWxsIHN0YXRlLiBUaGlzIGltcGxlbWVudGF0aW9uCisgKiByZXR1cm5zIGEgbmV3IDxteEVkZ2VIYW5kbGVyPiBvZiB0aGUgY29ycmVzcG9uZGluZyBjZWxsIGlzIGFuIGVkZ2UsCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBhbiA8bXhWZXJ0ZXhIYW5kbGVyPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHdob3NlIGhhbmRsZXIgc2hvdWxkIGJlIGNyZWF0ZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNyZWF0ZUhhbmRsZXIgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwl2YXIgcmVzdWx0ID0gbnVsbDsKKwkKKwlpZiAoc3RhdGUgIT0gbnVsbCkKKwl7CisJCWlmICh0aGlzLm1vZGVsLmlzRWRnZShzdGF0ZS5jZWxsKSkKKwkJeworCQkJdmFyIHNvdXJjZSA9IHN0YXRlLmdldFZpc2libGVUZXJtaW5hbFN0YXRlKHRydWUpOworCQkJdmFyIHRhcmdldCA9IHN0YXRlLmdldFZpc2libGVUZXJtaW5hbFN0YXRlKGZhbHNlKTsKKwkJCXZhciBnZW8gPSB0aGlzLmdldENlbGxHZW9tZXRyeShzdGF0ZS5jZWxsKTsKKwkJCQorCQkJdmFyIGVkZ2VTdHlsZSA9IHRoaXMudmlldy5nZXRFZGdlU3R5bGUoc3RhdGUsIChnZW8gIT0gbnVsbCkgPyBnZW8ucG9pbnRzIDogbnVsbCwgc291cmNlLCB0YXJnZXQpOworCQkJcmVzdWx0ID0gdGhpcy5jcmVhdGVFZGdlSGFuZGxlcihzdGF0ZSwgZWRnZVN0eWxlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJlc3VsdCA9IHRoaXMuY3JlYXRlVmVydGV4SGFuZGxlcihzdGF0ZSk7CisJCX0KKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZVZlcnRleEhhbmRsZXIKKyAqIAorICogSG9va3MgdG8gY3JlYXRlIGEgbmV3IDxteFZlcnRleEhhbmRsZXI+IGZvciB0aGUgZ2l2ZW4gPG14Q2VsbFN0YXRlPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHRvIGNyZWF0ZSB0aGUgaGFuZGxlciBmb3IuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNyZWF0ZVZlcnRleEhhbmRsZXIgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlyZXR1cm4gbmV3IG14VmVydGV4SGFuZGxlcihzdGF0ZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVFZGdlSGFuZGxlcgorICogCisgKiBIb29rcyB0byBjcmVhdGUgYSBuZXcgPG14RWRnZUhhbmRsZXI+IGZvciB0aGUgZ2l2ZW4gPG14Q2VsbFN0YXRlPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHRvIGNyZWF0ZSB0aGUgaGFuZGxlciBmb3IuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNyZWF0ZUVkZ2VIYW5kbGVyID0gZnVuY3Rpb24oc3RhdGUsIGVkZ2VTdHlsZSkKK3sKKwl2YXIgcmVzdWx0ID0gbnVsbDsKKwkKKwlpZiAoZWRnZVN0eWxlID09IG14RWRnZVN0eWxlLkxvb3AgfHwKKwkJZWRnZVN0eWxlID09IG14RWRnZVN0eWxlLkVsYm93Q29ubmVjdG9yIHx8CisJCWVkZ2VTdHlsZSA9PSBteEVkZ2VTdHlsZS5TaWRlVG9TaWRlIHx8CisJCWVkZ2VTdHlsZSA9PSBteEVkZ2VTdHlsZS5Ub3BUb0JvdHRvbSkKKwl7CisJCXJlc3VsdCA9IHRoaXMuY3JlYXRlRWxib3dFZGdlSGFuZGxlcihzdGF0ZSk7CisJfQorCWVsc2UgaWYgKGVkZ2VTdHlsZSA9PSBteEVkZ2VTdHlsZS5TZWdtZW50Q29ubmVjdG9yIHx8IAorCQkJZWRnZVN0eWxlID09IG14RWRnZVN0eWxlLk9ydGhDb25uZWN0b3IpCisJeworCQlyZXN1bHQgPSB0aGlzLmNyZWF0ZUVkZ2VTZWdtZW50SGFuZGxlcihzdGF0ZSk7CisJfQorCWVsc2UKKwl7CisJCXJlc3VsdCA9IG5ldyBteEVkZ2VIYW5kbGVyKHN0YXRlKTsKKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUVkZ2VTZWdtZW50SGFuZGxlcgorICogCisgKiBIb29rcyB0byBjcmVhdGUgYSBuZXcgPG14RWRnZVNlZ21lbnRIYW5kbGVyPiBmb3IgdGhlIGdpdmVuIDxteENlbGxTdGF0ZT4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB0byBjcmVhdGUgdGhlIGhhbmRsZXIgZm9yLgorICovCitteEdyYXBoLnByb3RvdHlwZS5jcmVhdGVFZGdlU2VnbWVudEhhbmRsZXIgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlyZXR1cm4gbmV3IG14RWRnZVNlZ21lbnRIYW5kbGVyKHN0YXRlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUVsYm93RWRnZUhhbmRsZXIKKyAqIAorICogSG9va3MgdG8gY3JlYXRlIGEgbmV3IDxteEVsYm93RWRnZUhhbmRsZXI+IGZvciB0aGUgZ2l2ZW4gPG14Q2VsbFN0YXRlPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHRvIGNyZWF0ZSB0aGUgaGFuZGxlciBmb3IuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNyZWF0ZUVsYm93RWRnZUhhbmRsZXIgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlyZXR1cm4gbmV3IG14RWxib3dFZGdlSGFuZGxlcihzdGF0ZSk7Cit9OworCisvKioKKyAqIEdyb3VwOiBHcmFwaCBldmVudHMKKyAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhZGRNb3VzZUxpc3RlbmVyCisgKiAKKyAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgZ3JhcGggZXZlbnQgZGlzcGF0Y2ggbG9vcC4gVGhlIGxpc3RlbmVyCisgKiBtdXN0IGltcGxlbWVudCB0aGUgbW91c2VEb3duLCBtb3VzZU1vdmUgYW5kIG1vdXNlVXAgbWV0aG9kcworICogYXMgc2hvd24gaW4gdGhlIDxteE1vdXNlRXZlbnQ+IGNsYXNzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBsaXN0ZW5lciAtIExpc3RlbmVyIHRvIGJlIGFkZGVkIHRvIHRoZSBncmFwaCBldmVudCBsaXN0ZW5lcnMuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmFkZE1vdXNlTGlzdGVuZXIgPSBmdW5jdGlvbihsaXN0ZW5lcikKK3sKKwlpZiAodGhpcy5tb3VzZUxpc3RlbmVycyA9PSBudWxsKQorCXsKKwkJdGhpcy5tb3VzZUxpc3RlbmVycyA9IFtdOworCX0KKwkKKwl0aGlzLm1vdXNlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVtb3ZlTW91c2VMaXN0ZW5lcgorICogCisgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgZ3JhcGggbGlzdGVuZXIuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGxpc3RlbmVyIC0gTGlzdGVuZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBncmFwaCBldmVudCBsaXN0ZW5lcnMuCisgKi8KK214R3JhcGgucHJvdG90eXBlLnJlbW92ZU1vdXNlTGlzdGVuZXIgPSBmdW5jdGlvbihsaXN0ZW5lcikKK3sKKwlpZiAodGhpcy5tb3VzZUxpc3RlbmVycyAhPSBudWxsKQorCXsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1vdXNlTGlzdGVuZXJzLmxlbmd0aDsgaSsrKQorCQl7CisJCQlpZiAodGhpcy5tb3VzZUxpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikKKwkJCXsKKwkJCQl0aGlzLm1vdXNlTGlzdGVuZXJzLnNwbGljZShpLCAxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZU1vdXNlRXZlbnQKKyAqIAorICogU2V0cyB0aGUgZ3JhcGhYIGFuZCBncmFwaFkgcHJvcGVydGllcyBpZiB0aGUgZ2l2ZW4gPG14TW91c2VFdmVudD4gaWYKKyAqIHJlcXVpcmVkIGFuZCByZXR1cm5lZCB0aGUgZXZlbnQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIG1lIC0gPG14TW91c2VFdmVudD4gdG8gYmUgdXBkYXRlZC4KKyAqIGV2dE5hbWUgLSBOYW1lIG9mIHRoZSBtb3VzZSBldmVudC4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUudXBkYXRlTW91c2VFdmVudCA9IGZ1bmN0aW9uKG1lLCBldnROYW1lKQoreworCWlmIChtZS5ncmFwaFggPT0gbnVsbCB8fCBtZS5ncmFwaFkgPT0gbnVsbCkKKwl7CisJCXZhciBwdCA9IG14VXRpbHMuY29udmVydFBvaW50KHRoaXMuY29udGFpbmVyLCBtZS5nZXRYKCksIG1lLmdldFkoKSk7CisJCQorCQltZS5ncmFwaFggPSBwdC54IC0gdGhpcy5wYW5EeDsKKwkJbWUuZ3JhcGhZID0gcHQueSAtIHRoaXMucGFuRHk7CisJCQorCQkvLyBTZWFyY2hlcyBmb3IgcmVjdGFuZ2xlcyB1c2luZyBtZXRob2QgaWYgbmF0aXZlIGhpdCBkZXRlY3Rpb24gaXMgZGlzYWJsZWQgb24gc2hhcGUKKwkJaWYgKG1lLmdldENlbGwoKSA9PSBudWxsICYmIHRoaXMuaXNNb3VzZURvd24gJiYgZXZ0TmFtZSA9PSBteEV2ZW50Lk1PVVNFX01PVkUpCisJCXsKKwkJCW1lLnN0YXRlID0gdGhpcy52aWV3LmdldFN0YXRlKHRoaXMuZ2V0Q2VsbEF0KHB0LngsIHB0LnksIG51bGwsIG51bGwsIG51bGwsIGZ1bmN0aW9uKHN0YXRlKQorCQkJeworCQkJCXJldHVybiBzdGF0ZS5zaGFwZSA9PSBudWxsIHx8IHN0YXRlLnNoYXBlLnBhaW50QmFja2dyb3VuZCAhPSBteFJlY3RhbmdsZVNoYXBlLnByb3RvdHlwZS5wYWludEJhY2tncm91bmQgfHwKKwkJCQkJbXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfUE9JTlRFUl9FVkVOVFMsICcxJykgPT0gJzEnIHx8CisJCQkJCShzdGF0ZS5zaGFwZS5maWxsICE9IG51bGwgJiYgc3RhdGUuc2hhcGUuZmlsbCAhPSBteENvbnN0YW50cy5OT05FKTsKKwkJCX0pKTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gbWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTdGF0ZUZvckV2ZW50CisgKiAKKyAqIFJldHVybnMgdGhlIHN0YXRlIGZvciB0aGUgZ2l2ZW4gdG91Y2ggZXZlbnQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldFN0YXRlRm9yVG91Y2hFdmVudCA9IGZ1bmN0aW9uKGV2dCkKK3sKKwl2YXIgeCA9IG14RXZlbnQuZ2V0Q2xpZW50WChldnQpOworCXZhciB5ID0gbXhFdmVudC5nZXRDbGllbnRZKGV2dCk7CisJCisJLy8gRGlzcGF0Y2hlcyB0aGUgZHJvcCBldmVudCB0byB0aGUgZ3JhcGggd2hpY2gKKwkvLyBjb25zdW1lcyBhbmQgZXhlY3V0ZXMgdGhlIHNvdXJjZSBmdW5jdGlvbgorCXZhciBwdCA9IG14VXRpbHMuY29udmVydFBvaW50KHRoaXMuY29udGFpbmVyLCB4LCB5KTsKKworCXJldHVybiB0aGlzLnZpZXcuZ2V0U3RhdGUodGhpcy5nZXRDZWxsQXQocHQueCwgcHQueSkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFdmVudElnbm9yZWQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBzaG91bGQgYmUgaWdub3JlZCBpbiA8ZmlyZU1vdXNlRXZlbnQ+LgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc0V2ZW50SWdub3JlZCA9IGZ1bmN0aW9uKGV2dE5hbWUsIG1lLCBzZW5kZXIpCit7CisJdmFyIG1vdXNlRXZlbnQgPSBteEV2ZW50LmlzTW91c2VFdmVudChtZS5nZXRFdmVudCgpKTsKKwl2YXIgcmVzdWx0ID0gZmFsc2U7CisKKwkvLyBEcm9wcyBldmVudHMgdGhhdCBhcmUgZmlyZWQgbW9yZSB0aGFuIG9uY2UKKwlpZiAobWUuZ2V0RXZlbnQoKSA9PSB0aGlzLmxhc3RFdmVudCkKKwl7CisJCXJlc3VsdCA9IHRydWU7CisJfQorCWVsc2UKKwl7CisJCXRoaXMubGFzdEV2ZW50ID0gbWUuZ2V0RXZlbnQoKTsKKwl9CisKKwkvLyBJbnN0YWxscyBldmVudCBsaXN0ZW5lcnMgdG8gY2FwdHVyZSB0aGUgY29tcGxldGUgZ2VzdHVyZSBmcm9tIHRoZSBldmVudCBzb3VyY2UKKwkvLyBmb3Igbm9uLU1TIHRvdWNoIGV2ZW50cyBhcyBhIHdvcmthcm91bmQgZm9yIGFsbCBldmVudHMgZm9yIHRoZSBzYW1lIGdldHVyZSBiZWluZworCS8vIGZpcmVkIGZyb20gdGhlIGV2ZW50IHNvdXJjZSBldmVuIGlmIHRoYXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLgorCWlmICh0aGlzLmV2ZW50U291cmNlICE9IG51bGwgJiYgZXZ0TmFtZSAhPSBteEV2ZW50Lk1PVVNFX01PVkUpCisJeworCQlteEV2ZW50LnJlbW92ZUdlc3R1cmVMaXN0ZW5lcnModGhpcy5ldmVudFNvdXJjZSwgbnVsbCwgdGhpcy5tb3VzZU1vdmVSZWRpcmVjdCwgdGhpcy5tb3VzZVVwUmVkaXJlY3QpOworCQl0aGlzLm1vdXNlTW92ZVJlZGlyZWN0ID0gbnVsbDsKKwkJdGhpcy5tb3VzZVVwUmVkaXJlY3QgPSBudWxsOworCQl0aGlzLmV2ZW50U291cmNlID0gbnVsbDsKKwl9CisJZWxzZSBpZiAodGhpcy5ldmVudFNvdXJjZSAhPSBudWxsICYmIG1lLmdldFNvdXJjZSgpICE9IHRoaXMuZXZlbnRTb3VyY2UpCisJeworCQlyZXN1bHQgPSB0cnVlOworCX0KKwllbHNlIGlmIChteENsaWVudC5JU19UT1VDSCAmJiBldnROYW1lID09IG14RXZlbnQuTU9VU0VfRE9XTiAmJiAhbW91c2VFdmVudCAmJiAhbXhFdmVudC5pc1BlbkV2ZW50KG1lLmdldEV2ZW50KCkpKQorCXsKKwkJdGhpcy5ldmVudFNvdXJjZSA9IG1lLmdldFNvdXJjZSgpOworCisJCXRoaXMubW91c2VNb3ZlUmVkaXJlY3QgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQl7CisJCQl0aGlzLmZpcmVNb3VzZUV2ZW50KG14RXZlbnQuTU9VU0VfTU9WRSwgbmV3IG14TW91c2VFdmVudChldnQsIHRoaXMuZ2V0U3RhdGVGb3JUb3VjaEV2ZW50KGV2dCkpKTsKKwkJfSk7CisJCXRoaXMubW91c2VVcFJlZGlyZWN0ID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwkJeworCQkJdGhpcy5maXJlTW91c2VFdmVudChteEV2ZW50Lk1PVVNFX1VQLCBuZXcgbXhNb3VzZUV2ZW50KGV2dCwgdGhpcy5nZXRTdGF0ZUZvclRvdWNoRXZlbnQoZXZ0KSkpOworCQl9KTsKKwkJCisJCW14RXZlbnQuYWRkR2VzdHVyZUxpc3RlbmVycyh0aGlzLmV2ZW50U291cmNlLCBudWxsLCB0aGlzLm1vdXNlTW92ZVJlZGlyZWN0LCB0aGlzLm1vdXNlVXBSZWRpcmVjdCk7CisJfQorCisJLy8gRmFjdG9yZWQgb3V0IHRoZSB3b3JrYXJvdW5kcyBmb3IgRkYgdG8gbWFrZSBpdCBlYXNpZXIgdG8gb3ZlcnJpZGUvcmVtb3ZlCisJLy8gTm90ZSB0aGlzIG1ldGhvZCBoYXMgc2lkZS1lZmZlY3RzIQorCWlmICh0aGlzLmlzU3ludGhldGljRXZlbnRJZ25vcmVkKGV2dE5hbWUsIG1lLCBzZW5kZXIpKQorCXsKKwkJcmVzdWx0ID0gdHJ1ZTsKKwl9CisKKwkvLyBOZXZlciBmaXJlcyBtb3VzZVVwLy1Eb3duIGZvciBkb3VibGUgY2xpY2tzCisJaWYgKCFteEV2ZW50LmlzUG9wdXBUcmlnZ2VyKHRoaXMubGFzdEV2ZW50KSAmJiBldnROYW1lICE9IG14RXZlbnQuTU9VU0VfTU9WRSAmJiB0aGlzLmxhc3RFdmVudC5kZXRhaWwgPT0gMikKKwl7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwkvLyBGaWx0ZXJzIG91dCBvZiBzZXF1ZW5jZSBldmVudHMgb3IgbWl4ZWQgZXZlbnQgdHlwZXMgZHVyaW5nIGEgZ2VzdHVyZQorCWlmIChldnROYW1lID09IG14RXZlbnQuTU9VU0VfVVAgJiYgdGhpcy5pc01vdXNlRG93bikKKwl7CisJCXRoaXMuaXNNb3VzZURvd24gPSBmYWxzZTsKKwl9CisJZWxzZSBpZiAoZXZ0TmFtZSA9PSBteEV2ZW50Lk1PVVNFX0RPV04gJiYgIXRoaXMuaXNNb3VzZURvd24pCisJeworCQl0aGlzLmlzTW91c2VEb3duID0gdHJ1ZTsKKwkJdGhpcy5pc01vdXNlVHJpZ2dlciA9IG1vdXNlRXZlbnQ7CisJfQorCS8vIERyb3BzIG1vdXNlIGV2ZW50cyB0aGF0IGFyZSBmaXJlZCBkdXJpbmcgdG91Y2ggZ2VzdHVyZXMgYXMgYSB3b3JrYXJvdW5kIGZvciBXZWJraXQKKwkvLyBhbmQgbW91c2UgZXZlbnRzIHRoYXQgYXJlIG5vdCBpbiBzeW5jIHdpdGggdGhlIGN1cnJlbnQgaW50ZXJuYWwgYnV0dG9uIHN0YXRlCisJZWxzZSBpZiAoIXJlc3VsdCAmJiAoKCghbXhDbGllbnQuSVNfRkYgfHwgZXZ0TmFtZSAhPSBteEV2ZW50Lk1PVVNFX01PVkUpICYmCisJCXRoaXMuaXNNb3VzZURvd24gJiYgdGhpcy5pc01vdXNlVHJpZ2dlciAhPSBtb3VzZUV2ZW50KSB8fAorCQkoZXZ0TmFtZSA9PSBteEV2ZW50Lk1PVVNFX0RPV04gJiYgdGhpcy5pc01vdXNlRG93bikgfHwKKwkJKGV2dE5hbWUgPT0gbXhFdmVudC5NT1VTRV9VUCAmJiAhdGhpcy5pc01vdXNlRG93bikpKQorCXsKKwkJcmVzdWx0ID0gdHJ1ZTsKKwl9CisJCisJaWYgKCFyZXN1bHQgJiYgZXZ0TmFtZSA9PSBteEV2ZW50Lk1PVVNFX0RPV04pCisJeworCQl0aGlzLmxhc3RNb3VzZVggPSBtZS5nZXRYKCk7CisJCXRoaXMubGFzdE1vdXNlWSA9IG1lLmdldFkoKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNTeW50aGV0aWNFdmVudElnbm9yZWQKKyAqIAorICogSG9vayBmb3IgaWdub3Jpbmcgc3ludGhldGljIG1vdXNlIGV2ZW50cyBhZnRlciB0b3VjaGVuZCBpbiBGaXJlZm94LgorICovCitteEdyYXBoLnByb3RvdHlwZS5pc1N5bnRoZXRpY0V2ZW50SWdub3JlZCA9IGZ1bmN0aW9uKGV2dE5hbWUsIG1lLCBzZW5kZXIpCit7CisJdmFyIHJlc3VsdCA9IGZhbHNlOworCXZhciBtb3VzZUV2ZW50ID0gbXhFdmVudC5pc01vdXNlRXZlbnQobWUuZ2V0RXZlbnQoKSk7CisJCisJLy8gTEFURVI6IFRoaXMgZG9lcyBub3QgY292ZXIgYWxsIHBvc3NpYmxlIGNhc2VzIHRoYXQgY2FuIGdvIHdyb25nIGluIEZGCisJaWYgKHRoaXMuaWdub3JlTW91c2VFdmVudHMgJiYgbW91c2VFdmVudCAmJiBldnROYW1lICE9IG14RXZlbnQuTU9VU0VfTU9WRSkKKwl7CisJCXRoaXMuaWdub3JlTW91c2VFdmVudHMgPSBldnROYW1lICE9IG14RXZlbnQuTU9VU0VfVVA7CisJCXJlc3VsdCA9IHRydWU7CisJfQorCWVsc2UgaWYgKG14Q2xpZW50LklTX0ZGICYmICFtb3VzZUV2ZW50ICYmIGV2dE5hbWUgPT0gbXhFdmVudC5NT1VTRV9VUCkKKwl7CisJCXRoaXMuaWdub3JlTW91c2VFdmVudHMgPSB0cnVlOworCX0KKwkKKwlyZXR1cm4gcmVzdWx0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFdmVudFNvdXJjZUlnbm9yZWQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBzaG91bGQgYmUgaWdub3JlZCBpbiA8ZmlyZU1vdXNlRXZlbnQ+LiBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgZm9yIHNlbGVjdCwgb3B0aW9uIGFuZCBpbnB1dCAoaWYgbm90IG9mIHR5cGUKKyAqIGNoZWNrYm94LCByYWRpbywgYnV0dG9uLCBzdWJtaXQgb3IgZmlsZSkgZXZlbnQgc291cmNlcyBpZiB0aGUgZXZlbnQgaXMgbm90CisgKiBhIG1vdXNlIGV2ZW50IG9yIGEgbGVmdCBtb3VzZSBidXR0b24gcHJlc3MgZXZlbnQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGV2dE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuCisgKiBtZSAtIDxteE1vdXNlRXZlbnQ+IHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmlzRXZlbnRTb3VyY2VJZ25vcmVkID0gZnVuY3Rpb24oZXZ0TmFtZSwgbWUpCit7CisJdmFyIHNvdXJjZSA9IG1lLmdldFNvdXJjZSgpOworCXZhciBuYW1lID0gKHNvdXJjZS5ub2RlTmFtZSAhPSBudWxsKSA/IHNvdXJjZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogJyc7CisJdmFyIGNhbmRpZGF0ZSA9ICFteEV2ZW50LmlzTW91c2VFdmVudChtZS5nZXRFdmVudCgpKSB8fCBteEV2ZW50LmlzTGVmdE1vdXNlQnV0dG9uKG1lLmdldEV2ZW50KCkpOworCQorCXJldHVybiBldnROYW1lID09IG14RXZlbnQuTU9VU0VfRE9XTiAmJiBjYW5kaWRhdGUgJiYgKG5hbWUgPT0gJ3NlbGVjdCcgfHwgbmFtZSA9PSAnb3B0aW9uJyB8fAorCQkobmFtZSA9PSAnaW5wdXQnICYmIHNvdXJjZS50eXBlICE9ICdjaGVja2JveCcgJiYgc291cmNlLnR5cGUgIT0gJ3JhZGlvJyAmJgorCQlzb3VyY2UudHlwZSAhPSAnYnV0dG9uJyAmJiBzb3VyY2UudHlwZSAhPSAnc3VibWl0JyAmJiBzb3VyY2UudHlwZSAhPSAnZmlsZScpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEV2ZW50U3RhdGUKKyAqIAorICogUmV0dXJucyB0aGUgPG14Q2VsbFN0YXRlPiB0byBiZSB1c2VkIHdoZW4gZmlyaW5nIHRoZSBtb3VzZSBldmVudCBmb3IgdGhlCisgKiBnaXZlbiBzdGF0ZS4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSBnaXZlbiBzdGF0ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogPG14Q2VsbFN0YXRlPiAtIFN0YXRlIHdob3NlIGV2ZW50IHNvdXJjZSBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmdldEV2ZW50U3RhdGUgPSBmdW5jdGlvbihzdGF0ZSkKK3sKKwlyZXR1cm4gc3RhdGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBmaXJlTW91c2VFdmVudAorICogCisgKiBEaXNwYXRjaGVzIHRoZSBnaXZlbiBldmVudCBpbiB0aGUgZ3JhcGggZXZlbnQgZGlzcGF0Y2ggbG9vcC4gUG9zc2libGUKKyAqIGV2ZW50IG5hbWVzIGFyZSA8bXhFdmVudC5NT1VTRV9ET1dOPiwgPG14RXZlbnQuTU9VU0VfTU9WRT4gYW5kCisgKiA8bXhFdmVudC5NT1VTRV9VUD4uIEFsbCBsaXN0ZW5lcnMgYXJlIGludm9rZWQgZm9yIGFsbCBldmVudHMgcmVnYXJkbGVzcworICogb2YgdGhlIGNvbnN1bWVkIHN0YXRlIG9mIHRoZSBldmVudC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZXZ0TmFtZSAtIFN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBldmVudCB0byBiZSBkaXNwYXRjaGVkLgorICogbWUgLSA8bXhNb3VzZUV2ZW50PiB0byBiZSBmaXJlZC4KKyAqIHNlbmRlciAtIE9wdGlvbmFsIHNlbmRlciBhcmd1bWVudC4gRGVmYXVsdCBpcyB0aGlzLgorICovCitteEdyYXBoLnByb3RvdHlwZS5maXJlTW91c2VFdmVudCA9IGZ1bmN0aW9uKGV2dE5hbWUsIG1lLCBzZW5kZXIpCit7CisJaWYgKHRoaXMuaXNFdmVudFNvdXJjZUlnbm9yZWQoZXZ0TmFtZSwgbWUpKQorCXsKKwkJaWYgKHRoaXMudG9vbHRpcEhhbmRsZXIgIT0gbnVsbCkKKwkJeworCQkJdGhpcy50b29sdGlwSGFuZGxlci5oaWRlKCk7CisJCX0KKwkJCisJCXJldHVybjsKKwl9CisJCisJaWYgKHNlbmRlciA9PSBudWxsKQorCXsKKwkJc2VuZGVyID0gdGhpczsKKwl9CisKKwkvLyBVcGRhdGVzIHRoZSBncmFwaCBjb29yZGluYXRlcyBpbiB0aGUgZXZlbnQKKwltZSA9IHRoaXMudXBkYXRlTW91c2VFdmVudChtZSwgZXZ0TmFtZSk7CisKKwkvLyBEZXRlY3RzIGFuZCBwcm9jZXNzZXMgZG91YmxlIHRhcHMgZm9yIHRvdWNoLWJhc2VkIGRldmljZXMgd2hpY2ggZG8gbm90IGhhdmUgbmF0aXZlIGRvdWJsZSBjbGljayBldmVudHMKKwkvLyBvciB3aGVyZSBkZXRlY3Rpb24gb2YgZG91YmxlIGNsaWNrIGlzIG5vdCBhbHdheXMgcG9zc2libGUgKHF1aXJrcywgSUUxMCspLiBOb3RlIHRoYXQgdGhpcyBjYW4gb25seSBoYW5kbGUKKwkvLyBkb3VibGUgY2xpY2tzIG9uIGNlbGxzIGJlY2F1c2UgdGhlIHNlcXVlbmNlIG9mIGV2ZW50cyBpbiBJRSBwcmV2ZW50cyBkZXRlY3Rpb24gb24gdGhlIGJhY2tncm91bmQsIGl0IGZpcmVzCisJLy8gdHdvIG1vdXNlIHVwcywgb25lIG9mIHdoaWNoIHdpdGhvdXQgYSBjZWxsIGJ1dCBubyBtb3VzZWRvd24gZm9yIHRoZSBzZWNvbmQgY2xpY2sgd2hpY2ggbWVhbnMgd2UgY2Fubm90CisJLy8gZGV0ZWN0IHdoaWNoIG1vdXNldXAocykgYXJlIHBhcnQgb2YgdGhlIGZpcnN0IGNsaWNrLCBpZSB3ZSBkbyBub3Qga25vdyB3aGVuIHRoZSBmaXJzdCBjbGljayBlbmRzLgorCWlmICgoIXRoaXMubmF0aXZlRGJsQ2xpY2tFbmFibGVkICYmICFteEV2ZW50LmlzUG9wdXBUcmlnZ2VyKG1lLmdldEV2ZW50KCkpKSB8fCAodGhpcy5kb3VibGVUYXBFbmFibGVkICYmCisJCW14Q2xpZW50LklTX1RPVUNIICYmIChteEV2ZW50LmlzVG91Y2hFdmVudChtZS5nZXRFdmVudCgpKSB8fCBteEV2ZW50LmlzUGVuRXZlbnQobWUuZ2V0RXZlbnQoKSkpKSkKKwl7CisJCXZhciBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOworCQkKKwkJLy8gTk9URTogU2Vjb25kIG1vdXNlRG93biBmb3IgZG91YmxlIGNsaWNrIG1pc3NpbmcgaW4gcXVpcmtzIG1vZGUKKwkJaWYgKCghbXhDbGllbnQuSVNfUVVJUktTICYmIGV2dE5hbWUgPT0gbXhFdmVudC5NT1VTRV9ET1dOKSB8fCAobXhDbGllbnQuSVNfUVVJUktTICYmIGV2dE5hbWUgPT0gbXhFdmVudC5NT1VTRV9VUCAmJiAhdGhpcy5maXJlRG91YmxlQ2xpY2spKQorCQl7CisJCQlpZiAodGhpcy5sYXN0VG91Y2hFdmVudCAhPSBudWxsICYmIHRoaXMubGFzdFRvdWNoRXZlbnQgIT0gbWUuZ2V0RXZlbnQoKSAmJgorCQkJCWN1cnJlbnRUaW1lIC0gdGhpcy5sYXN0VG91Y2hUaW1lIDwgdGhpcy5kb3VibGVUYXBUaW1lb3V0ICYmCisJCQkJTWF0aC5hYnModGhpcy5sYXN0VG91Y2hYIC0gbWUuZ2V0WCgpKSA8IHRoaXMuZG91YmxlVGFwVG9sZXJhbmNlICYmCisJCQkJTWF0aC5hYnModGhpcy5sYXN0VG91Y2hZIC0gbWUuZ2V0WSgpKSA8IHRoaXMuZG91YmxlVGFwVG9sZXJhbmNlICYmCisJCQkJdGhpcy5kb3VibGVDbGlja0NvdW50ZXIgPCAyKQorCQkJeworCQkJCXRoaXMuZG91YmxlQ2xpY2tDb3VudGVyKys7CisJCQkJdmFyIGRvdWJsZUNsaWNrRmlyZWQgPSBmYWxzZTsKKwkJCQkKKwkJCQlpZiAoZXZ0TmFtZSA9PSBteEV2ZW50Lk1PVVNFX1VQKQorCQkJCXsKKwkJCQkJaWYgKG1lLmdldENlbGwoKSA9PSB0aGlzLmxhc3RUb3VjaENlbGwgJiYgdGhpcy5sYXN0VG91Y2hDZWxsICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCXRoaXMubGFzdFRvdWNoVGltZSA9IDA7CisJCQkJCQl2YXIgY2VsbCA9IHRoaXMubGFzdFRvdWNoQ2VsbDsKKwkJCQkJCXRoaXMubGFzdFRvdWNoQ2VsbCA9IG51bGw7CisKKwkJCQkJCS8vIEZpcmVzIG5hdGl2ZSBkYmxjbGljayBldmVudCB2aWEgZXZlbnQgc291cmNlCisJCQkJCQkvLyBOT1RFOiBUaGlzIGZpcmVzIHR3byBkb3VibGUgY2xpY2sgZXZlbnRzIG9uIGVkZ2VzIGluIHF1aXJrcyBtb2RlLiBXaGlsZQorCQkJCQkJLy8gdHJ5aW5nIHRvIGZpeCB0aGlzLCB3ZSByZWFsaXplZCB0aGF0IG5hdGl2ZURvdWJsZUNsaWNrIGNhbiBiZSBkaXNhYmxlZCBmb3IKKwkJCQkJCS8vIHF1aXJrcyBhbmQgSUUxMCsgKG9yIHdlIGRpZG4ndCBmaW5kIHRoZSBjYXNlIG1lbnRpb25lZCBhYm92ZSB3aGVyZSBpdAorCQkJCQkJLy8gd291bGQgbm90IHdvcmspLCBpZS4gYWxsIGRvdWJsZSBjbGlja3Mgc2VlbSB0byBiZSB3b3JraW5nIHdpdGhvdXQgdGhpcy4KKwkJCQkJCWlmIChteENsaWVudC5JU19RVUlSS1MpCisJCQkJCQl7CisJCQkJCQkJbWUuZ2V0U291cmNlKCkuZmlyZUV2ZW50KCdvbmRibGNsaWNrJyk7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCXRoaXMuZGJsQ2xpY2sobWUuZ2V0RXZlbnQoKSwgY2VsbCk7CisJCQkJCQlkb3VibGVDbGlja0ZpcmVkID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl0aGlzLmZpcmVEb3VibGVDbGljayA9IHRydWU7CisJCQkJCXRoaXMubGFzdFRvdWNoVGltZSA9IDA7CisJCQkJfQorCisJCQkJLy8gRG8gbm90IGlnbm9yZSBtb3VzZSB1cCBpbiBxdWlya3MgaW4gdGhpcyBjYXNlCisJCQkJaWYgKCFteENsaWVudC5JU19RVUlSS1MgfHwgZG91YmxlQ2xpY2tGaXJlZCkKKwkJCQl7CisJCQkJCW14RXZlbnQuY29uc3VtZShtZS5nZXRFdmVudCgpKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYgKHRoaXMubGFzdFRvdWNoRXZlbnQgPT0gbnVsbCB8fCB0aGlzLmxhc3RUb3VjaEV2ZW50ICE9IG1lLmdldEV2ZW50KCkpCisJCQl7CisJCQkJdGhpcy5sYXN0VG91Y2hDZWxsID0gbWUuZ2V0Q2VsbCgpOworCQkJCXRoaXMubGFzdFRvdWNoWCA9IG1lLmdldFgoKTsKKwkJCQl0aGlzLmxhc3RUb3VjaFkgPSBtZS5nZXRZKCk7CisJCQkJdGhpcy5sYXN0VG91Y2hUaW1lID0gY3VycmVudFRpbWU7CisJCQkJdGhpcy5sYXN0VG91Y2hFdmVudCA9IG1lLmdldEV2ZW50KCk7CisJCQkJdGhpcy5kb3VibGVDbGlja0NvdW50ZXIgPSAwOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCh0aGlzLmlzTW91c2VEb3duIHx8IGV2dE5hbWUgPT0gbXhFdmVudC5NT1VTRV9VUCkgJiYgdGhpcy5maXJlRG91YmxlQ2xpY2spCisJCXsKKwkJCXRoaXMuZmlyZURvdWJsZUNsaWNrID0gZmFsc2U7CisJCQl2YXIgY2VsbCA9IHRoaXMubGFzdFRvdWNoQ2VsbDsKKwkJCXRoaXMubGFzdFRvdWNoQ2VsbCA9IG51bGw7CisJCQl0aGlzLmlzTW91c2VEb3duID0gZmFsc2U7CisJCQkKKwkJCS8vIFdvcmthcm91bmQgZm9yIENocm9tZS9TYWZhcmkgbm90IGZpcmluZyBuYXRpdmUgZG91YmxlIGNsaWNrIGV2ZW50cyBmb3IgZG91YmxlIHRvdWNoIG9uIGJhY2tncm91bmQKKwkJCXZhciB2YWxpZCA9IChjZWxsICE9IG51bGwpIHx8ICgobXhFdmVudC5pc1RvdWNoRXZlbnQobWUuZ2V0RXZlbnQoKSkgfHwgbXhFdmVudC5pc1BlbkV2ZW50KG1lLmdldEV2ZW50KCkpKSAmJgorCQkJCShteENsaWVudC5JU19HQyB8fCBteENsaWVudC5JU19TRikpOworCQkJCisJCQlpZiAodmFsaWQgJiYgTWF0aC5hYnModGhpcy5sYXN0VG91Y2hYIC0gbWUuZ2V0WCgpKSA8IHRoaXMuZG91YmxlVGFwVG9sZXJhbmNlICYmCisJCQkJTWF0aC5hYnModGhpcy5sYXN0VG91Y2hZIC0gbWUuZ2V0WSgpKSA8IHRoaXMuZG91YmxlVGFwVG9sZXJhbmNlKQorCQkJeworCQkJCXRoaXMuZGJsQ2xpY2sobWUuZ2V0RXZlbnQoKSwgY2VsbCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbXhFdmVudC5jb25zdW1lKG1lLmdldEV2ZW50KCkpOworCQkJfQorCQkJCisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAoIXRoaXMuaXNFdmVudElnbm9yZWQoZXZ0TmFtZSwgbWUsIHNlbmRlcikpCisJeworCQkvLyBVcGRhdGVzIHRoZSBldmVudCBzdGF0ZSB2aWEgZ2V0RXZlbnRTdGF0ZQorCQltZS5zdGF0ZSA9IHRoaXMuZ2V0RXZlbnRTdGF0ZShtZS5nZXRTdGF0ZSgpKTsKKwkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5GSVJFX01PVVNFX0VWRU5ULCAnZXZlbnROYW1lJywgZXZ0TmFtZSwgJ2V2ZW50JywgbWUpKTsKKwkJCisJCWlmICgobXhDbGllbnQuSVNfT1AgfHwgbXhDbGllbnQuSVNfU0YgfHwgbXhDbGllbnQuSVNfR0MgfHwgbXhDbGllbnQuSVNfSUUxMSB8fAorCQkJKG14Q2xpZW50LklTX0lFICYmIG14Q2xpZW50LklTX1NWRykgfHwgbWUuZ2V0RXZlbnQoKS50YXJnZXQgIT0gdGhpcy5jb250YWluZXIpKQorCQl7CisJCQlpZiAoZXZ0TmFtZSA9PSBteEV2ZW50Lk1PVVNFX01PVkUgJiYgdGhpcy5pc01vdXNlRG93biAmJiB0aGlzLmF1dG9TY3JvbGwgJiYgIW14RXZlbnQuaXNNdWx0aVRvdWNoRXZlbnQobWUuZ2V0RXZlbnQpKQorCQkJeworCQkJCXRoaXMuc2Nyb2xsUG9pbnRUb1Zpc2libGUobWUuZ2V0R3JhcGhYKCksIG1lLmdldEdyYXBoWSgpLCB0aGlzLmF1dG9FeHRlbmQpOworCQkJfQorCQkJZWxzZSBpZiAoZXZ0TmFtZSA9PSBteEV2ZW50Lk1PVVNFX1VQICYmIHRoaXMuaWdub3JlU2Nyb2xsYmFycyAmJiB0aGlzLnRyYW5zbGF0ZVRvU2Nyb2xsUG9zaXRpb24gJiYKKwkJCQkJKHRoaXMuY29udGFpbmVyLnNjcm9sbExlZnQgIT0gMCB8fCB0aGlzLmNvbnRhaW5lci5zY3JvbGxUb3AgIT0gMCkpCisJCQl7CisJCQkJdmFyIHMgPSB0aGlzLnZpZXcuc2NhbGU7CisJCQkJdmFyIHRyID0gdGhpcy52aWV3LnRyYW5zbGF0ZTsKKwkJCQl0aGlzLnZpZXcuc2V0VHJhbnNsYXRlKHRyLnggLSB0aGlzLmNvbnRhaW5lci5zY3JvbGxMZWZ0IC8gcywgdHIueSAtIHRoaXMuY29udGFpbmVyLnNjcm9sbFRvcCAvIHMpOworCQkJCXRoaXMuY29udGFpbmVyLnNjcm9sbExlZnQgPSAwOworCQkJCXRoaXMuY29udGFpbmVyLnNjcm9sbFRvcCA9IDA7CisJCQl9CisJCQkKKwkJCWlmICh0aGlzLm1vdXNlTGlzdGVuZXJzICE9IG51bGwpCisJCQl7CisJCQkJdmFyIGFyZ3MgPSBbc2VuZGVyLCBtZV07CisJCisJCQkJLy8gRG9lcyBub3QgY2hhbmdlIHJldHVyblZhbHVlIGluIE9wZXJhCisJCQkJaWYgKCFtZS5nZXRFdmVudCgpLnByZXZlbnREZWZhdWx0KQorCQkJCXsKKwkJCQkJbWUuZ2V0RXZlbnQoKS5yZXR1cm5WYWx1ZSA9IHRydWU7CisJCQkJfQorCQkJCQorCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5tb3VzZUxpc3RlbmVycy5sZW5ndGg7IGkrKykKKwkJCQl7CisJCQkJCXZhciBsID0gdGhpcy5tb3VzZUxpc3RlbmVyc1tpXTsKKwkJCQkJCisJCQkJCWlmIChldnROYW1lID09IG14RXZlbnQuTU9VU0VfRE9XTikKKwkJCQkJeworCQkJCQkJbC5tb3VzZURvd24uYXBwbHkobCwgYXJncyk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoZXZ0TmFtZSA9PSBteEV2ZW50Lk1PVVNFX01PVkUpCisJCQkJCXsKKwkJCQkJCWwubW91c2VNb3ZlLmFwcGx5KGwsIGFyZ3MpOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKGV2dE5hbWUgPT0gbXhFdmVudC5NT1VTRV9VUCkKKwkJCQkJeworCQkJCQkJbC5tb3VzZVVwLmFwcGx5KGwsIGFyZ3MpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJCisJCQkvLyBJbnZva2VzIHRoZSBjbGljayBoYW5kbGVyCisJCQlpZiAoZXZ0TmFtZSA9PSBteEV2ZW50Lk1PVVNFX1VQKQorCQkJeworCQkJCXRoaXMuY2xpY2sobWUpOworCQkJfQorCQl9CisJCQorCQkvLyBEZXRlY3RzIHRhcEFuZEhvbGQgZXZlbnRzIHVzaW5nIGEgdGltZXIKKwkJaWYgKChteEV2ZW50LmlzVG91Y2hFdmVudChtZS5nZXRFdmVudCgpKSB8fCBteEV2ZW50LmlzUGVuRXZlbnQobWUuZ2V0RXZlbnQoKSkpICYmCisJCQlldnROYW1lID09IG14RXZlbnQuTU9VU0VfRE9XTiAmJiB0aGlzLnRhcEFuZEhvbGRFbmFibGVkICYmICF0aGlzLnRhcEFuZEhvbGRJblByb2dyZXNzKQorCQl7CisJCQl0aGlzLnRhcEFuZEhvbGRJblByb2dyZXNzID0gdHJ1ZTsKKwkJCXRoaXMuaW5pdGlhbFRvdWNoWCA9IG1lLmdldEdyYXBoWCgpOworCQkJdGhpcy5pbml0aWFsVG91Y2hZID0gbWUuZ2V0R3JhcGhZKCk7CisJCQkKKwkJCXZhciBoYW5kbGVyID0gZnVuY3Rpb24oKQorCQkJeworCQkJCWlmICh0aGlzLnRhcEFuZEhvbGRWYWxpZCkKKwkJCQl7CisJCQkJCXRoaXMudGFwQW5kSG9sZChtZSk7CisJCQkJfQorCQkJCQorCQkJCXRoaXMudGFwQW5kSG9sZEluUHJvZ3Jlc3MgPSBmYWxzZTsKKwkJCQl0aGlzLnRhcEFuZEhvbGRWYWxpZCA9IGZhbHNlOworCQkJfTsKKwkJCQorCQkJaWYgKHRoaXMudGFwQW5kSG9sZFRocmVhZCkKKwkJCXsKKwkJCQl3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudGFwQW5kSG9sZFRocmVhZCk7CisJCQl9CisJCisJCQl0aGlzLnRhcEFuZEhvbGRUaHJlYWQgPSB3aW5kb3cuc2V0VGltZW91dChteFV0aWxzLmJpbmQodGhpcywgaGFuZGxlciksIHRoaXMudGFwQW5kSG9sZERlbGF5KTsKKwkJCXRoaXMudGFwQW5kSG9sZFZhbGlkID0gdHJ1ZTsKKwkJfQorCQllbHNlIGlmIChldnROYW1lID09IG14RXZlbnQuTU9VU0VfVVApCisJCXsKKwkJCXRoaXMudGFwQW5kSG9sZEluUHJvZ3Jlc3MgPSBmYWxzZTsKKwkJCXRoaXMudGFwQW5kSG9sZFZhbGlkID0gZmFsc2U7CisJCX0KKwkJZWxzZSBpZiAodGhpcy50YXBBbmRIb2xkVmFsaWQpCisJCXsKKwkJCXRoaXMudGFwQW5kSG9sZFZhbGlkID0KKwkJCQlNYXRoLmFicyh0aGlzLmluaXRpYWxUb3VjaFggLSBtZS5nZXRHcmFwaFgoKSkgPCB0aGlzLnRvbGVyYW5jZSAmJgorCQkJCU1hdGguYWJzKHRoaXMuaW5pdGlhbFRvdWNoWSAtIG1lLmdldEdyYXBoWSgpKSA8IHRoaXMudG9sZXJhbmNlOworCQl9CisKKwkJLy8gU3RvcHMgZWRpdGluZyBmb3IgYWxsIGV2ZW50cyBvdGhlciB0aGFuIGZyb20gY2VsbEVkaXRvcgorCQlpZiAoZXZ0TmFtZSA9PSBteEV2ZW50Lk1PVVNFX0RPV04gJiYgdGhpcy5pc0VkaXRpbmcoKSAmJiAhdGhpcy5jZWxsRWRpdG9yLmlzRXZlbnRTb3VyY2UobWUuZ2V0RXZlbnQoKSkpCisJCXsKKwkJCXRoaXMuc3RvcEVkaXRpbmcoIXRoaXMuaXNJbnZva2VzU3RvcENlbGxFZGl0aW5nKCkpOworCQl9CisKKwkJdGhpcy5jb25zdW1lTW91c2VFdmVudChldnROYW1lLCBtZSwgc2VuZGVyKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjb25zdW1lTW91c2VFdmVudAorICogCisgKiBDb25zdW1lcyB0aGUgZ2l2ZW4gPG14TW91c2VFdmVudD4gaWYgaXQncyBhIHRvdWNoU3RhcnQgZXZlbnQuCisgKi8KK214R3JhcGgucHJvdG90eXBlLmNvbnN1bWVNb3VzZUV2ZW50ID0gZnVuY3Rpb24oZXZ0TmFtZSwgbWUsIHNlbmRlcikKK3sKKwkvLyBXb3JrYXJvdW5kIGZvciBkdXBsaWNhdGUgY2xpY2sgaW4gV2luZG93cyA4IHdpdGggQ2hyb21lL0ZGL09wZXJhIHdpdGggdG91Y2gKKwlpZiAoZXZ0TmFtZSA9PSBteEV2ZW50Lk1PVVNFX0RPV04gJiYgbXhFdmVudC5pc1RvdWNoRXZlbnQobWUuZ2V0RXZlbnQoKSkpCisJeworCQltZS5jb25zdW1lKGZhbHNlKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBmaXJlR2VzdHVyZUV2ZW50CisgKiAKKyAqIERpc3BhdGNoZXMgYSA8bXhFdmVudC5HRVNUVVJFPiBldmVudC4gVGhlIGZvbGxvd2luZyBleGFtcGxlIHdpbGwgcmVzaXplIHRoZQorICogY2VsbCB1bmRlciB0aGUgbW91c2UgYmFzZWQgb24gdGhlIHNjYWxlIHByb3BlcnR5IG9mIHRoZSBuYXRpdmUgdG91Y2ggZXZlbnQuCisgKiAKKyAqIChjb2RlKQorICogZ3JhcGguYWRkTGlzdGVuZXIobXhFdmVudC5HRVNUVVJFLCBmdW5jdGlvbihzZW5kZXIsIGVvKQorICogeworICogICB2YXIgZXZ0ID0gZW8uZ2V0UHJvcGVydHkoJ2V2ZW50Jyk7CisgKiAgIHZhciBzdGF0ZSA9IGdyYXBoLnZpZXcuZ2V0U3RhdGUoZW8uZ2V0UHJvcGVydHkoJ2NlbGwnKSk7CisgKiAgIAorICogICBpZiAoZ3JhcGguaXNFbmFibGVkKCkgJiYgZ3JhcGguaXNDZWxsUmVzaXphYmxlKHN0YXRlLmNlbGwpICYmIE1hdGguYWJzKDEgLSBldnQuc2NhbGUpID4gMC4yKQorICogICB7CisgKiAgICAgdmFyIHNjYWxlID0gZ3JhcGgudmlldy5zY2FsZTsKKyAqICAgICB2YXIgdHIgPSBncmFwaC52aWV3LnRyYW5zbGF0ZTsKKyAqICAgICAKKyAqICAgICB2YXIgdyA9IHN0YXRlLndpZHRoICogZXZ0LnNjYWxlOworICogICAgIHZhciBoID0gc3RhdGUuaGVpZ2h0ICogZXZ0LnNjYWxlOworICogICAgIHZhciB4ID0gc3RhdGUueCAtICh3IC0gc3RhdGUud2lkdGgpIC8gMjsKKyAqICAgICB2YXIgeSA9IHN0YXRlLnkgLSAoaCAtIHN0YXRlLmhlaWdodCkgLyAyOworICogICAgIAorICogICAgIHZhciBib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUoZ3JhcGguc25hcCh4IC8gc2NhbGUpIC0gdHIueCwKKyAqICAgICAJCWdyYXBoLnNuYXAoeSAvIHNjYWxlKSAtIHRyLnksIGdyYXBoLnNuYXAodyAvIHNjYWxlKSwgZ3JhcGguc25hcChoIC8gc2NhbGUpKTsKKyAqICAgICBncmFwaC5yZXNpemVDZWxsKHN0YXRlLmNlbGwsIGJvdW5kcyk7CisgKiAgICAgZW8uY29uc3VtZSgpOworICogICB9CisgKiB9KTsKKyAqIChlbmQpCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGV2dCAtIEdlc3R1cmVlbmQgZXZlbnQgdGhhdCByZXByZXNlbnRzIHRoZSBnZXN0dXJlLgorICogY2VsbCAtIE9wdGlvbmFsIDxteENlbGw+IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2VzdHVyZS4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZmlyZUdlc3R1cmVFdmVudCA9IGZ1bmN0aW9uKGV2dCwgY2VsbCkKK3sKKwkvLyBSZXNldHMgZG91YmxlIHRhcCBldmVudCBoYW5kbGluZyB3aGVuIGdlc3R1cmVzIHRha2UgcGxhY2UKKwl0aGlzLmxhc3RUb3VjaFRpbWUgPSAwOworCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuR0VTVFVSRSwgJ2V2ZW50JywgZXZ0LCAnY2VsbCcsIGNlbGwpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqIAorICogRGVzdHJveXMgdGhlIGdyYXBoIGFuZCBhbGwgaXRzIHJlc291cmNlcy4KKyAqLworbXhHcmFwaC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAoIXRoaXMuZGVzdHJveWVkKQorCXsKKwkJdGhpcy5kZXN0cm95ZWQgPSB0cnVlOworCQkKKwkJaWYgKHRoaXMudG9vbHRpcEhhbmRsZXIgIT0gbnVsbCkKKwkJeworCQkJdGhpcy50b29sdGlwSGFuZGxlci5kZXN0cm95KCk7CisJCX0KKwkJCisJCWlmICh0aGlzLnNlbGVjdGlvbkNlbGxzSGFuZGxlciAhPSBudWxsKQorCQl7CisJCQl0aGlzLnNlbGVjdGlvbkNlbGxzSGFuZGxlci5kZXN0cm95KCk7CisJCX0KKworCQlpZiAodGhpcy5wYW5uaW5nSGFuZGxlciAhPSBudWxsKQorCQl7CisJCQl0aGlzLnBhbm5pbmdIYW5kbGVyLmRlc3Ryb3koKTsKKwkJfQorCisJCWlmICh0aGlzLnBvcHVwTWVudUhhbmRsZXIgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5wb3B1cE1lbnVIYW5kbGVyLmRlc3Ryb3koKTsKKwkJfQorCQkKKwkJaWYgKHRoaXMuY29ubmVjdGlvbkhhbmRsZXIgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5jb25uZWN0aW9uSGFuZGxlci5kZXN0cm95KCk7CisJCX0KKwkJCisJCWlmICh0aGlzLmdyYXBoSGFuZGxlciAhPSBudWxsKQorCQl7CisJCQl0aGlzLmdyYXBoSGFuZGxlci5kZXN0cm95KCk7CisJCX0KKwkJCisJCWlmICh0aGlzLmNlbGxFZGl0b3IgIT0gbnVsbCkKKwkJeworCQkJdGhpcy5jZWxsRWRpdG9yLmRlc3Ryb3koKTsKKwkJfQorCQkKKwkJaWYgKHRoaXMudmlldyAhPSBudWxsKQorCQl7CisJCQl0aGlzLnZpZXcuZGVzdHJveSgpOworCQl9CisKKwkJaWYgKHRoaXMubW9kZWwgIT0gbnVsbCAmJiB0aGlzLmdyYXBoTW9kZWxDaGFuZ2VMaXN0ZW5lciAhPSBudWxsKQorCQl7CisJCQl0aGlzLm1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMuZ3JhcGhNb2RlbENoYW5nZUxpc3RlbmVyKTsKKwkJCXRoaXMuZ3JhcGhNb2RlbENoYW5nZUxpc3RlbmVyID0gbnVsbDsKKwkJfQorCisJCXRoaXMuY29udGFpbmVyID0gbnVsbDsKKwl9Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3ZpZXcvbXhHcmFwaFNlbGVjdGlvbk1vZGVsLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3ZpZXcvbXhHcmFwaFNlbGVjdGlvbk1vZGVsLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTU0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teEdyYXBoU2VsZWN0aW9uTW9kZWwuanMKQEAgLTAsMCArMSw0MzYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14R3JhcGhTZWxlY3Rpb25Nb2RlbAorICoKKyAqIEltcGxlbWVudHMgdGhlIHNlbGVjdGlvbiBtb2RlbCBmb3IgYSBncmFwaC4gSGVyZSBpcyBhIGxpc3RlbmVyIHRoYXQgaGFuZGxlcworICogYWxsIHJlbW92ZWQgc2VsZWN0aW9uIGNlbGxzLgorICogCisgKiAoY29kZSkKKyAqIGdyYXBoLmdldFNlbGVjdGlvbk1vZGVsKCkuYWRkTGlzdGVuZXIobXhFdmVudC5DSEFOR0UsIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorICogeworICogICB2YXIgY2VsbHMgPSBldnQuZ2V0UHJvcGVydHkoJ2FkZGVkJyk7CisgKiAgIAorICogICBmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorICogICB7CisgKiAgICAgLy8gSGFuZGxlIGNlbGxzW2ldLi4uCisgKiAgIH0KKyAqIH0pOworICogKGVuZCkKKyAqIAorICogRXZlbnQ6IG14RXZlbnQuVU5ETworICogCisgKiBGaXJlcyBhZnRlciB0aGUgc2VsZWN0aW9uIHdhcyBjaGFuZ2VkIGluIDxjaGFuZ2VTZWxlY3Rpb24+LiBUaGUKKyAqIDxjb2RlPmVkaXQ8L2NvZGU+IHByb3BlcnR5IGNvbnRhaW5zIHRoZSA8bXhVbmRvYWJsZUVkaXQ+IHdoaWNoIGNvbnRhaW5zIHRoZQorICogPG14U2VsZWN0aW9uQ2hhbmdlPi4KKyAqIAorICogRXZlbnQ6IG14RXZlbnQuQ0hBTkdFCisgKiAKKyAqIEZpcmVzIGFmdGVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcyBieSBleGVjdXRpbmcgYW4gPG14U2VsZWN0aW9uQ2hhbmdlPi4gVGhlCisgKiA8Y29kZT5hZGRlZDwvY29kZT4gYW5kIDxjb2RlPnJlbW92ZWQ8L2NvZGU+IHByb3BlcnRpZXMgY29udGFpbiBhcnJheXMgb2YKKyAqIGNlbGxzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uLCByZXNwZWN0aXZlbHkuCisgKiBUaGUgbmFtZXMgYXJlIGludmVydGVkIGR1ZSB0byBoaXN0b3JpYyByZWFzb25zLiBUaGlzIGNhbm5vdCBiZSBjaGFuZ2VkLgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhHcmFwaFNlbGVjdGlvbk1vZGVsCisgKgorICogQ29uc3RydWN0cyBhIG5ldyBncmFwaCBzZWxlY3Rpb24gbW9kZWwgZm9yIHRoZSBnaXZlbiA8bXhHcmFwaD4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGdyYXBoIC0gUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgPG14R3JhcGg+LgorICovCitmdW5jdGlvbiBteEdyYXBoU2VsZWN0aW9uTW9kZWwoZ3JhcGgpCit7CisJdGhpcy5ncmFwaCA9IGdyYXBoOworCXRoaXMuY2VsbHMgPSBbXTsKK307CisKKy8qKgorICogRXh0ZW5kcyBteEV2ZW50U291cmNlLgorICovCitteEdyYXBoU2VsZWN0aW9uTW9kZWwucHJvdG90eXBlID0gbmV3IG14RXZlbnRTb3VyY2UoKTsKK214R3JhcGhTZWxlY3Rpb25Nb2RlbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBteEdyYXBoU2VsZWN0aW9uTW9kZWw7CisKKy8qKgorICogVmFyaWFibGU6IGRvbmVSZXNvdXJjZQorICogCisgKiBTcGVjaWZpZXMgdGhlIHJlc291cmNlIGtleSBmb3IgdGhlIHN0YXR1cyBtZXNzYWdlIGFmdGVyIGEgbG9uZyBvcGVyYXRpb24uCisgKiBJZiB0aGUgcmVzb3VyY2UgZm9yIHRoaXMga2V5IGRvZXMgbm90IGV4aXN0IHRoZW4gdGhlIHZhbHVlIGlzIHVzZWQgYXMKKyAqIHRoZSBzdGF0dXMgbWVzc2FnZS4gRGVmYXVsdCBpcyAnZG9uZScuCisgKi8KK214R3JhcGhTZWxlY3Rpb25Nb2RlbC5wcm90b3R5cGUuZG9uZVJlc291cmNlID0gKG14Q2xpZW50Lmxhbmd1YWdlICE9ICdub25lJykgPyAnZG9uZScgOiAnJzsKKworLyoqCisgKiBWYXJpYWJsZTogdXBkYXRpbmdTZWxlY3Rpb25SZXNvdXJjZQorICoKKyAqIFNwZWNpZmllcyB0aGUgcmVzb3VyY2Uga2V5IGZvciB0aGUgc3RhdHVzIG1lc3NhZ2Ugd2hpbGUgdGhlIHNlbGVjdGlvbiBpcworICogYmVpbmcgdXBkYXRlZC4gSWYgdGhlIHJlc291cmNlIGZvciB0aGlzIGtleSBkb2VzIG5vdCBleGlzdCB0aGVuIHRoZQorICogdmFsdWUgaXMgdXNlZCBhcyB0aGUgc3RhdHVzIG1lc3NhZ2UuIERlZmF1bHQgaXMgJ3VwZGF0aW5nU2VsZWN0aW9uJy4KKyAqLworbXhHcmFwaFNlbGVjdGlvbk1vZGVsLnByb3RvdHlwZS51cGRhdGluZ1NlbGVjdGlvblJlc291cmNlID0gKG14Q2xpZW50Lmxhbmd1YWdlICE9ICdub25lJykgPyAndXBkYXRpbmdTZWxlY3Rpb24nIDogJyc7CisKKy8qKgorICogVmFyaWFibGU6IGdyYXBoCisgKiAKKyAqIFJlZmVyZW5jZSB0byB0aGUgZW5jbG9zaW5nIDxteEdyYXBoPi4KKyAqLworbXhHcmFwaFNlbGVjdGlvbk1vZGVsLnByb3RvdHlwZS5ncmFwaCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHNpbmdsZVNlbGVjdGlvbgorICoKKyAqIFNwZWNpZmllcyBpZiBvbmx5IG9uZSBzZWxlY3RlZCBpdGVtIGF0IGEgdGltZSBpcyBhbGxvd2VkLgorICogRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhHcmFwaFNlbGVjdGlvbk1vZGVsLnByb3RvdHlwZS5zaW5nbGVTZWxlY3Rpb24gPSBmYWxzZTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNTaW5nbGVTZWxlY3Rpb24KKyAqCisgKiBSZXR1cm5zIDxzaW5nbGVTZWxlY3Rpb24+IGFzIGEgYm9vbGVhbi4KKyAqLworbXhHcmFwaFNlbGVjdGlvbk1vZGVsLnByb3RvdHlwZS5pc1NpbmdsZVNlbGVjdGlvbiA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5zaW5nbGVTZWxlY3Rpb247Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRTaW5nbGVTZWxlY3Rpb24KKyAqCisgKiBTZXRzIHRoZSA8c2luZ2xlU2VsZWN0aW9uPiBmbGFnLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzaW5nbGVTZWxlY3Rpb24gLSBCb29sZWFuIHRoYXQgc3BlY2lmaWVzIHRoZSBuZXcgdmFsdWUgZm9yCisgKiA8c2luZ2xlU2VsZWN0aW9uPi4KKyAqLworbXhHcmFwaFNlbGVjdGlvbk1vZGVsLnByb3RvdHlwZS5zZXRTaW5nbGVTZWxlY3Rpb24gPSBmdW5jdGlvbihzaW5nbGVTZWxlY3Rpb24pCit7CisJdGhpcy5zaW5nbGVTZWxlY3Rpb24gPSBzaW5nbGVTZWxlY3Rpb247Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc1NlbGVjdGVkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiA8bXhDZWxsPiBpcyBzZWxlY3RlZC4KKyAqLworbXhHcmFwaFNlbGVjdGlvbk1vZGVsLnByb3RvdHlwZS5pc1NlbGVjdGVkID0gZnVuY3Rpb24oY2VsbCkKK3sKKwlpZiAoY2VsbCAhPSBudWxsKQorCXsKKwkJcmV0dXJuIG14VXRpbHMuaW5kZXhPZih0aGlzLmNlbGxzLCBjZWxsKSA+PSAwOworCX0KKwkKKwlyZXR1cm4gZmFsc2U7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0VtcHR5CisgKgorICogUmV0dXJucyB0cnVlIGlmIG5vIGNlbGxzIGFyZSBjdXJyZW50bHkgc2VsZWN0ZWQuCisgKi8KK214R3JhcGhTZWxlY3Rpb25Nb2RlbC5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5jZWxscy5sZW5ndGggPT0gMDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNsZWFyCisgKgorICogQ2xlYXJzIHRoZSBzZWxlY3Rpb24gYW5kIGZpcmVzIGEgPGNoYW5nZT4gZXZlbnQgaWYgdGhlIHNlbGVjdGlvbiB3YXMgbm90CisgKiBlbXB0eS4KKyAqLworbXhHcmFwaFNlbGVjdGlvbk1vZGVsLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLmNoYW5nZVNlbGVjdGlvbihudWxsLCB0aGlzLmNlbGxzKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldENlbGwKKyAqCisgKiBTZWxlY3RzIHRoZSBzcGVjaWZpZWQgPG14Q2VsbD4gdXNpbmcgPHNldENlbGxzPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRvIGJlIHNlbGVjdGVkLgorICovCitteEdyYXBoU2VsZWN0aW9uTW9kZWwucHJvdG90eXBlLnNldENlbGwgPSBmdW5jdGlvbihjZWxsKQoreworCWlmIChjZWxsICE9IG51bGwpCisJeworCQl0aGlzLnNldENlbGxzKFtjZWxsXSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0Q2VsbHMKKyAqCisgKiBTZWxlY3RzIHRoZSBnaXZlbiBhcnJheSBvZiA8bXhDZWxscz4gYW5kIGZpcmVzIGEgPGNoYW5nZT4gZXZlbnQuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGxzIC0gQXJyYXkgb2YgPG14Q2VsbHM+IHRvIGJlIHNlbGVjdGVkLgorICovCitteEdyYXBoU2VsZWN0aW9uTW9kZWwucHJvdG90eXBlLnNldENlbGxzID0gZnVuY3Rpb24oY2VsbHMpCit7CisJaWYgKGNlbGxzICE9IG51bGwpCisJeworCQlpZiAodGhpcy5zaW5nbGVTZWxlY3Rpb24pCisJCXsKKwkJCWNlbGxzID0gW3RoaXMuZ2V0Rmlyc3RTZWxlY3RhYmxlQ2VsbChjZWxscyldOworCQl9CisJCisJCXZhciB0bXAgPSBbXTsKKwkJCisJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCWlmICh0aGlzLmdyYXBoLmlzQ2VsbFNlbGVjdGFibGUoY2VsbHNbaV0pKQorCQkJeworCQkJCXRtcC5wdXNoKGNlbGxzW2ldKTsKKwkJCX0JCisJCX0KKworCQl0aGlzLmNoYW5nZVNlbGVjdGlvbih0bXAsIHRoaXMuY2VsbHMpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEZpcnN0U2VsZWN0YWJsZUNlbGwKKyAqCisgKiBSZXR1cm5zIHRoZSBmaXJzdCBzZWxlY3RhYmxlIGNlbGwgaW4gdGhlIGdpdmVuIGFycmF5IG9mIGNlbGxzLgorICovCitteEdyYXBoU2VsZWN0aW9uTW9kZWwucHJvdG90eXBlLmdldEZpcnN0U2VsZWN0YWJsZUNlbGwgPSBmdW5jdGlvbihjZWxscykKK3sKKwlpZiAoY2VsbHMgIT0gbnVsbCkKKwl7CisJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCWlmICh0aGlzLmdyYXBoLmlzQ2VsbFNlbGVjdGFibGUoY2VsbHNbaV0pKQorCQkJeworCQkJCXJldHVybiBjZWxsc1tpXTsKKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZENlbGwKKyAqIAorICogQWRkcyB0aGUgZ2l2ZW4gPG14Q2VsbD4gdG8gdGhlIHNlbGVjdGlvbiBhbmQgZmlyZXMgYSA8c2VsZWN0PiBldmVudC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRvIGFkZCB0byB0aGUgc2VsZWN0aW9uLgorICovCitteEdyYXBoU2VsZWN0aW9uTW9kZWwucHJvdG90eXBlLmFkZENlbGwgPSBmdW5jdGlvbihjZWxsKQoreworCWlmIChjZWxsICE9IG51bGwpCisJeworCQl0aGlzLmFkZENlbGxzKFtjZWxsXSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogYWRkQ2VsbHMKKyAqIAorICogQWRkcyB0aGUgZ2l2ZW4gYXJyYXkgb2YgPG14Q2VsbHM+IHRvIHRoZSBzZWxlY3Rpb24gYW5kIGZpcmVzIGEgPHNlbGVjdD4KKyAqIGV2ZW50LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxscyAtIEFycmF5IG9mIDxteENlbGxzPiB0byBhZGQgdG8gdGhlIHNlbGVjdGlvbi4KKyAqLworbXhHcmFwaFNlbGVjdGlvbk1vZGVsLnByb3RvdHlwZS5hZGRDZWxscyA9IGZ1bmN0aW9uKGNlbGxzKQoreworCWlmIChjZWxscyAhPSBudWxsKQorCXsKKwkJdmFyIHJlbW92ZSA9IG51bGw7CisJCQorCQlpZiAodGhpcy5zaW5nbGVTZWxlY3Rpb24pCisJCXsKKwkJCXJlbW92ZSA9IHRoaXMuY2VsbHM7CisJCQljZWxscyA9IFt0aGlzLmdldEZpcnN0U2VsZWN0YWJsZUNlbGwoY2VsbHMpXTsKKwkJfQorCisJCXZhciB0bXAgPSBbXTsKKwkJCisJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCWlmICghdGhpcy5pc1NlbGVjdGVkKGNlbGxzW2ldKSAmJgorCQkJCXRoaXMuZ3JhcGguaXNDZWxsU2VsZWN0YWJsZShjZWxsc1tpXSkpCisJCQl7CisJCQkJdG1wLnB1c2goY2VsbHNbaV0pOworCQkJfQkKKwkJfQorCisJCXRoaXMuY2hhbmdlU2VsZWN0aW9uKHRtcCwgcmVtb3ZlKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZW1vdmVDZWxsCisgKgorICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIDxteENlbGw+IGZyb20gdGhlIHNlbGVjdGlvbiBhbmQgZmlyZXMgYSA8c2VsZWN0PgorICogZXZlbnQgZm9yIHRoZSByZW1haW5pbmcgY2VsbHMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiB0byByZW1vdmUgZnJvbSB0aGUgc2VsZWN0aW9uLgorICovCitteEdyYXBoU2VsZWN0aW9uTW9kZWwucHJvdG90eXBlLnJlbW92ZUNlbGwgPSBmdW5jdGlvbihjZWxsKQoreworCWlmIChjZWxsICE9IG51bGwpCisJeworCQl0aGlzLnJlbW92ZUNlbGxzKFtjZWxsXSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVtb3ZlQ2VsbHMKKyAqLworbXhHcmFwaFNlbGVjdGlvbk1vZGVsLnByb3RvdHlwZS5yZW1vdmVDZWxscyA9IGZ1bmN0aW9uKGNlbGxzKQoreworCWlmIChjZWxscyAhPSBudWxsKQorCXsKKwkJdmFyIHRtcCA9IFtdOworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkJeworCQkJaWYgKHRoaXMuaXNTZWxlY3RlZChjZWxsc1tpXSkpCisJCQl7CisJCQkJdG1wLnB1c2goY2VsbHNbaV0pOworCQkJfQorCQl9CisJCQorCQl0aGlzLmNoYW5nZVNlbGVjdGlvbihudWxsLCB0bXApOwkKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjaGFuZ2VTZWxlY3Rpb24KKyAqCisgKiBJbm5lciBjYWxsYmFjayB0byBhZGQgdGhlIHNwZWNpZmllZCA8bXhDZWxsPiB0byB0aGUgc2VsZWN0aW9uLiBObyBldmVudAorICogaXMgZmlyZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAqIAorICogUGFyYW10ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gdG8gYWRkIHRvIHRoZSBzZWxlY3Rpb24uCisgKi8KK214R3JhcGhTZWxlY3Rpb25Nb2RlbC5wcm90b3R5cGUuY2hhbmdlU2VsZWN0aW9uID0gZnVuY3Rpb24oYWRkZWQsIHJlbW92ZWQpCit7CisJaWYgKChhZGRlZCAhPSBudWxsICYmCisJCWFkZGVkLmxlbmd0aCA+IDAgJiYKKwkJYWRkZWRbMF0gIT0gbnVsbCkgfHwKKwkJKHJlbW92ZWQgIT0gbnVsbCAmJgorCQlyZW1vdmVkLmxlbmd0aCA+IDAgJiYKKwkJcmVtb3ZlZFswXSAhPSBudWxsKSkKKwl7CisJCXZhciBjaGFuZ2UgPSBuZXcgbXhTZWxlY3Rpb25DaGFuZ2UodGhpcywgYWRkZWQsIHJlbW92ZWQpOworCQljaGFuZ2UuZXhlY3V0ZSgpOworCQl2YXIgZWRpdCA9IG5ldyBteFVuZG9hYmxlRWRpdCh0aGlzLCBmYWxzZSk7CisJCWVkaXQuYWRkKGNoYW5nZSk7CisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuVU5ETywgJ2VkaXQnLCBlZGl0KSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY2VsbEFkZGVkCisgKgorICogSW5uZXIgY2FsbGJhY2sgdG8gYWRkIHRoZSBzcGVjaWZpZWQgPG14Q2VsbD4gdG8gdGhlIHNlbGVjdGlvbi4gTm8gZXZlbnQKKyAqIGlzIGZpcmVkIGluIHRoaXMgaW1wbGVtZW50YXRpb24uCisgKiAKKyAqIFBhcmFtdGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRvIGFkZCB0byB0aGUgc2VsZWN0aW9uLgorICovCitteEdyYXBoU2VsZWN0aW9uTW9kZWwucHJvdG90eXBlLmNlbGxBZGRlZCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJaWYgKGNlbGwgIT0gbnVsbCAmJgorCQkhdGhpcy5pc1NlbGVjdGVkKGNlbGwpKQorCXsKKwkJdGhpcy5jZWxscy5wdXNoKGNlbGwpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGNlbGxSZW1vdmVkCisgKgorICogSW5uZXIgY2FsbGJhY2sgdG8gcmVtb3ZlIHRoZSBzcGVjaWZpZWQgPG14Q2VsbD4gZnJvbSB0aGUgc2VsZWN0aW9uLiBObworICogZXZlbnQgaXMgZmlyZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIDxteENlbGw+IHRvIHJlbW92ZSBmcm9tIHRoZSBzZWxlY3Rpb24uCisgKi8KK214R3JhcGhTZWxlY3Rpb25Nb2RlbC5wcm90b3R5cGUuY2VsbFJlbW92ZWQgPSBmdW5jdGlvbihjZWxsKQoreworCWlmIChjZWxsICE9IG51bGwpCisJeworCQl2YXIgaW5kZXggPSBteFV0aWxzLmluZGV4T2YodGhpcy5jZWxscywgY2VsbCk7CisJCQorCQlpZiAoaW5kZXggPj0gMCkKKwkJeworCQkJdGhpcy5jZWxscy5zcGxpY2UoaW5kZXgsIDEpOworCQl9CisJfQorfTsKKworLyoqCisgKiBDbGFzczogbXhTZWxlY3Rpb25DaGFuZ2UKKyAqCisgKiBBY3Rpb24gdG8gY2hhbmdlIHRoZSBjdXJyZW50IHJvb3QgaW4gYSB2aWV3LgorICoKKyAqIENvbnN0cnVjdG9yOiBteEN1cnJlbnRSb290Q2hhbmdlCisgKgorICogQ29uc3RydWN0cyBhIGNoYW5nZSBvZiB0aGUgY3VycmVudCByb290IGluIHRoZSBnaXZlbiB2aWV3LgorICovCitmdW5jdGlvbiBteFNlbGVjdGlvbkNoYW5nZShzZWxlY3Rpb25Nb2RlbCwgYWRkZWQsIHJlbW92ZWQpCit7CisJdGhpcy5zZWxlY3Rpb25Nb2RlbCA9IHNlbGVjdGlvbk1vZGVsOworCXRoaXMuYWRkZWQgPSAoYWRkZWQgIT0gbnVsbCkgPyBhZGRlZC5zbGljZSgpIDogbnVsbDsKKwl0aGlzLnJlbW92ZWQgPSAocmVtb3ZlZCAhPSBudWxsKSA/IHJlbW92ZWQuc2xpY2UoKSA6IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBleGVjdXRlCisgKgorICogQ2hhbmdlcyB0aGUgY3VycmVudCByb290IG9mIHRoZSB2aWV3LgorICovCitteFNlbGVjdGlvbkNoYW5nZS5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgdDAgPSBteExvZy5lbnRlcignbXhTZWxlY3Rpb25DaGFuZ2UuZXhlY3V0ZScpOworCXdpbmRvdy5zdGF0dXMgPSBteFJlc291cmNlcy5nZXQoCisJCXRoaXMuc2VsZWN0aW9uTW9kZWwudXBkYXRpbmdTZWxlY3Rpb25SZXNvdXJjZSkgfHwKKwkJdGhpcy5zZWxlY3Rpb25Nb2RlbC51cGRhdGluZ1NlbGVjdGlvblJlc291cmNlOworCisJaWYgKHRoaXMucmVtb3ZlZCAhPSBudWxsKQorCXsKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJlbW92ZWQubGVuZ3RoOyBpKyspCisJCXsKKwkJCXRoaXMuc2VsZWN0aW9uTW9kZWwuY2VsbFJlbW92ZWQodGhpcy5yZW1vdmVkW2ldKTsKKwkJfQorCX0KKworCWlmICh0aGlzLmFkZGVkICE9IG51bGwpCisJeworCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYWRkZWQubGVuZ3RoOyBpKyspCisJCXsKKwkJCXRoaXMuc2VsZWN0aW9uTW9kZWwuY2VsbEFkZGVkKHRoaXMuYWRkZWRbaV0pOworCQl9CisJfQorCQorCXZhciB0bXAgPSB0aGlzLmFkZGVkOworCXRoaXMuYWRkZWQgPSB0aGlzLnJlbW92ZWQ7CisJdGhpcy5yZW1vdmVkID0gdG1wOworCisJd2luZG93LnN0YXR1cyA9IG14UmVzb3VyY2VzLmdldCh0aGlzLnNlbGVjdGlvbk1vZGVsLmRvbmVSZXNvdXJjZSkgfHwKKwkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5kb25lUmVzb3VyY2U7CisJbXhMb2cubGVhdmUoJ214U2VsZWN0aW9uQ2hhbmdlLmV4ZWN1dGUnLCB0MCk7CisJCisJdGhpcy5zZWxlY3Rpb25Nb2RlbC5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5DSEFOR0UsCisJCQknYWRkZWQnLCB0aGlzLmFkZGVkLCAncmVtb3ZlZCcsIHRoaXMucmVtb3ZlZCkpOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214R3JhcGhWaWV3LmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3ZpZXcvbXhHcmFwaFZpZXcuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxZTVjZAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214R3JhcGhWaWV3LmpzCkBAIC0wLDAgKzEsMzAwMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhHcmFwaFZpZXcKKyAqCisgKiBFeHRlbmRzIDxteEV2ZW50U291cmNlPiB0byBpbXBsZW1lbnQgYSB2aWV3IGZvciBhIGdyYXBoLiBUaGlzIGNsYXNzIGlzIGluCisgKiBjaGFyZ2Ugb2YgY29tcHV0aW5nIHRoZSBhYnNvbHV0ZSBjb29yZGluYXRlcyBmb3IgdGhlIHJlbGF0aXZlIGNoaWxkCisgKiBnZW9tZXRyaWVzLCB0aGUgcG9pbnRzIGZvciBwZXJpbWV0ZXJzIGFuZCBlZGdlIHN0eWxlcyBhbmQga2VlcGluZyB0aGVtCisgKiBjYWNoZWQgaW4gPG14Q2VsbFN0YXRlcz4gZm9yIGZhc3RlciByZXRyaWV2YWwuIFRoZSBzdGF0ZXMgYXJlIHVwZGF0ZWQKKyAqIHdoZW5ldmVyIHRoZSBtb2RlbCBvciB0aGUgdmlldyBzdGF0ZSAodHJhbnNsYXRlLCBzY2FsZSkgY2hhbmdlcy4gVGhlIHNjYWxlCisgKiBhbmQgdHJhbnNsYXRlIGFyZSBob25vdXJlZCBpbiB0aGUgYm91bmRzLgorICogCisgKiBFdmVudDogbXhFdmVudC5VTkRPCisgKiAKKyAqIEZpcmVzIGFmdGVyIHRoZSByb290IHdhcyBjaGFuZ2VkIGluIDxzZXRDdXJyZW50Um9vdD4uIFRoZSA8Y29kZT5lZGl0PC9jb2RlPgorICogcHJvcGVydHkgY29udGFpbnMgdGhlIDxteFVuZG9hYmxlRWRpdD4gd2hpY2ggY29udGFpbnMgdGhlCisgKiA8bXhDdXJyZW50Um9vdENoYW5nZT4uCisgKiAKKyAqIEV2ZW50OiBteEV2ZW50LlNDQUxFX0FORF9UUkFOU0xBVEUKKyAqIAorICogRmlyZXMgYWZ0ZXIgdGhlIHNjYWxlIGFuZCB0cmFuc2xhdGUgaGF2ZSBiZWVuIGNoYW5nZWQgaW4gPHNjYWxlQW5kVHJhbnNsYXRlPi4KKyAqIFRoZSA8Y29kZT5zY2FsZTwvY29kZT4sIDxjb2RlPnByZXZpb3VzU2NhbGU8L2NvZGU+LCA8Y29kZT50cmFuc2xhdGU8L2NvZGU+CisgKiBhbmQgPGNvZGU+cHJldmlvdXNUcmFuc2xhdGU8L2NvZGU+IHByb3BlcnRpZXMgY29udGFpbiB0aGUgbmV3IGFuZCBwcmV2aW91cworICogc2NhbGUgYW5kIHRyYW5zbGF0ZSwgcmVzcGVjdGl2ZWx5LgorICogCisgKiBFdmVudDogbXhFdmVudC5TQ0FMRQorICogCisgKiBGaXJlcyBhZnRlciB0aGUgc2NhbGUgd2FzIGNoYW5nZWQgaW4gPHNldFNjYWxlPi4gVGhlIDxjb2RlPnNjYWxlPC9jb2RlPiBhbmQKKyAqIDxjb2RlPnByZXZpb3VzU2NhbGU8L2NvZGU+IHByb3BlcnRpZXMgY29udGFpbiB0aGUgbmV3IGFuZCBwcmV2aW91cyBzY2FsZS4KKyAqIAorICogRXZlbnQ6IG14RXZlbnQuVFJBTlNMQVRFCisgKiAKKyAqIEZpcmVzIGFmdGVyIHRoZSB0cmFuc2xhdGUgd2FzIGNoYW5nZWQgaW4gPHNldFRyYW5zbGF0ZT4uIFRoZQorICogPGNvZGU+dHJhbnNsYXRlPC9jb2RlPiBhbmQgPGNvZGU+cHJldmlvdXNUcmFuc2xhdGU8L2NvZGU+IHByb3BlcnRpZXMgY29udGFpbgorICogdGhlIG5ldyBhbmQgcHJldmlvdXMgdmFsdWUgZm9yIHRyYW5zbGF0ZS4KKyAqIAorICogRXZlbnQ6IG14RXZlbnQuRE9XTiBhbmQgbXhFdmVudC5VUAorICogCisgKiBGaXJlIGlmIHRoZSBjdXJyZW50IHJvb3QgaXMgY2hhbmdlZCBieSBleGVjdXRpbmcgYW4gPG14Q3VycmVudFJvb3RDaGFuZ2U+LgorICogVGhlIGV2ZW50IG5hbWUgZGVwZW5kcyBvbiB0aGUgbG9jYXRpb24gb2YgdGhlIHJvb3QgaW4gdGhlIGNlbGwgaGllcmFyY2h5CisgKiB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgcm9vdC4gVGhlIDxjb2RlPnJvb3Q8L2NvZGU+IGFuZAorICogPGNvZGU+cHJldmlvdXM8L2NvZGU+IHByb3BlcnRpZXMgY29udGFpbiB0aGUgbmV3IGFuZCBwcmV2aW91cyByb290LAorICogcmVzcGVjdGl2ZWx5LgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhHcmFwaFZpZXcKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IHZpZXcgZm9yIHRoZSBnaXZlbiA8bXhHcmFwaD4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGdyYXBoIC0gUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgPG14R3JhcGg+LgorICovCitmdW5jdGlvbiBteEdyYXBoVmlldyhncmFwaCkKK3sKKwl0aGlzLmdyYXBoID0gZ3JhcGg7CisJdGhpcy50cmFuc2xhdGUgPSBuZXcgbXhQb2ludCgpOworCXRoaXMuZ3JhcGhCb3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUoKTsKKwl0aGlzLnN0YXRlcyA9IG5ldyBteERpY3Rpb25hcnkoKTsKK307CisKKy8qKgorICogRXh0ZW5kcyBteEV2ZW50U291cmNlLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUgPSBuZXcgbXhFdmVudFNvdXJjZSgpOworbXhHcmFwaFZpZXcucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhHcmFwaFZpZXc7CisKKy8qKgorICoKKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLkVNUFRZX1BPSU5UID0gbmV3IG14UG9pbnQoKTsKKworLyoqCisgKiBWYXJpYWJsZTogZG9uZVJlc291cmNlCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgcmVzb3VyY2Uga2V5IGZvciB0aGUgc3RhdHVzIG1lc3NhZ2UgYWZ0ZXIgYSBsb25nIG9wZXJhdGlvbi4KKyAqIElmIHRoZSByZXNvdXJjZSBmb3IgdGhpcyBrZXkgZG9lcyBub3QgZXhpc3QgdGhlbiB0aGUgdmFsdWUgaXMgdXNlZCBhcworICogdGhlIHN0YXR1cyBtZXNzYWdlLiBEZWZhdWx0IGlzICdkb25lJy4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLmRvbmVSZXNvdXJjZSA9IChteENsaWVudC5sYW5ndWFnZSAhPSAnbm9uZScpID8gJ2RvbmUnIDogJyc7CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0aW5nRG9jdW1lbnRSZXNvdXJjZQorICoKKyAqIFNwZWNpZmllcyB0aGUgcmVzb3VyY2Uga2V5IGZvciB0aGUgc3RhdHVzIG1lc3NhZ2Ugd2hpbGUgdGhlIGRvY3VtZW50IGlzCisgKiBiZWluZyB1cGRhdGVkLiBJZiB0aGUgcmVzb3VyY2UgZm9yIHRoaXMga2V5IGRvZXMgbm90IGV4aXN0IHRoZW4gdGhlCisgKiB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBzdGF0dXMgbWVzc2FnZS4gRGVmYXVsdCBpcyAndXBkYXRpbmdEb2N1bWVudCcuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS51cGRhdGluZ0RvY3VtZW50UmVzb3VyY2UgPSAobXhDbGllbnQubGFuZ3VhZ2UgIT0gJ25vbmUnKSA/ICd1cGRhdGluZ0RvY3VtZW50JyA6ICcnOworCisvKioKKyAqIFZhcmlhYmxlOiBhbGxvd0V2YWwKKyAqIAorICogU3BlY2lmaWVzIGlmIHN0cmluZyB2YWx1ZXMgaW4gY2VsbCBzdHlsZXMgc2hvdWxkIGJlIGV2YWx1YXRlZCB1c2luZworICogPG14VXRpbHMuZXZhbD4uIFRoaXMgd2lsbCBvbmx5IGJlIHVzZWQgaWYgdGhlIHN0cmluZyB2YWx1ZXMgY2FuJ3QgYmUgbWFwcGVkCisgKiB0byBvYmplY3RzIHVzaW5nIDxteFN0eWxlUmVnaXN0cnk+LiBEZWZhdWx0IGlzIGZhbHNlLiBOT1RFOiBFbmFibGluZyB0aGlzCisgKiBzd2l0Y2ggY2FycmllcyBhIHBvc3NpYmxlIHNlY3VyaXR5IHJpc2suCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5hbGxvd0V2YWwgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogY2FwdHVyZURvY3VtZW50R2VzdHVyZQorICogCisgKiBTcGVjaWZpZXMgaWYgYSBnZXN0dXJlIHNob3VsZCBiZSBjYXB0dXJlZCB3aGVuIGl0IGdvZXMgb3V0c2lkZSBvZiB0aGUKKyAqIGdyYXBoIGNvbnRhaW5lci4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuY2FwdHVyZURvY3VtZW50R2VzdHVyZSA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IG9wdGltaXplVm1sUmVmbG93cworICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIDxjYW52YXM+IHNob3VsZCBiZSBoaWRkZW4gd2hpbGUgcmVuZGVyaW5nIGluIElFOCBzdGFuZGFyZHMKKyAqIG1vZGUgYW5kIHF1aXJrcyBtb2RlLiBUaGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbXByb3ZlIHJlbmRlcmluZyBwZXJmb3JtYW5jZS4KKyAqIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLm9wdGltaXplVm1sUmVmbG93cyA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHJlbmRlcmluZworICogCisgKiBTcGVjaWZpZXMgaWYgc2hhcGVzIHNob3VsZCBiZSBjcmVhdGVkLCB1cGRhdGVkIGFuZCBkZXN0cm95ZWQgdXNpbmcgdGhlCisgKiBtZXRob2RzIG9mIDxteENlbGxSZW5kZXJlcj4gaW4gPGdyYXBoPi4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUucmVuZGVyaW5nID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogZ3JhcGgKKyAqCisgKiBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5ncmFwaCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGN1cnJlbnRSb290CisgKgorICogPG14Q2VsbD4gdGhhdCBhY3RzIGFzIHRoZSByb290IG9mIHRoZSBkaXNwbGF5ZWQgY2VsbCBoaWVyYXJjaHkuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5jdXJyZW50Um9vdCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGdyYXBoQm91bmRzCisgKgorICogPG14UmVjdGFuZ2xlPiB0aGF0IGNhY2hlcyB0aGUgc2NhbGVzLCB0cmFuc2xhdGVkIGJvdW5kcyBvZiB0aGUgY3VycmVudCB2aWV3LgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuZ3JhcGhCb3VuZHMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzY2FsZQorICogCisgKiBTcGVjaWZpZXMgdGhlIHNjYWxlLiBEZWZhdWx0IGlzIDEgKDEwMCUpLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuc2NhbGUgPSAxOworCQorLyoqCisgKiBWYXJpYWJsZTogdHJhbnNsYXRlCisgKgorICogPG14UG9pbnQ+IHRoYXQgc3BlY2lmaWVzIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uLiBEZWZhdWx0IGlzIGEgbmV3CisgKiBlbXB0eSA8bXhQb2ludD4uCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS50cmFuc2xhdGUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzdGF0ZXMKKyAqIAorICogPG14RGljdGlvbmFyeT4gdGhhdCBtYXBzIGZyb20gY2VsbCBJRHMgdG8gPG14Q2VsbFN0YXRlcz4uCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5zdGF0ZXMgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB1cGRhdGVTdHlsZQorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIHN0eWxlIHNob3VsZCBiZSB1cGRhdGVkIGluIGVhY2ggdmFsaWRhdGlvbiBzdGVwLiBJZiB0aGlzCisgKiBpcyBmYWxzZSB0aGVuIHRoZSBzdHlsZSBpcyBvbmx5IHVwZGF0ZWQgaWYgdGhlIHN0YXRlIGlzIGNyZWF0ZWQgb3IgaWYgdGhlCisgKiBzdHlsZSBvZiB0aGUgY2VsbCB3YXMgY2hhbmdlZC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLnVwZGF0ZVN0eWxlID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGxhc3ROb2RlCisgKiAKKyAqIER1cmluZyB2YWxpZGF0aW9uLCB0aGlzIGNvbnRhaW5zIHRoZSBsYXN0IERPTSBub2RlIHRoYXQgd2FzIHByb2Nlc3NlZC4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLmxhc3ROb2RlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbGFzdEh0bWxOb2RlCisgKiAKKyAqIER1cmluZyB2YWxpZGF0aW9uLCB0aGlzIGNvbnRhaW5zIHRoZSBsYXN0IEhUTUwgRE9NIG5vZGUgdGhhdCB3YXMgcHJvY2Vzc2VkLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUubGFzdEh0bWxOb2RlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbGFzdEZvcmVncm91bmROb2RlCisgKiAKKyAqIER1cmluZyB2YWxpZGF0aW9uLCB0aGlzIGNvbnRhaW5zIHRoZSBsYXN0IGVkZ2UncyBET00gbm9kZSB0aGF0IHdhcyBwcm9jZXNzZWQuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5sYXN0Rm9yZWdyb3VuZE5vZGUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBsYXN0Rm9yZWdyb3VuZEh0bWxOb2RlCisgKiAKKyAqIER1cmluZyB2YWxpZGF0aW9uLCB0aGlzIGNvbnRhaW5zIHRoZSBsYXN0IGVkZ2UgSFRNTCBET00gbm9kZSB0aGF0IHdhcyBwcm9jZXNzZWQuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5sYXN0Rm9yZWdyb3VuZEh0bWxOb2RlID0gbnVsbDsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0R3JhcGhCb3VuZHMKKyAqCisgKiBSZXR1cm5zIDxncmFwaEJvdW5kcz4uCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5nZXRHcmFwaEJvdW5kcyA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5ncmFwaEJvdW5kczsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEdyYXBoQm91bmRzCisgKgorICogU2V0cyA8Z3JhcGhCb3VuZHM+LgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuc2V0R3JhcGhCb3VuZHMgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmdyYXBoQm91bmRzID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRCb3VuZHMKKyAqIAorICogUmV0dXJucyB0aGUgdW5pb24gb2YgYWxsIDxteENlbGxTdGF0ZXM+IGZvciB0aGUgZ2l2ZW4gYXJyYXkgb2YgPG14Q2VsbHM+LgorICoKKyAqIFBhcmFtZXRlcnM6CisgKgorICogY2VsbHMgLSBBcnJheSBvZiA8bXhDZWxscz4gd2hvc2UgYm91bmRzIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLmdldEJvdW5kcyA9IGZ1bmN0aW9uKGNlbGxzKQoreworCXZhciByZXN1bHQgPSBudWxsOworCQorCWlmIChjZWxscyAhPSBudWxsICYmIGNlbGxzLmxlbmd0aCA+IDApCisJeworCQl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCk7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorCQl7CisJCQlpZiAobW9kZWwuaXNWZXJ0ZXgoY2VsbHNbaV0pIHx8IG1vZGVsLmlzRWRnZShjZWxsc1tpXSkpCisJCQl7CisJCQkJdmFyIHN0YXRlID0gdGhpcy5nZXRTdGF0ZShjZWxsc1tpXSk7CisJCQkKKwkJCQlpZiAoc3RhdGUgIT0gbnVsbCkKKwkJCQl7CisJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKKwkJCQkJeworCQkJCQkJcmVzdWx0ID0gbXhSZWN0YW5nbGUuZnJvbVJlY3RhbmdsZShzdGF0ZSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlyZXN1bHQuYWRkKHN0YXRlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gcmVzdWx0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0Q3VycmVudFJvb3QKKyAqCisgKiBTZXRzIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHJvb3QgYW5kIGZpcmVzIGFuIDx1bmRvPiBldmVudCBiZWZvcmUKKyAqIGNhbGxpbmcgPG14R3JhcGguc2l6ZURpZENoYW5nZT4uCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiByb290IC0gPG14Q2VsbD4gdGhhdCBzcGVjaWZpZXMgdGhlIHJvb3Qgb2YgdGhlIGRpc3BsYXllZCBjZWxsIGhpZXJhcmNoeS4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLnNldEN1cnJlbnRSb290ID0gZnVuY3Rpb24ocm9vdCkKK3sKKwlpZiAodGhpcy5jdXJyZW50Um9vdCAhPSByb290KQorCXsKKwkJdmFyIGNoYW5nZSA9IG5ldyBteEN1cnJlbnRSb290Q2hhbmdlKHRoaXMsIHJvb3QpOworCQljaGFuZ2UuZXhlY3V0ZSgpOworCQl2YXIgZWRpdCA9IG5ldyBteFVuZG9hYmxlRWRpdCh0aGlzLCBmYWxzZSk7CisJCWVkaXQuYWRkKGNoYW5nZSk7CisJCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuVU5ETywgJ2VkaXQnLCBlZGl0KSk7CisJCXRoaXMuZ3JhcGguc2l6ZURpZENoYW5nZSgpOworCX0KKwkKKwlyZXR1cm4gcm9vdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNjYWxlQW5kVHJhbnNsYXRlCisgKgorICogU2V0cyB0aGUgc2NhbGUgYW5kIHRyYW5zbGF0aW9uIGFuZCBmaXJlcyBhIDxzY2FsZT4gYW5kIDx0cmFuc2xhdGU+IGV2ZW50CisgKiBiZWZvcmUgY2FsbGluZyA8cmV2YWxpZGF0ZT4gZm9sbG93ZWQgYnkgPG14R3JhcGguc2l6ZURpZENoYW5nZT4uCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBzY2FsZSAtIERlY2ltYWwgdmFsdWUgdGhhdCBzcGVjaWZpZXMgdGhlIG5ldyBzY2FsZSAoMSBpcyAxMDAlKS4KKyAqIGR4IC0gWC1jb29yZGluYXRlIG9mIHRoZSB0cmFuc2xhdGlvbi4KKyAqIGR5IC0gWS1jb29yZGluYXRlIG9mIHRoZSB0cmFuc2xhdGlvbi4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLnNjYWxlQW5kVHJhbnNsYXRlID0gZnVuY3Rpb24oc2NhbGUsIGR4LCBkeSkKK3sKKwl2YXIgcHJldmlvdXNTY2FsZSA9IHRoaXMuc2NhbGU7CisJdmFyIHByZXZpb3VzVHJhbnNsYXRlID0gbmV3IG14UG9pbnQodGhpcy50cmFuc2xhdGUueCwgdGhpcy50cmFuc2xhdGUueSk7CisJCisJaWYgKHRoaXMuc2NhbGUgIT0gc2NhbGUgfHwgdGhpcy50cmFuc2xhdGUueCAhPSBkeCB8fCB0aGlzLnRyYW5zbGF0ZS55ICE9IGR5KQorCXsKKwkJdGhpcy5zY2FsZSA9IHNjYWxlOworCQkKKwkJdGhpcy50cmFuc2xhdGUueCA9IGR4OworCQl0aGlzLnRyYW5zbGF0ZS55ID0gZHk7CisKKwkJaWYgKHRoaXMuaXNFdmVudHNFbmFibGVkKCkpCisJCXsKKwkJCXRoaXMucmV2YWxpZGF0ZSgpOworCQkJdGhpcy5ncmFwaC5zaXplRGlkQ2hhbmdlKCk7CisJCX0KKwl9CisJCisJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5TQ0FMRV9BTkRfVFJBTlNMQVRFLAorCQknc2NhbGUnLCBzY2FsZSwgJ3ByZXZpb3VzU2NhbGUnLCBwcmV2aW91c1NjYWxlLAorCQkndHJhbnNsYXRlJywgdGhpcy50cmFuc2xhdGUsICdwcmV2aW91c1RyYW5zbGF0ZScsIHByZXZpb3VzVHJhbnNsYXRlKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTY2FsZQorICogCisgKiBSZXR1cm5zIHRoZSA8c2NhbGU+LgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuZ2V0U2NhbGUgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuc2NhbGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRTY2FsZQorICoKKyAqIFNldHMgdGhlIHNjYWxlIGFuZCBmaXJlcyBhIDxzY2FsZT4gZXZlbnQgYmVmb3JlIGNhbGxpbmcgPHJldmFsaWRhdGU+IGZvbGxvd2VkCisgKiBieSA8bXhHcmFwaC5zaXplRGlkQ2hhbmdlPi4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoKKyAqIHZhbHVlIC0gRGVjaW1hbCB2YWx1ZSB0aGF0IHNwZWNpZmllcyB0aGUgbmV3IHNjYWxlICgxIGlzIDEwMCUpLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuc2V0U2NhbGUgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl2YXIgcHJldmlvdXNTY2FsZSA9IHRoaXMuc2NhbGU7CisJCisJaWYgKHRoaXMuc2NhbGUgIT0gdmFsdWUpCisJeworCQl0aGlzLnNjYWxlID0gdmFsdWU7CisKKwkJaWYgKHRoaXMuaXNFdmVudHNFbmFibGVkKCkpCisJCXsKKwkJCXRoaXMucmV2YWxpZGF0ZSgpOworCQkJdGhpcy5ncmFwaC5zaXplRGlkQ2hhbmdlKCk7CisJCX0KKwl9CisJCisJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5TQ0FMRSwKKwkJJ3NjYWxlJywgdmFsdWUsICdwcmV2aW91c1NjYWxlJywgcHJldmlvdXNTY2FsZSkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0VHJhbnNsYXRlCisgKiAKKyAqIFJldHVybnMgdGhlIDx0cmFuc2xhdGU+LgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuZ2V0VHJhbnNsYXRlID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLnRyYW5zbGF0ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFRyYW5zbGF0ZQorICoKKyAqIFNldHMgdGhlIHRyYW5zbGF0aW9uIGFuZCBmaXJlcyBhIDx0cmFuc2xhdGU+IGV2ZW50IGJlZm9yZSBjYWxsaW5nCisgKiA8cmV2YWxpZGF0ZT4gZm9sbG93ZWQgYnkgPG14R3JhcGguc2l6ZURpZENoYW5nZT4uIFRoZSB0cmFuc2xhdGlvbiBpcyB0aGUKKyAqIG5lZ2F0aXZlIG9mIHRoZSBvcmlnaW4uCisgKgorICogUGFyYW1ldGVyczoKKyAqCisgKiBkeCAtIFgtY29vcmRpbmF0ZSBvZiB0aGUgdHJhbnNsYXRpb24uCisgKiBkeSAtIFktY29vcmRpbmF0ZSBvZiB0aGUgdHJhbnNsYXRpb24uCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5zZXRUcmFuc2xhdGUgPSBmdW5jdGlvbihkeCwgZHkpCit7CisJdmFyIHByZXZpb3VzVHJhbnNsYXRlID0gbmV3IG14UG9pbnQodGhpcy50cmFuc2xhdGUueCwgdGhpcy50cmFuc2xhdGUueSk7CisJCisJaWYgKHRoaXMudHJhbnNsYXRlLnggIT0gZHggfHwgdGhpcy50cmFuc2xhdGUueSAhPSBkeSkKKwl7CisJCXRoaXMudHJhbnNsYXRlLnggPSBkeDsKKwkJdGhpcy50cmFuc2xhdGUueSA9IGR5OworCisJCWlmICh0aGlzLmlzRXZlbnRzRW5hYmxlZCgpKQorCQl7CisJCQl0aGlzLnJldmFsaWRhdGUoKTsKKwkJCXRoaXMuZ3JhcGguc2l6ZURpZENoYW5nZSgpOworCQl9CisJfQorCQorCXRoaXMuZmlyZUV2ZW50KG5ldyBteEV2ZW50T2JqZWN0KG14RXZlbnQuVFJBTlNMQVRFLAorCQkndHJhbnNsYXRlJywgdGhpcy50cmFuc2xhdGUsICdwcmV2aW91c1RyYW5zbGF0ZScsIHByZXZpb3VzVHJhbnNsYXRlKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZWZyZXNoCisgKgorICogQ2xlYXJzIHRoZSB2aWV3IGlmIDxjdXJyZW50Um9vdD4gaXMgbm90IG51bGwgYW5kIHJldmFsaWRhdGVzLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUucmVmcmVzaCA9IGZ1bmN0aW9uKCkKK3sKKwlpZiAodGhpcy5jdXJyZW50Um9vdCAhPSBudWxsKQorCXsKKwkJdGhpcy5jbGVhcigpOworCX0KKwkKKwl0aGlzLnJldmFsaWRhdGUoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJldmFsaWRhdGUKKyAqCisgKiBSZXZhbGlkYXRlcyB0aGUgY29tcGxldGUgdmlldyB3aXRoIGFsbCBjZWxsIHN0YXRlcy4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLnJldmFsaWRhdGUgPSBmdW5jdGlvbigpCit7CisJdGhpcy5pbnZhbGlkYXRlKCk7CisJdGhpcy52YWxpZGF0ZSgpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY2xlYXIKKyAqCisgKiBSZW1vdmVzIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gY2VsbCBhbmQgYWxsIGRlc2NlbmRhbnRzIGlmIHRoZSBnaXZlbgorICogY2VsbCBpcyBub3QgdGhlIGN1cnJlbnQgcm9vdC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIE9wdGlvbmFsIDxteENlbGw+IGZvciB3aGljaCB0aGUgc3RhdGUgc2hvdWxkIGJlIHJlbW92ZWQuIERlZmF1bHQKKyAqIGlzIHRoZSByb290IG9mIHRoZSBtb2RlbC4KKyAqIGZvcmNlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBjdXJyZW50IHJvb3Qgc2hvdWxkIGJlIGlnbm9yZWQgZm9yCisgKiByZWN1cnNpb24uCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKGNlbGwsIGZvcmNlLCByZWN1cnNlKQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwljZWxsID0gY2VsbCB8fCBtb2RlbC5nZXRSb290KCk7CisJZm9yY2UgPSAoZm9yY2UgIT0gbnVsbCkgPyBmb3JjZSA6IGZhbHNlOworCXJlY3Vyc2UgPSAocmVjdXJzZSAhPSBudWxsKSA/IHJlY3Vyc2UgOiB0cnVlOworCQorCXRoaXMucmVtb3ZlU3RhdGUoY2VsbCk7CisJCisJaWYgKHJlY3Vyc2UgJiYgKGZvcmNlIHx8IGNlbGwgIT0gdGhpcy5jdXJyZW50Um9vdCkpCisJeworCQl2YXIgY2hpbGRDb3VudCA9IG1vZGVsLmdldENoaWxkQ291bnQoY2VsbCk7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykKKwkJeworCQkJdGhpcy5jbGVhcihtb2RlbC5nZXRDaGlsZEF0KGNlbGwsIGkpLCBmb3JjZSk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJdGhpcy5pbnZhbGlkYXRlKGNlbGwpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGludmFsaWRhdGUKKyAqIAorICogSW52YWxpZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiBjZWxsLCBhbGwgaXRzIGRlc2NlbmRhbnRzIGFuZAorICogY29ubmVjdGVkIGVkZ2VzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gT3B0aW9uYWwgPG14Q2VsbD4gdG8gYmUgaW52YWxpZGF0ZWQuIERlZmF1bHQgaXMgdGhlIHJvb3Qgb2YgdGhlCisgKiBtb2RlbC4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLmludmFsaWRhdGUgPSBmdW5jdGlvbihjZWxsLCByZWN1cnNlLCBpbmNsdWRlRWRnZXMpCit7CisJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpOworCWNlbGwgPSBjZWxsIHx8IG1vZGVsLmdldFJvb3QoKTsKKwlyZWN1cnNlID0gKHJlY3Vyc2UgIT0gbnVsbCkgPyByZWN1cnNlIDogdHJ1ZTsKKwlpbmNsdWRlRWRnZXMgPSAoaW5jbHVkZUVkZ2VzICE9IG51bGwpID8gaW5jbHVkZUVkZ2VzIDogdHJ1ZTsKKwkKKwl2YXIgc3RhdGUgPSB0aGlzLmdldFN0YXRlKGNlbGwpOworCQorCWlmIChzdGF0ZSAhPSBudWxsKQorCXsKKwkJc3RhdGUuaW52YWxpZCA9IHRydWU7CisJfQorCQorCS8vIEF2b2lkcyBpbmZpbml0ZSBsb29wcyBmb3IgaW52YWxpZCBncmFwaHMKKwlpZiAoIWNlbGwuaW52YWxpZGF0aW5nKQorCXsKKwkJY2VsbC5pbnZhbGlkYXRpbmcgPSB0cnVlOworCQkKKwkJLy8gUmVjdXJzaXZlbHkgaW52YWxpZGF0ZXMgYWxsIGRlc2NlbmRhbnRzCisJCWlmIChyZWN1cnNlKQorCQl7CisJCQl2YXIgY2hpbGRDb3VudCA9IG1vZGVsLmdldENoaWxkQ291bnQoY2VsbCk7CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKQorCQkJeworCQkJCXZhciBjaGlsZCA9IG1vZGVsLmdldENoaWxkQXQoY2VsbCwgaSk7CisJCQkJdGhpcy5pbnZhbGlkYXRlKGNoaWxkLCByZWN1cnNlLCBpbmNsdWRlRWRnZXMpOworCQkJfQorCQl9CisJCQorCQkvLyBQcm9wYWdhdGVzIGludmFsaWRhdGlvbiB0byBhbGwgY29ubmVjdGVkIGVkZ2VzCisJCWlmIChpbmNsdWRlRWRnZXMpCisJCXsKKwkJCXZhciBlZGdlQ291bnQgPSBtb2RlbC5nZXRFZGdlQ291bnQoY2VsbCk7CisJCQkKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWRnZUNvdW50OyBpKyspCisJCQl7CisJCQkJdGhpcy5pbnZhbGlkYXRlKG1vZGVsLmdldEVkZ2VBdChjZWxsLCBpKSwgcmVjdXJzZSwgaW5jbHVkZUVkZ2VzKTsKKwkJCX0KKwkJfQorCQkKKwkJZGVsZXRlIGNlbGwuaW52YWxpZGF0aW5nOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHZhbGlkYXRlCisgKiAKKyAqIENhbGxzIDx2YWxpZGF0ZUNlbGw+IGFuZCA8dmFsaWRhdGVDZWxsU3RhdGU+IGFuZCB1cGRhdGVzIHRoZSA8Z3JhcGhCb3VuZHM+CisgKiB1c2luZyA8Z2V0Qm91bmRpbmdCb3g+LiBGaW5hbGx5IHRoZSBiYWNrZ3JvdW5kIGlzIHZhbGlkYXRlZCB1c2luZworICogPHZhbGlkYXRlQmFja2dyb3VuZD4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSBPcHRpb25hbCA8bXhDZWxsPiB0byBiZSB1c2VkIGFzIHRoZSByb290IG9mIHRoZSB2YWxpZGF0aW9uLgorICogRGVmYXVsdCBpcyA8Y3VycmVudFJvb3Q+IG9yIHRoZSByb290IG9mIHRoZSBtb2RlbC4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24oY2VsbCkKK3sKKwl2YXIgdDAgPSBteExvZy5lbnRlcignbXhHcmFwaFZpZXcudmFsaWRhdGUnKTsKKwl3aW5kb3cuc3RhdHVzID0gbXhSZXNvdXJjZXMuZ2V0KHRoaXMudXBkYXRpbmdEb2N1bWVudFJlc291cmNlKSB8fAorCQl0aGlzLnVwZGF0aW5nRG9jdW1lbnRSZXNvdXJjZTsKKwkKKwl0aGlzLnJlc2V0VmFsaWRhdGlvblN0YXRlKCk7CisJCisJLy8gSW1wcm92ZXMgSUUgcmVuZGVyaW5nIHNwZWVkIGJ5IG1pbmltaXppbmcgcmVmbG93cworCXZhciBwcmV2RGlzcGxheSA9IG51bGw7CisJCisJaWYgKHRoaXMub3B0aW1pemVWbWxSZWZsb3dzICYmIHRoaXMuY2FudmFzICE9IG51bGwgJiYgdGhpcy50ZXh0RGl2ID09IG51bGwgJiYKKwkJKChkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gOCAmJiAhbXhDbGllbnQuSVNfRU0pIHx8IG14Q2xpZW50LklTX1FVSVJLUykpCisJeworCQkvLyBQbGFjZWhvbGRlciBrZWVwcyBzY3JvbGxiYXIgcG9zaXRpb25zIHdoZW4gY2FudmFzIGlzIGhpZGRlbgorCQl0aGlzLnBsYWNlaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJCXRoaXMucGxhY2Vob2xkZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOworCQl0aGlzLnBsYWNlaG9sZGVyLnN0eWxlLndpZHRoID0gdGhpcy5jYW52YXMuY2xpZW50V2lkdGggKyAncHgnOworCQl0aGlzLnBsYWNlaG9sZGVyLnN0eWxlLmhlaWdodCA9IHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCArICdweCc7CisJCXRoaXMuY2FudmFzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5wbGFjZWhvbGRlcik7CisKKwkJcHJldkRpc3BsYXkgPSB0aGlzLmRyYXdQYW5lLnN0eWxlLmRpc3BsYXk7CisJCXRoaXMuY2FudmFzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisJCQorCQkvLyBDcmVhdGVzIHRlbXBvcmFyeSBESVYgdXNlZCBmb3IgdGV4dCBtZWFzdXJpbmcgaW4gbXhUZXh0LnVwZGF0ZUJvdW5kaW5nQm94CisJCXRoaXMudGV4dERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworCQl0aGlzLnRleHREaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOworCQl0aGlzLnRleHREaXYuc3R5bGUud2hpdGVTcGFjZSA9ICdub3dyYXAnOworCQl0aGlzLnRleHREaXYuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOworCQl0aGlzLnRleHREaXYuc3R5bGUuZGlzcGxheSA9IChteENsaWVudC5JU19RVUlSS1MpID8gJ2lubGluZScgOiAnaW5saW5lLWJsb2NrJzsKKwkJdGhpcy50ZXh0RGl2LnN0eWxlLnpvb20gPSAnMSc7CisJCQorCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMudGV4dERpdik7CisJfQorCQorCXZhciBncmFwaEJvdW5kcyA9IHRoaXMuZ2V0Qm91bmRpbmdCb3godGhpcy52YWxpZGF0ZUNlbGxTdGF0ZSgKKwkJdGhpcy52YWxpZGF0ZUNlbGwoY2VsbCB8fCAoKHRoaXMuY3VycmVudFJvb3QgIT0gbnVsbCkgPworCQkJdGhpcy5jdXJyZW50Um9vdCA6IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKS5nZXRSb290KCkpKSkpOworCXRoaXMuc2V0R3JhcGhCb3VuZHMoKGdyYXBoQm91bmRzICE9IG51bGwpID8gZ3JhcGhCb3VuZHMgOiB0aGlzLmdldEVtcHR5Qm91bmRzKCkpOworCXRoaXMudmFsaWRhdGVCYWNrZ3JvdW5kKCk7CisJCisJaWYgKHByZXZEaXNwbGF5ICE9IG51bGwpCisJeworCQl0aGlzLmNhbnZhcy5zdHlsZS5kaXNwbGF5ID0gcHJldkRpc3BsYXk7CisJCXRoaXMudGV4dERpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMudGV4dERpdik7CisJCQorCQlpZiAodGhpcy5wbGFjZWhvbGRlciAhPSBudWxsKQorCQl7CisJCQl0aGlzLnBsYWNlaG9sZGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlcik7CisJCX0KKwkJCQkKKwkJLy8gVGV4dGRpdiBjYW5ub3QgYmUgcmV1c2VkCisJCXRoaXMudGV4dERpdiA9IG51bGw7CisJfQorCQorCXRoaXMucmVzZXRWYWxpZGF0aW9uU3RhdGUoKTsKKwkKKwl3aW5kb3cuc3RhdHVzID0gbXhSZXNvdXJjZXMuZ2V0KHRoaXMuZG9uZVJlc291cmNlKSB8fAorCQl0aGlzLmRvbmVSZXNvdXJjZTsKKwlteExvZy5sZWF2ZSgnbXhHcmFwaFZpZXcudmFsaWRhdGUnLCB0MCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRFbXB0eUJvdW5kcworICogCisgKiBSZXR1cm5zIHRoZSBib3VuZHMgZm9yIGFuIGVtcHR5IGdyYXBoLiBUaGlzIHJldHVybnMgYSByZWN0YW5nbGUgYXQKKyAqIDx0cmFuc2xhdGU+IHdpdGggdGhlIHNpemUgb2YgMCB4IDAuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5nZXRFbXB0eUJvdW5kcyA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gbmV3IG14UmVjdGFuZ2xlKHRoaXMudHJhbnNsYXRlLnggKiB0aGlzLnNjYWxlLCB0aGlzLnRyYW5zbGF0ZS55ICogdGhpcy5zY2FsZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRCb3VuZGluZ0JveAorICogCisgKiBSZXR1cm5zIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHNoYXBlIGFuZCB0aGUgbGFiZWwgZm9yIHRoZSBnaXZlbgorICogPG14Q2VsbFN0YXRlPiBhbmQgaXRzIGNoaWxkcmVuIGlmIHJlY3Vyc2UgaXMgdHJ1ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHdob3NlIGJvdW5kaW5nIGJveCBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiByZWN1cnNlIC0gT3B0aW9uYWwgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBjaGlsZHJlbiBzaG91bGQgYmUgaW5jbHVkZWQuCisgKiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5nZXRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uKHN0YXRlLCByZWN1cnNlKQoreworCXJlY3Vyc2UgPSAocmVjdXJzZSAhPSBudWxsKSA/IHJlY3Vyc2UgOiB0cnVlOworCXZhciBiYm94ID0gbnVsbDsKKwkKKwlpZiAoc3RhdGUgIT0gbnVsbCkKKwl7CisJCWlmIChzdGF0ZS5zaGFwZSAhPSBudWxsICYmIHN0YXRlLnNoYXBlLmJvdW5kaW5nQm94ICE9IG51bGwpCisJCXsKKwkJCWJib3ggPSBzdGF0ZS5zaGFwZS5ib3VuZGluZ0JveC5jbG9uZSgpOworCQl9CisJCQorCQkvLyBBZGRzIGxhYmVsIGJvdW5kaW5nIGJveCB0byBncmFwaCBib3VuZHMKKwkJaWYgKHN0YXRlLnRleHQgIT0gbnVsbCAmJiBzdGF0ZS50ZXh0LmJvdW5kaW5nQm94ICE9IG51bGwpCisJCXsKKwkJCWlmIChiYm94ICE9IG51bGwpCisJCQl7CisJCQkJYmJveC5hZGQoc3RhdGUudGV4dC5ib3VuZGluZ0JveCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYmJveCA9IHN0YXRlLnRleHQuYm91bmRpbmdCb3guY2xvbmUoKTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKHJlY3Vyc2UpCisJCXsKKwkJCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwkJCXZhciBjaGlsZENvdW50ID0gbW9kZWwuZ2V0Q2hpbGRDb3VudChzdGF0ZS5jZWxsKTsKKwkJCQorCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspCisJCQl7CisJCQkJdmFyIGJvdW5kcyA9IHRoaXMuZ2V0Qm91bmRpbmdCb3godGhpcy5nZXRTdGF0ZShtb2RlbC5nZXRDaGlsZEF0KHN0YXRlLmNlbGwsIGkpKSk7CisJCQkJCisJCQkJaWYgKGJvdW5kcyAhPSBudWxsKQorCQkJCXsKKwkJCQkJaWYgKGJib3ggPT0gbnVsbCkKKwkJCQkJeworCQkJCQkJYmJveCA9IGJvdW5kczsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWJib3guYWRkKGJvdW5kcyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcmV0dXJuIGJib3g7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVCYWNrZ3JvdW5kUGFnZVNoYXBlCisgKgorICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgc2hhcGUgdXNlZCBhcyB0aGUgYmFja2dyb3VuZCBwYWdlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBib3VuZHMgLSA8bXhSZWN0YW5nbGU+IHRoYXQgcmVwcmVzZW50cyB0aGUgYm91bmRzIG9mIHRoZSBzaGFwZS4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLmNyZWF0ZUJhY2tncm91bmRQYWdlU2hhcGUgPSBmdW5jdGlvbihib3VuZHMpCit7CisJcmV0dXJuIG5ldyBteFJlY3RhbmdsZVNoYXBlKGJvdW5kcywgJ3doaXRlJywgJ2JsYWNrJyk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB2YWxpZGF0ZUJhY2tncm91bmQKKyAqCisgKiBDYWxscyA8dmFsaWRhdGVCYWNrZ3JvdW5kSW1hZ2U+IGFuZCA8dmFsaWRhdGVCYWNrZ3JvdW5kUGFnZT4uCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS52YWxpZGF0ZUJhY2tncm91bmQgPSBmdW5jdGlvbigpCit7CisJdGhpcy52YWxpZGF0ZUJhY2tncm91bmRJbWFnZSgpOworCXRoaXMudmFsaWRhdGVCYWNrZ3JvdW5kUGFnZSgpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdmFsaWRhdGVCYWNrZ3JvdW5kSW1hZ2UKKyAqIAorICogVmFsaWRhdGVzIHRoZSBiYWNrZ3JvdW5kIGltYWdlLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUudmFsaWRhdGVCYWNrZ3JvdW5kSW1hZ2UgPSBmdW5jdGlvbigpCit7CisJdmFyIGJnID0gdGhpcy5ncmFwaC5nZXRCYWNrZ3JvdW5kSW1hZ2UoKTsKKwkKKwlpZiAoYmcgIT0gbnVsbCkKKwl7CisJCWlmICh0aGlzLmJhY2tncm91bmRJbWFnZSA9PSBudWxsIHx8IHRoaXMuYmFja2dyb3VuZEltYWdlLmltYWdlICE9IGJnLnNyYykKKwkJeworCQkJaWYgKHRoaXMuYmFja2dyb3VuZEltYWdlICE9IG51bGwpCisJCQl7CisJCQkJdGhpcy5iYWNrZ3JvdW5kSW1hZ2UuZGVzdHJveSgpOworCQkJfQorCQkJCisJCQl2YXIgYm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKDAsIDAsIDEsIDEpOworCQkJCisJCQl0aGlzLmJhY2tncm91bmRJbWFnZSA9IG5ldyBteEltYWdlU2hhcGUoYm91bmRzLCBiZy5zcmMpOworCQkJdGhpcy5iYWNrZ3JvdW5kSW1hZ2UuZGlhbGVjdCA9IHRoaXMuZ3JhcGguZGlhbGVjdDsKKwkJCXRoaXMuYmFja2dyb3VuZEltYWdlLmluaXQodGhpcy5iYWNrZ3JvdW5kUGFuZSk7CisJCQl0aGlzLmJhY2tncm91bmRJbWFnZS5yZWRyYXcoKTsKKworCQkJLy8gV29ya2Fyb3VuZCBmb3IgaWdub3JlZCBldmVudCBvbiBiYWNrZ3JvdW5kIGluIElFOCBzdGFuZGFyZHMgbW9kZQorCQkJaWYgKGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSA4ICYmICFteENsaWVudC5JU19FTSkKKwkJCXsKKwkJCQlteEV2ZW50LmFkZEdlc3R1cmVMaXN0ZW5lcnModGhpcy5iYWNrZ3JvdW5kSW1hZ2Uubm9kZSwKKwkJCQkJbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwkJCQkJeworCQkJCQkJdGhpcy5ncmFwaC5maXJlTW91c2VFdmVudChteEV2ZW50Lk1PVVNFX0RPV04sIG5ldyBteE1vdXNlRXZlbnQoZXZ0KSk7CisJCQkJCX0pLAorCQkJCQlteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQkJCQl7CisJCQkJCQl0aGlzLmdyYXBoLmZpcmVNb3VzZUV2ZW50KG14RXZlbnQuTU9VU0VfTU9WRSwgbmV3IG14TW91c2VFdmVudChldnQpKTsKKwkJCQkJfSksCisJCQkJCW14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJCQkJCXsKKwkJCQkJCXRoaXMuZ3JhcGguZmlyZU1vdXNlRXZlbnQobXhFdmVudC5NT1VTRV9VUCwgbmV3IG14TW91c2VFdmVudChldnQpKTsKKwkJCQkJfSkKKwkJCQkpOworCQkJfQorCQl9CisJCQorCQl0aGlzLnJlZHJhd0JhY2tncm91bmRJbWFnZSh0aGlzLmJhY2tncm91bmRJbWFnZSwgYmcpOworCX0KKwllbHNlIGlmICh0aGlzLmJhY2tncm91bmRJbWFnZSAhPSBudWxsKQorCXsKKwkJdGhpcy5iYWNrZ3JvdW5kSW1hZ2UuZGVzdHJveSgpOworCQl0aGlzLmJhY2tncm91bmRJbWFnZSA9IG51bGw7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogdmFsaWRhdGVCYWNrZ3JvdW5kUGFnZQorICogCisgKiBWYWxpZGF0ZXMgdGhlIGJhY2tncm91bmQgcGFnZS4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLnZhbGlkYXRlQmFja2dyb3VuZFBhZ2UgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMuZ3JhcGgucGFnZVZpc2libGUpCisJeworCQl2YXIgYm91bmRzID0gdGhpcy5nZXRCYWNrZ3JvdW5kUGFnZUJvdW5kcygpOworCQkKKwkJaWYgKHRoaXMuYmFja2dyb3VuZFBhZ2VTaGFwZSA9PSBudWxsKQorCQl7CisJCQl0aGlzLmJhY2tncm91bmRQYWdlU2hhcGUgPSB0aGlzLmNyZWF0ZUJhY2tncm91bmRQYWdlU2hhcGUoYm91bmRzKTsKKwkJCXRoaXMuYmFja2dyb3VuZFBhZ2VTaGFwZS5zY2FsZSA9IHRoaXMuc2NhbGU7CisJCQl0aGlzLmJhY2tncm91bmRQYWdlU2hhcGUuaXNTaGFkb3cgPSB0cnVlOworCQkJdGhpcy5iYWNrZ3JvdW5kUGFnZVNoYXBlLmRpYWxlY3QgPSB0aGlzLmdyYXBoLmRpYWxlY3Q7CisJCQl0aGlzLmJhY2tncm91bmRQYWdlU2hhcGUuaW5pdCh0aGlzLmJhY2tncm91bmRQYW5lKTsKKwkJCXRoaXMuYmFja2dyb3VuZFBhZ2VTaGFwZS5yZWRyYXcoKTsKKwkJCQorCQkJLy8gQWRkcyBsaXN0ZW5lciBmb3IgZG91YmxlIGNsaWNrIGhhbmRsaW5nIG9uIGJhY2tncm91bmQKKwkJCWlmICh0aGlzLmdyYXBoLm5hdGl2ZURibENsaWNrRW5hYmxlZCkKKwkJCXsKKwkJCQlteEV2ZW50LmFkZExpc3RlbmVyKHRoaXMuYmFja2dyb3VuZFBhZ2VTaGFwZS5ub2RlLCAnZGJsY2xpY2snLCBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQkJCXsKKwkJCQkJdGhpcy5ncmFwaC5kYmxDbGljayhldnQpOworCQkJCX0pKTsKKwkJCX0KKworCQkJLy8gQWRkcyBiYXNpYyBsaXN0ZW5lcnMgZm9yIGdyYXBoIGV2ZW50IGRpc3BhdGNoaW5nIG91dHNpZGUgb2YgdGhlCisJCQkvLyBjb250YWluZXIgYW5kIGZpbmlzaGluZyB0aGUgaGFuZGxpbmcgb2YgYSBzaW5nbGUgZ2VzdHVyZQorCQkJbXhFdmVudC5hZGRHZXN0dXJlTGlzdGVuZXJzKHRoaXMuYmFja2dyb3VuZFBhZ2VTaGFwZS5ub2RlLAorCQkJCW14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJCQkJeworCQkJCQl0aGlzLmdyYXBoLmZpcmVNb3VzZUV2ZW50KG14RXZlbnQuTU9VU0VfRE9XTiwgbmV3IG14TW91c2VFdmVudChldnQpKTsKKwkJCQl9KSwKKwkJCQlteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQkJCXsKKwkJCQkJLy8gSGlkZXMgdGhlIHRvb2x0aXAgaWYgbW91c2UgaXMgb3V0c2lkZSBjb250YWluZXIKKwkJCQkJaWYgKHRoaXMuZ3JhcGgudG9vbHRpcEhhbmRsZXIgIT0gbnVsbCAmJiB0aGlzLmdyYXBoLnRvb2x0aXBIYW5kbGVyLmlzSGlkZU9uSG92ZXIoKSkKKwkJCQkJeworCQkJCQkJdGhpcy5ncmFwaC50b29sdGlwSGFuZGxlci5oaWRlKCk7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmICh0aGlzLmdyYXBoLmlzTW91c2VEb3duICYmICFteEV2ZW50LmlzQ29uc3VtZWQoZXZ0KSkKKwkJCQkJeworCQkJCQkJdGhpcy5ncmFwaC5maXJlTW91c2VFdmVudChteEV2ZW50Lk1PVVNFX01PVkUsIG5ldyBteE1vdXNlRXZlbnQoZXZ0KSk7CisJCQkJCX0KKwkJCQl9KSwKKwkJCQlteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQkJCXsKKwkJCQkJdGhpcy5ncmFwaC5maXJlTW91c2VFdmVudChteEV2ZW50Lk1PVVNFX1VQLCBuZXcgbXhNb3VzZUV2ZW50KGV2dCkpOworCQkJCX0pCisJCQkpOworCQl9CisJCWVsc2UKKwkJeworCQkJdGhpcy5iYWNrZ3JvdW5kUGFnZVNoYXBlLnNjYWxlID0gdGhpcy5zY2FsZTsKKwkJCXRoaXMuYmFja2dyb3VuZFBhZ2VTaGFwZS5ib3VuZHMgPSBib3VuZHM7CisJCQl0aGlzLmJhY2tncm91bmRQYWdlU2hhcGUucmVkcmF3KCk7CisJCX0KKwl9CisJZWxzZSBpZiAodGhpcy5iYWNrZ3JvdW5kUGFnZVNoYXBlICE9IG51bGwpCisJeworCQl0aGlzLmJhY2tncm91bmRQYWdlU2hhcGUuZGVzdHJveSgpOworCQl0aGlzLmJhY2tncm91bmRQYWdlU2hhcGUgPSBudWxsOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEJhY2tncm91bmRQYWdlQm91bmRzCisgKiAKKyAqIFJldHVybnMgdGhlIGJvdW5kcyBmb3IgdGhlIGJhY2tncm91bmQgcGFnZS4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLmdldEJhY2tncm91bmRQYWdlQm91bmRzID0gZnVuY3Rpb24oKQoreworCXZhciBmbXQgPSB0aGlzLmdyYXBoLnBhZ2VGb3JtYXQ7CisJdmFyIHBzID0gdGhpcy5zY2FsZSAqIHRoaXMuZ3JhcGgucGFnZVNjYWxlOworCXZhciBib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUodGhpcy5zY2FsZSAqIHRoaXMudHJhbnNsYXRlLngsIHRoaXMuc2NhbGUgKiB0aGlzLnRyYW5zbGF0ZS55LAorCQkJZm10LndpZHRoICogcHMsIGZtdC5oZWlnaHQgKiBwcyk7CisJCisJcmV0dXJuIGJvdW5kczsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlZHJhd0JhY2tncm91bmRJbWFnZQorICoKKyAqIFVwZGF0ZXMgdGhlIGJvdW5kcyBhbmQgcmVkcmF3cyB0aGUgYmFja2dyb3VuZCBpbWFnZS4KKyAqIAorICogRXhhbXBsZToKKyAqIAorICogSWYgdGhlIGJhY2tncm91bmQgaW1hZ2Ugc2hvdWxkIG5vdCBiZSBzY2FsZWQsIHRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGgKKyAqIHRoZSBmb2xsb3dpbmcuCisgKiAKKyAqIChjb2RlKQorICogbXhHcmFwaFZpZXcucHJvdG90eXBlLnJlZHJhd0JhY2tncm91bmQgPSBmdW5jdGlvbihiYWNrZ3JvdW5kSW1hZ2UsIGJnKQorICogeworICogICBiYWNrZ3JvdW5kSW1hZ2UuYm91bmRzLnggPSB0aGlzLnRyYW5zbGF0ZS54OworICogICBiYWNrZ3JvdW5kSW1hZ2UuYm91bmRzLnkgPSB0aGlzLnRyYW5zbGF0ZS55OworICogICBiYWNrZ3JvdW5kSW1hZ2UuYm91bmRzLndpZHRoID0gYmcud2lkdGg7CisgKiAgIGJhY2tncm91bmRJbWFnZS5ib3VuZHMuaGVpZ2h0ID0gYmcuaGVpZ2h0OworICoKKyAqICAgYmFja2dyb3VuZEltYWdlLnJlZHJhdygpOworICogfTsKKyAqIChlbmQpCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGJhY2tncm91bmRJbWFnZSAtIDxteEltYWdlU2hhcGU+IHRoYXQgcmVwcmVzZW50cyB0aGUgYmFja2dyb3VuZCBpbWFnZS4KKyAqIGJnIC0gPG14SW1hZ2U+IHRoYXQgc3BlY2lmaWVzIHRoZSBpbWFnZSBhbmQgaXRzIGRpbWVuc2lvbnMuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5yZWRyYXdCYWNrZ3JvdW5kSW1hZ2UgPSBmdW5jdGlvbihiYWNrZ3JvdW5kSW1hZ2UsIGJnKQoreworCWJhY2tncm91bmRJbWFnZS5zY2FsZSA9IHRoaXMuc2NhbGU7CisJYmFja2dyb3VuZEltYWdlLmJvdW5kcy54ID0gdGhpcy5zY2FsZSAqIHRoaXMudHJhbnNsYXRlLng7CisJYmFja2dyb3VuZEltYWdlLmJvdW5kcy55ID0gdGhpcy5zY2FsZSAqIHRoaXMudHJhbnNsYXRlLnk7CisJYmFja2dyb3VuZEltYWdlLmJvdW5kcy53aWR0aCA9IHRoaXMuc2NhbGUgKiBiZy53aWR0aDsKKwliYWNrZ3JvdW5kSW1hZ2UuYm91bmRzLmhlaWdodCA9IHRoaXMuc2NhbGUgKiBiZy5oZWlnaHQ7CisKKwliYWNrZ3JvdW5kSW1hZ2UucmVkcmF3KCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB2YWxpZGF0ZUNlbGwKKyAqIAorICogUmVjdXJzaXZlbHkgY3JlYXRlcyB0aGUgY2VsbCBzdGF0ZSBmb3IgdGhlIGdpdmVuIGNlbGwgaWYgdmlzaWJsZSBpcyB0cnVlIGFuZAorICogdGhlIGdpdmVuIGNlbGwgaXMgdmlzaWJsZS4gSWYgdGhlIGNlbGwgaXMgbm90IHZpc2libGUgYnV0IHRoZSBzdGF0ZSBleGlzdHMKKyAqIHRoZW4gaXQgaXMgcmVtb3ZlZCB1c2luZyA8cmVtb3ZlU3RhdGU+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgPG14Q2VsbFN0YXRlPiBzaG91bGQgYmUgY3JlYXRlZC4KKyAqIHZpc2libGUgLSBPcHRpb25hbCBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGNlbGwgc2hvdWxkIGJlIHZpc2libGUuIERlZmF1bHQKKyAqIGlzIHRydWUuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS52YWxpZGF0ZUNlbGwgPSBmdW5jdGlvbihjZWxsLCB2aXNpYmxlKQoreworCXZpc2libGUgPSAodmlzaWJsZSAhPSBudWxsKSA/IHZpc2libGUgOiB0cnVlOworCQorCWlmIChjZWxsICE9IG51bGwpCisJeworCQl2aXNpYmxlID0gdmlzaWJsZSAmJiB0aGlzLmdyYXBoLmlzQ2VsbFZpc2libGUoY2VsbCk7CisJCXZhciBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoY2VsbCwgdmlzaWJsZSk7CisJCQorCQlpZiAoc3RhdGUgIT0gbnVsbCAmJiAhdmlzaWJsZSkKKwkJeworCQkJdGhpcy5yZW1vdmVTdGF0ZShjZWxsKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwkJCXZhciBjaGlsZENvdW50ID0gbW9kZWwuZ2V0Q2hpbGRDb3VudChjZWxsKTsKKwkJCQorCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspCisJCQl7CisJCQkJdGhpcy52YWxpZGF0ZUNlbGwobW9kZWwuZ2V0Q2hpbGRBdChjZWxsLCBpKSwgdmlzaWJsZSAmJgorCQkJCQkoIXRoaXMuaXNDZWxsQ29sbGFwc2VkKGNlbGwpIHx8IGNlbGwgPT0gdGhpcy5jdXJyZW50Um9vdCkpOworCQkJfQorCQl9CisJfQorCQorCXJldHVybiBjZWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdmFsaWRhdGVDZWxsU3RhdGUKKyAqIAorICogVmFsaWRhdGVzIGFuZCByZXBhaW50cyB0aGUgPG14Q2VsbFN0YXRlPiBmb3IgdGhlIGdpdmVuIDxteENlbGw+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gd2hvc2UgPG14Q2VsbFN0YXRlPiBzaG91bGQgYmUgdmFsaWRhdGVkLgorICogcmVjdXJzZSAtIE9wdGlvbmFsIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY2hpbGRyZW4gb2YgdGhlIGNlbGwgc2hvdWxkIGJlCisgKiB2YWxpZGF0ZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLnZhbGlkYXRlQ2VsbFN0YXRlID0gZnVuY3Rpb24oY2VsbCwgcmVjdXJzZSkKK3sKKwlyZWN1cnNlID0gKHJlY3Vyc2UgIT0gbnVsbCkgPyByZWN1cnNlIDogdHJ1ZTsKKwl2YXIgc3RhdGUgPSBudWxsOworCQorCWlmIChjZWxsICE9IG51bGwpCisJeworCQlzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoY2VsbCk7CisJCQorCQlpZiAoc3RhdGUgIT0gbnVsbCkKKwkJeworCQkJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpOworCQkJCisJCQlpZiAoc3RhdGUuaW52YWxpZCkKKwkJCXsKKwkJCQlzdGF0ZS5pbnZhbGlkID0gZmFsc2U7CisJCQkJCisJCQkJaWYgKHN0YXRlLnN0eWxlID09IG51bGwpCisJCQkJeworCQkJCQlzdGF0ZS5zdHlsZSA9IHRoaXMuZ3JhcGguZ2V0Q2VsbFN0eWxlKHN0YXRlLmNlbGwpOworCQkJCX0KKwkJCQkKKwkJCQlpZiAoY2VsbCAhPSB0aGlzLmN1cnJlbnRSb290KQorCQkJCXsKKwkJCQkJdGhpcy52YWxpZGF0ZUNlbGxTdGF0ZShtb2RlbC5nZXRQYXJlbnQoY2VsbCksIGZhbHNlKTsKKwkJCQl9CisKKwkJCQlzdGF0ZS5zZXRWaXNpYmxlVGVybWluYWxTdGF0ZSh0aGlzLnZhbGlkYXRlQ2VsbFN0YXRlKHRoaXMuZ2V0VmlzaWJsZVRlcm1pbmFsKGNlbGwsIHRydWUpLCBmYWxzZSksIHRydWUpOworCQkJCXN0YXRlLnNldFZpc2libGVUZXJtaW5hbFN0YXRlKHRoaXMudmFsaWRhdGVDZWxsU3RhdGUodGhpcy5nZXRWaXNpYmxlVGVybWluYWwoY2VsbCwgZmFsc2UpLCBmYWxzZSksIGZhbHNlKTsKKwkJCQkKKwkJCQl0aGlzLnVwZGF0ZUNlbGxTdGF0ZShzdGF0ZSk7CisJCQkJCisJCQkJLy8gUmVwYWludCBoYXBwZW5zIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjZWxsIGlzIHZhbGlkYXRlZAorCQkJCWlmIChjZWxsICE9IHRoaXMuY3VycmVudFJvb3QgJiYgIXN0YXRlLmludmFsaWQpCisJCQkJeworCQkJCQl0aGlzLmdyYXBoLmNlbGxSZW5kZXJlci5yZWRyYXcoc3RhdGUsIGZhbHNlLCB0aGlzLmlzUmVuZGVyaW5nKCkpOworCisJCQkJCS8vIEhhbmRsZXMgY2hhbmdlcyB0byBpbnZlcnRleCBwYWludGJvdW5kcyBhZnRlciB1cGRhdGUgb2YgcmVuZGVyaW5nIHNoYXBlCisJCQkJCXN0YXRlLnVwZGF0ZUNhY2hlZEJvdW5kcygpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHJlY3Vyc2UgJiYgIXN0YXRlLmludmFsaWQpCisJCQl7CisJCQkJLy8gVXBkYXRlcyBvcmRlciBpbiBET00gaWYgcmVjdXJzaXZlbHkgdHJhdmVyc2luZworCQkJCWlmIChzdGF0ZS5zaGFwZSAhPSBudWxsKQorCQkJCXsKKwkJCQkJdGhpcy5zdGF0ZVZhbGlkYXRlZChzdGF0ZSk7CisJCQkJfQorCQkJCisJCQkJdmFyIGNoaWxkQ291bnQgPSBtb2RlbC5nZXRDaGlsZENvdW50KGNlbGwpOworCQkJCQorCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgaSsrKQorCQkJCXsKKwkJCQkJdGhpcy52YWxpZGF0ZUNlbGxTdGF0ZShtb2RlbC5nZXRDaGlsZEF0KGNlbGwsIGkpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcmV0dXJuIHN0YXRlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlQ2VsbFN0YXRlCisgKiAKKyAqIFVwZGF0ZXMgdGhlIGdpdmVuIDxteENlbGxTdGF0ZT4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB0byBiZSB1cGRhdGVkLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUudXBkYXRlQ2VsbFN0YXRlID0gZnVuY3Rpb24oc3RhdGUpCit7CisJc3RhdGUuYWJzb2x1dGVPZmZzZXQueCA9IDA7CisJc3RhdGUuYWJzb2x1dGVPZmZzZXQueSA9IDA7CisJc3RhdGUub3JpZ2luLnggPSAwOworCXN0YXRlLm9yaWdpbi55ID0gMDsKKwlzdGF0ZS5sZW5ndGggPSAwOworCQorCWlmIChzdGF0ZS5jZWxsICE9IHRoaXMuY3VycmVudFJvb3QpCisJeworCQl2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCk7CisJCXZhciBwU3RhdGUgPSB0aGlzLmdldFN0YXRlKG1vZGVsLmdldFBhcmVudChzdGF0ZS5jZWxsKSk7IAorCQkKKwkJaWYgKHBTdGF0ZSAhPSBudWxsICYmIHBTdGF0ZS5jZWxsICE9IHRoaXMuY3VycmVudFJvb3QpCisJCXsKKwkJCXN0YXRlLm9yaWdpbi54ICs9IHBTdGF0ZS5vcmlnaW4ueDsKKwkJCXN0YXRlLm9yaWdpbi55ICs9IHBTdGF0ZS5vcmlnaW4ueTsKKwkJfQorCQkKKwkJdmFyIG9mZnNldCA9IHRoaXMuZ3JhcGguZ2V0Q2hpbGRPZmZzZXRGb3JDZWxsKHN0YXRlLmNlbGwpOworCQkKKwkJaWYgKG9mZnNldCAhPSBudWxsKQorCQl7CisJCQlzdGF0ZS5vcmlnaW4ueCArPSBvZmZzZXQueDsKKwkJCXN0YXRlLm9yaWdpbi55ICs9IG9mZnNldC55OworCQl9CisJCQorCQl2YXIgZ2VvID0gdGhpcy5ncmFwaC5nZXRDZWxsR2VvbWV0cnkoc3RhdGUuY2VsbCk7CQkJCQorCQorCQlpZiAoZ2VvICE9IG51bGwpCisJCXsKKwkJCWlmICghbW9kZWwuaXNFZGdlKHN0YXRlLmNlbGwpKQorCQkJeworCQkJCW9mZnNldCA9IGdlby5vZmZzZXQgfHwgdGhpcy5FTVBUWV9QT0lOVDsKKwkKKwkJCQlpZiAoZ2VvLnJlbGF0aXZlICYmIHBTdGF0ZSAhPSBudWxsKQorCQkJCXsKKwkJCQkJaWYgKG1vZGVsLmlzRWRnZShwU3RhdGUuY2VsbCkpCisJCQkJCXsKKwkJCQkJCXZhciBvcmlnaW4gPSB0aGlzLmdldFBvaW50KHBTdGF0ZSwgZ2VvKTsKKworCQkJCQkJaWYgKG9yaWdpbiAhPSBudWxsKQorCQkJCQkJeworCQkJCQkJCXN0YXRlLm9yaWdpbi54ICs9IChvcmlnaW4ueCAvIHRoaXMuc2NhbGUpIC0gcFN0YXRlLm9yaWdpbi54IC0gdGhpcy50cmFuc2xhdGUueDsKKwkJCQkJCQlzdGF0ZS5vcmlnaW4ueSArPSAob3JpZ2luLnkgLyB0aGlzLnNjYWxlKSAtIHBTdGF0ZS5vcmlnaW4ueSAtIHRoaXMudHJhbnNsYXRlLnk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlzdGF0ZS5vcmlnaW4ueCArPSBnZW8ueCAqIHBTdGF0ZS53aWR0aCAvIHRoaXMuc2NhbGUgKyBvZmZzZXQueDsKKwkJCQkJCXN0YXRlLm9yaWdpbi55ICs9IGdlby55ICogcFN0YXRlLmhlaWdodCAvIHRoaXMuc2NhbGUgKyBvZmZzZXQueTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlzdGF0ZS5hYnNvbHV0ZU9mZnNldC54ID0gdGhpcy5zY2FsZSAqIG9mZnNldC54OworCQkJCQlzdGF0ZS5hYnNvbHV0ZU9mZnNldC55ID0gdGhpcy5zY2FsZSAqIG9mZnNldC55OworCQkJCQlzdGF0ZS5vcmlnaW4ueCArPSBnZW8ueDsKKwkJCQkJc3RhdGUub3JpZ2luLnkgKz0gZ2VvLnk7CisJCQkJfQorCQkJfQorCQorCQkJc3RhdGUueCA9IHRoaXMuc2NhbGUgKiAodGhpcy50cmFuc2xhdGUueCArIHN0YXRlLm9yaWdpbi54KTsKKwkJCXN0YXRlLnkgPSB0aGlzLnNjYWxlICogKHRoaXMudHJhbnNsYXRlLnkgKyBzdGF0ZS5vcmlnaW4ueSk7CisJCQlzdGF0ZS53aWR0aCA9IHRoaXMuc2NhbGUgKiBnZW8ud2lkdGg7CisJCQlzdGF0ZS51bnNjYWxlZFdpZHRoID0gZ2VvLndpZHRoOworCQkJc3RhdGUuaGVpZ2h0ID0gdGhpcy5zY2FsZSAqIGdlby5oZWlnaHQ7CisJCQkKKwkJCWlmIChtb2RlbC5pc1ZlcnRleChzdGF0ZS5jZWxsKSkKKwkJCXsKKwkJCQl0aGlzLnVwZGF0ZVZlcnRleFN0YXRlKHN0YXRlLCBnZW8pOworCQkJfQorCQkJCisJCQlpZiAobW9kZWwuaXNFZGdlKHN0YXRlLmNlbGwpKQorCQkJeworCQkJCXRoaXMudXBkYXRlRWRnZVN0YXRlKHN0YXRlLCBnZW8pOworCQkJfQorCQl9CisJfQorCisJc3RhdGUudXBkYXRlQ2FjaGVkQm91bmRzKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NlbGxDb2xsYXBzZWQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBjaGlsZHJlbiBvZiB0aGUgZ2l2ZW4gY2VsbCBzaG91bGQgbm90IGJlIHZpc2libGUgaW4gdGhlCisgKiB2aWV3LiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgPG14R3JhcGguaXNDZWxsVmlzaWJsZT4gYnV0IGl0IGNhbiBiZQorICogb3ZlcmlkZGVuIHRvIHVzZSBhIHNlcGFyYXRlIGNvbmRpdGlvbi4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLmlzQ2VsbENvbGxhcHNlZCA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIHRoaXMuZ3JhcGguaXNDZWxsQ29sbGFwc2VkKGNlbGwpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlVmVydGV4U3RhdGUKKyAqIAorICogVmFsaWRhdGVzIHRoZSBnaXZlbiBjZWxsIHN0YXRlLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUudXBkYXRlVmVydGV4U3RhdGUgPSBmdW5jdGlvbihzdGF0ZSwgZ2VvKQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwl2YXIgcFN0YXRlID0gdGhpcy5nZXRTdGF0ZShtb2RlbC5nZXRQYXJlbnQoc3RhdGUuY2VsbCkpOworCQorCWlmIChnZW8ucmVsYXRpdmUgJiYgcFN0YXRlICE9IG51bGwgJiYgIW1vZGVsLmlzRWRnZShwU3RhdGUuY2VsbCkpCisJeworCQl2YXIgYWxwaGEgPSBteFV0aWxzLnRvUmFkaWFucyhwU3RhdGUuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfUk9UQVRJT05dIHx8ICcwJyk7CisJCQorCQlpZiAoYWxwaGEgIT0gMCkKKwkJeworCQkJdmFyIGNvcyA9IE1hdGguY29zKGFscGhhKTsKKwkJCXZhciBzaW4gPSBNYXRoLnNpbihhbHBoYSk7CisKKwkJCXZhciBjdCA9IG5ldyBteFBvaW50KHN0YXRlLmdldENlbnRlclgoKSwgc3RhdGUuZ2V0Q2VudGVyWSgpKTsKKwkJCXZhciBjeCA9IG5ldyBteFBvaW50KHBTdGF0ZS5nZXRDZW50ZXJYKCksIHBTdGF0ZS5nZXRDZW50ZXJZKCkpOworCQkJdmFyIHB0ID0gbXhVdGlscy5nZXRSb3RhdGVkUG9pbnQoY3QsIGNvcywgc2luLCBjeCk7CisJCQlzdGF0ZS54ID0gcHQueCAtIHN0YXRlLndpZHRoIC8gMjsKKwkJCXN0YXRlLnkgPSBwdC55IC0gc3RhdGUuaGVpZ2h0IC8gMjsKKwkJfQorCX0KKwkKKwl0aGlzLnVwZGF0ZVZlcnRleExhYmVsT2Zmc2V0KHN0YXRlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZUVkZ2VTdGF0ZQorICogCisgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIGNlbGwgc3RhdGUuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS51cGRhdGVFZGdlU3RhdGUgPSBmdW5jdGlvbihzdGF0ZSwgZ2VvKQoreworCXZhciBzb3VyY2UgPSBzdGF0ZS5nZXRWaXNpYmxlVGVybWluYWxTdGF0ZSh0cnVlKTsKKwl2YXIgdGFyZ2V0ID0gc3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsU3RhdGUoZmFsc2UpOworCQorCS8vIFRoaXMgd2lsbCByZW1vdmUgZWRnZXMgd2l0aCBubyB0ZXJtaW5hbHMgYW5kIG5vIHRlcm1pbmFsIHBvaW50cworCS8vIGFzIHN1Y2ggZWRnZXMgYXJlIGludmFsaWQgYW5kIHByb2R1Y2UgTlBFcyBpbiB0aGUgZWRnZSBzdHlsZXMuCisJLy8gQWxzbyByZW1vdmVzIGNvbm5lY3RlZCBlZGdlcyB0aGF0IGhhdmUgbm8gdmlzaWJsZSB0ZXJtaW5hbHMuCisJaWYgKCh0aGlzLmdyYXBoLm1vZGVsLmdldFRlcm1pbmFsKHN0YXRlLmNlbGwsIHRydWUpICE9IG51bGwgJiYgc291cmNlID09IG51bGwpIHx8CisJCShzb3VyY2UgPT0gbnVsbCAmJiBnZW8uZ2V0VGVybWluYWxQb2ludCh0cnVlKSA9PSBudWxsKSB8fAorCQkodGhpcy5ncmFwaC5tb2RlbC5nZXRUZXJtaW5hbChzdGF0ZS5jZWxsLCBmYWxzZSkgIT0gbnVsbCAmJiB0YXJnZXQgPT0gbnVsbCkgfHwKKwkJKHRhcmdldCA9PSBudWxsICYmIGdlby5nZXRUZXJtaW5hbFBvaW50KGZhbHNlKSA9PSBudWxsKSkKKwl7CisJCXRoaXMuY2xlYXIoc3RhdGUuY2VsbCwgdHJ1ZSk7CisJfQorCWVsc2UKKwl7CisJCXRoaXMudXBkYXRlRml4ZWRUZXJtaW5hbFBvaW50cyhzdGF0ZSwgc291cmNlLCB0YXJnZXQpOworCQl0aGlzLnVwZGF0ZVBvaW50cyhzdGF0ZSwgZ2VvLnBvaW50cywgc291cmNlLCB0YXJnZXQpOworCQl0aGlzLnVwZGF0ZUZsb2F0aW5nVGVybWluYWxQb2ludHMoc3RhdGUsIHNvdXJjZSwgdGFyZ2V0KTsKKwkJCisJCXZhciBwdHMgPSBzdGF0ZS5hYnNvbHV0ZVBvaW50czsKKwkJCisJCWlmIChzdGF0ZS5jZWxsICE9IHRoaXMuY3VycmVudFJvb3QgJiYgKHB0cyA9PSBudWxsIHx8IHB0cy5sZW5ndGggPCAyIHx8CisJCQlwdHNbMF0gPT0gbnVsbCB8fCBwdHNbcHRzLmxlbmd0aCAtIDFdID09IG51bGwpKQorCQl7CisJCQkvLyBUaGlzIHdpbGwgcmVtb3ZlIGVkZ2VzIHdpdGggaW52YWxpZCBwb2ludHMgZnJvbSB0aGUgbGlzdCBvZiBzdGF0ZXMgaW4gdGhlIHZpZXcuCisJCQkvLyBIYXBwZW5zIGlmIHRoZSBvbmUgb2YgdGhlIHRlcm1pbmFscyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdGVybWluYWwgcG9pbnQgaXMgbnVsbC4KKwkJCXRoaXMuY2xlYXIoc3RhdGUuY2VsbCwgdHJ1ZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLnVwZGF0ZUVkZ2VCb3VuZHMoc3RhdGUpOworCQkJdGhpcy51cGRhdGVFZGdlTGFiZWxPZmZzZXQoc3RhdGUpOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlVmVydGV4TGFiZWxPZmZzZXQKKyAqIAorICogVXBkYXRlcyB0aGUgYWJzb2x1dGVPZmZzZXQgb2YgdGhlIGdpdmVuIHZlcnRleCBjZWxsIHN0YXRlLiBUaGlzIHRha2VzCisgKiBpbnRvIGFjY291bnQgdGhlIGxhYmVsIHBvc2l0aW9uIHN0eWxlcy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHdob3NlIGFic29sdXRlIG9mZnNldCBzaG91bGQgYmUgdXBkYXRlZC4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLnVwZGF0ZVZlcnRleExhYmVsT2Zmc2V0ID0gZnVuY3Rpb24oc3RhdGUpCit7CisJdmFyIGggPSBteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9MQUJFTF9QT1NJVElPTiwgbXhDb25zdGFudHMuQUxJR05fQ0VOVEVSKTsKKworCWlmIChoID09IG14Q29uc3RhbnRzLkFMSUdOX0xFRlQpCisJeworCQl2YXIgbHcgPSBteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9MQUJFTF9XSURUSCwgbnVsbCk7CisJCQorCQlpZiAobHcgIT0gbnVsbCkKKwkJeworCQkJbHcgKj0gdGhpcy5zY2FsZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWx3ID0gc3RhdGUud2lkdGg7CisJCX0KKwkJCisJCXN0YXRlLmFic29sdXRlT2Zmc2V0LnggLT0gbHc7CisJfQorCWVsc2UgaWYgKGggPT0gbXhDb25zdGFudHMuQUxJR05fUklHSFQpCisJeworCQlzdGF0ZS5hYnNvbHV0ZU9mZnNldC54ICs9IHN0YXRlLndpZHRoOworCX0KKwllbHNlIGlmIChoID09IG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUikKKwl7CisJCXZhciBsdyA9IG14VXRpbHMuZ2V0VmFsdWUoc3RhdGUuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0xBQkVMX1dJRFRILCBudWxsKTsKKwkJCisJCWlmIChsdyAhPSBudWxsKQorCQl7CisJCQkvLyBBbGlnbnMgdGV4dCBibG9jayB3aXRoIGdpdmVuIHdpZHRoIGluc2lkZSB0aGUgdmVydGV4IHdpZHRoCisJCQl2YXIgYWxpZ24gPSBteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9BTElHTiwgbXhDb25zdGFudHMuQUxJR05fQ0VOVEVSKTsKKwkJCXZhciBkeCA9IDA7CisJCQkKKwkJCWlmIChhbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9DRU5URVIpCisJCQl7CisJCQkJZHggPSAwLjU7CisJCQl9CisJCQllbHNlIGlmIChhbGlnbiA9PSBteENvbnN0YW50cy5BTElHTl9SSUdIVCkKKwkJCXsKKwkJCQlkeCA9IDE7CisJCQl9CisJCQkKKwkJCWlmIChkeCAhPSAwKQorCQkJeworCQkJCXN0YXRlLmFic29sdXRlT2Zmc2V0LnggLT0gKGx3ICogdGhpcy5zY2FsZSAtIHN0YXRlLndpZHRoKSAqIGR4OworCQkJfQorCQl9CisJfQorCQorCXZhciB2ID0gbXhVdGlscy5nZXRWYWx1ZShzdGF0ZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfVkVSVElDQUxfTEFCRUxfUE9TSVRJT04sIG14Q29uc3RhbnRzLkFMSUdOX01JRERMRSk7CisJCisJaWYgKHYgPT0gbXhDb25zdGFudHMuQUxJR05fVE9QKQorCXsKKwkJc3RhdGUuYWJzb2x1dGVPZmZzZXQueSAtPSBzdGF0ZS5oZWlnaHQ7CisJfQorCWVsc2UgaWYgKHYgPT0gbXhDb25zdGFudHMuQUxJR05fQk9UVE9NKQorCXsKKwkJc3RhdGUuYWJzb2x1dGVPZmZzZXQueSArPSBzdGF0ZS5oZWlnaHQ7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVzZXRWYWxpZGF0aW9uU3RhdGUKKyAqCisgKiBSZXNldHMgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbiBzdGF0ZS4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLnJlc2V0VmFsaWRhdGlvblN0YXRlID0gZnVuY3Rpb24oKQoreworCXRoaXMubGFzdE5vZGUgPSBudWxsOworCXRoaXMubGFzdEh0bWxOb2RlID0gbnVsbDsKKwl0aGlzLmxhc3RGb3JlZ3JvdW5kTm9kZSA9IG51bGw7CisJdGhpcy5sYXN0Rm9yZWdyb3VuZEh0bWxOb2RlID0gbnVsbDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHN0YXRlVmFsaWRhdGVkCisgKiAKKyAqIEludm9rZWQgd2hlbiBhIHN0YXRlIGhhcyBiZWVuIHByb2Nlc3NlZCBpbiA8dmFsaWRhdGVQb2ludHM+LiBUaGlzIGlzIHVzZWQKKyAqIHRvIHVwZGF0ZSB0aGUgb3JkZXIgb2YgdGhlIERPTSBub2RlcyBvZiB0aGUgc2hhcGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB0aGF0IHJlcHJlc2VudHMgdGhlIGNlbGwgc3RhdGUuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5zdGF0ZVZhbGlkYXRlZCA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXZhciBmZyA9ICh0aGlzLmdyYXBoLmdldE1vZGVsKCkuaXNFZGdlKHN0YXRlLmNlbGwpICYmIHRoaXMuZ3JhcGgua2VlcEVkZ2VzSW5Gb3JlZ3JvdW5kKSB8fAorCQkodGhpcy5ncmFwaC5nZXRNb2RlbCgpLmlzVmVydGV4KHN0YXRlLmNlbGwpICYmIHRoaXMuZ3JhcGgua2VlcEVkZ2VzSW5CYWNrZ3JvdW5kKTsKKwl2YXIgaHRtbE5vZGUgPSAoZmcpID8gdGhpcy5sYXN0Rm9yZWdyb3VuZEh0bWxOb2RlIHx8IHRoaXMubGFzdEh0bWxOb2RlIDogdGhpcy5sYXN0SHRtbE5vZGU7CisJdmFyIG5vZGUgPSAoZmcpID8gdGhpcy5sYXN0Rm9yZWdyb3VuZE5vZGUgfHwgdGhpcy5sYXN0Tm9kZSA6IHRoaXMubGFzdE5vZGU7CisJdmFyIHJlc3VsdCA9IHRoaXMuZ3JhcGguY2VsbFJlbmRlcmVyLmluc2VydFN0YXRlQWZ0ZXIoc3RhdGUsIG5vZGUsIGh0bWxOb2RlKTsKKworCWlmIChmZykKKwl7CisJCXRoaXMubGFzdEZvcmVncm91bmRIdG1sTm9kZSA9IHJlc3VsdFsxXTsKKwkJdGhpcy5sYXN0Rm9yZWdyb3VuZE5vZGUgPSByZXN1bHRbMF07CisJfQorCWVsc2UKKwl7CisJCXRoaXMubGFzdEh0bWxOb2RlID0gcmVzdWx0WzFdOworCQl0aGlzLmxhc3ROb2RlID0gcmVzdWx0WzBdOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZUZpeGVkVGVybWluYWxQb2ludHMKKyAqCisgKiBTZXRzIHRoZSBpbml0aWFsIGFic29sdXRlIHRlcm1pbmFsIHBvaW50cyBpbiB0aGUgZ2l2ZW4gc3RhdGUgYmVmb3JlIHRoZSBlZGdlCisgKiBzdHlsZSBpcyBjb21wdXRlZC4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogZWRnZSAtIDxteENlbGxTdGF0ZT4gd2hvc2UgaW5pdGlhbCB0ZXJtaW5hbCBwb2ludHMgc2hvdWxkIGJlIHVwZGF0ZWQuCisgKiBzb3VyY2UgLSA8bXhDZWxsU3RhdGU+IHdoaWNoIHJlcHJlc2VudHMgdGhlIHNvdXJjZSB0ZXJtaW5hbC4KKyAqIHRhcmdldCAtIDxteENlbGxTdGF0ZT4gd2hpY2ggcmVwcmVzZW50cyB0aGUgdGFyZ2V0IHRlcm1pbmFsLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUudXBkYXRlRml4ZWRUZXJtaW5hbFBvaW50cyA9IGZ1bmN0aW9uKGVkZ2UsIHNvdXJjZSwgdGFyZ2V0KQoreworCXRoaXMudXBkYXRlRml4ZWRUZXJtaW5hbFBvaW50KGVkZ2UsIHNvdXJjZSwgdHJ1ZSwKKwkJdGhpcy5ncmFwaC5nZXRDb25uZWN0aW9uQ29uc3RyYWludChlZGdlLCBzb3VyY2UsIHRydWUpKTsKKwl0aGlzLnVwZGF0ZUZpeGVkVGVybWluYWxQb2ludChlZGdlLCB0YXJnZXQsIGZhbHNlLAorCQl0aGlzLmdyYXBoLmdldENvbm5lY3Rpb25Db25zdHJhaW50KGVkZ2UsIHRhcmdldCwgZmFsc2UpKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZUZpeGVkVGVybWluYWxQb2ludAorICoKKyAqIFNldHMgdGhlIGZpeGVkIHNvdXJjZSBvciB0YXJnZXQgdGVybWluYWwgcG9pbnQgb24gdGhlIGdpdmVuIGVkZ2UuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGVkZ2UgLSA8bXhDZWxsU3RhdGU+IHdob3NlIHRlcm1pbmFsIHBvaW50IHNob3VsZCBiZSB1cGRhdGVkLgorICogdGVybWluYWwgLSA8bXhDZWxsU3RhdGU+IHdoaWNoIHJlcHJlc2VudHMgdGhlIGFjdHVhbCB0ZXJtaW5hbC4KKyAqIHNvdXJjZSAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIHRlcm1pbmFsIGlzIHRoZSBzb3VyY2UuCisgKiBjb25zdHJhaW50IC0gPG14Q29ubmVjdGlvbkNvbnN0cmFpbnQ+IHRoYXQgc3BlY2lmaWVzIHRoZSBjb25uZWN0aW9uLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUudXBkYXRlRml4ZWRUZXJtaW5hbFBvaW50ID0gZnVuY3Rpb24oZWRnZSwgdGVybWluYWwsIHNvdXJjZSwgY29uc3RyYWludCkKK3sKKwllZGdlLnNldEFic29sdXRlVGVybWluYWxQb2ludCh0aGlzLmdldEZpeGVkVGVybWluYWxQb2ludChlZGdlLCB0ZXJtaW5hbCwgc291cmNlLCBjb25zdHJhaW50KSwgc291cmNlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEZpeGVkVGVybWluYWxQb2ludAorICoKKyAqIFJldHVybnMgdGhlIGZpeGVkIHNvdXJjZSBvciB0YXJnZXQgdGVybWluYWwgcG9pbnQgZm9yIHRoZSBnaXZlbiBlZGdlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbFN0YXRlPiB3aG9zZSB0ZXJtaW5hbCBwb2ludCBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiB0ZXJtaW5hbCAtIDxteENlbGxTdGF0ZT4gd2hpY2ggcmVwcmVzZW50cyB0aGUgYWN0dWFsIHRlcm1pbmFsLgorICogc291cmNlIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgdGVybWluYWwgaXMgdGhlIHNvdXJjZS4KKyAqIGNvbnN0cmFpbnQgLSA8bXhDb25uZWN0aW9uQ29uc3RyYWludD4gdGhhdCBzcGVjaWZpZXMgdGhlIGNvbm5lY3Rpb24uCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5nZXRGaXhlZFRlcm1pbmFsUG9pbnQgPSBmdW5jdGlvbihlZGdlLCB0ZXJtaW5hbCwgc291cmNlLCBjb25zdHJhaW50KQoreworCXZhciBwdCA9IG51bGw7CisJCisJaWYgKGNvbnN0cmFpbnQgIT0gbnVsbCkKKwl7CisJCXB0ID0gdGhpcy5ncmFwaC5nZXRDb25uZWN0aW9uUG9pbnQodGVybWluYWwsIGNvbnN0cmFpbnQpOworCX0KKwkKKwlpZiAocHQgPT0gbnVsbCAmJiB0ZXJtaW5hbCA9PSBudWxsKQorCXsKKwkJdmFyIHMgPSB0aGlzLnNjYWxlOworCQl2YXIgdHIgPSB0aGlzLnRyYW5zbGF0ZTsKKwkJdmFyIG9yaWcgPSBlZGdlLm9yaWdpbjsKKwkJdmFyIGdlbyA9IHRoaXMuZ3JhcGguZ2V0Q2VsbEdlb21ldHJ5KGVkZ2UuY2VsbCk7CisJCXB0ID0gZ2VvLmdldFRlcm1pbmFsUG9pbnQoc291cmNlKTsKKwkJCisJCWlmIChwdCAhPSBudWxsKQorCQl7CisJCQlwdCA9IG5ldyBteFBvaW50KHMgKiAodHIueCArIHB0LnggKyBvcmlnLngpLAorCQkJCQkJCSBzICogKHRyLnkgKyBwdC55ICsgb3JpZy55KSk7CisJCX0KKwl9CisJCisJcmV0dXJuIHB0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlQm91bmRzRnJvbVN0ZW5jaWwKKyAqIAorICogVXBkYXRlcyB0aGUgYm91bmRzIG9mIHRoZSBnaXZlbiBjZWxsIHN0YXRlIHRvIHJlZmxlY3QgdGhlIGJvdW5kcyBvZiB0aGUgc3RlbmNpbAorICogaWYgaXQgaGFzIGEgZml4ZWQgYXNwZWN0IGFuZCByZXR1cm5zIHRoZSBwcmV2aW91cyBib3VuZHMgYXMgYW4gPG14UmVjdGFuZ2xlPiBpZgorICogdGhlIGJvdW5kcyBoYXZlIGJlZW4gbW9kaWZpZWQgb3IgbnVsbCBvdGhlcndpc2UuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGVkZ2UgLSA8bXhDZWxsU3RhdGU+IHdob3NlIGJvdW5kcyBzaG91bGQgYmUgdXBkYXRlZC4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLnVwZGF0ZUJvdW5kc0Zyb21TdGVuY2lsID0gZnVuY3Rpb24oc3RhdGUpCit7CisJdmFyIHByZXZpb3VzID0gbnVsbDsKKwkKKwlpZiAoc3RhdGUgIT0gbnVsbCAmJiBzdGF0ZS5zaGFwZSAhPSBudWxsICYmIHN0YXRlLnNoYXBlLnN0ZW5jaWwgIT0gbnVsbCAmJiBzdGF0ZS5zaGFwZS5zdGVuY2lsLmFzcGVjdCA9PSAnZml4ZWQnKQorCXsKKwkJcHJldmlvdXMgPSBteFJlY3RhbmdsZS5mcm9tUmVjdGFuZ2xlKHN0YXRlKTsKKwkJdmFyIGFzcCA9IHN0YXRlLnNoYXBlLnN0ZW5jaWwuY29tcHV0ZUFzcGVjdChzdGF0ZS5zdHlsZSwgc3RhdGUueCwgc3RhdGUueSwgc3RhdGUud2lkdGgsIHN0YXRlLmhlaWdodCk7CisJCXN0YXRlLnNldFJlY3QoYXNwLngsIGFzcC55LCBzdGF0ZS5zaGFwZS5zdGVuY2lsLncwICogYXNwLndpZHRoLCBzdGF0ZS5zaGFwZS5zdGVuY2lsLmgwICogYXNwLmhlaWdodCk7CisJfQorCQorCXJldHVybiBwcmV2aW91czsKK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZVBvaW50cworICoKKyAqIFVwZGF0ZXMgdGhlIGFic29sdXRlIHBvaW50cyBpbiB0aGUgZ2l2ZW4gc3RhdGUgdXNpbmcgdGhlIHNwZWNpZmllZCBhcnJheQorICogb2YgPG14UG9pbnRzPiBhcyB0aGUgcmVsYXRpdmUgcG9pbnRzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbFN0YXRlPiB3aG9zZSBhYnNvbHV0ZSBwb2ludHMgc2hvdWxkIGJlIHVwZGF0ZWQuCisgKiBwb2ludHMgLSBBcnJheSBvZiA8bXhQb2ludHM+IHRoYXQgY29uc3RpdHV0ZSB0aGUgcmVsYXRpdmUgcG9pbnRzLgorICogc291cmNlIC0gPG14Q2VsbFN0YXRlPiB0aGF0IHJlcHJlc2VudHMgdGhlIHNvdXJjZSB0ZXJtaW5hbC4KKyAqIHRhcmdldCAtIDxteENlbGxTdGF0ZT4gdGhhdCByZXByZXNlbnRzIHRoZSB0YXJnZXQgdGVybWluYWwuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS51cGRhdGVQb2ludHMgPSBmdW5jdGlvbihlZGdlLCBwb2ludHMsIHNvdXJjZSwgdGFyZ2V0KQoreworCWlmIChlZGdlICE9IG51bGwpCisJeworCQl2YXIgcHRzID0gW107CisJCXB0cy5wdXNoKGVkZ2UuYWJzb2x1dGVQb2ludHNbMF0pOworCQl2YXIgZWRnZVN0eWxlID0gdGhpcy5nZXRFZGdlU3R5bGUoZWRnZSwgcG9pbnRzLCBzb3VyY2UsIHRhcmdldCk7CisJCQorCQlpZiAoZWRnZVN0eWxlICE9IG51bGwpCisJCXsKKwkJCXZhciBzcmMgPSB0aGlzLmdldFRlcm1pbmFsUG9ydChlZGdlLCBzb3VyY2UsIHRydWUpOworCQkJdmFyIHRyZyA9IHRoaXMuZ2V0VGVybWluYWxQb3J0KGVkZ2UsIHRhcmdldCwgZmFsc2UpOworCQkJCisJCQkvLyBVc2VzIHRoZSBzdGVuY2lsIGJvdW5kcyBmb3Igcm91dGluZyBhbmQgcmVzdG9yZXMgYWZ0ZXIgcm91dGluZworCQkJdmFyIHNyY0JvdW5kcyA9IHRoaXMudXBkYXRlQm91bmRzRnJvbVN0ZW5jaWwoc3JjKTsKKwkJCXZhciB0cmdCb3VuZHMgPSB0aGlzLnVwZGF0ZUJvdW5kc0Zyb21TdGVuY2lsKHRyZyk7CisKKwkJCWVkZ2VTdHlsZShlZGdlLCBzcmMsIHRyZywgcG9pbnRzLCBwdHMpOworCQkJCisJCQkvLyBSZXN0b3JlcyBwcmV2aW91cyBib3VuZHMKKwkJCWlmIChzcmNCb3VuZHMgIT0gbnVsbCkKKwkJCXsKKwkJCQlzcmMuc2V0UmVjdChzcmNCb3VuZHMueCwgc3JjQm91bmRzLnksIHNyY0JvdW5kcy53aWR0aCwgc3JjQm91bmRzLmhlaWdodCk7CisJCQl9CisJCQkKKwkJCWlmICh0cmdCb3VuZHMgIT0gbnVsbCkKKwkJCXsKKwkJCQl0cmcuc2V0UmVjdCh0cmdCb3VuZHMueCwgdHJnQm91bmRzLnksIHRyZ0JvdW5kcy53aWR0aCwgdHJnQm91bmRzLmhlaWdodCk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAocG9pbnRzICE9IG51bGwpCisJCXsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCWlmIChwb2ludHNbaV0gIT0gbnVsbCkKKwkJCQl7CisJCQkJCXZhciBwdCA9IG14VXRpbHMuY2xvbmUocG9pbnRzW2ldKTsKKwkJCQkJcHRzLnB1c2godGhpcy50cmFuc2Zvcm1Db250cm9sUG9pbnQoZWRnZSwgcHQpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCXZhciB0bXAgPSBlZGdlLmFic29sdXRlUG9pbnRzOworCQlwdHMucHVzaCh0bXBbdG1wLmxlbmd0aC0xXSk7CisKKwkJZWRnZS5hYnNvbHV0ZVBvaW50cyA9IHB0czsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB0cmFuc2Zvcm1Db250cm9sUG9pbnQKKyAqCisgKiBUcmFuc2Zvcm1zIHRoZSBnaXZlbiBjb250cm9sIHBvaW50IHRvIGFuIGFic29sdXRlIHBvaW50LgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUudHJhbnNmb3JtQ29udHJvbFBvaW50ID0gZnVuY3Rpb24oc3RhdGUsIHB0KQoreworCWlmIChzdGF0ZSAhPSBudWxsICYmIHB0ICE9IG51bGwpCisJeworCQl2YXIgb3JpZyA9IHN0YXRlLm9yaWdpbjsKKwkJCisJICAgIHJldHVybiBuZXcgbXhQb2ludCh0aGlzLnNjYWxlICogKHB0LnggKyB0aGlzLnRyYW5zbGF0ZS54ICsgb3JpZy54KSwKKwkgICAgCXRoaXMuc2NhbGUgKiAocHQueSArIHRoaXMudHJhbnNsYXRlLnkgKyBvcmlnLnkpKTsKKwl9CisJCisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0xvb3BTdHlsZUVuYWJsZWQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBlZGdlIHNob3VsZCBiZSByb3V0ZWQgd2l0aCA8bXhHcmFwaC5kZWZhdWx0TG9vcFN0eWxlPgorICogb3IgdGhlIDxteENvbnN0YW50cy5TVFlMRV9MT09QPiBkZWZpbmVkIGZvciB0aGUgZ2l2ZW4gZWRnZS4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICogcmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBlZGdlIGlzIGEgbG9vcCBhbmQgZG9lcyBub3QgCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5pc0xvb3BTdHlsZUVuYWJsZWQgPSBmdW5jdGlvbihlZGdlLCBwb2ludHMsIHNvdXJjZSwgdGFyZ2V0KQoreworCXZhciBzYyA9IHRoaXMuZ3JhcGguZ2V0Q29ubmVjdGlvbkNvbnN0cmFpbnQoZWRnZSwgc291cmNlLCB0cnVlKTsKKwl2YXIgdGMgPSB0aGlzLmdyYXBoLmdldENvbm5lY3Rpb25Db25zdHJhaW50KGVkZ2UsIHRhcmdldCwgZmFsc2UpOworCQorCWlmICghbXhVdGlscy5nZXRWYWx1ZShlZGdlLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9PUlRIT0dPTkFMX0xPT1AsIGZhbHNlKSB8fAorCQkoKHNjID09IG51bGwgfHwgc2MucG9pbnQgPT0gbnVsbCkgJiYgKHRjID09IG51bGwgfHwgdGMucG9pbnQgPT0gbnVsbCkpKQorCXsKKwkJcmV0dXJuIHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZSA9PSB0YXJnZXQ7CisJfQorCQorCXJldHVybiBmYWxzZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEVkZ2VTdHlsZQorICogCisgKiBSZXR1cm5zIHRoZSBlZGdlIHN0eWxlIGZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSBnaXZlbiBlZGdlIHN0YXRlLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuZ2V0RWRnZVN0eWxlID0gZnVuY3Rpb24oZWRnZSwgcG9pbnRzLCBzb3VyY2UsIHRhcmdldCkKK3sKKwl2YXIgZWRnZVN0eWxlID0gdGhpcy5pc0xvb3BTdHlsZUVuYWJsZWQoZWRnZSwgcG9pbnRzLCBzb3VyY2UsIHRhcmdldCkgPworCQlteFV0aWxzLmdldFZhbHVlKGVkZ2Uuc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0xPT1AsIHRoaXMuZ3JhcGguZGVmYXVsdExvb3BTdHlsZSkgOgorCQkoIW14VXRpbHMuZ2V0VmFsdWUoZWRnZS5zdHlsZSwgbXhDb25zdGFudHMuU1RZTEVfTk9FREdFU1RZTEUsIGZhbHNlKSA/CisJCWVkZ2Uuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfRURHRV0gOiBudWxsKTsKKworCS8vIENvbnZlcnRzIHN0cmluZyB2YWx1ZXMgdG8gb2JqZWN0cworCWlmICh0eXBlb2YoZWRnZVN0eWxlKSA9PSAic3RyaW5nIikKKwl7CisJCXZhciB0bXAgPSBteFN0eWxlUmVnaXN0cnkuZ2V0VmFsdWUoZWRnZVN0eWxlKTsKKwkJCisJCWlmICh0bXAgPT0gbnVsbCAmJiB0aGlzLmlzQWxsb3dFdmFsKCkpCisJCXsKKyAJCQl0bXAgPSBteFV0aWxzLmV2YWwoZWRnZVN0eWxlKTsKKwkJfQorCQkKKwkJZWRnZVN0eWxlID0gdG1wOworCX0KKwkKKwlpZiAodHlwZW9mKGVkZ2VTdHlsZSkgPT0gImZ1bmN0aW9uIikKKwl7CisJCXJldHVybiBlZGdlU3R5bGU7CisJfQorCQorCXJldHVybiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogdXBkYXRlRmxvYXRpbmdUZXJtaW5hbFBvaW50cworICoKKyAqIFVwZGF0ZXMgdGhlIHRlcm1pbmFsIHBvaW50cyBpbiB0aGUgZ2l2ZW4gc3RhdGUgYWZ0ZXIgdGhlIGVkZ2Ugc3R5bGUgd2FzCisgKiBjb21wdXRlZCBmb3IgdGhlIGVkZ2UuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB3aG9zZSB0ZXJtaW5hbCBwb2ludHMgc2hvdWxkIGJlIHVwZGF0ZWQuCisgKiBzb3VyY2UgLSA8bXhDZWxsU3RhdGU+IHRoYXQgcmVwcmVzZW50cyB0aGUgc291cmNlIHRlcm1pbmFsLgorICogdGFyZ2V0IC0gPG14Q2VsbFN0YXRlPiB0aGF0IHJlcHJlc2VudHMgdGhlIHRhcmdldCB0ZXJtaW5hbC4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLnVwZGF0ZUZsb2F0aW5nVGVybWluYWxQb2ludHMgPSBmdW5jdGlvbihzdGF0ZSwgc291cmNlLCB0YXJnZXQpCit7CisJdmFyIHB0cyA9IHN0YXRlLmFic29sdXRlUG9pbnRzOworCXZhciBwMCA9IHB0c1swXTsKKwl2YXIgcGUgPSBwdHNbcHRzLmxlbmd0aCAtIDFdOworCisJaWYgKHBlID09IG51bGwgJiYgdGFyZ2V0ICE9IG51bGwpCisJeworCQl0aGlzLnVwZGF0ZUZsb2F0aW5nVGVybWluYWxQb2ludChzdGF0ZSwgdGFyZ2V0LCBzb3VyY2UsIGZhbHNlKTsKKwl9CisJCisJaWYgKHAwID09IG51bGwgJiYgc291cmNlICE9IG51bGwpCisJeworCQl0aGlzLnVwZGF0ZUZsb2F0aW5nVGVybWluYWxQb2ludChzdGF0ZSwgc291cmNlLCB0YXJnZXQsIHRydWUpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZUZsb2F0aW5nVGVybWluYWxQb2ludAorICoKKyAqIFVwZGF0ZXMgdGhlIGFic29sdXRlIHRlcm1pbmFsIHBvaW50IGluIHRoZSBnaXZlbiBzdGF0ZSBmb3IgdGhlIGdpdmVuCisgKiBzdGFydCBhbmQgZW5kIHN0YXRlLCB3aGVyZSBzdGFydCBpcyB0aGUgc291cmNlIGlmIHNvdXJjZSBpcyB0cnVlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbFN0YXRlPiB3aG9zZSB0ZXJtaW5hbCBwb2ludCBzaG91bGQgYmUgdXBkYXRlZC4KKyAqIHN0YXJ0IC0gPG14Q2VsbFN0YXRlPiBmb3IgdGhlIHRlcm1pbmFsIG9uICJ0aGlzIiBzaWRlIG9mIHRoZSBlZGdlLgorICogZW5kIC0gPG14Q2VsbFN0YXRlPiBmb3IgdGhlIHRlcm1pbmFsIG9uIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBlZGdlLgorICogc291cmNlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHN0YXJ0IGlzIHRoZSBzb3VyY2UgdGVybWluYWwgc3RhdGUuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS51cGRhdGVGbG9hdGluZ1Rlcm1pbmFsUG9pbnQgPSBmdW5jdGlvbihlZGdlLCBzdGFydCwgZW5kLCBzb3VyY2UpCit7CisJZWRnZS5zZXRBYnNvbHV0ZVRlcm1pbmFsUG9pbnQodGhpcy5nZXRGbG9hdGluZ1Rlcm1pbmFsUG9pbnQoZWRnZSwgc3RhcnQsIGVuZCwgc291cmNlKSwgc291cmNlKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEZsb2F0aW5nVGVybWluYWxQb2ludAorICogCisgKiBSZXR1cm5zIHRoZSBmbG9hdGluZyB0ZXJtaW5hbCBwb2ludCBmb3IgdGhlIGdpdmVuIGVkZ2UsIHN0YXJ0IGFuZCBlbmQKKyAqIHN0YXRlLCB3aGVyZSBzdGFydCBpcyB0aGUgc291cmNlIGlmIHNvdXJjZSBpcyB0cnVlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbFN0YXRlPiB3aG9zZSB0ZXJtaW5hbCBwb2ludCBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiBzdGFydCAtIDxteENlbGxTdGF0ZT4gZm9yIHRoZSB0ZXJtaW5hbCBvbiAidGhpcyIgc2lkZSBvZiB0aGUgZWRnZS4KKyAqIGVuZCAtIDxteENlbGxTdGF0ZT4gZm9yIHRoZSB0ZXJtaW5hbCBvbiB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgZWRnZS4KKyAqIHNvdXJjZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiBzdGFydCBpcyB0aGUgc291cmNlIHRlcm1pbmFsIHN0YXRlLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuZ2V0RmxvYXRpbmdUZXJtaW5hbFBvaW50ID0gZnVuY3Rpb24oZWRnZSwgc3RhcnQsIGVuZCwgc291cmNlKQoreworCXN0YXJ0ID0gdGhpcy5nZXRUZXJtaW5hbFBvcnQoZWRnZSwgc3RhcnQsIHNvdXJjZSk7CisJdmFyIG5leHQgPSB0aGlzLmdldE5leHRQb2ludChlZGdlLCBlbmQsIHNvdXJjZSk7CisJCisJdmFyIG9ydGggPSB0aGlzLmdyYXBoLmlzT3J0aG9nb25hbChlZGdlKTsKKwl2YXIgYWxwaGEgPSBteFV0aWxzLnRvUmFkaWFucyhOdW1iZXIoc3RhcnQuc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfUk9UQVRJT05dIHx8ICcwJykpOworCXZhciBjZW50ZXIgPSBuZXcgbXhQb2ludChzdGFydC5nZXRDZW50ZXJYKCksIHN0YXJ0LmdldENlbnRlclkoKSk7CisJCisJaWYgKGFscGhhICE9IDApCisJeworCQl2YXIgY29zID0gTWF0aC5jb3MoLWFscGhhKTsKKwkJdmFyIHNpbiA9IE1hdGguc2luKC1hbHBoYSk7CisJCW5leHQgPSBteFV0aWxzLmdldFJvdGF0ZWRQb2ludChuZXh0LCBjb3MsIHNpbiwgY2VudGVyKTsKKwl9CisJCisJdmFyIGJvcmRlciA9IHBhcnNlRmxvYXQoZWRnZS5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9QRVJJTUVURVJfU1BBQ0lOR10gfHwgMCk7CisJYm9yZGVyICs9IHBhcnNlRmxvYXQoZWRnZS5zdHlsZVsoc291cmNlKSA/CisJCW14Q29uc3RhbnRzLlNUWUxFX1NPVVJDRV9QRVJJTUVURVJfU1BBQ0lORyA6CisJCW14Q29uc3RhbnRzLlNUWUxFX1RBUkdFVF9QRVJJTUVURVJfU1BBQ0lOR10gfHwgMCk7CisJdmFyIHB0ID0gdGhpcy5nZXRQZXJpbWV0ZXJQb2ludChzdGFydCwgbmV4dCwgYWxwaGEgPT0gMCAmJiBvcnRoLCBib3JkZXIpOworCisJaWYgKGFscGhhICE9IDApCisJeworCQl2YXIgY29zID0gTWF0aC5jb3MoYWxwaGEpOworCQl2YXIgc2luID0gTWF0aC5zaW4oYWxwaGEpOworCQlwdCA9IG14VXRpbHMuZ2V0Um90YXRlZFBvaW50KHB0LCBjb3MsIHNpbiwgY2VudGVyKTsKKwl9CisJCisJcmV0dXJuIHB0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0VGVybWluYWxQb3J0CisgKiAKKyAqIFJldHVybnMgYW4gPG14Q2VsbFN0YXRlPiB0aGF0IHJlcHJlc2VudHMgdGhlIHNvdXJjZSBvciB0YXJnZXQgdGVybWluYWwgb3IKKyAqIHBvcnQgZm9yIHRoZSBnaXZlbiBlZGdlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBzdGF0ZSAtIDxteENlbGxTdGF0ZT4gdGhhdCByZXByZXNlbnRzIHRoZSBzdGF0ZSBvZiB0aGUgZWRnZS4KKyAqIHRlcm1pbmFsIC0gPG14Q2VsbFN0YXRlPiB0aGF0IHJlcHJlc2VudHMgdGhlIHRlcm1pbmFsLgorICogc291cmNlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBnaXZlbiB0ZXJtaW5hbCBpcyB0aGUgc291cmNlIHRlcm1pbmFsLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuZ2V0VGVybWluYWxQb3J0ID0gZnVuY3Rpb24oc3RhdGUsIHRlcm1pbmFsLCBzb3VyY2UpCit7CisJdmFyIGtleSA9IChzb3VyY2UpID8gbXhDb25zdGFudHMuU1RZTEVfU09VUkNFX1BPUlQgOgorCQlteENvbnN0YW50cy5TVFlMRV9UQVJHRVRfUE9SVDsKKwl2YXIgaWQgPSBteFV0aWxzLmdldFZhbHVlKHN0YXRlLnN0eWxlLCBrZXkpOworCQorCWlmIChpZCAhPSBudWxsKQorCXsKKwkJdmFyIHRtcCA9IHRoaXMuZ2V0U3RhdGUodGhpcy5ncmFwaC5nZXRNb2RlbCgpLmdldENlbGwoaWQpKTsKKwkJCisJCS8vIE9ubHkgdXNlcyBwb3J0cyB3aGVyZSBhIGNlbGwgc3RhdGUgZXhpc3RzCisJCWlmICh0bXAgIT0gbnVsbCkKKwkJeworCQkJdGVybWluYWwgPSB0bXA7CisJCX0KKwl9CisJCisJcmV0dXJuIHRlcm1pbmFsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0UGVyaW1ldGVyUG9pbnQKKyAqCisgKiBSZXR1cm5zIGFuIDxteFBvaW50PiB0aGF0IGRlZmluZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnQgYmV0d2VlbgorICogdGhlIHBlcmltZXRlciBhbmQgdGhlIGxpbmUgYmV0d2VlbiB0aGUgY2VudGVyIG9mIHRoZSBzaGFwZSBhbmQgdGhlIGdpdmVuIHBvaW50LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB0ZXJtaW5hbCAtIDxteENlbGxTdGF0ZT4gZm9yIHRoZSBzb3VyY2Ugb3IgdGFyZ2V0IHRlcm1pbmFsLgorICogbmV4dCAtIDxteFBvaW50PiB0aGF0IGxpZXMgb3V0c2lkZSBvZiB0aGUgZ2l2ZW4gdGVybWluYWwuCisgKiBvcnRob2dvbmFsIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgb3J0aG9nb25hbCBwcm9qZWN0aW9uIG9udG8KKyAqIHRoZSBwZXJpbWV0ZXIgc2hvdWxkIGJlIHJldHVybmVkLiBJZiB0aGlzIGlzIGZhbHNlIHRoZW4gdGhlIGludGVyc2VjdGlvbgorICogb2YgdGhlIHBlcmltZXRlciBhbmQgdGhlIGxpbmUgYmV0d2VlbiB0aGUgbmV4dCBhbmQgdGhlIGNlbnRlciBwb2ludCBpcworICogcmV0dXJuZWQuCisgKiBib3JkZXIgLSBPcHRpb25hbCBib3JkZXIgYmV0d2VlbiB0aGUgcGVyaW1ldGVyIGFuZCB0aGUgc2hhcGUuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5nZXRQZXJpbWV0ZXJQb2ludCA9IGZ1bmN0aW9uKHRlcm1pbmFsLCBuZXh0LCBvcnRob2dvbmFsLCBib3JkZXIpCit7CisJdmFyIHBvaW50ID0gbnVsbDsKKwkKKwlpZiAodGVybWluYWwgIT0gbnVsbCkKKwl7CisJCXZhciBwZXJpbWV0ZXIgPSB0aGlzLmdldFBlcmltZXRlckZ1bmN0aW9uKHRlcm1pbmFsKTsKKwkJCisJCWlmIChwZXJpbWV0ZXIgIT0gbnVsbCAmJiBuZXh0ICE9IG51bGwpCisJCXsKKwkJCXZhciBib3VuZHMgPSB0aGlzLmdldFBlcmltZXRlckJvdW5kcyh0ZXJtaW5hbCwgYm9yZGVyKTsKKworCQkJaWYgKGJvdW5kcy53aWR0aCA+IDAgfHwgYm91bmRzLmhlaWdodCA+IDApCisJCQl7CisJCQkJcG9pbnQgPSBuZXcgbXhQb2ludChuZXh0LngsIG5leHQueSk7CisJCQkJdmFyIGZsaXBIID0gZmFsc2U7CisJCQkJdmFyIGZsaXBWID0gZmFsc2U7CQorCQkJCQorCQkJCWlmICh0aGlzLmdyYXBoLm1vZGVsLmlzVmVydGV4KHRlcm1pbmFsLmNlbGwpKQorCQkJCXsKKwkJCQkJZmxpcEggPSBteFV0aWxzLmdldFZhbHVlKHRlcm1pbmFsLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9GTElQSCwgMCkgPT0gMTsKKwkJCQkJZmxpcFYgPSBteFV0aWxzLmdldFZhbHVlKHRlcm1pbmFsLnN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9GTElQViwgMCkgPT0gMTsJCisJCisJCQkJCS8vIExlZ2FjeSBzdXBwb3J0IGZvciBzdGVuY2lsRmxpcEgvVgorCQkJCQlpZiAodGVybWluYWwuc2hhcGUgIT0gbnVsbCAmJiB0ZXJtaW5hbC5zaGFwZS5zdGVuY2lsICE9IG51bGwpCisJCQkJCXsKKwkJCQkJCWZsaXBIID0gKG14VXRpbHMuZ2V0VmFsdWUodGVybWluYWwuc3R5bGUsICdzdGVuY2lsRmxpcEgnLCAwKSA9PSAxKSB8fCBmbGlwSDsKKwkJCQkJCWZsaXBWID0gKG14VXRpbHMuZ2V0VmFsdWUodGVybWluYWwuc3R5bGUsICdzdGVuY2lsRmxpcFYnLCAwKSA9PSAxKSB8fCBmbGlwVjsKKwkJCQkJfQorCQorCQkJCQlpZiAoZmxpcEgpCisJCQkJCXsKKwkJCQkJCXBvaW50LnggPSAyICogYm91bmRzLmdldENlbnRlclgoKSAtIHBvaW50Lng7CisJCQkJCX0KKwkJCQkJCisJCQkJCWlmIChmbGlwVikKKwkJCQkJeworCQkJCQkJcG9pbnQueSA9IDIgKiBib3VuZHMuZ2V0Q2VudGVyWSgpIC0gcG9pbnQueTsKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCQlwb2ludCA9IHBlcmltZXRlcihib3VuZHMsIHRlcm1pbmFsLCBwb2ludCwgb3J0aG9nb25hbCk7CisKKwkJCQlpZiAocG9pbnQgIT0gbnVsbCkKKwkJCQl7CisJCQkJCWlmIChmbGlwSCkKKwkJCQkJeworCQkJCQkJcG9pbnQueCA9IDIgKiBib3VuZHMuZ2V0Q2VudGVyWCgpIC0gcG9pbnQueDsKKwkJCQkJfQorCQkJCQkKKwkJCQkJaWYgKGZsaXBWKQorCQkJCQl7CisJCQkJCQlwb2ludC55ID0gMiAqIGJvdW5kcy5nZXRDZW50ZXJZKCkgLSBwb2ludC55OworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlpZiAocG9pbnQgPT0gbnVsbCkKKwkJeworCQkJcG9pbnQgPSB0aGlzLmdldFBvaW50KHRlcm1pbmFsKTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gcG9pbnQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRSb3V0aW5nQ2VudGVyWAorICogCisgKiBSZXR1cm5zIHRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBwb2ludCBmb3IgYXV0b21hdGljIHJvdXRpbmcuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5nZXRSb3V0aW5nQ2VudGVyWCA9IGZ1bmN0aW9uIChzdGF0ZSkKK3sKKwl2YXIgZiA9IChzdGF0ZS5zdHlsZSAhPSBudWxsKSA/IHBhcnNlRmxvYXQoc3RhdGUuc3R5bGUKKwkJW214Q29uc3RhbnRzLlNUWUxFX1JPVVRJTkdfQ0VOVEVSX1hdKSB8fCAwIDogMDsKKworCXJldHVybiBzdGF0ZS5nZXRDZW50ZXJYKCkgKyBmICogc3RhdGUud2lkdGg7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRSb3V0aW5nQ2VudGVyWQorICogCisgKiBSZXR1cm5zIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGNlbnRlciBwb2ludCBmb3IgYXV0b21hdGljIHJvdXRpbmcuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5nZXRSb3V0aW5nQ2VudGVyWSA9IGZ1bmN0aW9uIChzdGF0ZSkKK3sKKwl2YXIgZiA9IChzdGF0ZS5zdHlsZSAhPSBudWxsKSA/IHBhcnNlRmxvYXQoc3RhdGUuc3R5bGUKKwkJW214Q29uc3RhbnRzLlNUWUxFX1JPVVRJTkdfQ0VOVEVSX1ldKSB8fCAwIDogMDsKKworCXJldHVybiBzdGF0ZS5nZXRDZW50ZXJZKCkgKyBmICogc3RhdGUuaGVpZ2h0OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0UGVyaW1ldGVyQm91bmRzCisgKgorICogUmV0dXJucyB0aGUgcGVyaW1ldGVyIGJvdW5kcyBmb3IgdGhlIGdpdmVuIHRlcm1pbmFsLCBlZGdlIHBhaXIgYXMgYW4KKyAqIDxteFJlY3RhbmdsZT4uCisgKiAKKyAqIElmIHlvdSBoYXZlIGEgbW9kZWwgd2hlcmUgZWFjaCB0ZXJtaW5hbCBoYXMgYSByZWxhdGl2ZSBjaGlsZCB0aGF0IHNob3VsZAorICogYWN0IGFzIHRoZSBncmFwaGljYWwgZW5kcG9pbnQgZm9yIGEgY29ubmVjdGlvbiBmcm9tL3RvIHRoZSB0ZXJtaW5hbCwgdGhlbgorICogdGhpcyBtZXRob2QgY2FuIGJlIHJlcGxhY2VkIGFzIGZvbGxvd3M6CisgKiAKKyAqIChjb2RlKQorICogdmFyIG9sZEdldFBlcmltZXRlckJvdW5kcyA9IG14R3JhcGhWaWV3LnByb3RvdHlwZS5nZXRQZXJpbWV0ZXJCb3VuZHM7CisgKiBteEdyYXBoVmlldy5wcm90b3R5cGUuZ2V0UGVyaW1ldGVyQm91bmRzID0gZnVuY3Rpb24odGVybWluYWwsIGVkZ2UsIGlzU291cmNlKQorICogeworICogICB2YXIgbW9kZWwgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCk7CisgKiAgIHZhciBjaGlsZENvdW50ID0gbW9kZWwuZ2V0Q2hpbGRDb3VudCh0ZXJtaW5hbC5jZWxsKTsKKyAqIAorICogICBpZiAoY2hpbGRDb3VudCA+IDApCisgKiAgIHsKKyAqICAgICB2YXIgY2hpbGQgPSBtb2RlbC5nZXRDaGlsZEF0KHRlcm1pbmFsLmNlbGwsIDApOworICogICAgIHZhciBnZW8gPSBtb2RlbC5nZXRHZW9tZXRyeShjaGlsZCk7CisgKgorICogICAgIGlmIChnZW8gIT0gbnVsbCAmJgorICogICAgICAgICBnZW8ucmVsYXRpdmUpCisgKiAgICAgeworICogICAgICAgdmFyIHN0YXRlID0gdGhpcy5nZXRTdGF0ZShjaGlsZCk7CisgKiAgICAgICAKKyAqICAgICAgIGlmIChzdGF0ZSAhPSBudWxsKQorICogICAgICAgeworICogICAgICAgICB0ZXJtaW5hbCA9IHN0YXRlOworICogICAgICAgfQorICogICAgIH0KKyAqICAgfQorICogICAKKyAqICAgcmV0dXJuIG9sZEdldFBlcmltZXRlckJvdW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICogfTsKKyAqIChlbmQpCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHRlcm1pbmFsIC0gPG14Q2VsbFN0YXRlPiB0aGF0IHJlcHJlc2VudHMgdGhlIHRlcm1pbmFsLgorICogYm9yZGVyIC0gTnVtYmVyIHRoYXQgYWRkcyBhIGJvcmRlciBiZXR3ZWVuIHRoZSBzaGFwZSBhbmQgdGhlIHBlcmltZXRlci4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLmdldFBlcmltZXRlckJvdW5kcyA9IGZ1bmN0aW9uKHRlcm1pbmFsLCBib3JkZXIpCit7CisJYm9yZGVyID0gKGJvcmRlciAhPSBudWxsKSA/IGJvcmRlciA6IDA7CisKKwlpZiAodGVybWluYWwgIT0gbnVsbCkKKwl7CisJCWJvcmRlciArPSBwYXJzZUZsb2F0KHRlcm1pbmFsLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1BFUklNRVRFUl9TUEFDSU5HXSB8fCAwKTsKKwl9CisKKwlyZXR1cm4gdGVybWluYWwuZ2V0UGVyaW1ldGVyQm91bmRzKGJvcmRlciAqIHRoaXMuc2NhbGUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0UGVyaW1ldGVyRnVuY3Rpb24KKyAqCisgKiBSZXR1cm5zIHRoZSBwZXJpbWV0ZXIgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBzdGF0ZS4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLmdldFBlcmltZXRlckZ1bmN0aW9uID0gZnVuY3Rpb24oc3RhdGUpCit7CisJdmFyIHBlcmltZXRlciA9IHN0YXRlLnN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1BFUklNRVRFUl07CisKKwkvLyBDb252ZXJ0cyBzdHJpbmcgdmFsdWVzIHRvIG9iamVjdHMKKwlpZiAodHlwZW9mKHBlcmltZXRlcikgPT0gInN0cmluZyIpCisJeworCQl2YXIgdG1wID0gbXhTdHlsZVJlZ2lzdHJ5LmdldFZhbHVlKHBlcmltZXRlcik7CisJCQorCQlpZiAodG1wID09IG51bGwgJiYgdGhpcy5pc0FsbG93RXZhbCgpKQorCQl7CisgCQkJdG1wID0gbXhVdGlscy5ldmFsKHBlcmltZXRlcik7CisJCX0KKworCQlwZXJpbWV0ZXIgPSB0bXA7CisJfQorCQorCWlmICh0eXBlb2YocGVyaW1ldGVyKSA9PSAiZnVuY3Rpb24iKQorCXsKKwkJcmV0dXJuIHBlcmltZXRlcjsKKwl9CisJCisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXROZXh0UG9pbnQKKyAqCisgKiBSZXR1cm5zIHRoZSBuZWFyZXN0IHBvaW50IGluIHRoZSBsaXN0IG9mIGFic29sdXRlIHBvaW50cyBvciB0aGUgY2VudGVyCisgKiBvZiB0aGUgb3Bwb3NpdGUgdGVybWluYWwuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGVkZ2UgLSA8bXhDZWxsU3RhdGU+IHRoYXQgcmVwcmVzZW50cyB0aGUgZWRnZS4KKyAqIG9wcG9zaXRlIC0gPG14Q2VsbFN0YXRlPiB0aGF0IHJlcHJlc2VudHMgdGhlIG9wcG9zaXRlIHRlcm1pbmFsLgorICogc291cmNlIC0gQm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBuZXh0IHBvaW50IGZvciB0aGUgc291cmNlIG9yIHRhcmdldAorICogc2hvdWxkIGJlIHJldHVybmVkLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuZ2V0TmV4dFBvaW50ID0gZnVuY3Rpb24oZWRnZSwgb3Bwb3NpdGUsIHNvdXJjZSkKK3sKKwl2YXIgcHRzID0gZWRnZS5hYnNvbHV0ZVBvaW50czsKKwl2YXIgcG9pbnQgPSBudWxsOworCQorCWlmIChwdHMgIT0gbnVsbCAmJiBwdHMubGVuZ3RoID49IDIpCisJeworCQl2YXIgY291bnQgPSBwdHMubGVuZ3RoOworCQlwb2ludCA9IHB0c1soc291cmNlKSA/IE1hdGgubWluKDEsIGNvdW50IC0gMSkgOiBNYXRoLm1heCgwLCBjb3VudCAtIDIpXTsKKwl9CisJCisJaWYgKHBvaW50ID09IG51bGwgJiYgb3Bwb3NpdGUgIT0gbnVsbCkKKwl7CisJCXBvaW50ID0gbmV3IG14UG9pbnQob3Bwb3NpdGUuZ2V0Q2VudGVyWCgpLCBvcHBvc2l0ZS5nZXRDZW50ZXJZKCkpOworCX0KKwkKKwlyZXR1cm4gcG9pbnQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRWaXNpYmxlVGVybWluYWwKKyAqCisgKiBSZXR1cm5zIHRoZSBuZWFyZXN0IGFuY2VzdG9yIHRlcm1pbmFsIHRoYXQgaXMgdmlzaWJsZS4gVGhlIGVkZ2UgYXBwZWFycworICogdG8gYmUgY29ubmVjdGVkIHRvIHRoaXMgdGVybWluYWwgb24gdGhlIGRpc3BsYXkuIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QKKyAqIGlzIGNhY2hlZCBpbiA8bXhDZWxsU3RhdGUuZ2V0VmlzaWJsZVRlcm1pbmFsU3RhdGU+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlZGdlIC0gPG14Q2VsbD4gd2hvc2UgdmlzaWJsZSB0ZXJtaW5hbCBzaG91bGQgYmUgcmV0dXJuZWQuCisgKiBzb3VyY2UgLSBCb29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIHRoZSBzb3VyY2Ugb3IgdGFyZ2V0IHRlcm1pbmFsCisgKiBzaG91bGQgYmUgcmV0dXJuZWQuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5nZXRWaXNpYmxlVGVybWluYWwgPSBmdW5jdGlvbihlZGdlLCBzb3VyY2UpCit7CisJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpOworCXZhciByZXN1bHQgPSBtb2RlbC5nZXRUZXJtaW5hbChlZGdlLCBzb3VyY2UpOworCXZhciBiZXN0ID0gcmVzdWx0OworCQorCXdoaWxlIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQgIT0gdGhpcy5jdXJyZW50Um9vdCkKKwl7CisJCWlmICghdGhpcy5ncmFwaC5pc0NlbGxWaXNpYmxlKGJlc3QpIHx8IHRoaXMuaXNDZWxsQ29sbGFwc2VkKHJlc3VsdCkpCisJCXsKKwkJCWJlc3QgPSByZXN1bHQ7CisJCX0KKwkJCisJCXJlc3VsdCA9IG1vZGVsLmdldFBhcmVudChyZXN1bHQpOworCX0KKworCS8vIENoZWNrcyBpZiB0aGUgcmVzdWx0IGlzIG5vdCBhIGxheWVyCisJaWYgKG1vZGVsLmdldFBhcmVudChiZXN0KSA9PSBtb2RlbC5nZXRSb290KCkpCisJeworCQliZXN0ID0gbnVsbDsKKwl9CisJCisJcmV0dXJuIGJlc3Q7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1cGRhdGVFZGdlQm91bmRzCisgKgorICogVXBkYXRlcyB0aGUgZ2l2ZW4gc3RhdGUgdXNpbmcgdGhlIGJvdW5kaW5nIGJveCBvZiB0CisgKiBoZSBhYnNvbHV0ZSBwb2ludHMuCisgKiBBbHNvIHVwZGF0ZXMgPG14Q2VsbFN0YXRlLnRlcm1pbmFsRGlzdGFuY2U+LCA8bXhDZWxsU3RhdGUubGVuZ3RoPiBhbmQKKyAqIDxteENlbGxTdGF0ZS5zZWdtZW50cz4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB3aG9zZSBib3VuZHMgc2hvdWxkIGJlIHVwZGF0ZWQuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS51cGRhdGVFZGdlQm91bmRzID0gZnVuY3Rpb24oc3RhdGUpCit7CisJdmFyIHBvaW50cyA9IHN0YXRlLmFic29sdXRlUG9pbnRzOworCXZhciBwMCA9IHBvaW50c1swXTsKKwl2YXIgcGUgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdOworCQorCWlmIChwMC54ICE9IHBlLnggfHwgcDAueSAhPSBwZS55KQorCXsKKwkJdmFyIGR4ID0gcGUueCAtIHAwLng7CisJCXZhciBkeSA9IHBlLnkgLSBwMC55OworCQlzdGF0ZS50ZXJtaW5hbERpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTsKKwl9CisJZWxzZQorCXsKKwkJc3RhdGUudGVybWluYWxEaXN0YW5jZSA9IDA7CisJfQorCQorCXZhciBsZW5ndGggPSAwOworCXZhciBzZWdtZW50cyA9IFtdOworCXZhciBwdCA9IHAwOworCQorCWlmIChwdCAhPSBudWxsKQorCXsKKwkJdmFyIG1pblggPSBwdC54OworCQl2YXIgbWluWSA9IHB0Lnk7CisJCXZhciBtYXhYID0gbWluWDsKKwkJdmFyIG1heFkgPSBtaW5ZOworCQkKKwkJZm9yICh2YXIgaSA9IDE7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciB0bXAgPSBwb2ludHNbaV07CisJCQkKKwkJCWlmICh0bXAgIT0gbnVsbCkKKwkJCXsKKwkJCQl2YXIgZHggPSBwdC54IC0gdG1wLng7CisJCQkJdmFyIGR5ID0gcHQueSAtIHRtcC55OworCQkJCQorCQkJCXZhciBzZWdtZW50ID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTsKKwkJCQlzZWdtZW50cy5wdXNoKHNlZ21lbnQpOworCQkJCWxlbmd0aCArPSBzZWdtZW50OworCQkJCQorCQkJCXB0ID0gdG1wOworCQkJCQorCQkJCW1pblggPSBNYXRoLm1pbihwdC54LCBtaW5YKTsKKwkJCQltaW5ZID0gTWF0aC5taW4ocHQueSwgbWluWSk7CisJCQkJbWF4WCA9IE1hdGgubWF4KHB0LngsIG1heFgpOworCQkJCW1heFkgPSBNYXRoLm1heChwdC55LCBtYXhZKTsKKwkJCX0KKwkJfQorCQkKKwkJc3RhdGUubGVuZ3RoID0gbGVuZ3RoOworCQlzdGF0ZS5zZWdtZW50cyA9IHNlZ21lbnRzOworCQkKKwkJdmFyIG1hcmtlclNpemUgPSAxOyAvLyBUT0RPOiBpbmNsdWRlIG1hcmtlciBzaXplCisJCQorCQlzdGF0ZS54ID0gbWluWDsKKwkJc3RhdGUueSA9IG1pblk7CisJCXN0YXRlLndpZHRoID0gTWF0aC5tYXgobWFya2VyU2l6ZSwgbWF4WCAtIG1pblgpOworCQlzdGF0ZS5oZWlnaHQgPSBNYXRoLm1heChtYXJrZXJTaXplLCBtYXhZIC0gbWluWSk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0UG9pbnQKKyAqCisgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwb2ludCBvbiB0aGUgZWRnZSBmb3IgdGhlIGdpdmVuIHJlbGF0aXZlCisgKiA8bXhHZW9tZXRyeT4gYXMgYW4gPG14UG9pbnQ+LiBUaGUgZWRnZSBpcyByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4KKyAqIDxteENlbGxTdGF0ZT4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN0YXRlIC0gPG14Q2VsbFN0YXRlPiB0aGF0IHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIHRoZSBwYXJlbnQgZWRnZS4KKyAqIGdlb21ldHJ5IC0gPG14R2VvbWV0cnk+IHRoYXQgcmVwcmVzZW50cyB0aGUgcmVsYXRpdmUgbG9jYXRpb24uCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uKHN0YXRlLCBnZW9tZXRyeSkKK3sKKwl2YXIgeCA9IHN0YXRlLmdldENlbnRlclgoKTsKKwl2YXIgeSA9IHN0YXRlLmdldENlbnRlclkoKTsKKwkKKwlpZiAoc3RhdGUuc2VnbWVudHMgIT0gbnVsbCAmJiAoZ2VvbWV0cnkgPT0gbnVsbCB8fCBnZW9tZXRyeS5yZWxhdGl2ZSkpCisJeworCQl2YXIgZ3ggPSAoZ2VvbWV0cnkgIT0gbnVsbCkgPyBnZW9tZXRyeS54IC8gMiA6IDA7CisJCXZhciBwb2ludENvdW50ID0gc3RhdGUuYWJzb2x1dGVQb2ludHMubGVuZ3RoOworCQl2YXIgZGlzdCA9IE1hdGgucm91bmQoKGd4ICsgMC41KSAqIHN0YXRlLmxlbmd0aCk7CisJCXZhciBzZWdtZW50ID0gc3RhdGUuc2VnbWVudHNbMF07CisJCXZhciBsZW5ndGggPSAwOwkJCQkKKwkJdmFyIGluZGV4ID0gMTsKKworCQl3aGlsZSAoZGlzdCA+PSBNYXRoLnJvdW5kKGxlbmd0aCArIHNlZ21lbnQpICYmIGluZGV4IDwgcG9pbnRDb3VudCAtIDEpCisJCXsKKwkJCWxlbmd0aCArPSBzZWdtZW50OworCQkJc2VnbWVudCA9IHN0YXRlLnNlZ21lbnRzW2luZGV4KytdOworCQl9CisKKwkJdmFyIGZhY3RvciA9IChzZWdtZW50ID09IDApID8gMCA6IChkaXN0IC0gbGVuZ3RoKSAvIHNlZ21lbnQ7CisJCXZhciBwMCA9IHN0YXRlLmFic29sdXRlUG9pbnRzW2luZGV4LTFdOworCQl2YXIgcGUgPSBzdGF0ZS5hYnNvbHV0ZVBvaW50c1tpbmRleF07CisKKwkJaWYgKHAwICE9IG51bGwgJiYgcGUgIT0gbnVsbCkKKwkJeworCQkJdmFyIGd5ID0gMDsKKwkJCXZhciBvZmZzZXRYID0gMDsKKwkJCXZhciBvZmZzZXRZID0gMDsKKworCQkJaWYgKGdlb21ldHJ5ICE9IG51bGwpCisJCQl7CisJCQkJZ3kgPSBnZW9tZXRyeS55OworCQkJCXZhciBvZmZzZXQgPSBnZW9tZXRyeS5vZmZzZXQ7CisJCQkJCisJCQkJaWYgKG9mZnNldCAhPSBudWxsKQorCQkJCXsKKwkJCQkJb2Zmc2V0WCA9IG9mZnNldC54OworCQkJCQlvZmZzZXRZID0gb2Zmc2V0Lnk7CisJCQkJfQorCQkJfQorCisJCQl2YXIgZHggPSBwZS54IC0gcDAueDsKKwkJCXZhciBkeSA9IHBlLnkgLSBwMC55OworCQkJdmFyIG54ID0gKHNlZ21lbnQgPT0gMCkgPyAwIDogZHkgLyBzZWdtZW50OworCQkJdmFyIG55ID0gKHNlZ21lbnQgPT0gMCkgPyAwIDogZHggLyBzZWdtZW50OworCQkJCisJCQl4ID0gcDAueCArIGR4ICogZmFjdG9yICsgKG54ICogZ3kgKyBvZmZzZXRYKSAqIHRoaXMuc2NhbGU7CisJCQl5ID0gcDAueSArIGR5ICogZmFjdG9yIC0gKG55ICogZ3kgLSBvZmZzZXRZKSAqIHRoaXMuc2NhbGU7CisJCX0KKwl9CisJZWxzZSBpZiAoZ2VvbWV0cnkgIT0gbnVsbCkKKwl7CisJCXZhciBvZmZzZXQgPSBnZW9tZXRyeS5vZmZzZXQ7CisJCQorCQlpZiAob2Zmc2V0ICE9IG51bGwpCisJCXsKKwkJCXggKz0gb2Zmc2V0Lng7CisJCQl5ICs9IG9mZnNldC55OworCQl9CisJfQorCQorCXJldHVybiBuZXcgbXhQb2ludCh4LCB5KTsJCQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0UmVsYXRpdmVQb2ludAorICoKKyAqIEdldHMgdGhlIHJlbGF0aXZlIHBvaW50IHRoYXQgZGVzY3JpYmVzIHRoZSBnaXZlbiwgYWJzb2x1dGUgbGFiZWwKKyAqIHBvc2l0aW9uIGZvciB0aGUgZ2l2ZW4gZWRnZSBzdGF0ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHRoYXQgcmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgdGhlIHBhcmVudCBlZGdlLgorICogeCAtIFNwZWNpZmllcyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBhYnNvbHV0ZSBsYWJlbCBsb2NhdGlvbi4KKyAqIHkgLSBTcGVjaWZpZXMgdGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgYWJzb2x1dGUgbGFiZWwgbG9jYXRpb24uCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5nZXRSZWxhdGl2ZVBvaW50ID0gZnVuY3Rpb24oZWRnZVN0YXRlLCB4LCB5KQoreworCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsKKwl2YXIgZ2VvbWV0cnkgPSBtb2RlbC5nZXRHZW9tZXRyeShlZGdlU3RhdGUuY2VsbCk7CisJCisJaWYgKGdlb21ldHJ5ICE9IG51bGwpCisJeworCQl2YXIgcG9pbnRDb3VudCA9IGVkZ2VTdGF0ZS5hYnNvbHV0ZVBvaW50cy5sZW5ndGg7CisJCQorCQlpZiAoZ2VvbWV0cnkucmVsYXRpdmUgJiYgcG9pbnRDb3VudCA+IDEpCisJCXsKKwkJCXZhciB0b3RhbExlbmd0aCA9IGVkZ2VTdGF0ZS5sZW5ndGg7CisJCQl2YXIgc2VnbWVudHMgPSBlZGdlU3RhdGUuc2VnbWVudHM7CisKKwkJCS8vIFdvcmtzIHdoaWNoIGxpbmUgc2VnbWVudCB0aGUgcG9pbnQgb2YgdGhlIGxhYmVsIGlzIGNsb3Nlc3QgdG8KKwkJCXZhciBwMCA9IGVkZ2VTdGF0ZS5hYnNvbHV0ZVBvaW50c1swXTsKKwkJCXZhciBwZSA9IGVkZ2VTdGF0ZS5hYnNvbHV0ZVBvaW50c1sxXTsKKwkJCXZhciBtaW5EaXN0ID0gbXhVdGlscy5wdFNlZ0Rpc3RTcShwMC54LCBwMC55LCBwZS54LCBwZS55LCB4LCB5KTsKKworCQkJdmFyIGluZGV4ID0gMDsKKwkJCXZhciB0bXAgPSAwOworCQkJdmFyIGxlbmd0aCA9IDA7CisJCQkKKwkJCWZvciAodmFyIGkgPSAyOyBpIDwgcG9pbnRDb3VudDsgaSsrKQorCQkJeworCQkJCXRtcCArPSBzZWdtZW50c1tpIC0gMl07CisJCQkJcGUgPSBlZGdlU3RhdGUuYWJzb2x1dGVQb2ludHNbaV07CisJCQkJdmFyIGRpc3QgPSBteFV0aWxzLnB0U2VnRGlzdFNxKHAwLngsIHAwLnksIHBlLngsIHBlLnksIHgsIHkpOworCisJCQkJaWYgKGRpc3QgPD0gbWluRGlzdCkKKwkJCQl7CisJCQkJCW1pbkRpc3QgPSBkaXN0OworCQkJCQlpbmRleCA9IGkgLSAxOworCQkJCQlsZW5ndGggPSB0bXA7CisJCQkJfQorCQkJCQorCQkJCXAwID0gcGU7CisJCQl9CisJCQkKKwkJCXZhciBzZWcgPSBzZWdtZW50c1tpbmRleF07CisJCQlwMCA9IGVkZ2VTdGF0ZS5hYnNvbHV0ZVBvaW50c1tpbmRleF07CisJCQlwZSA9IGVkZ2VTdGF0ZS5hYnNvbHV0ZVBvaW50c1tpbmRleCArIDFdOworCQkJCisJCQl2YXIgeDIgPSBwMC54OworCQkJdmFyIHkyID0gcDAueTsKKwkJCQorCQkJdmFyIHgxID0gcGUueDsKKwkJCXZhciB5MSA9IHBlLnk7CisJCQkKKwkJCXZhciBweCA9IHg7CisJCQl2YXIgcHkgPSB5OworCQkJCisJCQl2YXIgeFNlZ21lbnQgPSB4MiAtIHgxOworCQkJdmFyIHlTZWdtZW50ID0geTIgLSB5MTsKKwkJCQorCQkJcHggLT0geDE7CisJCQlweSAtPSB5MTsKKwkJCXZhciBwcm9qbGVuU3EgPSAwOworCQkJCisJCQlweCA9IHhTZWdtZW50IC0gcHg7CisJCQlweSA9IHlTZWdtZW50IC0gcHk7CisJCQl2YXIgZG90cHJvZCA9IHB4ICogeFNlZ21lbnQgKyBweSAqIHlTZWdtZW50OworCisJCQlpZiAoZG90cHJvZCA8PSAwLjApCisJCQl7CisJCQkJcHJvamxlblNxID0gMDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwcm9qbGVuU3EgPSBkb3Rwcm9kICogZG90cHJvZAorCQkJCQkJLyAoeFNlZ21lbnQgKiB4U2VnbWVudCArIHlTZWdtZW50ICogeVNlZ21lbnQpOworCQkJfQorCisJCQl2YXIgcHJvamxlbiA9IE1hdGguc3FydChwcm9qbGVuU3EpOworCisJCQlpZiAocHJvamxlbiA+IHNlZykKKwkJCXsKKwkJCQlwcm9qbGVuID0gc2VnOworCQkJfQorCisJCQl2YXIgeURpc3RhbmNlID0gTWF0aC5zcXJ0KG14VXRpbHMucHRTZWdEaXN0U3EocDAueCwgcDAueSwgcGUKKwkJCQkJLngsIHBlLnksIHgsIHkpKTsKKwkJCXZhciBkaXJlY3Rpb24gPSBteFV0aWxzLnJlbGF0aXZlQ2N3KHAwLngsIHAwLnksIHBlLngsIHBlLnksIHgsIHkpOworCisJCQlpZiAoZGlyZWN0aW9uID09IC0xKQorCQkJeworCQkJCXlEaXN0YW5jZSA9IC15RGlzdGFuY2U7CisJCQl9CisKKwkJCS8vIENvbnN0cnVjdHMgdGhlIHJlbGF0aXZlIHBvaW50IGZvciB0aGUgbGFiZWwKKwkJCXJldHVybiBuZXcgbXhQb2ludCgoKHRvdGFsTGVuZ3RoIC8gMiAtIGxlbmd0aCAtIHByb2psZW4pIC8gdG90YWxMZW5ndGgpICogLTIsCisJCQkJCQl5RGlzdGFuY2UgLyB0aGlzLnNjYWxlKTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gbmV3IG14UG9pbnQoKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZUVkZ2VMYWJlbE9mZnNldAorICoKKyAqIFVwZGF0ZXMgPG14Q2VsbFN0YXRlLmFic29sdXRlT2Zmc2V0PiBmb3IgdGhlIGdpdmVuIHN0YXRlLiBUaGUgYWJzb2x1dGUKKyAqIG9mZnNldCBpcyBub3JtYWxseSB1c2VkIGZvciB0aGUgcG9zaXRpb24gb2YgdGhlIGVkZ2UgbGFiZWwuIElzIGlzCisgKiBjYWxjdWxhdGVkIGZyb20gdGhlIGdlb21ldHJ5IGFzIGFuIGFic29sdXRlIG9mZnNldCBmcm9tIHRoZSBjZW50ZXIKKyAqIGJldHdlZW4gdGhlIHR3byBlbmRwb2ludHMgaWYgdGhlIGdlb21ldHJ5IGlzIGFic29sdXRlLCBvciBhcyB0aGUKKyAqIHJlbGF0aXZlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGNlbnRlciBhbG9uZyB0aGUgbGluZSBhbmQgdGhlIGFic29sdXRlCisgKiBvcnRob2dvbmFsIGRpc3RhbmNlIGlmIHRoZSBnZW9tZXRyeSBpcyByZWxhdGl2ZS4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc3RhdGUgLSA8bXhDZWxsU3RhdGU+IHdob3NlIGFic29sdXRlIG9mZnNldCBzaG91bGQgYmUgdXBkYXRlZC4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLnVwZGF0ZUVkZ2VMYWJlbE9mZnNldCA9IGZ1bmN0aW9uKHN0YXRlKQoreworCXZhciBwb2ludHMgPSBzdGF0ZS5hYnNvbHV0ZVBvaW50czsKKwkKKwlzdGF0ZS5hYnNvbHV0ZU9mZnNldC54ID0gc3RhdGUuZ2V0Q2VudGVyWCgpOworCXN0YXRlLmFic29sdXRlT2Zmc2V0LnkgPSBzdGF0ZS5nZXRDZW50ZXJZKCk7CisKKwlpZiAocG9pbnRzICE9IG51bGwgJiYgcG9pbnRzLmxlbmd0aCA+IDAgJiYgc3RhdGUuc2VnbWVudHMgIT0gbnVsbCkKKwl7CisJCXZhciBnZW9tZXRyeSA9IHRoaXMuZ3JhcGguZ2V0Q2VsbEdlb21ldHJ5KHN0YXRlLmNlbGwpOworCQkKKwkJaWYgKGdlb21ldHJ5LnJlbGF0aXZlKQorCQl7CisJCQl2YXIgb2Zmc2V0ID0gdGhpcy5nZXRQb2ludChzdGF0ZSwgZ2VvbWV0cnkpOworCQkJCisJCQlpZiAob2Zmc2V0ICE9IG51bGwpCisJCQl7CisJCQkJc3RhdGUuYWJzb2x1dGVPZmZzZXQgPSBvZmZzZXQ7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQl2YXIgcDAgPSBwb2ludHNbMF07CisJCQl2YXIgcGUgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdOworCQkJCisJCQlpZiAocDAgIT0gbnVsbCAmJiBwZSAhPSBudWxsKQorCQkJeworCQkJCXZhciBkeCA9IHBlLnggLSBwMC54OworCQkJCXZhciBkeSA9IHBlLnkgLSBwMC55OworCQkJCXZhciB4MCA9IDA7CisJCQkJdmFyIHkwID0gMDsKKworCQkJCXZhciBvZmYgPSBnZW9tZXRyeS5vZmZzZXQ7CisJCQkJCisJCQkJaWYgKG9mZiAhPSBudWxsKQorCQkJCXsKKwkJCQkJeDAgPSBvZmYueDsKKwkJCQkJeTAgPSBvZmYueTsKKwkJCQl9CisJCQkJCisJCQkJdmFyIHggPSBwMC54ICsgZHggLyAyICsgeDAgKiB0aGlzLnNjYWxlOworCQkJCXZhciB5ID0gcDAueSArIGR5IC8gMiArIHkwICogdGhpcy5zY2FsZTsKKwkJCQkKKwkJCQlzdGF0ZS5hYnNvbHV0ZU9mZnNldC54ID0geDsKKwkJCQlzdGF0ZS5hYnNvbHV0ZU9mZnNldC55ID0geTsKKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFN0YXRlCisgKgorICogUmV0dXJucyB0aGUgPG14Q2VsbFN0YXRlPiBmb3IgdGhlIGdpdmVuIGNlbGwuIElmIGNyZWF0ZSBpcyB0cnVlLCB0aGVuCisgKiB0aGUgc3RhdGUgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCB5ZXQgZXhpc3QuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGNlbGwgLSA8bXhDZWxsPiBmb3Igd2hpY2ggdGhlIDxteENlbGxTdGF0ZT4gc2hvdWxkIGJlIHJldHVybmVkLgorICogY3JlYXRlIC0gT3B0aW9uYWwgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGEgbmV3IHN0YXRlIHNob3VsZCBiZSBjcmVhdGVkCisgKiBpZiBpdCBkb2VzIG5vdCB5ZXQgZXhpc3QuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uKGNlbGwsIGNyZWF0ZSkKK3sKKwljcmVhdGUgPSBjcmVhdGUgfHwgZmFsc2U7CisJdmFyIHN0YXRlID0gbnVsbDsKKwkKKwlpZiAoY2VsbCAhPSBudWxsKQorCXsKKwkJc3RhdGUgPSB0aGlzLnN0YXRlcy5nZXQoY2VsbCk7CisJCQorCQlpZiAoY3JlYXRlICYmIChzdGF0ZSA9PSBudWxsIHx8IHRoaXMudXBkYXRlU3R5bGUpICYmIHRoaXMuZ3JhcGguaXNDZWxsVmlzaWJsZShjZWxsKSkKKwkJeworCQkJaWYgKHN0YXRlID09IG51bGwpCisJCQl7CisJCQkJc3RhdGUgPSB0aGlzLmNyZWF0ZVN0YXRlKGNlbGwpOworCQkJCXRoaXMuc3RhdGVzLnB1dChjZWxsLCBzdGF0ZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc3RhdGUuc3R5bGUgPSB0aGlzLmdyYXBoLmdldENlbGxTdHlsZShjZWxsKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBzdGF0ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzUmVuZGVyaW5nCisgKgorICogUmV0dXJucyA8cmVuZGVyaW5nPi4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLmlzUmVuZGVyaW5nID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLnJlbmRlcmluZzsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFJlbmRlcmluZworICoKKyAqIFNldHMgPHJlbmRlcmluZz4uCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5zZXRSZW5kZXJpbmcgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLnJlbmRlcmluZyA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNBbGxvd0V2YWwKKyAqCisgKiBSZXR1cm5zIDxhbGxvd0V2YWw+LgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuaXNBbGxvd0V2YWwgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuYWxsb3dFdmFsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0QWxsb3dFdmFsCisgKgorICogU2V0cyA8YWxsb3dFdmFsPi4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLnNldEFsbG93RXZhbCA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuYWxsb3dFdmFsID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRTdGF0ZXMKKyAqCisgKiBSZXR1cm5zIDxzdGF0ZXM+LgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuZ2V0U3RhdGVzID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLnN0YXRlczsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldFN0YXRlcworICoKKyAqIFNldHMgPHN0YXRlcz4uCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5zZXRTdGF0ZXMgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLnN0YXRlcyA9IHZhbHVlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q2VsbFN0YXRlcworICoKKyAqIFJldHVybnMgdGhlIDxteENlbGxTdGF0ZXM+IGZvciB0aGUgZ2l2ZW4gYXJyYXkgb2YgPG14Q2VsbHM+LiBUaGUgYXJyYXkKKyAqIGNvbnRhaW5zIGFsbCBzdGF0ZXMgdGhhdCBhcmUgbm90IG51bGwsIHRoYXQgaXMsIHRoZSByZXR1cm5lZCBhcnJheSBtYXkKKyAqIGhhdmUgbGVzcyBlbGVtZW50cyB0aGFuIHRoZSBnaXZlbiBhcnJheS4gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZW4KKyAqIHRoaXMgcmV0dXJucyA8c3RhdGVzPi4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLmdldENlbGxTdGF0ZXMgPSBmdW5jdGlvbihjZWxscykKK3sKKwlpZiAoY2VsbHMgPT0gbnVsbCkKKwl7CisJCXJldHVybiB0aGlzLnN0YXRlczsKKwl9CisJZWxzZQorCXsKKwkJdmFyIHJlc3VsdCA9IFtdOworCQkKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkJeworCQkJdmFyIHN0YXRlID0gdGhpcy5nZXRTdGF0ZShjZWxsc1tpXSk7CisJCQkKKwkJCWlmIChzdGF0ZSAhPSBudWxsKQorCQkJeworCQkJCXJlc3VsdC5wdXNoKHN0YXRlKTsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIHJlc3VsdDsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiByZW1vdmVTdGF0ZQorICoKKyAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIDxteENlbGxTdGF0ZT4gZm9yIHRoZSBnaXZlbiBjZWxsLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gZm9yIHdoaWNoIHRoZSA8bXhDZWxsU3RhdGU+IHNob3VsZCBiZSByZW1vdmVkLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUucmVtb3ZlU3RhdGUgPSBmdW5jdGlvbihjZWxsKQoreworCXZhciBzdGF0ZSA9IG51bGw7CisJCisJaWYgKGNlbGwgIT0gbnVsbCkKKwl7CisJCXN0YXRlID0gdGhpcy5zdGF0ZXMucmVtb3ZlKGNlbGwpOworCQkKKwkJaWYgKHN0YXRlICE9IG51bGwpCisJCXsKKwkJCXRoaXMuZ3JhcGguY2VsbFJlbmRlcmVyLmRlc3Ryb3koc3RhdGUpOworCQkJc3RhdGUuaW52YWxpZCA9IHRydWU7CisJCQlzdGF0ZS5kZXN0cm95KCk7CisJCX0KKwl9CisJCisJcmV0dXJuIHN0YXRlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlU3RhdGUKKyAqCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIDxteENlbGxTdGF0ZT4gZm9yIHRoZSBnaXZlbiBjZWxsIGFuZCBpbml0aWFsaXplcworICogaXQgdXNpbmcgPG14Q2VsbFJlbmRlcmVyLmluaXRpYWxpemU+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gPG14Q2VsbD4gZm9yIHdoaWNoIGEgbmV3IDxteENlbGxTdGF0ZT4gc2hvdWxkIGJlIGNyZWF0ZWQuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5jcmVhdGVTdGF0ZSA9IGZ1bmN0aW9uKGNlbGwpCit7CisJcmV0dXJuIG5ldyBteENlbGxTdGF0ZSh0aGlzLCBjZWxsLCB0aGlzLmdyYXBoLmdldENlbGxTdHlsZShjZWxsKSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDYW52YXMKKyAqCisgKiBSZXR1cm5zIHRoZSBET00gbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBiYWNrZ3JvdW5kLSwgZHJhdy0gYW5kCisgKiBvdmVybGF5LSBhbmQgZGVjb3JhdG9ycGFuZXMuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5nZXRDYW52YXMgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuY2FudmFzOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0QmFja2dyb3VuZFBhbmUKKyAqCisgKiBSZXR1cm5zIHRoZSBET00gbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGJhY2tncm91bmQgbGF5ZXIuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5nZXRCYWNrZ3JvdW5kUGFuZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5iYWNrZ3JvdW5kUGFuZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldERyYXdQYW5lCisgKgorICogUmV0dXJucyB0aGUgRE9NIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBtYWluIGRyYXdpbmcgbGF5ZXIuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5nZXREcmF3UGFuZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5kcmF3UGFuZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldE92ZXJsYXlQYW5lCisgKgorICogUmV0dXJucyB0aGUgRE9NIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBsYXllciBhYm92ZSB0aGUgZHJhd2luZyBsYXllci4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLmdldE92ZXJsYXlQYW5lID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLm92ZXJsYXlQYW5lOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0RGVjb3JhdG9yUGFuZQorICoKKyAqIFJldHVybnMgdGhlIERPTSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgdG9wbW9zdCBkcmF3aW5nIGxheWVyLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuZ2V0RGVjb3JhdG9yUGFuZSA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5kZWNvcmF0b3JQYW5lOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNDb250YWluZXJFdmVudAorICogCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IG9yaWdpbiBpcyBvbmUgb2YgdGhlIGRyYXdpbmcgcGFuZXMgb3IKKyAqIGNvbnRhaW5lcnMgb2YgdGhlIHZpZXcuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5pc0NvbnRhaW5lckV2ZW50ID0gZnVuY3Rpb24oZXZ0KQoreworCXZhciBzb3VyY2UgPSBteEV2ZW50LmdldFNvdXJjZShldnQpOworCisJcmV0dXJuIChzb3VyY2UgPT0gdGhpcy5ncmFwaC5jb250YWluZXIgfHwKKwkJc291cmNlLnBhcmVudE5vZGUgPT0gdGhpcy5iYWNrZ3JvdW5kUGFuZSB8fAorCQkoc291cmNlLnBhcmVudE5vZGUgIT0gbnVsbCAmJgorCQlzb3VyY2UucGFyZW50Tm9kZS5wYXJlbnROb2RlID09IHRoaXMuYmFja2dyb3VuZFBhbmUpIHx8CisJCXNvdXJjZSA9PSB0aGlzLmNhbnZhcy5wYXJlbnROb2RlIHx8CisJCXNvdXJjZSA9PSB0aGlzLmNhbnZhcyB8fAorCQlzb3VyY2UgPT0gdGhpcy5iYWNrZ3JvdW5kUGFuZSB8fAorCQlzb3VyY2UgPT0gdGhpcy5kcmF3UGFuZSB8fAorCQlzb3VyY2UgPT0gdGhpcy5vdmVybGF5UGFuZSB8fAorCQlzb3VyY2UgPT0gdGhpcy5kZWNvcmF0b3JQYW5lKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzU2Nyb2xsRXZlbnQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBvcmlnaW4gaXMgb25lIG9mIHRoZSBzY3JvbGxiYXJzIG9mIHRoZQorICogY29udGFpbmVyIGluIElFLiBTdWNoIGV2ZW50cyBhcmUgaWdub3JlZC4KKyAqLworIG14R3JhcGhWaWV3LnByb3RvdHlwZS5pc1Njcm9sbEV2ZW50ID0gZnVuY3Rpb24oZXZ0KQoreworCXZhciBvZmZzZXQgPSBteFV0aWxzLmdldE9mZnNldCh0aGlzLmdyYXBoLmNvbnRhaW5lcik7CisJdmFyIHB0ID0gbmV3IG14UG9pbnQoZXZ0LmNsaWVudFggLSBvZmZzZXQueCwgZXZ0LmNsaWVudFkgLSBvZmZzZXQueSk7CisKKwl2YXIgb3V0V2lkdGggPSB0aGlzLmdyYXBoLmNvbnRhaW5lci5vZmZzZXRXaWR0aDsKKwl2YXIgaW5XaWR0aCA9IHRoaXMuZ3JhcGguY29udGFpbmVyLmNsaWVudFdpZHRoOworCisJaWYgKG91dFdpZHRoID4gaW5XaWR0aCAmJiBwdC54ID4gaW5XaWR0aCArIDIgJiYgcHQueCA8PSBvdXRXaWR0aCkKKwl7CisJCXJldHVybiB0cnVlOworCX0KKworCXZhciBvdXRIZWlnaHQgPSB0aGlzLmdyYXBoLmNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7CisJdmFyIGluSGVpZ2h0ID0gdGhpcy5ncmFwaC5jb250YWluZXIuY2xpZW50SGVpZ2h0OworCQorCWlmIChvdXRIZWlnaHQgPiBpbkhlaWdodCAmJiBwdC55ID4gaW5IZWlnaHQgKyAyICYmIHB0LnkgPD0gb3V0SGVpZ2h0KQorCXsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXJldHVybiBmYWxzZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGluaXQKKyAqCisgKiBJbml0aWFsaXplcyB0aGUgZ3JhcGggZXZlbnQgZGlzcGF0Y2ggbG9vcCBmb3IgdGhlIHNwZWNpZmllZCBjb250YWluZXIKKyAqIGFuZCBpbnZva2VzIDxjcmVhdGU+IHRvIGNyZWF0ZSB0aGUgcmVxdWlyZWQgRE9NIG5vZGVzIGZvciB0aGUgZGlzcGxheS4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbigpCit7CisJdGhpcy5pbnN0YWxsTGlzdGVuZXJzKCk7CisJCisJLy8gQ3JlYXRlcyB0aGUgRE9NIG5vZGVzIGZvciB0aGUgcmVzcGVjdGl2ZSBkaXNwbGF5IGRpYWxlY3QKKwl2YXIgZ3JhcGggPSB0aGlzLmdyYXBoOworCQorCWlmIChncmFwaC5kaWFsZWN0ID09IG14Q29uc3RhbnRzLkRJQUxFQ1RfU1ZHKQorCXsKKwkJdGhpcy5jcmVhdGVTdmcoKTsKKwl9CisJZWxzZSBpZiAoZ3JhcGguZGlhbGVjdCA9PSBteENvbnN0YW50cy5ESUFMRUNUX1ZNTCkKKwl7CisJCXRoaXMuY3JlYXRlVm1sKCk7CisJfQorCWVsc2UKKwl7CisJCXRoaXMuY3JlYXRlSHRtbCgpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGluc3RhbGxMaXN0ZW5lcnMKKyAqCisgKiBJbnN0YWxscyB0aGUgcmVxdWlyZWQgbGlzdGVuZXJzIGluIHRoZSBjb250YWluZXIuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS5pbnN0YWxsTGlzdGVuZXJzID0gZnVuY3Rpb24oKQoreworCXZhciBncmFwaCA9IHRoaXMuZ3JhcGg7CisJdmFyIGNvbnRhaW5lciA9IGdyYXBoLmNvbnRhaW5lcjsKKwkKKwlpZiAoY29udGFpbmVyICE9IG51bGwpCisJeworCQkvLyBTdXBwb3J0IGZvciB0b3VjaCBkZXZpY2UgZ2VzdHVyZXMgKGVnLiBwaW5jaCB0byB6b29tKQorCQkvLyBEb3VibGUtdGFwIGhhbmRsaW5nIGlzIGltcGxlbWVudGVkIGluIG14R3JhcGguZmlyZU1vdXNlRXZlbnQKKwkJaWYgKG14Q2xpZW50LklTX1RPVUNIKQorCQl7CisJCQlteEV2ZW50LmFkZExpc3RlbmVyKGNvbnRhaW5lciwgJ2dlc3R1cmVzdGFydCcsIG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJCQl7CisJCQkJZ3JhcGguZmlyZUdlc3R1cmVFdmVudChldnQpOworCQkJCW14RXZlbnQuY29uc3VtZShldnQpOworCQkJfSkpOworCQkJCisJCQlteEV2ZW50LmFkZExpc3RlbmVyKGNvbnRhaW5lciwgJ2dlc3R1cmVjaGFuZ2UnLCBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQkJeworCQkJCWdyYXBoLmZpcmVHZXN0dXJlRXZlbnQoZXZ0KTsKKwkJCQlteEV2ZW50LmNvbnN1bWUoZXZ0KTsKKwkJCX0pKTsKKworCQkJbXhFdmVudC5hZGRMaXN0ZW5lcihjb250YWluZXIsICdnZXN0dXJlZW5kJywgbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwkJCXsKKwkJCQlncmFwaC5maXJlR2VzdHVyZUV2ZW50KGV2dCk7CisJCQkJbXhFdmVudC5jb25zdW1lKGV2dCk7CisJCQl9KSk7CisJCX0KKwkJCisJCS8vIEFkZHMgYmFzaWMgbGlzdGVuZXJzIGZvciBncmFwaCBldmVudCBkaXNwYXRjaGluZworCQlteEV2ZW50LmFkZEdlc3R1cmVMaXN0ZW5lcnMoY29udGFpbmVyLCBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQl7CisJCQkvLyBDb25kaXRpb24gdG8gYXZvaWQgc2Nyb2xsYmFyIGV2ZW50cyBzdGFydGluZyBhIHJ1YmJlcmJhbmQgc2VsZWN0aW9uCisJCQlpZiAodGhpcy5pc0NvbnRhaW5lckV2ZW50KGV2dCkgJiYgKCghbXhDbGllbnQuSVNfSUUgJiYgIW14Q2xpZW50LklTX0lFMTEgJiYgIW14Q2xpZW50LklTX0dDICYmCisJCQkJIW14Q2xpZW50LklTX09QICYmICFteENsaWVudC5JU19TRikgfHwgIXRoaXMuaXNTY3JvbGxFdmVudChldnQpKSkKKwkJCXsKKwkJCQlncmFwaC5maXJlTW91c2VFdmVudChteEV2ZW50Lk1PVVNFX0RPV04sIG5ldyBteE1vdXNlRXZlbnQoZXZ0KSk7CisJCQl9CisJCX0pLAorCQlteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQl7CisJCQlpZiAodGhpcy5pc0NvbnRhaW5lckV2ZW50KGV2dCkpCisJCQl7CisJCQkJZ3JhcGguZmlyZU1vdXNlRXZlbnQobXhFdmVudC5NT1VTRV9NT1ZFLCBuZXcgbXhNb3VzZUV2ZW50KGV2dCkpOworCQkJfQorCQl9KSwKKwkJbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKGV2dCkKKwkJeworCQkJaWYgKHRoaXMuaXNDb250YWluZXJFdmVudChldnQpKQorCQkJeworCQkJCWdyYXBoLmZpcmVNb3VzZUV2ZW50KG14RXZlbnQuTU9VU0VfVVAsIG5ldyBteE1vdXNlRXZlbnQoZXZ0KSk7CisJCQl9CisJCX0pKTsKKwkJCisJCS8vIEFkZHMgbGlzdGVuZXIgZm9yIGRvdWJsZSBjbGljayBoYW5kbGluZyBvbiBiYWNrZ3JvdW5kLCB0aGlzIGRvZXMgYWx3YXlzCisJCS8vIHVzZSBuYXRpdmUgZXZlbnQgaGFuZGxlciwgd2UgYXNzdW1lIHRoYXQgdGhlIERPTSBvZiB0aGUgYmFja2dyb3VuZAorCQkvLyBkb2VzIG5vdCBjaGFuZ2UgZHVyaW5nIHRoZSBkb3VibGUgY2xpY2sKKwkJbXhFdmVudC5hZGRMaXN0ZW5lcihjb250YWluZXIsICdkYmxjbGljaycsIG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJCXsKKwkJCWlmICh0aGlzLmlzQ29udGFpbmVyRXZlbnQoZXZ0KSkKKwkJCXsKKwkJCQlncmFwaC5kYmxDbGljayhldnQpOworCQkJfQorCQl9KSk7CisKKwkJLy8gV29ya2Fyb3VuZCBmb3IgdG91Y2ggZXZlbnRzIHdoaWNoIHN0YXJ0ZWQgb24gc29tZSBET00gbm9kZQorCQkvLyBvbiB0b3Agb2YgdGhlIGNvbnRhaW5lciwgaW4gd2hpY2ggY2FzZSB0aGUgY2VsbHMgdW5kZXIgdGhlCisJCS8vIG1vdXNlIGZvciB0aGUgbW92ZSBhbmQgdXAgZXZlbnRzIGFyZSBub3QgZGV0ZWN0ZWQuCisJCXZhciBnZXRTdGF0ZSA9IGZ1bmN0aW9uKGV2dCkKKwkJeworCQkJdmFyIHN0YXRlID0gbnVsbDsKKwkJCQorCQkJLy8gV29ya2Fyb3VuZCBmb3IgdG91Y2ggZXZlbnRzIHdoaWNoIHN0YXJ0ZWQgb24gc29tZSBET00gbm9kZQorCQkJLy8gb24gdG9wIG9mIHRoZSBjb250YWluZXIsIGluIHdoaWNoIGNhc2UgdGhlIGNlbGxzIHVuZGVyIHRoZQorCQkJLy8gbW91c2UgZm9yIHRoZSBtb3ZlIGFuZCB1cCBldmVudHMgYXJlIG5vdCBkZXRlY3RlZC4KKwkJCWlmIChteENsaWVudC5JU19UT1VDSCkKKwkJCXsKKwkJCQl2YXIgeCA9IG14RXZlbnQuZ2V0Q2xpZW50WChldnQpOworCQkJCXZhciB5ID0gbXhFdmVudC5nZXRDbGllbnRZKGV2dCk7CisJCQkJCisJCQkJLy8gRGlzcGF0Y2hlcyB0aGUgZHJvcCBldmVudCB0byB0aGUgZ3JhcGggd2hpY2gKKwkJCQkvLyBjb25zdW1lcyBhbmQgZXhlY3V0ZXMgdGhlIHNvdXJjZSBmdW5jdGlvbgorCQkJCXZhciBwdCA9IG14VXRpbHMuY29udmVydFBvaW50KGNvbnRhaW5lciwgeCwgeSk7CisJCQkJc3RhdGUgPSBncmFwaC52aWV3LmdldFN0YXRlKGdyYXBoLmdldENlbGxBdChwdC54LCBwdC55KSk7CisJCQl9CisJCQkKKwkJCXJldHVybiBzdGF0ZTsKKwkJfTsKKwkJCisJCS8vIEFkZHMgYmFzaWMgbGlzdGVuZXJzIGZvciBncmFwaCBldmVudCBkaXNwYXRjaGluZyBvdXRzaWRlIG9mIHRoZQorCQkvLyBjb250YWluZXIgYW5kIGZpbmlzaGluZyB0aGUgaGFuZGxpbmcgb2YgYSBzaW5nbGUgZ2VzdHVyZQorCQkvLyBJbXBsZW1lbnRlZCB2aWEgZ3JhcGggZXZlbnQgZGlzcGF0Y2ggbG9vcCB0byBhdm9pZCBkdXBsaWNhdGUgZXZlbnRzCisJCS8vIGluIEZpcmVmb3ggYW5kIENocm9tZQorCQlncmFwaC5hZGRNb3VzZUxpc3RlbmVyKAorCQl7CisJCQltb3VzZURvd246IGZ1bmN0aW9uKHNlbmRlciwgbWUpCisJCQl7CisJCQkJZ3JhcGgucG9wdXBNZW51SGFuZGxlci5oaWRlTWVudSgpOworCQkJfSwKKwkJCW1vdXNlTW92ZTogZnVuY3Rpb24oKSB7IH0sCisJCQltb3VzZVVwOiBmdW5jdGlvbigpIHsgfQorCQl9KTsKKwkJCisJCXRoaXMubW92ZUhhbmRsZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQl7CisJCQkvLyBIaWRlcyB0aGUgdG9vbHRpcCBpZiBtb3VzZSBpcyBvdXRzaWRlIGNvbnRhaW5lcgorCQkJaWYgKGdyYXBoLnRvb2x0aXBIYW5kbGVyICE9IG51bGwgJiYgZ3JhcGgudG9vbHRpcEhhbmRsZXIuaXNIaWRlT25Ib3ZlcigpKQorCQkJeworCQkJCWdyYXBoLnRvb2x0aXBIYW5kbGVyLmhpZGUoKTsKKwkJCX0KKworCQkJaWYgKHRoaXMuY2FwdHVyZURvY3VtZW50R2VzdHVyZSAmJiBncmFwaC5pc01vdXNlRG93biAmJiBncmFwaC5jb250YWluZXIgIT0gbnVsbCAmJgorCQkJCSF0aGlzLmlzQ29udGFpbmVyRXZlbnQoZXZ0KSAmJiBncmFwaC5jb250YWluZXIuc3R5bGUuZGlzcGxheSAhPSAnbm9uZScgJiYKKwkJCQlncmFwaC5jb250YWluZXIuc3R5bGUudmlzaWJpbGl0eSAhPSAnaGlkZGVuJyAmJiAhbXhFdmVudC5pc0NvbnN1bWVkKGV2dCkpCisJCQl7CisJCQkJZ3JhcGguZmlyZU1vdXNlRXZlbnQobXhFdmVudC5NT1VTRV9NT1ZFLCBuZXcgbXhNb3VzZUV2ZW50KGV2dCwgZ2V0U3RhdGUoZXZ0KSkpOworCQkJfQorCQl9KTsKKwkJCisJCXRoaXMuZW5kSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJCXsKKwkJCWlmICh0aGlzLmNhcHR1cmVEb2N1bWVudEdlc3R1cmUgJiYgZ3JhcGguaXNNb3VzZURvd24gJiYgZ3JhcGguY29udGFpbmVyICE9IG51bGwgJiYKKwkJCQkhdGhpcy5pc0NvbnRhaW5lckV2ZW50KGV2dCkgJiYgZ3JhcGguY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnICYmCisJCQkJZ3JhcGguY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgIT0gJ2hpZGRlbicpCisJCQl7CisJCQkJZ3JhcGguZmlyZU1vdXNlRXZlbnQobXhFdmVudC5NT1VTRV9VUCwgbmV3IG14TW91c2VFdmVudChldnQpKTsKKwkJCX0KKwkJfSk7CisJCQorCQlteEV2ZW50LmFkZEdlc3R1cmVMaXN0ZW5lcnMoZG9jdW1lbnQsIG51bGwsIHRoaXMubW92ZUhhbmRsZXIsIHRoaXMuZW5kSGFuZGxlcik7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlCisgKgorICogQ3JlYXRlcyB0aGUgRE9NIG5vZGVzIGZvciB0aGUgSFRNTCBkaXNwbGF5LgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuY3JlYXRlSHRtbCA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgY29udGFpbmVyID0gdGhpcy5ncmFwaC5jb250YWluZXI7CisJCisJaWYgKGNvbnRhaW5lciAhPSBudWxsKQorCXsKKwkJdGhpcy5jYW52YXMgPSB0aGlzLmNyZWF0ZUh0bWxQYW5lKCcxMDAlJywgJzEwMCUnKTsKKwkJdGhpcy5jYW52YXMuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKKwkKKwkJLy8gVXNlcyBtaW5pbWFsIHNpemUgZm9yIGlubmVyIERJVnMgb24gQ2FudmFzLiBUaGlzIGlzIHJlcXVpcmVkCisJCS8vIGZvciBjb3JyZWN0IGV2ZW50IHByb2Nlc3NpbmcgaW4gSUUuIElmIHdlIGhhdmUgYW4gb3ZlcmxhcHBpbmcKKwkJLy8gRElWIHRoZW4gdGhlIGV2ZW50cyBvbiB0aGUgY2VsbHMgYXJlIG9ubHkgZmlyZWQgZm9yIGxhYmVscy4KKwkJdGhpcy5iYWNrZ3JvdW5kUGFuZSA9IHRoaXMuY3JlYXRlSHRtbFBhbmUoJzFweCcsICcxcHgnKTsKKwkJdGhpcy5kcmF3UGFuZSA9IHRoaXMuY3JlYXRlSHRtbFBhbmUoJzFweCcsICcxcHgnKTsKKwkJdGhpcy5vdmVybGF5UGFuZSA9IHRoaXMuY3JlYXRlSHRtbFBhbmUoJzFweCcsICcxcHgnKTsKKwkJdGhpcy5kZWNvcmF0b3JQYW5lID0gdGhpcy5jcmVhdGVIdG1sUGFuZSgnMXB4JywgJzFweCcpOworCQkKKwkJdGhpcy5jYW52YXMuYXBwZW5kQ2hpbGQodGhpcy5iYWNrZ3JvdW5kUGFuZSk7CisJCXRoaXMuY2FudmFzLmFwcGVuZENoaWxkKHRoaXMuZHJhd1BhbmUpOworCQl0aGlzLmNhbnZhcy5hcHBlbmRDaGlsZCh0aGlzLm92ZXJsYXlQYW5lKTsKKwkJdGhpcy5jYW52YXMuYXBwZW5kQ2hpbGQodGhpcy5kZWNvcmF0b3JQYW5lKTsKKworCQljb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jYW52YXMpOworCQl0aGlzLnVwZGF0ZUNvbnRhaW5lclN0eWxlKGNvbnRhaW5lcik7CisJCQorCQkvLyBJbXBsZW1lbnRzIG1pbldpZHRoL21pbkhlaWdodCBpbiBxdWlya3MgbW9kZQorCQlpZiAobXhDbGllbnQuSVNfUVVJUktTKQorCQl7CisJCQl2YXIgb25SZXNpemUgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQkJeworCQkJCXZhciBib3VuZHMgPSB0aGlzLmdldEdyYXBoQm91bmRzKCk7CisJCQkJdmFyIHdpZHRoID0gYm91bmRzLnggKyBib3VuZHMud2lkdGggKyB0aGlzLmdyYXBoLmJvcmRlcjsKKwkJCQl2YXIgaGVpZ2h0ID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0ICsgdGhpcy5ncmFwaC5ib3JkZXI7CisJCQkJCisJCQkJdGhpcy51cGRhdGVIdG1sQ2FudmFzU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKwkJCX0pOworCQkJCisJCQlteEV2ZW50LmFkZExpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIG9uUmVzaXplKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHVwZGF0ZUh0bWxDYW52YXNTaXplCisgKiAKKyAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhlIEhUTUwgY2FudmFzLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUudXBkYXRlSHRtbENhbnZhc1NpemUgPSBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KQoreworCWlmICh0aGlzLmdyYXBoLmNvbnRhaW5lciAhPSBudWxsKQorCXsKKwkJdmFyIG93ID0gdGhpcy5ncmFwaC5jb250YWluZXIub2Zmc2V0V2lkdGg7CisJCXZhciBvaCA9IHRoaXMuZ3JhcGguY29udGFpbmVyLm9mZnNldEhlaWdodDsKKworCQlpZiAob3cgPCB3aWR0aCkKKwkJeworCQkJdGhpcy5jYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLmNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJzsKKwkJfQorCisJCWlmIChvaCA8IGhlaWdodCkKKwkJeworCQkJdGhpcy5jYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JzsKKwkJfQorCQllbHNlCisJCXsKKwkJCXRoaXMuY2FudmFzLnN0eWxlLmhlaWdodCA9ICcxMDAlJzsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZUh0bWxQYW5lCisgKiAKKyAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBkcmF3aW5nIHBhbmUgaW4gSFRNTCAoRElWKS4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLmNyZWF0ZUh0bWxQYW5lID0gZnVuY3Rpb24od2lkdGgsIGhlaWdodCkKK3sKKwl2YXIgcGFuZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpOworCQorCWlmICh3aWR0aCAhPSBudWxsICYmIGhlaWdodCAhPSBudWxsKQorCXsKKwkJcGFuZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisJCXBhbmUuc3R5bGUubGVmdCA9ICcwcHgnOworCQlwYW5lLnN0eWxlLnRvcCA9ICcwcHgnOworCisJCXBhbmUuc3R5bGUud2lkdGggPSB3aWR0aDsKKwkJcGFuZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQ7CisJfQorCWVsc2UKKwl7CisJCXBhbmUuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOworCX0KKwkKKwlyZXR1cm4gcGFuZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZQorICoKKyAqIENyZWF0ZXMgdGhlIERPTSBub2RlcyBmb3IgdGhlIFZNTCBkaXNwbGF5LgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuY3JlYXRlVm1sID0gZnVuY3Rpb24oKQoreworCXZhciBjb250YWluZXIgPSB0aGlzLmdyYXBoLmNvbnRhaW5lcjsKKworCWlmIChjb250YWluZXIgIT0gbnVsbCkKKwl7CisJCXZhciB3aWR0aCA9IGNvbnRhaW5lci5vZmZzZXRXaWR0aDsKKwkJdmFyIGhlaWdodCA9IGNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7CisJCXRoaXMuY2FudmFzID0gdGhpcy5jcmVhdGVWbWxQYW5lKHdpZHRoLCBoZWlnaHQpOworCQl0aGlzLmNhbnZhcy5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOworCQkKKwkJdGhpcy5iYWNrZ3JvdW5kUGFuZSA9IHRoaXMuY3JlYXRlVm1sUGFuZSh3aWR0aCwgaGVpZ2h0KTsKKwkJdGhpcy5kcmF3UGFuZSA9IHRoaXMuY3JlYXRlVm1sUGFuZSh3aWR0aCwgaGVpZ2h0KTsKKwkJdGhpcy5vdmVybGF5UGFuZSA9IHRoaXMuY3JlYXRlVm1sUGFuZSh3aWR0aCwgaGVpZ2h0KTsKKwkJdGhpcy5kZWNvcmF0b3JQYW5lID0gdGhpcy5jcmVhdGVWbWxQYW5lKHdpZHRoLCBoZWlnaHQpOworCQkKKwkJdGhpcy5jYW52YXMuYXBwZW5kQ2hpbGQodGhpcy5iYWNrZ3JvdW5kUGFuZSk7CisJCXRoaXMuY2FudmFzLmFwcGVuZENoaWxkKHRoaXMuZHJhd1BhbmUpOworCQl0aGlzLmNhbnZhcy5hcHBlbmRDaGlsZCh0aGlzLm92ZXJsYXlQYW5lKTsKKwkJdGhpcy5jYW52YXMuYXBwZW5kQ2hpbGQodGhpcy5kZWNvcmF0b3JQYW5lKTsKKwkJCisJCWNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNhbnZhcyk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlVm1sUGFuZQorICogCisgKiBDcmVhdGVzIGEgZHJhd2luZyBwYW5lIGluIFZNTCAoZ3JvdXApLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuY3JlYXRlVm1sUGFuZSA9IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpCit7CisJdmFyIHBhbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG14Q2xpZW50LlZNTF9QUkVGSVggKyAnOmdyb3VwJyk7CisJCisJLy8gQXQgdGhpcyBwb2ludCB0aGUgd2lkdGggYW5kIGhlaWdodCBhcmUgcG90ZW50aWFsbHkKKwkvLyB1bmluaXRpYWxpemVkLiBUaGF0J3MgT0suCisJcGFuZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisJcGFuZS5zdHlsZS5sZWZ0ID0gJzBweCc7CisJcGFuZS5zdHlsZS50b3AgPSAnMHB4JzsKKworCXBhbmUuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7CisJcGFuZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnOworCisJcGFuZS5zZXRBdHRyaWJ1dGUoJ2Nvb3Jkc2l6ZScsIHdpZHRoICsgJywnICsgaGVpZ2h0KTsKKwlwYW5lLnNldEF0dHJpYnV0ZSgnY29vcmRvcmlnaW4nLCAnMCwwJyk7CisJCisJcmV0dXJuIHBhbmU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGUKKyAqCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBET00gbm9kZXMgZm9yIHRoZSBTVkcgZGlzcGxheS4KKyAqLworbXhHcmFwaFZpZXcucHJvdG90eXBlLmNyZWF0ZVN2ZyA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgY29udGFpbmVyID0gdGhpcy5ncmFwaC5jb250YWluZXI7CisJdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobXhDb25zdGFudHMuTlNfU1ZHLCAnZycpOworCQorCS8vIEZvciBiYWNrZ3JvdW5kIGltYWdlCisJdGhpcy5iYWNrZ3JvdW5kUGFuZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhteENvbnN0YW50cy5OU19TVkcsICdnJyk7CisJdGhpcy5jYW52YXMuYXBwZW5kQ2hpbGQodGhpcy5iYWNrZ3JvdW5kUGFuZSk7CisKKwkvLyBBZGRzIHR3byBsYXllcnMgKGJhY2tncm91bmQgaXMgZWFybHkgZmVhdHVyZSkKKwl0aGlzLmRyYXdQYW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG14Q29uc3RhbnRzLk5TX1NWRywgJ2cnKTsKKwl0aGlzLmNhbnZhcy5hcHBlbmRDaGlsZCh0aGlzLmRyYXdQYW5lKTsKKworCXRoaXMub3ZlcmxheVBhbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobXhDb25zdGFudHMuTlNfU1ZHLCAnZycpOworCXRoaXMuY2FudmFzLmFwcGVuZENoaWxkKHRoaXMub3ZlcmxheVBhbmUpOworCQorCXRoaXMuZGVjb3JhdG9yUGFuZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhteENvbnN0YW50cy5OU19TVkcsICdnJyk7CisJdGhpcy5jYW52YXMuYXBwZW5kQ2hpbGQodGhpcy5kZWNvcmF0b3JQYW5lKTsKKwkKKwl2YXIgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhteENvbnN0YW50cy5OU19TVkcsICdzdmcnKTsKKwlyb290LnN0eWxlLndpZHRoID0gJzEwMCUnOworCXJvb3Quc3R5bGUuaGVpZ2h0ID0gJzEwMCUnOworCQorCS8vIE5PVEU6IEluIHN0YW5kYXJkcyBtb2RlLCB0aGUgU1ZHIG11c3QgaGF2ZSBibG9jayBsYXlvdXQKKwkvLyBpbiBvcmRlciBmb3IgdGhlIGNvbnRhaW5lciBESVYgdG8gbm90IHNob3cgc2Nyb2xsYmFycy4KKwlyb290LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOworCXJvb3QuYXBwZW5kQ2hpbGQodGhpcy5jYW52YXMpOworCQorCS8vIFdvcmthcm91bmQgZm9yIHNjcm9sbGJhcnMgaW4gSUUxMSBhbmQgYmVsb3cKKwlpZiAobXhDbGllbnQuSVNfSUUgfHwgbXhDbGllbnQuSVNfSUUxMSkKKwl7CisJCXJvb3Quc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKKwl9CisKKwlpZiAoY29udGFpbmVyICE9IG51bGwpCisJeworCQljb250YWluZXIuYXBwZW5kQ2hpbGQocm9vdCk7CisJCXRoaXMudXBkYXRlQ29udGFpbmVyU3R5bGUoY29udGFpbmVyKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1cGRhdGVDb250YWluZXJTdHlsZQorICogCisgKiBVcGRhdGVzIHRoZSBzdHlsZSBvZiB0aGUgY29udGFpbmVyIGFmdGVyIGluc3RhbGxpbmcgdGhlIFNWRyBET00gZWxlbWVudHMuCisgKi8KK214R3JhcGhWaWV3LnByb3RvdHlwZS51cGRhdGVDb250YWluZXJTdHlsZSA9IGZ1bmN0aW9uKGNvbnRhaW5lcikKK3sKKwkvLyBXb3JrYXJvdW5kIGZvciBvZmZzZXQgb2YgY29udGFpbmVyCisJdmFyIHN0eWxlID0gbXhVdGlscy5nZXRDdXJyZW50U3R5bGUoY29udGFpbmVyKTsKKwkKKwlpZiAoc3R5bGUgIT0gbnVsbCAmJiBzdHlsZS5wb3NpdGlvbiA9PSAnc3RhdGljJykKKwl7CisJCWNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CisJfQorCQorCS8vIERpc2FibGVzIGJ1aWx0LWluIHBhbiBhbmQgem9vbSBpbiBJRTEwIGFuZCBsYXRlcgorCWlmIChteENsaWVudC5JU19QT0lOVEVSKQorCXsKKwkJY29udGFpbmVyLnN0eWxlLnRvdWNoQWN0aW9uID0gJ25vbmUnOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqIAorICogRGVzdHJveXMgdGhlIHZpZXcgYW5kIGFsbCBpdHMgcmVzb3VyY2VzLgorICovCitteEdyYXBoVmlldy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgcm9vdCA9ICh0aGlzLmNhbnZhcyAhPSBudWxsKSA/IHRoaXMuY2FudmFzLm93bmVyU1ZHRWxlbWVudCA6IG51bGw7CisJCisJaWYgKHJvb3QgPT0gbnVsbCkKKwl7CisJCXJvb3QgPSB0aGlzLmNhbnZhczsKKwl9CisJCisJaWYgKHJvb3QgIT0gbnVsbCAmJiByb290LnBhcmVudE5vZGUgIT0gbnVsbCkKKwl7CisJCXRoaXMuY2xlYXIodGhpcy5jdXJyZW50Um9vdCwgdHJ1ZSk7CisJCW14RXZlbnQucmVtb3ZlR2VzdHVyZUxpc3RlbmVycyhkb2N1bWVudCwgbnVsbCwgdGhpcy5tb3ZlSGFuZGxlciwgdGhpcy5lbmRIYW5kbGVyKTsKKwkJbXhFdmVudC5yZWxlYXNlKHRoaXMuZ3JhcGguY29udGFpbmVyKTsKKwkJcm9vdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJvb3QpOworCQkKKwkJdGhpcy5tb3ZlSGFuZGxlciA9IG51bGw7CisJCXRoaXMuZW5kSGFuZGxlciA9IG51bGw7CisJCXRoaXMuY2FudmFzID0gbnVsbDsKKwkJdGhpcy5iYWNrZ3JvdW5kUGFuZSA9IG51bGw7CisJCXRoaXMuZHJhd1BhbmUgPSBudWxsOworCQl0aGlzLm92ZXJsYXlQYW5lID0gbnVsbDsKKwkJdGhpcy5kZWNvcmF0b3JQYW5lID0gbnVsbDsKKwl9Cit9OworCisvKioKKyAqIENsYXNzOiBteEN1cnJlbnRSb290Q2hhbmdlCisgKgorICogQWN0aW9uIHRvIGNoYW5nZSB0aGUgY3VycmVudCByb290IGluIGEgdmlldy4KKyAqCisgKiBDb25zdHJ1Y3RvcjogbXhDdXJyZW50Um9vdENoYW5nZQorICoKKyAqIENvbnN0cnVjdHMgYSBjaGFuZ2Ugb2YgdGhlIGN1cnJlbnQgcm9vdCBpbiB0aGUgZ2l2ZW4gdmlldy4KKyAqLworZnVuY3Rpb24gbXhDdXJyZW50Um9vdENoYW5nZSh2aWV3LCByb290KQoreworCXRoaXMudmlldyA9IHZpZXc7CisJdGhpcy5yb290ID0gcm9vdDsKKwl0aGlzLnByZXZpb3VzID0gcm9vdDsKKwl0aGlzLmlzVXAgPSByb290ID09IG51bGw7CisJCisJaWYgKCF0aGlzLmlzVXApCisJeworCQl2YXIgdG1wID0gdGhpcy52aWV3LmN1cnJlbnRSb290OworCQl2YXIgbW9kZWwgPSB0aGlzLnZpZXcuZ3JhcGguZ2V0TW9kZWwoKTsKKwkJCisJCXdoaWxlICh0bXAgIT0gbnVsbCkKKwkJeworCQkJaWYgKHRtcCA9PSByb290KQorCQkJeworCQkJCXRoaXMuaXNVcCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCXRtcCA9IG1vZGVsLmdldFBhcmVudCh0bXApOworCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZXhlY3V0ZQorICoKKyAqIENoYW5nZXMgdGhlIGN1cnJlbnQgcm9vdCBvZiB0aGUgdmlldy4KKyAqLworbXhDdXJyZW50Um9vdENoYW5nZS5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgdG1wID0gdGhpcy52aWV3LmN1cnJlbnRSb290OworCXRoaXMudmlldy5jdXJyZW50Um9vdCA9IHRoaXMucHJldmlvdXM7CisJdGhpcy5wcmV2aW91cyA9IHRtcDsKKworCXZhciB0cmFuc2xhdGUgPSB0aGlzLnZpZXcuZ3JhcGguZ2V0VHJhbnNsYXRlRm9yUm9vdCh0aGlzLnZpZXcuY3VycmVudFJvb3QpOworCQorCWlmICh0cmFuc2xhdGUgIT0gbnVsbCkKKwl7CisJCXRoaXMudmlldy50cmFuc2xhdGUgPSBuZXcgbXhQb2ludCgtdHJhbnNsYXRlLngsIC10cmFuc2xhdGUueSk7CisJfQorCisJaWYgKHRoaXMuaXNVcCkKKwl7CisJCXRoaXMudmlldy5jbGVhcih0aGlzLnZpZXcuY3VycmVudFJvb3QsIHRydWUpOworCQl0aGlzLnZpZXcudmFsaWRhdGUoKTsKKwl9CisJZWxzZQorCXsKKwkJdGhpcy52aWV3LnJlZnJlc2goKTsKKwl9CisJCisJdmFyIG5hbWUgPSAodGhpcy5pc1VwKSA/IG14RXZlbnQuVVAgOiBteEV2ZW50LkRPV047CisJdGhpcy52aWV3LmZpcmVFdmVudChuZXcgbXhFdmVudE9iamVjdChuYW1lLAorCQkncm9vdCcsIHRoaXMudmlldy5jdXJyZW50Um9vdCwgJ3ByZXZpb3VzJywgdGhpcy5wcmV2aW91cykpOworCXRoaXMuaXNVcCA9ICF0aGlzLmlzVXA7Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3ZpZXcvbXhMYXlvdXRNYW5hZ2VyLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3ZpZXcvbXhMYXlvdXRNYW5hZ2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NmFmODQKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teExheW91dE1hbmFnZXIuanMKQEAgLTAsMCArMSw0MDkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEpHcmFwaCBMdGQKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBHYXVkZW56IEFsZGVyCisgKi8KKy8qKgorICogQ2xhc3M6IG14TGF5b3V0TWFuYWdlcgorICogCisgKiBJbXBsZW1lbnRzIGEgbGF5b3V0IG1hbmFnZXIgdGhhdCBydW5zIGEgZ2l2ZW4gbGF5b3V0IGFmdGVyIGFueSBjaGFuZ2VzIHRvIHRoZSBncmFwaDoKKyAqIAorICogRXhhbXBsZToKKyAqIAorICogKGNvZGUpCisgKiB2YXIgbGF5b3V0TWdyID0gbmV3IG14TGF5b3V0TWFuYWdlcihncmFwaCk7CisgKiBsYXlvdXRNZ3IuZ2V0TGF5b3V0ID0gZnVuY3Rpb24oY2VsbCkKKyAqIHsKKyAqICAgcmV0dXJuIGxheW91dDsKKyAqIH07CisgKiAoZW5kKQorICogCisgKiBFdmVudDogbXhFdmVudC5MQVlPVVRfQ0VMTFMKKyAqIAorICogRmlyZXMgYmV0d2VlbiBiZWdpbi0gYW5kIGVuZFVwZGF0ZSBhZnRlciBhbGwgY2VsbHMgaGF2ZSBiZWVuIGxheW91dGVkIGluCisgKiA8bGF5b3V0Q2VsbHM+LiBUaGUgPGNvZGU+Y2VsbHM8L2NvZGU+IHByb3BlcnR5IGNvbnRhaW5zIGFsbCBjZWxscyB0aGF0IGhhdmUKKyAqIGJlZW4gcGFzc2VkIHRvIDxsYXlvdXRDZWxscz4uCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteExheW91dE1hbmFnZXIKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IGF1dG9tYXRpYyBsYXlvdXQgZm9yIHRoZSBnaXZlbiBncmFwaC4KKyAqCisgKiBBcmd1bWVudHM6CisgKiAKKyAqIGdyYXBoIC0gUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgZ3JhcGguIAorICovCitmdW5jdGlvbiBteExheW91dE1hbmFnZXIoZ3JhcGgpCit7CisJLy8gRXhlY3V0ZXMgdGhlIGxheW91dCBiZWZvcmUgdGhlIGNoYW5nZXMgYXJlIGRpc3BhdGNoZWQKKwl0aGlzLnVuZG9IYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorCXsKKwkJaWYgKHRoaXMuaXNFbmFibGVkKCkpCisJCXsKKwkJCXRoaXMuYmVmb3JlVW5kbyhldnQuZ2V0UHJvcGVydHkoJ2VkaXQnKSk7CisJCX0KKwl9KTsKKwkKKwkvLyBOb3RpZmllcyB0aGUgbGF5b3V0IG9mIGEgbW92ZSBvcGVyYXRpb24gaW5zaWRlIGEgcGFyZW50CisJdGhpcy5tb3ZlSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihzZW5kZXIsIGV2dCkKKwl7CisJCWlmICh0aGlzLmlzRW5hYmxlZCgpKQorCQl7CisJCQl0aGlzLmNlbGxzTW92ZWQoZXZ0LmdldFByb3BlcnR5KCdjZWxscycpLCBldnQuZ2V0UHJvcGVydHkoJ2V2ZW50JykpOworCQl9CisJfSk7CisJCisJdGhpcy5zZXRHcmFwaChncmFwaCk7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhFdmVudFNvdXJjZS4KKyAqLworbXhMYXlvdXRNYW5hZ2VyLnByb3RvdHlwZSA9IG5ldyBteEV2ZW50U291cmNlKCk7CitteExheW91dE1hbmFnZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbXhMYXlvdXRNYW5hZ2VyOworCisvKioKKyAqIFZhcmlhYmxlOiBncmFwaAorICogCisgKiBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKi8KK214TGF5b3V0TWFuYWdlci5wcm90b3R5cGUuZ3JhcGggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBidWJibGluZworICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIGxheW91dCBzaG91bGQgYnViYmxlIGFsb25nCisgKiB0aGUgY2VsbCBoaWVyYXJjaHkuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhMYXlvdXRNYW5hZ2VyLnByb3RvdHlwZS5idWJibGluZyA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIGV2ZW50IGhhbmRsaW5nIGlzIGVuYWJsZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhMYXlvdXRNYW5hZ2VyLnByb3RvdHlwZS5lbmFibGVkID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogdXBkYXRlSGFuZGxlcgorICogCisgKiBIb2xkcyB0aGUgZnVuY3Rpb24gdGhhdCBoYW5kbGVzIHRoZSBlbmRVcGRhdGUgZXZlbnQuCisgKi8KK214TGF5b3V0TWFuYWdlci5wcm90b3R5cGUudXBkYXRlSGFuZGxlciA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IG1vdmVIYW5kbGVyCisgKiAKKyAqIEhvbGRzIHRoZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgdGhlIG1vdmUgZXZlbnQuCisgKi8KK214TGF5b3V0TWFuYWdlci5wcm90b3R5cGUubW92ZUhhbmRsZXIgPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0VuYWJsZWQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIGV2ZW50cyBhcmUgaGFuZGxlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICogcmV0dXJucyA8ZW5hYmxlZD4uCisgKi8KK214TGF5b3V0TWFuYWdlci5wcm90b3R5cGUuaXNFbmFibGVkID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLmVuYWJsZWQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRFbmFibGVkCisgKiAKKyAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgZXZlbnQgaGFuZGxpbmcuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIHVwZGF0ZXMgPGVuYWJsZWQ+LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBlbmFibGVkIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyB0aGUgbmV3IGVuYWJsZWQgc3RhdGUuCisgKi8KK214TGF5b3V0TWFuYWdlci5wcm90b3R5cGUuc2V0RW5hYmxlZCA9IGZ1bmN0aW9uKGVuYWJsZWQpCit7CisJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQnViYmxpbmcKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIGEgbGF5b3V0IHNob3VsZCBidWJibGUsIHRoYXQgaXMsIGlmIHRoZSBwYXJlbnQgbGF5b3V0CisgKiBzaG91bGQgYmUgZXhlY3V0ZWQgd2hlbmV2ZXIgYSBjZWxsIGxheW91dCAobGF5b3V0IG9mIHRoZSBjaGlsZHJlbiBvZgorICogYSBjZWxsKSBoYXMgYmVlbiBleGVjdXRlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxidWJibGluZz4uCisgKi8KK214TGF5b3V0TWFuYWdlci5wcm90b3R5cGUuaXNCdWJibGluZyA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5idWJibGluZzsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEJ1YmJsaW5nCisgKiAKKyAqIFNldHMgPGJ1YmJsaW5nPi4KKyAqLworbXhMYXlvdXRNYW5hZ2VyLnByb3RvdHlwZS5zZXRCdWJibGluZyA9IGZ1bmN0aW9uKHZhbHVlKQoreworCXRoaXMuYnViYmxpbmcgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEdyYXBoCisgKiAKKyAqIFJldHVybnMgdGhlIGdyYXBoIHRoYXQgdGhpcyBsYXlvdXQgb3BlcmF0ZXMgb24uCisgKi8KK214TGF5b3V0TWFuYWdlci5wcm90b3R5cGUuZ2V0R3JhcGggPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuZ3JhcGg7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRHcmFwaAorICogCisgKiBTZXRzIHRoZSBncmFwaCB0aGF0IHRoZSBsYXlvdXRzIG9wZXJhdGUgb24uCisgKi8KK214TGF5b3V0TWFuYWdlci5wcm90b3R5cGUuc2V0R3JhcGggPSBmdW5jdGlvbihncmFwaCkKK3sKKwlpZiAodGhpcy5ncmFwaCAhPSBudWxsKQorCXsKKwkJdmFyIG1vZGVsID0gdGhpcy5ncmFwaC5nZXRNb2RlbCgpOwkJCisJCW1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMudW5kb0hhbmRsZXIpOworCQl0aGlzLmdyYXBoLnJlbW92ZUxpc3RlbmVyKHRoaXMubW92ZUhhbmRsZXIpOworCX0KKwkKKwl0aGlzLmdyYXBoID0gZ3JhcGg7CisJCisJaWYgKHRoaXMuZ3JhcGggIT0gbnVsbCkKKwl7CisJCXZhciBtb2RlbCA9IHRoaXMuZ3JhcGguZ2V0TW9kZWwoKTsJCisJCW1vZGVsLmFkZExpc3RlbmVyKG14RXZlbnQuQkVGT1JFX1VORE8sIHRoaXMudW5kb0hhbmRsZXIpOworCQl0aGlzLmdyYXBoLmFkZExpc3RlbmVyKG14RXZlbnQuTU9WRV9DRUxMUywgdGhpcy5tb3ZlSGFuZGxlcik7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0TGF5b3V0CisgKiAKKyAqIFJldHVybnMgdGhlIGxheW91dCB0byBiZSBleGVjdXRlZCBmb3IgdGhlIGdpdmVuIGdyYXBoIGFuZCBwYXJlbnQuCisgKi8KK214TGF5b3V0TWFuYWdlci5wcm90b3R5cGUuZ2V0TGF5b3V0ID0gZnVuY3Rpb24ocGFyZW50KQoreworCXJldHVybiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogYmVmb3JlVW5kbworICogCisgKiBDYWxsZWQgZnJvbSB0aGUgdW5kb0hhbmRsZXIuCisgKgorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIEFycmF5IG9mIDxteENlbGxzPiB0aGF0IGhhdmUgYmVlbiBtb3ZlZC4KKyAqIGV2dCAtIE1vdXNlIGV2ZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgbW91c2Vkb3duLgorICovCitteExheW91dE1hbmFnZXIucHJvdG90eXBlLmJlZm9yZVVuZG8gPSBmdW5jdGlvbih1bmRvYWJsZUVkaXQpCit7CisJdmFyIGNlbGxzID0gdGhpcy5nZXRDZWxsc0ZvckNoYW5nZXModW5kb2FibGVFZGl0LmNoYW5nZXMpOworCXZhciBtb2RlbCA9IHRoaXMuZ2V0R3JhcGgoKS5nZXRNb2RlbCgpOworCisJLy8gQWRkcyBhbGwgZGVzY2VuZGFudHMKKwl2YXIgdG1wID0gW107CisJCisJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwl7CisJCXRtcCA9IHRtcC5jb25jYXQobW9kZWwuZ2V0RGVzY2VuZGFudHMoY2VsbHNbaV0pKTsKKwl9CisJCisJY2VsbHMgPSB0bXA7CisJCisJLy8gQWRkcyBhbGwgcGFyZW50IGFuY2VzdG9ycworCWlmICh0aGlzLmlzQnViYmxpbmcoKSkKKwl7CisJCXRtcCA9IG1vZGVsLmdldFBhcmVudHMoY2VsbHMpOworCQkKKwkJd2hpbGUgKHRtcC5sZW5ndGggPiAwKQorCQl7CisJCQljZWxscyA9IGNlbGxzLmNvbmNhdCh0bXApOworCQkJdG1wID0gbW9kZWwuZ2V0UGFyZW50cyh0bXApOworCQl9CisJfQorCQorCXRoaXMuZXhlY3V0ZUxheW91dEZvckNlbGxzKGNlbGxzKTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGV4ZWN1dGVMYXlvdXQKKyAqIAorICogRXhlY3V0ZXMgdGhlIGdpdmVuIGxheW91dCBvbiB0aGUgZ2l2ZW4gcGFyZW50LgorICovCitteExheW91dE1hbmFnZXIucHJvdG90eXBlLmV4ZWN1dGVMYXlvdXRGb3JDZWxscyA9IGZ1bmN0aW9uKGNlbGxzKQoreworCS8vIEFkZHMgcmV2ZXJzZSB0byB0aGlzIGFycmF5IHRvIGF2b2lkIGR1cGxpY2F0ZSBleGVjdXRpb24gb2YgbGVhZmVzCisJLy8gV29ya3MgbGlrZSBjYXB0dXJlL2J1YmJsZSBmb3IgZXZlbnRzLCBmaXJzdCBleGVjdXRlcyBhbGwgbGF5b3V0CisJLy8gZnJvbSB0b3AgdG8gYm90dG9tIGFuZCBpbiByZXZlcnNlIG9yZGVyIGFuZCByZW1vdmVzIGR1cGxpY2F0ZXMuCisJdmFyIHNvcnRlZCA9IG14VXRpbHMuc29ydENlbGxzKGNlbGxzLCB0cnVlKTsKKwlzb3J0ZWQgPSBzb3J0ZWQuY29uY2F0KHNvcnRlZC5zbGljZSgpLnJldmVyc2UoKSk7CisJdGhpcy5sYXlvdXRDZWxscyhzb3J0ZWQpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY2VsbHNNb3ZlZAorICogCisgKiBDYWxsZWQgZnJvbSB0aGUgbW92ZUhhbmRsZXIuCisgKgorICogUGFyYW1ldGVyczoKKyAqIAorICogY2VsbCAtIEFycmF5IG9mIDxteENlbGxzPiB0aGF0IGhhdmUgYmVlbiBtb3ZlZC4KKyAqIGV2dCAtIE1vdXNlIGV2ZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgbW91c2Vkb3duLgorICovCitteExheW91dE1hbmFnZXIucHJvdG90eXBlLmNlbGxzTW92ZWQgPSBmdW5jdGlvbihjZWxscywgZXZ0KQoreworCWlmIChjZWxscyAhPSBudWxsICYmIGV2dCAhPSBudWxsKQorCXsKKwkJdmFyIHBvaW50ID0gbXhVdGlscy5jb252ZXJ0UG9pbnQodGhpcy5nZXRHcmFwaCgpLmNvbnRhaW5lciwKKwkJCW14RXZlbnQuZ2V0Q2xpZW50WChldnQpLCBteEV2ZW50LmdldENsaWVudFkoZXZ0KSk7CisJCXZhciBtb2RlbCA9IHRoaXMuZ2V0R3JhcGgoKS5nZXRNb2RlbCgpOworCQkKKwkJLy8gQ2hlY2tzIGlmIGEgbGF5b3V0IGV4aXN0cyB0byB0YWtlIGNhcmUgb2YgdGhlIG1vdmluZyBpZiB0aGUKKwkJLy8gcGFyZW50IGl0c2VsZiBpcyBub3QgYmVpbmcgbW92ZWQKKwkJZm9yICh2YXIgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykKKwkJeworCQkJdmFyIHBhcmVudCA9IG1vZGVsLmdldFBhcmVudChjZWxsc1tpXSk7CisJCQkKKwkJCWlmIChteFV0aWxzLmluZGV4T2YoY2VsbHMsIHBhcmVudCkgPCAwKQorCQkJeworCQkJCXZhciBsYXlvdXQgPSB0aGlzLmdldExheW91dChwYXJlbnQpOworCQorCQkJCWlmIChsYXlvdXQgIT0gbnVsbCkKKwkJCQl7CisJCQkJCWxheW91dC5tb3ZlQ2VsbChjZWxsc1tpXSwgcG9pbnQueCwgcG9pbnQueSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q2VsbHNGb3JFZGl0CisgKiAKKyAqIFJldHVybnMgdGhlIGNlbGxzIHRvIGJlIGxheW91dGVkIGZvciB0aGUgZ2l2ZW4gc2VxdWVuY2Ugb2YgY2hhbmdlcy4KKyAqLworbXhMYXlvdXRNYW5hZ2VyLnByb3RvdHlwZS5nZXRDZWxsc0ZvckNoYW5nZXMgPSBmdW5jdGlvbihjaGFuZ2VzKQoreworCXZhciBkaWN0ID0gbmV3IG14RGljdGlvbmFyeSgpOworCXZhciByZXN1bHQgPSBbXTsKKwkKKwlmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspCisJeworCQl2YXIgY2hhbmdlID0gY2hhbmdlc1tpXTsKKwkJCisJCWlmIChjaGFuZ2UgaW5zdGFuY2VvZiBteFJvb3RDaGFuZ2UpCisJCXsKKwkJCXJldHVybiBbXTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXZhciBjZWxscyA9IHRoaXMuZ2V0Q2VsbHNGb3JDaGFuZ2UoY2hhbmdlKTsKKwkJCQorCQkJZm9yICh2YXIgaiA9IDA7IGogPCBjZWxscy5sZW5ndGg7IGorKykKKwkJCXsKKwkJCQlpZiAoY2VsbHNbal0gIT0gbnVsbCAmJiAhZGljdC5nZXQoY2VsbHNbal0pKQorCQkJCXsKKwkJCQkJZGljdC5wdXQoY2VsbHNbal0sIHRydWUpOworCQkJCQlyZXN1bHQucHVzaChjZWxsc1tqXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDZWxsc0ZvckNoYW5nZQorICogCisgKiBFeGVjdXRlcyBhbGwgbGF5b3V0cyB3aGljaCBoYXZlIGJlZW4gc2NoZWR1bGVkIGR1cmluZyB0aGUKKyAqIGNoYW5nZXMuCisgKi8KK214TGF5b3V0TWFuYWdlci5wcm90b3R5cGUuZ2V0Q2VsbHNGb3JDaGFuZ2UgPSBmdW5jdGlvbihjaGFuZ2UpCit7CisJdmFyIG1vZGVsID0gdGhpcy5nZXRHcmFwaCgpLmdldE1vZGVsKCk7CisJCisJaWYgKGNoYW5nZSBpbnN0YW5jZW9mIG14Q2hpbGRDaGFuZ2UpCisJeworCQlyZXR1cm4gW2NoYW5nZS5jaGlsZCwgY2hhbmdlLnByZXZpb3VzLCBtb2RlbC5nZXRQYXJlbnQoY2hhbmdlLmNoaWxkKV07CisJfQorCWVsc2UgaWYgKGNoYW5nZSBpbnN0YW5jZW9mIG14VGVybWluYWxDaGFuZ2UgfHwgY2hhbmdlIGluc3RhbmNlb2YgbXhHZW9tZXRyeUNoYW5nZSkKKwl7CisJCXJldHVybiBbY2hhbmdlLmNlbGwsIG1vZGVsLmdldFBhcmVudChjaGFuZ2UuY2VsbCldOworCX0KKwllbHNlIGlmIChjaGFuZ2UgaW5zdGFuY2VvZiBteFZpc2libGVDaGFuZ2UgfHwgY2hhbmdlIGluc3RhbmNlb2YgbXhTdHlsZUNoYW5nZSkKKwl7CisJCXJldHVybiBbY2hhbmdlLmNlbGxdOworCX0KKwkKKwlyZXR1cm4gW107Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBsYXlvdXRDZWxscworICogCisgKiBFeGVjdXRlcyBhbGwgbGF5b3V0cyB3aGljaCBoYXZlIGJlZW4gc2NoZWR1bGVkIGR1cmluZyB0aGUKKyAqIGNoYW5nZXMuCisgKi8KK214TGF5b3V0TWFuYWdlci5wcm90b3R5cGUubGF5b3V0Q2VsbHMgPSBmdW5jdGlvbihjZWxscykKK3sKKwlpZiAoY2VsbHMubGVuZ3RoID4gMCkKKwl7CisJCS8vIEludm9rZXMgdGhlIGxheW91dHMgd2hpbGUgcmVtb3ZpbmcgZHVwbGljYXRlcworCQl2YXIgbW9kZWwgPSB0aGlzLmdldEdyYXBoKCkuZ2V0TW9kZWwoKTsKKwkJCisJCW1vZGVsLmJlZ2luVXBkYXRlKCk7CisJCXRyeSAKKwkJeworCQkJdmFyIGxhc3QgPSBudWxsOworCQkJCisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCWlmIChjZWxsc1tpXSAhPSBtb2RlbC5nZXRSb290KCkgJiYgY2VsbHNbaV0gIT0gbGFzdCkKKwkJCQl7CisJCQkJCWlmICh0aGlzLmV4ZWN1dGVMYXlvdXQodGhpcy5nZXRMYXlvdXQoY2VsbHNbaV0pLCBjZWxsc1tpXSkpCisJCQkJCXsKKwkJCQkJCWxhc3QgPSBjZWxsc1tpXTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQorCQkJdGhpcy5maXJlRXZlbnQobmV3IG14RXZlbnRPYmplY3QobXhFdmVudC5MQVlPVVRfQ0VMTFMsICdjZWxscycsIGNlbGxzKSk7CisJCX0KKwkJZmluYWxseQorCQl7CisJCQltb2RlbC5lbmRVcGRhdGUoKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGV4ZWN1dGVMYXlvdXQKKyAqIAorICogRXhlY3V0ZXMgdGhlIGdpdmVuIGxheW91dCBvbiB0aGUgZ2l2ZW4gcGFyZW50LgorICovCitteExheW91dE1hbmFnZXIucHJvdG90eXBlLmV4ZWN1dGVMYXlvdXQgPSBmdW5jdGlvbihsYXlvdXQsIHBhcmVudCkKK3sKKwl2YXIgcmVzdWx0ID0gZmFsc2U7CisJCisJaWYgKGxheW91dCAhPSBudWxsICYmIHBhcmVudCAhPSBudWxsKQorCXsKKwkJbGF5b3V0LmV4ZWN1dGUocGFyZW50KTsKKwkJcmVzdWx0ID0gdHJ1ZTsKKwl9CisJCisJcmV0dXJuIHJlc3VsdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqIAorICogUmVtb3ZlcyBhbGwgaGFuZGxlcnMgZnJvbSB0aGUgPGdyYXBoPiBhbmQgZGVsZXRlcyB0aGUgcmVmZXJlbmNlIHRvIGl0LgorICovCitteExheW91dE1hbmFnZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpCit7CisJdGhpcy5zZXRHcmFwaChudWxsKTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teE11bHRpcGxpY2l0eS5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214TXVsdGlwbGljaXR5LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMGUwYjkKLS0tIC9kZXYvbnVsbAorKysgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teE11bHRpcGxpY2l0eS5qcwpAQCAtMCwwICsxLDI1NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhNdWx0aXBsaWNpdHkKKyAqIAorICogRGVmaW5lcyBpbnZhbGlkIGNvbm5lY3Rpb25zIGFsb25nIHdpdGggdGhlIGVycm9yIG1lc3NhZ2VzIHRoYXQgdGhleSBwcm9kdWNlLgorICogVG8gYWRkIG9yIHJlbW92ZSBydWxlcyBvbiBhIGdyYXBoLCB5b3UgbXVzdCBhZGQvcmVtb3ZlIGluc3RhbmNlcyBvZiB0aGlzCisgKiBjbGFzcyB0byA8bXhHcmFwaC5tdWx0aXBsaWNpdGllcz4uCisgKiAKKyAqIEV4YW1wbGU6CisgKiAKKyAqIChjb2RlKQorICogZ3JhcGgubXVsdGlwbGljaXRpZXMucHVzaChuZXcgbXhNdWx0aXBsaWNpdHkoCisgKiAgIHRydWUsICdyZWN0YW5nbGUnLCBudWxsLCBudWxsLCAwLCAyLCBbJ2NpcmNsZSddLAorICogICAnT25seSAyIHRhcmdldHMgYWxsb3dlZCcsCisgKiAgICdPbmx5IGNpcmNsZSB0YXJnZXRzIGFsbG93ZWQnKSk7CisgKiAoZW5kKQorICogCisgKiBEZWZpbmVzIGEgcnVsZSB3aGVyZSBlYWNoIHJlY3RhbmdsZSBtdXN0IGJlIGNvbm5lY3RlZCB0byBubyBtb3JlIHRoYW4gMgorICogY2lyY2xlcyBhbmQgbm8gb3RoZXIgdHlwZXMgb2YgdGFyZ2V0cyBhcmUgYWxsb3dlZC4KKyAqIAorICogQ29uc3RydWN0b3I6IG14TXVsdGlwbGljaXR5CisgKiAKKyAqIEluc3RhbnRpYXRlIGNsYXNzIG14TXVsdGlwbGljaXR5IGluIG9yZGVyIHRvIGRlc2NyaWJlIGFsbG93ZWQKKyAqIGNvbm5lY3Rpb25zIGluIGEgZ3JhcGguIE5vdCBhbGwgY29uc3RyYWludHMgY2FuIGJlIGVuZm9yY2VkIHdoaWxlCisgKiBlZGl0aW5nLCBzb21lIG11c3QgYmUgY2hlY2tlZCBhdCB2YWxpZGF0aW9uIHRpbWUuIFRoZSA8Y291bnRFcnJvcj4gYW5kCisgKiA8dHlwZUVycm9yPiBhcmUgdHJlYXRlZCBhcyByZXNvdXJjZSBrZXlzIGluIDxteFJlc291cmNlcz4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHNvdXJjZSAtIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGlzIHJ1bGUgYXBwbGllcyB0byB0aGUgc291cmNlIG9yIHRhcmdldAorICogdGVybWluYWwuCisgKiB0eXBlIC0gVHlwZSBvZiB0aGUgc291cmNlIG9yIHRhcmdldCB0ZXJtaW5hbCB0aGF0IHRoaXMgcnVsZSBhcHBsaWVzIHRvLgorICogU2VlIDx0eXBlPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqIGF0dHIgLSBPcHRpb25hbCBhdHRyaWJ1dGUgbmFtZSB0byBtYXRjaCB0aGUgc291cmNlIG9yIHRhcmdldCB0ZXJtaW5hbC4KKyAqIHZhbHVlIC0gT3B0aW9uYWwgYXR0cmlidXRlIHZhbHVlIHRvIG1hdGNoIHRoZSBzb3VyY2Ugb3IgdGFyZ2V0IHRlcm1pbmFsLgorICogbWluIC0gTWluaW11bSBudW1iZXIgb2YgZWRnZXMgZm9yIHRoaXMgcnVsZS4gRGVmYXVsdCBpcyAxLgorICogbWF4IC0gTWF4aW11bSBudW1iZXIgb2YgZWRnZXMgZm9yIHRoaXMgcnVsZS4gbiBtZWFucyBpbmZpbml0ZS4gRGVmYXVsdAorICogaXMgbi4KKyAqIHZhbGlkTmVpZ2hib3JzIC0gQXJyYXkgb2YgdHlwZXMgb2YgdGhlIG9wcG9zaXRlIHRlcm1pbmFsIGZvciB3aGljaCB0aGlzCisgKiBydWxlIGFwcGxpZXMuCisgKiBjb3VudEVycm9yIC0gRXJyb3IgdG8gYmUgZGlzcGxheWVkIGZvciBpbnZhbGlkIG51bWJlciBvZiBlZGdlcy4KKyAqIHR5cGVFcnJvciAtIEVycm9yIHRvIGJlIGRpc3BsYXllZCBmb3IgaW52YWxpZCBvcHBvc2l0ZSB0ZXJtaW5hbHMuCisgKiB2YWxpZE5laWdoYm9yc0FsbG93ZWQgLSBPcHRpb25hbCBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGFycmF5IG9mCisgKiBvcHBvc2l0ZSB0eXBlcyBzaG91bGQgYmUgdmFsaWQgb3IgaW52YWxpZC4KKyAqLworZnVuY3Rpb24gbXhNdWx0aXBsaWNpdHkoc291cmNlLCB0eXBlLCBhdHRyLCB2YWx1ZSwgbWluLCBtYXgsCisJdmFsaWROZWlnaGJvcnMsIGNvdW50RXJyb3IsIHR5cGVFcnJvciwgdmFsaWROZWlnaGJvcnNBbGxvd2VkKQoreworCXRoaXMuc291cmNlID0gc291cmNlOworCXRoaXMudHlwZSA9IHR5cGU7CisJdGhpcy5hdHRyID0gYXR0cjsKKwl0aGlzLnZhbHVlID0gdmFsdWU7CisJdGhpcy5taW4gPSAobWluICE9IG51bGwpID8gbWluIDogMDsKKwl0aGlzLm1heCA9IChtYXggIT0gbnVsbCkgPyBtYXggOiAnbic7CisJdGhpcy52YWxpZE5laWdoYm9ycyA9IHZhbGlkTmVpZ2hib3JzOworCXRoaXMuY291bnRFcnJvciA9IG14UmVzb3VyY2VzLmdldChjb3VudEVycm9yKSB8fCBjb3VudEVycm9yOworCXRoaXMudHlwZUVycm9yID0gbXhSZXNvdXJjZXMuZ2V0KHR5cGVFcnJvcikgfHwgdHlwZUVycm9yOworCXRoaXMudmFsaWROZWlnaGJvcnNBbGxvd2VkID0gKHZhbGlkTmVpZ2hib3JzQWxsb3dlZCAhPSBudWxsKSA/CisJCXZhbGlkTmVpZ2hib3JzQWxsb3dlZCA6IHRydWU7Cit9OworCisvKioKKyAqIFZhcmlhYmxlOiB0eXBlCisgKiAKKyAqIERlZmluZXMgdGhlIHR5cGUgb2YgdGhlIHNvdXJjZSBvciB0YXJnZXQgdGVybWluYWwuIFRoZSB0eXBlIGlzIGEgc3RyaW5nCisgKiBwYXNzZWQgdG8gPG14VXRpbHMuaXNOb2RlPiB0b2dldGhlciB3aXRoIHRoZSBzb3VyY2Ugb3IgdGFyZ2V0IHZlcnRleAorICogdmFsdWUgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LgorICovCitteE11bHRpcGxpY2l0eS5wcm90b3R5cGUudHlwZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGF0dHIKKyAqIAorICogT3B0aW9uYWwgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBhdHRyaWJ1dGVuYW1lIHRvIGJlIHBhc3NlZCB0bworICogPG14VXRpbHMuaXNOb2RlPiB0byBjaGVjayBpZiB0aGUgcnVsZSBhcHBsaWVzIHRvIGEgY2VsbC4KKyAqLworbXhNdWx0aXBsaWNpdHkucHJvdG90eXBlLmF0dHIgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiB2YWx1ZQorICogCisgKiBPcHRpb25hbCBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgdG8gYmUgcGFzc2VkCisgKiB0byA8bXhVdGlscy5pc05vZGU+IHRvIGNoZWNrIGlmIHRoZSBydWxlIGFwcGxpZXMgdG8gYSBjZWxsLgorICovCitteE11bHRpcGxpY2l0eS5wcm90b3R5cGUudmFsdWUgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzb3VyY2UKKyAqIAorICogQm9vbGVhbiB0aGF0IHNwZWNpZmllcyBpZiB0aGUgcnVsZSBpcyBhcHBsaWVkIHRvIHRoZSBzb3VyY2Ugb3IgdGFyZ2V0CisgKiB0ZXJtaW5hbCBvZiBhbiBlZGdlLgorICovCitteE11bHRpcGxpY2l0eS5wcm90b3R5cGUuc291cmNlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbWluCisgKiAKKyAqIERlZmluZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGZvciB3aGljaCB0aGlzIHJ1bGUgYXBwbGllcy4KKyAqIERlZmF1bHQgaXMgMC4KKyAqLworbXhNdWx0aXBsaWNpdHkucHJvdG90eXBlLm1pbiA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IG1heAorICogCisgKiBEZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyBmb3Igd2hpY2ggdGhpcyBydWxlIGFwcGxpZXMuCisgKiBBIHZhbHVlIG9mICduJyBtZWFucyB1bmxpbWl0ZWQgdGltZXMuIERlZmF1bHQgaXMgJ24nLiAKKyAqLworbXhNdWx0aXBsaWNpdHkucHJvdG90eXBlLm1heCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHZhbGlkTmVpZ2hib3JzCisgKiAKKyAqIEhvbGRzIGFuIGFycmF5IG9mIHN0cmluZ3MgdGhhdCBzcGVjaWZ5IHRoZSB0eXBlIG9mIG5laWdoYm9yIGZvciB3aGljaAorICogdGhpcyBydWxlIGFwcGxpZXMuIFRoZSBzdHJpbmdzIGFyZSB1c2VkIGluIDxteENlbGwuaXM+IG9uIHRoZSBvcHBvc2l0ZQorICogdGVybWluYWwgdG8gY2hlY2sgaWYgdGhlIHJ1bGUgYXBwbGllcyB0byB0aGUgY29ubmVjdGlvbi4KKyAqLworbXhNdWx0aXBsaWNpdHkucHJvdG90eXBlLnZhbGlkTmVpZ2hib3JzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogdmFsaWROZWlnaGJvcnNBbGxvd2VkCisgKiAKKyAqIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgbGlzdCBvZiB2YWxpZE5laWdoYm9ycyBhcmUgdGhvc2UgdGhhdCBhcmUgYWxsb3dlZAorICogZm9yIHRoaXMgcnVsZSBvciB0aG9zZSB0aGF0IGFyZSBub3QgYWxsb3dlZCBmb3IgdGhpcyBydWxlLgorICovCitteE11bHRpcGxpY2l0eS5wcm90b3R5cGUudmFsaWROZWlnaGJvcnNBbGxvd2VkID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogY291bnRFcnJvcgorICogCisgKiBIb2xkcyB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGlmIHRoZSBudW1iZXIgb2YKKyAqIGNvbm5lY3Rpb25zIGZvciB3aGljaCB0aGUgcnVsZSBhcHBsaWVzIGlzIHNtYWxsZXIgdGhhbiA8bWluPiBvciBncmVhdGVyCisgKiB0aGFuIDxtYXg+LgorICovCitteE11bHRpcGxpY2l0eS5wcm90b3R5cGUuY291bnRFcnJvciA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHR5cGVFcnJvcgorICogCisgKiBIb2xkcyB0aGUgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGlmIHRoZSB0eXBlIG9mIHRoZQorICogbmVpZ2hib3IgZm9yIGEgY29ubmVjdGlvbiBkb2VzIG5vdCBtYXRjaCB0aGUgcnVsZS4KKyAqLworbXhNdWx0aXBsaWNpdHkucHJvdG90eXBlLnR5cGVFcnJvciA9IG51bGw7CisKKy8qKgorICogRnVuY3Rpb246IGNoZWNrCisgKiAKKyAqIENoZWNrcyB0aGUgbXVsdGlwbGljaXR5IGZvciB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFuZCByZXR1cm5zIHRoZSBlcnJvcgorICogZm9yIHRoZSBnaXZlbiBjb25uZWN0aW9uIG9yIG51bGwgaWYgdGhlIG11bHRpcGxpY2l0eSBkb2VzIG5vdCBhcHBseS4KKyAqICAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGdyYXBoIC0gUmVmZXJlbmNlIHRvIHRoZSBlbmNsb3NpbmcgPG14R3JhcGg+IGluc3RhbmNlLgorICogZWRnZSAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgZWRnZSB0byB2YWxpZGF0ZS4KKyAqIHNvdXJjZSAtIDxteENlbGw+IHRoYXQgcmVwcmVzZW50cyB0aGUgc291cmNlIHRlcm1pbmFsLgorICogdGFyZ2V0IC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSB0YXJnZXQgdGVybWluYWwuCisgKiBzb3VyY2VPdXQgLSBOdW1iZXIgb2Ygb3V0Z29pbmcgZWRnZXMgZnJvbSB0aGUgc291cmNlIHRlcm1pbmFsLgorICogdGFyZ2V0SW4gLSBOdW1iZXIgb2YgaW5jb21pbmcgZWRnZXMgZm9yIHRoZSB0YXJnZXQgdGVybWluYWwuCisgKi8KK214TXVsdGlwbGljaXR5LnByb3RvdHlwZS5jaGVjayA9IGZ1bmN0aW9uKGdyYXBoLCBlZGdlLCBzb3VyY2UsIHRhcmdldCwgc291cmNlT3V0LCB0YXJnZXRJbikKK3sKKwl2YXIgZXJyb3IgPSAnJzsKKworCWlmICgodGhpcy5zb3VyY2UgJiYgdGhpcy5jaGVja1Rlcm1pbmFsKGdyYXBoLCBzb3VyY2UsIGVkZ2UpKSB8fAorCQkoIXRoaXMuc291cmNlICYmIHRoaXMuY2hlY2tUZXJtaW5hbChncmFwaCwgdGFyZ2V0LCBlZGdlKSkpCisJeworCQlpZiAodGhpcy5jb3VudEVycm9yICE9IG51bGwgJiYgCisJCQkoKHRoaXMuc291cmNlICYmICh0aGlzLm1heCA9PSAwIHx8IChzb3VyY2VPdXQgPj0gdGhpcy5tYXgpKSkgfHwKKwkJCSghdGhpcy5zb3VyY2UgJiYgKHRoaXMubWF4ID09IDAgfHwgKHRhcmdldEluID49IHRoaXMubWF4KSkpKSkKKwkJeworCQkJZXJyb3IgKz0gdGhpcy5jb3VudEVycm9yICsgJ1xuJzsKKwkJfQorCisJCWlmICh0aGlzLnZhbGlkTmVpZ2hib3JzICE9IG51bGwgJiYgdGhpcy50eXBlRXJyb3IgIT0gbnVsbCAmJiB0aGlzLnZhbGlkTmVpZ2hib3JzLmxlbmd0aCA+IDApCisJCXsKKwkJCXZhciBpc1ZhbGlkID0gdGhpcy5jaGVja05laWdoYm9ycyhncmFwaCwgZWRnZSwgc291cmNlLCB0YXJnZXQpOworCisJCQlpZiAoIWlzVmFsaWQpCisJCQl7CisJCQkJZXJyb3IgKz0gdGhpcy50eXBlRXJyb3IgKyAnXG4nOworCQkJfQorCQl9CisJfQorCQorCXJldHVybiAoZXJyb3IubGVuZ3RoID4gMCkgPyBlcnJvciA6IG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjaGVja05laWdoYm9ycworICogCisgKiBDaGVja3MgaWYgdGhlcmUgYXJlIGFueSB2YWxpZCBuZWlnaGJvdXJzIGluIDx2YWxpZE5laWdoYm9ycz4uIFRoaXMgaXMgb25seQorICogY2FsbGVkIGlmIDx2YWxpZE5laWdoYm9ycz4gaXMgYSBub24tZW1wdHkgYXJyYXkuCisgKi8KK214TXVsdGlwbGljaXR5LnByb3RvdHlwZS5jaGVja05laWdoYm9ycyA9IGZ1bmN0aW9uKGdyYXBoLCBlZGdlLCBzb3VyY2UsIHRhcmdldCkKK3sKKwl2YXIgc291cmNlVmFsdWUgPSBncmFwaC5tb2RlbC5nZXRWYWx1ZShzb3VyY2UpOworCXZhciB0YXJnZXRWYWx1ZSA9IGdyYXBoLm1vZGVsLmdldFZhbHVlKHRhcmdldCk7CisJdmFyIGlzVmFsaWQgPSAhdGhpcy52YWxpZE5laWdoYm9yc0FsbG93ZWQ7CisJdmFyIHZhbGlkID0gdGhpcy52YWxpZE5laWdoYm9yczsKKwkKKwlmb3IgKHZhciBqID0gMDsgaiA8IHZhbGlkLmxlbmd0aDsgaisrKQorCXsKKwkJaWYgKHRoaXMuc291cmNlICYmCisJCQl0aGlzLmNoZWNrVHlwZShncmFwaCwgdGFyZ2V0VmFsdWUsIHZhbGlkW2pdKSkKKwkJeworCQkJaXNWYWxpZCA9IHRoaXMudmFsaWROZWlnaGJvcnNBbGxvd2VkOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSBpZiAoIXRoaXMuc291cmNlICYmIAorCQkJdGhpcy5jaGVja1R5cGUoZ3JhcGgsIHNvdXJjZVZhbHVlLCB2YWxpZFtqXSkpCisJCXsKKwkJCWlzVmFsaWQgPSB0aGlzLnZhbGlkTmVpZ2hib3JzQWxsb3dlZDsKKwkJCWJyZWFrOworCQl9CisJfQorCQorCXJldHVybiBpc1ZhbGlkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY2hlY2tUZXJtaW5hbAorICogCisgKiBDaGVja3MgdGhlIGdpdmVuIHRlcm1pbmFsIGNlbGwgYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGlzIHJ1bGUgYXBwbGllcy4gVGhlCisgKiBnaXZlbiBjZWxsIGlzIHRoZSBzb3VyY2Ugb3IgdGFyZ2V0IG9mIHRoZSBnaXZlbiBlZGdlLCBkZXBlbmRpbmcgb24KKyAqIDxzb3VyY2U+LiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgPGNoZWNrVHlwZT4gb24gdGhlIHRlcm1pbmFsJ3MgdmFsdWUuCisgKi8KK214TXVsdGlwbGljaXR5LnByb3RvdHlwZS5jaGVja1Rlcm1pbmFsID0gZnVuY3Rpb24oZ3JhcGgsIHRlcm1pbmFsLCBlZGdlKQoreworCXZhciB2YWx1ZSA9IGdyYXBoLm1vZGVsLmdldFZhbHVlKHRlcm1pbmFsKTsKKwkKKwlyZXR1cm4gdGhpcy5jaGVja1R5cGUoZ3JhcGgsIHZhbHVlLCB0aGlzLnR5cGUsIHRoaXMuYXR0ciwgdGhpcy52YWx1ZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjaGVja1R5cGUKKyAqIAorICogQ2hlY2tzIHRoZSB0eXBlIG9mIHRoZSBnaXZlbiB2YWx1ZS4KKyAqLworbXhNdWx0aXBsaWNpdHkucHJvdG90eXBlLmNoZWNrVHlwZSA9IGZ1bmN0aW9uKGdyYXBoLCB2YWx1ZSwgdHlwZSwgYXR0ciwgYXR0clZhbHVlKQoreworCWlmICh2YWx1ZSAhPSBudWxsKQorCXsKKwkJaWYgKCFpc05hTih2YWx1ZS5ub2RlVHlwZSkpIC8vIENoZWNrcyBpZiB2YWx1ZSBpcyBhIERPTSBub2RlCisJCXsKKwkJCXJldHVybiBteFV0aWxzLmlzTm9kZSh2YWx1ZSwgdHlwZSwgYXR0ciwgYXR0clZhbHVlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXJldHVybiB2YWx1ZSA9PSB0eXBlOworCQl9CisJfQorCQorCXJldHVybiBmYWxzZTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teE91dGxpbmUuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teE91dGxpbmUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxOWNlYwotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214T3V0bGluZS5qcwpAQCAtMCwwICsxLDc2MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhPdXRsaW5lCisgKgorICogSW1wbGVtZW50cyBhbiBvdXRsaW5lIChha2Egb3ZlcnZpZXcpIGZvciBhIGdyYXBoLiBTZXQgPHVwZGF0ZU9uUGFuPiB0byB0cnVlCisgKiB0byBlbmFibGUgdXBkYXRlcyB3aGlsZSB0aGUgc291cmNlIGdyYXBoIGlzIHBhbm5pbmcuCisgKiAKKyAqIEV4YW1wbGU6CisgKiAKKyAqIChjb2RlKQorICogdmFyIG91dGxpbmUgPSBuZXcgbXhPdXRsaW5lKGdyYXBoLCBkaXYpOworICogKGVuZCkKKyAqIAorICogSWYgYW4gb3V0bGluZSBpcyB1c2VkIGluIGFuIDxteFdpbmRvdz4gaW4gSUU4IHN0YW5kYXJkcyBtb2RlLCB0aGUgZm9sbG93aW5nCisgKiBjb2RlIG1ha2VzIHN1cmUgdGhhdCB0aGUgc2hhZG93IGZpbHRlciBpcyBub3QgaW5oZXJpdGVkIGFuZCB0aGF0IGFueQorICogdHJhbnNwYXJlbnQgZWxlbWVudHMgaW4gdGhlIGdyYXBoIGRvIG5vdCBzaG93IHRoZSBwYWdlIGJhY2tncm91bmQsIGJ1dCB0aGUKKyAqIGJhY2tncm91bmQgb2YgdGhlIGdyYXBoIGNvbnRhaW5lci4KKyAqIAorICogKGNvZGUpCisgKiBpZiAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09IDgpCisgKiB7CisgKiAgIGNvbnRhaW5lci5zdHlsZS5maWx0ZXIgPSAncHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmFscGhhKG9wYWNpdHk9MTAwKSc7CisgKiB9CisgKiAoZW5kKQorICogCisgKiBUbyBtb3ZlIHRoZSBncmFwaCB0byB0aGUgdG9wLCBsZWZ0IGNvcm5lciB0aGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQuCisgKiAKKyAqIChjb2RlKQorICogdmFyIHNjYWxlID0gZ3JhcGgudmlldy5zY2FsZTsKKyAqIHZhciBib3VuZHMgPSBncmFwaC5nZXRHcmFwaEJvdW5kcygpOworICogZ3JhcGgudmlldy5zZXRUcmFuc2xhdGUoLWJvdW5kcy54IC8gc2NhbGUsIC1ib3VuZHMueSAvIHNjYWxlKTsKKyAqIChlbmQpCisgKiAKKyAqIFRvIHRvZ2dsZSB0aGUgc3VzcGVuZGVkIG1vZGUsIHRoZSBmb2xsb3dpbmcgY2FuIGJlIHVzZWQuCisgKiAKKyAqIChjb2RlKQorICogb3V0bGluZS5zdXNwZW5kZWQgPSAhb3V0bG4uc3VzcGVuZGVkOworICogaWYgKCFvdXRsaW5lLnN1c3BlbmRlZCkKKyAqIHsKKyAqICAgb3V0bGluZS51cGRhdGUodHJ1ZSk7CisgKiB9CisgKiAoZW5kKQorICogCisgKiBDb25zdHJ1Y3RvcjogbXhPdXRsaW5lCisgKgorICogQ29uc3RydWN0cyBhIG5ldyBvdXRsaW5lIGZvciB0aGUgc3BlY2lmaWVkIGdyYXBoIGluc2lkZSB0aGUgZ2l2ZW4KKyAqIGNvbnRhaW5lci4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogc291cmNlIC0gPG14R3JhcGg+IHRvIGNyZWF0ZSB0aGUgb3V0bGluZSBmb3IuCisgKiBjb250YWluZXIgLSBET00gbm9kZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgb3V0bGluZS4KKyAqLworZnVuY3Rpb24gbXhPdXRsaW5lKHNvdXJjZSwgY29udGFpbmVyKQoreworCXRoaXMuc291cmNlID0gc291cmNlOworCisJaWYgKGNvbnRhaW5lciAhPSBudWxsKQorCXsKKwkJdGhpcy5pbml0KGNvbnRhaW5lcik7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogc291cmNlCisgKiAKKyAqIFJlZmVyZW5jZSB0byB0aGUgc291cmNlIDxteEdyYXBoPi4KKyAqLworbXhPdXRsaW5lLnByb3RvdHlwZS5zb3VyY2UgPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiBvdXRsaW5lCisgKiAKKyAqIFJlZmVyZW5jZSB0byB0aGUgPG14R3JhcGg+IHRoYXQgcmVuZGVycyB0aGUgb3V0bGluZS4KKyAqLworbXhPdXRsaW5lLnByb3RvdHlwZS5vdXRsaW5lID0gbnVsbDsKKworLyoqCisgKiBGdW5jdGlvbjogZ3JhcGhSZW5kZXJIaW50CisgKiAKKyAqIFJlbmRlcmhpbnQgdG8gYmUgdXNlZCBmb3IgdGhlIG91dGxpbmUgZ3JhcGguIERlZmF1bHQgaXMgZmFzdGVyLgorICovCitteE91dGxpbmUucHJvdG90eXBlLmdyYXBoUmVuZGVySGludCA9IG14Q29uc3RhbnRzLlJFTkRFUklOR19ISU5UX0ZBU1RFUjsKKworLyoqCisgKiBWYXJpYWJsZTogZW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgaWYgZXZlbnRzIGFyZSBoYW5kbGVkLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214T3V0bGluZS5wcm90b3R5cGUuZW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHNob3dWaWV3cG9ydAorICogCisgKiBTcGVjaWZpZXMgYSB2aWV3cG9ydCByZWN0YW5nbGUgc2hvdWxkIGJlIHNob3duLiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214T3V0bGluZS5wcm90b3R5cGUuc2hvd1ZpZXdwb3J0ID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogYm9yZGVyCisgKiAKKyAqIEJvcmRlciB0byBiZSBhZGRlZCBhdCB0aGUgYm90dG9tIGFuZCByaWdodC4gRGVmYXVsdCBpcyAxMC4KKyAqLworbXhPdXRsaW5lLnByb3RvdHlwZS5ib3JkZXIgPSAxMDsKKworLyoqCisgKiBWYXJpYWJsZTogZW5hYmxlZAorICogCisgKiBTcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIHNpemVyIGhhbmRsZXIuIERlZmF1bHQgaXMgOC4KKyAqLworbXhPdXRsaW5lLnByb3RvdHlwZS5zaXplclNpemUgPSA4OworCisvKioKKyAqIFZhcmlhYmxlOiBsYWJlbHNWaXNpYmxlCisgKiAKKyAqIFNwZWNpZmllcyBpZiBsYWJlbHMgc2hvdWxkIGJlIHZpc2libGUgaW4gdGhlIG91dGxpbmUuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214T3V0bGluZS5wcm90b3R5cGUubGFiZWxzVmlzaWJsZSA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiB1cGRhdGVPblBhbgorICogCisgKiBTcGVjaWZpZXMgaWYgPHVwZGF0ZT4gc2hvdWxkIGJlIGNhbGxlZCBmb3IgPG14RXZlbnQuUEFOPiBpbiB0aGUgc291cmNlCisgKiBncmFwaC4gRGVmYXVsdCBpcyBmYWxzZS4KKyAqLworbXhPdXRsaW5lLnByb3RvdHlwZS51cGRhdGVPblBhbiA9IGZhbHNlOworCisvKioKKyAqIFZhcmlhYmxlOiBzaXplckltYWdlCisgKiAKKyAqIE9wdGlvbmFsIDxteEltYWdlPiB0byBiZSB1c2VkIGZvciB0aGUgc2l6ZXIuIERlZmF1bHQgaXMgbnVsbC4KKyAqLworbXhPdXRsaW5lLnByb3RvdHlwZS5zaXplckltYWdlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbWluU2NhbGUKKyAqIAorICogTWluaW11bSBzY2FsZSB0byBiZSB1c2VkLiBEZWZhdWx0IGlzIDAuMDAxLgorICovCitteE91dGxpbmUucHJvdG90eXBlLm1pblNjYWxlID0gMC4wMDAxOworCisvKioKKyAqIFZhcmlhYmxlOiBzdXNwZW5kZWQKKyAqIAorICogT3B0aW9uYWwgYm9vbGVhbiBmbGFnIHRvIHN1c3BlbmQgdXBkYXRlcy4gRGVmYXVsdCBpcyBmYWxzZS4gVGhpcyBmbGFnIHdpbGwKKyAqIGFsc28gc3VzcGVuZCByZXBhaW50cyBvZiB0aGUgb3V0bGluZS4gVG8gdG9nZ2xlIHRoaXMgc3dpdGNoLCB1c2UgdGhlCisgKiBmb2xsb3dpbmcgY29kZS4KKyAqIAorICogKGNvZGUpCisgKiBuYXYuc3VzcGVuZGVkID0gIW5hdi5zdXNwZW5kZWQ7CisgKiAKKyAqIGlmICghbmF2LnN1c3BlbmRlZCkKKyAqIHsKKyAqICAgbmF2LnVwZGF0ZSh0cnVlKTsKKyAqIH0KKyAqIChlbmQpCisgKi8KK214T3V0bGluZS5wcm90b3R5cGUuc3VzcGVuZGVkID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IGZvcmNlVm1sSGFuZGxlcworICogCisgKiBTcGVjaWZpZXMgaWYgVk1MIHNob3VsZCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgaGFuZGxlcyBpbiB0aGlzIGNvbnRyb2wuIFRoaXMKKyAqIGlzIHRydWUgZm9yIElFOCBzdGFuZGFyZHMgbW9kZSBhbmQgZmFsc2UgZm9yIGFsbCBvdGhlciBicm93c2VycyBhbmQgbW9kZXMuCisgKiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgcmVuZGVyaW5nIGlzc3VlcyBvZiBIVE1MIGVsZW1lbnRzIG92ZXIgZWxlbWVudHMKKyAqIHdpdGggZmlsdGVycyBpbiBJRSA4IHN0YW5kYXJkcyBtb2RlLgorICovCitteE91dGxpbmUucHJvdG90eXBlLmZvcmNlVm1sSGFuZGxlcyA9IGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSA4OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVHcmFwaAorICogCisgKiBDcmVhdGVzIHRoZSA8bXhHcmFwaD4gdXNlZCBpbiB0aGUgb3V0bGluZS4KKyAqLworbXhPdXRsaW5lLnByb3RvdHlwZS5jcmVhdGVHcmFwaCA9IGZ1bmN0aW9uKGNvbnRhaW5lcikKK3sKKwl2YXIgZ3JhcGggPSBuZXcgbXhHcmFwaChjb250YWluZXIsIHRoaXMuc291cmNlLmdldE1vZGVsKCksIHRoaXMuZ3JhcGhSZW5kZXJIaW50LCB0aGlzLnNvdXJjZS5nZXRTdHlsZXNoZWV0KCkpOworCWdyYXBoLmZvbGRpbmdFbmFibGVkID0gZmFsc2U7CisJZ3JhcGguYXV0b1Njcm9sbCA9IGZhbHNlOworCQorCXJldHVybiBncmFwaDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGluaXQKKyAqIAorICogSW5pdGlhbGl6ZXMgdGhlIG91dGxpbmUgaW5zaWRlIHRoZSBnaXZlbiBjb250YWluZXIuCisgKi8KK214T3V0bGluZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKGNvbnRhaW5lcikKK3sKKwl0aGlzLm91dGxpbmUgPSB0aGlzLmNyZWF0ZUdyYXBoKGNvbnRhaW5lcik7CisJCisJLy8gRG8gbm90IHJlcGFpbnQgd2hlbiBzdXNwZW5kZWQKKwl2YXIgb3V0bGluZUdyYXBoTW9kZWxDaGFuZ2VkID0gdGhpcy5vdXRsaW5lLmdyYXBoTW9kZWxDaGFuZ2VkOworCXRoaXMub3V0bGluZS5ncmFwaE1vZGVsQ2hhbmdlZCA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihjaGFuZ2VzKQorCXsKKwkJaWYgKCF0aGlzLnN1c3BlbmRlZCAmJiB0aGlzLm91dGxpbmUgIT0gbnVsbCkKKwkJeworCQkJb3V0bGluZUdyYXBoTW9kZWxDaGFuZ2VkLmFwcGx5KHRoaXMub3V0bGluZSwgYXJndW1lbnRzKTsKKwkJfQorCX0pOworCisJLy8gRW5hYmxlcyBmYXN0ZXIgcGFpbnRpbmcgaW4gU1ZHCisJaWYgKG14Q2xpZW50LklTX1NWRykKKwl7CisJCXZhciBub2RlID0gdGhpcy5vdXRsaW5lLmdldFZpZXcoKS5nZXRDYW52YXMoKS5wYXJlbnROb2RlOworCQlub2RlLnNldEF0dHJpYnV0ZSgnc2hhcGUtcmVuZGVyaW5nJywgJ29wdGltaXplU3BlZWQnKTsKKwkJbm9kZS5zZXRBdHRyaWJ1dGUoJ2ltYWdlLXJlbmRlcmluZycsICdvcHRpbWl6ZVNwZWVkJyk7CisJfQorCQorCS8vIEhpZGVzIGN1cnNvcnMgYW5kIGxhYmVscworCXRoaXMub3V0bGluZS5sYWJlbHNWaXNpYmxlID0gdGhpcy5sYWJlbHNWaXNpYmxlOworCXRoaXMub3V0bGluZS5zZXRFbmFibGVkKGZhbHNlKTsKKwkKKwl0aGlzLnVwZGF0ZUhhbmRsZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oc2VuZGVyLCBldnQpCisJeworCQlpZiAoIXRoaXMuc3VzcGVuZGVkICYmICF0aGlzLmFjdGl2ZSkKKwkJeworCQkJdGhpcy51cGRhdGUoKTsKKwkJfQorCX0pOworCQorCS8vIFVwZGF0ZXMgdGhlIHNjYWxlIG9mIHRoZSBvdXRsaW5lIGFmdGVyIGEgY2hhbmdlIG9mIHRoZSBtYWluIGdyYXBoCisJdGhpcy5zb3VyY2UuZ2V0TW9kZWwoKS5hZGRMaXN0ZW5lcihteEV2ZW50LkNIQU5HRSwgdGhpcy51cGRhdGVIYW5kbGVyKTsKKwl0aGlzLm91dGxpbmUuYWRkTW91c2VMaXN0ZW5lcih0aGlzKTsKKwkKKwkvLyBBZGRzIGxpc3RlbmVycyB0byBrZWVwIHRoZSBvdXRsaW5lIGluIHN5bmMgd2l0aCB0aGUgc291cmNlIGdyYXBoCisJdmFyIHZpZXcgPSB0aGlzLnNvdXJjZS5nZXRWaWV3KCk7CisJdmlldy5hZGRMaXN0ZW5lcihteEV2ZW50LlNDQUxFLCB0aGlzLnVwZGF0ZUhhbmRsZXIpOworCXZpZXcuYWRkTGlzdGVuZXIobXhFdmVudC5UUkFOU0xBVEUsIHRoaXMudXBkYXRlSGFuZGxlcik7CisJdmlldy5hZGRMaXN0ZW5lcihteEV2ZW50LlNDQUxFX0FORF9UUkFOU0xBVEUsIHRoaXMudXBkYXRlSGFuZGxlcik7CisJdmlldy5hZGRMaXN0ZW5lcihteEV2ZW50LkRPV04sIHRoaXMudXBkYXRlSGFuZGxlcik7CisJdmlldy5hZGRMaXN0ZW5lcihteEV2ZW50LlVQLCB0aGlzLnVwZGF0ZUhhbmRsZXIpOworCisJLy8gVXBkYXRlcyBibHVlIHJlY3RhbmdsZSBvbiBzY3JvbGwKKwlteEV2ZW50LmFkZExpc3RlbmVyKHRoaXMuc291cmNlLmNvbnRhaW5lciwgJ3Njcm9sbCcsIHRoaXMudXBkYXRlSGFuZGxlcik7CisJCisJdGhpcy5wYW5IYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKHNlbmRlcikKKwl7CisJCWlmICh0aGlzLnVwZGF0ZU9uUGFuKQorCQl7CisJCQl0aGlzLnVwZGF0ZUhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKKwkJfQorCX0pOworCXRoaXMuc291cmNlLmFkZExpc3RlbmVyKG14RXZlbnQuUEFOLCB0aGlzLnBhbkhhbmRsZXIpOworCQorCS8vIFJlZnJlc2hlcyB0aGUgZ3JhcGggaW4gdGhlIG91dGxpbmUgYWZ0ZXIgYSByZWZyZXNoIG9mIHRoZSBtYWluIGdyYXBoCisJdGhpcy5yZWZyZXNoSGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihzZW5kZXIpCisJeworCQl0aGlzLm91dGxpbmUuc2V0U3R5bGVzaGVldCh0aGlzLnNvdXJjZS5nZXRTdHlsZXNoZWV0KCkpOworCQl0aGlzLm91dGxpbmUucmVmcmVzaCgpOworCX0pOworCXRoaXMuc291cmNlLmFkZExpc3RlbmVyKG14RXZlbnQuUkVGUkVTSCwgdGhpcy5yZWZyZXNoSGFuZGxlcik7CisKKwkvLyBDcmVhdGVzIHRoZSBibHVlIHJlY3RhbmdsZSBmb3IgdGhlIHZpZXdwb3J0CisJdGhpcy5ib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUoMCwgMCwgMCwgMCk7CisJdGhpcy5zZWxlY3Rpb25Cb3JkZXIgPSBuZXcgbXhSZWN0YW5nbGVTaGFwZSh0aGlzLmJvdW5kcywgbnVsbCwKKwkJbXhDb25zdGFudHMuT1VUTElORV9DT0xPUiwgbXhDb25zdGFudHMuT1VUTElORV9TVFJPS0VXSURUSCk7CisJdGhpcy5zZWxlY3Rpb25Cb3JkZXIuZGlhbGVjdCA9IHRoaXMub3V0bGluZS5kaWFsZWN0OworCisJaWYgKHRoaXMuZm9yY2VWbWxIYW5kbGVzKQorCXsKKwkJdGhpcy5zZWxlY3Rpb25Cb3JkZXIuaXNIdG1sQWxsb3dlZCA9IGZ1bmN0aW9uKCkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9OworCX0KKwkKKwl0aGlzLnNlbGVjdGlvbkJvcmRlci5pbml0KHRoaXMub3V0bGluZS5nZXRWaWV3KCkuZ2V0T3ZlcmxheVBhbmUoKSk7CisKKwkvLyBIYW5kbGVzIGV2ZW50IGJ5IGNhdGNoaW5nIHRoZSBpbml0aWFsIHBvaW50ZXIgc3RhcnQgYW5kIHRoZW4gbGlzdGVuaW5nIHRvIHRoZQorCS8vIGNvbXBsZXRlIGdlc3R1cmUgb24gdGhlIGV2ZW50IHRhcmdldC4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBhbGwgdGhlIGV2ZW50cworCS8vIGFyZSByb3V0ZWQgdmlhIHRoZSBpbml0aWFsIGVsZW1lbnQgZXZlbiBpZiB0aGF0IGVsZW1lbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZQorCS8vIERPTSwgd2hpY2ggaGFwcGVucyB3aGVuIHdlIHJlcGFpbnQgdGhlIHNlbGVjdGlvbiBib3JkZXIgYW5kIHpvb20gaGFuZGxlcy4KKwl2YXIgaGFuZGxlciA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihldnQpCisJeworCQl2YXIgdCA9IG14RXZlbnQuZ2V0U291cmNlKGV2dCk7CisJCQorCQl2YXIgcmVkaXJlY3QgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQl7CisJCQl0aGlzLm91dGxpbmUuZmlyZU1vdXNlRXZlbnQobXhFdmVudC5NT1VTRV9NT1ZFLCBuZXcgbXhNb3VzZUV2ZW50KGV2dCkpOworCQl9KTsKKwkJCisJCXZhciByZWRpcmVjdDIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZXZ0KQorCQl7CisJCQlteEV2ZW50LnJlbW92ZUdlc3R1cmVMaXN0ZW5lcnModCwgbnVsbCwgcmVkaXJlY3QsIHJlZGlyZWN0Mik7CisJCQl0aGlzLm91dGxpbmUuZmlyZU1vdXNlRXZlbnQobXhFdmVudC5NT1VTRV9VUCwgbmV3IG14TW91c2VFdmVudChldnQpKTsKKwkJfSk7CisJCQorCQlteEV2ZW50LmFkZEdlc3R1cmVMaXN0ZW5lcnModCwgbnVsbCwgcmVkaXJlY3QsIHJlZGlyZWN0Mik7CisJCXRoaXMub3V0bGluZS5maXJlTW91c2VFdmVudChteEV2ZW50Lk1PVVNFX0RPV04sIG5ldyBteE1vdXNlRXZlbnQoZXZ0KSk7CisJfSk7CisJCisJbXhFdmVudC5hZGRHZXN0dXJlTGlzdGVuZXJzKHRoaXMuc2VsZWN0aW9uQm9yZGVyLm5vZGUsIGhhbmRsZXIpOworCisJLy8gQ3JlYXRlcyBhIHNtYWxsIGJsdWUgcmVjdGFuZ2xlIGZvciBzaXppbmcgKHNpemVyIGhhbmRsZSkKKwl0aGlzLnNpemVyID0gdGhpcy5jcmVhdGVTaXplcigpOworCQorCWlmICh0aGlzLmZvcmNlVm1sSGFuZGxlcykKKwl7CisJCXRoaXMuc2l6ZXIuaXNIdG1sQWxsb3dlZCA9IGZ1bmN0aW9uKCkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9OworCX0KKwkKKwl0aGlzLnNpemVyLmluaXQodGhpcy5vdXRsaW5lLmdldFZpZXcoKS5nZXRPdmVybGF5UGFuZSgpKTsKKwkKKwlpZiAodGhpcy5lbmFibGVkKQorCXsKKwkJdGhpcy5zaXplci5ub2RlLnN0eWxlLmN1cnNvciA9ICdud3NlLXJlc2l6ZSc7CisJfQorCQorCW14RXZlbnQuYWRkR2VzdHVyZUxpc3RlbmVycyh0aGlzLnNpemVyLm5vZGUsIGhhbmRsZXIpOworCisJdGhpcy5zZWxlY3Rpb25Cb3JkZXIubm9kZS5zdHlsZS5kaXNwbGF5ID0gKHRoaXMuc2hvd1ZpZXdwb3J0KSA/ICcnIDogJ25vbmUnOworCXRoaXMuc2l6ZXIubm9kZS5zdHlsZS5kaXNwbGF5ID0gdGhpcy5zZWxlY3Rpb25Cb3JkZXIubm9kZS5zdHlsZS5kaXNwbGF5OworCXRoaXMuc2VsZWN0aW9uQm9yZGVyLm5vZGUuc3R5bGUuY3Vyc29yID0gJ21vdmUnOworCisJdGhpcy51cGRhdGUoZmFsc2UpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNFbmFibGVkCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiBldmVudHMgYXJlIGhhbmRsZWQuIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIHJldHVybnMgPGVuYWJsZWQ+LgorICovCitteE91dGxpbmUucHJvdG90eXBlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5lbmFibGVkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0RW5hYmxlZAorICogCisgKiBFbmFibGVzIG9yIGRpc2FibGVzIGV2ZW50IGhhbmRsaW5nLiBUaGlzIGltcGxlbWVudGF0aW9uCisgKiB1cGRhdGVzIDxlbmFibGVkPi4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogdmFsdWUgLSBCb29sZWFuIHRoYXQgc3BlY2lmaWVzIHRoZSBuZXcgZW5hYmxlZCBzdGF0ZS4KKyAqLworbXhPdXRsaW5lLnByb3RvdHlwZS5zZXRFbmFibGVkID0gZnVuY3Rpb24odmFsdWUpCit7CisJdGhpcy5lbmFibGVkID0gdmFsdWU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRab29tRW5hYmxlZAorICogCisgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSB6b29tIGhhbmRsaW5nIGJ5IHNob3dpbmcgb3IgaGlkaW5nIHRoZSByZXNwZWN0aXZlCisgKiBoYW5kbGUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHZhbHVlIC0gQm9vbGVhbiB0aGF0IHNwZWNpZmllcyB0aGUgbmV3IGVuYWJsZWQgc3RhdGUuCisgKi8KK214T3V0bGluZS5wcm90b3R5cGUuc2V0Wm9vbUVuYWJsZWQgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLnNpemVyLm5vZGUuc3R5bGUudmlzaWJpbGl0eSA9ICh2YWx1ZSkgPyAndmlzaWJsZScgOiAnaGlkZGVuJzsKK307CisKKy8qKgorICogRnVuY3Rpb246IHJlZnJlc2gKKyAqIAorICogSW52b2tlcyA8dXBkYXRlPiBhbmQgcmV2YWxpZGF0ZSB0aGUgb3V0bGluZS4gVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4KKyAqLworbXhPdXRsaW5lLnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24oKQoreworCXRoaXMudXBkYXRlKHRydWUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlU2l6ZXIKKyAqIAorICogQ3JlYXRlcyB0aGUgc2hhcGUgdXNlZCBhcyB0aGUgc2l6ZXIuCisgKi8KK214T3V0bGluZS5wcm90b3R5cGUuY3JlYXRlU2l6ZXIgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMuc2l6ZXJJbWFnZSAhPSBudWxsKQorCXsKKwkJdmFyIHNpemVyID0gbmV3IG14SW1hZ2VTaGFwZShuZXcgbXhSZWN0YW5nbGUoMCwgMCwgdGhpcy5zaXplckltYWdlLndpZHRoLCB0aGlzLnNpemVySW1hZ2UuaGVpZ2h0KSwgdGhpcy5zaXplckltYWdlLnNyYyk7CisJCXNpemVyLmRpYWxlY3QgPSB0aGlzLm91dGxpbmUuZGlhbGVjdDsKKwkJCisJCXJldHVybiBzaXplcjsKKwl9CisJZWxzZQorCXsKKwkJdmFyIHNpemVyID0gbmV3IG14UmVjdGFuZ2xlU2hhcGUobmV3IG14UmVjdGFuZ2xlKDAsIDAsIHRoaXMuc2l6ZXJTaXplLCB0aGlzLnNpemVyU2l6ZSksCisJCQlteENvbnN0YW50cy5PVVRMSU5FX0hBTkRMRV9GSUxMQ09MT1IsIG14Q29uc3RhbnRzLk9VVExJTkVfSEFORExFX1NUUk9LRUNPTE9SKTsKKwkJc2l6ZXIuZGlhbGVjdCA9IHRoaXMub3V0bGluZS5kaWFsZWN0OworCQorCQlyZXR1cm4gc2l6ZXI7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0U291cmNlQ29udGFpbmVyU2l6ZQorICogCisgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBzb3VyY2UgY29udGFpbmVyLgorICovCitteE91dGxpbmUucHJvdG90eXBlLmdldFNvdXJjZUNvbnRhaW5lclNpemUgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIG5ldyBteFJlY3RhbmdsZSgwLCAwLCB0aGlzLnNvdXJjZS5jb250YWluZXIuc2Nyb2xsV2lkdGgsIHRoaXMuc291cmNlLmNvbnRhaW5lci5zY3JvbGxIZWlnaHQpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0T3V0bGluZU9mZnNldAorICogCisgKiBSZXR1cm5zIHRoZSBvZmZzZXQgZm9yIGRyYXdpbmcgdGhlIG91dGxpbmUgZ3JhcGguCisgKi8KK214T3V0bGluZS5wcm90b3R5cGUuZ2V0T3V0bGluZU9mZnNldCA9IGZ1bmN0aW9uKHNjYWxlKQoreworCXJldHVybiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0T3V0bGluZU9mZnNldAorICogCisgKiBSZXR1cm5zIHRoZSBvZmZzZXQgZm9yIGRyYXdpbmcgdGhlIG91dGxpbmUgZ3JhcGguCisgKi8KK214T3V0bGluZS5wcm90b3R5cGUuZ2V0U291cmNlR3JhcGhCb3VuZHMgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuc291cmNlLmdldEdyYXBoQm91bmRzKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB1cGRhdGUKKyAqIAorICogVXBkYXRlcyB0aGUgb3V0bGluZS4KKyAqLworbXhPdXRsaW5lLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihyZXZhbGlkYXRlKQoreworCWlmICh0aGlzLnNvdXJjZSAhPSBudWxsICYmIHRoaXMub3V0bGluZSAhPSBudWxsKQorCXsKKwkJdmFyIHNvdXJjZVNjYWxlID0gdGhpcy5zb3VyY2Uudmlldy5zY2FsZTsKKwkJdmFyIHNjYWxlZEdyYXBoQm91bmRzID0gdGhpcy5nZXRTb3VyY2VHcmFwaEJvdW5kcygpOworCQl2YXIgdW5zY2FsZWRHcmFwaEJvdW5kcyA9IG5ldyBteFJlY3RhbmdsZShzY2FsZWRHcmFwaEJvdW5kcy54IC8gc291cmNlU2NhbGUgKyB0aGlzLnNvdXJjZS5wYW5EeCwKKwkJCQlzY2FsZWRHcmFwaEJvdW5kcy55IC8gc291cmNlU2NhbGUgKyB0aGlzLnNvdXJjZS5wYW5EeSwgc2NhbGVkR3JhcGhCb3VuZHMud2lkdGggLyBzb3VyY2VTY2FsZSwKKwkJCQlzY2FsZWRHcmFwaEJvdW5kcy5oZWlnaHQgLyBzb3VyY2VTY2FsZSk7CisKKwkJdmFyIHVuc2NhbGVkRmluZGVyQm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKDAsIDAsCisJCQl0aGlzLnNvdXJjZS5jb250YWluZXIuY2xpZW50V2lkdGggLyBzb3VyY2VTY2FsZSwKKwkJCXRoaXMuc291cmNlLmNvbnRhaW5lci5jbGllbnRIZWlnaHQgLyBzb3VyY2VTY2FsZSk7CisJCQorCQl2YXIgdW5pb24gPSB1bnNjYWxlZEdyYXBoQm91bmRzLmNsb25lKCk7CisJCXVuaW9uLmFkZCh1bnNjYWxlZEZpbmRlckJvdW5kcyk7CisJCisJCS8vIFpvb21zIHRvIHRoZSBzY3JvbGxhYmxlIGFyZWEgaWYgdGhhdCBpcyBiaWdnZXIgdGhhbiB0aGUgZ3JhcGgKKwkJdmFyIHNpemUgPSB0aGlzLmdldFNvdXJjZUNvbnRhaW5lclNpemUoKTsKKwkJdmFyIGNvbXBsZXRlV2lkdGggPSBNYXRoLm1heChzaXplLndpZHRoIC8gc291cmNlU2NhbGUsIHVuaW9uLndpZHRoKTsKKwkJdmFyIGNvbXBsZXRlSGVpZ2h0ID0gTWF0aC5tYXgoc2l6ZS5oZWlnaHQgLyBzb3VyY2VTY2FsZSwgdW5pb24uaGVpZ2h0KTsKKwkKKwkJdmFyIGF2YWlsYWJsZVdpZHRoID0gTWF0aC5tYXgoMCwgdGhpcy5vdXRsaW5lLmNvbnRhaW5lci5jbGllbnRXaWR0aCAtIHRoaXMuYm9yZGVyKTsKKwkJdmFyIGF2YWlsYWJsZUhlaWdodCA9IE1hdGgubWF4KDAsIHRoaXMub3V0bGluZS5jb250YWluZXIuY2xpZW50SGVpZ2h0IC0gdGhpcy5ib3JkZXIpOworCQkKKwkJdmFyIG91dGxpbmVTY2FsZSA9IE1hdGgubWluKGF2YWlsYWJsZVdpZHRoIC8gY29tcGxldGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0IC8gY29tcGxldGVIZWlnaHQpOworCQl2YXIgc2NhbGUgPSAoaXNOYU4ob3V0bGluZVNjYWxlKSkgPyB0aGlzLm1pblNjYWxlIDogTWF0aC5tYXgodGhpcy5taW5TY2FsZSwgb3V0bGluZVNjYWxlKTsKKworCQlpZiAoc2NhbGUgPiAwKQorCQl7CisJCQlpZiAodGhpcy5vdXRsaW5lLmdldFZpZXcoKS5zY2FsZSAhPSBzY2FsZSkKKwkJCXsKKwkJCQl0aGlzLm91dGxpbmUuZ2V0VmlldygpLnNjYWxlID0gc2NhbGU7CisJCQkJcmV2YWxpZGF0ZSA9IHRydWU7CisJCQl9CisJCQorCQkJdmFyIG5hdlZpZXcgPSB0aGlzLm91dGxpbmUuZ2V0VmlldygpOworCQkJCisJCQlpZiAobmF2Vmlldy5jdXJyZW50Um9vdCAhPSB0aGlzLnNvdXJjZS5nZXRWaWV3KCkuY3VycmVudFJvb3QpCisJCQl7CisJCQkJbmF2Vmlldy5zZXRDdXJyZW50Um9vdCh0aGlzLnNvdXJjZS5nZXRWaWV3KCkuY3VycmVudFJvb3QpOworCQkJfQorCisJCQl2YXIgdCA9IHRoaXMuc291cmNlLnZpZXcudHJhbnNsYXRlOworCQkJdmFyIHR4ID0gdC54ICsgdGhpcy5zb3VyY2UucGFuRHg7CisJCQl2YXIgdHkgPSB0LnkgKyB0aGlzLnNvdXJjZS5wYW5EeTsKKwkJCQorCQkJdmFyIG9mZiA9IHRoaXMuZ2V0T3V0bGluZU9mZnNldChzY2FsZSk7CisJCQkKKwkJCWlmIChvZmYgIT0gbnVsbCkKKwkJCXsKKwkJCQl0eCArPSBvZmYueDsKKwkJCQl0eSArPSBvZmYueTsKKwkJCX0KKwkJCQorCQkJaWYgKHVuc2NhbGVkR3JhcGhCb3VuZHMueCA8IDApCisJCQl7CisJCQkJdHggPSB0eCAtIHVuc2NhbGVkR3JhcGhCb3VuZHMueDsKKwkJCX0KKwkJCWlmICh1bnNjYWxlZEdyYXBoQm91bmRzLnkgPCAwKQorCQkJeworCQkJCXR5ID0gdHkgLSB1bnNjYWxlZEdyYXBoQm91bmRzLnk7CisJCQl9CisJCQkKKwkJCWlmIChuYXZWaWV3LnRyYW5zbGF0ZS54ICE9IHR4IHx8IG5hdlZpZXcudHJhbnNsYXRlLnkgIT0gdHkpCisJCQl7CisJCQkJbmF2Vmlldy50cmFuc2xhdGUueCA9IHR4OworCQkJCW5hdlZpZXcudHJhbnNsYXRlLnkgPSB0eTsKKwkJCQlyZXZhbGlkYXRlID0gdHJ1ZTsKKwkJCX0KKwkJCisJCQkvLyBQcmVwYXJlcyBsb2NhbCB2YXJpYWJsZXMgZm9yIGNvbXB1dGF0aW9ucworCQkJdmFyIHQyID0gbmF2Vmlldy50cmFuc2xhdGU7CisJCQlzY2FsZSA9IHRoaXMuc291cmNlLmdldFZpZXcoKS5zY2FsZTsKKwkJCXZhciBzY2FsZTIgPSBzY2FsZSAvIG5hdlZpZXcuc2NhbGU7CisJCQl2YXIgc2NhbGUzID0gMS4wIC8gbmF2Vmlldy5zY2FsZTsKKwkJCXZhciBjb250YWluZXIgPSB0aGlzLnNvdXJjZS5jb250YWluZXI7CisJCQkKKwkJCS8vIFVwZGF0ZXMgdGhlIGJvdW5kcyBvZiB0aGUgdmlld3JlY3QgaW4gdGhlIG5hdmlnYXRpb24KKwkJCXRoaXMuYm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKAorCQkJCSh0Mi54IC0gdC54IC0gdGhpcy5zb3VyY2UucGFuRHgpIC8gc2NhbGUzLAorCQkJCSh0Mi55IC0gdC55IC0gdGhpcy5zb3VyY2UucGFuRHkpIC8gc2NhbGUzLAorCQkJCShjb250YWluZXIuY2xpZW50V2lkdGggLyBzY2FsZTIpLAorCQkJCShjb250YWluZXIuY2xpZW50SGVpZ2h0IC8gc2NhbGUyKSk7CisJCQkKKwkJCS8vIEFkZHMgdGhlIHNjcm9sbGJhciBvZmZzZXQgdG8gdGhlIGZpbmRlcgorCQkJdGhpcy5ib3VuZHMueCArPSB0aGlzLnNvdXJjZS5jb250YWluZXIuc2Nyb2xsTGVmdCAqIG5hdlZpZXcuc2NhbGUgLyBzY2FsZTsKKwkJCXRoaXMuYm91bmRzLnkgKz0gdGhpcy5zb3VyY2UuY29udGFpbmVyLnNjcm9sbFRvcCAqIG5hdlZpZXcuc2NhbGUgLyBzY2FsZTsKKwkJCQorCQkJdmFyIGIgPSB0aGlzLnNlbGVjdGlvbkJvcmRlci5ib3VuZHM7CisJCQkKKwkJCWlmIChiLnggIT0gdGhpcy5ib3VuZHMueCB8fCBiLnkgIT0gdGhpcy5ib3VuZHMueSB8fCBiLndpZHRoICE9IHRoaXMuYm91bmRzLndpZHRoIHx8IGIuaGVpZ2h0ICE9IHRoaXMuYm91bmRzLmhlaWdodCkKKwkJCXsKKwkJCQl0aGlzLnNlbGVjdGlvbkJvcmRlci5ib3VuZHMgPSB0aGlzLmJvdW5kczsKKwkJCQl0aGlzLnNlbGVjdGlvbkJvcmRlci5yZWRyYXcoKTsKKwkJCX0KKwkJCisJCQkvLyBVcGRhdGVzIHRoZSBib3VuZHMgb2YgdGhlIHpvb20gaGFuZGxlIGF0IHRoZSBib3R0b20gcmlnaHQKKwkJCXZhciBiID0gdGhpcy5zaXplci5ib3VuZHM7CisJCQl2YXIgYjIgPSBuZXcgbXhSZWN0YW5nbGUodGhpcy5ib3VuZHMueCArIHRoaXMuYm91bmRzLndpZHRoIC0gYi53aWR0aCAvIDIsCisJCQkJCXRoaXMuYm91bmRzLnkgKyB0aGlzLmJvdW5kcy5oZWlnaHQgLSBiLmhlaWdodCAvIDIsIGIud2lkdGgsIGIuaGVpZ2h0KTsKKworCQkJaWYgKGIueCAhPSBiMi54IHx8IGIueSAhPSBiMi55IHx8IGIud2lkdGggIT0gYjIud2lkdGggfHwgYi5oZWlnaHQgIT0gYjIuaGVpZ2h0KQorCQkJeworCQkJCXRoaXMuc2l6ZXIuYm91bmRzID0gYjI7CisJCQkJCisJCQkJLy8gQXZvaWRzIHVwZGF0ZSBvZiB2aXNpYmlsaXR5IGluIHJlZHJhdyBmb3IgVk1MCisJCQkJaWYgKHRoaXMuc2l6ZXIubm9kZS5zdHlsZS52aXNpYmlsaXR5ICE9ICdoaWRkZW4nKQorCQkJCXsKKwkJCQkJdGhpcy5zaXplci5yZWRyYXcoKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChyZXZhbGlkYXRlKQorCQkJeworCQkJCXRoaXMub3V0bGluZS52aWV3LnJldmFsaWRhdGUoKTsKKwkJCX0KKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IG1vdXNlRG93bgorICogCisgKiBIYW5kbGVzIHRoZSBldmVudCBieSBzdGFydGluZyBhIHRyYW5zbGF0aW9uIG9yIHpvb20uCisgKi8KK214T3V0bGluZS5wcm90b3R5cGUubW91c2VEb3duID0gZnVuY3Rpb24oc2VuZGVyLCBtZSkKK3sKKwlpZiAodGhpcy5lbmFibGVkICYmIHRoaXMuc2hvd1ZpZXdwb3J0KQorCXsKKwkJdmFyIHRvbCA9ICghbXhFdmVudC5pc01vdXNlRXZlbnQobWUuZ2V0RXZlbnQoKSkpID8gdGhpcy5zb3VyY2UudG9sZXJhbmNlIDogMDsKKwkJdmFyIGhpdCA9ICh0aGlzLnNvdXJjZS5hbGxvd0hhbmRsZUJvdW5kc0NoZWNrICYmIChteENsaWVudC5JU19JRSB8fCB0b2wgPiAwKSkgPworCQkJCW5ldyBteFJlY3RhbmdsZShtZS5nZXRHcmFwaFgoKSAtIHRvbCwgbWUuZ2V0R3JhcGhZKCkgLSB0b2wsIDIgKiB0b2wsIDIgKiB0b2wpIDogbnVsbDsKKwkJdGhpcy56b29tID0gbWUuaXNTb3VyY2UodGhpcy5zaXplcikgfHwgKGhpdCAhPSBudWxsICYmIG14VXRpbHMuaW50ZXJzZWN0cyhzaGFwZS5ib3VuZHMsIGhpdCkpOworCQl0aGlzLnN0YXJ0WCA9IG1lLmdldFgoKTsKKwkJdGhpcy5zdGFydFkgPSBtZS5nZXRZKCk7CisJCXRoaXMuYWN0aXZlID0gdHJ1ZTsKKworCQlpZiAodGhpcy5zb3VyY2UudXNlU2Nyb2xsYmFyc0ZvclBhbm5pbmcgJiYgbXhVdGlscy5oYXNTY3JvbGxiYXJzKHRoaXMuc291cmNlLmNvbnRhaW5lcikpCisJCXsKKwkJCXRoaXMuZHgwID0gdGhpcy5zb3VyY2UuY29udGFpbmVyLnNjcm9sbExlZnQ7CisJCQl0aGlzLmR5MCA9IHRoaXMuc291cmNlLmNvbnRhaW5lci5zY3JvbGxUb3A7CisJCX0KKwkJZWxzZQorCQl7CisJCQl0aGlzLmR4MCA9IDA7CisJCQl0aGlzLmR5MCA9IDA7CisJCX0KKwl9CisKKwltZS5jb25zdW1lKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3VzZU1vdmUKKyAqIAorICogSGFuZGxlcyB0aGUgZXZlbnQgYnkgcHJldmlld2luZyB0aGUgdmlld3JlY3QgaW4gPGdyYXBoPiBhbmQgdXBkYXRpbmcgdGhlCisgKiByZWN0YW5nbGUgdGhhdCByZXByZXNlbnRzIHRoZSB2aWV3cmVjdCBpbiB0aGUgb3V0bGluZS4KKyAqLworbXhPdXRsaW5lLnByb3RvdHlwZS5tb3VzZU1vdmUgPSBmdW5jdGlvbihzZW5kZXIsIG1lKQoreworCWlmICh0aGlzLmFjdGl2ZSkKKwl7CisJCXRoaXMuc2VsZWN0aW9uQm9yZGVyLm5vZGUuc3R5bGUuZGlzcGxheSA9ICh0aGlzLnNob3dWaWV3cG9ydCkgPyAnJyA6ICdub25lJzsKKwkJdGhpcy5zaXplci5ub2RlLnN0eWxlLmRpc3BsYXkgPSB0aGlzLnNlbGVjdGlvbkJvcmRlci5ub2RlLnN0eWxlLmRpc3BsYXk7IAorCisJCXZhciBkZWx0YSA9IHRoaXMuZ2V0VHJhbnNsYXRlRm9yRXZlbnQobWUpOworCQl2YXIgZHggPSBkZWx0YS54OworCQl2YXIgZHkgPSBkZWx0YS55OworCQl2YXIgYm91bmRzID0gbnVsbDsKKwkJCisJCWlmICghdGhpcy56b29tKQorCQl7CisJCQkvLyBQcmV2aWV3cyB0aGUgcGFubmluZyBvbiB0aGUgc291cmNlIGdyYXBoCisJCQl2YXIgc2NhbGUgPSB0aGlzLm91dGxpbmUuZ2V0VmlldygpLnNjYWxlOworCQkJYm91bmRzID0gbmV3IG14UmVjdGFuZ2xlKHRoaXMuYm91bmRzLnggKyBkeCwKKwkJCQl0aGlzLmJvdW5kcy55ICsgZHksIHRoaXMuYm91bmRzLndpZHRoLCB0aGlzLmJvdW5kcy5oZWlnaHQpOworCQkJdGhpcy5zZWxlY3Rpb25Cb3JkZXIuYm91bmRzID0gYm91bmRzOworCQkJdGhpcy5zZWxlY3Rpb25Cb3JkZXIucmVkcmF3KCk7CisJCQlkeCAvPSBzY2FsZTsKKwkJCWR4ICo9IHRoaXMuc291cmNlLmdldFZpZXcoKS5zY2FsZTsKKwkJCWR5IC89IHNjYWxlOworCQkJZHkgKj0gdGhpcy5zb3VyY2UuZ2V0VmlldygpLnNjYWxlOworCQkJdGhpcy5zb3VyY2UucGFuR3JhcGgoLWR4IC0gdGhpcy5keDAsIC1keSAtIHRoaXMuZHkwKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIERvZXMgKm5vdCogcHJldmlldyB6b29taW5nIG9uIHRoZSBzb3VyY2UgZ3JhcGgKKwkJCXZhciBjb250YWluZXIgPSB0aGlzLnNvdXJjZS5jb250YWluZXI7CisJCQl2YXIgdmlld1JhdGlvID0gY29udGFpbmVyLmNsaWVudFdpZHRoIC8gY29udGFpbmVyLmNsaWVudEhlaWdodDsKKwkJCWR5ID0gZHggLyB2aWV3UmF0aW87CisJCQlib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUodGhpcy5ib3VuZHMueCwKKwkJCQl0aGlzLmJvdW5kcy55LAorCQkJCU1hdGgubWF4KDEsIHRoaXMuYm91bmRzLndpZHRoICsgZHgpLAorCQkJCU1hdGgubWF4KDEsIHRoaXMuYm91bmRzLmhlaWdodCArIGR5KSk7CisJCQl0aGlzLnNlbGVjdGlvbkJvcmRlci5ib3VuZHMgPSBib3VuZHM7CisJCQl0aGlzLnNlbGVjdGlvbkJvcmRlci5yZWRyYXcoKTsKKwkJfQorCQkKKwkJLy8gVXBkYXRlcyB0aGUgem9vbSBoYW5kbGUKKwkJdmFyIGIgPSB0aGlzLnNpemVyLmJvdW5kczsKKwkJdGhpcy5zaXplci5ib3VuZHMgPSBuZXcgbXhSZWN0YW5nbGUoCisJCQlib3VuZHMueCArIGJvdW5kcy53aWR0aCAtIGIud2lkdGggLyAyLAorCQkJYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0IC0gYi5oZWlnaHQgLyAyLAorCQkJYi53aWR0aCwgYi5oZWlnaHQpOworCQkKKwkJLy8gQXZvaWRzIHVwZGF0ZSBvZiB2aXNpYmlsaXR5IGluIHJlZHJhdyBmb3IgVk1MCisJCWlmICh0aGlzLnNpemVyLm5vZGUuc3R5bGUudmlzaWJpbGl0eSAhPSAnaGlkZGVuJykKKwkJeworCQkJdGhpcy5zaXplci5yZWRyYXcoKTsKKwkJfQorCQkKKwkJbWUuY29uc3VtZSgpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGdldFRyYW5zbGF0ZUZvckV2ZW50CisgKiAKKyAqIEdldHMgdGhlIHRyYW5zbGF0ZSBmb3IgdGhlIGdpdmVuIG1vdXNlIGV2ZW50LiBIZXJlIGlzIGFuIGV4YW1wbGUgdG8gbGltaXQKKyAqIHRoZSBvdXRsaW5lIHRvIHN0YXkgd2l0aGluIHBvc2l0aXZlIGNvb3JkaW5hdGVzOgorICogCisgKiAoY29kZSkKKyAqIG91dGxpbmUuZ2V0VHJhbnNsYXRlRm9yRXZlbnQgPSBmdW5jdGlvbihtZSkKKyAqIHsKKyAqICAgdmFyIHB0ID0gbmV3IG14UG9pbnQobWUuZ2V0WCgpIC0gdGhpcy5zdGFydFgsIG1lLmdldFkoKSAtIHRoaXMuc3RhcnRZKTsKKyAqICAgCisgKiAgIGlmICghdGhpcy56b29tKQorICogICB7CisgKiAgICAgdmFyIHRyID0gdGhpcy5zb3VyY2Uudmlldy50cmFuc2xhdGU7CisgKiAgICAgcHQueCA9IE1hdGgubWF4KHRyLnggKiB0aGlzLm91dGxpbmUudmlldy5zY2FsZSwgcHQueCk7CisgKiAgICAgcHQueSA9IE1hdGgubWF4KHRyLnkgKiB0aGlzLm91dGxpbmUudmlldy5zY2FsZSwgcHQueSk7CisgKiAgIH0KKyAqICAgCisgKiAgIHJldHVybiBwdDsKKyAqIH07CisgKiAoZW5kKQorICovCitteE91dGxpbmUucHJvdG90eXBlLmdldFRyYW5zbGF0ZUZvckV2ZW50ID0gZnVuY3Rpb24obWUpCit7CisJcmV0dXJuIG5ldyBteFBvaW50KG1lLmdldFgoKSAtIHRoaXMuc3RhcnRYLCBtZS5nZXRZKCkgLSB0aGlzLnN0YXJ0WSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBtb3VzZVVwCisgKiAKKyAqIEhhbmRsZXMgdGhlIGV2ZW50IGJ5IGFwcGx5aW5nIHRoZSB0cmFuc2xhdGlvbiBvciB6b29tIHRvIDxncmFwaD4uCisgKi8KK214T3V0bGluZS5wcm90b3R5cGUubW91c2VVcCA9IGZ1bmN0aW9uKHNlbmRlciwgbWUpCit7CisJaWYgKHRoaXMuYWN0aXZlKQorCXsKKwkJdmFyIGRlbHRhID0gdGhpcy5nZXRUcmFuc2xhdGVGb3JFdmVudChtZSk7CisJCXZhciBkeCA9IGRlbHRhLng7CisJCXZhciBkeSA9IGRlbHRhLnk7CisJCQorCQlpZiAoTWF0aC5hYnMoZHgpID4gMCB8fCBNYXRoLmFicyhkeSkgPiAwKQorCQl7CisJCQlpZiAoIXRoaXMuem9vbSkKKwkJCXsKKwkJCQkvLyBBcHBsaWVzIHRoZSBuZXcgdHJhbnNsYXRpb24gaWYgdGhlIHNvdXJjZQorCQkJCS8vIGhhcyBubyBzY3JvbGxiYXJzCisJCQkJaWYgKCF0aGlzLnNvdXJjZS51c2VTY3JvbGxiYXJzRm9yUGFubmluZyB8fAorCQkJCQkhbXhVdGlscy5oYXNTY3JvbGxiYXJzKHRoaXMuc291cmNlLmNvbnRhaW5lcikpCisJCQkJeworCQkJCQl0aGlzLnNvdXJjZS5wYW5HcmFwaCgwLCAwKTsKKwkJCQkJZHggLz0gdGhpcy5vdXRsaW5lLmdldFZpZXcoKS5zY2FsZTsKKwkJCQkJZHkgLz0gdGhpcy5vdXRsaW5lLmdldFZpZXcoKS5zY2FsZTsKKwkJCQkJdmFyIHQgPSB0aGlzLnNvdXJjZS5nZXRWaWV3KCkudHJhbnNsYXRlOworCQkJCQl0aGlzLnNvdXJjZS5nZXRWaWV3KCkuc2V0VHJhbnNsYXRlKHQueCAtIGR4LCB0LnkgLSBkeSk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vIEFwcGxpZXMgdGhlIG5ldyB6b29tCisJCQkJdmFyIHcgPSB0aGlzLnNlbGVjdGlvbkJvcmRlci5ib3VuZHMud2lkdGg7CisJCQkJdmFyIHNjYWxlID0gdGhpcy5zb3VyY2UuZ2V0VmlldygpLnNjYWxlOworCQkJCXRoaXMuc291cmNlLnpvb21UbyhNYXRoLm1heCh0aGlzLm1pblNjYWxlLCBzY2FsZSAtIChkeCAqIHNjYWxlKSAvIHcpLCBmYWxzZSk7CisJCQl9CisKKwkJCXRoaXMudXBkYXRlKCk7CisJCQltZS5jb25zdW1lKCk7CisJCX0KKwkJCQorCQkvLyBSZXNldHMgdGhlIHN0YXRlIG9mIHRoZSBoYW5kbGVyCisJCXRoaXMuaW5kZXggPSBudWxsOworCQl0aGlzLmFjdGl2ZSA9IGZhbHNlOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqIAorICogRGVzdHJveSB0aGlzIG91dGxpbmUgYW5kIHJlbW92ZXMgYWxsIGxpc3RlbmVycyBmcm9tIDxzb3VyY2U+LgorICovCitteE91dGxpbmUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpCit7CisJaWYgKHRoaXMuc291cmNlICE9IG51bGwpCisJeworCQl0aGlzLnNvdXJjZS5yZW1vdmVMaXN0ZW5lcih0aGlzLnBhbkhhbmRsZXIpOworCQl0aGlzLnNvdXJjZS5yZW1vdmVMaXN0ZW5lcih0aGlzLnJlZnJlc2hIYW5kbGVyKTsKKwkJdGhpcy5zb3VyY2UuZ2V0TW9kZWwoKS5yZW1vdmVMaXN0ZW5lcih0aGlzLnVwZGF0ZUhhbmRsZXIpOworCQl0aGlzLnNvdXJjZS5nZXRWaWV3KCkucmVtb3ZlTGlzdGVuZXIodGhpcy51cGRhdGVIYW5kbGVyKTsKKwkJbXhFdmVudC5hZGRMaXN0ZW5lcih0aGlzLnNvdXJjZS5jb250YWluZXIsICdzY3JvbGwnLCB0aGlzLnVwZGF0ZUhhbmRsZXIpOworCQl0aGlzLnNvdXJjZSA9IG51bGw7CisJfQorCQorCWlmICh0aGlzLm91dGxpbmUgIT0gbnVsbCkKKwl7CisJCXRoaXMub3V0bGluZS5yZW1vdmVNb3VzZUxpc3RlbmVyKHRoaXMpOworCQl0aGlzLm91dGxpbmUuZGVzdHJveSgpOworCQl0aGlzLm91dGxpbmUgPSBudWxsOworCX0KKworCWlmICh0aGlzLnNlbGVjdGlvbkJvcmRlciAhPSBudWxsKQorCXsKKwkJdGhpcy5zZWxlY3Rpb25Cb3JkZXIuZGVzdHJveSgpOworCQl0aGlzLnNlbGVjdGlvbkJvcmRlciA9IG51bGw7CisJfQorCQorCWlmICh0aGlzLnNpemVyICE9IG51bGwpCisJeworCQl0aGlzLnNpemVyLmRlc3Ryb3koKTsKKwkJdGhpcy5zaXplciA9IG51bGw7CisJfQorfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214UGVyaW1ldGVyLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3ZpZXcvbXhQZXJpbWV0ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkNWZmYwotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214UGVyaW1ldGVyLmpzCkBAIC0wLDAgKzEsOTIxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCit2YXIgbXhQZXJpbWV0ZXIgPQoreworCS8qKgorCSAqIENsYXNzOiBteFBlcmltZXRlcgorCSAqIAorCSAqIFByb3ZpZGVzIHZhcmlvdXMgcGVyaW1ldGVyIGZ1bmN0aW9ucyB0byBiZSB1c2VkIGluIGEgc3R5bGUKKwkgKiBhcyB0aGUgdmFsdWUgb2YgPG14Q29uc3RhbnRzLlNUWUxFX1BFUklNRVRFUj4uIFBlcmltZXRlcnMgZm9yCisJICogcmVjdGFuZ2xlLCBjaXJjbGUsIHJob21idXMgYW5kIHRyaWFuZ2xlIGFyZSBhdmFpbGFibGUuCisJICoKKwkgKiBFeGFtcGxlOgorCSAqIAorCSAqIChjb2RlKQorCSAqIDxhZGQgYXM9InBlcmltZXRlciI+bXhQZXJpbWV0ZXIuUmVjdGFuZ2xlUGVyaW1ldGVyPC9hZGQ+CisJICogKGVuZCkKKwkgKiAKKwkgKiBPciBwcm9ncmFtbWF0aWNhbGx5OgorCSAqIAorCSAqIChjb2RlKQorCSAqIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1BFUklNRVRFUl0gPSBteFBlcmltZXRlci5SZWN0YW5nbGVQZXJpbWV0ZXI7CisJICogKGVuZCkKKwkgKiAKKwkgKiBXaGVuIGFkZGluZyBuZXcgcGVyaW1ldGVyIGZ1bmN0aW9ucywgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSAKKwkgKiBteFBlcmltZXRlci1uYW1lc3BhY2UgYXMgZm9sbG93czoKKwkgKiAKKwkgKiAoY29kZSkKKwkgKiBteFBlcmltZXRlci5DdXN0b21QZXJpbWV0ZXIgPSBmdW5jdGlvbiAoYm91bmRzLCB2ZXJ0ZXgsIG5leHQsIG9ydGhvZ29uYWwpCisJICogeworCSAqICAgdmFyIHggPSAwOyAvLyBDYWxjdWxhdGUgeC1jb29yZGluYXRlCisJICogICB2YXIgeSA9IDA7IC8vIENhbGN1bGF0ZSB5LWNvb3JkYWludGUKKwkgKiAgIAorCSAqICAgcmV0dXJuIG5ldyBteFBvaW50KHgsIHkpOworCSAqIH0KKwkgKiAoZW5kKQorCSAqIAorCSAqIFRoZSBuZXcgcGVyaW1ldGVyIHNob3VsZCB0aGVuIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIDxteFN0eWxlUmVnaXN0cnk+IGFzIGZvbGxvd3M6CisJICogKGNvZGUpCisJICogbXhTdHlsZVJlZ2lzdHJ5LnB1dFZhbHVlKCdjdXN0b21QZXJpbWV0ZXInLCBteFBlcmltZXRlci5DdXN0b21QZXJpbWV0ZXIpOworCSAqIChlbmQpCisJICogCisJICogVGhlIGN1c3RvbSBwZXJpbWV0ZXIgYWJvdmUgY2FuIG5vdyBiZSB1c2VkIGluIGEgc3BlY2lmaWMgdmVydGV4IGFzIGZvbGxvd3M6CisJICogCisJICogKGNvZGUpCisJICogbW9kZWwuc2V0U3R5bGUodmVydGV4LCAncGVyaW1ldGVyPWN1c3RvbVBlcmltZXRlcicpOworCSAqIChlbmQpCisJICogCisJICogTm90ZSB0aGF0IHRoZSBrZXkgb2YgdGhlIDxteFN0eWxlUmVnaXN0cnk+IGVudHJ5IGZvciB0aGUgZnVuY3Rpb24gc2hvdWxkCisJICogYmUgdXNlZCBpbiBzdHJpbmcgdmFsdWVzLCB1bmxlc3MgPG14R3JhcGhWaWV3LmFsbG93RXZhbD4gaXMgdHJ1ZSwgaW4KKwkgKiB3aGljaCBjYXNlIHlvdSBjYW4gYWxzbyB1c2UgbXhQZXJpbWV0ZXIuQ3VzdG9tUGVyaW1ldGVyIGZvciB0aGUgdmFsdWUgaW4KKwkgKiB0aGUgY2VsbCBzdHlsZSBhYm92ZS4KKwkgKiAKKwkgKiBPciBpdCBjYW4gYmUgdXNlZCBmb3IgYWxsIHZlcnRpY2VzIGluIHRoZSBncmFwaCBhcyBmb2xsb3dzOgorCSAqIAorCSAqIChjb2RlKQorCSAqIHZhciBzdHlsZSA9IGdyYXBoLmdldFN0eWxlc2hlZXQoKS5nZXREZWZhdWx0VmVydGV4U3R5bGUoKTsKKwkgKiBzdHlsZVtteENvbnN0YW50cy5TVFlMRV9QRVJJTUVURVJdID0gbXhQZXJpbWV0ZXIuQ3VzdG9tUGVyaW1ldGVyOworCSAqIChlbmQpCisJICogCisJICogTm90ZSB0aGF0IHRoZSBvYmplY3QgY2FuIGJlIHVzZWQgZGlyZWN0bHkgd2hlbiBwcm9ncmFtbWF0aWNhbGx5IHNldHRpbmcKKwkgKiB0aGUgdmFsdWUsIGJ1dCB0aGUga2V5IGluIHRoZSA8bXhTdHlsZVJlZ2lzdHJ5PiBzaG91bGQgYmUgdXNlZCB3aGVuCisJICogc2V0dGluZyB0aGUgdmFsdWUgdmlhIGEga2V5LCB2YWx1ZSBwYWlyIGluIGEgY2VsbCBzdHlsZS4KKwkgKiAKKwkgKiBUaGUgcGFyYW1ldGVycyBhcmUgZXhwbGFpbmVkIGluIDxSZWN0YW5nbGVQZXJpbWV0ZXI+LgorCSAqIAorCSAqIEZ1bmN0aW9uOiBSZWN0YW5nbGVQZXJpbWV0ZXIKKwkgKiAKKwkgKiBEZXNjcmliZXMgYSByZWN0YW5ndWxhciBwZXJpbWV0ZXIgZm9yIHRoZSBnaXZlbiBib3VuZHMuCisJICoKKwkgKiBQYXJhbWV0ZXJzOgorCSAqIAorCSAqIGJvdW5kcyAtIDxteFJlY3RhbmdsZT4gdGhhdCByZXByZXNlbnRzIHRoZSBhYnNvbHV0ZSBib3VuZHMgb2YgdGhlCisJICogdmVydGV4LgorCSAqIHZlcnRleCAtIDxteENlbGxTdGF0ZT4gdGhhdCByZXByZXNlbnRzIHRoZSB2ZXJ0ZXguCisJICogbmV4dCAtIDxteFBvaW50PiB0aGF0IHJlcHJlc2VudHMgdGhlIG5lYXJlc3QgbmVpZ2hib3VyIHBvaW50IG9uIHRoZQorCSAqIGdpdmVuIGVkZ2UuCisJICogb3J0aG9nb25hbCAtIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIG9ydGhvZ29uYWwgcHJvamVjdGlvbiBvbnRvCisJICogdGhlIHBlcmltZXRlciBzaG91bGQgYmUgcmV0dXJuZWQuIElmIHRoaXMgaXMgZmFsc2UgdGhlbiB0aGUgaW50ZXJzZWN0aW9uCisJICogb2YgdGhlIHBlcmltZXRlciBhbmQgdGhlIGxpbmUgYmV0d2VlbiB0aGUgbmV4dCBhbmQgdGhlIGNlbnRlciBwb2ludCBpcworCSAqIHJldHVybmVkLgorCSAqLworCVJlY3RhbmdsZVBlcmltZXRlcjogZnVuY3Rpb24gKGJvdW5kcywgdmVydGV4LCBuZXh0LCBvcnRob2dvbmFsKQorCXsKKwkJdmFyIGN4ID0gYm91bmRzLmdldENlbnRlclgoKTsKKwkJdmFyIGN5ID0gYm91bmRzLmdldENlbnRlclkoKTsKKwkJdmFyIGR4ID0gbmV4dC54IC0gY3g7CisJCXZhciBkeSA9IG5leHQueSAtIGN5OworCQl2YXIgYWxwaGEgPSBNYXRoLmF0YW4yKGR5LCBkeCk7CisJCXZhciBwID0gbmV3IG14UG9pbnQoMCwgMCk7CisJCXZhciBwaSA9IE1hdGguUEk7CisJCXZhciBwaTIgPSBNYXRoLlBJLzI7CisJCXZhciBiZXRhID0gcGkyIC0gYWxwaGE7CisJCXZhciB0ID0gTWF0aC5hdGFuMihib3VuZHMuaGVpZ2h0LCBib3VuZHMud2lkdGgpOworCQkKKwkJaWYgKGFscGhhIDwgLXBpICsgdCB8fCBhbHBoYSA+IHBpIC0gdCkKKwkJeworCQkJLy8gTGVmdCBlZGdlCisJCQlwLnggPSBib3VuZHMueDsKKwkJCXAueSA9IGN5IC0gYm91bmRzLndpZHRoICogTWF0aC50YW4oYWxwaGEpIC8gMjsKKwkJfQorCQllbHNlIGlmIChhbHBoYSA8IC10KQorCQl7CisJCQkvLyBUb3AgRWRnZQorCQkJcC55ID0gYm91bmRzLnk7CisJCQlwLnggPSBjeCAtIGJvdW5kcy5oZWlnaHQgKiBNYXRoLnRhbihiZXRhKSAvIDI7CisJCX0KKwkJZWxzZSBpZiAoYWxwaGEgPCB0KQorCQl7CisJCQkvLyBSaWdodCBFZGdlCisJCQlwLnggPSBib3VuZHMueCArIGJvdW5kcy53aWR0aDsKKwkJCXAueSA9IGN5ICsgYm91bmRzLndpZHRoICogTWF0aC50YW4oYWxwaGEpIC8gMjsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIEJvdHRvbSBFZGdlCisJCQlwLnkgPSBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQ7CisJCQlwLnggPSBjeCArIGJvdW5kcy5oZWlnaHQgKiBNYXRoLnRhbihiZXRhKSAvIDI7CisJCX0KKwkJCisJCWlmIChvcnRob2dvbmFsKQorCQl7CisJCQlpZiAobmV4dC54ID49IGJvdW5kcy54ICYmCisJCQkJbmV4dC54IDw9IGJvdW5kcy54ICsgYm91bmRzLndpZHRoKQorCQkJeworCQkJCXAueCA9IG5leHQueDsKKwkJCX0KKwkJCWVsc2UgaWYgKG5leHQueSA+PSBib3VuZHMueSAmJgorCQkJCQkgICBuZXh0LnkgPD0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KQorCQkJeworCQkJCXAueSA9IG5leHQueTsKKwkJCX0KKwkJCWlmIChuZXh0LnggPCBib3VuZHMueCkKKwkJCXsKKwkJCQlwLnggPSBib3VuZHMueDsKKwkJCX0KKwkJCWVsc2UgaWYgKG5leHQueCA+IGJvdW5kcy54ICsgYm91bmRzLndpZHRoKQorCQkJeworCQkJCXAueCA9IGJvdW5kcy54ICsgYm91bmRzLndpZHRoOworCQkJfQorCQkJaWYgKG5leHQueSA8IGJvdW5kcy55KQorCQkJeworCQkJCXAueSA9IGJvdW5kcy55OworCQkJfQorCQkJZWxzZSBpZiAobmV4dC55ID4gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KQorCQkJeworCQkJCXAueSA9IGJvdW5kcy55ICsgYm91bmRzLmhlaWdodDsKKwkJCX0KKwkJfQorCQkKKwkJcmV0dXJuIHA7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBFbGxpcHNlUGVyaW1ldGVyCisJICogCisJICogRGVzY3JpYmVzIGFuIGVsbGlwdGljIHBlcmltZXRlci4gU2VlIDxSZWN0YW5nbGVQZXJpbWV0ZXI+CisJICogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlcnMuCisJICovCisJRWxsaXBzZVBlcmltZXRlcjogZnVuY3Rpb24gKGJvdW5kcywgdmVydGV4LCBuZXh0LCBvcnRob2dvbmFsKQorCXsKKwkJdmFyIHggPSBib3VuZHMueDsKKwkJdmFyIHkgPSBib3VuZHMueTsKKwkJdmFyIGEgPSBib3VuZHMud2lkdGggLyAyOworCQl2YXIgYiA9IGJvdW5kcy5oZWlnaHQgLyAyOworCQl2YXIgY3ggPSB4ICsgYTsKKwkJdmFyIGN5ID0geSArIGI7CisJCXZhciBweCA9IG5leHQueDsKKwkJdmFyIHB5ID0gbmV4dC55OworCQkKKwkJLy8gQ2FsY3VsYXRlcyBzdHJhaWdodCBsaW5lIGVxdWF0aW9uIHRocm91Z2gKKwkJLy8gcG9pbnQgYW5kIGVsbGlwc2UgY2VudGVyIHkgPSBkICogeCArIGgKKwkJdmFyIGR4ID0gcGFyc2VJbnQocHggLSBjeCk7CisJCXZhciBkeSA9IHBhcnNlSW50KHB5IC0gY3kpOworCQkKKwkJaWYgKGR4ID09IDAgJiYgZHkgIT0gMCkKKwkJeworCQkJcmV0dXJuIG5ldyBteFBvaW50KGN4LCBjeSArIGIgKiBkeSAvIE1hdGguYWJzKGR5KSk7CisJCX0KKwkJZWxzZSBpZiAoZHggPT0gMCAmJiBkeSA9PSAwKQorCQl7CisJCQlyZXR1cm4gbmV3IG14UG9pbnQocHgsIHB5KTsKKwkJfQorCisJCWlmIChvcnRob2dvbmFsKQorCQl7CisJCQlpZiAocHkgPj0geSAmJiBweSA8PSB5ICsgYm91bmRzLmhlaWdodCkKKwkJCXsKKwkJCQl2YXIgdHkgPSBweSAtIGN5OworCQkJCXZhciB0eCA9IE1hdGguc3FydChhKmEqKDEtKHR5KnR5KS8oYipiKSkpIHx8IDA7CisJCQkJCisJCQkJaWYgKHB4IDw9IHgpCisJCQkJeworCQkJCQl0eCA9IC10eDsKKwkJCQl9CisJCQkJCisJCQkJcmV0dXJuIG5ldyBteFBvaW50KGN4K3R4LCBweSk7CisJCQl9CisJCQkKKwkJCWlmIChweCA+PSB4ICYmIHB4IDw9IHggKyBib3VuZHMud2lkdGgpCisJCQl7CisJCQkJdmFyIHR4ID0gcHggLSBjeDsKKwkJCQl2YXIgdHkgPSBNYXRoLnNxcnQoYipiKigxLSh0eCp0eCkvKGEqYSkpKSB8fCAwOworCQkJCQorCQkJCWlmIChweSA8PSB5KQorCQkJCXsKKwkJCQkJdHkgPSAtdHk7CQorCQkJCX0KKwkJCQkKKwkJCQlyZXR1cm4gbmV3IG14UG9pbnQocHgsIGN5K3R5KTsKKwkJCX0KKwkJfQorCQkKKwkJLy8gQ2FsY3VsYXRlcyBpbnRlcnNlY3Rpb24KKwkJdmFyIGQgPSBkeSAvIGR4OworCQl2YXIgaCA9IGN5IC0gZCAqIGN4OworCQl2YXIgZSA9IGEgKiBhICogZCAqIGQgKyBiICogYjsKKwkJdmFyIGYgPSAtMiAqIGN4ICogZTsKKwkJdmFyIGcgPSBhICogYSAqIGQgKiBkICogY3ggKiBjeCArCisJCQkJYiAqIGIgKiBjeCAqIGN4IC0KKwkJCQlhICogYSAqIGIgKiBiOworCQl2YXIgZGV0ID0gTWF0aC5zcXJ0KGYgKiBmIC0gNCAqIGUgKiBnKTsKKwkJCisJCS8vIFR3byBzb2x1dGlvbnMgKHBlcmltZXRlciBwb2ludHMpCisJCXZhciB4b3V0MSA9ICgtZiArIGRldCkgLyAoMiAqIGUpOworCQl2YXIgeG91dDIgPSAoLWYgLSBkZXQpIC8gKDIgKiBlKTsKKwkJdmFyIHlvdXQxID0gZCAqIHhvdXQxICsgaDsKKwkJdmFyIHlvdXQyID0gZCAqIHhvdXQyICsgaDsKKwkJdmFyIGRpc3QxID0gTWF0aC5zcXJ0KE1hdGgucG93KCh4b3V0MSAtIHB4KSwgMikKKwkJCQkJKyBNYXRoLnBvdygoeW91dDEgLSBweSksIDIpKTsKKwkJdmFyIGRpc3QyID0gTWF0aC5zcXJ0KE1hdGgucG93KCh4b3V0MiAtIHB4KSwgMikKKwkJCQkJKyBNYXRoLnBvdygoeW91dDIgLSBweSksIDIpKTsKKwkJCQkJCisJCS8vIENvcnJlY3Qgc29sdXRpb24KKwkJdmFyIHhvdXQgPSAwOworCQl2YXIgeW91dCA9IDA7CisJCQorCQlpZiAoZGlzdDEgPCBkaXN0MikKKwkJeworCQkJeG91dCA9IHhvdXQxOworCQkJeW91dCA9IHlvdXQxOworCQl9CisJCWVsc2UKKwkJeworCQkJeG91dCA9IHhvdXQyOworCQkJeW91dCA9IHlvdXQyOworCQl9CisJCQorCQlyZXR1cm4gbmV3IG14UG9pbnQoeG91dCwgeW91dCk7CisJfSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBSaG9tYnVzUGVyaW1ldGVyCisJICogCisJICogRGVzY3JpYmVzIGEgcmhvbWJ1cyAoYWthIGRpYW1vbmQpIHBlcmltZXRlci4gU2VlIDxSZWN0YW5nbGVQZXJpbWV0ZXI+CisJICogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlcnMuCisJICovCisJUmhvbWJ1c1BlcmltZXRlcjogZnVuY3Rpb24gKGJvdW5kcywgdmVydGV4LCBuZXh0LCBvcnRob2dvbmFsKQorCXsKKwkJdmFyIHggPSBib3VuZHMueDsKKwkJdmFyIHkgPSBib3VuZHMueTsKKwkJdmFyIHcgPSBib3VuZHMud2lkdGg7CisJCXZhciBoID0gYm91bmRzLmhlaWdodDsKKwkJCisJCXZhciBjeCA9IHggKyB3IC8gMjsKKwkJdmFyIGN5ID0geSArIGggLyAyOworCisJCXZhciBweCA9IG5leHQueDsKKwkJdmFyIHB5ID0gbmV4dC55OworCisJCS8vIFNwZWNpYWwgY2FzZSBmb3IgaW50ZXJzZWN0aW5nIHRoZSBkaWFtb25kJ3MgY29ybmVycworCQlpZiAoY3ggPT0gcHgpCisJCXsKKwkJCWlmIChjeSA+IHB5KQorCQkJeworCQkJCXJldHVybiBuZXcgbXhQb2ludChjeCwgeSk7IC8vIHRvcAorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBuZXcgbXhQb2ludChjeCwgeSArIGgpOyAvLyBib3R0b20KKwkJCX0KKwkJfQorCQllbHNlIGlmIChjeSA9PSBweSkKKwkJeworCQkJaWYgKGN4ID4gcHgpCisJCQl7CisJCQkJcmV0dXJuIG5ldyBteFBvaW50KHgsIGN5KTsgLy8gbGVmdAorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBuZXcgbXhQb2ludCh4ICsgdywgY3kpOyAvLyByaWdodAorCQkJfQorCQl9CisJCQorCQl2YXIgdHggPSBjeDsKKwkJdmFyIHR5ID0gY3k7CisJCQorCQlpZiAob3J0aG9nb25hbCkKKwkJeworCQkJaWYgKHB4ID49IHggJiYgcHggPD0geCArIHcpCisJCQl7CisJCQkJdHggPSBweDsKKwkJCX0KKwkJCWVsc2UgaWYgKHB5ID49IHkgJiYgcHkgPD0geSArIGgpCisJCQl7CisJCQkJdHkgPSBweTsKKwkJCX0KKwkJfQorCQkKKwkJLy8gSW4gd2hpY2ggcXVhZHJhbnQgd2lsbCB0aGUgaW50ZXJzZWN0aW9uIGJlPworCQkvLyBzZXQgdGhlIHNsb3BlIGFuZCBvZmZzZXQgb2YgdGhlIGJvcmRlciBsaW5lIGFjY29yZGluZ2x5CisJCWlmIChweCA8IGN4KQorCQl7CisJCQlpZiAocHkgPCBjeSkKKwkJCXsKKwkJCQlyZXR1cm4gbXhVdGlscy5pbnRlcnNlY3Rpb24ocHgsIHB5LCB0eCwgdHksIGN4LCB5LCB4LCBjeSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIG14VXRpbHMuaW50ZXJzZWN0aW9uKHB4LCBweSwgdHgsIHR5LCBjeCwgeSArIGgsIHgsIGN5KTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChweSA8IGN5KQorCQl7CisJCQlyZXR1cm4gbXhVdGlscy5pbnRlcnNlY3Rpb24ocHgsIHB5LCB0eCwgdHksIGN4LCB5LCB4ICsgdywgY3kpOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuIG14VXRpbHMuaW50ZXJzZWN0aW9uKHB4LCBweSwgdHgsIHR5LCBjeCwgeSArIGgsIHggKyB3LCBjeSk7CisJCX0KKwl9LAorCQorCS8qKgorCSAqIEZ1bmN0aW9uOiBUcmlhbmdsZVBlcmltZXRlcgorCSAqIAorCSAqIERlc2NyaWJlcyBhIHRyaWFuZ2xlIHBlcmltZXRlci4gU2VlIDxSZWN0YW5nbGVQZXJpbWV0ZXI+CisJICogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlcnMuCisJICovCisJVHJpYW5nbGVQZXJpbWV0ZXI6IGZ1bmN0aW9uIChib3VuZHMsIHZlcnRleCwgbmV4dCwgb3J0aG9nb25hbCkKKwl7CisJCXZhciBkaXJlY3Rpb24gPSAodmVydGV4ICE9IG51bGwpID8KKwkJCXZlcnRleC5zdHlsZVtteENvbnN0YW50cy5TVFlMRV9ESVJFQ1RJT05dIDogbnVsbDsKKwkJdmFyIHZlcnRpY2FsID0gZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9OT1JUSCB8fAorCQkJZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9TT1VUSDsKKworCQl2YXIgeCA9IGJvdW5kcy54OworCQl2YXIgeSA9IGJvdW5kcy55OworCQl2YXIgdyA9IGJvdW5kcy53aWR0aDsKKwkJdmFyIGggPSBib3VuZHMuaGVpZ2h0OworCQkKKwkJdmFyIGN4ID0geCArIHcgLyAyOworCQl2YXIgY3kgPSB5ICsgaCAvIDI7CisJCQorCQl2YXIgc3RhcnQgPSBuZXcgbXhQb2ludCh4LCB5KTsKKwkJdmFyIGNvcm5lciA9IG5ldyBteFBvaW50KHggKyB3LCBjeSk7CisJCXZhciBlbmQgPSBuZXcgbXhQb2ludCh4LCB5ICsgaCk7CisJCQorCQlpZiAoZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9OT1JUSCkKKwkJeworCQkJc3RhcnQgPSBlbmQ7CisJCQljb3JuZXIgPSBuZXcgbXhQb2ludChjeCwgeSk7CisJCQllbmQgPSBuZXcgbXhQb2ludCh4ICsgdywgeSArIGgpOworCQl9CisJCWVsc2UgaWYgKGRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fU09VVEgpCisJCXsKKwkJCWNvcm5lciA9IG5ldyBteFBvaW50KGN4LCB5ICsgaCk7CisJCQllbmQgPSBuZXcgbXhQb2ludCh4ICsgdywgeSk7CisJCX0KKwkJZWxzZSBpZiAoZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9XRVNUKQorCQl7CisJCQlzdGFydCA9IG5ldyBteFBvaW50KHggKyB3LCB5KTsKKwkJCWNvcm5lciA9IG5ldyBteFBvaW50KHgsIGN5KTsKKwkJCWVuZCA9IG5ldyBteFBvaW50KHggKyB3LCB5ICsgaCk7CisJCX0KKworCQl2YXIgZHggPSBuZXh0LnggLSBjeDsKKwkJdmFyIGR5ID0gbmV4dC55IC0gY3k7CisKKwkJdmFyIGFscGhhID0gKHZlcnRpY2FsKSA/IE1hdGguYXRhbjIoZHgsIGR5KSA6IE1hdGguYXRhbjIoZHksIGR4KTsKKwkJdmFyIHQgPSAodmVydGljYWwpID8gTWF0aC5hdGFuMih3LCBoKSA6IE1hdGguYXRhbjIoaCwgdyk7CisJCQorCQl2YXIgYmFzZSA9IGZhbHNlOworCQkKKwkJaWYgKGRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEggfHwKKwkJCWRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fV0VTVCkKKwkJeworCQkJYmFzZSA9IGFscGhhID4gLXQgJiYgYWxwaGEgPCB0OworCQl9CisJCWVsc2UKKwkJeworCQkJYmFzZSA9IGFscGhhIDwgLU1hdGguUEkgKyB0IHx8IGFscGhhID4gTWF0aC5QSSAtIHQ7CQorCQl9CisKKwkJdmFyIHJlc3VsdCA9IG51bGw7CQkJCisKKwkJaWYgKGJhc2UpCisJCXsKKwkJCWlmIChvcnRob2dvbmFsICYmICgodmVydGljYWwgJiYgbmV4dC54ID49IHN0YXJ0LnggJiYgbmV4dC54IDw9IGVuZC54KSB8fAorCQkJCSghdmVydGljYWwgJiYgbmV4dC55ID49IHN0YXJ0LnkgJiYgbmV4dC55IDw9IGVuZC55KSkpCisJCQl7CisJCQkJaWYgKHZlcnRpY2FsKQorCQkJCXsKKwkJCQkJcmVzdWx0ID0gbmV3IG14UG9pbnQobmV4dC54LCBzdGFydC55KTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJcmVzdWx0ID0gbmV3IG14UG9pbnQoc3RhcnQueCwgbmV4dC55KTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKGRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEgpCisJCQkJeworCQkJCQlyZXN1bHQgPSBuZXcgbXhQb2ludCh4ICsgdyAvIDIgKyBoICogTWF0aC50YW4oYWxwaGEpIC8gMiwKKwkJCQkJCXkgKyBoKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9TT1VUSCkKKwkJCQl7CisJCQkJCXJlc3VsdCA9IG5ldyBteFBvaW50KHggKyB3IC8gMiAtIGggKiBNYXRoLnRhbihhbHBoYSkgLyAyLAorCQkJCQkJeSk7CisJCQkJfQorCQkJCWVsc2UgaWYgKGRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fV0VTVCkKKwkJCQl7CisJCQkJCXJlc3VsdCA9IG5ldyBteFBvaW50KHggKyB3LCB5ICsgaCAvIDIgKworCQkJCQkJdyAqIE1hdGgudGFuKGFscGhhKSAvIDIpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlyZXN1bHQgPSBuZXcgbXhQb2ludCh4LCB5ICsgaCAvIDIgLQorCQkJCQkJdyAqIE1hdGgudGFuKGFscGhhKSAvIDIpOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChvcnRob2dvbmFsKQorCQkJeworCQkJCXZhciBwdCA9IG5ldyBteFBvaW50KGN4LCBjeSk7CisJCQorCQkJCWlmIChuZXh0LnkgPj0geSAmJiBuZXh0LnkgPD0geSArIGgpCisJCQkJeworCQkJCQlwdC54ID0gKHZlcnRpY2FsKSA/IGN4IDogKAorCQkJCQkJKGRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fV0VTVCkgPworCQkJCQkJCXggKyB3IDogeCk7CisJCQkJCXB0LnkgPSBuZXh0Lnk7CisJCQkJfQorCQkJCWVsc2UgaWYgKG5leHQueCA+PSB4ICYmIG5leHQueCA8PSB4ICsgdykKKwkJCQl7CisJCQkJCXB0LnggPSBuZXh0Lng7CisJCQkJCXB0LnkgPSAoIXZlcnRpY2FsKSA/IGN5IDogKAorCQkJCQkJKGRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fTk9SVEgpID8KKwkJCQkJCQl5ICsgaCA6IHkpOworCQkJCX0KKwkJCQkKKwkJCQkvLyBDb21wdXRlIGFuZ2xlCisJCQkJZHggPSBuZXh0LnggLSBwdC54OworCQkJCWR5ID0gbmV4dC55IC0gcHQueTsKKwkJCQkKKwkJCQljeCA9IHB0Lng7CisJCQkJY3kgPSBwdC55OworCQkJfQorCisJCQlpZiAoKHZlcnRpY2FsICYmIG5leHQueCA8PSB4ICsgdyAvIDIpIHx8CisJCQkJKCF2ZXJ0aWNhbCAmJiBuZXh0LnkgPD0geSArIGggLyAyKSkKKwkJCXsKKwkJCQlyZXN1bHQgPSBteFV0aWxzLmludGVyc2VjdGlvbihuZXh0LngsIG5leHQueSwgY3gsIGN5LAorCQkJCQlzdGFydC54LCBzdGFydC55LCBjb3JuZXIueCwgY29ybmVyLnkpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJlc3VsdCA9IG14VXRpbHMuaW50ZXJzZWN0aW9uKG5leHQueCwgbmV4dC55LCBjeCwgY3ksCisJCQkJCWNvcm5lci54LCBjb3JuZXIueSwgZW5kLngsIGVuZC55KTsKKwkJCX0KKwkJfQorCQkKKwkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQl7CisJCQlyZXN1bHQgPSBuZXcgbXhQb2ludChjeCwgY3kpOworCQl9CisJCQorCQlyZXR1cm4gcmVzdWx0OworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IEhleGFnb25QZXJpbWV0ZXIKKwkgKiAKKwkgKiBEZXNjcmliZXMgYSBoZXhhZ29uIHBlcmltZXRlci4gU2VlIDxSZWN0YW5nbGVQZXJpbWV0ZXI+CisJICogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlcnMuCisJICovCisJSGV4YWdvblBlcmltZXRlcjogZnVuY3Rpb24gKGJvdW5kcywgdmVydGV4LCBuZXh0LCBvcnRob2dvbmFsKQorCXsKKwkJdmFyIHggPSBib3VuZHMueDsKKwkJdmFyIHkgPSBib3VuZHMueTsKKwkJdmFyIHcgPSBib3VuZHMud2lkdGg7CisJCXZhciBoID0gYm91bmRzLmhlaWdodDsKKworCQl2YXIgY3ggPSBib3VuZHMuZ2V0Q2VudGVyWCgpOworCQl2YXIgY3kgPSBib3VuZHMuZ2V0Q2VudGVyWSgpOworCQl2YXIgcHggPSBuZXh0Lng7CisJCXZhciBweSA9IG5leHQueTsKKwkJdmFyIGR4ID0gcHggLSBjeDsKKwkJdmFyIGR5ID0gcHkgLSBjeTsKKwkJdmFyIGFscGhhID0gLU1hdGguYXRhbjIoZHksIGR4KTsKKwkJdmFyIHBpID0gTWF0aC5QSTsKKwkJdmFyIHBpMiA9IE1hdGguUEkgLyAyOworCisJCXZhciByZXN1bHQgPSBuZXcgbXhQb2ludChjeCwgY3kpOworCisJCXZhciBkaXJlY3Rpb24gPSAodmVydGV4ICE9IG51bGwpID8gbXhVdGlscy5nZXRWYWx1ZSgKKwkJCQl2ZXJ0ZXguc3R5bGUsIG14Q29uc3RhbnRzLlNUWUxFX0RJUkVDVElPTiwKKwkJCQlteENvbnN0YW50cy5ESVJFQ1RJT05fRUFTVCkgOiBteENvbnN0YW50cy5ESVJFQ1RJT05fRUFTVDsKKwkJdmFyIHZlcnRpY2FsID0gZGlyZWN0aW9uID09IG14Q29uc3RhbnRzLkRJUkVDVElPTl9OT1JUSAorCQkJCXx8IGRpcmVjdGlvbiA9PSBteENvbnN0YW50cy5ESVJFQ1RJT05fU09VVEg7CisJCXZhciBhID0gbmV3IG14UG9pbnQoKTsKKwkJdmFyIGIgPSBuZXcgbXhQb2ludCgpOworCisJCS8vT25seSBjb25zaWRlciBjb3JyZWN0cyBxdWFkcmFudHMgZm9yIHRoZSBvcnRob2dvbmFsIGNhc2UuCisJCWlmICgocHggPCB4KSAmJiAocHkgPCB5KSB8fCAocHggPCB4KSAmJiAocHkgPiB5ICsgaCkKKwkJCQl8fCAocHggPiB4ICsgdykgJiYgKHB5IDwgeSkgfHwgKHB4ID4geCArIHcpICYmIChweSA+IHkgKyBoKSkKKwkJeworCQkJb3J0aG9nb25hbCA9IGZhbHNlOworCQl9CisKKwkJaWYgKG9ydGhvZ29uYWwpCisJCXsKKwkJCWlmICh2ZXJ0aWNhbCkKKwkJCXsKKwkJCQkvL1NwZWNpYWwgY2FzZXMgd2hlcmUgaW50ZXJzZWN0cyB3aXRoIGhleGFnb24gY29ybmVycworCQkJCWlmIChweCA9PSBjeCkKKwkJCQl7CisJCQkJCWlmIChweSA8PSB5KQorCQkJCQl7CisJCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoY3gsIHkpOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKHB5ID49IHkgKyBoKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoY3gsIHkgKyBoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChweCA8IHgpCisJCQkJeworCQkJCQlpZiAocHkgPT0geSArIGggLyA0KQorCQkJCQl7CisJCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoeCwgeSArIGggLyA0KTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChweSA9PSB5ICsgMyAqIGggLyA0KQorCQkJCQl7CisJCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoeCwgeSArIDMgKiBoIC8gNCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAocHggPiB4ICsgdykKKwkJCQl7CisJCQkJCWlmIChweSA9PSB5ICsgaCAvIDQpCisJCQkJCXsKKwkJCQkJCXJldHVybiBuZXcgbXhQb2ludCh4ICsgdywgeSArIGggLyA0KTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChweSA9PSB5ICsgMyAqIGggLyA0KQorCQkJCQl7CisJCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoeCArIHcsIHkgKyAzICogaCAvIDQpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHB4ID09IHgpCisJCQkJeworCQkJCQlpZiAocHkgPCBjeSkKKwkJCQkJeworCQkJCQkJcmV0dXJuIG5ldyBteFBvaW50KHgsIHkgKyBoIC8gNCk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocHkgPiBjeSkKKwkJCQkJeworCQkJCQkJcmV0dXJuIG5ldyBteFBvaW50KHgsIHkgKyAzICogaCAvIDQpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHB4ID09IHggKyB3KQorCQkJCXsKKwkJCQkJaWYgKHB5IDwgY3kpCisJCQkJCXsKKwkJCQkJCXJldHVybiBuZXcgbXhQb2ludCh4ICsgdywgeSArIGggLyA0KTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChweSA+IGN5KQorCQkJCQl7CisJCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoeCArIHcsIHkgKyAzICogaCAvIDQpOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChweSA9PSB5KQorCQkJCXsKKwkJCQkJcmV0dXJuIG5ldyBteFBvaW50KGN4LCB5KTsKKwkJCQl9CisJCQkJZWxzZSBpZiAocHkgPT0geSArIGgpCisJCQkJeworCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoY3gsIHkgKyBoKTsKKwkJCQl9CisKKwkJCQlpZiAocHggPCBjeCkKKwkJCQl7CisJCQkJCWlmICgocHkgPiB5ICsgaCAvIDQpICYmIChweSA8IHkgKyAzICogaCAvIDQpKQorCQkJCQl7CisJCQkJCQlhID0gbmV3IG14UG9pbnQoeCwgeSk7CisJCQkJCQliID0gbmV3IG14UG9pbnQoeCwgeSArIGgpOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKHB5IDwgeSArIGggLyA0KQorCQkJCQl7CisJCQkJCQlhID0gbmV3IG14UG9pbnQoeCAtIE1hdGguZmxvb3IoMC41ICogdyksIHkKKwkJCQkJCQkJKyBNYXRoLmZsb29yKDAuNSAqIGgpKTsKKwkJCQkJCWIgPSBuZXcgbXhQb2ludCh4ICsgdywgeSAtIE1hdGguZmxvb3IoMC4yNSAqIGgpKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChweSA+IHkgKyAzICogaCAvIDQpCisJCQkJCXsKKwkJCQkJCWEgPSBuZXcgbXhQb2ludCh4IC0gTWF0aC5mbG9vcigwLjUgKiB3KSwgeQorCQkJCQkJCQkrIE1hdGguZmxvb3IoMC41ICogaCkpOworCQkJCQkJYiA9IG5ldyBteFBvaW50KHggKyB3LCB5ICsgTWF0aC5mbG9vcigxLjI1ICogaCkpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHB4ID4gY3gpCisJCQkJeworCQkJCQlpZiAoKHB5ID4geSArIGggLyA0KSAmJiAocHkgPCB5ICsgMyAqIGggLyA0KSkKKwkJCQkJeworCQkJCQkJYSA9IG5ldyBteFBvaW50KHggKyB3LCB5KTsKKwkJCQkJCWIgPSBuZXcgbXhQb2ludCh4ICsgdywgeSArIGgpOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKHB5IDwgeSArIGggLyA0KQorCQkJCQl7CisJCQkJCQlhID0gbmV3IG14UG9pbnQoeCwgeSAtIE1hdGguZmxvb3IoMC4yNSAqIGgpKTsKKwkJCQkJCWIgPSBuZXcgbXhQb2ludCh4ICsgTWF0aC5mbG9vcigxLjUgKiB3KSwgeQorCQkJCQkJCQkrIE1hdGguZmxvb3IoMC41ICogaCkpOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKHB5ID4geSArIDMgKiBoIC8gNCkKKwkJCQkJeworCQkJCQkJYSA9IG5ldyBteFBvaW50KHggKyBNYXRoLmZsb29yKDEuNSAqIHcpLCB5CisJCQkJCQkJCSsgTWF0aC5mbG9vcigwLjUgKiBoKSk7CisJCQkJCQliID0gbmV3IG14UG9pbnQoeCwgeSArIE1hdGguZmxvb3IoMS4yNSAqIGgpKTsKKwkJCQkJfQorCQkJCX0KKworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8vU3BlY2lhbCBjYXNlcyB3aGVyZSBpbnRlcnNlY3RzIHdpdGggaGV4YWdvbiBjb3JuZXJzCisJCQkJaWYgKHB5ID09IGN5KQorCQkJCXsKKwkJCQkJaWYgKHB4IDw9IHgpCisJCQkJCXsKKwkJCQkJCXJldHVybiBuZXcgbXhQb2ludCh4LCB5ICsgaCAvIDIpOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKHB4ID49IHggKyB3KQorCQkJCQl7CisJCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoeCArIHcsIHkgKyBoIC8gMik7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSBpZiAocHkgPCB5KQorCQkJCXsKKwkJCQkJaWYgKHB4ID09IHggKyB3IC8gNCkKKwkJCQkJeworCQkJCQkJcmV0dXJuIG5ldyBteFBvaW50KHggKyB3IC8gNCwgeSk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocHggPT0geCArIDMgKiB3IC8gNCkKKwkJCQkJeworCQkJCQkJcmV0dXJuIG5ldyBteFBvaW50KHggKyAzICogdyAvIDQsIHkpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHB5ID4geSArIGgpCisJCQkJeworCQkJCQlpZiAocHggPT0geCArIHcgLyA0KQorCQkJCQl7CisJCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoeCArIHcgLyA0LCB5ICsgaCk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocHggPT0geCArIDMgKiB3IC8gNCkKKwkJCQkJeworCQkJCQkJcmV0dXJuIG5ldyBteFBvaW50KHggKyAzICogdyAvIDQsIHkgKyBoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChweSA9PSB5KQorCQkJCXsKKwkJCQkJaWYgKHB4IDwgY3gpCisJCQkJCXsKKwkJCQkJCXJldHVybiBuZXcgbXhQb2ludCh4ICsgdyAvIDQsIHkpOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKHB4ID4gY3gpCisJCQkJCXsKKwkJCQkJCXJldHVybiBuZXcgbXhQb2ludCh4ICsgMyAqIHcgLyA0LCB5KTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChweSA9PSB5ICsgaCkKKwkJCQl7CisJCQkJCWlmIChweCA8IGN4KQorCQkJCQl7CisJCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoeCArIHcgLyA0LCB5ICsgaCk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocHkgPiBjeSkKKwkJCQkJeworCQkJCQkJcmV0dXJuIG5ldyBteFBvaW50KHggKyAzICogdyAvIDQsIHkgKyBoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAocHggPT0geCkKKwkJCQl7CisJCQkJCXJldHVybiBuZXcgbXhQb2ludCh4LCBjeSk7CisJCQkJfQorCQkJCWVsc2UgaWYgKHB4ID09IHggKyB3KQorCQkJCXsKKwkJCQkJcmV0dXJuIG5ldyBteFBvaW50KHggKyB3LCBjeSk7CisJCQkJfQorCisJCQkJaWYgKHB5IDwgY3kpCisJCQkJeworCQkJCQlpZiAoKHB4ID4geCArIHcgLyA0KSAmJiAocHggPCB4ICsgMyAqIHcgLyA0KSkKKwkJCQkJeworCQkJCQkJYSA9IG5ldyBteFBvaW50KHgsIHkpOworCQkJCQkJYiA9IG5ldyBteFBvaW50KHggKyB3LCB5KTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChweCA8IHggKyB3IC8gNCkKKwkJCQkJeworCQkJCQkJYSA9IG5ldyBteFBvaW50KHggLSBNYXRoLmZsb29yKDAuMjUgKiB3KSwgeSArIGgpOworCQkJCQkJYiA9IG5ldyBteFBvaW50KHggKyBNYXRoLmZsb29yKDAuNSAqIHcpLCB5CisJCQkJCQkJCS0gTWF0aC5mbG9vcigwLjUgKiBoKSk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAocHggPiB4ICsgMyAqIHcgLyA0KQorCQkJCQl7CisJCQkJCQlhID0gbmV3IG14UG9pbnQoeCArIE1hdGguZmxvb3IoMC41ICogdyksIHkKKwkJCQkJCQkJLSBNYXRoLmZsb29yKDAuNSAqIGgpKTsKKwkJCQkJCWIgPSBuZXcgbXhQb2ludCh4ICsgTWF0aC5mbG9vcigxLjI1ICogdyksIHkgKyBoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChweSA+IGN5KQorCQkJCXsKKwkJCQkJaWYgKChweCA+IHggKyB3IC8gNCkgJiYgKHB4IDwgeCArIDMgKiB3IC8gNCkpCisJCQkJCXsKKwkJCQkJCWEgPSBuZXcgbXhQb2ludCh4LCB5ICsgaCk7CisJCQkJCQliID0gbmV3IG14UG9pbnQoeCArIHcsIHkgKyBoKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChweCA8IHggKyB3IC8gNCkKKwkJCQkJeworCQkJCQkJYSA9IG5ldyBteFBvaW50KHggLSBNYXRoLmZsb29yKDAuMjUgKiB3KSwgeSk7CisJCQkJCQliID0gbmV3IG14UG9pbnQoeCArIE1hdGguZmxvb3IoMC41ICogdyksIHkKKwkJCQkJCQkJKyBNYXRoLmZsb29yKDEuNSAqIGgpKTsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChweCA+IHggKyAzICogdyAvIDQpCisJCQkJCXsKKwkJCQkJCWEgPSBuZXcgbXhQb2ludCh4ICsgTWF0aC5mbG9vcigwLjUgKiB3KSwgeQorCQkJCQkJCQkrIE1hdGguZmxvb3IoMS41ICogaCkpOworCQkJCQkJYiA9IG5ldyBteFBvaW50KHggKyBNYXRoLmZsb29yKDEuMjUgKiB3KSwgeSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJCXZhciB0eCA9IGN4OworCQkJdmFyIHR5ID0gY3k7CisKKwkJCWlmIChweCA+PSB4ICYmIHB4IDw9IHggKyB3KQorCQkJeworCQkJCXR4ID0gcHg7CisJCQkJCisJCQkJaWYgKHB5IDwgY3kpCisJCQkJeworCQkJCQl0eSA9IHkgKyBoOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl0eSA9IHk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAocHkgPj0geSAmJiBweSA8PSB5ICsgaCkKKwkJCXsKKwkJCQl0eSA9IHB5OworCQkJCQorCQkJCWlmIChweCA8IGN4KQorCQkJCXsKKwkJCQkJdHggPSB4ICsgdzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdHggPSB4OworCQkJCX0KKwkJCX0KKworCQkJcmVzdWx0ID0gbXhVdGlscy5pbnRlcnNlY3Rpb24odHgsIHR5LCBuZXh0LngsIG5leHQueSwgYS54LCBhLnksIGIueCwgYi55KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICh2ZXJ0aWNhbCkKKwkJCXsKKwkJCQl2YXIgYmV0YSA9IE1hdGguYXRhbjIoaCAvIDQsIHcgLyAyKTsKKworCQkJCS8vU3BlY2lhbCBjYXNlcyB3aGVyZSBpbnRlcnNlY3RzIHdpdGggaGV4YWdvbiBjb3JuZXJzCisJCQkJaWYgKGFscGhhID09IGJldGEpCisJCQkJeworCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoeCArIHcsIHkgKyBNYXRoLmZsb29yKDAuMjUgKiBoKSk7CisJCQkJfQorCQkJCWVsc2UgaWYgKGFscGhhID09IHBpMikKKwkJCQl7CisJCQkJCXJldHVybiBuZXcgbXhQb2ludCh4ICsgTWF0aC5mbG9vcigwLjUgKiB3KSwgeSk7CisJCQkJfQorCQkJCWVsc2UgaWYgKGFscGhhID09IChwaSAtIGJldGEpKQorCQkJCXsKKwkJCQkJcmV0dXJuIG5ldyBteFBvaW50KHgsIHkgKyBNYXRoLmZsb29yKDAuMjUgKiBoKSk7CisJCQkJfQorCQkJCWVsc2UgaWYgKGFscGhhID09IC1iZXRhKQorCQkJCXsKKwkJCQkJcmV0dXJuIG5ldyBteFBvaW50KHggKyB3LCB5ICsgTWF0aC5mbG9vcigwLjc1ICogaCkpOworCQkJCX0KKwkJCQllbHNlIGlmIChhbHBoYSA9PSAoLXBpMikpCisJCQkJeworCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoeCArIE1hdGguZmxvb3IoMC41ICogdyksIHkgKyBoKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoYWxwaGEgPT0gKC1waSArIGJldGEpKQorCQkJCXsKKwkJCQkJcmV0dXJuIG5ldyBteFBvaW50KHgsIHkgKyBNYXRoLmZsb29yKDAuNzUgKiBoKSk7CisJCQkJfQorCisJCQkJaWYgKChhbHBoYSA8IGJldGEpICYmIChhbHBoYSA+IC1iZXRhKSkKKwkJCQl7CisJCQkJCWEgPSBuZXcgbXhQb2ludCh4ICsgdywgeSk7CisJCQkJCWIgPSBuZXcgbXhQb2ludCh4ICsgdywgeSArIGgpOworCQkJCX0KKwkJCQllbHNlIGlmICgoYWxwaGEgPiBiZXRhKSAmJiAoYWxwaGEgPCBwaTIpKQorCQkJCXsKKwkJCQkJYSA9IG5ldyBteFBvaW50KHgsIHkgLSBNYXRoLmZsb29yKDAuMjUgKiBoKSk7CisJCQkJCWIgPSBuZXcgbXhQb2ludCh4ICsgTWF0aC5mbG9vcigxLjUgKiB3KSwgeQorCQkJCQkJCSsgTWF0aC5mbG9vcigwLjUgKiBoKSk7CisJCQkJfQorCQkJCWVsc2UgaWYgKChhbHBoYSA+IHBpMikgJiYgKGFscGhhIDwgKHBpIC0gYmV0YSkpKQorCQkJCXsKKwkJCQkJYSA9IG5ldyBteFBvaW50KHggLSBNYXRoLmZsb29yKDAuNSAqIHcpLCB5CisJCQkJCQkJKyBNYXRoLmZsb29yKDAuNSAqIGgpKTsKKwkJCQkJYiA9IG5ldyBteFBvaW50KHggKyB3LCB5IC0gTWF0aC5mbG9vcigwLjI1ICogaCkpOworCQkJCX0KKwkJCQllbHNlIGlmICgoKGFscGhhID4gKHBpIC0gYmV0YSkpICYmIChhbHBoYSA8PSBwaSkpCisJCQkJCQl8fCAoKGFscGhhIDwgKC1waSArIGJldGEpKSAmJiAoYWxwaGEgPj0gLXBpKSkpCisJCQkJeworCQkJCQlhID0gbmV3IG14UG9pbnQoeCwgeSk7CisJCQkJCWIgPSBuZXcgbXhQb2ludCh4LCB5ICsgaCk7CisJCQkJfQorCQkJCWVsc2UgaWYgKChhbHBoYSA8IC1iZXRhKSAmJiAoYWxwaGEgPiAtcGkyKSkKKwkJCQl7CisJCQkJCWEgPSBuZXcgbXhQb2ludCh4ICsgTWF0aC5mbG9vcigxLjUgKiB3KSwgeQorCQkJCQkJCSsgTWF0aC5mbG9vcigwLjUgKiBoKSk7CisJCQkJCWIgPSBuZXcgbXhQb2ludCh4LCB5ICsgTWF0aC5mbG9vcigxLjI1ICogaCkpOworCQkJCX0KKwkJCQllbHNlIGlmICgoYWxwaGEgPCAtcGkyKSAmJiAoYWxwaGEgPiAoLXBpICsgYmV0YSkpKQorCQkJCXsKKwkJCQkJYSA9IG5ldyBteFBvaW50KHggLSBNYXRoLmZsb29yKDAuNSAqIHcpLCB5CisJCQkJCQkJKyBNYXRoLmZsb29yKDAuNSAqIGgpKTsKKwkJCQkJYiA9IG5ldyBteFBvaW50KHggKyB3LCB5ICsgTWF0aC5mbG9vcigxLjI1ICogaCkpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl2YXIgYmV0YSA9IE1hdGguYXRhbjIoaCAvIDIsIHcgLyA0KTsKKworCQkJCS8vU3BlY2lhbCBjYXNlcyB3aGVyZSBpbnRlcnNlY3RzIHdpdGggaGV4YWdvbiBjb3JuZXJzCisJCQkJaWYgKGFscGhhID09IGJldGEpCisJCQkJeworCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoeCArIE1hdGguZmxvb3IoMC43NSAqIHcpLCB5KTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoYWxwaGEgPT0gKHBpIC0gYmV0YSkpCisJCQkJeworCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoeCArIE1hdGguZmxvb3IoMC4yNSAqIHcpLCB5KTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKGFscGhhID09IHBpKSB8fCAoYWxwaGEgPT0gLXBpKSkKKwkJCQl7CisJCQkJCXJldHVybiBuZXcgbXhQb2ludCh4LCB5ICsgTWF0aC5mbG9vcigwLjUgKiBoKSk7CisJCQkJfQorCQkJCWVsc2UgaWYgKGFscGhhID09IDApCisJCQkJeworCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoeCArIHcsIHkgKyBNYXRoLmZsb29yKDAuNSAqIGgpKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoYWxwaGEgPT0gLWJldGEpCisJCQkJeworCQkJCQlyZXR1cm4gbmV3IG14UG9pbnQoeCArIE1hdGguZmxvb3IoMC43NSAqIHcpLCB5ICsgaCk7CisJCQkJfQorCQkJCWVsc2UgaWYgKGFscGhhID09ICgtcGkgKyBiZXRhKSkKKwkJCQl7CisJCQkJCXJldHVybiBuZXcgbXhQb2ludCh4ICsgTWF0aC5mbG9vcigwLjI1ICogdyksIHkgKyBoKTsKKwkJCQl9CisKKwkJCQlpZiAoKGFscGhhID4gMCkgJiYgKGFscGhhIDwgYmV0YSkpCisJCQkJeworCQkJCQlhID0gbmV3IG14UG9pbnQoeCArIE1hdGguZmxvb3IoMC41ICogdyksIHkKKwkJCQkJCQktIE1hdGguZmxvb3IoMC41ICogaCkpOworCQkJCQliID0gbmV3IG14UG9pbnQoeCArIE1hdGguZmxvb3IoMS4yNSAqIHcpLCB5ICsgaCk7CisJCQkJfQorCQkJCWVsc2UgaWYgKChhbHBoYSA+IGJldGEpICYmIChhbHBoYSA8IChwaSAtIGJldGEpKSkKKwkJCQl7CisJCQkJCWEgPSBuZXcgbXhQb2ludCh4LCB5KTsKKwkJCQkJYiA9IG5ldyBteFBvaW50KHggKyB3LCB5KTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKGFscGhhID4gKHBpIC0gYmV0YSkpICYmIChhbHBoYSA8IHBpKSkKKwkJCQl7CisJCQkJCWEgPSBuZXcgbXhQb2ludCh4IC0gTWF0aC5mbG9vcigwLjI1ICogdyksIHkgKyBoKTsKKwkJCQkJYiA9IG5ldyBteFBvaW50KHggKyBNYXRoLmZsb29yKDAuNSAqIHcpLCB5CisJCQkJCQkJLSBNYXRoLmZsb29yKDAuNSAqIGgpKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKGFscGhhIDwgMCkgJiYgKGFscGhhID4gLWJldGEpKQorCQkJCXsKKwkJCQkJYSA9IG5ldyBteFBvaW50KHggKyBNYXRoLmZsb29yKDAuNSAqIHcpLCB5CisJCQkJCQkJKyBNYXRoLmZsb29yKDEuNSAqIGgpKTsKKwkJCQkJYiA9IG5ldyBteFBvaW50KHggKyBNYXRoLmZsb29yKDEuMjUgKiB3KSwgeSk7CisJCQkJfQorCQkJCWVsc2UgaWYgKChhbHBoYSA8IC1iZXRhKSAmJiAoYWxwaGEgPiAoLXBpICsgYmV0YSkpKQorCQkJCXsKKwkJCQkJYSA9IG5ldyBteFBvaW50KHgsIHkgKyBoKTsKKwkJCQkJYiA9IG5ldyBteFBvaW50KHggKyB3LCB5ICsgaCk7CisJCQkJfQorCQkJCWVsc2UgaWYgKChhbHBoYSA8ICgtcGkgKyBiZXRhKSkgJiYgKGFscGhhID4gLXBpKSkKKwkJCQl7CisJCQkJCWEgPSBuZXcgbXhQb2ludCh4IC0gTWF0aC5mbG9vcigwLjI1ICogdyksIHkpOworCQkJCQliID0gbmV3IG14UG9pbnQoeCArIE1hdGguZmxvb3IoMC41ICogdyksIHkKKwkJCQkJCQkrIE1hdGguZmxvb3IoMS41ICogaCkpOworCQkJCX0KKwkJCX0KKworCQkJcmVzdWx0ID0gbXhVdGlscy5pbnRlcnNlY3Rpb24oY3gsIGN5LCBuZXh0LngsIG5leHQueSwgYS54LCBhLnksIGIueCwgYi55KTsKKwkJfQorCQkKKwkJaWYgKHJlc3VsdCA9PSBudWxsKQorCQl7CisJCQlyZXR1cm4gbmV3IG14UG9pbnQoY3gsIGN5KTsKKwkJfQorCQkKKwkJcmV0dXJuIHJlc3VsdDsKKwl9Cit9OwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3ZpZXcvbXhQcmludFByZXZpZXcuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teFByaW50UHJldmlldy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGE2MTkzCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3ZpZXcvbXhQcmludFByZXZpZXcuanMKQEAgLTAsMCArMSwxMTc1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFByaW50UHJldmlldworICogCisgKiBJbXBsZW1lbnRzIHByaW50aW5nIG9mIGEgZGlhZ3JhbSBhY3Jvc3MgbXVsdGlwbGUgcGFnZXMuIFRoZSBmb2xsb3dpbmcgb3BlbnMKKyAqIGEgcHJpbnQgcHJldmlldyBmb3IgYW4gZXhpc3RpbmcgZ3JhcGg6CisgKiAKKyAqIChjb2RlKQorICogdmFyIHByZXZpZXcgPSBuZXcgbXhQcmludFByZXZpZXcoZ3JhcGgpOworICogcHJldmlldy5vcGVuKCk7CisgKiAoZW5kKQorICogCisgKiBVc2UgPG14VXRpbHMuZ2V0U2NhbGVGb3JQYWdlQ291bnQ+IGFzIGZvbGxvd3MgaW4gb3JkZXIgdG8gcHJpbnQgdGhlIGdyYXBoCisgKiBhY3Jvc3MgYSBnaXZlbiBudW1iZXIgb2YgcGFnZXM6CisgKiAKKyAqIChjb2RlKQorICogdmFyIHBhZ2VDb3VudCA9IG14VXRpbHMucHJvbXB0KCdFbnRlciBwYWdlIGNvdW50JywgJzEnKTsKKyAqIAorICogaWYgKHBhZ2VDb3VudCAhPSBudWxsKQorICogeworICogICB2YXIgc2NhbGUgPSBteFV0aWxzLmdldFNjYWxlRm9yUGFnZUNvdW50KHBhZ2VDb3VudCwgZ3JhcGgpOworICogICB2YXIgcHJldmlldyA9IG5ldyBteFByaW50UHJldmlldyhncmFwaCwgc2NhbGUpOworICogICBwcmV2aWV3Lm9wZW4oKTsKKyAqIH0KKyAqIChlbmQpCisgKiAKKyAqIEFkZGl0aW9uYWwgcGFnZXM6CisgKiAKKyAqIFRvIGFkZCBhZGRpdGlvbmFsIHBhZ2VzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG91dHB1dCwgPGdldENvdmVyUGFnZXM+IGFuZAorICogPGdldEFwcGVuZGljZXM+IGNhbiBiZSB1c2VkLCByZXNwZWN0aXZlbHkuCisgKiAKKyAqIChjb2RlKQorICogdmFyIHByZXZpZXcgPSBuZXcgbXhQcmludFByZXZpZXcoZ3JhcGgsIDEpOworICogCisgKiBwcmV2aWV3LmdldENvdmVyUGFnZXMgPSBmdW5jdGlvbih3LCBoKQorICogeworICogICByZXR1cm4gW3RoaXMucmVuZGVyUGFnZSh3LCBoLCAwLCAwLCBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZGl2KQorICogICB7CisgKiAgICAgZGl2LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW46NHB4OyI+Q292ZXIgUGFnZTwvcD4nCisgKiAgIH0pKV07CisgKiB9OworICogCisgKiBwcmV2aWV3LmdldEFwcGVuZGljZXMgPSBmdW5jdGlvbih3LCBoKQorICogeworICogICByZXR1cm4gW3RoaXMucmVuZGVyUGFnZSh3LCBoLCAwLCAwLCBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZGl2KQorICogICB7CisgKiAgICAgZGl2LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW46NHB4OyI+QXBwZW5kaXg8L3A+JworICogICB9KSldOworICogfTsKKyAqIAorICogcHJldmlldy5vcGVuKCk7CisgKiAoZW5kKQorICogCisgKiBDU1M6CisgKiAKKyAqIFRoZSBDU1MgZnJvbSB0aGUgb3JpZ2luYWwgcGFnZSBpcyBub3QgY2FycmllZCBvdmVyIHRvIHRoZSBwcmludCBwcmV2aWV3LgorICogVG8gYWRkIENTUyB0byB0aGUgcGFnZSwgdXNlIHRoZSBjc3MgYXJndW1lbnQgaW4gdGhlIDxvcGVuPiBmdW5jdGlvbiBvcgorICogb3ZlcnJpZGUgPHdyaXRlSGVhZD4gdG8gYWRkIHRoZSByZXNwZWN0aXZlIGxpbmsgdGFncyBhcyBmb2xsb3dzOgorICogCisgKiAoY29kZSkKKyAqIHZhciB3cml0ZUhlYWQgPSBwcmV2aWV3LndyaXRlSGVhZDsKKyAqIHByZXZpZXcud3JpdGVIZWFkID0gZnVuY3Rpb24oZG9jLCBjc3MpCisgKiB7CisgKiAgIHdyaXRlSGVhZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICogICBkb2Mud3JpdGVsbignPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGUuY3NzIj4nKTsKKyAqIH07CisgKiAoZW5kKQorICogCisgKiBQYWRkaW5nOgorICogCisgKiBUbyBhZGQgYSBwYWRkaW5nIHRvIHRoZSBwYWdlIGluIHRoZSBwcmV2aWV3IChidXQgbm90IHRoZSBwcmludCBvdXRwdXQpLCB1c2UKKyAqIHRoZSBmb2xsb3dpbmcgY29kZToKKyAqIAorICogKGNvZGUpCisgKiBwcmV2aWV3LndyaXRlSGVhZCA9IGZ1bmN0aW9uKGRvYykKKyAqIHsKKyAqICAgd3JpdGVIZWFkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisgKiAgIAorICogICBkb2Mud3JpdGVsbignPHN0eWxlIHR5cGU9InRleHQvY3NzIj4nKTsKKyAqICAgZG9jLndyaXRlbG4oJ0BtZWRpYSBzY3JlZW4geycpOworICogICBkb2Mud3JpdGVsbignICBib2R5ID4gZGl2IHsgcGFkZGluZy10b3A6MzBweDtwYWRkaW5nLWxlZnQ6NDBweDtib3gtc2l6aW5nOmNvbnRlbnQtYm94OyB9Jyk7CisgKiAgIGRvYy53cml0ZWxuKCd9Jyk7CisgKiAgIGRvYy53cml0ZWxuKCc8L3N0eWxlPicpOworICogfTsKKyAqIChlbmQpCisgKiAKKyAqIEhlYWRlcnM6CisgKiAKKyAqIEFwYXJ0IGZyb20gc2V0dGluZyB0aGUgdGl0bGUgYXJndW1lbnQgaW4gdGhlIG14UHJpbnRQcmV2aWV3IGNvbnN0cnVjdG9yIHlvdQorICogY2FuIG92ZXJyaWRlIDxyZW5kZXJQYWdlPiBhcyBmb2xsb3dzIHRvIGFkZCBhIGhlYWRlciB0byBhbnkgcGFnZToKKyAqIAorICogKGNvZGUpCisgKiB2YXIgb2xkUmVuZGVyUGFnZSA9IG14UHJpbnRQcmV2aWV3LnByb3RvdHlwZS5yZW5kZXJQYWdlOworICogbXhQcmludFByZXZpZXcucHJvdG90eXBlLnJlbmRlclBhZ2UgPSBmdW5jdGlvbih3LCBoLCB4LCB5LCBjb250ZW50LCBwYWdlTnVtYmVyKQorICogeworICogICB2YXIgZGl2ID0gb2xkUmVuZGVyUGFnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOworICogICAKKyAqICAgdmFyIGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworICogICBoZWFkZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOworICogICBoZWFkZXIuc3R5bGUudG9wID0gJzBweCc7CisgKiAgIGhlYWRlci5zdHlsZS53aWR0aCA9ICcxMDAlJzsKKyAqICAgaGVhZGVyLnN0eWxlLnRleHRBbGlnbiA9ICdyaWdodCc7CisgKiAgIG14VXRpbHMud3JpdGUoaGVhZGVyLCAnWW91ciBoZWFkZXIgaGVyZScpOworICogICBkaXYuZmlyc3RDaGlsZC5hcHBlbmRDaGlsZChoZWFkZXIpOworICogICAKKyAqICAgcmV0dXJuIGRpdjsKKyAqIH07CisgKiAoZW5kKQorICogCisgKiBUaGUgcGFnZU51bWJlciBhcmd1bWVudCBjb250YWlucyB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHBhZ2UsIHN0YXJ0aW5nIGF0CisgKiAxLiBUbyBkaXNwbGF5IGEgaGVhZGVyIG9uIHRoZSBmaXJzdCBwYWdlIG9ubHksIGNoZWNrIHBhZ2VOdW1iZXIgYW5kIGFkZCBhCisgKiB2ZXJ0aWNhbCBvZmZzZXQgaW4gdGhlIGNvbnN0cnVjdG9yIGNhbGwgZm9yIHRoZSBoZWlnaHQgb2YgdGhlIGhlYWRlci4KKyAqIAorICogUGFnZSBGb3JtYXQ6CisgKiAKKyAqIEZvciBsYW5kc2NhcGUgcHJpbnRpbmcsIHVzZSA8bXhDb25zdGFudHMuUEFHRV9GT1JNQVRfQTRfTEFORFNDQVBFPiBhcworICogdGhlIHBhZ2VGb3JtYXQgaW4gPG14VXRpbHMuZ2V0U2NhbGVGb3JQYWdlQ291bnQ+IGFuZCA8bXhQcmludFByZXZpZXc+LgorICogS2VlcCBpbiBtaW5kIHRoYXQgb25lIGNhbiBub3Qgc2V0IHRoZSBkZWZhdWx0cyBmb3IgdGhlIHByaW50IGRpYWxvZworICogb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZnJvbSBKYXZhU2NyaXB0IHNvIHRoZSB1c2VyIG11c3QgbWFudWFsbHkgY2hvb3NlCisgKiBhIHBhZ2UgZm9ybWF0IHRoYXQgbWF0Y2hlcyB0aGlzIHNldHRpbmcuCisgKiAKKyAqIFlvdSBjYW4gdHJ5IHBhc3NpbmcgdGhlIGZvbGxvd2luZyBDU1MgZGlyZWN0aXZlIHRvIDxvcGVuPiB0byBzZXQgdGhlCisgKiBwYWdlIGZvcm1hdCBpbiB0aGUgcHJpbnQgZGlhbG9nIHRvIGxhbmRzY2FwZS4gSG93ZXZlciwgdGhpcyBDU1MKKyAqIGRpcmVjdGl2ZSBzZWVtcyB0byBiZSBpZ25vcmVkIGluIG1vc3QgbWFqb3IgYnJvd3NlcnMsIGluY2x1ZGluZyBJRS4KKyAqIAorICogKGNvZGUpCisgKiBAcGFnZSB7CisgKiAgIHNpemU6IGxhbmRzY2FwZTsKKyAqIH0KKyAqIChlbmQpCisgKiAKKyAqIE5vdGUgdGhhdCB0aGUgcHJpbnQgcHJldmlldyBiZWhhdmVzIGRpZmZlcmVudGx5IGluIElFIHdoZW4gdXNlZCBmcm9tIHRoZQorICogZmlsZXN5c3RlbSBvciB2aWEgSFRUUCBzbyBwcmludGluZyBzaG91bGQgYWx3YXlzIGJlIHRlc3RlZCB2aWEgSFRUUC4KKyAqIAorICogSWYgeW91IGFyZSB1c2luZyBhIERPQ1RZUEUgaW4gdGhlIHNvdXJjZSBwYWdlIHlvdSBjYW4gb3ZlcnJpZGUgPGdldERvY3R5cGU+CisgKiBhbmQgcHJvdmlkZSB0aGUgc2FtZSBET0NUWVBFIGZvciB0aGUgcHJpbnQgcHJldmlldyBpZiByZXF1aXJlZC4gSGVyZSBpcworICogYW4gZXhhbXBsZSBmb3IgSUU4IHN0YW5kYXJkcyBtb2RlLgorICogCisgKiAoY29kZSkKKyAqIHZhciBwcmV2aWV3ID0gbmV3IG14UHJpbnRQcmV2aWV3KGdyYXBoKTsKKyAqIHByZXZpZXcuZ2V0RG9jdHlwZSA9IGZ1bmN0aW9uKCkKKyAqIHsKKyAqICAgcmV0dXJuICc8IS0tW2lmIElFXT48bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPTUsSUU9OCIgPjwhW2VuZGlmXS0tPic7CisgKiB9OworICogcHJldmlldy5vcGVuKCk7CisgKiAoZW5kKQorICogCisgKiBDb25zdHJ1Y3RvcjogbXhQcmludFByZXZpZXcKKyAqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IHByaW50IHByZXZpZXcgZm9yIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBncmFwaCAtIDxteEdyYXBoPiB0byBiZSBwcmV2aWV3ZWQuCisgKiBzY2FsZSAtIE9wdGlvbmFsIHNjYWxlIG9mIHRoZSBvdXRwdXQuIERlZmF1bHQgaXMgMSAvIDxteEdyYXBoLnBhZ2VTY2FsZT4uCisgKiBib3JkZXIgLSBCb3JkZXIgaW4gcGl4ZWxzIGFsb25nIGVhY2ggc2lkZSBvZiBldmVyeSBwYWdlLiBOb3RlIHRoYXQgdGhlCisgKiBhY3R1YWwgcHJpbnQgZnVuY3Rpb24gaW4gdGhlIGJyb3dzZXIgd2lsbCBhZGQgYW5vdGhlciBib3JkZXIgZm9yCisgKiBwcmludGluZy4KKyAqIHBhZ2VGb3JtYXQgLSA8bXhSZWN0YW5nbGU+IHRoYXQgc3BlY2lmaWVzIHRoZSBwYWdlIGZvcm1hdCAoaW4gcGl4ZWxzKS4KKyAqIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSBwYWdlIGZvcm1hdCBvZiB0aGUgcHJpbnRlci4gRGVmYXVsdCB1c2VzIHRoZQorICogPG14R3JhcGgucGFnZUZvcm1hdD4gb2YgdGhlIGdpdmVuIGdyYXBoLgorICogeDAgLSBPcHRpb25hbCBsZWZ0IG9mZnNldCBvZiB0aGUgb3V0cHV0LiBEZWZhdWx0IGlzIDAuCisgKiB5MCAtIE9wdGlvbmFsIHRvcCBvZmZzZXQgb2YgdGhlIG91dHB1dC4gRGVmYXVsdCBpcyAwLgorICogYm9yZGVyQ29sb3IgLSBPcHRpb25hbCBjb2xvciBvZiB0aGUgcGFnZSBib3JkZXIuIERlZmF1bHQgaXMgbm8gYm9yZGVyLgorICogTm90ZSB0aGF0IGEgYm9yZGVyIGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8gaGlnaGxpZ2h0IHRoZSBwcmludGVkIHBhZ2UKKyAqIGJvcmRlciBpbiB0aGUgcHJpbnQgcHJldmlldyBvZiB0aGUgYnJvd3Nlci4KKyAqIHRpdGxlIC0gT3B0aW9uYWwgc3RyaW5nIHRoYXQgaXMgdXNlZCBmb3IgdGhlIHdpbmRvdyB0aXRsZS4gRGVmYXVsdAorICogaXMgJ1ByaW50ZXItZnJpZW5kbHkgdmVyc2lvbicuCisgKiBwYWdlU2VsZWN0b3IgLSBPcHRpb25hbCBib29sZWFuIHRoYXQgc3BlY2lmaWVzIGlmIHRoZSBwYWdlIHNlbGVjdG9yCisgKiBzaG91bGQgYXBwZWFyIGluIHRoZSB3aW5kb3cgd2l0aCB0aGUgcHJpbnQgcHJldmlldy4gRGVmYXVsdCBpcyB0cnVlLgorICovCitmdW5jdGlvbiBteFByaW50UHJldmlldyhncmFwaCwgc2NhbGUsIHBhZ2VGb3JtYXQsIGJvcmRlciwgeDAsIHkwLCBib3JkZXJDb2xvciwgdGl0bGUsIHBhZ2VTZWxlY3RvcikKK3sKKwl0aGlzLmdyYXBoID0gZ3JhcGg7CisJdGhpcy5zY2FsZSA9IChzY2FsZSAhPSBudWxsKSA/IHNjYWxlIDogMSAvIGdyYXBoLnBhZ2VTY2FsZTsKKwl0aGlzLmJvcmRlciA9IChib3JkZXIgIT0gbnVsbCkgPyBib3JkZXIgOiAwOworCXRoaXMucGFnZUZvcm1hdCA9IG14UmVjdGFuZ2xlLmZyb21SZWN0YW5nbGUoKHBhZ2VGb3JtYXQgIT0gbnVsbCkgPyBwYWdlRm9ybWF0IDogZ3JhcGgucGFnZUZvcm1hdCk7CisJdGhpcy50aXRsZSA9ICh0aXRsZSAhPSBudWxsKSA/IHRpdGxlIDogJ1ByaW50ZXItZnJpZW5kbHkgdmVyc2lvbic7CisJdGhpcy54MCA9ICh4MCAhPSBudWxsKSA/IHgwIDogMDsKKwl0aGlzLnkwID0gKHkwICE9IG51bGwpID8geTAgOiAwOworCXRoaXMuYm9yZGVyQ29sb3IgPSBib3JkZXJDb2xvcjsKKwl0aGlzLnBhZ2VTZWxlY3RvciA9IChwYWdlU2VsZWN0b3IgIT0gbnVsbCkgPyBwYWdlU2VsZWN0b3IgOiB0cnVlOworfTsKKworLyoqCisgKiBWYXJpYWJsZTogZ3JhcGgKKyAqIAorICogUmVmZXJlbmNlIHRvIHRoZSA8bXhHcmFwaD4gdGhhdCBzaG91bGQgYmUgcHJldmlld2VkLgorICovCitteFByaW50UHJldmlldy5wcm90b3R5cGUuZ3JhcGggPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBwYWdlRm9ybWF0CisgKgorICogSG9sZHMgdGhlIDxteFJlY3RhbmdsZT4gdGhhdCBkZWZpbmVzIHRoZSBwYWdlIGZvcm1hdC4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLnBhZ2VGb3JtYXQgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBzY2FsZQorICogCisgKiBIb2xkcyB0aGUgc2NhbGUgb2YgdGhlIHByaW50IHByZXZpZXcuCisgKi8KK214UHJpbnRQcmV2aWV3LnByb3RvdHlwZS5zY2FsZSA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGJvcmRlcgorICogCisgKiBUaGUgYm9yZGVyIGluc2V0IGFyb3VuZCBlYWNoIHNpZGUgb2YgZXZlcnkgcGFnZSBpbiB0aGUgcHJldmlldy4gVGhpcyBpcyBzZXQKKyAqIHRvIDAgaWYgYXV0b09yaWdpbiBpcyBmYWxzZS4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLmJvcmRlciA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IG1hcmdpblRvcAorICogCisgKiBUaGUgbWFyZ2luIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2UgKG51bWJlcikuIERlZmF1bHQgaXMgMC4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLm1hcmdpblRvcCA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IG1hcmdpbkJvdHRvbQorICogCisgKiBUaGUgbWFyZ2luIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UgKG51bWJlcikuIERlZmF1bHQgaXMgMC4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLm1hcmdpbkJvdHRvbSA9IDA7CisKKy8qKgorICogVmFyaWFibGU6IHgwCisgKiAKKyAqIEhvbGRzIHRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgb3V0cHV0LgorICovCitteFByaW50UHJldmlldy5wcm90b3R5cGUueDAgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiB5MAorICoKKyAqIEhvbGRzIHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIG91dHB1dC4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLnkwID0gMDsKKworLyoqCisgKiBWYXJpYWJsZTogYXV0b09yaWdpbgorICogCisgKiBTcGVjaWZpZXMgaWYgdGhlIG9yaWdpbiBzaG91bGQgYmUgYXV0b21hdGljYWxseSBjb21wdXRlZCBiYXNlZCBvbiB0aGUgdG9wLAorICogbGVmdCBjb3JuZXIgb2YgdGhlIGFjdHVhbCBkaWFncmFtIGNvbnRlbnRzLiBUaGUgcmVxdWlyZWQgb2Zmc2V0IHdpbGwgYmUgYWRkZWQKKyAqIHRvIDx4MD4gYW5kIDx5MD4gaW4gPG9wZW4+LiBEZWZhdWx0IGlzIHRydWUuCisgKi8KK214UHJpbnRQcmV2aWV3LnByb3RvdHlwZS5hdXRvT3JpZ2luID0gdHJ1ZTsKKworLyoqCisgKiBWYXJpYWJsZTogcHJpbnRPdmVybGF5cworICogCisgKiBTcGVjaWZpZXMgaWYgb3ZlcmxheXMgc2hvdWxkIGJlIHByaW50ZWQuIERlZmF1bHQgaXMgZmFsc2UuCisgKi8KK214UHJpbnRQcmV2aWV3LnByb3RvdHlwZS5wcmludE92ZXJsYXlzID0gZmFsc2U7CisKKy8qKgorICogVmFyaWFibGU6IHByaW50Q29udHJvbHMKKyAqIAorICogU3BlY2lmaWVzIGlmIGNvbnRyb2xzIChzdWNoIGFzIGZvbGRpbmcgaWNvbnMpIHNob3VsZCBiZSBwcmludGVkLiBEZWZhdWx0IGlzCisgKiBmYWxzZS4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLnByaW50Q29udHJvbHMgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogcHJpbnRCYWNrZ3JvdW5kSW1hZ2UKKyAqIAorICogU3BlY2lmaWVzIGlmIHRoZSBiYWNrZ3JvdW5kIGltYWdlIHNob3VsZCBiZSBwcmludGVkLiBEZWZhdWx0IGlzIGZhbHNlLgorICovCitteFByaW50UHJldmlldy5wcm90b3R5cGUucHJpbnRCYWNrZ3JvdW5kSW1hZ2UgPSBmYWxzZTsKKworLyoqCisgKiBWYXJpYWJsZTogYmFja2dyb3VuZENvbG9yCisgKiAKKyAqIEhvbGRzIHRoZSBjb2xvciB2YWx1ZSBmb3IgdGhlIHBhZ2UgYmFja2dyb3VuZCBjb2xvci4gRGVmYXVsdCBpcyAjZmZmZmZmLgorICovCitteFByaW50UHJldmlldy5wcm90b3R5cGUuYmFja2dyb3VuZENvbG9yID0gJyNmZmZmZmYnOworCisvKioKKyAqIFZhcmlhYmxlOiBib3JkZXJDb2xvcgorICogCisgKiBIb2xkcyB0aGUgY29sb3IgdmFsdWUgZm9yIHRoZSBwYWdlIGJvcmRlci4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLmJvcmRlckNvbG9yID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogdGl0bGUKKyAqIAorICogSG9sZHMgdGhlIHRpdGxlIG9mIHRoZSBwcmV2aWV3IHdpbmRvdy4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLnRpdGxlID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogcGFnZVNlbGVjdG9yCisgKiAKKyAqIEJvb2xlYW4gdGhhdCBzcGVjaWZpZXMgaWYgdGhlIHBhZ2Ugc2VsZWN0b3Igc2hvdWxkIGJlCisgKiBkaXNwbGF5ZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLnBhZ2VTZWxlY3RvciA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IHduZAorICogCisgKiBSZWZlcmVuY2UgdG8gdGhlIHByZXZpZXcgd2luZG93LgorICovCitteFByaW50UHJldmlldy5wcm90b3R5cGUud25kID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogdGFyZ2V0V2luZG93CisgKiAKKyAqIEFzc2lnbiBhbnkgd2luZG93IGhlcmUgdG8gcmVkaXJlY3QgdGhlIHJlbmRlcmluZyBpbiA8b3Blbj4uCisgKi8KK214UHJpbnRQcmV2aWV3LnByb3RvdHlwZS50YXJnZXRXaW5kb3cgPSBudWxsOworCisvKioKKyAqIFZhcmlhYmxlOiBwYWdlQ291bnQKKyAqIAorICogSG9sZHMgdGhlIGFjdHVhbCBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIHByZXZpZXcuCisgKi8KK214UHJpbnRQcmV2aWV3LnByb3RvdHlwZS5wYWdlQ291bnQgPSAwOworCisvKioKKyAqIFZhcmlhYmxlOiBjbGlwcGluZworICogCisgKiBTcGVjaWZpZXMgaXMgY2xpcHBpbmcgc2hvdWxkIGJlIHVzZWQgdG8gYXZvaWQgY3JlYXRpbmcgdG9vIG1hbnkgY2VsbCBzdGF0ZXMKKyAqIGluIGxhcmdlIGRpYWdyYW1zLiBUaGUgYm91bmRpbmcgYm94IG9mIHRoZSBjZWxscyBpbiB0aGUgb3JpZ2luYWwgZGlhZ3JhbSBpcworICogdXNlZCBpZiB0aGlzIGlzIGVuYWJsZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLmNsaXBwaW5nID0gdHJ1ZTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0V2luZG93CisgKiAKKyAqIFJldHVybnMgPHduZD4uCisgKi8KK214UHJpbnRQcmV2aWV3LnByb3RvdHlwZS5nZXRXaW5kb3cgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMud25kOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0RG9jVHlwZQorICogCisgKiBSZXR1cm5zIHRoZSBzdHJpbmcgdGhhdCBzaG91bGQgZ28gYmVmb3JlIHRoZSBIVE1MIHRhZyBpbiB0aGUgcHJpbnQgcHJldmlldworICogcGFnZS4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGFuIFgtVUEgbWV0YSB0YWcgZm9yIElFNSBpbiBxdWlya3MgbW9kZSwKKyAqIElFOCBpbiBJRTggc3RhbmRhcmRzIG1vZGUgYW5kIGVkZ2UgaW4gSUU5IHN0YW5kYXJkcyBtb2RlLgorICovCitteFByaW50UHJldmlldy5wcm90b3R5cGUuZ2V0RG9jdHlwZSA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgZHQgPSAnJzsKKwkKKwlpZiAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09IDUpCisJeworCQlkdCA9ICc8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPTUiPic7CisJfQorCWVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50TW9kZSA9PSA4KQorCXsKKwkJZHQgPSAnPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT04Ij4nOworCX0KKwllbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA4KQorCXsKKwkJLy8gQ29tbWVudCBuZWVkZWQgdG8gbWFrZSBzdGFuZGFyZHMgZG9jdHlwZSBhcHBseSBpbiBJRQorCQlkdCA9ICc8IS0tW2lmIElFXT48bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPjwhW2VuZGlmXS0tPic7CisJfQorCQorCXJldHVybiBkdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFwcGVuZEdyYXBoCisgKiAKKyAqIEFkZHMgdGhlIGdpdmVuIGdyYXBoIHRvIHRoZSBleGlzdGluZyBwcmludCBwcmV2aWV3LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjc3MgLSBPcHRpb25hbCBDU1Mgc3RyaW5nIHRvIGJlIHVzZWQgaW4gdGhlIGhlYWQgc2VjdGlvbi4KKyAqIHRhcmdldFdpbmRvdyAtIE9wdGlvbmFsIHdpbmRvdyB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZW5kZXJpbmcuIElmCisgKiB0aGlzIGlzIHNwZWNpZmllZCB0aGVuIG5vIEhFQUQgdGFnLCBDU1MgYW5kIEJPRFkgdGFnIHdpbGwgYmUgd3JpdHRlbi4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLmFwcGVuZEdyYXBoID0gZnVuY3Rpb24oZ3JhcGgsIHNjYWxlLCB4MCwgeTAsIGZvcmNlUGFnZUJyZWFrcywga2VlcE9wZW4pCit7CisJdGhpcy5ncmFwaCA9IGdyYXBoOworCXRoaXMuc2NhbGUgPSAoc2NhbGUgIT0gbnVsbCkgPyBzY2FsZSA6IDEgLyBncmFwaC5wYWdlU2NhbGU7CisJdGhpcy54MCA9IHgwOworCXRoaXMueTAgPSB5MDsKKwl0aGlzLm9wZW4obnVsbCwgbnVsbCwgZm9yY2VQYWdlQnJlYWtzLCBrZWVwT3Blbik7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBvcGVuCisgKiAKKyAqIFNob3dzIHRoZSBwcmludCBwcmV2aWV3IHdpbmRvdy4gVGhlIHdpbmRvdyBpcyBjcmVhdGVkIGhlcmUgaWYgaXQgZG9lcworICogbm90IGV4aXN0LgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjc3MgLSBPcHRpb25hbCBDU1Mgc3RyaW5nIHRvIGJlIHVzZWQgaW4gdGhlIGhlYWQgc2VjdGlvbi4KKyAqIHRhcmdldFdpbmRvdyAtIE9wdGlvbmFsIHdpbmRvdyB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZW5kZXJpbmcuIElmCisgKiB0aGlzIGlzIHNwZWNpZmllZCB0aGVuIG5vIEhFQUQgdGFnLCBDU1MgYW5kIEJPRFkgdGFnIHdpbGwgYmUgd3JpdHRlbi4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbihjc3MsIHRhcmdldFdpbmRvdywgZm9yY2VQYWdlQnJlYWtzLCBrZWVwT3BlbikKK3sKKwkvLyBDbG9zaW5nIHRoZSB3aW5kb3cgd2hpbGUgdGhlIHBhZ2UgaXMgYmVpbmcgcmVuZGVyZWQgbWF5IGNhdXNlIGFuCisJLy8gZXhjZXB0aW9uIGluIElFLiBUaGlzIGFuZCBhbnkgb3RoZXIgZXhjZXB0aW9ucyBhcmUgc2ltcGx5IGlnbm9yZWQuCisJdmFyIHByZXZpb3VzSW5pdGlhbGl6ZU92ZXJsYXkgPSB0aGlzLmdyYXBoLmNlbGxSZW5kZXJlci5pbml0aWFsaXplT3ZlcmxheTsKKwl2YXIgZGl2ID0gbnVsbDsKKwkKKwl0cnkKKwl7CisJCS8vIFRlbXBvcmFyaWx5IG92ZXJyaWRlcyB0aGUgbWV0aG9kIHRvIHJlZGlyZWN0IHJlbmRlcmluZyBvZiBvdmVybGF5cworCQkvLyB0byB0aGUgZHJhdyBwYW5lIHNvIHRoYXQgdGhleSBhcmUgdmlzaWJsZSBpbiB0aGUgcHJpbnRvdXQKKwkJaWYgKHRoaXMucHJpbnRPdmVybGF5cykKKwkJeworCQkJdGhpcy5ncmFwaC5jZWxsUmVuZGVyZXIuaW5pdGlhbGl6ZU92ZXJsYXkgPSBmdW5jdGlvbihzdGF0ZSwgb3ZlcmxheSkKKwkJCXsKKwkJCQlvdmVybGF5LmluaXQoc3RhdGUudmlldy5nZXREcmF3UGFuZSgpKTsKKwkJCX07CisJCX0KKwkJCisJCWlmICh0aGlzLnByaW50Q29udHJvbHMpCisJCXsKKwkJCXRoaXMuZ3JhcGguY2VsbFJlbmRlcmVyLmluaXRDb250cm9sID0gZnVuY3Rpb24oc3RhdGUsIGNvbnRyb2wsIGhhbmRsZUV2ZW50cywgY2xpY2tIYW5kbGVyKQorCQkJeworCQkJCWNvbnRyb2wuZGlhbGVjdCA9IHN0YXRlLnZpZXcuZ3JhcGguZGlhbGVjdDsKKwkJCQljb250cm9sLmluaXQoc3RhdGUudmlldy5nZXREcmF3UGFuZSgpKTsKKwkJCX07CisJCX0KKwkJCisJCXRoaXMud25kID0gKHRhcmdldFdpbmRvdyAhPSBudWxsKSA/IHRhcmdldFdpbmRvdyA6IHRoaXMud25kOworCQl2YXIgaXNOZXdXaW5kb3cgPSBmYWxzZTsKKwkJCisJCWlmICh0aGlzLnduZCA9PSBudWxsKQorCQl7CisJCQlpc05ld1dpbmRvdyA9IHRydWU7CisJCQl0aGlzLnduZCA9IHdpbmRvdy5vcGVuKCk7CisJCX0KKwkJCisJCXZhciBkb2MgPSB0aGlzLnduZC5kb2N1bWVudDsKKwkJCisJCWlmIChpc05ld1dpbmRvdykKKwkJeworCQkJdmFyIGR0ID0gdGhpcy5nZXREb2N0eXBlKCk7CisJCQkKKwkJCWlmIChkdCAhPSBudWxsICYmIGR0Lmxlbmd0aCA+IDApCisJCQl7CisJCQkJZG9jLndyaXRlbG4oZHQpOworCQkJfQorCQkJCisJCQlpZiAobXhDbGllbnQuSVNfVk1MKQorCQkJeworCQkJCWRvYy53cml0ZWxuKCc8aHRtbCB4bWxuczp2PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIj4nKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAoZG9jdW1lbnQuY29tcGF0TW9kZSA9PT0gJ0NTUzFDb21wYXQnKQorCQkJCXsKKwkJCQkJZG9jLndyaXRlbG4oJzwhRE9DVFlQRSBodG1sPicpOworCQkJCX0KKwkJCQkKKwkJCQlkb2Mud3JpdGVsbignPGh0bWw+Jyk7CisJCQl9CisJCQkKKwkJCWRvYy53cml0ZWxuKCc8aGVhZD4nKTsKKwkJCXRoaXMud3JpdGVIZWFkKGRvYywgY3NzKTsKKwkJCWRvYy53cml0ZWxuKCc8L2hlYWQ+Jyk7CisJCQlkb2Mud3JpdGVsbignPGJvZHkgY2xhc3M9Im14UGFnZSI+Jyk7CisJCX0KKworCQkvLyBDb21wdXRlcyB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgcGFnZSBjb3VudAorCQl2YXIgYm91bmRzID0gdGhpcy5ncmFwaC5nZXRHcmFwaEJvdW5kcygpLmNsb25lKCk7CisJCXZhciBjdXJyZW50U2NhbGUgPSB0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXRTY2FsZSgpOworCQl2YXIgc2MgPSBjdXJyZW50U2NhbGUgLyB0aGlzLnNjYWxlOworCQl2YXIgdHIgPSB0aGlzLmdyYXBoLmdldFZpZXcoKS5nZXRUcmFuc2xhdGUoKTsKKwkJCisJCS8vIFVzZXMgdGhlIGFic29sdXRlIG9yaWdpbiB3aXRoIG5vIG9mZnNldCBmb3IgYWxsIHByaW50aW5nCisJCWlmICghdGhpcy5hdXRvT3JpZ2luKQorCQl7CisJCQl0aGlzLngwIC09IHRyLnggKiB0aGlzLnNjYWxlOworCQkJdGhpcy55MCAtPSB0ci55ICogdGhpcy5zY2FsZTsKKwkJCWJvdW5kcy53aWR0aCArPSBib3VuZHMueDsKKwkJCWJvdW5kcy5oZWlnaHQgKz0gYm91bmRzLnk7CisJCQlib3VuZHMueCA9IDA7CisJCQlib3VuZHMueSA9IDA7CisJCQl0aGlzLmJvcmRlciA9IDA7CisJCX0KKwkJCisJCS8vIFN0b3JlIHRoZSBhdmFpbGFibGUgcGFnZSBhcmVhCisJCXZhciBhdmFpbGFibGVXaWR0aCA9IHRoaXMucGFnZUZvcm1hdC53aWR0aCAtICh0aGlzLmJvcmRlciAqIDIpOworCQl2YXIgYXZhaWxhYmxlSGVpZ2h0ID0gdGhpcy5wYWdlRm9ybWF0LmhlaWdodCAtICh0aGlzLmJvcmRlciAqIDIpOworCQorCQkvLyBBZGRzIG1hcmdpbnMgdG8gcGFnZSBmb3JtYXQKKwkJdGhpcy5wYWdlRm9ybWF0LmhlaWdodCArPSB0aGlzLm1hcmdpblRvcCArIHRoaXMubWFyZ2luQm90dG9tOworCisJCS8vIENvbXB1dGUgdGhlIHVuc2NhbGVkLCB1bnRyYW5zbGF0ZWQgYm91bmRzIHRvIGZpbmQKKwkJLy8gdGhlIG51bWJlciBvZiB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBwYWdlcworCQlib3VuZHMud2lkdGggLz0gc2M7CisJCWJvdW5kcy5oZWlnaHQgLz0gc2M7CisKKwkJdmFyIGhwYWdlcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCgoYm91bmRzLndpZHRoICsgdGhpcy54MCkgLyBhdmFpbGFibGVXaWR0aCkpOworCQl2YXIgdnBhZ2VzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKChib3VuZHMuaGVpZ2h0ICsgdGhpcy55MCkgLyBhdmFpbGFibGVIZWlnaHQpKTsKKwkJdGhpcy5wYWdlQ291bnQgPSBocGFnZXMgKiB2cGFnZXM7CisJCQorCQl2YXIgd3JpdGVQYWdlU2VsZWN0b3IgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oKQorCQl7CisJCQlpZiAodGhpcy5wYWdlU2VsZWN0b3IgJiYgKHZwYWdlcyA+IDEgfHwgaHBhZ2VzID4gMSkpCisJCQl7CisJCQkJdmFyIHRhYmxlID0gdGhpcy5jcmVhdGVQYWdlU2VsZWN0b3IodnBhZ2VzLCBocGFnZXMpOworCQkJCWRvYy5ib2R5LmFwcGVuZENoaWxkKHRhYmxlKTsKKwkJCQkKKwkJCQkvLyBJbXBsZW1lbnRzIHBvc2l0aW9uOiBmaXhlZCBpbiBJRSBxdWlya3MgbW9kZQorCQkJCWlmIChteENsaWVudC5JU19JRSAmJiBkb2MuZG9jdW1lbnRNb2RlID09IG51bGwgfHwgZG9jLmRvY3VtZW50TW9kZSA9PSA1IHx8IGRvYy5kb2N1bWVudE1vZGUgPT0gOCB8fCBkb2MuZG9jdW1lbnRNb2RlID09IDcpCisJCQkJeworCQkJCQl0YWJsZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisJCQkJCQorCQkJCQl2YXIgdXBkYXRlID0gZnVuY3Rpb24oKQorCQkJCQl7CisJCQkJCQl0YWJsZS5zdHlsZS50b3AgPSAoKGRvYy5ib2R5LnNjcm9sbFRvcCB8fCBkb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCkgKyAxMCkgKyAncHgnOworCQkJCQl9OworCQkJCQkKKwkJCQkJbXhFdmVudC5hZGRMaXN0ZW5lcih0aGlzLnduZCwgJ3Njcm9sbCcsIGZ1bmN0aW9uKGV2dCkKKwkJCQkJeworCQkJCQkJdXBkYXRlKCk7CisJCQkJCX0pOworCQkJCQkKKwkJCQkJbXhFdmVudC5hZGRMaXN0ZW5lcih0aGlzLnduZCwgJ3Jlc2l6ZScsIGZ1bmN0aW9uKGV2dCkKKwkJCQkJeworCQkJCQkJdXBkYXRlKCk7CisJCQkJCX0pOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCQorCQl2YXIgYWRkUGFnZSA9IG14VXRpbHMuYmluZCh0aGlzLCBmdW5jdGlvbihkaXYsIGFkZEJyZWFrKQorCQl7CisJCQkvLyBCb3JkZXIgb2YgdGhlIERJViAoYWthIHBhZ2UpIGluc2lkZSB0aGUgZG9jdW1lbnQKKwkJCWlmICh0aGlzLmJvcmRlckNvbG9yICE9IG51bGwpCisJCQl7CisJCQkJZGl2LnN0eWxlLmJvcmRlckNvbG9yID0gdGhpcy5ib3JkZXJDb2xvcjsKKwkJCQlkaXYuc3R5bGUuYm9yZGVyU3R5bGUgPSAnc29saWQnOworCQkJCWRpdi5zdHlsZS5ib3JkZXJXaWR0aCA9ICcxcHgnOworCQkJfQorCQkJCisJCQkvLyBOZWVkcyB0byBiZSBhc3NpZ25lZCBkaXJlY3RseSBiZWNhdXNlIElFIGRvZXNuJ3Qgc3VwcG9ydAorCQkJLy8gY2hpbGQgc2VsZWN0b3JzLCBlZy4gYm9keSA+IGRpdiB7IGJhY2tncm91bmQ6IHdoaXRlOyB9CisJCQlkaXYuc3R5bGUuYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZENvbG9yOworCQkJCisJCQlpZiAoZm9yY2VQYWdlQnJlYWtzIHx8IGFkZEJyZWFrKQorCQkJeworCQkJCWRpdi5zdHlsZS5wYWdlQnJlYWtBZnRlciA9ICdhbHdheXMnOworCQkJfQorCisJCQkvLyBOT1RFOiBXZSBhcmUgZGVhbGluZyB3aXRoIGNyb3NzLXdpbmRvdyBET00gaGVyZSwgd2hpY2gKKwkJCS8vIGlzIGEgcHJvYmxlbSBpbiBJRSwgc28gd2UgY29weSB0aGUgSFRNTCBtYXJrdXAgaW5zdGVhZC4KKwkJCS8vIFRoZSB1bmRlcmx5aW5nIHByb2JsZW0gaXMgdGhhdCB0aGUgZ3JhcGggZGlzcGxheSBtYXJrdXAKKwkJCS8vIGNyZWF0aW9uIChpbiBteFNoYXBlLCBteEdyYXBoVmlldykgaXMgaGFyZHdpcmVkIHRvIHVzaW5nCisJCQkvLyBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGFuZCBoZW5jZSB3ZSBtdXN0IHVzZSB0aGlzIGRvY3VtZW50CisJCQkvLyB0byBjcmVhdGUgdGhlIGNvbXBsZXRlIHBhZ2UgYW5kIHRoZW4gY29weSBpdCBvdmVyIHRvIHRoZQorCQkJLy8gbmV3IHdpbmRvdy5kb2N1bWVudC4gVGhpcyBjYW4gYmUgZml4ZWQgbGF0ZXIgYnkgdXNpbmcgdGhlCisJCQkvLyBvd25lckRvY3VtZW50IG9mIHRoZSBjb250YWluZXIgaW4gbXhTaGFwZSBhbmQgbXhHcmFwaFZpZXcuCisJCQlpZiAoaXNOZXdXaW5kb3cgJiYgKG14Q2xpZW50LklTX0lFIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA+PSAxMSB8fCBteENsaWVudC5JU19FREdFKSkKKwkJCXsKKwkJCQkvLyBGb3Igc29tZSBvYnNjdXJlIHJlYXNvbiwgcmVtb3ZpbmcgdGhlIERJViBmcm9tIHRoZQorCQkJCS8vIHBhcmVudCBiZWZvcmUgZmV0Y2hpbmcgaXRzIG91dGVySFRNTCBoYXMgbWlzc2luZworCQkJCS8vIGZpbGxjb2xvciBwcm9wZXJ0aWVzIGFuZCBmaWxsIGNoaWxkcmVuLCBzbyB0aGUgZGl2CisJCQkJLy8gbXVzdCBiZSByZW1vdmVkIGFmdGVyd2FyZHMgdG8ga2VlcCB0aGUgZmlsbGNvbG9ycy4KKwkJCQlkb2Mud3JpdGVsbihkaXYub3V0ZXJIVE1MKTsKKwkJCQlkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkaXYpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRpdik7CisJCQkJZG9jLmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTsKKwkJCX0KKworCQkJaWYgKGZvcmNlUGFnZUJyZWFrcyB8fCBhZGRCcmVhaykKKwkJCXsKKwkJCQl0aGlzLmFkZFBhZ2VCcmVhayhkb2MpOworCQkJfQorCQl9KTsKKwkJCisJCXZhciBjb3YgPSB0aGlzLmdldENvdmVyUGFnZXModGhpcy5wYWdlRm9ybWF0LndpZHRoLCB0aGlzLnBhZ2VGb3JtYXQuaGVpZ2h0KTsKKwkJCisJCWlmIChjb3YgIT0gbnVsbCkKKwkJeworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBjb3YubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJYWRkUGFnZShjb3ZbaV0sIHRydWUpOworCQkJfQorCQl9CisJCQorCQl2YXIgYXB4ID0gdGhpcy5nZXRBcHBlbmRpY2VzKHRoaXMucGFnZUZvcm1hdC53aWR0aCwgdGhpcy5wYWdlRm9ybWF0LmhlaWdodCk7CisJCQorCQkvLyBBcHBlbmRzIGVhY2ggcGFnZSB0byB0aGUgcGFnZSBvdXRwdXQgZm9yIHByaW50aW5nLCBtYWtpbmcKKwkJLy8gc3VyZSB0aGVyZSB3aWxsIGJlIGEgcGFnZSBicmVhayBhZnRlciBlYWNoIHBhZ2UgKGllLiBkaXYpCisJCWZvciAodmFyIGkgPSAwOyBpIDwgdnBhZ2VzOyBpKyspCisJCXsKKwkJCXZhciBkeSA9IGkgKiBhdmFpbGFibGVIZWlnaHQgLyB0aGlzLnNjYWxlIC0gdGhpcy55MCAvIHRoaXMuc2NhbGUgKworCQkJCQkoYm91bmRzLnkgLSB0ci55ICogY3VycmVudFNjYWxlKSAvIGN1cnJlbnRTY2FsZTsKKwkJCQorCQkJZm9yICh2YXIgaiA9IDA7IGogPCBocGFnZXM7IGorKykKKwkJCXsKKwkJCQlpZiAodGhpcy53bmQgPT0gbnVsbCkKKwkJCQl7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0KKwkJCQkKKwkJCQl2YXIgZHggPSBqICogYXZhaWxhYmxlV2lkdGggLyB0aGlzLnNjYWxlIC0gdGhpcy54MCAvIHRoaXMuc2NhbGUgKworCQkJCQkJKGJvdW5kcy54IC0gdHIueCAqIGN1cnJlbnRTY2FsZSkgLyBjdXJyZW50U2NhbGU7CisJCQkJdmFyIHBhZ2VOdW0gPSBpICogaHBhZ2VzICsgaiArIDE7CisJCQkJdmFyIGNsaXAgPSBuZXcgbXhSZWN0YW5nbGUoZHgsIGR5LCBhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0KTsKKwkJCQlkaXYgPSB0aGlzLnJlbmRlclBhZ2UodGhpcy5wYWdlRm9ybWF0LndpZHRoLCB0aGlzLnBhZ2VGb3JtYXQuaGVpZ2h0LCAwLCAwLCBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oZGl2KQorCQkJCXsKKwkJCQkJdGhpcy5hZGRHcmFwaEZyYWdtZW50KC1keCwgLWR5LCB0aGlzLnNjYWxlLCBwYWdlTnVtLCBkaXYsIGNsaXApOworCQkJCQkKKwkJCQkJaWYgKHRoaXMucHJpbnRCYWNrZ3JvdW5kSW1hZ2UpCisJCQkJCXsKKwkJCQkJCXRoaXMuaW5zZXJ0QmFja2dyb3VuZEltYWdlKGRpdiwgLWR4LCAtZHkpOworCQkJCQl9CisJCQkJfSksIHBhZ2VOdW0pOworCisJCQkJLy8gR2l2ZXMgdGhlIHBhZ2UgYSB1bmlxdWUgSUQgZm9yIGxhdGVyIGFjY2Vzc2luZyB0aGUgcGFnZQorCQkJCWRpdi5zZXRBdHRyaWJ1dGUoJ2lkJywgJ214UGFnZS0nK3BhZ2VOdW0pOworCisJCQkJYWRkUGFnZShkaXYsIGFweCAhPSBudWxsIHx8IGkgPCB2cGFnZXMgLSAxIHx8IGogPCBocGFnZXMgLSAxKTsKKwkJCX0KKwkJfQorCisJCWlmIChhcHggIT0gbnVsbCkKKwkJeworCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBhcHgubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJYWRkUGFnZShhcHhbaV0sIGkgPCBhcHgubGVuZ3RoIC0gMSk7CisJCQl9CisJCX0KKworCQlpZiAoaXNOZXdXaW5kb3cgJiYgIWtlZXBPcGVuKQorCQl7CisJCQl0aGlzLmNsb3NlRG9jdW1lbnQoKTsKKwkJCXdyaXRlUGFnZVNlbGVjdG9yKCk7CisJCX0KKwkJCisJCXRoaXMud25kLmZvY3VzKCk7CisJfQorCWNhdGNoIChlKQorCXsKKwkJLy8gUmVtb3ZlcyB0aGUgRElWIGZyb20gdGhlIGRvY3VtZW50IGluIGNhc2Ugb2YgYW4gZXJyb3IKKwkJaWYgKGRpdiAhPSBudWxsICYmIGRpdi5wYXJlbnROb2RlICE9IG51bGwpCisJCXsKKwkJCWRpdi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRpdik7CisJCX0KKwl9CisJZmluYWxseQorCXsKKwkJdGhpcy5ncmFwaC5jZWxsUmVuZGVyZXIuaW5pdGlhbGl6ZU92ZXJsYXkgPSBwcmV2aW91c0luaXRpYWxpemVPdmVybGF5OworCX0KKworCXJldHVybiB0aGlzLnduZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZFBhZ2VCcmVhaworICogCisgKiBBZGRzIGEgcGFnZSBicmVhayB0byB0aGUgZ2l2ZW4gZG9jdW1lbnQuCisgKi8KK214UHJpbnRQcmV2aWV3LnByb3RvdHlwZS5hZGRQYWdlQnJlYWsgPSBmdW5jdGlvbihkb2MpCit7CisJdmFyIGhyID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2hyJyk7CisJaHIuY2xhc3NOYW1lID0gJ214UGFnZUJyZWFrJzsKKwlkb2MuYm9keS5hcHBlbmRDaGlsZChocik7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjbG9zZURvY3VtZW50CisgKiAKKyAqIFdyaXRlcyB0aGUgY2xvc2luZyB0YWdzIGZvciBib2R5IGFuZCBwYWdlIGFmdGVyIGNhbGxpbmcgPHdyaXRlUG9zdGZpeD4uCisgKi8KK214UHJpbnRQcmV2aWV3LnByb3RvdHlwZS5jbG9zZURvY3VtZW50ID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLnduZCAhPSBudWxsICYmIHRoaXMud25kLmRvY3VtZW50ICE9IG51bGwpCisJeworCQl2YXIgZG9jID0gdGhpcy53bmQuZG9jdW1lbnQ7CisJCQorCQl0aGlzLndyaXRlUG9zdGZpeChkb2MpOworCQlkb2Mud3JpdGVsbignPC9ib2R5PicpOworCQlkb2Mud3JpdGVsbignPC9odG1sPicpOworCQlkb2MuY2xvc2UoKTsKKwkJCisJCS8vIFJlbW92ZXMgYWxsIGV2ZW50IGhhbmRsZXJzIGluIHRoZSBwcmludCBvdXRwdXQKKwkJbXhFdmVudC5yZWxlYXNlKGRvYy5ib2R5KTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB3cml0ZUhlYWQKKyAqIAorICogV3JpdGVzIHRoZSBIRUFEIHNlY3Rpb24gaW50byB0aGUgZ2l2ZW4gZG9jdW1lbnQsIHdpdGhvdXQgdGhlIG9wZW5pbmcKKyAqIGFuZCBjbG9zaW5nIEhFQUQgdGFncy4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLndyaXRlSGVhZCA9IGZ1bmN0aW9uKGRvYywgY3NzKQoreworCWlmICh0aGlzLnRpdGxlICE9IG51bGwpCisJeworCQlkb2Mud3JpdGVsbignPHRpdGxlPicgKyB0aGlzLnRpdGxlICsgJzwvdGl0bGU+Jyk7CisJfQorCQorCS8vIEFkZHMgcmVxdWlyZWQgbmFtZXNwYWNlcworCWlmIChteENsaWVudC5JU19WTUwpCisJeworCQlkb2Mud3JpdGVsbignPHN0eWxlIHR5cGU9InRleHQvY3NzIj52XFw6KntiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKX1vXFw6KntiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKX08L3N0eWxlPicpOworCX0KKworCS8vIEFkZHMgYWxsIHJlcXVpcmVkIHN0eWxlc2hlZXRzCisJbXhDbGllbnQubGluaygnc3R5bGVzaGVldCcsIG14Q2xpZW50LmJhc2VQYXRoICsgJy9jc3MvY29tbW9uLmNzcycsIGRvYyk7CisKKwkvLyBSZW1vdmVzIGhvcml6b250YWwgcnVsZXMgYW5kIHBhZ2Ugc2VsZWN0b3IgZnJvbSBwcmludCBvdXRwdXQKKwlkb2Mud3JpdGVsbignPHN0eWxlIHR5cGU9InRleHQvY3NzIj4nKTsKKwlkb2Mud3JpdGVsbignQG1lZGlhIHByaW50IHsnKTsKKwlkb2Mud3JpdGVsbignICB0YWJsZS5teFBhZ2VTZWxlY3RvciB7IGRpc3BsYXk6IG5vbmU7IH0nKTsKKwlkb2Mud3JpdGVsbignICBoci5teFBhZ2VCcmVhayB7IGRpc3BsYXk6IG5vbmU7IH0nKTsKKwlkb2Mud3JpdGVsbignfScpOworCWRvYy53cml0ZWxuKCdAbWVkaWEgc2NyZWVuIHsnKTsKKwkKKwkvLyBOT1RFOiBwb3NpdGlvbjogZml4ZWQgaXMgbm90IHN1cHBvcnRlZCBpbiBJRSwgc28gdGhlIHBhZ2Ugc2VsZWN0b3IKKwkvLyBwb3NpdGlvbiAoYWJzb2x1dGUpIG5lZWRzIHRvIGJlIHVwZGF0ZWQgaW4gSUUgKHNlZSBiZWxvdykKKwlkb2Mud3JpdGVsbignICB0YWJsZS5teFBhZ2VTZWxlY3RvciB7IHBvc2l0aW9uOiBmaXhlZDsgcmlnaHQ6IDEwcHg7IHRvcDogMTBweDsnICsKKwkJCSdmb250LWZhbWlseTogQXJpYWw7IGZvbnQtc2l6ZToxMHB0OyBib3JkZXI6IHNvbGlkIDFweCBkYXJrZ3JheTsnICsKKwkJCSdiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9Jyk7CisJZG9jLndyaXRlbG4oJyAgdGFibGUubXhQYWdlU2VsZWN0b3IgdGQgeyBib3JkZXI6IHNvbGlkIDFweCBncmF5OyBwYWRkaW5nOjRweDsgfScpOworCWRvYy53cml0ZWxuKCcgIGJvZHkubXhQYWdlIHsgYmFja2dyb3VuZDogZ3JheTsgfScpOworCWRvYy53cml0ZWxuKCd9Jyk7CisJCisJaWYgKGNzcyAhPSBudWxsKQorCXsKKwkJZG9jLndyaXRlbG4oY3NzKTsKKwl9CisJCisJZG9jLndyaXRlbG4oJzwvc3R5bGU+Jyk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiB3cml0ZVBvc3RmaXgKKyAqIAorICogQ2FsbGVkIGJlZm9yZSBjbG9zaW5nIHRoZSBib2R5IG9mIHRoZSBwYWdlLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgorICovCitteFByaW50UHJldmlldy5wcm90b3R5cGUud3JpdGVQb3N0Zml4ID0gZnVuY3Rpb24oZG9jKQoreworCS8vIGVtcHR5Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVQYWdlU2VsZWN0b3IKKyAqIAorICogQ3JlYXRlcyB0aGUgcGFnZSBzZWxlY3RvciB0YWJsZS4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLmNyZWF0ZVBhZ2VTZWxlY3RvciA9IGZ1bmN0aW9uKHZwYWdlcywgaHBhZ2VzKQoreworCXZhciBkb2MgPSB0aGlzLnduZC5kb2N1bWVudDsKKwl2YXIgdGFibGUgPSBkb2MuY3JlYXRlRWxlbWVudCgndGFibGUnKTsKKwl0YWJsZS5jbGFzc05hbWUgPSAnbXhQYWdlU2VsZWN0b3InOworCXRhYmxlLnNldEF0dHJpYnV0ZSgnYm9yZGVyJywgJzAnKTsKKworCXZhciB0Ym9keSA9IGRvYy5jcmVhdGVFbGVtZW50KCd0Ym9keScpOworCQorCWZvciAodmFyIGkgPSAwOyBpIDwgdnBhZ2VzOyBpKyspCisJeworCQl2YXIgcm93ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CisJCQorCQlmb3IgKHZhciBqID0gMDsgaiA8IGhwYWdlczsgaisrKQorCQl7CisJCQl2YXIgcGFnZU51bSA9IGkgKiBocGFnZXMgKyBqICsgMTsKKwkJCXZhciBjZWxsID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CisJCQl2YXIgYSA9IGRvYy5jcmVhdGVFbGVtZW50KCdhJyk7CisJCQlhLnNldEF0dHJpYnV0ZSgnaHJlZicsICcjbXhQYWdlLScgKyBwYWdlTnVtKTsKKworCQkJLy8gV29ya2Fyb3VuZCBmb3IgRkYgd2hlcmUgdGhlIGFuY2hvciBpcyBhcHBlbmRlZCB0byB0aGUgVVJMIG9mIHRoZSBvcmlnaW5hbCBkb2N1bWVudAorCQkJaWYgKG14Q2xpZW50LklTX05TICYmICFteENsaWVudC5JU19TRiAmJiAhbXhDbGllbnQuSVNfR0MpCisJCQl7CisJCQkJdmFyIGpzID0gJ3ZhciBwYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCdteFBhZ2UtJyArIHBhZ2VOdW0gKyAnXCcpO3BhZ2Uuc2Nyb2xsSW50b1ZpZXcodHJ1ZSk7ZXZlbnQucHJldmVudERlZmF1bHQoKTsnOworCQkJCWEuc2V0QXR0cmlidXRlKCdvbmNsaWNrJywganMpOworCQkJfQorCQkJCisJCQlteFV0aWxzLndyaXRlKGEsIHBhZ2VOdW0sIGRvYyk7CisJCQljZWxsLmFwcGVuZENoaWxkKGEpOworCQkJcm93LmFwcGVuZENoaWxkKGNlbGwpOworCQl9CisJCQorCQl0Ym9keS5hcHBlbmRDaGlsZChyb3cpOworCX0KKwkKKwl0YWJsZS5hcHBlbmRDaGlsZCh0Ym9keSk7CisJCisJcmV0dXJuIHRhYmxlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcmVuZGVyUGFnZQorICogCisgKiBDcmVhdGVzIGEgRElWIHRoYXQgcHJpbnRzIGEgc2luZ2xlIHBhZ2Ugb2YgdGhlIGdpdmVuCisgKiBncmFwaCB1c2luZyB0aGUgZ2l2ZW4gc2NhbGUgYW5kIHJldHVybnMgdGhlIERJViB0aGF0CisgKiByZXByZXNlbnRzIHRoZSBwYWdlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiB3IC0gV2lkdGggb2YgdGhlIHBhZ2UgaW4gcGl4ZWxzLgorICogaCAtIEhlaWdodCBvZiB0aGUgcGFnZSBpbiBwaXhlbHMuCisgKiBkeCAtIE9wdGlvbmFsIGhvcml6b250YWwgcGFnZSBvZmZzZXQgaW4gcGl4ZWxzICh1c2VkIGludGVybmFsbHkpLgorICogZHkgLSBPcHRpb25hbCB2ZXJ0aWNhbCBwYWdlIG9mZnNldCBpbiBwaXhlbHMgKHVzZWQgaW50ZXJuYWxseSkuCisgKiBjb250ZW50IC0gQ2FsbGJhY2sgdGhhdCBhZGRzIHRoZSBIVE1MIGNvbnRlbnQgdG8gdGhlIGlubmVyIGRpdiBvZiBhIHBhZ2UuCisgKiBUYWtlcyB0aGUgaW5uZXIgZGl2IGFzIHRoZSBhcmd1bWVudC4KKyAqIHBhZ2VOdW1iZXIgLSBJbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgcGFnZSBudW1iZXIuCisgKi8KK214UHJpbnRQcmV2aWV3LnByb3RvdHlwZS5yZW5kZXJQYWdlID0gZnVuY3Rpb24odywgaCwgZHgsIGR5LCBjb250ZW50LCBwYWdlTnVtYmVyKQoreworCXZhciBkb2MgPSB0aGlzLnduZC5kb2N1bWVudDsKKwl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CisJdmFyIGFyZyA9IG51bGw7CisKKwl0cnkKKwl7CisJCS8vIFdvcmthcm91bmQgZm9yIGlnbm9yZWQgY2xpcHBpbmcgaW4gSUUgOSBzdGFuZGFyZHMKKwkJLy8gd2hlbiBwcmludGluZyB3aXRoIHBhZ2UgYnJlYWtzIGFuZCBIVE1MIGxhYmVscy4KKwkJaWYgKGR4ICE9IDAgfHwgZHkgIT0gMCkKKwkJeworCQkJZGl2LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKKwkJCWRpdi5zdHlsZS53aWR0aCA9IHcgKyAncHgnOworCQkJZGl2LnN0eWxlLmhlaWdodCA9IGggKyAncHgnOworCQkJZGl2LnN0eWxlLnBhZ2VCcmVha0luc2lkZSA9ICdhdm9pZCc7CisJCQkKKwkJCXZhciBpbm5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworCQkJaW5uZXJEaXYuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOworCQkJaW5uZXJEaXYuc3R5bGUudG9wID0gdGhpcy5ib3JkZXIgKyAncHgnOworCQkJaW5uZXJEaXYuc3R5bGUubGVmdCA9IHRoaXMuYm9yZGVyICsgJ3B4JzsKKwkJCWlubmVyRGl2LnN0eWxlLndpZHRoID0gKHcgLSAyICogdGhpcy5ib3JkZXIpICsgJ3B4JzsKKwkJCWlubmVyRGl2LnN0eWxlLmhlaWdodCA9IChoIC0gMiAqIHRoaXMuYm9yZGVyKSArICdweCc7CisJCQlpbm5lckRpdi5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOworCQkJCisJCQl2YXIgdmlld3BvcnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKKwkJCXZpZXdwb3J0LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKKwkJCXZpZXdwb3J0LnN0eWxlLm1hcmdpbkxlZnQgPSBkeCArICdweCc7CisJCQl2aWV3cG9ydC5zdHlsZS5tYXJnaW5Ub3AgPSBkeSArICdweCc7CisKKwkJCS8vIEZJWE1FOiBJRTggc3RhbmRhcmRzIG91dHB1dCBwcm9ibGVtcworCQkJaWYgKGRvYy5kb2N1bWVudE1vZGUgPT0gOCkKKwkJCXsKKwkJCQlpbm5lckRpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CisJCQkJdmlld3BvcnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOworCQkJfQorCQkKKwkJCWlmIChkb2MuZG9jdW1lbnRNb2RlID09IDEwKQorCQkJeworCQkJCXZpZXdwb3J0LnN0eWxlLndpZHRoID0gJzEwMCUnOworCQkJCXZpZXdwb3J0LnN0eWxlLmhlaWdodCA9ICcxMDAlJzsKKwkJCX0KKwkJCQorCQkJaW5uZXJEaXYuYXBwZW5kQ2hpbGQodmlld3BvcnQpOworCQkJZGl2LmFwcGVuZENoaWxkKGlubmVyRGl2KTsKKwkJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTsKKwkJCWFyZyA9IHZpZXdwb3J0OworCQl9CisJCS8vIEZJWE1FOiBJRTEwLzExIHRvbyBtYW55IHBhZ2VzCisJCWVsc2UKKwkJeworCQkJZGl2LnN0eWxlLndpZHRoID0gdyArICdweCc7CisJCQlkaXYuc3R5bGUuaGVpZ2h0ID0gaCArICdweCc7CisJCQlkaXYuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKKwkJCWRpdi5zdHlsZS5wYWdlQnJlYWtJbnNpZGUgPSAnYXZvaWQnOworCQkJCisJCQkvLyBJRTggdXNlcyBhYm92ZSBicmFuY2ggY3VycmVudGx5CisJCQlpZiAoZG9jLmRvY3VtZW50TW9kZSA9PSA4KQorCQkJeworCQkJCWRpdi5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CisJCQl9CisJCQkKKwkJCXZhciBpbm5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOworCQkJaW5uZXJEaXYuc3R5bGUud2lkdGggPSAodyAtIDIgKiB0aGlzLmJvcmRlcikgKyAncHgnOworCQkJaW5uZXJEaXYuc3R5bGUuaGVpZ2h0ID0gKGggLSAyICogdGhpcy5ib3JkZXIpICsgJ3B4JzsKKwkJCWlubmVyRGl2LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7CisKKwkJCWlmIChteENsaWVudC5JU19JRSAmJiAoZG9jLmRvY3VtZW50TW9kZSA9PSBudWxsIHx8IGRvYy5kb2N1bWVudE1vZGUgPT0gNSB8fCBkb2MuZG9jdW1lbnRNb2RlID09IDggfHwgZG9jLmRvY3VtZW50TW9kZSA9PSA3KSkKKwkJCXsKKwkJCQlpbm5lckRpdi5zdHlsZS5tYXJnaW5Ub3AgPSB0aGlzLmJvcmRlciArICdweCc7CisJCQkJaW5uZXJEaXYuc3R5bGUubWFyZ2luTGVmdCA9IHRoaXMuYm9yZGVyICsgJ3B4JzsJCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaW5uZXJEaXYuc3R5bGUudG9wID0gdGhpcy5ib3JkZXIgKyAncHgnOworCQkJCWlubmVyRGl2LnN0eWxlLmxlZnQgPSB0aGlzLmJvcmRlciArICdweCc7CisJCQl9CisJCisJCQlpZiAodGhpcy5ncmFwaC5kaWFsZWN0ID09IG14Q29uc3RhbnRzLkRJQUxFQ1RfVk1MKQorCQkJeworCQkJCWlubmVyRGl2LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKwkJCX0KKworCQkJZGl2LmFwcGVuZENoaWxkKGlubmVyRGl2KTsKKwkJCWRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTsKKwkJCWFyZyA9IGlubmVyRGl2OworCQl9CisJfQorCWNhdGNoIChlKQorCXsKKwkJZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZGl2KTsKKwkJZGl2ID0gbnVsbDsKKwkJCisJCXRocm93IGU7CisJfQorCisJY29udGVudChhcmcpOworCSAKKwlyZXR1cm4gZGl2OworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Um9vdAorICogCisgKiBSZXR1cm5zIHRoZSByb290IGNlbGwgZm9yIHBhaW50aW5nIHRoZSBncmFwaC4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLmdldFJvb3QgPSBmdW5jdGlvbigpCit7CisJdmFyIHJvb3QgPSB0aGlzLmdyYXBoLnZpZXcuY3VycmVudFJvb3Q7CisJCisJaWYgKHJvb3QgPT0gbnVsbCkKKwl7CisJCXJvb3QgPSB0aGlzLmdyYXBoLmdldE1vZGVsKCkuZ2V0Um9vdCgpOworCX0KKwkKKwlyZXR1cm4gcm9vdDsKK307CisKKy8qKgorICogRnVuY3Rpb246IGFkZEdyYXBoRnJhZ21lbnQKKyAqIAorICogQWRkcyBhIGdyYXBoIGZyYWdtZW50IHRvIHRoZSBnaXZlbiBkaXYuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGR4IC0gSG9yaXpvbnRhbCB0cmFuc2xhdGlvbiBmb3IgdGhlIGRpYWdyYW0uCisgKiBkeSAtIFZlcnRpY2FsIHRyYW5zbGF0aW9uIGZvciB0aGUgZGlhZ3JhbS4KKyAqIHNjYWxlIC0gU2NhbGUgZm9yIHRoZSBkaWFncmFtLgorICogcGFnZU51bWJlciAtIE51bWJlciBvZiB0aGUgcGFnZSB0byBiZSByZW5kZXJlZC4KKyAqIGRpdiAtIERpdiB0aGF0IGNvbnRhaW5zIHRoZSBvdXRwdXQuCisgKiBjbGlwIC0gQ29udGFpbnMgdGhlIGNsaXBwaW5nIHJlY3RhbmdsZSBhcyBhbiA8bXhSZWN0YW5nbGU+LgorICovCitteFByaW50UHJldmlldy5wcm90b3R5cGUuYWRkR3JhcGhGcmFnbWVudCA9IGZ1bmN0aW9uKGR4LCBkeSwgc2NhbGUsIHBhZ2VOdW1iZXIsIGRpdiwgY2xpcCkKK3sKKwl2YXIgdmlldyA9IHRoaXMuZ3JhcGguZ2V0VmlldygpOworCXZhciBwcmV2aW91c0NvbnRhaW5lciA9IHRoaXMuZ3JhcGguY29udGFpbmVyOworCXRoaXMuZ3JhcGguY29udGFpbmVyID0gZGl2OworCQorCXZhciBjYW52YXMgPSB2aWV3LmdldENhbnZhcygpOworCXZhciBiYWNrZ3JvdW5kUGFuZSA9IHZpZXcuZ2V0QmFja2dyb3VuZFBhbmUoKTsKKwl2YXIgZHJhd1BhbmUgPSB2aWV3LmdldERyYXdQYW5lKCk7CisJdmFyIG92ZXJsYXlQYW5lID0gdmlldy5nZXRPdmVybGF5UGFuZSgpOworCisJaWYgKHRoaXMuZ3JhcGguZGlhbGVjdCA9PSBteENvbnN0YW50cy5ESUFMRUNUX1NWRykKKwl7CisJCXZpZXcuY3JlYXRlU3ZnKCk7CisJfQorCWVsc2UgaWYgKHRoaXMuZ3JhcGguZGlhbGVjdCA9PSBteENvbnN0YW50cy5ESUFMRUNUX1ZNTCkKKwl7CisJCXZpZXcuY3JlYXRlVm1sKCk7CisJfQorCWVsc2UKKwl7CisJCXZpZXcuY3JlYXRlSHRtbCgpOworCX0KKwkKKwkvLyBEaXNhYmxlcyBldmVudHMgb24gdGhlIHZpZXcKKwl2YXIgZXZlbnRzRW5hYmxlZCA9IHZpZXcuaXNFdmVudHNFbmFibGVkKCk7CisJdmlldy5zZXRFdmVudHNFbmFibGVkKGZhbHNlKTsKKwkKKwkvLyBEaXNhYmxlcyB0aGUgZ3JhcGggdG8gYXZvaWQgY3Vyc29ycworCXZhciBncmFwaEVuYWJsZWQgPSB0aGlzLmdyYXBoLmlzRW5hYmxlZCgpOworCXRoaXMuZ3JhcGguc2V0RW5hYmxlZChmYWxzZSk7CisKKwkvLyBSZXNldHMgdGhlIHRyYW5zbGF0aW9uCisJdmFyIHRyYW5zbGF0ZSA9IHZpZXcuZ2V0VHJhbnNsYXRlKCk7CisJdmlldy50cmFuc2xhdGUgPSBuZXcgbXhQb2ludChkeCwgZHkpOworCQorCS8vIFJlZHJhd3Mgb25seSBzdGF0ZXMgdGhhdCBpbnRlcnNlY3QgdGhlIGNsaXAKKwl2YXIgcmVkcmF3ID0gdGhpcy5ncmFwaC5jZWxsUmVuZGVyZXIucmVkcmF3OworCXZhciBzdGF0ZXMgPSB2aWV3LnN0YXRlczsKKwl2YXIgcyA9IHZpZXcuc2NhbGU7CisJCisJLy8gR2V0cyB0aGUgdHJhbnNmb3JtZWQgY2xpcCBmb3IgaW50ZXJzZWN0aW9uIGNoZWNrIGJlbG93CisJaWYgKHRoaXMuY2xpcHBpbmcpCisJeworCQl2YXIgdGVtcENsaXAgPSBuZXcgbXhSZWN0YW5nbGUoKGNsaXAueCArIHRyYW5zbGF0ZS54KSAqIHMsIChjbGlwLnkgKyB0cmFuc2xhdGUueSkgKiBzLAorCQkJCWNsaXAud2lkdGggKiBzIC8gc2NhbGUsIGNsaXAuaGVpZ2h0ICogcyAvIHNjYWxlKTsKKwkJCisJCS8vIENoZWNrcyBjbGlwcGluZyByZWN0YW5nbGUgZm9yIHNwZWVkdXAKKwkJLy8gTXVzdCBjcmVhdGUgdGVybWluYWwgc3RhdGVzIGZvciBlZGdlIGNsaXBwaW5nIGV2ZW4gaWYgdGVybWluYWwgb3V0c2lkZSBvZiBjbGlwCisJCXRoaXMuZ3JhcGguY2VsbFJlbmRlcmVyLnJlZHJhdyA9IGZ1bmN0aW9uKHN0YXRlLCBmb3JjZSwgcmVuZGVyaW5nKQorCQl7CisJCQlpZiAoc3RhdGUgIT0gbnVsbCkKKwkJCXsKKwkJCQkvLyBHZXRzIG9yaWdpbmFsIHN0YXRlIGZyb20gZ3JhcGggdG8gZmluZCBib3VuZGluZyBib3gKKwkJCQl2YXIgb3JpZyA9IHN0YXRlcy5nZXQoc3RhdGUuY2VsbCk7CisJCQkJCisJCQkJaWYgKG9yaWcgIT0gbnVsbCkKKwkJCQl7CisJCQkJCXZhciBiYm94ID0gdmlldy5nZXRCb3VuZGluZ0JveChvcmlnLCBmYWxzZSk7CisJCQkJCQorCQkJCQkvLyBTdG9wcyByZW5kZXJpbmcgaWYgb3V0c2lkZSBjbGlwIGZvciBzcGVlZHVwCisJCQkJCWlmIChiYm94ICE9IG51bGwgJiYgIW14VXRpbHMuaW50ZXJzZWN0cyh0ZW1wQ2xpcCwgYmJveCkpCisJCQkJCXsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQorCQkJcmVkcmF3LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCX07CisJfQorCQorCXZhciB0ZW1wID0gbnVsbDsKKwkKKwl0cnkKKwl7CisJCS8vIENyZWF0ZXMgdGhlIHRlbXBvcmFyeSBjZWxsIHN0YXRlcyBpbiB0aGUgdmlldyBhbmQKKwkJLy8gZHJhd3MgdGhlbSBvbnRvIHRoZSB0ZW1wb3JhcnkgRE9NIG5vZGVzIGluIHRoZSB2aWV3CisJCXZhciBjZWxscyA9IFt0aGlzLmdldFJvb3QoKV07CisJCXRlbXAgPSBuZXcgbXhUZW1wb3JhcnlDZWxsU3RhdGVzKHZpZXcsIHNjYWxlLCBjZWxscyk7CisJfQorCWZpbmFsbHkKKwl7CisJCS8vIFJlbW92ZXMgb3ZlcmxheSBwYW5lIHdpdGggc2VsZWN0aW9uIGhhbmRsZXMKKwkJLy8gY29udHJvbHMgYW5kIGljb25zIGZyb20gdGhlIHByaW50IG91dHB1dAorCQlpZiAobXhDbGllbnQuSVNfSUUpCisJCXsKKwkJCXZpZXcub3ZlcmxheVBhbmUuaW5uZXJIVE1MID0gJyc7CisJCQl2aWV3LmNhbnZhcy5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOworCQkJdmlldy5jYW52YXMuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOworCQkJdmlldy5jYW52YXMuc3R5bGUudG9wID0gdGhpcy5tYXJnaW5Ub3AgKyAncHgnOworCQkJdmlldy5jYW52YXMuc3R5bGUud2lkdGggPSBjbGlwLndpZHRoICsgJ3B4JzsKKwkJCXZpZXcuY2FudmFzLnN0eWxlLmhlaWdodCA9IGNsaXAuaGVpZ2h0ICsgJ3B4JzsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8vIFJlbW92ZXMgZXZlcnl0aGluZyBidXQgdGhlIFNWRyBub2RlCisJCQl2YXIgdG1wID0gZGl2LmZpcnN0Q2hpbGQ7CisKKwkJCXdoaWxlICh0bXAgIT0gbnVsbCkKKwkJCXsKKwkJCQl2YXIgbmV4dCA9IHRtcC5uZXh0U2libGluZzsKKwkJCQl2YXIgbmFtZSA9IHRtcC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOworCisJCQkJLy8gTm90ZTogV2lkdGggYW5kIGhlaWdodCBhcmUgcmVxdWlyZWQgaW4gRkYgMTEKKwkJCQlpZiAobmFtZSA9PSAnc3ZnJykKKwkJCQl7CisJCQkJCXRtcC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOworCQkJCQl0bXAuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnOworCQkJCQl0bXAuc3R5bGUudG9wID0gdGhpcy5tYXJnaW5Ub3AgKyAncHgnOworCQkJCQl0bXAuc2V0QXR0cmlidXRlKCd3aWR0aCcsIGNsaXAud2lkdGgpOworCQkJCQl0bXAuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBjbGlwLmhlaWdodCk7CisJCQkJCXRtcC5zdHlsZS53aWR0aCA9ICcnOworCQkJCQl0bXAuc3R5bGUuaGVpZ2h0ID0gJyc7CisJCQkJfQorCQkJCS8vIFRyaWVzIHRvIGZldGNoIGFsbCB0ZXh0IGxhYmVscyBhbmQgb25seSB0ZXh0IGxhYmVscworCQkJCWVsc2UgaWYgKHRtcC5zdHlsZS5jdXJzb3IgIT0gJ2RlZmF1bHQnICYmIG5hbWUgIT0gJ2RpdicpCisJCQkJeworCQkJCQl0bXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0bXApOworCQkJCX0KKwkJCQkKKwkJCQl0bXAgPSBuZXh0OworCQkJfQorCQl9CisJCQorCQkvLyBQdXRzIGJhY2tncm91bmQgaW1hZ2UgYmVoaW5kIFNWRyBvdXRwdXQKKwkJaWYgKHRoaXMucHJpbnRCYWNrZ3JvdW5kSW1hZ2UpCisJCXsKKwkJCXZhciBzdmdzID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdmcnKTsKKwkJCQorCQkJaWYgKHN2Z3MubGVuZ3RoID4gMCkKKwkJCXsKKwkJCQlzdmdzWzBdLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKwkJCX0KKwkJfQorCQkKKwkJLy8gQ29tcGxldGVseSByZW1vdmVzIHRoZSBvdmVybGF5IHBhbmUgdG8gcmVtb3ZlIG1vcmUgaGFuZGxlcworCQl2aWV3Lm92ZXJsYXlQYW5lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodmlldy5vdmVybGF5UGFuZSk7CisKKwkJLy8gUmVzdG9yZXMgdGhlIHN0YXRlIG9mIHRoZSB2aWV3CisJCXRoaXMuZ3JhcGguc2V0RW5hYmxlZChncmFwaEVuYWJsZWQpOworCQl0aGlzLmdyYXBoLmNvbnRhaW5lciA9IHByZXZpb3VzQ29udGFpbmVyOworCQl0aGlzLmdyYXBoLmNlbGxSZW5kZXJlci5yZWRyYXcgPSByZWRyYXc7CisJCXZpZXcuY2FudmFzID0gY2FudmFzOworCQl2aWV3LmJhY2tncm91bmRQYW5lID0gYmFja2dyb3VuZFBhbmU7CisJCXZpZXcuZHJhd1BhbmUgPSBkcmF3UGFuZTsKKwkJdmlldy5vdmVybGF5UGFuZSA9IG92ZXJsYXlQYW5lOworCQl2aWV3LnRyYW5zbGF0ZSA9IHRyYW5zbGF0ZTsKKwkJdGVtcC5kZXN0cm95KCk7CisJCXZpZXcuc2V0RXZlbnRzRW5hYmxlZChldmVudHNFbmFibGVkKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpbnNlcnRCYWNrZ3JvdW5kSW1hZ2UKKyAqIAorICogSW5zZXJ0cyB0aGUgYmFja2dyb3VuZCBpbWFnZSBpbnRvIHRoZSBnaXZlbiBkaXYuCisgKi8KK214UHJpbnRQcmV2aWV3LnByb3RvdHlwZS5pbnNlcnRCYWNrZ3JvdW5kSW1hZ2UgPSBmdW5jdGlvbihkaXYsIGR4LCBkeSkKK3sKKwl2YXIgYmcgPSB0aGlzLmdyYXBoLmJhY2tncm91bmRJbWFnZTsKKwkKKwlpZiAoYmcgIT0gbnVsbCkKKwl7CisJCXZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKKwkJaW1nLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKKwkJaW1nLnN0eWxlLm1hcmdpbkxlZnQgPSBNYXRoLnJvdW5kKGR4ICogdGhpcy5zY2FsZSkgKyAncHgnOworCQlpbWcuc3R5bGUubWFyZ2luVG9wID0gTWF0aC5yb3VuZChkeSAqIHRoaXMuc2NhbGUpICsgJ3B4JzsKKwkJaW1nLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBNYXRoLnJvdW5kKHRoaXMuc2NhbGUgKiBiZy53aWR0aCkpOworCQlpbWcuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBNYXRoLnJvdW5kKHRoaXMuc2NhbGUgKiBiZy5oZWlnaHQpKTsKKwkJaW1nLnNyYyA9IGJnLnNyYzsKKwkJCisJCWRpdi5pbnNlcnRCZWZvcmUoaW1nLCBkaXYuZmlyc3RDaGlsZCk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0Q292ZXJQYWdlcworICogCisgKiBSZXR1cm5zIHRoZSBwYWdlcyB0byBiZSBhZGRlZCBiZWZvcmUgdGhlIHByaW50IG91dHB1dC4gVGhpcyByZXR1cm5zIG51bGwuCisgKi8KK214UHJpbnRQcmV2aWV3LnByb3RvdHlwZS5nZXRDb3ZlclBhZ2VzID0gZnVuY3Rpb24oKQoreworCXJldHVybiBudWxsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0QXBwZW5kaWNlcworICogCisgKiBSZXR1cm5zIHRoZSBwYWdlcyB0byBiZSBhZGRlZCBhZnRlciB0aGUgcHJpbnQgb3V0cHV0LiBUaGlzIHJldHVybnMgbnVsbC4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLmdldEFwcGVuZGljZXMgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIG51bGw7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBwcmludAorICogCisgKiBPcGVucyB0aGUgcHJpbnQgcHJldmlldyBhbmQgc2hvd3MgdGhlIHByaW50IGRpYWxvZy4KKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogY3NzIC0gT3B0aW9uYWwgQ1NTIHN0cmluZyB0byBiZSB1c2VkIGluIHRoZSBoZWFkIHNlY3Rpb24uCisgKi8KK214UHJpbnRQcmV2aWV3LnByb3RvdHlwZS5wcmludCA9IGZ1bmN0aW9uKGNzcykKK3sKKwl2YXIgd25kID0gdGhpcy5vcGVuKGNzcyk7CisJCisJaWYgKHduZCAhPSBudWxsKQorCXsKKwkJd25kLnByaW50KCk7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogY2xvc2UKKyAqIAorICogQ2xvc2VzIHRoZSBwcmludCBwcmV2aWV3IHdpbmRvdy4KKyAqLworbXhQcmludFByZXZpZXcucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKQoreworCWlmICh0aGlzLnduZCAhPSBudWxsKQorCXsKKwkJdGhpcy53bmQuY2xvc2UoKTsKKwkJdGhpcy53bmQgPSBudWxsOworCX0KK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teFN0eWxlUmVnaXN0cnkuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teFN0eWxlUmVnaXN0cnkuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1ZDdhZgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214U3R5bGVSZWdpc3RyeS5qcwpAQCAtMCwwICsxLDcxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCit2YXIgbXhTdHlsZVJlZ2lzdHJ5ID0KK3sKKwkvKioKKwkgKiBDbGFzczogbXhTdHlsZVJlZ2lzdHJ5CisJICoKKwkgKiBTaW5nbGV0b24gY2xhc3MgdGhhdCBhY3RzIGFzIGEgZ2xvYmFsIGNvbnZlcnRlciBmcm9tIHN0cmluZyB0byBvYmplY3QgdmFsdWVzCisJICogaW4gYSBzdHlsZS4gVGhpcyBpcyBjdXJyZW50bHkgb25seSB1c2VkIHRvIHBlcmltZXRlcnMgYW5kIGVkZ2Ugc3R5bGVzLgorCSAqIAorCSAqIFZhcmlhYmxlOiB2YWx1ZXMKKwkgKgorCSAqIE1hcHMgZnJvbSBzdHJpbmdzIHRvIG9iamVjdHMuCisJICovCisJdmFsdWVzOiBbXSwKKworCS8qKgorCSAqIEZ1bmN0aW9uOiBwdXRWYWx1ZQorCSAqCisJICogUHV0cyB0aGUgZ2l2ZW4gb2JqZWN0IGludG8gdGhlIHJlZ2lzdHJ5IHVuZGVyIHRoZSBnaXZlbiBuYW1lLgorCSAqLworCXB1dFZhbHVlOiBmdW5jdGlvbihuYW1lLCBvYmopCisJeworCQlteFN0eWxlUmVnaXN0cnkudmFsdWVzW25hbWVdID0gb2JqOworCX0sCisKKwkvKioKKwkgKiBGdW5jdGlvbjogZ2V0VmFsdWUKKwkgKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKi8KKwlnZXRWYWx1ZTogZnVuY3Rpb24obmFtZSkKKwl7CisJCXJldHVybiBteFN0eWxlUmVnaXN0cnkudmFsdWVzW25hbWVdOworCX0sCisJCisJLyoqCisJICogRnVuY3Rpb246IGdldE5hbWUKKwkgKiAKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIGZvciB0aGUgZ2l2ZW4gdmFsdWUuCisJICovCisJZ2V0TmFtZTogZnVuY3Rpb24odmFsdWUpCisJeworCQlmb3IgKHZhciBrZXkgaW4gbXhTdHlsZVJlZ2lzdHJ5LnZhbHVlcykKKwkJeworCQkJaWYgKG14U3R5bGVSZWdpc3RyeS52YWx1ZXNba2V5XSA9PSB2YWx1ZSkKKwkJCXsKKwkJCQlyZXR1cm4ga2V5OworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gbnVsbDsKKwl9CisKK307CisKK214U3R5bGVSZWdpc3RyeS5wdXRWYWx1ZShteENvbnN0YW50cy5FREdFU1RZTEVfRUxCT1csIG14RWRnZVN0eWxlLkVsYm93Q29ubmVjdG9yKTsKK214U3R5bGVSZWdpc3RyeS5wdXRWYWx1ZShteENvbnN0YW50cy5FREdFU1RZTEVfRU5USVRZX1JFTEFUSU9OLCBteEVkZ2VTdHlsZS5FbnRpdHlSZWxhdGlvbik7CitteFN0eWxlUmVnaXN0cnkucHV0VmFsdWUobXhDb25zdGFudHMuRURHRVNUWUxFX0xPT1AsIG14RWRnZVN0eWxlLkxvb3ApOworbXhTdHlsZVJlZ2lzdHJ5LnB1dFZhbHVlKG14Q29uc3RhbnRzLkVER0VTVFlMRV9TSURFVE9TSURFLCBteEVkZ2VTdHlsZS5TaWRlVG9TaWRlKTsKK214U3R5bGVSZWdpc3RyeS5wdXRWYWx1ZShteENvbnN0YW50cy5FREdFU1RZTEVfVE9QVE9CT1RUT00sIG14RWRnZVN0eWxlLlRvcFRvQm90dG9tKTsKK214U3R5bGVSZWdpc3RyeS5wdXRWYWx1ZShteENvbnN0YW50cy5FREdFU1RZTEVfT1JUSE9HT05BTCwgbXhFZGdlU3R5bGUuT3J0aENvbm5lY3Rvcik7CitteFN0eWxlUmVnaXN0cnkucHV0VmFsdWUobXhDb25zdGFudHMuRURHRVNUWUxFX1NFR01FTlQsIG14RWRnZVN0eWxlLlNlZ21lbnRDb25uZWN0b3IpOworCitteFN0eWxlUmVnaXN0cnkucHV0VmFsdWUobXhDb25zdGFudHMuUEVSSU1FVEVSX0VMTElQU0UsIG14UGVyaW1ldGVyLkVsbGlwc2VQZXJpbWV0ZXIpOworbXhTdHlsZVJlZ2lzdHJ5LnB1dFZhbHVlKG14Q29uc3RhbnRzLlBFUklNRVRFUl9SRUNUQU5HTEUsIG14UGVyaW1ldGVyLlJlY3RhbmdsZVBlcmltZXRlcik7CitteFN0eWxlUmVnaXN0cnkucHV0VmFsdWUobXhDb25zdGFudHMuUEVSSU1FVEVSX1JIT01CVVMsIG14UGVyaW1ldGVyLlJob21idXNQZXJpbWV0ZXIpOworbXhTdHlsZVJlZ2lzdHJ5LnB1dFZhbHVlKG14Q29uc3RhbnRzLlBFUklNRVRFUl9UUklBTkdMRSwgbXhQZXJpbWV0ZXIuVHJpYW5nbGVQZXJpbWV0ZXIpOworbXhTdHlsZVJlZ2lzdHJ5LnB1dFZhbHVlKG14Q29uc3RhbnRzLlBFUklNRVRFUl9IRVhBR09OLCBteFBlcmltZXRlci5IZXhhZ29uUGVyaW1ldGVyKTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214U3R5bGVzaGVldC5qcyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214U3R5bGVzaGVldC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDM3Y2ZmCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3ZpZXcvbXhTdHlsZXNoZWV0LmpzCkBAIC0wLDAgKzEsMjY2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFN0eWxlc2hlZXQKKyAqIAorICogRGVmaW5lcyB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgY2VsbHMgaW4gYSBncmFwaC4gU2VlIDxwdXRDZWxsU3R5bGU+IGZvciBhbgorICogZXhhbXBsZSBvZiBjcmVhdGluZyBhIG5ldyBjZWxsIHN0eWxlLiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2Ugb2JqZWN0cywgbm90CisgKiBhcnJheXMgZm9yIGhvbGRpbmcgY2VsbCBzdHlsZXMuIEV4aXN0aW5nIHN0eWxlcyBjYW4gYmUgY2xvbmVkIHVzaW5nCisgKiA8bXhVdGlscy5jbG9uZT4gYW5kIHR1cm5lZCBpbnRvIGEgc3RyaW5nIGZvciBkZWJ1Z2dpbmcgdXNpbmcKKyAqIDxteFV0aWxzLnRvU3RyaW5nPi4KKyAqCisgKiBEZWZhdWx0IFN0eWxlczoKKyAqIAorICogVGhlIHN0eWxlc2hlZXQgY29udGFpbnMgdHdvIGJ1aWx0LWluIHN0eWxlcywgd2hpY2ggYXJlIHVzZWQgaWYgbm8gc3R5bGUgaXMKKyAqIGRlZmluZWQgZm9yIGEgY2VsbDoKKyAqCisgKiAgIGRlZmF1bHRWZXJ0ZXggLSBEZWZhdWx0IHN0eWxlIGZvciB2ZXJ0aWNlcworICogICBkZWZhdWx0RWRnZSAtIERlZmF1bHQgc3R5bGUgZm9yIGVkZ2VzCisgKiAKKyAqIEV4YW1wbGU6CisgKiAKKyAqIChjb2RlKQorICogdmFyIHZlcnRleFN0eWxlID0gc3R5bGVzaGVldC5nZXREZWZhdWx0VmVydGV4U3R5bGUoKTsKKyAqIHZlcnRleFN0eWxlW214Q29uc3RhbnRzLlJPVU5ERURdID0gdHJ1ZTsKKyAqIHZhciBlZGdlU3R5bGUgPSBzdHlsZXNoZWV0LmdldERlZmF1bHRFZGdlU3R5bGUoKTsKKyAqIGVkZ2VTdHlsZVtteENvbnN0YW50cy5TVFlMRV9FREdFXSA9IG14RWRnZVN0eWxlLkVudGl0eVJlbGF0aW9uOworICogKGVuZCkKKyAqIAorICogTW9kaWZpZXMgdGhlIGJ1aWx0LWluIGRlZmF1bHQgc3R5bGVzLgorICogCisgKiBUbyBhdm9pZCB0aGUgZGVmYXVsdCBzdHlsZSBmb3IgYSBjZWxsLCBhZGQgYSBsZWFkaW5nIHNlbWljb2xvbgorICogdG8gdGhlIHN0eWxlIGRlZmluaXRpb24sIGVnLgorICogCisgKiAoY29kZSkKKyAqIDtzaGFkb3c9MQorICogKGVuZCkKKyAqIAorICogUmVtb3Zpbmcga2V5czoKKyAqIAorICogRm9yIHJlbW92aW5nIGEga2V5IGluIGEgY2VsbCBzdHlsZSBvZiB0aGUgZm9ybSBbc3R5bGVuYW1lO3xrZXk9dmFsdWU7XSB0aGUKKyAqIHNwZWNpYWwgdmFsdWUgbm9uZSBjYW4gYmUgdXNlZCwgZWcuIGhpZ2hsaWdodDtmaWxsQ29sb3I9bm9uZQorICogCisgKiBTZWUgYWxzbyB0aGUgaGVscGVyIG1ldGhvZHMgaW4gbXhVdGlscyB0byBtb2RpZnkgc3RyaW5ncyBvZiB0aGlzIGZvcm1hdCwKKyAqIG5hbWVseSA8bXhVdGlscy5zZXRTdHlsZT4sIDxteFV0aWxzLmluZGV4T2ZTdHlsZW5hbWU+LAorICogPG14VXRpbHMuYWRkU3R5bGVuYW1lPiwgPG14VXRpbHMucmVtb3ZlU3R5bGVuYW1lPiwKKyAqIDxteFV0aWxzLnJlbW92ZUFsbFN0eWxlbmFtZXM+IGFuZCA8bXhVdGlscy5zZXRTdHlsZUZsYWc+LgorICogCisgKiBDb25zdHJ1Y3RvcjogbXhTdHlsZXNoZWV0CisgKiAKKyAqIENvbnN0cnVjdHMgYSBuZXcgc3R5bGVzaGVldCBhbmQgYXNzaWducyBkZWZhdWx0IHN0eWxlcy4KKyAqLworZnVuY3Rpb24gbXhTdHlsZXNoZWV0KCkKK3sKKwl0aGlzLnN0eWxlcyA9IG5ldyBPYmplY3QoKTsKKwkKKwl0aGlzLnB1dERlZmF1bHRWZXJ0ZXhTdHlsZSh0aGlzLmNyZWF0ZURlZmF1bHRWZXJ0ZXhTdHlsZSgpKTsKKwl0aGlzLnB1dERlZmF1bHRFZGdlU3R5bGUodGhpcy5jcmVhdGVEZWZhdWx0RWRnZVN0eWxlKCkpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc3R5bGVzCisgKiAKKyAqIE1hcHMgZnJvbSBuYW1lcyB0byBjZWxsIHN0eWxlcy4gRWFjaCBjZWxsIHN0eWxlIGlzIGEgbWFwIG9mIGtleSwKKyAqIHZhbHVlIHBhaXJzLgorICovCitteFN0eWxlc2hlZXQucHJvdG90eXBlLnN0eWxlczsKKworLyoqCisgKiBGdW5jdGlvbjogY3JlYXRlRGVmYXVsdFZlcnRleFN0eWxlCisgKiAKKyAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGRlZmF1bHQgdmVydGV4IHN0eWxlLgorICovCitteFN0eWxlc2hlZXQucHJvdG90eXBlLmNyZWF0ZURlZmF1bHRWZXJ0ZXhTdHlsZSA9IGZ1bmN0aW9uKCkKK3sKKwl2YXIgc3R5bGUgPSBuZXcgT2JqZWN0KCk7CisJCisJc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU0hBUEVdID0gbXhDb25zdGFudHMuU0hBUEVfUkVDVEFOR0xFOworCXN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1BFUklNRVRFUl0gPSBteFBlcmltZXRlci5SZWN0YW5nbGVQZXJpbWV0ZXI7CisJc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfVkVSVElDQUxfQUxJR05dID0gbXhDb25zdGFudHMuQUxJR05fTUlERExFOworCXN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0FMSUdOXSA9IG14Q29uc3RhbnRzLkFMSUdOX0NFTlRFUjsKKwlzdHlsZVtteENvbnN0YW50cy5TVFlMRV9GSUxMQ09MT1JdID0gJyNDM0Q5RkYnOworCXN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1NUUk9LRUNPTE9SXSA9ICcjNjQ4MkI5JzsKKwlzdHlsZVtteENvbnN0YW50cy5TVFlMRV9GT05UQ09MT1JdID0gJyM3NzQ0MDAnOworCQorCXJldHVybiBzdHlsZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGNyZWF0ZURlZmF1bHRFZGdlU3R5bGUKKyAqIAorICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgZGVmYXVsdCBlZGdlIHN0eWxlLgorICovCitteFN0eWxlc2hlZXQucHJvdG90eXBlLmNyZWF0ZURlZmF1bHRFZGdlU3R5bGUgPSBmdW5jdGlvbigpCit7CisJdmFyIHN0eWxlID0gbmV3IE9iamVjdCgpOworCQorCXN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1NIQVBFXSA9IG14Q29uc3RhbnRzLlNIQVBFX0NPTk5FQ1RPUjsKKwlzdHlsZVtteENvbnN0YW50cy5TVFlMRV9FTkRBUlJPV10gPSBteENvbnN0YW50cy5BUlJPV19DTEFTU0lDOworCXN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1ZFUlRJQ0FMX0FMSUdOXSA9IG14Q29uc3RhbnRzLkFMSUdOX01JRERMRTsKKwlzdHlsZVtteENvbnN0YW50cy5TVFlMRV9BTElHTl0gPSBteENvbnN0YW50cy5BTElHTl9DRU5URVI7CisJc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU1RST0tFQ09MT1JdID0gJyM2NDgyQjknOworCXN0eWxlW214Q29uc3RhbnRzLlNUWUxFX0ZPTlRDT0xPUl0gPSAnIzQ0NjI5OSc7CisJCisJcmV0dXJuIHN0eWxlOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcHV0RGVmYXVsdFZlcnRleFN0eWxlCisgKiAKKyAqIFNldHMgdGhlIGRlZmF1bHQgc3R5bGUgZm9yIHZlcnRpY2VzIHVzaW5nIGRlZmF1bHRWZXJ0ZXggYXMgdGhlCisgKiBzdHlsZW5hbWUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiBzdHlsZSAtIEtleSwgdmFsdWUgcGFpcnMgdGhhdCBkZWZpbmUgdGhlIHN0eWxlLgorICovCitteFN0eWxlc2hlZXQucHJvdG90eXBlLnB1dERlZmF1bHRWZXJ0ZXhTdHlsZSA9IGZ1bmN0aW9uKHN0eWxlKQoreworCXRoaXMucHV0Q2VsbFN0eWxlKCdkZWZhdWx0VmVydGV4Jywgc3R5bGUpOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogcHV0RGVmYXVsdEVkZ2VTdHlsZQorICogCisgKiBTZXRzIHRoZSBkZWZhdWx0IHN0eWxlIGZvciBlZGdlcyB1c2luZyBkZWZhdWx0RWRnZSBhcyB0aGUgc3R5bGVuYW1lLgorICovCitteFN0eWxlc2hlZXQucHJvdG90eXBlLnB1dERlZmF1bHRFZGdlU3R5bGUgPSBmdW5jdGlvbihzdHlsZSkKK3sKKwl0aGlzLnB1dENlbGxTdHlsZSgnZGVmYXVsdEVkZ2UnLCBzdHlsZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXREZWZhdWx0VmVydGV4U3R5bGUKKyAqIAorICogUmV0dXJucyB0aGUgZGVmYXVsdCBzdHlsZSBmb3IgdmVydGljZXMuCisgKi8KK214U3R5bGVzaGVldC5wcm90b3R5cGUuZ2V0RGVmYXVsdFZlcnRleFN0eWxlID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLnN0eWxlc1snZGVmYXVsdFZlcnRleCddOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogZ2V0RGVmYXVsdEVkZ2VTdHlsZQorICogCisgKiBTZXRzIHRoZSBkZWZhdWx0IHN0eWxlIGZvciBlZGdlcy4KKyAqLworbXhTdHlsZXNoZWV0LnByb3RvdHlwZS5nZXREZWZhdWx0RWRnZVN0eWxlID0gZnVuY3Rpb24oKQoreworCXJldHVybiB0aGlzLnN0eWxlc1snZGVmYXVsdEVkZ2UnXTsKK307CisKKy8qKgorICogRnVuY3Rpb246IHB1dENlbGxTdHlsZQorICogCisgKiBTdG9yZXMgdGhlIGdpdmVuIG1hcCBvZiBrZXksIHZhbHVlIHBhaXJzIHVuZGVyIHRoZSBnaXZlbiBuYW1lIGluCisgKiA8c3R5bGVzPi4KKyAqCisgKiBFeGFtcGxlOgorICogCisgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgYWRkcyBhIG5ldyBzdHlsZSBjYWxsZWQgJ3JvdW5kZWQnIGludG8gYW4KKyAqIGV4aXN0aW5nIHN0eWxlc2hlZXQ6CisgKiAKKyAqIChjb2RlKQorICogdmFyIHN0eWxlID0gbmV3IE9iamVjdCgpOworICogc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfU0hBUEVdID0gbXhDb25zdGFudHMuU0hBUEVfUkVDVEFOR0xFOworICogc3R5bGVbbXhDb25zdGFudHMuU1RZTEVfUEVSSU1FVEVSXSA9IG14UGVyaW1ldGVyLlJlY3RhbmdsZVBlcmltZXRlcjsKKyAqIHN0eWxlW214Q29uc3RhbnRzLlNUWUxFX1JPVU5ERURdID0gdHJ1ZTsKKyAqIGdyYXBoLmdldFN0eWxlc2hlZXQoKS5wdXRDZWxsU3R5bGUoJ3JvdW5kZWQnLCBzdHlsZSk7CisgKiAoZW5kKQorICogCisgKiBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIG5ldyBzdHlsZSBpcyBhbiBvYmplY3QuIFRoZSBwb3NzaWJsZSBrZXlzIG9mCisgKiB0aGUgb2JqZWN0IGFyZSBhbGwgdGhlIGNvbnN0YW50cyBpbiA8bXhDb25zdGFudHM+IHRoYXQgc3RhcnQgd2l0aCBTVFlMRQorICogYW5kIHRoZSB2YWx1ZXMgYXJlIGVpdGhlciBKYXZhU2NyaXB0IG9iamVjdHMsIHN1Y2ggYXMKKyAqIDxteFBlcmltZXRlci5SaWdodEFuZ2xlUmVjdGFuZ2xlUGVyaW1ldGVyPiAod2hpY2ggaXMgaW4gZmFjdCBhIGZ1bmN0aW9uKQorICogb3IgZXhwcmVzc2lvbnMsIHN1Y2ggYXMgdHJ1ZS4gTm90ZSB0aGF0IG5vdCBhbGwga2V5cyB3aWxsIGJlCisgKiBpbnRlcnByZXRlZCBieSBhbGwgc2hhcGVzIChlZy4gdGhlIGxpbmUgc2hhcGUgaWdub3JlcyB0aGUgZmlsbCBjb2xvcikuCisgKiBUaGUgZmluYWwgY2FsbCB0byB0aGlzIG1ldGhvZCBhc3NvY2lhdGVzIHRoZSBzdHlsZSB3aXRoIGEgbmFtZSBpbiB0aGUKKyAqIHN0eWxlc2hlZXQuIFRoZSBzdHlsZSBpcyB1c2VkIGluIGEgY2VsbCB3aXRoIHRoZSBmb2xsb3dpbmcgY29kZToKKyAqIAorICogKGNvZGUpCisgKiBtb2RlbC5zZXRTdHlsZShjZWxsLCAncm91bmRlZCcpOworICogKGVuZCkKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIAorICogbmFtZSAtIE5hbWUgZm9yIHRoZSBzdHlsZSB0byBiZSBzdG9yZWQuCisgKiBzdHlsZSAtIEtleSwgdmFsdWUgcGFpcnMgdGhhdCBkZWZpbmUgdGhlIHN0eWxlLgorICovCitteFN0eWxlc2hlZXQucHJvdG90eXBlLnB1dENlbGxTdHlsZSA9IGZ1bmN0aW9uKG5hbWUsIHN0eWxlKQoreworCXRoaXMuc3R5bGVzW25hbWVdID0gc3R5bGU7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBnZXRDZWxsU3R5bGUKKyAqIAorICogUmV0dXJucyB0aGUgY2VsbCBzdHlsZSBmb3IgdGhlIHNwZWNpZmllZCBzdHlsZW5hbWUgb3IgdGhlIGdpdmVuCisgKiBkZWZhdWx0U3R5bGUgaWYgbm8gc3R5bGUgY2FuIGJlIGZvdW5kIGZvciB0aGUgZ2l2ZW4gc3R5bGVuYW1lLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBuYW1lIC0gU3RyaW5nIG9mIHRoZSBmb3JtIFsoc3R5bGVuYW1lfGtleT12YWx1ZSk7XSB0aGF0IHJlcHJlc2VudHMgdGhlCisgKiBzdHlsZS4KKyAqIGRlZmF1bHRTdHlsZSAtIERlZmF1bHQgc3R5bGUgdG8gYmUgcmV0dXJuZWQgaWYgbm8gc3R5bGUgY2FuIGJlIGZvdW5kLgorICovCitteFN0eWxlc2hlZXQucHJvdG90eXBlLmdldENlbGxTdHlsZSA9IGZ1bmN0aW9uKG5hbWUsIGRlZmF1bHRTdHlsZSkKK3sKKwl2YXIgc3R5bGUgPSBkZWZhdWx0U3R5bGU7CisJCisJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmxlbmd0aCA+IDApCisJeworCQl2YXIgcGFpcnMgPSBuYW1lLnNwbGl0KCc7Jyk7CisKKwkJaWYgKHN0eWxlICE9IG51bGwgJiYKKwkJCW5hbWUuY2hhckF0KDApICE9ICc7JykKKwkJeworCQkJc3R5bGUgPSBteFV0aWxzLmNsb25lKHN0eWxlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXN0eWxlID0gbmV3IE9iamVjdCgpOworCQl9CisKKwkJLy8gUGFyc2VzIGVhY2gga2V5LCB2YWx1ZSBwYWlyIGludG8gdGhlIGV4aXN0aW5nIHN0eWxlCisJIAlmb3IgKHZhciBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSsrKQorCSAJeworCSAJCXZhciB0bXAgPSBwYWlyc1tpXTsKKwkgCQl2YXIgcG9zID0gdG1wLmluZGV4T2YoJz0nKTsKKwkgCQkKKwkgCQlpZiAocG9zID49IDApCisJIAkJeworCQkgCQl2YXIga2V5ID0gdG1wLnN1YnN0cmluZygwLCBwb3MpOworCQkgCQl2YXIgdmFsdWUgPSB0bXAuc3Vic3RyaW5nKHBvcyArIDEpOworCisJCSAJCWlmICh2YWx1ZSA9PSBteENvbnN0YW50cy5OT05FKQorCQkgCQl7CisJCSAJCQlkZWxldGUgc3R5bGVba2V5XTsKKwkJIAkJfQorCQkgCQllbHNlIGlmIChteFV0aWxzLmlzTnVtZXJpYyh2YWx1ZSkpCisJCSAJCXsKKwkJIAkJCXN0eWxlW2tleV0gPSBwYXJzZUZsb2F0KHZhbHVlKTsKKwkJIAkJfQorCQkgCQllbHNlCisJCSAJCXsKKwkJCSAJCXN0eWxlW2tleV0gPSB2YWx1ZTsKKwkJIAkJfQorCQkJfQorCSAJCWVsc2UKKwkgCQl7CisJIAkJCS8vIE1lcmdlcyB0aGUgZW50cmllcyBmcm9tIGEgbmFtZWQgc3R5bGUKKwkJCQl2YXIgdG1wU3R5bGUgPSB0aGlzLnN0eWxlc1t0bXBdOworCQkJCQorCQkJCWlmICh0bXBTdHlsZSAhPSBudWxsKQorCQkJCXsKKwkJCQkJZm9yICh2YXIga2V5IGluIHRtcFN0eWxlKQorCQkJCQl7CisJCQkJCQlzdHlsZVtrZXldID0gdG1wU3R5bGVba2V5XTsKKwkJCQkJfQorCQkJCX0KKwkgCQl9CisJCX0KKwl9CisJCisJcmV0dXJuIHN0eWxlOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214U3dpbWxhbmVNYW5hZ2VyLmpzIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL2pzL3ZpZXcvbXhTd2ltbGFuZU1hbmFnZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyMjE0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214U3dpbWxhbmVNYW5hZ2VyLmpzCkBAIC0wLDAgKzEsNDUwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE1LCBKR3JhcGggTHRkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgR2F1ZGVueiBBbGRlcgorICovCisvKioKKyAqIENsYXNzOiBteFN3aW1sYW5lTWFuYWdlcgorICogCisgKiBNYW5hZ2VyIGZvciBzd2ltbGFuZXMgYW5kIG5lc3RlZCBzd2ltbGFuZXMgdGhhdCBzZXRzIHRoZSBzaXplIG9mIG5ld2x5IGFkZGVkCisgKiBzd2ltbGFuZXMgdG8gdGhhdCBvZiB0aGVpciBzaWJsaW5ncywgYW5kIHByb3BhZ2F0ZXMgY2hhbmdlcyB0byB0aGUgc2l6ZSBvZiBhCisgKiBzd2ltbGFuZSB0byBpdHMgc2libGluZ3MsIGlmIDxzaWJsaW5ncz4gaXMgdHJ1ZSwgYW5kIGl0cyBhbmNlc3RvcnMsIGlmCisgKiA8YnViYmxpbmc+IGlzIHRydWUuCisgKiAKKyAqIENvbnN0cnVjdG9yOiBteFN3aW1sYW5lTWFuYWdlcgorICoKKyAqIENvbnN0cnVjdHMgYSBuZXcgc3dpbWxhbmUgbWFuYWdlciBmb3IgdGhlIGdpdmVuIGdyYXBoLgorICoKKyAqIEFyZ3VtZW50czoKKyAqIAorICogZ3JhcGggLSBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyBncmFwaC4gCisgKi8KK2Z1bmN0aW9uIG14U3dpbWxhbmVNYW5hZ2VyKGdyYXBoLCBob3Jpem9udGFsLCBhZGRFbmFibGVkLCByZXNpemVFbmFibGVkKQoreworCXRoaXMuaG9yaXpvbnRhbCA9IChob3Jpem9udGFsICE9IG51bGwpID8gaG9yaXpvbnRhbCA6IHRydWU7CisJdGhpcy5hZGRFbmFibGVkID0gKGFkZEVuYWJsZWQgIT0gbnVsbCkgPyBhZGRFbmFibGVkIDogdHJ1ZTsKKwl0aGlzLnJlc2l6ZUVuYWJsZWQgPSAocmVzaXplRW5hYmxlZCAhPSBudWxsKSA/IHJlc2l6ZUVuYWJsZWQgOiB0cnVlOworCisJdGhpcy5hZGRIYW5kbGVyID0gbXhVdGlscy5iaW5kKHRoaXMsIGZ1bmN0aW9uKHNlbmRlciwgZXZ0KQorCXsKKwkJaWYgKHRoaXMuaXNFbmFibGVkKCkgJiYgdGhpcy5pc0FkZEVuYWJsZWQoKSkKKwkJeworCQkJdGhpcy5jZWxsc0FkZGVkKGV2dC5nZXRQcm9wZXJ0eSgnY2VsbHMnKSk7CisJCX0KKwl9KTsKKwkKKwl0aGlzLnJlc2l6ZUhhbmRsZXIgPSBteFV0aWxzLmJpbmQodGhpcywgZnVuY3Rpb24oc2VuZGVyLCBldnQpCisJeworCQlpZiAodGhpcy5pc0VuYWJsZWQoKSAmJiB0aGlzLmlzUmVzaXplRW5hYmxlZCgpKQorCQl7CisJCQl0aGlzLmNlbGxzUmVzaXplZChldnQuZ2V0UHJvcGVydHkoJ2NlbGxzJykpOworCQl9CisJfSk7CisJCisJdGhpcy5zZXRHcmFwaChncmFwaCk7Cit9OworCisvKioKKyAqIEV4dGVuZHMgbXhFdmVudFNvdXJjZS4KKyAqLworbXhTd2ltbGFuZU1hbmFnZXIucHJvdG90eXBlID0gbmV3IG14RXZlbnRTb3VyY2UoKTsKK214U3dpbWxhbmVNYW5hZ2VyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG14U3dpbWxhbmVNYW5hZ2VyOworCisvKioKKyAqIFZhcmlhYmxlOiBncmFwaAorICogCisgKiBSZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyA8bXhHcmFwaD4uCisgKi8KK214U3dpbWxhbmVNYW5hZ2VyLnByb3RvdHlwZS5ncmFwaCA9IG51bGw7CisKKy8qKgorICogVmFyaWFibGU6IGVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIGV2ZW50IGhhbmRsaW5nIGlzIGVuYWJsZWQuIERlZmF1bHQgaXMgdHJ1ZS4KKyAqLworbXhTd2ltbGFuZU1hbmFnZXIucHJvdG90eXBlLmVuYWJsZWQgPSB0cnVlOworCisvKioKKyAqIFZhcmlhYmxlOiBob3Jpem9udGFsCisgKiAKKyAqIFNwZWNpZmllcyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHN3aW1sYW5lcy4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteFN3aW1sYW5lTWFuYWdlci5wcm90b3R5cGUuaG9yaXpvbnRhbCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IGFkZEVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIG5ld2x5IGFkZGVkIGNlbGxzIHNob3VsZCBiZSByZXNpemVkIHRvIG1hdGNoIHRoZSBzaXplIG9mIHRoZWlyCisgKiBleGlzdGluZyBzaWJsaW5ncy4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteFN3aW1sYW5lTWFuYWdlci5wcm90b3R5cGUuYWRkRW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IHJlc2l6ZUVuYWJsZWQKKyAqIAorICogU3BlY2lmaWVzIGlmIHJlc2l6aW5nIG9mIHN3aW1sYW5lcyBzaG91bGQgYmUgaGFuZGxlZC4gRGVmYXVsdCBpcyB0cnVlLgorICovCitteFN3aW1sYW5lTWFuYWdlci5wcm90b3R5cGUucmVzaXplRW5hYmxlZCA9IHRydWU7CisKKy8qKgorICogVmFyaWFibGU6IG1vdmVIYW5kbGVyCisgKiAKKyAqIEhvbGRzIHRoZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgdGhlIG1vdmUgZXZlbnQuCisgKi8KK214U3dpbWxhbmVNYW5hZ2VyLnByb3RvdHlwZS5hZGRIYW5kbGVyID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogbW92ZUhhbmRsZXIKKyAqIAorICogSG9sZHMgdGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyB0aGUgbW92ZSBldmVudC4KKyAqLworbXhTd2ltbGFuZU1hbmFnZXIucHJvdG90eXBlLnJlc2l6ZUhhbmRsZXIgPSBudWxsOworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0VuYWJsZWQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIGV2ZW50cyBhcmUgaGFuZGxlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICogcmV0dXJucyA8ZW5hYmxlZD4uCisgKi8KK214U3dpbWxhbmVNYW5hZ2VyLnByb3RvdHlwZS5pc0VuYWJsZWQgPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuZW5hYmxlZDsKK307CisKKy8qKgorICogRnVuY3Rpb246IHNldEVuYWJsZWQKKyAqIAorICogRW5hYmxlcyBvciBkaXNhYmxlcyBldmVudCBoYW5kbGluZy4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICogdXBkYXRlcyA8ZW5hYmxlZD4uCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIGVuYWJsZWQgLSBCb29sZWFuIHRoYXQgc3BlY2lmaWVzIHRoZSBuZXcgZW5hYmxlZCBzdGF0ZS4KKyAqLworbXhTd2ltbGFuZU1hbmFnZXIucHJvdG90eXBlLnNldEVuYWJsZWQgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmVuYWJsZWQgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzSG9yaXpvbnRhbAorICogCisgKiBSZXR1cm5zIDxob3Jpem9udGFsPi4KKyAqLworbXhTd2ltbGFuZU1hbmFnZXIucHJvdG90eXBlLmlzSG9yaXpvbnRhbCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5ob3Jpem9udGFsOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0SG9yaXpvbnRhbAorICogCisgKiBTZXRzIDxob3Jpem9udGFsPi4KKyAqLworbXhTd2ltbGFuZU1hbmFnZXIucHJvdG90eXBlLnNldEhvcml6b250YWwgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmhvcml6b250YWwgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzQWRkRW5hYmxlZAorICogCisgKiBSZXR1cm5zIDxhZGRFbmFibGVkPi4KKyAqLworbXhTd2ltbGFuZU1hbmFnZXIucHJvdG90eXBlLmlzQWRkRW5hYmxlZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5hZGRFbmFibGVkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0QWRkRW5hYmxlZAorICogCisgKiBTZXRzIDxhZGRFbmFibGVkPi4KKyAqLworbXhTd2ltbGFuZU1hbmFnZXIucHJvdG90eXBlLnNldEFkZEVuYWJsZWQgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLmFkZEVuYWJsZWQgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGlzUmVzaXplRW5hYmxlZAorICogCisgKiBSZXR1cm5zIDxyZXNpemVFbmFibGVkPi4KKyAqLworbXhTd2ltbGFuZU1hbmFnZXIucHJvdG90eXBlLmlzUmVzaXplRW5hYmxlZCA9IGZ1bmN0aW9uKCkKK3sKKwlyZXR1cm4gdGhpcy5yZXNpemVFbmFibGVkOworfTsKKworLyoqCisgKiBGdW5jdGlvbjogc2V0UmVzaXplRW5hYmxlZAorICogCisgKiBTZXRzIDxyZXNpemVFbmFibGVkPi4KKyAqLworbXhTd2ltbGFuZU1hbmFnZXIucHJvdG90eXBlLnNldFJlc2l6ZUVuYWJsZWQgPSBmdW5jdGlvbih2YWx1ZSkKK3sKKwl0aGlzLnJlc2l6ZUVuYWJsZWQgPSB2YWx1ZTsKK307CisKKy8qKgorICogRnVuY3Rpb246IGdldEdyYXBoCisgKiAKKyAqIFJldHVybnMgdGhlIGdyYXBoIHRoYXQgdGhpcyBtYW5hZ2VyIG9wZXJhdGVzIG9uLgorICovCitteFN3aW1sYW5lTWFuYWdlci5wcm90b3R5cGUuZ2V0R3JhcGggPSBmdW5jdGlvbigpCit7CisJcmV0dXJuIHRoaXMuZ3JhcGg7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzZXRHcmFwaAorICogCisgKiBTZXRzIHRoZSBncmFwaCB0aGF0IHRoZSBtYW5hZ2VyIG9wZXJhdGVzIG9uLgorICovCitteFN3aW1sYW5lTWFuYWdlci5wcm90b3R5cGUuc2V0R3JhcGggPSBmdW5jdGlvbihncmFwaCkKK3sKKwlpZiAodGhpcy5ncmFwaCAhPSBudWxsKQorCXsKKwkJdGhpcy5ncmFwaC5yZW1vdmVMaXN0ZW5lcih0aGlzLmFkZEhhbmRsZXIpOworCQl0aGlzLmdyYXBoLnJlbW92ZUxpc3RlbmVyKHRoaXMucmVzaXplSGFuZGxlcik7CisJfQorCQorCXRoaXMuZ3JhcGggPSBncmFwaDsKKwkKKwlpZiAodGhpcy5ncmFwaCAhPSBudWxsKQorCXsKKwkJdGhpcy5ncmFwaC5hZGRMaXN0ZW5lcihteEV2ZW50LkFERF9DRUxMUywgdGhpcy5hZGRIYW5kbGVyKTsKKwkJdGhpcy5ncmFwaC5hZGRMaXN0ZW5lcihteEV2ZW50LkNFTExTX1JFU0laRUQsIHRoaXMucmVzaXplSGFuZGxlcik7CisJfQorfTsKKworLyoqCisgKiBGdW5jdGlvbjogaXNTd2ltbGFuZUlnbm9yZWQKKyAqIAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzd2ltbGFuZSBzaG91bGQgYmUgaWdub3JlZC4KKyAqLworbXhTd2ltbGFuZU1hbmFnZXIucHJvdG90eXBlLmlzU3dpbWxhbmVJZ25vcmVkID0gZnVuY3Rpb24oc3dpbWxhbmUpCit7CisJcmV0dXJuICF0aGlzLmdldEdyYXBoKCkuaXNTd2ltbGFuZShzd2ltbGFuZSk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBpc0NlbGxIb3Jpem9udGFsCisgKiAKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2VsbCBpcyBob3Jpem9udGFsLiBJZiB0aGUgZ2l2ZW4gY2VsbCBpcyBub3QgYQorICogc3dpbWxhbmUsIHRoZW4gdGhlIGdsb2JhbCBvcmllbnRhdGlvbiBpcyByZXR1cm5lZC4KKyAqLworbXhTd2ltbGFuZU1hbmFnZXIucHJvdG90eXBlLmlzQ2VsbEhvcml6b250YWwgPSBmdW5jdGlvbihjZWxsKQoreworCWlmICh0aGlzLmdyYXBoLmlzU3dpbWxhbmUoY2VsbCkpCisJeworCQl2YXIgc3R5bGUgPSB0aGlzLmdyYXBoLmdldENlbGxTdHlsZShjZWxsKTsKKwkJCisJCXJldHVybiBteFV0aWxzLmdldFZhbHVlKHN0eWxlLCBteENvbnN0YW50cy5TVFlMRV9IT1JJWk9OVEFMLCAxKSA9PSAxOworCX0KKwkKKwlyZXR1cm4gIXRoaXMuaXNIb3Jpem9udGFsKCk7Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBjZWxsc0FkZGVkCisgKiAKKyAqIENhbGxlZCBpZiBhbnkgY2VsbHMgaGF2ZSBiZWVuIGFkZGVkLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxsIC0gQXJyYXkgb2YgPG14Q2VsbHM+IHRoYXQgaGF2ZSBiZWVuIGFkZGVkLgorICovCitteFN3aW1sYW5lTWFuYWdlci5wcm90b3R5cGUuY2VsbHNBZGRlZCA9IGZ1bmN0aW9uKGNlbGxzKQoreworCWlmIChjZWxscyAhPSBudWxsKQorCXsKKwkJdmFyIG1vZGVsID0gdGhpcy5nZXRHcmFwaCgpLmdldE1vZGVsKCk7CisKKwkJbW9kZWwuYmVnaW5VcGRhdGUoKTsKKwkJdHJ5CisJCXsKKwkJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCQl7CisJCQkJaWYgKCF0aGlzLmlzU3dpbWxhbmVJZ25vcmVkKGNlbGxzW2ldKSkKKwkJCQl7CisJCQkJCXRoaXMuc3dpbWxhbmVBZGRlZChjZWxsc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJCWZpbmFsbHkKKwkJeworCQkJbW9kZWwuZW5kVXBkYXRlKCk7CisJCX0KKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBzd2ltbGFuZUFkZGVkCisgKiAKKyAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhlIGdpdmVuIHN3aW1sYW5lIHRvIG1hdGNoIHRoYXQgb2YgYW55IGV4aXN0aW5nCisgKiBzaWJsaW5ncyBzd2ltbGFuZXMuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN3aW1sYW5lIC0gPG14Q2VsbD4gdGhhdCByZXByZXNlbnRzIHRoZSBuZXcgc3dpbWxhbmUuCisgKi8KK214U3dpbWxhbmVNYW5hZ2VyLnByb3RvdHlwZS5zd2ltbGFuZUFkZGVkID0gZnVuY3Rpb24oc3dpbWxhbmUpCit7CisJdmFyIG1vZGVsID0gdGhpcy5nZXRHcmFwaCgpLmdldE1vZGVsKCk7CisJdmFyIHBhcmVudCA9IG1vZGVsLmdldFBhcmVudChzd2ltbGFuZSk7CisJdmFyIGNoaWxkQ291bnQgPSBtb2RlbC5nZXRDaGlsZENvdW50KHBhcmVudCk7CisJdmFyIGdlbyA9IG51bGw7CisJCisJLy8gRmluZHMgdGhlIGZpcnN0IHZhbGlkIHNpYmxpbmcgc3dpbWxhbmUgYXMgcmVmZXJlbmNlCisJZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspCisJeworCQl2YXIgY2hpbGQgPSBtb2RlbC5nZXRDaGlsZEF0KHBhcmVudCwgaSk7CisJCQorCQlpZiAoY2hpbGQgIT0gc3dpbWxhbmUgJiYgIXRoaXMuaXNTd2ltbGFuZUlnbm9yZWQoY2hpbGQpKQorCQl7CisJCQlnZW8gPSBtb2RlbC5nZXRHZW9tZXRyeShjaGlsZCk7CisJCQkKKwkJCWlmIChnZW8gIT0gbnVsbCkKKwkJCXsJCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJCisJLy8gQXBwbGllcyB0aGUgc2l6ZSBvZiB0aGUgcmVmZXJuZWNlIHRvIHRoZSBuZXdseSBhZGRlZCBzd2ltbGFuZQorCWlmIChnZW8gIT0gbnVsbCkKKwl7CisJCXZhciBwYXJlbnRIb3Jpem9udGFsID0gKHBhcmVudCAhPSBudWxsKSA/IHRoaXMuaXNDZWxsSG9yaXpvbnRhbChwYXJlbnQpIDogdGhpcy5ob3Jpem9udGFsOworCQl0aGlzLnJlc2l6ZVN3aW1sYW5lKHN3aW1sYW5lLCBnZW8ud2lkdGgsIGdlby5oZWlnaHQsIHBhcmVudEhvcml6b250YWwpOworCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IGNlbGxzUmVzaXplZAorICogCisgKiBDYWxsZWQgaWYgYW55IGNlbGxzIGhhdmUgYmVlbiByZXNpemVzLiBDYWxscyA8c3dpbWxhbmVSZXNpemVkPiBmb3IgYWxsCisgKiBzd2ltbGFuZXMgd2hlcmUgPGlzU3dpbWxhbmVJZ25vcmVkPiByZXR1cm5zIGZhbHNlLgorICogCisgKiBQYXJhbWV0ZXJzOgorICogCisgKiBjZWxscyAtIEFycmF5IG9mIDxteENlbGxzPiB3aG9zZSBzaXplIHdhcyBjaGFuZ2VkLgorICovCitteFN3aW1sYW5lTWFuYWdlci5wcm90b3R5cGUuY2VsbHNSZXNpemVkID0gZnVuY3Rpb24oY2VsbHMpCit7CisJaWYgKGNlbGxzICE9IG51bGwpCisJeworCQl2YXIgbW9kZWwgPSB0aGlzLmdldEdyYXBoKCkuZ2V0TW9kZWwoKTsKKwkJCisJCW1vZGVsLmJlZ2luVXBkYXRlKCk7CisJCXRyeQorCQl7CisJCQkvLyBGaW5kcyB0aGUgdG9wLWxldmVsIHN3aW1sYW5lcyBhbmQgYWRkcyBvZmZzZXRzCisJCQlmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKQorCQkJeworCQkJCWlmICghdGhpcy5pc1N3aW1sYW5lSWdub3JlZChjZWxsc1tpXSkpCisJCQkJeworCQkJCQl2YXIgZ2VvID0gbW9kZWwuZ2V0R2VvbWV0cnkoY2VsbHNbaV0pOworCisJCQkJCWlmIChnZW8gIT0gbnVsbCkKKwkJCQkJeworCQkJCQkJdmFyIHNpemUgPSBuZXcgbXhSZWN0YW5nbGUoMCwgMCwgZ2VvLndpZHRoLCBnZW8uaGVpZ2h0KTsKKwkJCQkJCXZhciB0b3AgPSBjZWxsc1tpXTsKKwkJCQkJCXZhciBjdXJyZW50ID0gdG9wOworCQkJCQkJCisJCQkJCQl3aGlsZSAoY3VycmVudCAhPSBudWxsKQorCQkJCQkJeworCQkJCQkJCXRvcCA9IGN1cnJlbnQ7CisJCQkJCQkJY3VycmVudCA9IG1vZGVsLmdldFBhcmVudChjdXJyZW50KTsKKwkJCQkJCQl2YXIgdG1wID0gKHRoaXMuZ3JhcGguaXNTd2ltbGFuZShjdXJyZW50KSkgPworCQkJCQkJCQkJdGhpcy5ncmFwaC5nZXRTdGFydFNpemUoY3VycmVudCkgOgorCQkJCQkJCQkJbmV3IG14UmVjdGFuZ2xlKCk7CisJCQkJCQkJc2l6ZS53aWR0aCArPSB0bXAud2lkdGg7CisJCQkJCQkJc2l6ZS5oZWlnaHQgKz0gdG1wLmhlaWdodDsKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJdmFyIHBhcmVudEhvcml6b250YWwgPSAoY3VycmVudCAhPSBudWxsKSA/IHRoaXMuaXNDZWxsSG9yaXpvbnRhbChjdXJyZW50KSA6IHRoaXMuaG9yaXpvbnRhbDsKKwkJCQkJCXRoaXMucmVzaXplU3dpbWxhbmUodG9wLCBzaXplLndpZHRoLCBzaXplLmhlaWdodCwgcGFyZW50SG9yaXpvbnRhbCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZmluYWxseQorCQl7CisJCQltb2RlbC5lbmRVcGRhdGUoKTsKKwkJfQorCX0KK307CisKKy8qKgorICogRnVuY3Rpb246IHJlc2l6ZVN3aW1sYW5lCisgKiAKKyAqIENhbGxlZCBmcm9tIDxjZWxsc1Jlc2l6ZWQ+IGZvciBhbGwgc3dpbWxhbmVzIHRoYXQgYXJlIG5vdCBpZ25vcmVkIHRvIHVwZGF0ZQorICogdGhlIHNpemUgb2YgdGhlIHNpYmxpbmdzIGFuZCB0aGUgc2l6ZSBvZiB0aGUgcGFyZW50IHN3aW1sYW5lcywgcmVjdXJzaXZlbHksCisgKiBpZiA8YnViYmxpbmc+IGlzIHRydWUuCisgKiAKKyAqIFBhcmFtZXRlcnM6CisgKiAKKyAqIHN3aW1sYW5lIC0gPG14Q2VsbD4gd2hvc2Ugc2l6ZSBoYXMgY2hhbmdlZC4KKyAqLworbXhTd2ltbGFuZU1hbmFnZXIucHJvdG90eXBlLnJlc2l6ZVN3aW1sYW5lID0gZnVuY3Rpb24oc3dpbWxhbmUsIHcsIGgsIHBhcmVudEhvcml6b250YWwpCit7CisJdmFyIG1vZGVsID0gdGhpcy5nZXRHcmFwaCgpLmdldE1vZGVsKCk7CisJCisJbW9kZWwuYmVnaW5VcGRhdGUoKTsKKwl0cnkKKwl7CisJCXZhciBob3Jpem9udGFsID0gdGhpcy5pc0NlbGxIb3Jpem9udGFsKHN3aW1sYW5lKTsKKwkJCisJCWlmICghdGhpcy5pc1N3aW1sYW5lSWdub3JlZChzd2ltbGFuZSkpCisJCXsKKwkJCXZhciBnZW8gPSBtb2RlbC5nZXRHZW9tZXRyeShzd2ltbGFuZSk7CisJCQkKKwkJCWlmIChnZW8gIT0gbnVsbCkKKwkJCXsKKwkJCQlpZiAoKHBhcmVudEhvcml6b250YWwgJiYgZ2VvLmhlaWdodCAhPSBoKSB8fCAoIXBhcmVudEhvcml6b250YWwgJiYgZ2VvLndpZHRoICE9IHcpKQorCQkJCXsKKwkJCQkJZ2VvID0gZ2VvLmNsb25lKCk7CisJCQkJCQorCQkJCQlpZiAocGFyZW50SG9yaXpvbnRhbCkKKwkJCQkJeworCQkJCQkJZ2VvLmhlaWdodCA9IGg7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlnZW8ud2lkdGggPSB3OworCQkJCQl9CisKKwkJCQkJbW9kZWwuc2V0R2VvbWV0cnkoc3dpbWxhbmUsIGdlbyk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJdmFyIHRtcCA9ICh0aGlzLmdyYXBoLmlzU3dpbWxhbmUoc3dpbWxhbmUpKSA/CisJCQkJdGhpcy5ncmFwaC5nZXRTdGFydFNpemUoc3dpbWxhbmUpIDoKKwkJCQluZXcgbXhSZWN0YW5nbGUoKTsKKwkJdyAtPSB0bXAud2lkdGg7CisJCWggLT0gdG1wLmhlaWdodDsKKwkJCisJCXZhciBjaGlsZENvdW50ID0gbW9kZWwuZ2V0Q2hpbGRDb3VudChzd2ltbGFuZSk7CisJCQorCQlmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykKKwkJeworCQkJdmFyIGNoaWxkID0gbW9kZWwuZ2V0Q2hpbGRBdChzd2ltbGFuZSwgaSk7CisJCQl0aGlzLnJlc2l6ZVN3aW1sYW5lKGNoaWxkLCB3LCBoLCBob3Jpem9udGFsKTsKKwkJfQorCX0KKwlmaW5hbGx5CisJeworCQltb2RlbC5lbmRVcGRhdGUoKTsKKwl9Cit9OworCisvKioKKyAqIEZ1bmN0aW9uOiBkZXN0cm95CisgKiAKKyAqIFJlbW92ZXMgYWxsIGhhbmRsZXJzIGZyb20gdGhlIDxncmFwaD4gYW5kIGRlbGV0ZXMgdGhlIHJlZmVyZW5jZSB0byBpdC4KKyAqLworbXhTd2ltbGFuZU1hbmFnZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpCit7CisJdGhpcy5zZXRHcmFwaChudWxsKTsKK307CmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teFRlbXBvcmFyeUNlbGxTdGF0ZXMuanMgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvanMvdmlldy9teFRlbXBvcmFyeUNlbGxTdGF0ZXMuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRiYmZkZAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9qcy92aWV3L214VGVtcG9yYXJ5Q2VsbFN0YXRlcy5qcwpAQCAtMCwwICsxLDEwOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNSwgSkdyYXBoIEx0ZAorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTUsIEdhdWRlbnogQWxkZXIKKyAqLworLyoqCisgKiBDbGFzczogbXhUZW1wb3JhcnlDZWxsU3RhdGVzCisgKgorICogRXh0ZW5kcyA8bXhQb2ludD4gdG8gaW1wbGVtZW50IGEgMi1kaW1lbnNpb25hbCByZWN0YW5nbGUgd2l0aCBkb3VibGUKKyAqIHByZWNpc2lvbiBjb29yZGluYXRlcy4KKyAqIAorICogQ29uc3RydWN0b3I6IG14UmVjdGFuZ2xlCisgKgorICogQ29uc3RydWN0cyBhIG5ldyByZWN0YW5nbGUgZm9yIHRoZSBvcHRpb25hbCBwYXJhbWV0ZXJzLiBJZiBubyBwYXJhbWV0ZXJzCisgKiBhcmUgZ2l2ZW4gdGhlbiB0aGUgcmVzcGVjdGl2ZSBkZWZhdWx0IHZhbHVlcyBhcmUgdXNlZC4KKyAqLworZnVuY3Rpb24gbXhUZW1wb3JhcnlDZWxsU3RhdGVzKHZpZXcsIHNjYWxlLCBjZWxscywgaXNDZWxsVmlzaWJsZUZuKQoreworCXNjYWxlID0gKHNjYWxlICE9IG51bGwpID8gc2NhbGUgOiAxOworCXRoaXMudmlldyA9IHZpZXc7CisJCisJLy8gU3RvcmVzIHRoZSBwcmV2aW91cyBzdGF0ZQorCXRoaXMub2xkVmFsaWRhdGVDZWxsU3RhdGUgPSB2aWV3LnZhbGlkYXRlQ2VsbFN0YXRlOworCXRoaXMub2xkQm91bmRzID0gdmlldy5nZXRHcmFwaEJvdW5kcygpOworCXRoaXMub2xkU3RhdGVzID0gdmlldy5nZXRTdGF0ZXMoKTsKKwl0aGlzLm9sZFNjYWxlID0gdmlldy5nZXRTY2FsZSgpOworCQorCS8vIE92ZXJyaWRlcyB2YWxpZGF0ZUNlbGxTdGF0ZSB0byBpZ25vcmUgaW52aXNpYmxlIGNlbGxzCisJdmFyIHNlbGYgPSB0aGlzOworCQorCXZpZXcudmFsaWRhdGVDZWxsU3RhdGUgPSBmdW5jdGlvbihjZWxsLCByZXN1cnNlKQorCXsKKwkJaWYgKGNlbGwgPT0gbnVsbCB8fCBpc0NlbGxWaXNpYmxlRm4gPT0gbnVsbCB8fCBpc0NlbGxWaXNpYmxlRm4oY2VsbCkpCisJCXsKKwkJCXJldHVybiBzZWxmLm9sZFZhbGlkYXRlQ2VsbFN0YXRlLmFwcGx5KHZpZXcsIGFyZ3VtZW50cyk7CisJCX0KKwkJCisJCXJldHVybiBudWxsOworCX07CisJCisJLy8gQ3JlYXRlcyBzcGFjZSBmb3IgbmV3IHN0YXRlcworCXZpZXcuc2V0U3RhdGVzKG5ldyBteERpY3Rpb25hcnkoKSk7CisJdmlldy5zZXRTY2FsZShzY2FsZSk7CisJCisJaWYgKGNlbGxzICE9IG51bGwpCisJeworCQl2aWV3LnJlc2V0VmFsaWRhdGlvblN0YXRlKCk7CisJCXZhciBiYm94ID0gbnVsbDsKKworCQkvLyBWYWxpZGF0ZXMgdGhlIHZlcnRpY2VzIGFuZCBlZGdlcyB3aXRob3V0IGFkZGluZyB0aGVtIHRvCisJCS8vIHRoZSBtb2RlbCBzbyB0aGF0IHRoZSBvcmlnaW5hbCBjZWxscyBhcmUgbm90IG1vZGlmaWVkCisJCWZvciAodmFyIGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspCisJCXsKKwkJCXZhciBib3VuZHMgPSB2aWV3LmdldEJvdW5kaW5nQm94KHZpZXcudmFsaWRhdGVDZWxsU3RhdGUodmlldy52YWxpZGF0ZUNlbGwoY2VsbHNbaV0pKSk7CisJCQkKKwkJCWlmIChiYm94ID09IG51bGwpCisJCQl7CisJCQkJYmJveCA9IGJvdW5kczsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQliYm94LmFkZChib3VuZHMpOworCQkJfQorCQl9CisKKwkJdmlldy5zZXRHcmFwaEJvdW5kcyhiYm94IHx8IG5ldyBteFJlY3RhbmdsZSgpKTsKKwl9Cit9OworCisvKioKKyAqIFZhcmlhYmxlOiB2aWV3CisgKgorICogSG9sZHMgdGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUuIERlZmF1bHQgaXMgMC4KKyAqLworbXhUZW1wb3JhcnlDZWxsU3RhdGVzLnByb3RvdHlwZS52aWV3ID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogb2xkU3RhdGVzCisgKgorICogSG9sZHMgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLiBEZWZhdWx0IGlzIDAuCisgKi8KK214VGVtcG9yYXJ5Q2VsbFN0YXRlcy5wcm90b3R5cGUub2xkU3RhdGVzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogb2xkQm91bmRzCisgKgorICogSG9sZHMgdGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLiBEZWZhdWx0IGlzIDAuCisgKi8KK214VGVtcG9yYXJ5Q2VsbFN0YXRlcy5wcm90b3R5cGUub2xkQm91bmRzID0gbnVsbDsKKworLyoqCisgKiBWYXJpYWJsZTogb2xkU2NhbGUKKyAqCisgKiBIb2xkcyB0aGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuIERlZmF1bHQgaXMgMC4KKyAqLworbXhUZW1wb3JhcnlDZWxsU3RhdGVzLnByb3RvdHlwZS5vbGRTY2FsZSA9IG51bGw7CisKKy8qKgorICogRnVuY3Rpb246IGRlc3Ryb3kKKyAqIAorICogUmV0dXJucyB0aGUgdG9wLCBsZWZ0IGNvcm5lciBhcyBhIG5ldyA8bXhQb2ludD4uCisgKi8KK214VGVtcG9yYXJ5Q2VsbFN0YXRlcy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkKK3sKKwl0aGlzLnZpZXcuc2V0U2NhbGUodGhpcy5vbGRTY2FsZSk7CisJdGhpcy52aWV3LnNldFN0YXRlcyh0aGlzLm9sZFN0YXRlcyk7CisJdGhpcy52aWV3LnNldEdyYXBoQm91bmRzKHRoaXMub2xkQm91bmRzKTsKKwl0aGlzLnZpZXcudmFsaWRhdGVDZWxsU3RhdGUgPSB0aGlzLm9sZFZhbGlkYXRlQ2VsbFN0YXRlOworfTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9yZXNvdXJjZXMvZWRpdG9yLnR4dCBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9yZXNvdXJjZXMvZWRpdG9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2U4NzEyCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL3Jlc291cmNlcy9lZGl0b3IudHh0CkBAIC0wLDAgKzEsNSBAQAorYXNrWm9vbT1FbnRlciB6b29tICglKQorcHJvcGVydGllcz1Qcm9wZXJ0aWVzCitvdXRsaW5lPU91dGxpbmUKK3Rhc2tzPVRhc2tzCitoZWxwPUhlbHAKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9yZXNvdXJjZXMvZWRpdG9yX2RlLnR4dCBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9yZXNvdXJjZXMvZWRpdG9yX2RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDJmMzg3Ci0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL3Jlc291cmNlcy9lZGl0b3JfZGUudHh0CkBAIC0wLDAgKzEsNSBAQAorYXNrWm9vbT1ab29tIGVpbmdlYmVuICglKQorcHJvcGVydGllcz1FaWdlbnNjaGFmdGVuCitvdXRsaW5lPVVlYmVyc2ljaHQKK3Rhc2tzPUF1ZmdhYmVuCitoZWxwPUhpbGZlCmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvcmVzb3VyY2VzL2VkaXRvcl96aC50eHQgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvcmVzb3VyY2VzL2VkaXRvcl96aC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3ODQ4YgotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9yZXNvdXJjZXMvZWRpdG9yX3poLnR4dApAQCAtMCwwICsxLDUgQEAKK2Fza1pvb2096L+b5YWl57yp5pS+KCUyNSkKK3Byb3BlcnRpZXM95bGe5oCnCitvdXRsaW5lPei9ruW7kwordGFza3M95Lu75YqhCitoZWxwPeW4ruWKqQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9yZXNvdXJjZXMvZ3JhcGgudHh0IGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL3Jlc291cmNlcy9ncmFwaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmNjFmOAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9yZXNvdXJjZXMvZ3JhcGgudHh0CkBAIC0wLDAgKzEsMTEgQEAKK2FscmVhZHlDb25uZWN0ZWQ9Tm9kZXMgYWxyZWFkeSBjb25uZWN0ZWQKK2NvbnRhaW5zVmFsaWRhdGlvbkVycm9ycz1Db250YWlucyB2YWxpZGF0aW9uIGVycm9ycwordXBkYXRpbmdEb2N1bWVudD1VcGRhdGluZyBEb2N1bWVudC4gUGxlYXNlIHdhaXQuLi4KK3VwZGF0aW5nU2VsZWN0aW9uPVVwZGF0aW5nIFNlbGVjdGlvbi4gUGxlYXNlIHdhaXQuLi4KK2NvbGxhcHNlLWV4cGFuZD1Db2xsYXBzZS9FeHBhbmQKK2RvdWJsZUNsaWNrT3JpZW50YXRpb249RG91YmxlY2xpY2sgdG8gY2hhbmdlIG9yaWVudGF0aW9uCitjbG9zZT1DbG9zZQorZXJyb3I9RXJyb3IKK2RvbmU9RG9uZQorY2FuY2VsPUNhbmNlbAorb2s9T0sKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9yZXNvdXJjZXMvZ3JhcGhfZGUudHh0IGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL3Jlc291cmNlcy9ncmFwaF9kZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5OTkzNAotLS0gL2Rldi9udWxsCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2Fzc2V0cy9yZXNvdXJjZXMvZ3JhcGhfZGUudHh0CkBAIC0wLDAgKzEsMTEgQEAKK2FscmVhZHlDb25uZWN0ZWQ9S25vdGVuIHNjaG9uIHZlcmJ1bmRlbgorY29udGFpbnNWYWxpZGF0aW9uRXJyb3JzPUVudGjDpGx0IFZhbGlkaWVydW5nc2ZlaGxlcgordXBkYXRpbmdEb2N1bWVudD1Ba3R1YWxpc2llcmUgRG9rdW1lbnQuIEJpdHRlIHdhcnRlbi4uLgordXBkYXRpbmdTZWxlY3Rpb249QWt0dWFsaXNpZXJlIE1hcmtpZXJ1bmcuIEJpdHRlIHdhcnRlbi4uLgorY29sbGFwc2UtZXhwYW5kPUVpbmtsYXBwZW4vQXVza2xhcHBlbgorZG91YmxlQ2xpY2tPcmllbnRhdGlvbj1Eb3BwZWxrbGlja2VuIHVtIE9yaWVudGllcnVuZyB6dSDDpG5kZXJuCitjbG9zZT1TY2hsaWVzc2VuCitlcnJvcj1GZWhsZXIKK2RvbmU9RmVydGlnCitjYW5jZWw9QWJicmVjaGVuCitvaz1PSwpkaWZmIC0tZ2l0IGEvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL3Jlc291cmNlcy9ncmFwaF96aC50eHQgYi9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9hc3NldHMvcmVzb3VyY2VzL2dyYXBoX3poLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTU4NTkzCi0tLSAvZGV2L251bGwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvYXNzZXRzL3Jlc291cmNlcy9ncmFwaF96aC50eHQKQEAgLTAsMCArMSwxMSBAQAorYWxyZWFkeUNvbm5lY3RlZD3oioLngrnlt7Lnu4/ov57mjqUKK2NvbnRhaW5zVmFsaWRhdGlvbkVycm9ycz3ljIXlkKvmlYjpqozplJnor68KK3VwZGF0aW5nRG9jdW1lbnQ95pu05paw5paH5qGj44CC6K+3562J5YCZLi4uLi4uCit1cGRhdGluZ1NlbGVjdGlvbj3mm7TmlrDmiYDpgInpobnjgILor7fnrYnlgJkuLi4uLi4KK2NvbGxhcHNlLWV4cGFuZD3mipjlj6Av5bGV5byACitkb3VibGVDbGlja09yaWVudGF0aW9uPeWPjOWHu+S7peaUueWPmOaWueWQkQorY2xvc2U95YWz6ZetCitlcnJvcj3plJnor68KK2RvbmU95a6M5oiQCitjYW5jZWw95Y+W5raICitvaz3noa7lrpoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9pbmRleC5odG1sIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93ZWItY29uc29sZS9zcmMvaW5kZXguaHRtbAppbmRleCA0ZTg1NzQ0Li45MzFlZGI4IDEwMDY0NAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dlYi1jb25zb2xlL3NyYy9pbmRleC5odG1sCisrKyBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd2ViLWNvbnNvbGUvc3JjL2luZGV4Lmh0bWwKQEAgLTksNiArOSwxMiBAQAogICA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iZmF2aWNvbi5pY28iPgogICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzQuMC4wLWJldGEuMi9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiIGludGVncml0eT0ic2hhMzg0LVBzSDhSNzJKUTNTT2RoVmkzdXhmdG1hVzZWYzUxTUtiMHE1UDJyUlVwUHZyc3p1RTRXMXBvdkhZZ1RwQmZzaGIiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPgogCisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBteEJhc2VQYXRoID0gJ2Fzc2V0cyc7CisgIDwvc2NyaXB0PgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJhc3NldHMvanMvbXhDbGllbnQuanMiPjwvc2NyaXB0PgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJhc3NldHMvanMvY29tcG9uZW50cy5qcyI+PC9zY3JpcHQ+CisKIDwvaGVhZD4KIDxib2R5PgogICA8YXBwLXJvb3Q+PC9hcHAtcm9vdD4KZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd29ya2Zsb3ctY29tcG9zZXIvaW5kZXguaHRtbCBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd29ya2Zsb3ctY29tcG9zZXIvaW5kZXguaHRtbAppbmRleCA3ZGI4MWNhLi40ZDdmMjYxIDEwMDY0NAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dvcmtmbG93LWNvbXBvc2VyL2luZGV4Lmh0bWwKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93b3JrZmxvdy1jb21wb3Nlci9pbmRleC5odG1sCkBAIC0zMDIsNyArMzAyLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdjEgPSBncmFwaC5pbnNlcnRWZXJ0ZXgocGFyZW50LCBudWxsLCBwcm90b3R5cGUsIHgsIHksIDgwLCA2MCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2MSA9IGdyYXBoLmluc2VydFZlcnRleChwYXJlbnQsIG51bGwsIHByb3RvdHlwZS5jbG9uZU5vZGUodHJ1ZSksIHgsIHksIDgwLCA2MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB2MS5zZXRDb25uZWN0YWJsZShmYWxzZSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dHMgPSBbXTsKZGlmZiAtLWdpdCBhL2FpcmF2YXRhLWt1YmVybmV0ZXMvd29ya2Zsb3ctY29tcG9zZXIvc3JjL2pzL2luZGV4LnR4dCBiL2FpcmF2YXRhLWt1YmVybmV0ZXMvd29ya2Zsb3ctY29tcG9zZXIvc3JjL2pzL2luZGV4LnR4dAppbmRleCBmMzYzMWQ2Li44ZmFhOGNiIDEwMDY0NAotLS0gYS9haXJhdmF0YS1rdWJlcm5ldGVzL3dvcmtmbG93LWNvbXBvc2VyL3NyYy9qcy9pbmRleC50eHQKKysrIGIvYWlyYXZhdGEta3ViZXJuZXRlcy93b3JrZmxvdy1jb21wb3Nlci9zcmMvanMvaW5kZXgudHh0CkBAIC0yMDUsNyArMjA1LDcgQEAKICAgdGhlIHN1cGVyY2xhc3MgYnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgdG8gYW4gaW5zdGFuY2Ugb2YgdGhlIHN1cGVyY2xhc3MsCiAgIGVnLiBteEVkaXRvci5wcm90b3R5cGUgPSBuZXcgbXhFdmVudFNvdXJjZSgpIGFuZCByZWRlZmluaW5nIHRoZSBjb25zdHJ1Y3RvcgogICBmaWVsZCB1c2luZyBteEVkaXRvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBteEVkaXRvci4gVGhlIGxhdHRlciBydWxlIGlzCi0gIGFwcGxpZWQgc28gdGhhdCB0aGUgdHlwZSBvZiBhbiBvYmplY3QgY2FuIGJlIHJldHJpZXZlZCB2aWEgdGhlIG5hbWUgb2YgaXSScworICBhcHBsaWVkIHNvIHRoYXQgdGhlIHR5cGUgb2YgYW4gb2JqZWN0IGNhbiBiZSByZXRyaWV2ZWQgdmlhIHRoZSBuYW1lIG9mIGl077+9cwogICBjb25zdHJ1Y3RvciB1c2luZyBteFV0aWxzLmdldEZ1bmN0aW9uTmFtZShvYmouY29uc3RydWN0b3IpLgogCiBDb25zdHJ1Y3RvcjoKQEAgLTI2MCw3ICsyNjAsNyBAQAogICBmdW5jdGlvbiBvbiB0aGUgaXNTZWxlY3RhYmxlIGZ1bmN0aW9uIG9iamVjdCBvZiB0aGUgbXhHcmFwaCBwcm90b3R5cGUsIHVzaW5nCiAgIHRoZSBzcGVjaWFsIHRoaXMgYW5kIGFyZ3VtZW50cyB2YXJpYWJsZXMgYXMgcGFyYW1ldGVycy4gQ2FsbHMgdG8gdGhlCiAgIHN1cGVyY2xhc3MgZnVuY3Rpb24gYXJlIG9ubHkgcG9zc2libGUgaWYgdGhlIGZ1bmN0aW9uIGlzIG5vdCByZXBsYWNlZCBpbiB0aGUKLSAgc3VwZXJjbGFzcyBhcyBmb2xsb3dzLCB3aGljaCBpcyBhbm90aGVyIHdheSBvZiCTc3ViY2xhc3NpbmeUIGluIEphdmFTY3JpcHQuCisgIHN1cGVyY2xhc3MgYXMgZm9sbG93cywgd2hpY2ggaXMgYW5vdGhlciB3YXkgb2Yg77+9c3ViY2xhc3Npbmfvv70gaW4gSmF2YVNjcmlwdC4KIAogICAoY29kZSkKICAgbXhHcmFwaC5wcm90b3R5cGUuaXNDZWxsU2VsZWN0YWJsZSA9IGZ1bmN0aW9uKGNlbGwpCkBAIC0yNzUsNyArMjc1LDcgQEAKICAgVGhlIGFib3ZlIHNjaGVtZSBpcyB1c2VmdWwgaWYgYSBmdW5jdGlvbiBkZWZpbml0aW9uIG5lZWRzIHRvIGJlIHJlcGxhY2VkCiAgIGNvbXBsZXRlbHkuCiAgIAotICBJbiBvcmRlciB0byBhZGQgbmV3IGZ1bmN0aW9ucyBhbmQgZmllbGRzIHRvIHRoZSBzdWJjbGFzcywgdGhlIGZvbGxvd2luZyBjb2RlCisgIEluIHJlZmVyZW5jZUlkIHRvIGFkZCBuZXcgZnVuY3Rpb25zIGFuZCBmaWVsZHMgdG8gdGhlIHN1YmNsYXNzLCB0aGUgZm9sbG93aW5nIGNvZGUKICAgaXMgdXNlZC4gVGhlIGV4YW1wbGUgYmVsb3cgYWRkcyBhIG5ldyBmdW5jdGlvbiB0byByZXR1cm4gdGhlIFhNTAogICByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ3JhcGggbW9kZWw6CiAK