LyoKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICBJQk0gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoKICogJElkOiBQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kLmphdmEsdiAxLjcgMjAwNS8xMS8wNCAyMjoyMzowNCBraHVzc2V5IEV4cCAkCiAqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLnVtbDI7CgppbXBvcnQgamF2YS51dGlsLkFycmF5czsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwoKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7CgovKioKICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+UGFyYW1ldGVyIERpcmVjdGlvbiBLaW5kPC9iPjwvZW0+JywKICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCiAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICogUGFyYW1ldGVyRGlyZWN0aW9uS2luZCBpcyBhbiBlbnVtZXJhdGlvbiBvZiB0aGUgZm9sbG93aW5nIGxpdGVyYWwgdmFsdWVzOiCVIGluIEluZGljYXRlcyB0aGF0IHBhcmFtZXRlciB2YWx1ZXMgYXJlIHBhc3NlZCBpbnRvIHRoZSBiZWhhdmlvcmFsIGVsZW1lbnQgYnkgdGhlIGNhbGxlci4glSBpbm91dCBJbmRpY2F0ZXMgdGhhdCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBwYXNzZWQgaW50byBhIGJlaGF2aW9yYWwgZWxlbWVudCBieSB0aGUgY2FsbGVyIGFuZCB0aGVuIGJhY2sgb3V0IHRvIHRoZSBjYWxsZXIgZnJvbSB0aGUgYmVoYXZpb3JhbCBlbGVtZW50LiCVIG91dCBJbmRpY2F0ZXMgdGhhdCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBwYXNzZWQgZnJvbSBhIGJlaGF2aW9yYWwgZWxlbWVudCBvdXQgdG8gdGhlIGNhbGxlci4glSByZXR1cm4gSW5kaWNhdGVzIHRoYXQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgcGFzc2VkIGFzIHJldHVybiB2YWx1ZXMgZnJvbSBhIGJlaGF2aW9yYWwgZWxlbWVudCBiYWNrIHRvIHRoZSBjYWxsZXIuIAogKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAqIEBzZWUgb3JnLmVjbGlwc2UudW1sMi5VTUwyUGFja2FnZSNnZXRQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kKCkKICogQG1vZGVsCiAqIEBnZW5lcmF0ZWQKICovCnB1YmxpYyBmaW5hbCBjbGFzcyBQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKCS8qKgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQGdlbmVyYXRlZAoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4iOyAvLyROT04tTkxTLTEkCgoJLyoqCgkgKiBUaGUgJzxlbT48Yj5JbjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBzZWUgI0lOX0xJVEVSQUwKCSAqIEBtb2RlbCBuYW1lPSJpbiIKCSAqIEBnZW5lcmF0ZWQKCSAqIEBvcmRlcmVkCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOID0gMDsKCgkvKioKCSAqIFRoZSAnPGVtPjxiPklub3V0PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQHNlZSAjSU5PVVRfTElURVJBTAoJICogQG1vZGVsIG5hbWU9Imlub3V0IgoJICogQGdlbmVyYXRlZAoJICogQG9yZGVyZWQKCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5PVVQgPSAxOwoKCS8qKgoJICogVGhlICc8ZW0+PGI+T3V0PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQHNlZSAjT1VUX0xJVEVSQUwKCSAqIEBtb2RlbCBuYW1lPSJvdXQiCgkgKiBAZ2VuZXJhdGVkCgkgKiBAb3JkZXJlZAoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVQgPSAyOwoKCS8qKgoJICogVGhlICc8ZW0+PGI+UmV0dXJuPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQHNlZSAjUkVUVVJOX0xJVEVSQUwKCSAqIEBtb2RlbCBuYW1lPSJyZXR1cm4iCgkgKiBAZ2VuZXJhdGVkCgkgKiBAb3JkZXJlZAoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVRVUk4gPSAzOwoKCS8qKgoJICogVGhlICc8ZW0+PGI+SW48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDxwPgoJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCgkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCgkgKiA8L3A+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBzZWUgI0lOCgkgKiBAZ2VuZXJhdGVkCgkgKiBAb3JkZXJlZAoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmFtZXRlckRpcmVjdGlvbktpbmQgSU5fTElURVJBTCA9IG5ldyBQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kKElOLCAiaW4iLCAiaW4iKTsgLy8kTk9OLU5MUy0xJAoKCS8qKgoJICogVGhlICc8ZW0+PGI+SW5vdXQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDxwPgoJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Jbm91dDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCgkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCgkgKiA8L3A+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBzZWUgI0lOT1VUCgkgKiBAZ2VuZXJhdGVkCgkgKiBAb3JkZXJlZAoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmFtZXRlckRpcmVjdGlvbktpbmQgSU5PVVRfTElURVJBTCA9IG5ldyBQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kKElOT1VULCAiaW5vdXQiLCAiaW5vdXQiKTsgLy8kTk9OLU5MUy0xJAoKCS8qKgoJICogVGhlICc8ZW0+PGI+T3V0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8cD4KCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T3V0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KCSAqIDwvcD4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQHNlZSAjT1VUCgkgKiBAZ2VuZXJhdGVkCgkgKiBAb3JkZXJlZAoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmFtZXRlckRpcmVjdGlvbktpbmQgT1VUX0xJVEVSQUwgPSBuZXcgUGFyYW1ldGVyRGlyZWN0aW9uS2luZChPVVQsICJvdXQiLCAib3V0Iik7IC8vJE5PTi1OTFMtMSQKCgkvKioKCSAqIFRoZSAnPGVtPjxiPlJldHVybjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPHA+CgkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJldHVybjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCgkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCgkgKiA8L3A+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBzZWUgI1JFVFVSTgoJICogQGdlbmVyYXRlZAoJICogQG9yZGVyZWQKCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kIFJFVFVSTl9MSVRFUkFMID0gbmV3IFBhcmFtZXRlckRpcmVjdGlvbktpbmQoUkVUVVJOLCAicmV0dXJuIiwgInJldHVybiIpOyAvLyROT04tTkxTLTEkCgoJLyoqCgkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+UGFyYW1ldGVyIERpcmVjdGlvbiBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFyYW1ldGVyRGlyZWN0aW9uS2luZFtdIFZBTFVFU19BUlJBWSA9CgkJbmV3IFBhcmFtZXRlckRpcmVjdGlvbktpbmRbXSB7CgkJCUlOX0xJVEVSQUwsCgkJCUlOT1VUX0xJVEVSQUwsCgkJCU9VVF9MSVRFUkFMLAoJCQlSRVRVUk5fTElURVJBTCwKCQl9OwoKCS8qKgoJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlBhcmFtZXRlciBEaXJlY3Rpb24gS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlBhcmFtZXRlciBEaXJlY3Rpb24gS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHVibGljIHN0YXRpYyBQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kIGdldChTdHJpbmcgbGl0ZXJhbCkgewoJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CgkJCVBhcmFtZXRlckRpcmVjdGlvbktpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwoJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CgkJCQlyZXR1cm4gcmVzdWx0OwoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgJzxlbT48Yj5QYXJhbWV0ZXIgRGlyZWN0aW9uIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXB1YmxpYyBzdGF0aWMgUGFyYW1ldGVyRGlyZWN0aW9uS2luZCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewoJCQlQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CgkJCQlyZXR1cm4gcmVzdWx0OwoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgJzxlbT48Yj5QYXJhbWV0ZXIgRGlyZWN0aW9uIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXB1YmxpYyBzdGF0aWMgUGFyYW1ldGVyRGlyZWN0aW9uS2luZCBnZXQoaW50IHZhbHVlKSB7CgkJc3dpdGNoICh2YWx1ZSkgewoJCQljYXNlIElOOiByZXR1cm4gSU5fTElURVJBTDsKCQkJY2FzZSBJTk9VVDogcmV0dXJuIElOT1VUX0xJVEVSQUw7CgkJCWNhc2UgT1VUOiByZXR1cm4gT1VUX0xJVEVSQUw7CgkJCWNhc2UgUkVUVVJOOiByZXR1cm4gUkVUVVJOX0xJVEVSQUw7CgkJfQoJCXJldHVybiBudWxsOwkKCX0KCgkvKioKCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBnZW5lcmF0ZWQKCSAqLwoJcHJpdmF0ZSBQYXJhbWV0ZXJEaXJlY3Rpb25LaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CgkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwoJfQoKfSAvL1BhcmFtZXRlckRpcmVjdGlvbktpbmQK