ZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCmluZGV4IGQ3MzFkNGEuLjAwMzlkNmIgMTAwNjQ0Ci0tLSBhL3BvbS54bWwKKysrIGIvcG9tLnhtbApAQCAtMzMsNyArMzMsNyBAQAogICAgIDxhcnRpZmFjdElkPmdlcm9uaW1vLWpwYV8yLjBfc3BlYzwvYXJ0aWZhY3RJZD4KICAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgogICAgIDxuYW1lPkpQQSAyLjA8L25hbWU+Ci0gICAgPHZlcnNpb24+MS4wLUVBLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjEuMC1FQS0xPC92ZXJzaW9uPgogCiAgICAgPHVybD5odHRwOi8vZ2Vyb25pbW8uYXBhY2hlLm9yZy9tYXZlbi8ke3NpdGVJZH0vJHt2ZXJzaW9ufTwvdXJsPgogICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgpAQCAtNTEsOSArNTEsOSBAQAogICAgIDwvcHJvcGVydGllcz4KIAogICAgIDxzY20+Ci0gICAgICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9nZXJvbmltby9zcGVjcy90cnVuay9nZXJvbmltby1qcGFfMi4wX3NwZWMvPC9jb25uZWN0aW9uPgotICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2dlcm9uaW1vL3NwZWNzL3RydW5rL2dlcm9uaW1vLWpwYV8yLjBfc3BlYy88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXdjdnMuY2dpL2dlcm9uaW1vL3NwZWNzL3RydW5rL2dlcm9uaW1vLWpwYV8yLjBfc3BlYy88L3VybD4KKyAgICAgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2dlcm9uaW1vL3NwZWNzL3RhZ3MvZ2Vyb25pbW8tanBhXzIuMF9zcGVjLTEuMC1FQS0xPC9jb25uZWN0aW9uPgorICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2dlcm9uaW1vL3NwZWNzL3RhZ3MvZ2Vyb25pbW8tanBhXzIuMF9zcGVjLTEuMC1FQS0xPC9kZXZlbG9wZXJDb25uZWN0aW9uPgorICAgICAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9nZXJvbmltby9zcGVjcy90YWdzL2dlcm9uaW1vLWpwYV8yLjBfc3BlYy0xLjAtRUEtMTwvdXJsPgogICAgIDwvc2NtPgogCiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL0FnZ3JlZ2F0ZS5qYXZhIGIvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9BZ2dyZWdhdGUuamF2YQppbmRleCBmYWQwNjQzLi4wNDE5NTZiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL0FnZ3JlZ2F0ZS5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvQWdncmVnYXRlLmphdmEKQEAgLTI0LDEzICsyNCw2IEBACiAvLwogcGFja2FnZSBqYXZheC5wZXJzaXN0ZW5jZTsKIAotLyoqCi0gKiBUeXBlIG9mIHRoZSByZXN1bHQgb2YgYW4gYWdncmVnYXRlIG9wZXJhdGlvbgotICovCiBwdWJsaWMgaW50ZXJmYWNlIEFnZ3JlZ2F0ZSBleHRlbmRzIEV4cHJlc3Npb24gewotICAgIC8qKgotICAgICAqIFNwZWNpZnkgdGhhdCBkdXBsaWNhdGVzIGFyZSB0byBiZSByZW1vdmVkIGJlZm9yZSB0aGUgYWdncmVnYXRlIG9wZXJhdGlvbgotICAgICAqIGlzIGludm9rZWQuCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBkaXN0aW5jdCgpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9DYWNoZS5qYXZhIGIvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9DYWNoZS5qYXZhCmluZGV4IDA3MDE2NTQuLmFiZWZhYzYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvQ2FjaGUuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL0NhY2hlLmphdmEKQEAgLTI0LDMwICsyNCwxMiBAQAogLy8KIHBhY2thZ2UgamF2YXgucGVyc2lzdGVuY2U7CiAKLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgc2Vjb25kLWxldmVsIGNhY2hlLgotICogSWYgYSBjYWNoZSBpcyBub3QgaW4gdXNlLCB0aGUgbWV0aG9kcyBvZiB0aGlzIGludGVyZmFjZSBoYXZlCi0gKiBubyBlZmZlY3QsIGV4Y2VwdCBmb3IgY29udGFpbnMsIHdoaWNoIHJldHVybnMgZmFsc2UuCi0gKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ2FjaGUgewotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhlIGNhY2hlIGNvbnRhaW5zIGRhdGEgZm9yIHRoZSBnaXZlbiBlbnRpdHkuCi0gICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoQ2xhc3MgY2xzLCBPYmplY3QgcHJpbWFyeUtleSk7CiAKLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGRhdGEgZm9yIHRoZSBnaXZlbiBlbnRpdHkgZnJvbSB0aGUgY2FjaGUuCi0gICAgICovCiAgICAgcHVibGljIHZvaWQgZXZpY3QoQ2xhc3MgY2xzLCBPYmplY3QgcHJpbWFyeUtleSk7CiAKLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGRhdGEgZm9yIGVudGl0aWVzIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MgKGFuZCBpdHMKLSAgICAgKiBzdWJjbGFzc2VzKSBmcm9tIHRoZSBjYWNoZS4KLSAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBldmljdChDbGFzcyBjbHMpOwogCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGNhY2hlLgotICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV2aWN0QWxsKCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL0Nhc2VFeHByZXNzaW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL0Nhc2VFeHByZXNzaW9uLmphdmEKaW5kZXggOTQ0MjZhYy4uZjM4NDNmYiAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9DYXNlRXhwcmVzc2lvbi5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvQ2FzZUV4cHJlc3Npb24uamF2YQpAQCAtMjcsMjc5ICsyNyw0OCBAQAogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKIAotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHRoZSBjb25zdHJ1Y3Rpb24gb2YgY2FzZSBleHByZXNzaW9ucwotICovCiBwdWJsaWMgaW50ZXJmYWNlIENhc2VFeHByZXNzaW9uIHsKLSAgICAvKioKLSAgICAgKiBBZGQgYSB3aGVuIHByZWRpY2F0ZSBjbGF1c2UgdG8gYSBnZW5lcmFsIGNhc2UgZXhwcmVzc2lvbi4gVGhlIHdoZW4KLSAgICAgKiBwcmVkaWNhdGUgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgY29ycmVzcG9uZGluZyB0aGVuIGNhc2UgZXhwcmVzc2lvbiB0aGF0Ci0gICAgICogc3BlY2lmaWVzIHRoZSByZXN1bHQgb2YgdGhlIHNwZWNpZmljIGNhc2UuIENsYXVzZXMgYXJlIGV2YWx1YXRlZCBpbiB0aGUKLSAgICAgKiBvcmRlciBhZGRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVkIC0KLSAgICAgKiAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgZXZhbHVhdGlvbiBjb25kaXRpb24gZm9yIHRoZSBzcGVjaWZpYyBjYXNlCi0gICAgICogQHJldHVybiBDYXNlRXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBjYXNlIHdpdGggdGhlIGFkZGVkIHdoZW4KLSAgICAgKiAgICAgICAgIGNsYXVzZQotICAgICAqLwogICAgIENhc2VFeHByZXNzaW9uIHdoZW4oUHJlZGljYXRlIHByZWQpOwogCi0gICAgLyoqCi0gICAgICogQWRkIGEgd2hlbiBjbGF1c2UgdG8gYSBzaW1wbGUgY2FzZSBleHByZXNzaW9uLiBUaGUgd2hlbiBjYXNlIGV4cHJlc3Npb24KLSAgICAgKiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHRoZW4gY2FzZSBleHByZXNzaW9uIHRoYXQgc3BlY2lmaWVzCi0gICAgICogdGhlIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWMgY2FzZS4gQ2xhdXNlcyBhcmUgZXZhbHVhdGVkIGluIHRoZSBvcmRlciBhZGRlZAotICAgICAqCi0gICAgICogQHBhcmFtIHdoZW4gLQotICAgICAqICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBhZ2FpbnN0IHdoaWNoIHRoZSBjYXNlIG9wZXJhbmQgb2YgdGhlCi0gICAgICogICAgICAgICAgICAgc2ltcGxlIGNhc2UgaXMgdGVzdGVkCi0gICAgICogQHJldHVybiBDYXNlRXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBjYXNlIHdpdGggdGhlIGFkZGVkIGNsYXVzZQotICAgICAqLwogICAgIENhc2VFeHByZXNzaW9uIHdoZW4oRXhwcmVzc2lvbiB3aGVuKTsKIAotICAgIC8qKgotICAgICAqIEFkZCBhIHdoZW4gY2xhdXNlIHRvIGEgc2ltcGxlIGNhc2UgZXhwcmVzc2lvbi4gVGhlIHdoZW4gY2FzZSBleHByZXNzaW9uCi0gICAgICogbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgY29ycmVzcG9uZGluZyB0aGVuIGNhc2UgZXhwcmVzc2lvbiB0aGF0IHNwZWNpZmllcwotICAgICAqIHRoZSByZXN1bHQgb2YgdGhlIHNwZWNpZmljIGNhc2UuIENsYXVzZXMgYXJlIGV2YWx1YXRlZCBpbiB0aGUgb3JkZXIgYWRkZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSB3aGVuIC0KLSAgICAgKiAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgYWdhaW5zdCB3aGljaCB0aGUgY2FzZSBvcGVyYW5kIG9mIHRoZQotICAgICAqICAgICAgICAgICAgIHNpbXBsZSBjYXNlIGlzIHRlc3RlZAotICAgICAqIEByZXR1cm4gQ2FzZUV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgY2FzZSB3aXRoIHRoZSBhZGRlZCBjbGF1c2UKLSAgICAgKi8KICAgICBDYXNlRXhwcmVzc2lvbiB3aGVuKE51bWJlciB3aGVuKTsKIAotICAgIC8qKgotICAgICAqIEFkZCBhIHdoZW4gY2xhdXNlIHRvIGEgc2ltcGxlIGNhc2UgZXhwcmVzc2lvbi4gVGhlIHdoZW4gY2FzZSBleHByZXNzaW9uCi0gICAgICogbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgY29ycmVzcG9uZGluZyB0aGVuIGNhc2UgZXhwcmVzc2lvbiB0aGF0IHNwZWNpZmllcwotICAgICAqIHRoZSByZXN1bHQgb2YgdGhlIHNwZWNpZmljIGNhc2UuIENsYXVzZXMgYXJlIGV2YWx1YXRlZCBpbiB0aGUgb3JkZXIgYWRkZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSB3aGVuIC0KLSAgICAgKiAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgYWdhaW5zdCB3aGljaCB0aGUKLSAgICAgKiAgICAgICAgICAgICBjYXNlIG9wZXJhbmQgb2YgdGhlIHNpbXBsZSBjYXNlIGlzIHRlc3RlZAotICAgICAqIEByZXR1cm4gQ2FzZUV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgY2FzZSB3aXRoIHRoZSBhZGRlZCBjbGF1c2UKLSAgICAgKi8KICAgICBDYXNlRXhwcmVzc2lvbiB3aGVuKFN0cmluZyB3aGVuKTsKIAotICAgIC8qKgotICAgICAqIEFkZCBhIHdoZW4gY2xhdXNlIHRvIGEgc2ltcGxlIGNhc2UgZXhwcmVzc2lvbi4gVGhlIHdoZW4gY2FzZSBleHByZXNzaW9uCi0gICAgICogbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgY29ycmVzcG9uZGluZyB0aGVuIGNhc2UgZXhwcmVzc2lvbiB0aGF0IHNwZWNpZmllcwotICAgICAqIHRoZSByZXN1bHQgb2YgdGhlIHNwZWNpZmljIGNhc2UuIENsYXVzZXMgYXJlIGV2YWx1YXRlZCBpbiB0aGUgb3JkZXIgYWRkZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSB3aGVuIC0KLSAgICAgKiAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgYWdhaW5zdCB3aGljaCB0aGUgY2FzZSBvcGVyYW5kIG9mIHRoZQotICAgICAqICAgICAgICAgICAgIHNpbXBsZSBjYXNlIGlzIHRlc3RlZAotICAgICAqIEByZXR1cm4gQ2FzZUV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgY2FzZSB3aXRoIHRoZSBhZGRlZCBjbGF1c2UKLSAgICAgKi8KICAgICBDYXNlRXhwcmVzc2lvbiB3aGVuKERhdGUgd2hlbik7CiAKLSAgICAvKioKLSAgICAgKiBBZGQgYSB3aGVuIGNsYXVzZSB0byBhIHNpbXBsZSBjYXNlIGV4cHJlc3Npb24uIFRoZSB3aGVuIGNhc2UgZXhwcmVzc2lvbgotICAgICAqIG11c3QgYmUgZm9sbG93ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgdGhlbiBjYXNlIGV4cHJlc3Npb24gdGhhdCBzcGVjaWZpZXMKLSAgICAgKiB0aGUgcmVzdWx0IG9mIHRoZSBzcGVjaWZpYyBjYXNlLiBDbGF1c2VzIGFyZSBldmFsdWF0ZWQgaW4gdGhlIG9yZGVyIGFkZGVkCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2hlbiAtCi0gICAgICogICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIGFnYWluc3Qgd2hpY2ggdGhlIGNhc2Ugb3BlcmFuZCBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICBzaW1wbGUgY2FzZSBpcyB0ZXN0ZWQKLSAgICAgKiBAcmV0dXJuIENhc2VFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNhc2Ugd2l0aCB0aGUgYWRkZWQgY2xhdXNlCi0gICAgICovCiAgICAgQ2FzZUV4cHJlc3Npb24gd2hlbihDYWxlbmRhciB3aGVuKTsKIAotICAgIC8qKgotICAgICAqIEFkZCBhIHdoZW4gY2xhdXNlIHRvIGEgc2ltcGxlIGNhc2UgZXhwcmVzc2lvbi4gVGhlIHdoZW4gY2FzZSBleHByZXNzaW9uCi0gICAgICogbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgY29ycmVzcG9uZGluZyB0aGVuIGNhc2UgZXhwcmVzc2lvbiB0aGF0IHNwZWNpZmllcwotICAgICAqIHRoZSByZXN1bHQgb2YgdGhlIHNwZWNpZmljIGNhc2UuIENsYXVzZXMgYXJlIGV2YWx1YXRlZCBpbiB0aGUgb3JkZXIgYWRkZWQKLSAgICAgKgotICAgICAqIEBwYXJhbSB3aGVuIC0KLSAgICAgKiAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgYWdhaW5zdCB3aGljaCB0aGUgY2FzZSBvcGVyYW5kIG9mIHRoZQotICAgICAqICAgICAgICAgICAgIHNpbXBsZSBjYXNlIGlzIHRlc3RlZAotICAgICAqIEByZXR1cm4gQ2FzZUV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgY2FzZSB3aXRoIHRoZSBhZGRlZCBjbGF1c2UKLSAgICAgKi8KICAgICBDYXNlRXhwcmVzc2lvbiB3aGVuKENsYXNzIHdoZW4pOwogCi0gICAgLyoqCi0gICAgICogQWRkIGEgd2hlbiBjbGF1c2UgdG8gYSBzaW1wbGUgY2FzZSBleHByZXNzaW9uLiBUaGUgd2hlbiBjYXNlIGV4cHJlc3Npb24KLSAgICAgKiBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHRoZW4gY2FzZSBleHByZXNzaW9uIHRoYXQgc3BlY2lmaWVzCi0gICAgICogdGhlIHJlc3VsdCBvZiB0aGUgc3BlY2lmaWMgY2FzZS4gQ2xhdXNlcyBhcmUgZXZhbHVhdGVkIGluIHRoZSBvcmRlciBhZGRlZAotICAgICAqCi0gICAgICogQHBhcmFtIHdoZW4gLQotICAgICAqICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBhZ2FpbnN0IHdoaWNoIHRoZSBjYXNlIG9wZXJhbmQgb2YgdGhlCi0gICAgICogICAgICAgICAgICAgc2ltcGxlIGNhc2UgaXMgdGVzdGVkCi0gICAgICogQHJldHVybiBDYXNlRXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBjYXNlIHdpdGggdGhlIGFkZGVkIGNsYXVzZQotICAgICAqLwogICAgIENhc2VFeHByZXNzaW9uIHdoZW4oRW51bTw/PiB3aGVuKTsKIAotICAgIC8qKgotICAgICAqIEFkZCBhIHRoZW4gY2xhdXNlIHRvIGEgZ2VuZXJhbCBvciBzaW1wbGUgY2FzZSBleHByZXNzaW9uLiBUaGUgdGhlbiBjbGF1c2UKLSAgICAgKiBzcGVjaWZpZXMgdGhlIHJlc3VsdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgd2hlbi4KLSAgICAgKiBDbGF1c2VzIGFyZSBldmFsdWF0ZWQgaW4gdGhlIG9yZGVyIGFkZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHRoZW4gLQotICAgICAqICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSByZXN1bHQgb2YgdGhlIGNhc2UgZXhwcmVzc2lvbiBpZiB0aGUgd2hlbgotICAgICAqICAgICAgICAgICAgIGlzIHNhdGlzZmllZAotICAgICAqIEByZXR1cm4gQ2FzZUV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgY2FzZSB3aXRoIHRoZSBhZGRlZCB0aGVuCi0gICAgICogICAgICAgICBjbGF1c2UKLSAgICAgKi8KICAgICBDYXNlRXhwcmVzc2lvbiB0aGVuKEV4cHJlc3Npb24gdGhlbik7CiAKLSAgICAvKioKLSAgICAgKiBBZGQgYSB0aGVuIGNsYXVzZSB0byBhIGdlbmVyYWwgb3Igc2ltcGxlIGNhc2UgZXhwcmVzc2lvbi4gVGhlIHRoZW4gY2xhdXNlCi0gICAgICogc3BlY2lmaWVzIHRoZSByZXN1bHQgY29ycmVzcG9uZGluZyB0byB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHdoZW4uCi0gICAgICogQ2xhdXNlcyBhcmUgZXZhbHVhdGVkIGluIHRoZSBvcmRlciBhZGRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aGVuIC0KLSAgICAgKiAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgcmVzdWx0IG9mIHRoZSBjYXNlIGV4cHJlc3Npb24gaWYgdGhlIHdoZW4KLSAgICAgKiAgICAgICAgICAgICBpcyBzYXRpc2ZpZWQKLSAgICAgKiBAcmV0dXJuIENhc2VFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNhc2Ugd2l0aCB0aGUgYWRkZWQgdGhlbgotICAgICAqICAgICAgICAgY2xhdXNlCi0gICAgICovCiAgICAgQ2FzZUV4cHJlc3Npb24gdGhlbihOdW1iZXIgdGhlbik7CiAKLSAgICAvKioKLSAgICAgKiBBZGQgYSB0aGVuIGNsYXVzZSB0byBhIGdlbmVyYWwgb3Igc2ltcGxlIGNhc2UgZXhwcmVzc2lvbi4gVGhlIHRoZW4gY2xhdXNlCi0gICAgICogc3BlY2lmaWVzIHRoZSByZXN1bHQgY29ycmVzcG9uZGluZyB0byB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHdoZW4uCi0gICAgICogQ2xhdXNlcyBhcmUgZXZhbHVhdGVkIGluIHRoZSBvcmRlciBhZGRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aGVuIC0KLSAgICAgKiAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgcmVzdWx0IG9mIHRoZSBjYXNlIGV4cHJlc3Npb24gaWYgdGhlIHdoZW4KLSAgICAgKiAgICAgICAgICAgICBpcyBzYXRpc2ZpZWQKLSAgICAgKiBAcmV0dXJuIENhc2VFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNhc2Ugd2l0aCB0aGUgYWRkZWQgdGhlbgotICAgICAqICAgICAgICAgY2xhdXNlCi0gICAgICovCiAgICAgQ2FzZUV4cHJlc3Npb24gdGhlbihTdHJpbmcgdGhlbik7CiAKLSAgICAvKioKLSAgICAgKiBBZGQgYSB0aGVuIGNsYXVzZSB0byBhIGdlbmVyYWwgb3Igc2ltcGxlIGNhc2UgZXhwcmVzc2lvbi4gVGhlIHRoZW4gY2xhdXNlCi0gICAgICogc3BlY2lmaWVzIHRoZSByZXN1bHQgY29ycmVzcG9uZGluZyB0byB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHdoZW4uCi0gICAgICogQ2xhdXNlcyBhcmUgZXZhbHVhdGVkIGluIHRoZSBvcmRlciBhZGRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aGVuIC0KLSAgICAgKiAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgcmVzdWx0IG9mIHRoZSBjYXNlIGV4cHJlc3Npb24gaWYgdGhlIHdoZW4KLSAgICAgKiAgICAgICAgICAgICBpcyBzYXRpc2ZpZWQKLSAgICAgKiBAcmV0dXJuIENhc2VFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNhc2Ugd2l0aCB0aGUgYWRkZWQgdGhlbgotICAgICAqICAgICAgICAgY2xhdXNlCi0gICAgICovCiAgICAgQ2FzZUV4cHJlc3Npb24gdGhlbihEYXRlIHRoZW4pOwogCi0gICAgLyoqCi0gICAgICogQWRkIGEgdGhlbiBjbGF1c2UgdG8gYSBnZW5lcmFsIG9yIHNpbXBsZSBjYXNlIGV4cHJlc3Npb24uIFRoZSB0aGVuIGNsYXVzZQotICAgICAqIHNwZWNpZmllcyB0aGUgcmVzdWx0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyB3aGVuLgotICAgICAqIENsYXVzZXMgYXJlIGV2YWx1YXRlZCBpbiB0aGUgb3JkZXIgYWRkZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGhlbiAtCi0gICAgICogICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIHJlc3VsdCBvZiB0aGUgY2FzZSBleHByZXNzaW9uIGlmIHRoZSB3aGVuCi0gICAgICogICAgICAgICAgICAgaXMgc2F0aXNmaWVkCi0gICAgICogQHJldHVybiBDYXNlRXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBjYXNlIHdpdGggdGhlIGFkZGVkIHRoZW4KLSAgICAgKiAgICAgICAgIGNsYXVzZQotICAgICAqLwogICAgIENhc2VFeHByZXNzaW9uIHRoZW4oQ2FsZW5kYXIgdGhlbik7CiAKLSAgICAvKioKLSAgICAgKiBBZGQgYSB0aGVuIGNsYXVzZSB0byBhIGdlbmVyYWwgb3Igc2ltcGxlIGNhc2UgZXhwcmVzc2lvbi4gVGhlIHRoZW4gY2xhdXNlCi0gICAgICogc3BlY2lmaWVzIHRoZSByZXN1bHQgY29ycmVzcG9uZGluZyB0byB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHdoZW4uCi0gICAgICogQ2xhdXNlcyBhcmUgZXZhbHVhdGVkIGluIHRoZSBvcmRlciBhZGRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aGVuIC0KLSAgICAgKiAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgcmVzdWx0IG9mIHRoZSBjYXNlIGV4cHJlc3Npb24gaWYgdGhlIHdoZW4KLSAgICAgKiAgICAgICAgICAgICBpcyBzYXRpc2ZpZWQKLSAgICAgKiBAcmV0dXJuIENhc2VFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNhc2Ugd2l0aCB0aGUgYWRkZWQgdGhlbgotICAgICAqICAgICAgICAgY2xhdXNlCi0gICAgICovCiAgICAgQ2FzZUV4cHJlc3Npb24gdGhlbihDbGFzcyB0aGVuKTsKIAotICAgIC8qKgotICAgICAqIEFkZCBhIHRoZW4gY2xhdXNlIHRvIGEgZ2VuZXJhbCBvciBzaW1wbGUgY2FzZSBleHByZXNzaW9uLiBUaGUgdGhlbiBjbGF1c2UKLSAgICAgKiBzcGVjaWZpZXMgdGhlIHJlc3VsdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgd2hlbi4KLSAgICAgKiBDbGF1c2VzIGFyZSBldmFsdWF0ZWQgaW4gdGhlIG9yZGVyIGFkZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHRoZW4gLQotICAgICAqICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSByZXN1bHQgb2YgdGhlIGNhc2UgZXhwcmVzc2lvbiBpZiB0aGUgd2hlbgotICAgICAqICAgICAgICAgICAgIGlzIHNhdGlzZmllZAotICAgICAqIEByZXR1cm4gQ2FzZUV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgY2FzZSB3aXRoIHRoZSBhZGRlZCB0aGVuCi0gICAgICogICAgICAgICBjbGF1c2UKLSAgICAgKi8KICAgICBDYXNlRXhwcmVzc2lvbiB0aGVuKEVudW08Pz4gdGhlbik7CiAKLSAgICAvKioKLSAgICAgKiBBZGQgZWxzZSB0byBhIGNhc2UgZXhwcmVzc2lvbi4gQSBjYXNlIGV4cHJlc3Npb24gbXVzdCBoYXZlIGFuIGVsc2UKLSAgICAgKiBjbGF1c2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnIC0KLSAgICAgKiAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSByZXN1bHQgb2YgdGhlIGNhc2UgZXhwcmVzc2lvbiBpZiB0aGUgd2hlbgotICAgICAqICAgICAgICAgICAgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQKLSAgICAgKiBAcmV0dXJuIEV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgY2FzZSBleHByZXNzaW9uIHdpdGggdGhlIGFkZGVkCi0gICAgICogICAgICAgICBjbGF1c2UKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIGVsc2VDYXNlKEV4cHJlc3Npb24gYXJnKTsKIAotICAgIC8qKgotICAgICAqIEFkZCBlbHNlIHRvIGEgY2FzZSBleHByZXNzaW9uLiBBIGNhc2UgZXhwcmVzc2lvbiBtdXN0IGhhdmUgYW4gZWxzZQotICAgICAqIGNsYXVzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcgLQotICAgICAqICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhlIHJlc3VsdCBvZiB0aGUgY2FzZSBleHByZXNzaW9uIGlmIHRoZSB3aGVuCi0gICAgICogICAgICAgICAgICBjb25kaXRpb24gaXMgbm90IHNhdGlzZmllZAotICAgICAqIEByZXR1cm4gRXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBjYXNlIGV4cHJlc3Npb24gd2l0aCB0aGUgYWRkZWQKLSAgICAgKiAgICAgICAgIGNsYXVzZQotICAgICAqLwogICAgIEV4cHJlc3Npb24gZWxzZUNhc2UoU3RyaW5nIGFyZyk7CiAKLSAgICAvKioKLSAgICAgKiBBZGQgZWxzZSB0byBhIGNhc2UgZXhwcmVzc2lvbi4gQSBjYXNlIGV4cHJlc3Npb24gbXVzdCBoYXZlIGFuIGVsc2UKLSAgICAgKiBjbGF1c2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnIC0KLSAgICAgKiAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSByZXN1bHQgb2YgdGhlIGNhc2UgZXhwcmVzc2lvbiBpZiB0aGUgd2hlbgotICAgICAqICAgICAgICAgICAgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQKLSAgICAgKiBAcmV0dXJuIEV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgY2FzZSBleHByZXNzaW9uIHdpdGggdGhlIGFkZGVkCi0gICAgICogICAgICAgICBjbGF1c2UKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIGVsc2VDYXNlKE51bWJlciBhcmcpOwogCi0gICAgLyoqCi0gICAgICogQWRkIGVsc2UgdG8gYSBjYXNlIGV4cHJlc3Npb24uIEEgY2FzZSBleHByZXNzaW9uIG11c3QgaGF2ZSBhbiBlbHNlCi0gICAgICogY2xhdXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZyAtCi0gICAgICogICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGUgcmVzdWx0IG9mIHRoZSBjYXNlIGV4cHJlc3Npb24gaWYgdGhlIHdoZW4KLSAgICAgKiAgICAgICAgICAgIGNvbmRpdGlvbiBpcyBub3Qgc2F0aXNmaWVkCi0gICAgICogQHJldHVybiBFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNhc2UgZXhwcmVzc2lvbiB3aXRoIHRoZSBhZGRlZAotICAgICAqICAgICAgICAgY2xhdXNlCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBlbHNlQ2FzZShEYXRlIGFyZyk7CiAKLSAgICAvKioKLSAgICAgKiBBZGQgZWxzZSB0byBhIGNhc2UgZXhwcmVzc2lvbi4gQSBjYXNlIGV4cHJlc3Npb24gbXVzdCBoYXZlIGFuIGVsc2UKLSAgICAgKiBjbGF1c2UuCi0JICoKLQkgKiBAcGFyYW0gYXJnIC0KLQkgKiAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSByZXN1bHQgb2YgdGhlIGNhc2UgZXhwcmVzc2lvbiBpZiB0aGUgd2hlbgotCSAqICAgICAgICAgICAgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQKLQkgKiBAcmV0dXJuIEV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgY2FzZSBleHByZXNzaW9uIHdpdGggdGhlIGFkZGVkCi0JICogICAgICAgICBjbGF1c2UKLQkgKi8KIAlFeHByZXNzaW9uIGVsc2VDYXNlKENhbGVuZGFyIGFyZyk7CiAKLQkvKioKLQkgKiBBZGQgZWxzZSB0byBhIGNhc2UgZXhwcmVzc2lvbi4gQSBjYXNlIGV4cHJlc3Npb24gbXVzdCBoYXZlIGFuIGVsc2UKLQkgKiBjbGF1c2UuCi0JICoKLQkgKiBAcGFyYW0gYXJnIC0KLQkgKiAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSByZXN1bHQgb2YgdGhlIGNhc2UgZXhwcmVzc2lvbiBpZiB0aGUgd2hlbgotCSAqICAgICAgICAgICAgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQKLQkgKiBAcmV0dXJuIEV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgY2FzZSBleHByZXNzaW9uIHdpdGggdGhlIGFkZGVkCi0JICogICAgICAgICBjbGF1c2UKLQkgKi8KIAlFeHByZXNzaW9uIGVsc2VDYXNlKENsYXNzIGFyZyk7CiAKLQkvKioKLQkgKiBBZGQgZWxzZSB0byBhIGNhc2UgZXhwcmVzc2lvbi4gQSBjYXNlIGV4cHJlc3Npb24gbXVzdCBoYXZlIGFuIGVsc2UKLQkgKiBjbGF1c2UuCi0JICoKLQkgKiBAcGFyYW0gYXJnIC0KLQkgKiAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSByZXN1bHQgb2YgdGhlIGNhc2UgZXhwcmVzc2lvbiBpZiB0aGUgd2hlbgotCSAqICAgICAgICAgICAgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQKLQkgKiBAcmV0dXJuIEV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgY2FzZSBleHByZXNzaW9uIHdpdGggdGhlIGFkZGVkCi0JICogICAgICAgICBjbGF1c2UKLQkgKi8KIAlFeHByZXNzaW9uIGVsc2VDYXNlKEVudW08Pz4gYXJnKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvRG9tYWluT2JqZWN0LmphdmEgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL0RvbWFpbk9iamVjdC5qYXZhCmluZGV4IGZiNTcyZmUuLjE1ZWM1N2UgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvRG9tYWluT2JqZWN0LmphdmEKKysrIGIvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9Eb21haW5PYmplY3QuamF2YQpAQCAtMjQsMTA2ICsyNCwyMCBAQAogLy8KIHBhY2thZ2UgamF2YXgucGVyc2lzdGVuY2U7CiAKLS8qKgotICogRG9tYWluIG9iamVjdHMgZGVmaW5lIHRoZSBkb21haW4gb3ZlciB3aGljaCBhIHF1ZXJ5IG9wZXJhdGVzLiBBIGRvbWFpbiBvYmplY3QKLSAqIHBsYXlzIGEgcm9sZSBhbmFsb2dvdXMgdG8gdGhhdCBvZiBhIEphdmEgUGVyc2lzdGVuY2UgcXVlcnkgbGFuZ3VhZ2UKLSAqIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlLgotICovCiBwdWJsaWMgaW50ZXJmYWNlIERvbWFpbk9iamVjdCBleHRlbmRzIFBhdGhFeHByZXNzaW9uLCBRdWVyeURlZmluaXRpb24gewotICAgIC8qKgotICAgICAqIEV4dGVuZCB0aGUgcXVlcnkgZG9tYWluIGJ5IGpvaW5pbmcgd2l0aCBhIGNsYXNzIHRoYXQgY2FuIGJlIG5hdmlnYXRlZCB0bwotICAgICAqIG9yIHRoYXQgaXMgZW1iZWRkZWQgaW4gdGhlIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRvbWFpbiBvYmplY3Qgb24KLSAgICAgKiB3aGljaCB0aGUgbWV0aG9kIGlzIGludm9rZWQuIFRoaXMgbWV0aG9kIGlzIHBlcm1pdHRlZCB0byBiZSBpbnZva2VkIG9ubHkKLSAgICAgKiB3aGVuIGRlZmluaW5nIHRoZSBkb21haW4gb2YgdGhlIHF1ZXJ5LiBJdCBtdXN0IG5vdCBiZSBpbnZva2VkIHdpdGhpbiB0aGUKLSAgICAgKiBjb250ZXh0IG9mIHRoZSBzZWxlY3QsIHdoZXJlLCBncm91cEJ5LCBvciBoYXZpbmcgb3BlcmF0aW9ucy4gVGhlIGRvbWFpbgotICAgICAqIG9iamVjdCBtdXN0IGNvcnJlc3BvbmQgdG8gYSBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSByZWZlcmVuY2VkIGF0dHJpYnV0ZS4KLSAgICAgKiBUaGUgcXVlcnkgZGVmaW5pdGlvbiBpcyBtb2RpZmllZCB0byBpbmNsdWRlIHRoZSBuZXdseSBqb2luZWQgZG9tYWluCi0gICAgICogb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZSAtCi0gICAgICogICAgICAgICAgICAgICAgICBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCByZWZlcmVuY2VzIHRoZSB0YXJnZXQgb2YgdGhlIGpvaW4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgRG9tYWluT2JqZWN0IHRoYXQgaXMgYWRkZWQgZm9yIHRoZSB0YXJnZXQgb2YgdGhlIGpvaW4KLSAgICAgKi8KICAgICBEb21haW5PYmplY3Qgam9pbihTdHJpbmcgYXR0cmlidXRlKTsKIAotICAgIC8qKgotICAgICAqIEV4dGVuZCB0aGUgcXVlcnkgZG9tYWluIGJ5IGxlZnQgb3V0ZXIgam9pbmluZyB3aXRoIGEgY2xhc3MgdGhhdCBjYW4gYmUKLSAgICAgKiBuYXZpZ2F0ZWQgdG8gb3IgdGhhdCBpcyBlbWJlZGRlZCBpbiB0aGUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgZG9tYWluCi0gICAgICogb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRob2QgaXMgaW52b2tlZC4gVGhpcyBtZXRob2QgaXMgcGVybWl0dGVkIHRvIGJlCi0gICAgICogaW52b2tlZCBvbmx5IHdoZW4gZGVmaW5pbmcgdGhlIGRvbWFpbiBvZiB0aGUgcXVlcnkuIEl0IG11c3Qgbm90IGJlCi0gICAgICogaW52b2tlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIHNlbGVjdCwgd2hlcmUsIGdyb3VwQnksIG9yIGhhdmluZwotICAgICAqIG9wZXJhdGlvbnMuIFRoZSBkb21haW4gb2JqZWN0IG11c3QgY29ycmVzcG9uZCB0byBhIGNsYXNzIHRoYXQgY29udGFpbnMKLSAgICAgKiB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUuIFRoZSBxdWVyeSBkZWZpbml0aW9uIGlzIG1vZGlmaWVkIHRvIGluY2x1ZGUgdGhlCi0gICAgICogbmV3bHkgam9pbmVkIGRvbWFpbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlIC0KLSAgICAgKiAgICAgICAgICAgICAgICAgIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IHJlZmVyZW5jZXMgdGhlIHRhcmdldCBvZiB0aGUgam9pbgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBEb21haW5PYmplY3QgdGhhdCBpcyBhZGRlZCBmb3IgdGhlIHRhcmdldCBvZiB0aGUgam9pbgotICAgICAqLwogICAgIERvbWFpbk9iamVjdCBsZWZ0Sm9pbihTdHJpbmcgYXR0cmlidXRlKTsKIAotICAgIC8qKgotICAgICAqIFNwZWNpZnkgdGhhdCB0aGUgYXNzb2NpYXRpb24gb3IgZWxlbWVudCBjb2xsZWN0aW9uIHRoYXQgaXMgcmVmZXJlbmNlZCBieQotICAgICAqIHRoZSBhdHRyaWJ1dGUgYmUgZWFnZXJseSBmZXRjaGVkIHRocm91Z2ggdXNlIG9mIGFuIGlubmVyIGpvaW4uIFRoZSBkb21haW4KLSAgICAgKiBvYmplY3QgbXVzdCBjb3JyZXNwb25kIHRvIGEgY2xhc3MgdGhhdCBjb250YWlucyB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUuCi0gICAgICogVGhlIHF1ZXJ5IGlzIG1vZGlmaWVkIHRvIGluY2x1ZGUgdGhlIGpvaW5lZCBkb21haW4gb2JqZWN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGF0dHJpYnV0ZSAtCi0gICAgICogICAgICAgICAgICAgICAgICBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdGhhdCByZWZlcmVuY2VzIHRoZSB0YXJnZXQgb2YgdGhlIGpvaW4KLSAgICAgKiBAcmV0dXJuIHRoZSBGZXRjaEpvaW5PYmplY3QgdGhhdCBpcyBhZGRlZCBmb3IgdGhlIHRhcmdldCBvZiB0aGUgam9pbgotICAgICAqLwogICAgIEZldGNoSm9pbk9iamVjdCBqb2luRmV0Y2goU3RyaW5nIGF0dHJpYnV0ZSk7CiAKLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IHRoYXQgdGhlIGFzc29jaWF0aW9uIG9yIGVsZW1lbnQgY29sbGVjdGlvbiB0aGF0IGlzIHJlZmVyZW5jZWQgYnkKLSAgICAgKiB0aGUgYXR0cmlidXRlIGJlIGVhZ2VybHkgZmV0Y2hlZCB0aHJvdWdoIHVzZSBvZiBhIGxlZnQgb3V0ZXIgam9pbi4gVGhlCi0gICAgICogZG9tYWluIG9iamVjdCBtdXN0IGNvcnJlc3BvbmQgdG8gYSBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSByZWZlcmVuY2VkCi0gICAgICogYXR0cmlidXRlLiBUaGUgcXVlcnkgaXMgbW9kaWZpZWQgdG8gaW5jbHVkZSB0aGUgam9pbmVkIGRvbWFpbiBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlIC0KLSAgICAgKiAgICAgICAgICAgICAgICAgIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IHJlZmVyZW5jZXMgdGhlIHRhcmdldCBvZiB0aGUgam9pbgotICAgICAqIEByZXR1cm4gdGhlIEZldGNoSm9pbk9iamVjdCB0aGF0IGlzIGFkZGVkIGZvciB0aGUgdGFyZ2V0IG9mIHRoZSBqb2luCi0gICAgICovCiAgICAgRmV0Y2hKb2luT2JqZWN0IGxlZnRKb2luRmV0Y2goU3RyaW5nIGF0dHJpYnV0ZSk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBwYXRoIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgdmFsdWUgb2YgYSBtYXAtdmFsdWVkCi0gICAgICogYXNzb2NpYXRpb24gb3IgZWxlbWVudCBjb2xsZWN0aW9uLiBUaGlzIG1ldGhvZCBpcyBvbmx5IHBlcm1pdHRlZCB0byBiZQotICAgICAqIGludm9rZWQgdXBvbiBhIGRvbWFpbiBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byBhIG1hcC12YWx1ZWQgYXNzb2NpYXRpb24KLSAgICAgKiBvciBlbGVtZW50IGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFBhdGhFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1hcCB2YWx1ZQotICAgICAqLwogICAgIFBhdGhFeHByZXNzaW9uIHZhbHVlKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBwYXRoIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUga2V5IG9mIGEgbWFwLXZhbHVlZAotICAgICAqIGFzc29jaWF0aW9uIG9yIGVsZW1lbnQgY29sbGVjdGlvbi4gVGhpcyBtZXRob2QgaXMgb25seSBwZXJtaXR0ZWQgdG8gYmUKLSAgICAgKiBpbnZva2VkIHVwb24gYSBkb21haW4gb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBtYXAtdmFsdWVkIGFzc29jaWF0aW9uCi0gICAgICogb3IgZWxlbWVudCBjb2xsZWN0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBQYXRoRXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYXAga2V5Ci0gICAgICovCiAgICAgUGF0aEV4cHJlc3Npb24ga2V5KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBzZWxlY3QgaXRlbSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYXAgZW50cnkgb2YgYSBtYXAtdmFsdWVkCi0gICAgICogYXNzb2NpYXRpb24gb3IgZWxlbWVudCBjb2xsZWN0aW9uLiBUaGlzIG1ldGhvZCBpcyBvbmx5IHBlcm1pdHRlZCB0byBiZQotICAgICAqIGludm9rZWQgdXBvbiBhIGRvbWFpbiBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byBhIG1hcC12YWx1ZWQgYXNzb2NpYXRpb24KLSAgICAgKiBvciBlbGVtZW50IGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFNlbGVjdEl0ZW0gY29ycmVzcG9uZGluZyB0byB0aGUgbWFwIGVudHJ5Ci0gICAgICovCiAgICAgU2VsZWN0SXRlbSBlbnRyeSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFuIGV4cHJlc3Npb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgaW5kZXguIG9mIHRoZSBkb21haW4gb2JqZWN0Ci0gICAgICogaW4gdGhlIHJlZmVyZW5jZWQgYXNzb2NpYXRpb24gb3IgZWxlbWVudCBjb2xsZWN0aW9uLiBUaGlzIG1ldGhvZCBpcyBvbmx5Ci0JICogcGVybWl0dGVkIHRvIGJlIGludm9rZWQgdXBvbiBhIGRvbWFpbiBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byBhCi0JICogbXVsdGktdmFsdWVkIGFzc29jaWF0aW9uIG9yIGVsZW1lbnQgY29sbGVjdGlvbiBmb3Igd2hpY2ggYW4gb3JkZXIgY29sdW1uCi0JICogaGFzIGJlZW4gZGVmaW5lZC4KLQkgKgotCSAqIEByZXR1cm4gRXhwcmVzc2lvbiBkZW5vdGluZyB0aGUgaW5kZXgKLQkgKi8KIAlFeHByZXNzaW9uIGluZGV4KCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL0VudGl0eU1hbmFnZXIuamF2YSBiL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvRW50aXR5TWFuYWdlci5qYXZhCmluZGV4IGFkNDFhZTAuLjI5NTJmNjggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvRW50aXR5TWFuYWdlci5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvRW50aXR5TWFuYWdlci5qYXZhCkBAIC0yOCw1OTUgKzI4LDg0IEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0LgotICoKICAqIEB2ZXJzaW9uICRSZXYkICREYXRlJAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEVudGl0eU1hbmFnZXIgewogCi0gICAgLyoqCi0gICAgICogTWFrZSBhbiBpbnN0YW5jZSBtYW5hZ2VkIGFuZCBwZXJzaXN0ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGVudGl0eQotICAgICAqIEB0aHJvd3MgRW50aXR5RXhpc3RzRXhjZXB0aW9uICAgICAgICBpZiB0aGUgZW50aXR5IGFscmVhZHkgZXhpc3RzLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVGhlIEVudGl0eUV4aXN0c0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIHdoZW4gdGhlIHBlcnNpc3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIGlzIGludm9rZWQsIG9yIHRoZSBFbnRpdHlFeGlzdHNFeGNlcHRpb24gb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vdGhlciBQZXJzaXN0ZW5jZUV4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGF0IGZsdXNoIG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdCB0aW1lLikKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgICAgaWYgdGhlIGluc3RhbmNlIGlzIG5vdCBhbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkKLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb24gaWYgaW52b2tlZCBvbiBhCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci1tYW5hZ2VkIGVudGl0eSBtYW5hZ2VyIG9mIHR5cGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5UUkFOU0FDVElPTiBhbmQgdGhlcmUgaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gdHJhbnNhY3Rpb24uCi0gICAgICovCiAgICAgcHVibGljIHZvaWQgcGVyc2lzdChPYmplY3QgZW50aXR5KTsKIAotICAgIC8qKgotICAgICAqIE1lcmdlIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gZW50aXR5IGludG8gdGhlCi0gICAgICogY3VycmVudCBwZXJzaXN0ZW5jZSBjb250ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIGVudGl0eQotICAgICAqIEByZXR1cm4gdGhlIG1hbmFnZWQgaW5zdGFuY2UgdGhhdCB0aGUgc3RhdGUgd2FzIG1lcmdlZCB0bwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAgICBpZiBpbnN0YW5jZSBpcyBub3QgYW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5IG9yIGlzIGEgcmVtb3ZlZCBlbnRpdHkKLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb24gaWYgaW52b2tlZCBvbiBhCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci1tYW5hZ2VkIGVudGl0eSBtYW5hZ2VyIG9mIHR5cGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5UUkFOU0FDVElPTiBhbmQgdGhlcmUgaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gdHJhbnNhY3Rpb24uCi0gICAgICovCiAgICAgcHVibGljIDxUPiBUIG1lcmdlKFQgZW50aXR5KTsKIAotICAgIC8qKgotICAgICAqIFJlbW92ZSB0aGUgZW50aXR5IGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVudGl0eQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAgICBpZiB0aGUgaW5zdGFuY2UgaXMgbm90IGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSBvciBpcyBhIGRldGFjaGVkIGVudGl0eQotICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbiBpZiBpbnZva2VkIG9uIGEKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLW1hbmFnZWQgZW50aXR5IG1hbmFnZXIgb2YgdHlwZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlLlRSQU5TQUNUSU9OIGFuZCB0aGVyZSBpcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyB0cmFuc2FjdGlvbi4KLSAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IGVudGl0eSk7CiAKLSAgICAvKioKLSAgICAgKiBGaW5kIGJ5IHByaW1hcnkga2V5LgotICAgICAqIFNlYXJjaCBmb3IgYW4gZW50aXR5IG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MgYW5kIHByaW1hcnkga2V5LgotICAgICAqIElmIHRoZSBlbnRpdHkgaW5zdGFuY2UgaXMgY29udGFpbmVkIGluIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0Ci0gICAgICogaXQgaXMgcmV0dXJuZWQgZnJvbSB0aGVyZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRpdHlDbGFzcwotICAgICAqIEBwYXJhbSBwcmltYXJ5S2V5Ci0gICAgICogQHJldHVybiB0aGUgZm91bmQgZW50aXR5IGluc3RhbmNlIG9yIG51bGwKLSAgICAgKiAgICAgICAgIGlmIHRoZSBlbnRpdHkgZG9lcyBub3QgZXhpc3QKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZmlyc3QgYXJndW1lbnQgZG9lcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBkZW5vdGUgYW4gZW50aXR5IHR5cGUgb3IgdGhlIHNlY29uZCBhcmd1bWVudCBpcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBhIHZhbGlkIHR5cGUgZm9yIHRoYXQgZW50aXR5knMgcHJpbWFyeSBrZXkgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBudWxsCi0gICAgICovCiAgICAgcHVibGljIDxUPiBUIGZpbmQoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIE9iamVjdCBwcmltYXJ5S2V5KTsKIAotICAgIC8qKgotICAgICAqIEZpbmQgYnkgcHJpbWFyeSBrZXkgYW5kIGxvY2suCi0gICAgICogU2VhcmNoIGZvciBhbiBlbnRpdHkgb2YgdGhlIHNwZWNpZmllZCBjbGFzcyBhbmQgcHJpbWFyeSBrZXkKLSAgICAgKiBhbmQgbG9jayBpdCB3aXRoIHJlc3BlY3QgdG8gdGhlIHNwZWNpZmllZCBsb2NrIHR5cGUuCi0gICAgICogSWYgdGhlIGVudGl0eSBpbnN0YW5jZSBpcyBjb250YWluZWQgaW4gdGhlIHBlcnNpc3RlbmNlIGNvbnRleHQKLSAgICAgKiBpdCBpcyByZXR1cm5lZCBmcm9tIHRoZXJlLCBhbmQgdGhlIGVmZmVjdCBvZiB0aGlzIG1ldGhvZCBpcwotICAgICAqIHRoZSBzYW1lIGFzIGlmIHRoZSBsb2NrIG1ldGhvZCBoYWQgYmVlbiBjYWxsZWQgb24gdGhlIGVudGl0eS4KLSAgICAgKiBJZiB0aGUgZW50aXR5IGlzIGZvdW5kIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCBhbmQgdGhlCi0gICAgICogbG9jayBtb2RlIHR5cGUgaXMgcGVzc2ltaXN0aWMgYW5kIHRoZSBlbnRpdHkgaGFzIGEgdmVyc2lvbgotICAgICAqIGF0dHJpYnV0ZSwgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIG11c3QgcGVyZm9ybSBvcHRpbWlzdGljCi0gICAgICogdmVyc2lvbiBjaGVja3Mgd2hlbiBvYnRhaW5pbmcgdGhlIGRhdGFiYXNlIGxvY2suIElmIHRoZXNlCi0gICAgICogY2hlY2tzIGZhaWwsIHRoZSBPcHRpbWlzdGljTG9ja0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiBJZiB0aGUgbG9jayBtb2RlIHR5cGUgaXMgcGVzc2ltaXN0aWMgYW5kIHRoZSBlbnRpdHkgaW5zdGFuY2UKLSAgICAgKiBpcyBmb3VuZCBidXQgY2Fubm90IGJlIGxvY2tlZDoKLSAgICAgKiAtIHRoZSBQZXNzaW1pc3RpY0xvY2tFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGRhdGFiYXNlCi0gICAgICogbG9ja2luZyBmYWlsdXJlIGNhdXNlcyB0cmFuc2FjdGlvbi1sZXZlbCByb2xsYmFjay4KLSAgICAgKiAtIHRoZSBMb2NrVGltZW91dEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUgZGF0YWJhc2UKLSAgICAgKiBsb2NraW5nIGZhaWx1cmUgY2F1c2VzIG9ubHkgc3RhdGVtZW50LWxldmVsIHJvbGxiYWNrCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW50aXR5Q2xhc3MKLSAgICAgKiBAcGFyYW0gcHJpbWFyeUtleQotICAgICAqIEBwYXJhbSBsb2NrTW9kZQotICAgICAqIEByZXR1cm4gdGhlIGZvdW5kIGVudGl0eSBpbnN0YW5jZSBvciBudWxsIGlmIHRoZSBlbnRpdHkgZG9lcwotICAgICAqICAgICAgICAgbm90IGV4aXN0Ci0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gICAgIGlmIHRoZSBmaXJzdCBhcmd1bWVudCBkb2VzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBkZW5vdGUgYW4gZW50aXR5IHR5cGUgb3IgdGhlIHNlY29uZCBhcmd1bWVudCBpcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYSB2YWxpZCB0eXBlIGZvciB0aGF0IGVudGl0eSdzIHByaW1hcnkga2V5IG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG51bGwKLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24gYW5kIGEgbG9jayBtb2RlIG90aGVyIHRoYW4gTk9ORSBpcyBzZXQKLSAgICAgKiBAdGhyb3dzIE9wdGltaXN0aWNMb2NrRXhjZXB0aW9uICAgICAgaWYgdGhlIG9wdGltaXN0aWMgdmVyc2lvbgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjayBmYWlscwotICAgICAqIEB0aHJvd3MgUGVzc2ltaXN0aWNMb2NrRXhjZXB0aW9uICAgICBpZiBwZXNzaW1pc3RpYyBsb2NraW5nCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxzIGFuZCB0aGUgdHJhbnNhY3Rpb24gaXMgcm9sbGVkIGJhY2sKLSAgICAgKiBAdGhyb3dzIExvY2tUaW1lb3V0RXhjZXB0aW9uICAgICAgICAgaWYgcGVzc2ltaXN0aWMgbG9ja2luZyBmYWlscyBhbmQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSB0aGUgc3RhdGVtZW50IGlzIHJvbGxlZCBiYWNrCi0gICAgICogQHRocm93cyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbiAgICAgICAgIGlmIGFuIHVuc3VwcG9ydGVkIGxvY2sgY2FsbAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBtYWRlCi0gICAgICovCiAgICAgcHVibGljIDxUPiBUIGZpbmQoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIE9iamVjdCBwcmltYXJ5S2V5LAogICAgICAgICAgICAgICAgICAgICAgIExvY2tNb2RlVHlwZSBsb2NrTW9kZSk7CiAKLSAgICAvKioKLSAgICAgKiBGaW5kIGJ5IHByaW1hcnkga2V5IGFuZCBsb2NrLCB1c2luZyBzcGVjaWZpZWQgcHJvcGVydGllcy4KLSAgICAgKiBTZWFyY2ggZm9yIGFuIGVudGl0eSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzIGFuZCBwcmltYXJ5IGtleQotICAgICAqIGFuZCBsb2NrIGl0IHdpdGggcmVzcGVjdCB0byB0aGUgc3BlY2lmaWVkIGxvY2sgdHlwZS4KLSAgICAgKiBJZiB0aGUgZW50aXR5IGluc3RhbmNlIGlzIGNvbnRhaW5lZCBpbiB0aGUgcGVyc2lzdGVuY2UgY29udGV4dAotICAgICAqIGl0IGlzIHJldHVybmVkIGZyb20gdGhlcmUuIElmIHRoZSBlbnRpdHkgaXMgZm91bmQKLSAgICAgKiB3aXRoaW4gdGhlIHBlcnNpc3RlbmNlIGNvbnRleHQgYW5kIHRoZSBsb2NrIG1vZGUgdHlwZQotICAgICAqIGlzIHBlc3NpbWlzdGljIGFuZCB0aGUgZW50aXR5IGhhcyBhIHZlcnNpb24gYXR0cmlidXRlLCB0aGUKLSAgICAgKiBwZXJzaXN0ZW5jZSBwcm92aWRlciBtdXN0IHBlcmZvcm0gb3B0aW1pc3RpYyB2ZXJzaW9uIGNoZWNrcwotICAgICAqIHdoZW4gb2J0YWluaW5nIHRoZSBkYXRhYmFzZSBsb2NrLiBJZiB0aGVzZSBjaGVja3MgZmFpbCwKLSAgICAgKiB0aGUgT3B0aW1pc3RpY0xvY2tFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICogSWYgdGhlIGxvY2sgbW9kZSB0eXBlIGlzIHBlc3NpbWlzdGljIGFuZCB0aGUgZW50aXR5IGluc3RhbmNlCi0gICAgICogaXMgZm91bmQgYnV0IGNhbm5vdCBiZSBsb2NrZWQ6Ci0gICAgICogLSB0aGUgUGVzc2ltaXN0aWNMb2NrRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBkYXRhYmFzZQotICAgICAqIGxvY2tpbmcgZmFpbHVyZSBjYXVzZXMgdHJhbnNhY3Rpb24tbGV2ZWwgcm9sbGJhY2suCi0gICAgICogLSB0aGUgTG9ja1RpbWVvdXRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGRhdGFiYXNlCi0gICAgICogbG9ja2luZyBmYWlsdXJlIGNhdXNlcyBvbmx5IHN0YXRlbWVudC1sZXZlbCByb2xsYmFjawotICAgICAqIElmIGEgdmVuZG9yLXNwZWNpZmljIHByb3BlcnR5IG9yIGhpbnQgaXMgbm90IHJlY29nbml6ZWQsCi0gICAgICogaXQgaXMgc2lsZW50bHkgaWdub3JlZC4KLSAgICAgKiBQb3J0YWJsZSBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCByZWx5IG9uIHRoZSBzdGFuZGFyZCB0aW1lb3V0Ci0gICAgICogaGludC4gRGVwZW5kaW5nIG9uIHRoZSBkYXRhYmFzZSBpbiB1c2UgYW5kIHRoZSBsb2NraW5nCi0gICAgICogbWVjaGFuaXNtcyB1c2VkIGJ5IHRoZSBwcm92aWRlciwgdGhlIGhpbnQgbWF5IG9yIG1heSBub3QKLSAgICAgKiBiZSBvYnNlcnZlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRpdHlDbGFzcwotICAgICAqIEBwYXJhbSBwcmltYXJ5S2V5Ci0gICAgICogQHBhcmFtIGxvY2tNb2RlCi0gICAgICogQHBhcmFtIHByb3BlcnRpZXMgIHN0YW5kYXJkIGFuZCB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydGllcwotICAgICAqICAgICAgICAgICAgICAgICAgICBhbmQgaGludHMKLSAgICAgKiBAcmV0dXJuIHRoZSBmb3VuZCBlbnRpdHkgaW5zdGFuY2Ugb3IgbnVsbCBpZiB0aGUgZW50aXR5IGRvZXMKLSAgICAgKiAgICAgICAgIG5vdCBleGlzdAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAgICBpZiB0aGUgZmlyc3QgYXJndW1lbnQgZG9lcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgZGVub3RlIGFuIGVudGl0eSB0eXBlIG9yIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgdmFsaWQgdHlwZSBmb3IgdGhhdCBlbnRpdHkncyBwcmltYXJ5IGtleSBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBudWxsCi0gICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uIGFuZCBhIGxvY2sgbW9kZSBvdGhlciB0aGFuIE5PTkUgaXMgc2V0Ci0gICAgICogQHRocm93cyBPcHRpbWlzdGljTG9ja0V4Y2VwdGlvbiAgICAgIGlmIHRoZSBvcHRpbWlzdGljIHZlcnNpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2sgZmFpbHMKLSAgICAgKiBAdGhyb3dzIFBlc3NpbWlzdGljTG9ja0V4Y2VwdGlvbiAgICAgaWYgcGVzc2ltaXN0aWMgbG9ja2luZwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlscyBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZCBiYWNrCi0gICAgICogQHRocm93cyBMb2NrVGltZW91dEV4Y2VwdGlvbiAgICAgICAgIGlmIHBlc3NpbWlzdGljIGxvY2tpbmcgZmFpbHMgYW5kCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgdGhlIHN0YXRlbWVudCBpcyByb2xsZWQgYmFjawotICAgICAqIEB0aHJvd3MgUGVyc2lzdGVuY2VFeGNlcHRpb24gICAgICAgICBpZiBhbiB1bnN1cHBvcnRlZCBsb2NrIGNhbGwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbWFkZQotICAgICAqLwogICAgIHB1YmxpYyA8VD4gVCBmaW5kKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBPYmplY3QgcHJpbWFyeUtleSwKICAgICAgICAgICAgICAgICAgICAgICBMb2NrTW9kZVR5cGUgbG9ja01vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsKIAotICAgIC8qKgotICAgICAqIEdldCBhbiBpbnN0YW5jZSwgd2hvc2Ugc3RhdGUgbWF5IGJlIGxhemlseSBmZXRjaGVkLgotICAgICAqIElmIHRoZSByZXF1ZXN0ZWQgaW5zdGFuY2UgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLAotICAgICAqIHRoZSBFbnRpdHlOb3RGb3VuZEV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiB0aGUgaW5zdGFuY2UKLSAgICAgKiBzdGF0ZSBpcyBmaXJzdCBhY2Nlc3NlZC4gKFRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIGlzCi0gICAgICogcGVybWl0dGVkIHRvIHRocm93IHRoZSBFbnRpdHlOb3RGb3VuZEV4Y2VwdGlvbiB3aGVuCi0gICAgICogZ2V0UmVmZXJlbmNlIGlzIGNhbGxlZC4pCi0gICAgICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgZXhwZWN0IHRoYXQgdGhlIGluc3RhbmNlIHN0YXRlIHdpbGwKLSAgICAgKiBiZSBhdmFpbGFibGUgdXBvbiBkZXRhY2htZW50LCB1bmxlc3MgaXQgd2FzIGFjY2Vzc2VkIGJ5IHRoZQotICAgICAqIGFwcGxpY2F0aW9uIHdoaWxlIHRoZSBlbnRpdHkgbWFuYWdlciB3YXMgb3Blbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRpdHlDbGFzcwotICAgICAqIEBwYXJhbSBwcmltYXJ5S2V5Ci0gICAgICogQHJldHVybiB0aGUgZm91bmQgZW50aXR5IGluc3RhbmNlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGRvZXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgZGVub3RlIGFuIGVudGl0eSB0eXBlIG9yIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYSB2YWxpZCB0eXBlIGZvciB0aGF0IGVudGl0eZJzIHByaW1hcnkga2V5IG9yCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbnVsbAotICAgICAqIEB0aHJvd3MgRW50aXR5Tm90Rm91bmRFeGNlcHRpb24gIGlmIHRoZSBlbnRpdHkgc3RhdGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5ub3QgYmUgYWNjZXNzZWQKLSAgICAgKi8KICAgICBwdWJsaWMgPFQ+IFQgZ2V0UmVmZXJlbmNlKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBPYmplY3QgcHJpbWFyeUtleSk7CiAKLSAgICAvKioKLSAgICAgKiBTeW5jaHJvbml6ZSB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCB0byB0aGUKLSAgICAgKiB1bmRlcmx5aW5nIGRhdGFiYXNlLgotICAgICAqCi0gICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uIGlmIHRoZXJlIGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIHRyYW5zYWN0aW9uCi0gICAgICogQHRocm93cyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbiAgICAgICAgIGlmIHRoZSBmbHVzaCBmYWlscwotICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGZsdXNoKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGZsdXNoIG1vZGUgdGhhdCBhcHBsaWVzIHRvIGFsbCBvYmplY3RzIGNvbnRhaW5lZAotICAgICAqIGluIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIGZsdXNoTW9kZQotICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZsdXNoTW9kZShGbHVzaE1vZGVUeXBlIGZsdXNoTW9kZSk7CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGZsdXNoIG1vZGUgdGhhdCBhcHBsaWVzIHRvIGFsbCBvYmplY3RzIGNvbnRhaW5lZAotICAgICAqIGluIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0LgotICAgICAqCi0gICAgICogQHJldHVybiBmbHVzaE1vZGUKLSAgICAgKi8KICAgICBwdWJsaWMgRmx1c2hNb2RlVHlwZSBnZXRGbHVzaE1vZGUoKTsKIAotICAgIC8qKgotICAgICAqIExvY2sgYW4gZW50aXR5IGluc3RhbmNlIHRoYXQgaXMgY29udGFpbmVkIGluIHRoZSBwZXJzaXN0ZW5jZQotICAgICAqIGNvbnRleHQgd2l0aCB0aGUgc3BlY2lmaWVkIGxvY2sgbW9kZSB0eXBlLgotICAgICAqIElmIGEgcGVzc2ltaXN0aWMgbG9jayBtb2RlIHR5cGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgZW50aXR5Ci0gICAgICogY29udGFpbnMgYSB2ZXJzaW9uIGF0dHJpYnV0ZSwgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIG11c3QKLSAgICAgKiBhbHNvIHBlcmZvcm0gb3B0aW1pc3RpYyB2ZXJzaW9uIGNoZWNrcyB3aGVuIG9idGFpbmluZyB0aGUKLSAgICAgKiBkYXRhYmFzZSBsb2NrLiBJZiB0aGVzZSBjaGVja3MgZmFpbCwgdGhlCi0gICAgICogT3B0aW1pc3RpY0xvY2tFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICogSWYgdGhlIGxvY2sgbW9kZSB0eXBlIGlzIHBlc3NpbWlzdGljIGFuZCB0aGUgZW50aXR5IGluc3RhbmNlCi0gICAgICogaXMgZm91bmQgYnV0IGNhbm5vdCBiZSBsb2NrZWQ6Ci0gICAgICogLSB0aGUgUGVzc2ltaXN0aWNMb2NrRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBkYXRhYmFzZQotICAgICAqIGxvY2tpbmcgZmFpbHVyZSBjYXVzZXMgdHJhbnNhY3Rpb24tbGV2ZWwgcm9sbGJhY2suCi0gICAgICogLSB0aGUgTG9ja1RpbWVvdXRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGRhdGFiYXNlCi0gICAgICogbG9ja2luZyBmYWlsdXJlIGNhdXNlcyBvbmx5IHN0YXRlbWVudC1sZXZlbCByb2xsYmFjawotICAgICAqCi0gICAgICogQHBhcmFtIGVudGl0eQotICAgICAqIEBwYXJhbSBsb2NrTW9kZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAgICBpZiB0aGUgaW5zdGFuY2UgaXMgbm90IGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSBvciBpcyBhIGRldGFjaGVkIGVudGl0eQotICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbgotICAgICAqIEB0aHJvd3MgRW50aXR5Tm90Rm91bmRFeGNlcHRpb24gICAgICBpZiB0aGUgZW50aXR5IGRvZXMgbm90IGV4aXN0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBkYXRhYmFzZSB3aGVuIHBlc3NpbWlzdGljIGxvY2tpbmcgaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkCi0gICAgICogQHRocm93cyBPcHRpbWlzdGljTG9ja0V4Y2VwdGlvbiAgICAgIGlmIHRoZSBvcHRpbWlzdGljIHZlcnNpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2sgZmFpbHMKLSAgICAgKiBAdGhyb3dzIFBlc3NpbWlzdGljTG9ja0V4Y2VwdGlvbiAgICAgaWYgcGVzc2ltaXN0aWMgbG9ja2luZyBmYWlscwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZCBiYWNrCi0gICAgICogQHRocm93cyBMb2NrVGltZW91dEV4Y2VwdGlvbiAgICAgICAgIGlmIHBlc3NpbWlzdGljIGxvY2tpbmcgZmFpbHMgYW5kCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgdGhlIHN0YXRlbWVudCBpcyByb2xsZWQgYmFjawotICAgICAqIEB0aHJvd3MgUGVyc2lzdGVuY2VFeGNlcHRpb24gICAgICAgICBpZiBhbiB1bnN1cHBvcnRlZCBsb2NrIGNhbGwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbWFkZQotICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGxvY2soT2JqZWN0IGVudGl0eSwgTG9ja01vZGVUeXBlIGxvY2tNb2RlKTsKIAotICAgIC8qKgotICAgICAqIExvY2sgYW4gZW50aXR5IGluc3RhbmNlIHRoYXQgaXMgY29udGFpbmVkIGluIHRoZSBwZXJzaXN0ZW5jZQotICAgICAqIGNvbnRleHQgd2l0aCB0aGUgc3BlY2lmaWVkIGxvY2sgbW9kZSB0eXBlIGFuZCB3aXRoIHNwZWNpZmllZAotICAgICAqIHByb3BlcnRpZXMuCi0gICAgICogSWYgYSBwZXNzaW1pc3RpYyBsb2NrIG1vZGUgdHlwZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBlbnRpdHkKLSAgICAgKiBjb250YWlucyBhIHZlcnNpb24gYXR0cmlidXRlLCB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgbXVzdAotICAgICAqIGFsc28gcGVyZm9ybSBvcHRpbWlzdGljIHZlcnNpb24gY2hlY2tzIHdoZW4gb2J0YWluaW5nIHRoZQotICAgICAqIGRhdGFiYXNlIGxvY2suIElmIHRoZXNlIGNoZWNrcyBmYWlsLCB0aGUKLSAgICAgKiBPcHRpbWlzdGljTG9ja0V4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgKiBJZiB0aGUgbG9jayBtb2RlIHR5cGUgaXMgcGVzc2ltaXN0aWMgYW5kIHRoZSBlbnRpdHkgaW5zdGFuY2UKLSAgICAgKiBpcyBmb3VuZCBidXQgY2Fubm90IGJlIGxvY2tlZDoKLSAgICAgKiAtIHRoZSBQZXNzaW1pc3RpY0xvY2tFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGRhdGFiYXNlCi0gICAgICogbG9ja2luZyBmYWlsdXJlIGNhdXNlcyB0cmFuc2FjdGlvbi1sZXZlbCByb2xsYmFjay4KLSAgICAgKiAtIHRoZSBMb2NrVGltZW91dEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUgZGF0YWJhc2UKLSAgICAgKiBsb2NraW5nIGZhaWx1cmUgY2F1c2VzIG9ubHkgc3RhdGVtZW50LWxldmVsIHJvbGxiYWNrCi0gICAgICogSWYgYSB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydHkgb3IgaGludCBpcyBub3QgcmVjb2duaXplZCwKLSAgICAgKiBpdCBpcyBzaWxlbnRseSBpZ25vcmVkLgotICAgICAqIFBvcnRhYmxlIGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IHJlbHkgb24gdGhlIHN0YW5kYXJkIHRpbWVvdXQKLSAgICAgKiBoaW50LiBEZXBlbmRpbmcgb24gdGhlIGRhdGFiYXNlIGluIHVzZSBhbmQgdGhlIGxvY2tpbmcKLSAgICAgKiBtZWNoYW5pc21zIHVzZWQgYnkgdGhlIHByb3ZpZGVyLCB0aGUgaGludCBtYXkgb3IgbWF5IG5vdAotICAgICAqIGJlIG9ic2VydmVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGVudGl0eQotICAgICAqIEBwYXJhbSBsb2NrTW9kZQotICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIHN0YW5kYXJkIGFuZCB2ZW5kb3Itc3BlY2lmaWMgcHJvcGVydGllcwotICAgICAqICAgICAgICAgICAgICAgICAgIGFuZCBoaW50cwotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAgICBpZiB0aGUgaW5zdGFuY2UgaXMgbm90IGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSBvciBpcyBhIGRldGFjaGVkIGVudGl0eQotICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbgotICAgICAqIEB0aHJvd3MgRW50aXR5Tm90Rm91bmRFeGNlcHRpb24gICAgICBpZiB0aGUgZW50aXR5IGRvZXMgbm90IGV4aXN0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBkYXRhYmFzZSB3aGVuIHBlc3NpbWlzdGljIGxvY2tpbmcgaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkCi0gICAgICogQHRocm93cyBPcHRpbWlzdGljTG9ja0V4Y2VwdGlvbiAgICAgIGlmIHRoZSBvcHRpbWlzdGljIHZlcnNpb24KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2sgZmFpbHMKLSAgICAgKiBAdGhyb3dzIFBlc3NpbWlzdGljTG9ja0V4Y2VwdGlvbiAgICAgaWYgcGVzc2ltaXN0aWMgbG9ja2luZyBmYWlscwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZCBiYWNrCi0gICAgICogQHRocm93cyBMb2NrVGltZW91dEV4Y2VwdGlvbiAgICAgICAgIGlmIHBlc3NpbWlzdGljIGxvY2tpbmcgZmFpbHMgYW5kCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgdGhlIHN0YXRlbWVudCBpcyByb2xsZWQgYmFjawotICAgICAqIEB0aHJvd3MgUGVyc2lzdGVuY2VFeGNlcHRpb24gICAgICAgICBpZiBhbiB1bnN1cHBvcnRlZCBsb2NrIGNhbGwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbWFkZQotICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGxvY2soT2JqZWN0IGVudGl0eSwgTG9ja01vZGVUeXBlIGxvY2tNb2RlLAogICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKTsKIAotICAgIC8qKgotICAgICAqIFJlZnJlc2ggdGhlIHN0YXRlIG9mIHRoZSBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSwKLSAgICAgKiBvdmVyd3JpdGluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIGVudGl0eSwgaWYgYW55LgotICAgICAqCi0gICAgICogQHBhcmFtIGVudGl0eQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICAgICBpZiB0aGUgaW5zdGFuY2UgaXMgbm90Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGVudGl0eSBvciB0aGUgZW50aXR5IGlzIG5vdCBtYW5hZ2VkCi0gICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uIGlmIGludm9rZWQgb24gYQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXItbWFuYWdlZCBlbnRpdHkgbWFuYWdlciBvZiB0eXBlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUuVFJBTlNBQ1RJT04gYW5kIHRoZXJlIGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIHRyYW5zYWN0aW9uLgotICAgICAqIEB0aHJvd3MgRW50aXR5Tm90Rm91bmRFeGNlcHRpb24gICAgICBpZiB0aGUgZW50aXR5IG5vIGxvbmdlcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMgaW4gdGhlIGRhdGFiYXNlCi0gICAgICovCiAgICAgcHVibGljIHZvaWQgcmVmcmVzaChPYmplY3QgZW50aXR5KTsKIAotICAgIC8qKgotICAgICAqIFJlZnJlc2ggdGhlIHN0YXRlIG9mIHRoZSBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSwKLSAgICAgKiBvdmVyd3JpdGluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIGVudGl0eSwgaWYgYW55LCBhbmQKLSAgICAgKiBsb2NrIGl0IHdpdGggcmVzcGVjdCB0byBnaXZlbiBsb2NrIG1vZGUgdHlwZS4KLSAgICAgKiBJZiB0aGUgbG9jayBtb2RlIHR5cGUgaXMgcGVzc2ltaXN0aWMgYW5kIHRoZSBlbnRpdHkgaW5zdGFuY2UKLSAgICAgKiBpcyBmb3VuZCBidXQgY2Fubm90IGJlIGxvY2tlZDoKLSAgICAgKiAtIHRoZSBQZXNzaW1pc3RpY0xvY2tFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGRhdGFiYXNlCi0gICAgICogbG9ja2luZyBmYWlsdXJlIGNhdXNlcyB0cmFuc2FjdGlvbi1sZXZlbCByb2xsYmFjay4KLSAgICAgKiAtIHRoZSBMb2NrVGltZW91dEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB0aGUKLSAgICAgKiBkYXRhYmFzZSBsb2NraW5nIGZhaWx1cmUgY2F1c2VzIG9ubHkgc3RhdGVtZW50LWxldmVsCi0gICAgICogcm9sbGJhY2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW50aXR5Ci0gICAgICogQHBhcmFtIGxvY2tNb2RlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gICAgIGlmIHRoZSBpbnN0YW5jZSBpcyBub3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gZW50aXR5IG9yIHRoZSBlbnRpdHkgaXMgbm90IG1hbmFnZWQKLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24KLSAgICAgKiBAdGhyb3dzIEVudGl0eU5vdEZvdW5kRXhjZXB0aW9uICAgICAgaWYgdGhlIGVudGl0eSBubyBsb25nZXIgZXhpc3RzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBkYXRhYmFzZQotICAgICAqIEB0aHJvd3MgUGVzc2ltaXN0aWNMb2NrRXhjZXB0aW9uICAgICBpZiBwZXNzaW1pc3RpYyBsb2NraW5nIGZhaWxzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdHJhbnNhY3Rpb24gaXMgcm9sbGVkIGJhY2sKLSAgICAgKiBAdGhyb3dzIExvY2tUaW1lb3V0RXhjZXB0aW9uICAgICAgICAgaWYgcGVzc2ltaXN0aWMgbG9ja2luZyBmYWlscyBhbmQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSB0aGUgc3RhdGVtZW50IGlzIHJvbGxlZCBiYWNrCi0gICAgICogQHRocm93cyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbiAgICAgICAgIGlmIGFuIHVuc3VwcG9ydGVkIGxvY2sgY2FsbAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBtYWRlCi0gICAgICovCiAgICAgcHVibGljIHZvaWQgcmVmcmVzaChPYmplY3QgZW50aXR5LCBMb2NrTW9kZVR5cGUgbG9ja01vZGUpOwogCi0gICAgLyoqCi0gICAgICogUmVmcmVzaCB0aGUgc3RhdGUgb2YgdGhlIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlLAotICAgICAqIG92ZXJ3cml0aW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgZW50aXR5LCBpZiBhbnksIGFuZAotICAgICAqIGxvY2sgaXQgd2l0aCByZXNwZWN0IHRvIGdpdmVuIGxvY2sgbW9kZSB0eXBlIGFuZCB3aXRoCi0gICAgICogc3BlY2lmaWVkIHByb3BlcnRpZXMuCi0gICAgICogSWYgdGhlIGxvY2sgbW9kZSB0eXBlIGlzIHBlc3NpbWlzdGljIGFuZCB0aGUgZW50aXR5IGluc3RhbmNlCi0gICAgICogaXMgZm91bmQgYnV0IGNhbm5vdCBiZSBsb2NrZWQ6Ci0gICAgICogLSB0aGUgUGVzc2ltaXN0aWNMb2NrRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBkYXRhYmFzZQotICAgICAqIGxvY2tpbmcgZmFpbHVyZSBjYXVzZXMgdHJhbnNhY3Rpb24tbGV2ZWwgcm9sbGJhY2suCi0gICAgICogLSB0aGUgTG9ja1RpbWVvdXRFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGRhdGFiYXNlCi0gICAgICogbG9ja2luZyBmYWlsdXJlIGNhdXNlcyBvbmx5IHN0YXRlbWVudC1sZXZlbCByb2xsYmFjawotICAgICAqIElmIGEgdmVuZG9yLXNwZWNpZmljIHByb3BlcnR5IG9yIGhpbnQgaXMgbm90IHJlY29nbml6ZWQsCi0gICAgICogaXQgaXMgc2lsZW50bHkgaWdub3JlZC4KLSAgICAgKiBQb3J0YWJsZSBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCByZWx5IG9uIHRoZSBzdGFuZGFyZCB0aW1lb3V0Ci0gICAgICogaGludC4gRGVwZW5kaW5nIG9uIHRoZSBkYXRhYmFzZSBpbiB1c2UgYW5kIHRoZSBsb2NraW5nCi0gICAgICogbWVjaGFuaXNtcyB1c2VkIGJ5IHRoZSBwcm92aWRlciwgdGhlIGhpbnQgbWF5IG9yIG1heSBub3QKLSAgICAgKiBiZSBvYnNlcnZlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRpdHkKLSAgICAgKiBAcGFyYW0gbG9ja01vZGUKLSAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBzdGFuZGFyZCBhbmQgdmVuZG9yLXNwZWNpZmljIHByb3BlcnRpZXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICBhbmQgaGludHMKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgICAgaWYgdGhlIGluc3RhbmNlIGlzIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBlbnRpdHkgb3IgdGhlIGVudGl0eSBpcyBub3QgbWFuYWdlZAotICAgICAqIEB0aHJvd3MgVHJhbnNhY3Rpb25SZXF1aXJlZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbgotICAgICAqIEB0aHJvd3MgRW50aXR5Tm90Rm91bmRFeGNlcHRpb24gICAgICBpZiB0aGUgZW50aXR5IG5vIGxvbmdlciBleGlzdHMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGRhdGFiYXNlCi0gICAgICogQHRocm93cyBQZXNzaW1pc3RpY0xvY2tFeGNlcHRpb24gICAgIGlmIHBlc3NpbWlzdGljIGxvY2tpbmcgZmFpbHMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSB0cmFuc2FjdGlvbiBpcyByb2xsZWQgYmFjawotICAgICAqIEB0aHJvd3MgTG9ja1RpbWVvdXRFeGNlcHRpb24gICAgICAgICBpZiBwZXNzaW1pc3RpYyBsb2NraW5nIGZhaWxzIGFuZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IHRoZSBzdGF0ZW1lbnQgaXMgcm9sbGVkIGJhY2sKLSAgICAgKiBAdGhyb3dzIFBlcnNpc3RlbmNlRXhjZXB0aW9uICAgICAgICAgaWYgYW4gdW5zdXBwb3J0ZWQgbG9jayBjYWxsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG1hZGUKLSAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWZyZXNoKE9iamVjdCBlbnRpdHksIExvY2tNb2RlVHlwZSBsb2NrTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyk7CiAKLSAgICAvKioKLSAgICAgKiBDbGVhciB0aGUgcGVyc2lzdGVuY2UgY29udGV4dCwgY2F1c2luZyBhbGwgbWFuYWdlZAotICAgICAqIGVudGl0aWVzIHRvIGJlY29tZSBkZXRhY2hlZC4gQ2hhbmdlcyBtYWRlIHRvIGVudGl0aWVzIHRoYXQKLSAgICAgKiBoYXZlIG5vdCBiZWVuIGZsdXNoZWQgdG8gdGhlIGRhdGFiYXNlIHdpbGwgbm90IGJlCi0gICAgICogcGVyc2lzdGVkLgotICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGdpdmVuIGVudGl0eSBmcm9tIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0LCBjYXVzaW5nCi0gICAgICogYSBtYW5hZ2VkIGVudGl0eSB0byBiZWNvbWUgZGV0YWNoZWQuIFVuZmx1c2hlZCBjaGFuZ2VzIG1hZGUKLSAgICAgKiB0byB0aGUgZW50aXR5IGlmIGFueSAoaW5jbHVkaW5nIHJlbW92YWwgb2YgdGhlIGVudGl0eSksCi0gICAgICogd2lsbCBub3QgYmUgc3luY2hyb25pemVkIHRvIHRoZSBkYXRhYmFzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbnRpdHkKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5zdGFuY2UgaXMgbm90IGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5Ci0gICAgICovCiAgICAgcHVibGljIHZvaWQgY2xlYXIoT2JqZWN0IGVudGl0eSk7CiAKLSAgICAvLyAgICBPcGVuIElzc3VlOiBBbHRlcm5hdGl2ZSBuYW1lcyBmb3IgdGhpcyBtZXRob2QgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGNhc2NhZGUgb3B0aW9uLgotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoZSBpbnN0YW5jZSBpcyBhIG1hbmFnZWQgZW50aXR5IGluc3RhbmNlIGJlbG9uZ2luZwotICAgICAqIHRvIHRoZSBjdXJyZW50IHBlcnNpc3RlbmNlIGNvbnRleHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW50aXR5Ci0gICAgICogQHJldHVybgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5vdCBhbiBlbnRpdHkKLSAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgZW50aXR5KTsKIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgY3VycmVudCBsb2NrIG1vZGUgZm9yIHRoZSBlbnRpdHkgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZW50aXR5Ci0gICAgICogQHJldHVybiBsb2NrIG1vZGUKLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgICAgaWYgdGhlIGluc3RhbmNlIGlzIG5vdCBhCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZWQgZW50aXR5IGFuZCBhIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZQotICAgICAqLwogICAgIHB1YmxpYyBMb2NrTW9kZVR5cGUgZ2V0TG9ja01vZGUoT2JqZWN0IGVudGl0eSk7CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHByb3BlcnRpZXMgYW5kIGFzc29jaWF0ZWQgdmFsdWVzIHRoYXQgYXJlIGluIGVmZmVjdAotICAgICAqIGZvciB0aGUgZW50aXR5IG1hbmFnZXIuIENoYW5naW5nIHRoZSBjb250ZW50cyBvZiB0aGUgbWFwIGRvZXMKLSAgICAgKiBub3QgY2hhbmdlIHRoZSBjb25maWd1cmF0aW9uIGluIGVmZmVjdC4KLSAgICAgKi8KICAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCk7CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHN1cHBvcnRlZCBmb3IgdXNlCi0gICAgICogd2l0aCB0aGUgZW50aXR5IG1hbmFnZXIuCi0gICAgICogVGhlc2UgY29ycmVzcG9uZCB0byBwcm9wZXJ0aWVzIGFuZCBoaW50cyB0aGF0IG1heSBiZSBwYXNzZWQKLSAgICAgKiB0byB0aGUgbWV0aG9kcyBvZiB0aGUgRW50aXR5TWFuYWdlciBpbnRlcmZhY2UgdGhhdCB0YWtlIGEKLSAgICAgKiBwcm9wZXJ0aWVzIGFyZ3VtZW50IG9yIHVzZWQgd2l0aCB0aGUgUGVyc2lzdGVuY2VDb250ZXh0Ci0gICAgICogYW5ub3RhdGlvbi4gVGhlc2UgcHJvcGVydGllcyBpbmNsdWRlIGFsbCBzdGFuZGFyZCBlbnRpdHkKLSAgICAgKiBtYW5hZ2VyIGhpbnRzIGFuZCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgdmVuZG9yLXNwZWNpZmljIG9uZXMKLSAgICAgKiBzdXBwb3J0ZWQgYnkgdGhlIHByb3ZpZGVyLiBUaGVzZSBwcm9wZXJ0aWVzIG1heSBvciBtYXkgbm90Ci0gICAgICogY3VycmVudGx5IGJlIGluIGVmZmVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcHJvcGVydHkgbmFtZXMKLSAgICAgKi8KICAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0U3VwcG9ydGVkUHJvcGVydGllcygpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFF1ZXJ5IGZvciBleGVjdXRpbmcgYQotICAgICAqIEphdmEgUGVyc2lzdGVuY2UgcXVlcnkgbGFuZ3VhZ2Ugc3RhdGVtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHFsU3RyaW5nIGEgSmF2YSBQZXJzaXN0ZW5jZSBxdWVyeSBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgcXVlcnkgaW5zdGFuY2UKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgc3RyaW5nIGlzIGZvdW5kCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgaW52YWxpZAotICAgICAqLwogICAgIHB1YmxpYyBRdWVyeSBjcmVhdGVRdWVyeShTdHJpbmcgcWxTdHJpbmcpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFF1ZXJ5IGZvciBleGVjdXRpbmcgYQotICAgICAqIGNyaXRlcmlhIHF1ZXJ5LgotICAgICAqCi0gICAgICogQHBhcmFtIHFkZWYgYSBDcml0ZXJpYSBBUEkgcXVlcnkgZGVmaW5pdGlvbiBvYmplY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgcXVlcnkgaW5zdGFuY2UKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcXVlcnkgZGVmaW5pdGlvbiBpcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kIHRvIGJlIGludmFsaWQKLSAgICAgKi8KICAgICBwdWJsaWMgUXVlcnkgY3JlYXRlUXVlcnkoUXVlcnlEZWZpbml0aW9uIHFkZWYpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFF1ZXJ5IGZvciBleGVjdXRpbmcgYQotICAgICAqIG5hbWVkIHF1ZXJ5IChpbiB0aGUgSmF2YSBQZXJzaXN0ZW5jZSBxdWVyeSBsYW5ndWFnZQotICAgICAqIG9yIGluIG5hdGl2ZSBTUUwpLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYSBxdWVyeSBkZWZpbmVkIGluIG1ldGFkYXRhCi0gICAgICogQHJldHVybiB0aGUgbmV3IHF1ZXJ5IGluc3RhbmNlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYSBxdWVyeSBoYXMgbm90IGJlZW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIHdpdGggdGhlIGdpdmVuIG5hbWUgb3IgaWYgdGhlIHF1ZXJ5IHN0cmluZyBpcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kIHRvIGJlIGludmFsaWQKLSAgICAgKi8KICAgICBwdWJsaWMgUXVlcnkgY3JlYXRlTmFtZWRRdWVyeShTdHJpbmcgbmFtZSk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgUXVlcnkgZm9yIGV4ZWN1dGluZwotICAgICAqIGEgbmF0aXZlIFNRTCBzdGF0ZW1lbnQsIGUuZy4sIGZvciB1cGRhdGUgb3IgZGVsZXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIHNxbFN0cmluZyBhIG5hdGl2ZSBTUUwgcXVlcnkgc3RyaW5nCi0gICAgICogQHJldHVybiB0aGUgbmV3IHF1ZXJ5IGluc3RhbmNlCi0gICAgICovCiAgICAgcHVibGljIFF1ZXJ5IGNyZWF0ZU5hdGl2ZVF1ZXJ5KFN0cmluZyBzcWxTdHJpbmcpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFF1ZXJ5IGZvciBleGVjdXRpbmcKLSAgICAgKiBhIG5hdGl2ZSBTUUwgcXVlcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3FsU3RyaW5nICAgYSBuYXRpdmUgU1FMIHF1ZXJ5IHN0cmluZwotICAgICAqIEBwYXJhbSByZXN1bHRDbGFzcyB0aGUgY2xhc3Mgb2YgdGhlIHJlc3VsdGluZyBpbnN0YW5jZShzKQotICAgICAqIEByZXR1cm4gdGhlIG5ldyBxdWVyeSBpbnN0YW5jZQotICAgICAqLwogICAgIHB1YmxpYyBRdWVyeSBjcmVhdGVOYXRpdmVRdWVyeShTdHJpbmcgc3FsU3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyByZXN1bHRDbGFzcyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgUXVlcnkgZm9yIGV4ZWN1dGluZwotICAgICAqIGEgbmF0aXZlIFNRTCBxdWVyeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzcWxTdHJpbmcgICAgICAgIGEgbmF0aXZlIFNRTCBxdWVyeSBzdHJpbmcKLSAgICAgKiBAcGFyYW0gcmVzdWx0U2V0TWFwcGluZyB0aGUgbmFtZSBvZiB0aGUgcmVzdWx0IHNldCBtYXBwaW5nCi0gICAgICogQHJldHVybiB0aGUgbmV3IHF1ZXJ5IGluc3RhbmNlCi0gICAgICovCiAgICAgcHVibGljIFF1ZXJ5IGNyZWF0ZU5hdGl2ZVF1ZXJ5KFN0cmluZyBzcWxTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKTsKIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRvIHRoZSBFbnRpdHlNYW5hZ2VyIHRoYXQgYSBKVEEgdHJhbnNhY3Rpb24gaXMKLSAgICAgKiBhY3RpdmUuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb24gYSBKVEEgYXBwbGljYXRpb24KLSAgICAgKiBtYW5hZ2VkIEVudGl0eU1hbmFnZXIgdGhhdCB3YXMgY3JlYXRlZCBvdXRzaWRlIHRoZSBzY29wZQotICAgICAqIG9mIHRoZSBhY3RpdmUgdHJhbnNhY3Rpb24gdG8gYXNzb2NpYXRlIGl0IHdpdGggdGhlIGN1cnJlbnQKLSAgICAgKiBKVEEgdHJhbnNhY3Rpb24uCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb24gaWYgdGhlcmUgaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gdHJhbnNhY3Rpb24uCi0gICAgICovCiAgICAgcHVibGljIHZvaWQgam9pblRyYW5zYWN0aW9uKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0byBhbGxvdyBhY2Nlc3MgdG8gdGhlCi0gICAgICogcHJvdmlkZXItc3BlY2lmaWMgQVBJLiBJZiB0aGUgcHJvdmlkZXIncyBFbnRpdHlNYW5hZ2VyCi0gICAgICogaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIGNsYXNzLCB0aGUKLSAgICAgKiBQZXJzaXN0ZW5jZUV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xzIHRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0IHRvIGJlIHJldHVybmVkLiBUaGlzIGlzCi0gICAgICogICAgICAgICAgICBub3JtYWxseSBlaXRoZXIgdGhlIHVuZGVybHlpbmcgRW50aXR5TWFuYWdlciBpbXBsZW1lbnRhdGlvbgotICAgICAqICAgICAgICAgICAgY2xhc3Mgb3IgYW4gaW50ZXJmYWNlIHRoYXQgaXQgaW1wbGVtZW50cy4KLSAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MKLSAgICAgKiBAdGhyb3dzIFBlcnNpc3RlbmNlRXhjZXB0aW9uIGlmIHRoZSBwcm92aWRlciBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCB0aGUgY2FsbC4KLSAgICAgKi8KICAgICBwdWJsaWMgPFQ+IFQgdW53cmFwKENsYXNzPFQ+IGNscyk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIHVuZGVybHlpbmcgcHJvdmlkZXIgb2JqZWN0IGZvciB0aGUgRW50aXR5TWFuYWdlciwKLSAgICAgKiBpZiBhdmFpbGFibGUuIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgaW1wbGVtZW50YXRpb24KLSAgICAgKiBzcGVjaWZpYy4gVGhlIHVud3JhcCBtZXRob2QgaXMgdG8gYmUgcHJlZmVycmVkIGZvciBuZXcKLSAgICAgKiBhcHBsaWNhdGlvbnMuCi0gICAgICovCiAgICAgcHVibGljIE9iamVjdCBnZXREZWxlZ2F0ZSgpOwogCi0gICAgLyoqCi0gICAgICogQ2xvc2UgYW4gYXBwbGljYXRpb24tbWFuYWdlZCBFbnRpdHlNYW5hZ2VyLgotICAgICAqIEFmdGVyIHRoZSBjbG9zZSBtZXRob2QgaGFzIGJlZW4gaW52b2tlZCwgYWxsIG1ldGhvZHMKLSAgICAgKiBvbiB0aGUgRW50aXR5TWFuYWdlciBpbnN0YW5jZSBhbmQgYW55IFF1ZXJ5IG9iamVjdHMgb2J0YWluZWQKLSAgICAgKiBmcm9tIGl0IHdpbGwgdGhyb3cgdGhlIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleGNlcHQKLSAgICAgKiBmb3IgZ2V0UHJvcGVydGllcywgZ2V0U3VwcG9ydGVkUHJvcGVydGllcywgZ2V0VHJhbnNhY3Rpb24sCi0gICAgICogYW5kIGlzT3BlbiAod2hpY2ggd2lsbCByZXR1cm4gZmFsc2UpLgotICAgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBFbnRpdHlNYW5hZ2VyIGlzCi0gICAgICogYXNzb2NpYXRlZCB3aXRoIGFuIGFjdGl2ZSB0cmFuc2FjdGlvbiwgdGhlIHBlcnNpc3RlbmNlCi0gICAgICogY29udGV4dCByZW1haW5zIG1hbmFnZWQgdW50aWwgdGhlIHRyYW5zYWN0aW9uIGNvbXBsZXRlcy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBFbnRpdHlNYW5hZ2VyCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgY29udGFpbmVyLW1hbmFnZWQuCi0gICAgICovCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKTsKIAotICAgIC8qKgotICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBFbnRpdHlNYW5hZ2VyIGlzIG9wZW4uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgdW50aWwgdGhlIEVudGl0eU1hbmFnZXIgaGFzIGJlZW4gY2xvc2VkLgotICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSByZXNvdXJjZS1sZXZlbCB0cmFuc2FjdGlvbiBvYmplY3QuCi0gICAgICogVGhlIEVudGl0eVRyYW5zYWN0aW9uIGluc3RhbmNlIG1heSBiZSB1c2VkIHNlcmlhbGx5IHRvCi0gICAgICogYmVnaW4gYW5kIGNvbW1pdCBtdWx0aXBsZSB0cmFuc2FjdGlvbnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEVudGl0eVRyYW5zYWN0aW9uIGluc3RhbmNlCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgaW52b2tlZCBvbiBhIEpUQQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eU1hbmFnZXIuCi0gICAgICovCiAgICAgcHVibGljIEVudGl0eVRyYW5zYWN0aW9uIGdldFRyYW5zYWN0aW9uKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGVudGl0eSBtYW5hZ2VyIGZhY3RvcnkgZm9yIHRoZSBlbnRpdHkgbWFuYWdlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gRW50aXR5TWFuYWdlckZhY3RvcnkgaW5zdGFuY2UKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZW50aXR5IG1hbmFnZXIgaGFzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVlbiBjbG9zZWQuCi0gICAgICovCiAgICAgcHVibGljIEVudGl0eU1hbmFnZXJGYWN0b3J5IGdldEVudGl0eU1hbmFnZXJGYWN0b3J5KCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgUXVlcnlCdWlsZGVyIGZvciB0aGUgY3JlYXRpb24gb2YKLSAgICAgKiBDcml0ZXJpYSBBUEkgUXVlcnlEZWZpbml0aW9uIG9iamVjdHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFF1ZXJ5QnVpbGRlciBpbnN0YW5jZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBlbnRpdHkgbWFuYWdlciBoYXMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWVuIGNsb3NlZC4KLSAgICAgKi8KICAgICBwdWJsaWMgUXVlcnlCdWlsZGVyIGdldFF1ZXJ5QnVpbGRlcigpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9FbnRpdHlNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9FbnRpdHlNYW5hZ2VyRmFjdG9yeS5qYXZhCmluZGV4IDRkMGZjNGYuLmNiOGE4NjggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvRW50aXR5TWFuYWdlckZhY3RvcnkuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL0VudGl0eU1hbmFnZXJGYWN0b3J5LmphdmEKQEAgLTI4LDk0ICsyOCwyNCBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgZW50aXR5IG1hbmFnZXIgZmFjdG9yeQotICogZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgogICoKICAqIEB2ZXJzaW9uICRSZXYkICREYXRlJAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEVudGl0eU1hbmFnZXJGYWN0b3J5IHsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBFbnRpdHlNYW5hZ2VyLgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgRW50aXR5TWFuYWdlciBpbnN0YW5jZSBlYWNoIHRpbWUKLSAgICAgKiBpdCBpcyBpbnZva2VkLgotICAgICAqIFRoZSBpc09wZW4gbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUgb24gdGhlIHJldHVybmVkIGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGVudGl0eSBtYW5hZ2VyIGZhY3RvcnkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBjbG9zZWQuCi0gICAgICovCiAgICAgcHVibGljIEVudGl0eU1hbmFnZXIgY3JlYXRlRW50aXR5TWFuYWdlcigpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEVudGl0eU1hbmFnZXIgd2l0aCB0aGUgc3BlY2lmaWVkIE1hcCBvZgotICAgICAqIHByb3BlcnRpZXMuCi0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBFbnRpdHlNYW5hZ2VyIGluc3RhbmNlIGVhY2ggdGltZQotICAgICAqIGl0IGlzIGludm9rZWQuCi0gICAgICogVGhlIGlzT3BlbiBtZXRob2Qgd2lsbCByZXR1cm4gdHJ1ZSBvbiB0aGUgcmV0dXJuZWQgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZW50aXR5IG1hbmFnZXIgZmFjdG9yeQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIGNsb3NlZC4KLSAgICAgKi8KICAgICBwdWJsaWMgRW50aXR5TWFuYWdlciBjcmVhdGVFbnRpdHlNYW5hZ2VyKE1hcCBtYXApOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIFF1ZXJ5QnVpbGRlciBmb3IgdGhlIGNyZWF0aW9uIG9mCi0gICAgICogQ3JpdGVyaWEgQVBJIFF1ZXJ5RGVmaW5pdGlvbiBvYmplY3RzLgotICAgICAqCi0gICAgICogQHJldHVybiBRdWVyeUJ1aWxkZXIgaW5zdGFuY2UKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZW50aXR5IG1hbmFnZXIgZmFjdG9yeQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIGNsb3NlZC4KLSAgICAgKi8KICAgICBwdWJsaWMgUXVlcnlCdWlsZGVyIGdldFF1ZXJ5QnVpbGRlcigpOwogCi0gICAgLyoqCi0gICAgICogQ2xvc2UgdGhlIGZhY3RvcnksIHJlbGVhc2luZyBhbnkgcmVzb3VyY2VzIHRoYXQgaXQgaG9sZHMuCi0gICAgICogQWZ0ZXIgYSBmYWN0b3J5IGluc3RhbmNlIGlzIGNsb3NlZCwgYWxsIG1ldGhvZHMgaW52b2tlZCBvbgotICAgICAqIGl0IHdpbGwgdGhyb3cgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBleGNlcHQgZm9yIGlzT3BlbiwKLSAgICAgKiB3aGljaCB3aWxsIHJldHVybiBmYWxzZS4gT25jZSBhbiBFbnRpdHlNYW5hZ2VyRmFjdG9yeSBoYXMKLSAgICAgKiBiZWVuIGNsb3NlZCwgYWxsIGl0cyBlbnRpdHkgbWFuYWdlcnMgYXJlIGNvbnNpZGVyZWQgdG8gYmUKLSAgICAgKiBpbiB0aGUgY2xvc2VkIHN0YXRlLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGVudGl0eSBtYW5hZ2VyIGZhY3RvcnkKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBjbG9zZWQuCi0gICAgICovCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKTsKIAotICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBmYWN0b3J5IGlzIG9wZW4uIFJldHVybnMgdHJ1ZQotICAgICAqIHVudGlsIHRoZSBmYWN0b3J5IGhhcyBiZWVuIGNsb3NlZC4KLSAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKTsKIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgcHJvcGVydGllcyBhbmQgYXNzb2NpYXRlZCB2YWx1ZXMgdGhhdCBhcmUgaW4gZWZmZWN0Ci0gICAgICogZm9yIHRoZSBlbnRpdHkgbWFuYWdlciBmYWN0b3J5LiBDaGFuZ2luZyB0aGUgY29udGVudHMgb2YgdGhlCi0gICAgICogbWFwIGRvZXMgbm90IGNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBpbiBlZmZlY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHByb3BlcnRpZXMKLSAgICAgKi8KICAgICBwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoKTsKIAotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZXMgb2YgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGZvciB1c2UKLSAgICAgKiB3aXRoIHRoZSBlbnRpdHkgbWFuYWdlciBmYWN0b3J5LiBUaGVzZSBjb3JyZXNwb25kIHRvCi0gICAgICogcHJvcGVydGllcyB0aGF0IG1heSBiZSBwYXNzZWQgdG8gdGhlIG1ldGhvZHMgb2YgdGhlCi0gICAgICogRW50aXR5TWFuYWdlckZhY3RvcnkgaW50ZXJmYWNlIHRoYXQgdGFrZSBhIHByb3BlcnRpZXMKLSAgICAgKiBhcmd1bWVudC4gVGhlc2UgaW5jbHVkZSBhbGwgc3RhbmRhcmQgcHJvcGVydGllcyBhcyB3ZWxsIGFzCi0gICAgICogdmVuZG9yLXNwZWNpZmljIHByb3BlcnRpZXMgc3VwcG9ydGVkIGJ5IHRoZSBwcm92aWRlci4gVGhlc2UKLSAgICAgKiBwcm9wZXJ0aWVzIG1heSBvciBtYXkgbm90IGN1cnJlbnRseSBiZSBpbiBlZmZlY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHByb3BlcnRpZXMgYW5kIGhpbnRzCi0gICAgICovCiAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFN1cHBvcnRlZFByb3BlcnRpZXMoKTsKIAotICAgIC8qKgotICAgICAqIEFjY2VzcyB0aGUgY2FjaGUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0eSBtYW5hZ2VyCi0gICAgICogZmFjdG9yeSAodGhlICJzZWNvbmQgbGV2ZWwgY2FjaGUiKS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgdGhlIENhY2hlIGludGVyZmFjZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBlbnRpdHkgbWFuYWdlciBmYWN0b3J5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gY2xvc2VkLgotICAgICAqLwogICAgIHB1YmxpYyBDYWNoZSBnZXRDYWNoZSgpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9FeHByZXNzaW9uLmphdmEgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL0V4cHJlc3Npb24uamF2YQppbmRleCAwNWJkMmJiLi4xZGIwYTRkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL0V4cHJlc3Npb24uamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL0V4cHJlc3Npb24uamF2YQpAQCAtMjQsNTA3ICsyNCw5MyBAQAogLy8KIHBhY2thZ2UgamF2YXgucGVyc2lzdGVuY2U7CiAKLS8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIGVpdGhlciBhcyBzZWxlY3QgbGlzdCBpdGVtcyBvciBhcwotICogcHJlZGljYXRlIG9wZXJhbmRzLgotICovCiBwdWJsaWMgaW50ZXJmYWNlIEV4cHJlc3Npb24gZXh0ZW5kcyBTZWxlY3RJdGVtLCBQcmVkaWNhdGVPcGVyYW5kIHsKLSAgICAvKgotICAgICAgICAgKiBDb25kaXRpb25hbCBwcmVkaWNhdGVzIG92ZXIgZXhwcmVzc2lvbiBpdGVtcwotICAgICAgICAgKi8KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgZXhwcmVzc2lvbiBpcyBhIG1lbWJlciBvZiB0aGUKLSAgICAgKiBhc3NvY2lhdGlvbiBvciBlbGVtZW50IGNvbGxlY3Rpb24gZGVub3RlZCBieSB0aGUgcGF0aCBleHByZXNzaW9uLiBUaGUKLSAgICAgKiBhcmd1bWVudCBtdXN0IGNvcnJlc3BvbmQgdG8gYSBjb2xsZWN0aW9uLXZhbHVlZCBhc3NvY2lhdGlvbiBvciBlbGVtZW50Ci0gICAgICogY29sbGVjdGlvbiBvZiBsaWtlIHR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnIC0KLSAgICAgKiAgICAgICAgICAgIGEgcGF0aCBleHByZXNzaW9uIHRoYXQgc3BlY2lmaWVzIGEgY29sbGVjdGlvbi12YWx1ZWQKLSAgICAgKiAgICAgICAgICAgIGFzc29jaWF0aW9uIG9yIGFuIGVsZW1lbnQgY29sbGVjdGlvbgotICAgICAqIEByZXR1cm4gY29uZGl0aW9uYWwgcHJlZGljYXRlCi0gICAgICovCisKICAgICBQcmVkaWNhdGUgbWVtYmVyKFBhdGhFeHByZXNzaW9uIGFyZyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMKLSAgICAgKiBudWxsLgotICAgICAqCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgaXNOdWxsKCk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBpcyBhIG1lbWJlcgotICAgICAqIG9mIHRoZSBhcmd1bWVudCBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZ3MKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBpbihTdHJpbmcuLi4gc3RyaW5ncyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBpcyBhIG1lbWJlcgotICAgICAqIG9mIHRoZSBhcmd1bWVudCBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIG51bXMKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBpbihOdW1iZXIuLi4gbnVtcyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBpcyBhIG1lbWJlcgotICAgICAqIG9mIHRoZSBhcmd1bWVudCBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGVudW1zCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgaW4oRW51bTw/Pi4uLiBlbnVtcyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBpcyBhIG1lbWJlcgotICAgICAqIG9mIHRoZSBhcmd1bWVudCBsaXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzZXMKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBpbihDbGFzcy4uLiBjbGFzc2VzKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByZWRpY2F0ZSBmb3IgdGVzdGluZyB3aGV0aGVyIHRoZSBleHByZXNzaW9uIHZhbHVlIGlzIGEgbWVtYmVyCi0gICAgICogb2YgdGhlIGFyZ3VtZW50IGxpc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGFyYW1zCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgaW4oRXhwcmVzc2lvbi4uLiBwYXJhbXMpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIHdoZXRoZXIgdGhlIGV4cHJlc3Npb24gdmFsdWUgaXMgYSBtZW1iZXIKLSAgICAgKiBvZiBhIHN1YnF1ZXJ5IHJlc3VsdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdWJxdWVyeQotICAgICAqIEByZXR1cm4gY29uZGl0aW9uYWwgcHJlZGljYXRlCi0gICAgICovCiAgICAgUHJlZGljYXRlIGluKFN1YnF1ZXJ5IHN1YnF1ZXJ5KTsKIAotICAgIC8qCi0gICAgICAgICAqIE9wZXJhdGlvbnMgb24gc3RyaW5ncwotICAgICAgICAgKi8KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgbGVuZ3RoIFRoaXMgbWV0aG9kIG11c3QgYmUgaW52b2tlZCBvbiBhbiBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcKLSAgICAgKiB0byBhIHN0cmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gZXhwcmVzc2lvbiBkZW5vdGluZyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBsZW5ndGgoKTsKIAotICAgIC8qKgotICAgICAqIENvbmNhdGVuYXRlIGEgc3RyaW5nIHdpdGggb3RoZXIgc3RyaW5nKHMpLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGludm9rZWQgb24KLSAgICAgKiBhbiBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gYSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyIC0KLSAgICAgKiAgICAgICAgICAgIHN0cmluZyhzKQotICAgICAqIEByZXR1cm4gZXhwcmVzc2lvbiBkZW5vdGluZyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc3RyaW5ncywgc3RhcnRpbmcKLSAgICAgKiAgICAgICAgIHdpdGggdGhlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHByZXNzaW9uIG9uIHdoaWNoIHRoZQotICAgICAqICAgICAgICAgbWV0aG9kIHdhcyBpbnZva2VkLgotICAgICAqLwogICAgIEV4cHJlc3Npb24gY29uY2F0KFN0cmluZy4uLiBzdHIpOwogCi0gICAgLyoqCi0gICAgICogQ29uY2F0ZW5hdGUgYSBzdHJpbmcgd2l0aCBvdGhlciBzdHJpbmcocykuIFRoaXMgbWV0aG9kIG11c3QgYmUgaW52b2tlZCBvbgotICAgICAqIGFuIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byBhIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHIgLQotICAgICAqICAgICAgICAgICAgZXhwcmVzc2lvbihzKSBjb3JyZXNwb25kaW5nIHRvIHN0cmluZyhzKQotICAgICAqIEByZXR1cm4gZXhwcmVzc2lvbiBkZW5vdGluZyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc3RyaW5ncywgc3RhcnRpbmcKLSAgICAgKiAgICAgICAgIHdpdGggdGhlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHByZXNzaW9uIG9uIHdoaWNoIHRoZQotICAgICAqICAgICAgICAgbWV0aG9kIHdhcyBpbnZva2VkLgotICAgICAqLwogICAgIEV4cHJlc3Npb24gY29uY2F0KEV4cHJlc3Npb24uLi4gc3RyKTsKIAotICAgIC8qKgotICAgICAqIEV4dHJhY3QgYSBzdWJzdHJpbmcgc3RhcnRpbmcgYXQgc3BlY2lmaWVkIHBvc2l0aW9uIHRocm91Z2ggdG8gdGhlIGVuZCBvZgotICAgICAqIHRoZSBzdHJpbmcuIFRoaXMgbWV0aG9kIG11c3QgYmUgaW52b2tlZCBvbiBhbiBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8KLSAgICAgKiBhIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGFydCAtCi0gICAgICogICAgICAgICAgICAgIHN0YXJ0IHBvc2l0aW9uICgxIGluZGljYXRlcyBmaXJzdCBwb3NpdGlvbikKLSAgICAgKiBAcmV0dXJuIGV4cHJlc3Npb24gZGVub3RpbmcgdGhlIGV4dHJhY3RlZCBzdWJzdHJpbmcKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIHN1YnN0cmluZyhpbnQgc3RhcnQpOwogCi0gICAgLyoqCi0gICAgICogRXh0cmFjdCBhIHN1YnN0cmluZyBzdGFydGluZyBhdCBzcGVjaWZpZWQgcG9zaXRpb24gdGhyb3VnaCB0byB0aGUgZW5kIG9mCi0gICAgICogdGhlIHN0cmluZy4gVGhpcyBtZXRob2QgbXVzdCBiZSBpbnZva2VkIG9uIGFuIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0bwotICAgICAqIGEgc3RyaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXJ0IC0KLSAgICAgKiAgICAgICAgICAgICAgZXhwcmVzc2lvbiBkZW5vdGluZyBzdGFydCBwb3NpdGlvbiAoMSBpbmRpY2F0ZXMgZmlyc3QKLSAgICAgKiAgICAgICAgICAgICAgcG9zaXRpb24pCi0gICAgICogQHJldHVybiBleHByZXNzaW9uIGRlbm90aW5nIHRoZSBleHRyYWN0ZWQgc3Vic3RyaW5nCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBzdWJzdHJpbmcoRXhwcmVzc2lvbiBzdGFydCk7CiAKLSAgICAvKioKLSAgICAgKiBFeHRyYWN0IGEgc3Vic3RyaW5nLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGludm9rZWQgb24gYW4gZXhwcmVzc2lvbgotICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gYSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnQgLQotICAgICAqICAgICAgICAgICAgICBzdGFydCBwb3NpdGlvbiAoMSBpbmRpY2F0ZXMgZmlyc3QgcG9zaXRpb24pCi0gICAgICogQHBhcmFtIGxlbiAgIC0KLSAgICAgKiAgICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBzdWJzdHJpbmcgdG8gYmUgcmV0dXJuZWQKLSAgICAgKiBAcmV0dXJuIGV4cHJlc3Npb24gZGVub3RpbmcgdGhlIGV4dHJhY3RlZCBzdWJzdHJpbmcKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIHN1YnN0cmluZyhpbnQgc3RhcnQsIGludCBsZW4pOwogCi0gICAgLyoqCi0gICAgICogRXh0cmFjdCBhIHN1YnN0cmluZy4gVGhpcyBtZXRob2QgbXVzdCBiZSBpbnZva2VkIG9uIGFuIGV4cHJlc3Npb24KLSAgICAgKiBjb3JyZXNwb25kaW5nIHRvIGEgc3RyaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0YXJ0IC0KLSAgICAgKiAgICAgICAgICAgICAgc3RhcnQgcG9zaXRpb24gKDEgaW5kaWNhdGVzIGZpcnN0IHBvc2l0aW9uKQotICAgICAqIEBwYXJhbSBsZW4gICAtCi0gICAgICogICAgICAgICAgICAgIGV4cHJlc3Npb24gZGVub3RpbmcgbGVuZ3RoIG9mIHRoZSBzdWJzdHJpbmcgdG8gcmV0dXJuCi0gICAgICogQHJldHVybiBleHByZXNzaW9uIGRlbm90aW5nIHRoZSBleHRyYWN0ZWQgc3Vic3RyaW5nCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBzdWJzdHJpbmcoaW50IHN0YXJ0LCBFeHByZXNzaW9uIGxlbik7CiAKLSAgICAvKioKLSAgICAgKiBFeHRyYWN0IGEgc3Vic3RyaW5nLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGludm9rZWQgb24gYW4gZXhwcmVzc2lvbgotICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gYSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhcnQgLQotICAgICAqICAgICAgICAgICAgICBleHByZXNzaW9uIGRlbm90aW5nIHN0YXJ0IHBvc2l0aW9uICgxIGluZGljYXRlcyBmaXJzdAotICAgICAqICAgICAgICAgICAgICBwb3NpdGlvbikKLSAgICAgKiBAcGFyYW0gbGVuICAgLQotICAgICAqICAgICAgICAgICAgICBsZW5ndGggb2YgdGhlIHN1YnN0cmluZyB0byByZXR1cm4KLSAgICAgKiBAcmV0dXJuIGV4cHJlc3Npb24gZGVub3RpbmcgdGhlIGV4dHJhY3RlZCBzdWJzdHJpbmcKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIHN1YnN0cmluZyhFeHByZXNzaW9uIHN0YXJ0LCBpbnQgbGVuKTsKIAotICAgIC8qKgotICAgICAqIEV4dHJhY3QgYSBzdWJzdHJpbmcuIFRoaXMgbWV0aG9kIG11c3QgYmUgaW52b2tlZCBvbiBhbiBleHByZXNzaW9uCi0gICAgICogY29ycmVzcG9uZGluZyB0byBhIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGFydCAtCi0gICAgICogICAgICAgICAgICAgIGV4cHJlc3Npb24gZGVub3Rpbmcgc3RhcnQgcG9zaXRpb24gKDEgaW5kaWNhdGVzIGZpcnN0Ci0gICAgICogICAgICAgICAgICAgIHBvc2l0aW9uKQotICAgICAqIEBwYXJhbSBsZW4gICAtCi0gICAgICogICAgICAgICAgICAgIGV4cHJlc3Npb24gZGVub3RpbmcgbGVuZ3RoIG9mIHRoZSBzdWJzdHJpbmcgdG8gcmV0dXJuCi0gICAgICogQHJldHVybiBleHByZXNzaW9uIGRlbm90aW5nIHRoZSBleHRyYWN0ZWQgc3Vic3RyaW5nCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBzdWJzdHJpbmcoRXhwcmVzc2lvbiBzdGFydCwgRXhwcmVzc2lvbiBsZW4pOwogCi0gICAgLyoqCi0gICAgICogQ29udmVydCBzdHJpbmcgdG8gbG93ZXJjYXNlLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGludm9rZWQgb24gYW4gZXhwcmVzc2lvbgotICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gYSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGV4cHJlc3Npb24gZGVub3RpbmcgdGhlIHN0cmluZyBpbiBsb3dlcmNhc2UKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIGxvd2VyKCk7CiAKLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IHN0cmluZyB0byB1cHBlcmNhc2UuIFRoaXMgbWV0aG9kIG11c3QgYmUgaW52b2tlZCBvbiBhbiBleHByZXNzaW9uCi0gICAgICogY29ycmVzcG9uZGluZyB0byBhIHN0cmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gZXhwcmVzc2lvbiBkZW5vdGluZyB0aGUgc3RyaW5nIGluIHVwcGVyY2FzZQotICAgICAqLwogICAgIEV4cHJlc3Npb24gdXBwZXIoKTsKIAotICAgIC8qKgotICAgICAqIFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgYmxhbmtzLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGludm9rZWQgb24gYW4KLSAgICAgKiBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gYSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGV4cHJlc3Npb24gZGVub3RpbmcgdHJpbW1lZCBzdHJpbmcKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIHRyaW0oKTsKIAotICAgIC8qKgotICAgICAqIFRyaW0gbGVhZGluZywgdHJhaWxpbmcgYmxhbmtzIChvciBib3RoKSBhcyBzcGVjaWZpZWQgYnkgdHJpbSBzcGVjLiBUaGlzCi0gICAgICogbWV0aG9kIG11c3QgYmUgaW52b2tlZCBvbiBhbiBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gYSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3BlYyAtCi0gICAgICogICAgICAgICAgICAgdHJpbSBzcGVjaWZpY2F0aW9uCi0gICAgICogQHJldHVybiBleHByZXNzaW9uIGRlbm90aW5nIHRyaW1tZWQgc3RyaW5nCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiB0cmltKFRyaW1TcGVjIHNwZWMpOwogCi0gICAgLyoqCi0gICAgICogVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyBvY2N1cnJlbmNlcyBvZiBjaGFyYWN0ZXIgZnJvbSB0aGUgc3RyaW5nLiBUaGlzCi0gICAgICogbWV0aG9kIG11c3QgYmUgaW52b2tlZCBvbiBhbiBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gYSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYyAtCi0gICAgICogICAgICAgICAgY2hhcmFjdGVyIHRvIGJlIHRyaW1tZWQKLSAgICAgKiBAcmV0dXJuIGV4cHJlc3Npb24gZGVub3RpbmcgdHJpbW1lZCBzdHJpbmcKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIHRyaW0oY2hhciBjKTsKIAotICAgIC8qKgotICAgICAqIFRyaW0gb2NjdXJyZW5jZXMgb2YgdGhlIGNoYXJhY3RlciBmcm9tIGxlYWRpbmcgb3IgdHJhaWxpbmcgKG9yIGJvdGgpCi0gICAgICogcG9zaXRpb25zIG9mIHRoZSBzdHJpbmcsIGFzIHNwZWNpZmllZCBieSB0cmltIHNwZWMuIFRoaXMgbWV0aG9kIG11c3QgYmUKLSAgICAgKiBpbnZva2VkIG9uIGFuIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byBhIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjICAgIC0KLSAgICAgKiAgICAgICAgICAgICBjaGFyYWN0ZXIgdG8gYmUgdHJpbW1lZAotICAgICAqIEBwYXJhbSBzcGVjIC0KLSAgICAgKiAgICAgICAgICAgICB0cmltIHNwZWNpZmljYXRpb24KLSAgICAgKiBAcmV0dXJuIGV4cHJlc3Npb24gZGVub3RpbmcgdHJpbW1lZCBzdHJpbmcKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIHRyaW0oY2hhciBjLCBUcmltU3BlYyBzcGVjKTsKIAotICAgIC8qKgotICAgICAqIFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgb2NjdXJyZW5jZXMgb2YgY2hhcmFjdGVyIHNwZWNpZmllZCBieSB0aGUKLSAgICAgKiBleHByZXNzaW9uIGFyZ3VtZW50IGZyb20gdGhlIHN0cmluZy4gVGhpcyBtZXRob2QgbXVzdCBiZSBpbnZva2VkIG9uIGFuCi0gICAgICogZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIGEgc3RyaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4cHIgLQotICAgICAqICAgICAgICAgICAgIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgY2hhcmFjdGVyIHRvIGJlIHRyaW1tZWQKLSAgICAgKiBAcmV0dXJuIGV4cHJlc3Npb24gZGVub3RpbmcgdHJpbW1lZCBzdHJpbmcKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIHRyaW0oRXhwcmVzc2lvbiBleHByKTsKIAotICAgIC8qKgotICAgICAqIFRyaW0gb2NjdXJyZW5jZXMgb2YgdGhlIGNoYXJhY3RlciBzcGVjaWZpZWQgYnkgdGhlIGV4cHJlc3Npb24gYXJndW1lbnQKLSAgICAgKiBmcm9tIGxlYWRpbmcgb3IgdHJhaWxpbmcgKG9yIGJvdGgpIHBvc2l0aW9ucyBvZiB0aGUgc3RyaW5nLCBhcyBzcGVjaWZpZWQKLSAgICAgKiBieSB0cmltIHNwZWMuIFRoaXMgbWV0aG9kIG11c3QgYmUgaW52b2tlZCBvbiBhbiBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcKLSAgICAgKiB0byBhIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHByIC0KLSAgICAgKiAgICAgICAgICAgICBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNoYXJhY3RlciB0byBiZSB0cmltbWVkCi0gICAgICogQHBhcmFtIHNwZWMgLQotICAgICAqICAgICAgICAgICAgIHRyaW0gc3BlY2lmaWNhdGlvbgotICAgICAqIEByZXR1cm4gZXhwcmVzc2lvbiBkZW5vdGluZyB0cmltbWVkIHN0cmluZwotICAgICAqLwogICAgIEV4cHJlc3Npb24gdHJpbShFeHByZXNzaW9uIGV4cHIsIFRyaW1TcGVjIHNwZWMpOwogCi0gICAgLyoqCi0gICAgICogTG9jYXRlIGEgc3RyaW5nIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAgICAqIGV4cHJlc3Npb24gb24gd2hpY2ggdGhlIG1ldGhvZCB3YXMgaW52b2tlZC4gVGhlIHNlYXJjaCBpcyBzdGFydGVkIGF0Ci0gICAgICogcG9zaXRpb24gMSAoZmlyc3Qgc3RyaW5nIHBvc2l0aW9uKS4gVGhpcyBtZXRob2QgbXVzdCBiZSBpbnZva2VkIG9uIGFuCi0gICAgICogZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIGEgc3RyaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0ciAtCi0gICAgICogICAgICAgICAgICBzdHJpbmcgdG8gYmUgbG9jYXRlZAotICAgICAqIEByZXR1cm4gZXhwcmVzc2lvbiBkZW5vdGluZyB0aGUgZmlyc3QgcG9zaXRpb24gYXQgd2hpY2ggdGhlIHN0cmluZyB3YXMKLSAgICAgKiAgICAgICAgIGZvdW5kIG9yIGV4cHJlc3Npb24gZGVub3RpbmcgMCBpZiB0aGUgc3RyaW5nIHdhcyBub3QgZm91bmQKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIGxvY2F0ZShTdHJpbmcgc3RyKTsKIAotICAgIC8qKgotICAgICAqIExvY2F0ZSBhIHN0cmluZyBjb250YWluZWQgd2l0aGluIHRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICAgKiBleHByZXNzaW9uIG9uIHdoaWNoIHRoZSBtZXRob2Qgd2FzIGludm9rZWQuIFRoZSBzZWFyY2ggaXMgc3RhcnRlZCBhdAotICAgICAqIHBvc2l0aW9uIDEgKGZpcnN0IHN0cmluZyBwb3NpdGlvbikuIFRoaXMgbWV0aG9kIG11c3QgYmUgaW52b2tlZCBvbiBhbgotICAgICAqIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byBhIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHIgLQotICAgICAqICAgICAgICAgICAgZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdHJpbmcgdG8gYmUgbG9jYXRlZAotICAgICAqIEByZXR1cm4gZXhwcmVzc2lvbiBkZW5vdGluZyB0aGUgZmlyc3QgcG9zaXRpb24gYXQgd2hpY2ggdGhlIHN0cmluZyB3YXMKLSAgICAgKiAgICAgICAgIGZvdW5kIG9yIGV4cHJlc3Npb24gZGVub3RpbmcgMCBpZiB0aGUgc3RyaW5nIHdhcyBub3QgZm91bmQKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIGxvY2F0ZShFeHByZXNzaW9uIHN0cik7CiAKLSAgICAvKioKLSAgICAgKiBMb2NhdGUgYSBzdHJpbmcgY29udGFpbmVkIHdpdGhpbiB0aGUgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAgICogZXhwcmVzc2lvbiBvbiB3aGljaCB0aGUgbWV0aG9kIHdhcyBpbnZva2VkLCBzdGFydGluZyBhdCBhIHNwZWNpZmllZAotICAgICAqIHNlYXJjaCBwb3NpdGlvbi4gVGhpcyBtZXRob2QgbXVzdCBiZSBpbnZva2VkIG9uIGFuIGV4cHJlc3Npb24KLSAgICAgKiBjb3JyZXNwb25kaW5nIHRvIGEgc3RyaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0ciAgICAgIC0KLSAgICAgKiAgICAgICAgICAgICAgICAgc3RyaW5nIHRvIGJlIGxvY2F0ZWQKLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gLQotICAgICAqICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhdCB3aGljaCB0byBzdGFydCB0aGUgc2VhcmNoCi0gICAgICogQHJldHVybiBleHByZXNzaW9uIGRlbm90aW5nIHRoZSBmaXJzdCBwb3NpdGlvbiBhdCB3aGljaCB0aGUgc3RyaW5nIHdhcwotICAgICAqICAgICAgICAgZm91bmQgb3IgZXhwcmVzc2lvbiBkZW5vdGluZyAwIGlmIHRoZSBzdHJpbmcgd2FzIG5vdCBmb3VuZAotICAgICAqLwogICAgIEV4cHJlc3Npb24gbG9jYXRlKFN0cmluZyBzdHIsIGludCBwb3NpdGlvbik7CiAKLSAgICAvKioKLSAgICAgKiBMb2NhdGUgYSBzdHJpbmcgY29udGFpbmVkIHdpdGhpbiB0aGUgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAgICogZXhwcmVzc2lvbiBvbiB3aGljaCB0aGUgbWV0aG9kIHdhcyBpbnZva2VkLCBzdGFydGluZyBhdCBhIHNwZWNpZmllZAotICAgICAqIHNlYXJjaCBwb3NpdGlvbi4gVGhpcyBtZXRob2QgbXVzdCBiZSBpbnZva2VkIG9uIGFuIGV4cHJlc3Npb24KLSAgICAgKiBjb3JyZXNwb25kaW5nIHRvIGEgc3RyaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0ciAgICAgIC0KLSAgICAgKiAgICAgICAgICAgICAgICAgc3RyaW5nIHRvIGJlIGxvY2F0ZWQKLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gLQotICAgICAqICAgICAgICAgICAgICAgICBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gcG9zaXRpb24gYXQgd2hpY2ggdG8gc3RhcnQgdGhlCi0gICAgICogICAgICAgICAgICAgICAgIHNlYXJjaAotICAgICAqIEByZXR1cm4gZXhwcmVzc2lvbiBkZW5vdGluZyB0aGUgZmlyc3QgcG9zaXRpb24gYXQgd2hpY2ggdGhlIHN0cmluZyB3YXMKLSAgICAgKiAgICAgICAgIGZvdW5kIG9yIGV4cHJlc3Npb24gZGVub3RpbmcgMCBpZiB0aGUgc3RyaW5nIHdhcyBub3QgZm91bmQKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIGxvY2F0ZShTdHJpbmcgc3RyLCBFeHByZXNzaW9uIHBvc2l0aW9uKTsKIAotICAgIC8qKgotICAgICAqIExvY2F0ZSBhIHN0cmluZyBjb250YWluZWQgd2l0aGluIHRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICAgKiBleHByZXNzaW9uIG9uIHdoaWNoIHRoZSBtZXRob2Qgd2FzIGludm9rZWQsIHN0YXJ0aW5nIGF0IGEgc3BlY2lmaWVkCi0gICAgICogc2VhcmNoIHBvc2l0aW9uLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGludm9rZWQgb24gYW4gZXhwcmVzc2lvbgotICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gYSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyICAgICAgLQotICAgICAqICAgICAgICAgICAgICAgICBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0cmluZyB0byBiZSBsb2NhdGVkCi0gICAgICogQHBhcmFtIHBvc2l0aW9uIC0KLSAgICAgKiAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXQgd2hpY2ggdG8gc3RhcnQgdGhlIHNlYXJjaAotICAgICAqIEByZXR1cm4gZXhwcmVzc2lvbiBkZW5vdGluZyB0aGUgZmlyc3QgcG9zaXRpb24gYXQgd2hpY2ggdGhlIHN0cmluZyB3YXMKLSAgICAgKiAgICAgICAgIGZvdW5kIG9yIGV4cHJlc3Npb24gZGVub3RpbmcgMCBpZiB0aGUgc3RyaW5nIHdhcyBub3QgZm91bmQKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIGxvY2F0ZShFeHByZXNzaW9uIHN0ciwgaW50IHBvc2l0aW9uKTsKIAotICAgIC8qKgotICAgICAqIExvY2F0ZSBhIHN0cmluZyBjb250YWluZWQgd2l0aGluIHRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICAgKiBleHByZXNzaW9uIG9uIHdoaWNoIHRoZSBtZXRob2Qgd2FzIGludm9rZWQsIHN0YXJ0aW5nIGF0IGEgc3BlY2lmaWVkCi0gICAgICogc2VhcmNoIHBvc2l0aW9uLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGludm9rZWQgb24gYW4gZXhwcmVzc2lvbgotICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gYSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyICAgICAgLQotICAgICAqICAgICAgICAgICAgICAgICBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0cmluZyB0byBiZSBsb2NhdGVkCi0gICAgICogQHBhcmFtIHBvc2l0aW9uIC0KLSAgICAgKiAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHBvc2l0aW9uIGF0IHdoaWNoIHRvIHN0YXJ0IHRoZQotICAgICAqICAgICAgICAgICAgICAgICBzZWFyY2gKLSAgICAgKiBAcmV0dXJuIGV4cHJlc3Npb24gZGVub3RpbmcgdGhlIGZpcnN0IHBvc2l0aW9uIGF0IHdoaWNoIHRoZSBzdHJpbmcgd2FzCi0gICAgICogICAgICAgICBmb3VuZCBvciBleHByZXNzaW9uIGRlbm90aW5nIDAgaWYgdGhlIHN0cmluZyB3YXMgbm90IGZvdW5kCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBsb2NhdGUoRXhwcmVzc2lvbiBzdHIsIEV4cHJlc3Npb24gcG9zaXRpb24pOwogCi0gICAgLyoKLSAgICAgICAgICogQXJpdGhtZXRpYyBvcGVyYXRpb25zCi0gICAgICAgICAqLwotICAgIC8qKgotICAgICAqIEFkZGl0aW9uLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGludm9rZWQgb24gYW4gZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIGEKLSAgICAgKiBudW1iZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbnVtIC0KLSAgICAgKiAgICAgICAgICAgIG51bWJlciB0byBiZSBhZGRlZAotICAgICAqIEByZXR1cm4gZXhwcmVzc2lvbiBkZW5vdGluZyB0aGUgc3VtCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBwbHVzKE51bWJlciBudW0pOwogCi0gICAgLyoqCi0gICAgICogQWRkaXRpb24uIFRoaXMgbWV0aG9kIG11c3QgYmUgaW52b2tlZCBvbiBhbiBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gYQotICAgICAqIG51bWJlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHByIC0KLSAgICAgKiAgICAgICAgICAgICBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gbnVtYmVyIHRvIGJlIGFkZGVkCi0gICAgICogQHJldHVybiBleHByZXNzaW9uIGRlbm90aW5nIHRoZSBzdW0KLSAgICAgKi8KICAgICBFeHByZXNzaW9uIHBsdXMoRXhwcmVzc2lvbiBleHByKTsKIAotICAgIC8qKgotICAgICAqIFVuYXJ5IG1pbnVzLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGludm9rZWQgb24gYW4gZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nCi0gICAgICogdG8gYSBudW1iZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGV4cHJlc3Npb24gZGVub3RpbmcgdGhlIHVuYXJ5IG1pbnVzIG9mIHRoZSBleHByZXNzaW9uCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBtaW51cygpOwogCi0gICAgLyoqCi0gICAgICogU3VidHJhY3Rpb24uIFRoaXMgbWV0aG9kIG11c3QgYmUgaW52b2tlZCBvbiBhbiBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcKLSAgICAgKiB0byBhIG51bWJlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBudW0gLQotICAgICAqICAgICAgICAgICAgc3VidHJhaGVuZAotICAgICAqIEByZXR1cm4gZXhwcmVzc2lvbiBkZW5vdGluZyB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nIHRoZSBhcmd1bWVudCBmcm9tCi0gICAgICogICAgICAgICB0aGUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGV4cHJlc3Npb24gb24gd2hpY2ggdGhlIG1ldGhvZAotICAgICAqICAgICAgICAgd2FzIGludm9rZWQuCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBtaW51cyhOdW1iZXIgbnVtKTsKIAotICAgIC8qKgotICAgICAqIFN1YnRyYWN0aW9uLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGludm9rZWQgb24gYW4gZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nCi0gICAgICogdG8gYSBudW1iZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhwciAtCi0gICAgICogICAgICAgICAgICAgZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHN1YnRyYWhlbmQKLSAgICAgKiBAcmV0dXJuIGV4cHJlc3Npb24gZGVub3RpbmcgdGhlIHJlc3VsdCBvZiBzdWJ0cmFjdGluZyB0aGUgbnVtYmVyIGRlbm90ZWQKLSAgICAgKiAgICAgICAgIGJ5IHRoZSBhcmd1bWVudCBmcm9tIHRoZSBudW1iZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZXhwcmVzc2lvbgotICAgICAqICAgICAgICAgb24gd2hpY2ggdGhlIG1ldGhvZCB3YXMgaW52b2tlZC4KLSAgICAgKi8KICAgICBFeHByZXNzaW9uIG1pbnVzKEV4cHJlc3Npb24gZXhwcik7CiAKLSAgICAvKioKLSAgICAgKiBEaXZpc2lvbi4gVGhpcyBtZXRob2QgbXVzdCBiZSBpbnZva2VkIG9uIGFuIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byBhCi0gICAgICogbnVtYmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG51bSAtCi0gICAgICogICAgICAgICAgICBkaXZpc29yCi0gICAgICogQHJldHVybiBleHByZXNzaW9uIGRlbm90aW5nIHRoZSByZXN1bHQgb2YgZGl2aWRpbmcgdGhlIG51bWJlcgotICAgICAqICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgZXhwcmVzc2lvbiBvbiB3aGljaCB0aGUgbWV0aG9kIHdhcyBpbnZva2VkCi0gICAgICogICAgICAgICBieSB0aGUgYXJndW1lbnQKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIGRpdmlkZWRCeShOdW1iZXIgbnVtKTsKIAotICAgIC8qKgotICAgICAqIERpdmlzaW9uLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGludm9rZWQgb24gYW4gZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIGEKLSAgICAgKiBudW1iZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhwciAtCi0gICAgICogICAgICAgICAgICAgZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBkaXZpc29yCi0gICAgICogQHJldHVybiBleHByZXNzaW9uIGRlbm90aW5nIHRoZSByZXN1bHQgb2YgZGl2aWRpbmcgdGhlIG51bWJlcgotICAgICAqICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgZXhwcmVzc2lvbiBvbiB3aGljaCB0aGUgbWV0aG9kIHdhcyBpbnZva2VkCi0gICAgICogICAgICAgICBieSB0aGUgbnVtYmVyIGRlbm90ZWQgYnkgdGhlIGFyZ3VtZW50Ci0gICAgICovCiAgICAgRXhwcmVzc2lvbiBkaXZpZGVkQnkoRXhwcmVzc2lvbiBleHByKTsKIAotICAgIC8qKgotICAgICAqIE11bHRpcGxpY2F0aW9uLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGludm9rZWQgb24gYW4gZXhwcmVzc2lvbgotICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gYSBudW1iZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbnVtIC0KLSAgICAgKiAgICAgICAgICAgIG11bHRpcGxpZXIKLSAgICAgKiBAcmV0dXJuIGV4cHJlc3Npb24gZGVub3RpbmcgdGhlIHJlc3VsdCBvZiBtdWx0aXBseWluZyB0aGUgYXJndW1lbnQgd2l0aAotICAgICAqICAgICAgICAgdGhlIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHByZXNzaW9uIG9uIHdoaWNoIHRoZSBtZXRob2QKLSAgICAgKiAgICAgICAgIHdhcyBpbnZva2VkLgotICAgICAqLwogICAgIEV4cHJlc3Npb24gdGltZXMoTnVtYmVyIG51bSk7CiAKLSAgICAvKioKLSAgICAgKiBNdWx0aXBsaWNhdGlvbi4gVGhpcyBtZXRob2QgbXVzdCBiZSBpbnZva2VkIG9uIGFuIGV4cHJlc3Npb24KLSAgICAgKiBjb3JyZXNwb25kaW5nIHRvIGEgbnVtYmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4cHIgLQotICAgICAqICAgICAgICAgICAgIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgbXVsdGlwbGllcgotICAgICAqIEByZXR1cm4gZXhwcmVzc2lvbiBkZW5vdGluZyB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIHRoZSBudW1iZXIgZGVub3RlZAotICAgICAqICAgICAgICAgYnkgdGhlIGFyZ3VtZW50IHdpdGggdGhlIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHByZXNzaW9uCi0gICAgICogICAgICAgICBvbiB3aGljaCB0aGUgbWV0aG9kIHdhcyBpbnZva2VkLgotICAgICAgICAgKi8KIAlFeHByZXNzaW9uIHRpbWVzKEV4cHJlc3Npb24gZXhwcik7CiAKLQkvKioKLQkgKiBBYnNvbHV0ZSB2YWx1ZS4gVGhpcyBtZXRob2QgbXVzdCBiZSBpbnZva2VkIG9uIGFuIGV4cHJlc3Npb24KLQkgKiBjb3JyZXNwb25kaW5nIHRvIGEgbnVtYmVyLgotCSAqCi0JICogQHJldHVybiBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFic29sdXRlIHZhbHVlCi0JICovCiAJRXhwcmVzc2lvbiBhYnMoKTsKIAotCS8qKgotCSAqIFNxdWFyZSByb290LiBUaGlzIG1ldGhvZCBtdXN0IGJlIGludm9rZWQgb24gYW4gZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nCi0JICogdG8gYSBudW1iZXIuCi0JICoKLQkgKiBAcmV0dXJuIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3F1YXJlIHJvb3QKLQkgKi8KIAlFeHByZXNzaW9uIHNxcnQoKTsKIAotCS8qKgotCSAqIE1vZHVsbyBvcGVyYXRpb24uIFRoaXMgbXVzdCBiZSBpbnZva2VkIG9uIGFuIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0bwotCSAqIGFuIGludGVnZXIgdmFsdWUKLQkgKgotCSAqIEBwYXJhbSBudW0gLQotCSAqICAgICAgICAgICAgaW50ZWdlciBkaXZpc29yCi0JICogQHJldHVybiBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGludGVnZXIgcmVtYWluZGVyIG9mIHRoZSBkaXZpc2lvbgotCSAqICAgICAgICAgb2YgdGhlIGludGVnZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZXhwcmVzc2lvbiBvbiB3aGljaCB0aGUKLQkgKiAgICAgICAgIG1ldGhvZCB3YXMgaW52b2tlZCBieSB0aGUgYXJndW1lbnQuCi0JICovCiAJRXhwcmVzc2lvbiBtb2QoaW50IG51bSk7CiAKLQkvKioKLSAgICAgICAgICogTW9kdWxvIG9wZXJhdGlvbi4gVGhpcyBtdXN0IGJlIGludm9rZWQgb24gYW4gZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvCi0gICAgICAgICAqIGFuIGludGVnZXIgdmFsdWUKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGV4cHIgLQotICAgICAgICAgKiAgICAgICAgICAgICBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gaW50ZWdlciBkaXZpc29yCi0gICAgICAgICAqIEByZXR1cm4gZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnRlZ2VyIHJlbWFpbmRlciBvZiB0aGUgZGl2aXNpb24KLSAgICAgICAgICogICAgICAgICBvZiB0aGUgaW50ZWdlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHByZXNzaW9uIG9uIHdoaWNoIHRoZQotICAgICAgICAgKiAgICAgICAgIG1ldGhvZCB3YXMgaW52b2tlZCBieSB0aGUgYXJndW1lbnQuCi0gICAgICAgICAqLwogCUV4cHJlc3Npb24gbW9kKEV4cHJlc3Npb24gZXhwcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9GZXRjaEpvaW5PYmplY3QuamF2YSBiL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvRmV0Y2hKb2luT2JqZWN0LmphdmEKaW5kZXggNzA3Mjg2ZC4uMDg4MTE2YyAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9GZXRjaEpvaW5PYmplY3QuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL0ZldGNoSm9pbk9iamVjdC5qYXZhCkBAIC0yNCw4ICsyNCw1IEBACiAvLwogcGFja2FnZSBqYXZheC5wZXJzaXN0ZW5jZTsKIAotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCBmb3IgdGhlIHJlc3VsdCBvZiBhIGZldGNoIGpvaW4uCi0gKi8KIHB1YmxpYyBpbnRlcmZhY2UgRmV0Y2hKb2luT2JqZWN0IHsKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvTWFwS2V5Q29sdW1uLmphdmEgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL01hcEtleUNvbHVtbi5qYXZhCmluZGV4IDYzMTBjNTMuLmYwYTBlNDIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvTWFwS2V5Q29sdW1uLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9NYXBLZXlDb2x1bW4uamF2YQpAQCAtNDgsNyArNDgsNyBAQAogCiAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwogCi0gICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KKyAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOwogCi0gICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCisgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9QYXRoRXhwcmVzc2lvbi5qYXZhIGIvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9QYXRoRXhwcmVzc2lvbi5qYXZhCmluZGV4IGYwYTcxYzMuLjhkZDFhNWEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvUGF0aEV4cHJlc3Npb24uamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL1BhdGhFeHByZXNzaW9uLmphdmEKQEAgLTI0LDk5ICsyNCwyMyBAQAogLy8KIHBhY2thZ2UgamF2YXgucGVyc2lzdGVuY2U7CiAKLS8qKgotICogSW50ZXJmYWNlIGZvciBvcGVyYXRpb25zIG92ZXIgb2JqZWN0cyByZWFjaGVkIHZpYSBwYXRocwotICovCiBwdWJsaWMgaW50ZXJmYWNlIFBhdGhFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgcGF0aCBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlLiBJdCBpcwotICAgICAqIG5vdCBwZXJtaXR0ZWQgdG8gaW52b2tlIHRoaXMgbWV0aG9kIG9uIGEgcGF0aCBleHByZXNzaW9uIHRoYXQgY29ycmVzcG9uZHMKLSAgICAgKiB0byBhIG11bHRpLXZhbHVlZCBhc3NvY2lhdGlvbiBvciBlbGVtZW50IGNvbGxlY3Rpb24uIFRoZSBwYXRoIGV4cHJlc3Npb24KLSAgICAgKiBvbiB3aGljaCB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIG11c3QgY29ycmVzcG9uZCB0byBhIGNsYXNzIGNvbnRhaW5pbmcgdGhlCi0gICAgICogcmVmZXJlbmNlZCBhdHRyaWJ1dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSAtCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUKLSAgICAgKiBAcmV0dXJuIHBhdGggZXhwcmVzc2lvbgotICAgICAqLworCiAgICAgUGF0aEV4cHJlc3Npb24gZ2V0KFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybiBhbiBleHByZXNzaW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHR5cGUgb2YgdGhlIGVudGl0eS4gVGhpcwotICAgICAqIG1ldGhvZCBjYW4gb25seSBiZSBpbnZva2VkIG9uIGEgcGF0aCBleHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gYW4KLSAgICAgKiBlbnRpdHkuIEl0IGlzIG5vdCBwZXJtaXR0ZWQgdG8gaW52b2tlIHRoaXMgbWV0aG9kIG9uIGEgcGF0aCBleHByZXNzaW9uCi0gICAgICogdGhhdCBjb3JyZXNwb25kcyB0byBhIG11bHRpLXZhbHVlZCBhc3NvY2lhdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gZXhwcmVzc2lvbiBkZW5vdGluZyB0aGUgZW50aXR5J3MgdHlwZQotICAgICAqLwogICAgIEV4cHJlc3Npb24gdHlwZSgpOwogCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGFuIGV4cHJlc3Npb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCi0gICAgICogYXNzb2NpYXRpb24gb3IgZWxlbWVudCBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhdGggZXhwcmVzc2lvbi4KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBpbnZva2VkIG9uIGEgcGF0aCBleHByZXNzaW9uIHRoYXQgY29ycmVzcG9uZHMgdG8KLSAgICAgKiBhIG11bHRpLXZhbHVlZCBhc3NvY2lhdGlvbiBvciB0byBhbiBlbGVtZW50IGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGV4cHJlc3Npb24gZGVub3RpbmcgdGhlIHNpemUKLSAgICAgKi8KICAgICBFeHByZXNzaW9uIHNpemUoKTsKIAotICAgIC8qKgotICAgICAqIEFkZCBhIHJlc3RyaWN0aW9uIHRoYXQgdGhlIHBhdGggZXhwcmVzc2lvbiBtdXN0IGNvcnJlc3BvbmQgdG8gYW4KLSAgICAgKiBhc3NvY2lhdGlvbiBvciBlbGVtZW50IGNvbGxlY3Rpb24gdGhhdCBpcyBlbXB0eSAoaGFzIG5vIGVsZW1lbnRzKS4gVGhpcwotICAgICAqIG1ldGhvZCBjYW4gb25seSBiZSBpbnZva2VkIG9uIGEgcGF0aCBleHByZXNzaW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gYQotICAgICAqIG11bHRpLXZhbHVlZCBhc3NvY2lhdGlvbiBvciB0byBhbiBlbGVtZW50IGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHByZWRpY2F0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXN0cmljdGlvbgotICAgICAqLwogICAgIFByZWRpY2F0ZSBpc0VtcHR5KCk7CiAKLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IHRoYXQgdGhlIGF2ZyBvcGVyYXRpb24gaXMgdG8gYmUgYXBwbGllZC4gVGhlIHBhdGggZXhwcmVzc2lvbiBtdXN0Ci0gICAgICogY29ycmVzcG9uZCB0byBhbiBhdHRyaWJ1dGUgb2YgYSBudW1lcmljIHR5cGUuIEl0IGlzIG5vdCBwZXJtaXR0ZWQgdG8KLSAgICAgKiBpbnZva2UgdGhpcyBtZXRob2Qgb24gYSBwYXRoIGV4cHJlc3Npb24gdGhhdCBjb3JyZXNwb25kcyB0byBhCi0gICAgICogbXVsdGktdmFsdWVkIGFzc29jaWF0aW9uIG9yIGVsZW1lbnQgY29sbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBhZ2dyZWdhdGUKLSAgICAgKi8KICAgICBBZ2dyZWdhdGUgYXZnKCk7CiAKLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IHRoYXQgdGhlIG1heCBvcGVyYXRpb24gaXMgdG8gYmUgYXBwbGllZC4gVGhlIHBhdGggZXhwcmVzc2lvbiBtdXN0Ci0gICAgICogY29ycmVzcG9uZCB0byBhbiBhdHRyaWJ1dGUgb2YgYW4gb3JkZXJhYmxlIHR5cGUuIEl0IGlzIG5vdCBwZXJtaXR0ZWQgdG8KLSAgICAgKiBpbnZva2UgdGhpcyBtZXRob2Qgb24gYSBwYXRoIGV4cHJlc3Npb24gdGhhdCBjb3JyZXNwb25kcyB0byBhCi0gICAgICogbXVsdGktdmFsdWVkIGFzc29jaWF0aW9uIG9yIGVsZW1lbnQgY29sbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBhZ2dyZWdhdGUKLSAgICAgKi8KICAgICBBZ2dyZWdhdGUgbWF4KCk7CiAKLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IHRoYXQgdGhlIG1pbiBvcGVyYXRpb24gaXMgdG8gYmUgYXBwbGllZC4gVGhlIHBhdGggZXhwcmVzc2lvbiBtdXN0Ci0gICAgICogY29ycmVzcG9uZCB0byBhbiBhdHRyaWJ1dGUgb2YgYW4gb3JkZXJhYmxlIHR5cGUuIEl0IGlzIG5vdCBwZXJtaXR0ZWQgdG8KLSAgICAgKiBpbnZva2UgdGhpcyBtZXRob2Qgb24gYSBwYXRoIGV4cHJlc3Npb24gdGhhdCBjb3JyZXNwb25kcyB0byBhCi0gICAgICogbXVsdGktdmFsdWVkIGFzc29jaWF0aW9uIG9yIGVsZW1lbnQgY29sbGVjdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBhZ2dyZWdhdGUKLSAgICAgKi8KICAgICBBZ2dyZWdhdGUgbWluKCk7CiAKLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IHRoYXQgdGhlIGNvdW50IG9wZXJhdGlvbiBpcyB0byBiZSBhcHBsaWVkLiBJdCBpcyBub3QgcGVybWl0dGVkIHRvCi0gICAgICogaW52b2tlIHRoaXMgbWV0aG9kIG9uIGEgcGF0aCBleHByZXNzaW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gYQotICAgICAqIG11bHRpLXZhbHVlZCBhc3NvY2lhdGlvbiBvciBlbGVtZW50IGNvbGxlY3Rpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgYWdncmVnYXRlCi0gICAgICovCiAgICAgQWdncmVnYXRlIGNvdW50KCk7CiAKLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IHRoYXQgdGhlIHN1bSBvcGVyYXRpb24gaXMgdG8gYmUgYXBwbGllZC4gVGhlIHBhdGggZXhwcmVzc2lvbiBtdXN0Ci0gICAgICogY29ycmVzcG9uZCB0byBhbiBhdHRyaWJ1dGUgb2YgYSBudW1lcmljIHR5cGUuIEl0IGlzIG5vdCBwZXJtaXR0ZWQgdG8KLSAgICAgKiBpbnZva2UgdGhpcyBtZXRob2Qgb24gYSBwYXRoIGV4cHJlc3Npb24gdGhhdCBjb3JyZXNwb25kcyB0byBhCi0gICAgICogbXVsdGktdmFsdWVkIGFzc29jaWF0aW9uIG9yIGVsZW1lbnQgY29sbGVjdGlvbi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBhZ2dyZWdhdGUKLQkgKi8KIAlBZ2dyZWdhdGUgc3VtKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9QcmVkaWNhdGUuamF2YSBiL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvUHJlZGljYXRlLmphdmEKaW5kZXggYzVmYjM1MS4uOTRjNTNhOCAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9QcmVkaWNhdGUuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL1ByZWRpY2F0ZS5qYXZhCkBAIC0yNCwzNSArMjQsMTEgQEAKIC8vCiBwYWNrYWdlIGphdmF4LnBlcnNpc3RlbmNlOwogCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIGRlZmluZSBjb21wb3VuZCBwcmVkaWNhdGVzLgotICovCiBwdWJsaWMgaW50ZXJmYWNlIFByZWRpY2F0ZSB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBBTkQgb2YgdGhlIHByZWRpY2F0ZSB3aXRoIHRoZSBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgLQotICAgICAqICAgICAgICAgICAgICAgICAgQSBzaW1wbGUgb3IgY29tcG91bmQgcHJlZGljYXRlCi0gICAgICogQHJldHVybiB0aGUgcHJlZGljYXRlIHRoYXQgaXMgdGhlIEFORCBvZiB0aGUgb3JpZ2luYWwgc2ltcGxlIG9yIGNvbXBvdW5kCi0gICAgICogICAgICAgICBwcmVkaWNhdGUgYW5kIHRoZSBhcmd1bWVudC4KLSAgICAgKi8KKwogICAgIFByZWRpY2F0ZSBhbmQoUHJlZGljYXRlIHByZWRpY2F0ZSk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIE9SIG9mIHRoZSBwcmVkaWNhdGUgd2l0aCB0aGUgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlIC0KLSAgICAgKiAgICAgICAgICAgICAgICAgIEEgc2ltcGxlIG9yIGNvbXBvdW5kIHByZWRpY2F0ZQotICAgICAqIEByZXR1cm4gdGhlIHByZWRpY2F0ZSB0aGF0IGlzIHRoZSBPUiBvZiB0aGUgb3JpZ2luYWwgc2ltcGxlIG9yIGNvbXBvdW5kCi0gICAgICogICAgICAgICBwcmVkaWNhdGUgYW5kIHRoZSBhcmd1bWVudC4KLSAgICAgKi8KICAgICBQcmVkaWNhdGUgb3IoUHJlZGljYXRlIHByZWRpY2F0ZSk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmVnYXRpb24gb2YgdGhlIHByZWRpY2F0ZSB3aXRoIHRoZSBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHByZWRpY2F0ZSB0aGF0IGlzIHRoZSBuZWdhdGlvbiBvZiB0aGUgb3JpZ2luYWwgc2ltcGxlIG9yCi0JICogICAgICAgICBjb21wb3VuZCBwcmVkaWNhdGUuCi0JICovCiAJUHJlZGljYXRlIG5vdCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvUHJlZGljYXRlT3BlcmFuZC5qYXZhIGIvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9QcmVkaWNhdGVPcGVyYW5kLmphdmEKaW5kZXggY2IxOTU4Ny4uMjhhMmJjZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9QcmVkaWNhdGVPcGVyYW5kLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9QcmVkaWNhdGVPcGVyYW5kLmphdmEKQEAgLTI3LDU2NyArMjcsMTE1IEBACiBpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwogCi0vKioKLSAqIEludGVyZmFjZSBmb3IgY29uc3RydWN0aW5nIHdoZXJlLWNsYXVzZSBhbmQgaGF2aW5nLWNsYXVzZSBjb25kaXRpb25zLgotICogSW5zdGFuY2VzIG9mIFByZWRpY2F0ZU9wZXJhbmQgYXJlIHVzZWQgaW4gY29uc3RydWN0aW5nIHByZWRpY2F0ZXMgcGFzc2VkIHRvCi0gKiB0aGUgd2hlcmUgb3IgaGF2aW5nIG1ldGhvZHMuCi0gKi8KIHB1YmxpYyBpbnRlcmZhY2UgUHJlZGljYXRlT3BlcmFuZCB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIGVxdWFsaXR5IHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcgLQotICAgICAqICAgICAgICAgICAgUHJlZGljYXRlT3BlcmFuZCBpbnN0YW5jZSBvciBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLworCiAgICAgUHJlZGljYXRlIGVxdWFsKFByZWRpY2F0ZU9wZXJhbmQgYXJnKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByZWRpY2F0ZSBmb3IgdGVzdGluZyBlcXVhbGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xzIC0KLSAgICAgKiAgICAgICAgICAgIGVudGl0eSBjbGFzcwotICAgICAqIEByZXR1cm4gY29uZGl0aW9uYWwgcHJlZGljYXRlCi0gICAgICovCiAgICAgUHJlZGljYXRlIGVxdWFsKENsYXNzIGNscyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3RpbmcgZXF1YWxpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZyAtCi0gICAgICogICAgICAgICAgICBudW1lcmljCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgZXF1YWwoTnVtYmVyIGFyZyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3RpbmcgZXF1YWxpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZyAtCi0gICAgICogICAgICAgICAgICBzdHJpbmcgdmFsdWUKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBlcXVhbChTdHJpbmcgYXJnKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByZWRpY2F0ZSBmb3IgdGVzdGluZyBlcXVhbGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnIC0KLSAgICAgKiAgICAgICAgICAgIGJvb2xlYW4gdmFsdWUKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBlcXVhbChib29sZWFuIGFyZyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3RpbmcgZXF1YWxpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZyAtCi0gICAgICogICAgICAgICAgICBkYXRlCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgZXF1YWwoRGF0ZSBhcmcpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIGVxdWFsaXR5IHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcgLQotICAgICAqICAgICAgICAgICAgY2FsZW5kYXIKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBlcXVhbChDYWxlbmRhciBhcmcpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIGVxdWFsaXR5IHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlIC0KLSAgICAgKiAgICAgICAgICBlbnVtCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgZXF1YWwoRW51bTw/PiBlKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByZWRpY2F0ZSBmb3IgdGVzdGluZyBpbmVxdWFsaXR5IHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcgLQotICAgICAqICAgICAgICAgICAgUHJlZGljYXRlT3BlcmFuZCBpbnN0YW5jZSBvciBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBub3RFcXVhbChQcmVkaWNhdGVPcGVyYW5kIGFyZyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3RpbmcgaW5lcXVhbGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xzIC0KLSAgICAgKiAgICAgICAgICAgIGVudGl0eSBjbGFzcwotICAgICAqIEByZXR1cm4gY29uZGl0aW9uYWwgcHJlZGljYXRlCi0gICAgICovCiAgICAgUHJlZGljYXRlIG5vdEVxdWFsKENsYXNzIGNscyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3RpbmcgaW5lcXVhbGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnIC0KLSAgICAgKiAgICAgICAgICAgIG51bWJlcmljIHZhbHVlCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgbm90RXF1YWwoTnVtYmVyIGFyZyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3RpbmcgaW5lcXVhbGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnIC0KLSAgICAgKiAgICAgICAgICAgIHN0cmluZyB2YWx1ZQotICAgICAqIEByZXR1cm4gY29uZGl0aW9uYWwgcHJlZGljYXRlCi0gICAgICovCiAgICAgUHJlZGljYXRlIG5vdEVxdWFsKFN0cmluZyBhcmcpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIGluZXF1YWxpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZyAtCi0gICAgICogICAgICAgICAgICBib29sZWFuIHZhbHVlCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgbm90RXF1YWwoYm9vbGVhbiBhcmcpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIGluZXF1YWxpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZyAtCi0gICAgICogICAgICAgICAgICBkYXRlCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgbm90RXF1YWwoRGF0ZSBhcmcpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIGluZXF1YWxpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZyAtCi0gICAgICogICAgICAgICAgICBjYWxlbmRhcgotICAgICAqIEByZXR1cm4gY29uZGl0aW9uYWwgcHJlZGljYXRlCi0gICAgICovCiAgICAgUHJlZGljYXRlIG5vdEVxdWFsKENhbGVuZGFyIGFyZyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3RpbmcgaW5lcXVhbGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZSAtCi0gICAgICogICAgICAgICAgZW51bQotICAgICAqIEByZXR1cm4gY29uZGl0aW9uYWwgcHJlZGljYXRlCi0gICAgICovCiAgICAgUHJlZGljYXRlIG5vdEVxdWFsKEVudW08Pz4gZSk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBpcyBncmVhdGVyCi0gICAgICogdGhhbiB0aGUgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnIC0KLSAgICAgKiAgICAgICAgICAgIFByZWRpY2F0ZU9wZXJhbmQgaW5zdGFuY2Ugb3IgcGFyYW1ldGVyCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgZ3JlYXRlclRoYW4oUHJlZGljYXRlT3BlcmFuZCBhcmcpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIHdoZXRoZXIgdGhlIFByZWRpY2F0ZU9wZXJhbmQgaXMgZ3JlYXRlcgotICAgICAqIHRoYW4gdGhlIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZyAtCi0gICAgICogICAgICAgICAgICBudW1lcmljCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgZ3JlYXRlclRoYW4oTnVtYmVyIGFyZyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBpcyBncmVhdGVyCi0gICAgICogdGhhbiB0aGUgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnIC0KLSAgICAgKiAgICAgICAgICAgIHN0cmluZwotICAgICAqIEByZXR1cm4gY29uZGl0aW9uYWwgcHJlZGljYXRlCi0gICAgICovCiAgICAgUHJlZGljYXRlIGdyZWF0ZXJUaGFuKFN0cmluZyBhcmcpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIHdoZXRoZXIgdGhlIFByZWRpY2F0ZU9wZXJhbmQgaXMgZ3JlYXRlcgotICAgICAqIHRoYW4gdGhlIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZyAtCi0gICAgICogICAgICAgICAgICBkYXRlCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgZ3JlYXRlclRoYW4oRGF0ZSBhcmcpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIHdoZXRoZXIgdGhlIFByZWRpY2F0ZU9wZXJhbmQgaXMgZ3JlYXRlcgotICAgICAqIHRoYW4gdGhlIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZyAtCi0gICAgICogICAgICAgICAgICBjYWxlbmRhcgotICAgICAqIEByZXR1cm4gY29uZGl0aW9uYWwgcHJlZGljYXRlCi0gICAgICovCiAgICAgUHJlZGljYXRlIGdyZWF0ZXJUaGFuKENhbGVuZGFyIGFyZyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBpcyBncmVhdGVyCi0gICAgICogdGhhbiBvciBlcXVhbCB0byB0aGUgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnIC0KLSAgICAgKiAgICAgICAgICAgIFByZWRpY2F0ZU9wZXJhbmQgaW5zdGFuY2Ugb3IgcGFyYW1ldGVyCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgZ3JlYXRlckVxdWFsKFByZWRpY2F0ZU9wZXJhbmQgYXJnKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByZWRpY2F0ZSBmb3IgdGVzdGluZyB3aGV0aGVyIHRoZSBQcmVkaWNhdGVPcGVyYW5kIGlzIGdyZWF0ZXIKLSAgICAgKiB0aGFuIG9yIGVxdWFsIHRvIHRoZSBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcgLQotICAgICAqICAgICAgICAgICAgbnVtZXJpYwotICAgICAqIEByZXR1cm4gY29uZGl0aW9uYWwgcHJlZGljYXRlCi0gICAgICovCiAgICAgUHJlZGljYXRlIGdyZWF0ZXJFcXVhbChOdW1iZXIgYXJnKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByZWRpY2F0ZSBmb3IgdGVzdGluZyB3aGV0aGVyIHRoZSBQcmVkaWNhdGVPcGVyYW5kIGlzIGdyZWF0ZXIKLSAgICAgKiB0aGFuIG9yIGVxdWFsIHRvIHRoZSBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcgLQotICAgICAqICAgICAgICAgICAgc3RyaW5nCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgZ3JlYXRlckVxdWFsKFN0cmluZyBhcmcpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIHdoZXRoZXIgdGhlIFByZWRpY2F0ZU9wZXJhbmQgaXMgZ3JlYXRlcgotICAgICAqIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZyAtCi0gICAgICogICAgICAgICAgICBkYXRlCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgZ3JlYXRlckVxdWFsKERhdGUgYXJnKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByZWRpY2F0ZSBmb3IgdGVzdGluZyB3aGV0aGVyIHRoZSBQcmVkaWNhdGVPcGVyYW5kIGlzIGdyZWF0ZXIKLSAgICAgKiB0aGFuIG9yIGVxdWFsIHRvIHRoZSBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcgLQotICAgICAqICAgICAgICAgICAgY2FsZW5kYXIKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBncmVhdGVyRXF1YWwoQ2FsZW5kYXIgYXJnKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByZWRpY2F0ZSBmb3IgdGVzdGluZyB3aGV0aGVyIHRoZSBQcmVkaWNhdGVPcGVyYW5kIGlzIGxlc3MgdGhhbgotICAgICAqIHRoZSBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcgLQotICAgICAqICAgICAgICAgICAgUHJlZGljYXRlT3BlcmFuZCBpbnN0YW5jZSBvciBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBsZXNzVGhhbihQcmVkaWNhdGVPcGVyYW5kIGFyZyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBpcyBsZXNzIHRoYW4KLSAgICAgKiB0aGUgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnIC0KLSAgICAgKiAgICAgICAgICAgIG51bWVyaWMKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBsZXNzVGhhbihOdW1iZXIgYXJnKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByZWRpY2F0ZSBmb3IgdGVzdGluZyB3aGV0aGVyIHRoZSBQcmVkaWNhdGVPcGVyYW5kIGlzIGxlc3MgdGhhbgotICAgICAqIHRoZSBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcgLQotICAgICAqICAgICAgICAgICAgc3RyaW5nCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgbGVzc1RoYW4oU3RyaW5nIGFyZyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBpcyBsZXNzIHRoYW4KLSAgICAgKiB0aGUgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnIC0KLSAgICAgKiAgICAgICAgICAgIGRhdGUKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBsZXNzVGhhbihEYXRlIGFyZyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBpcyBsZXNzIHRoYW4KLSAgICAgKiB0aGUgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnIC0KLSAgICAgKiAgICAgICAgICAgIGNhbGVuZGFyCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgbGVzc1RoYW4oQ2FsZW5kYXIgYXJnKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByZWRpY2F0ZSBmb3IgdGVzdGluZyB3aGV0aGVyIHRoZSBQcmVkaWNhdGVPcGVyYW5kIGlzIGxlc3MgdGhhbgotICAgICAqIG9yIGVxdWFsIHRvIHRoZSBhcmd1bWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcgLQotICAgICAqICAgICAgICAgICAgUHJlZGljYXRlT3BlcmFuZCBpbnN0YW5jZSBvciBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBsZXNzRXF1YWwoUHJlZGljYXRlT3BlcmFuZCBhcmcpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIHdoZXRoZXIgdGhlIFByZWRpY2F0ZU9wZXJhbmQgaXMgbGVzcyB0aGFuCi0gICAgICogb3IgZXF1YWwgdG8gdGhlIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZyAtCi0gICAgICogICAgICAgICAgICBudW1lcmljCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgbGVzc0VxdWFsKE51bWJlciBhcmcpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIHdoZXRoZXIgdGhlIFByZWRpY2F0ZU9wZXJhbmQgaXMgbGVzcyB0aGFuCi0gICAgICogb3IgZXF1YWwgdG8gdGhlIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZyAtCi0gICAgICogICAgICAgICAgICBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBsZXNzRXF1YWwoU3RyaW5nIGFyZyk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBpcyBsZXNzIHRoYW4KLSAgICAgKiBvciBlcXVhbCB0byB0aGUgYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnIC0KLSAgICAgKiAgICAgICAgICAgIGRhdGUKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBsZXNzRXF1YWwoRGF0ZSBhcmcpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIHdoZXRoZXIgdGhlIFByZWRpY2F0ZU9wZXJhbmQgaXMgbGVzcyB0aGFuCi0gICAgICogb3IgZXF1YWwgdG8gdGhlIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZyAtCi0gICAgICogICAgICAgICAgICBjYWxlbmRhcgotICAgICAqIEByZXR1cm4gY29uZGl0aW9uYWwgcHJlZGljYXRlCi0gICAgICovCiAgICAgUHJlZGljYXRlIGxlc3NFcXVhbChDYWxlbmRhciBhcmcpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIHdoZXRoZXIgdGhlIFByZWRpY2F0ZU9wZXJhbmQgbGllcyBiZXR3ZWVuCi0gICAgICogKGluY2x1c2l2ZSkgdGhlIHR3byBhcmd1bWVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnMSAtCi0gICAgICogICAgICAgICAgICAgUHJlZGljYXRlT3BlcmFuZCBpbnN0YW5jZSBvciBwYXJhbWV0ZXIKLSAgICAgKiBAcGFyYW0gYXJnMiAtCi0gICAgICogICAgICAgICAgICAgUHJlZGljYXRlT3BlcmFuZCBpbnN0YW5jZSBvciBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBiZXR3ZWVuKFByZWRpY2F0ZU9wZXJhbmQgYXJnMSwgUHJlZGljYXRlT3BlcmFuZCBhcmcyKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByZWRpY2F0ZSBmb3IgdGVzdGluZyB3aGV0aGVyIHRoZSBQcmVkaWNhdGVPcGVyYW5kIGxpZXMgYmV0d2VlbgotICAgICAqIChpbmNsdXNpdmUpIHRoZSB0d28gYXJndW1lbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZzEgLQotICAgICAqICAgICAgICAgICAgIFByZWRpY2F0ZU9wZXJhbmQgaW5zdGFuY2Ugb3IgcGFyYW1ldGVyCi0gICAgICogQHBhcmFtIGFyZzIgLQotICAgICAqICAgICAgICAgICAgIG51bWVyaWMKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBiZXR3ZWVuKFByZWRpY2F0ZU9wZXJhbmQgYXJnMSwgTnVtYmVyIGFyZzIpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIHdoZXRoZXIgdGhlIFByZWRpY2F0ZU9wZXJhbmQgbGllcyBiZXR3ZWVuCi0gICAgICogKGluY2x1c2l2ZSkgdGhlIHR3byBhcmd1bWVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnMSAtCi0gICAgICogICAgICAgICAgICAgbnVtZXJpYwotICAgICAqIEBwYXJhbSBhcmcyIC0KLSAgICAgKiAgICAgICAgICAgICBQcmVkaWNhdGVPcGVyYW5kIGluc3RhbmNlIG9yIHBhcmFtZXRlcgotICAgICAqIEByZXR1cm4gY29uZGl0aW9uYWwgcHJlZGljYXRlCi0gICAgICovCiAgICAgUHJlZGljYXRlIGJldHdlZW4oTnVtYmVyIGFyZzEsIFByZWRpY2F0ZU9wZXJhbmQgYXJnMik7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBsaWVzIGJldHdlZW4KLSAgICAgKiAoaW5jbHVzaXZlKSB0aGUgdHdvIGFyZ3VtZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcxIC0KLSAgICAgKiAgICAgICAgICAgICBudW1lcmljCi0gICAgICogQHBhcmFtIGFyZzIgLQotICAgICAqICAgICAgICAgICAgIG51bWVyaWMKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBiZXR3ZWVuKE51bWJlciBhcmcxLCBOdW1iZXIgYXJnMik7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBsaWVzIGJldHdlZW4KLSAgICAgKiAoaW5jbHVzaXZlKSB0aGUgdHdvIGFyZ3VtZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcxIC0KLSAgICAgKiAgICAgICAgICAgICBQcmVkaWNhdGVPcGVyYW5kIGluc3RhbmNlIG9yIHBhcmFtZXRlcgotICAgICAqIEBwYXJhbSBhcmcyIC0KLSAgICAgKiAgICAgICAgICAgICBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBiZXR3ZWVuKFByZWRpY2F0ZU9wZXJhbmQgYXJnMSwgU3RyaW5nIGFyZzIpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIHdoZXRoZXIgdGhlIFByZWRpY2F0ZU9wZXJhbmQgbGllcyBiZXR3ZWVuCi0gICAgICogKGluY2x1c2l2ZSkgdGhlIHR3byBhcmd1bWVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnMSAtCi0gICAgICogICAgICAgICAgICAgc3RyaW5nCi0gICAgICogQHBhcmFtIGFyZzIgLQotICAgICAqICAgICAgICAgICAgIFByZWRpY2F0ZU9wZXJhbmQgaW5zdGFuY2Ugb3IgcGFyYW1ldGVyCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgYmV0d2VlbihTdHJpbmcgYXJnMSwgUHJlZGljYXRlT3BlcmFuZCBhcmcyKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByZWRpY2F0ZSBmb3IgdGVzdGluZyB3aGV0aGVyIHRoZSBQcmVkaWNhdGVPcGVyYW5kIGxpZXMgYmV0d2VlbgotICAgICAqIChpbmNsdXNpdmUpIHRoZSB0d28gYXJndW1lbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZzEgLQotICAgICAqICAgICAgICAgICAgIHN0cmluZwotICAgICAqIEBwYXJhbSBhcmcyIC0KLSAgICAgKiAgICAgICAgICAgICBzdHJpbmcKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBiZXR3ZWVuKFN0cmluZyBhcmcxLCBTdHJpbmcgYXJnMik7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBsaWVzIGJldHdlZW4KLSAgICAgKiAoaW5jbHVzaXZlKSB0aGUgdHdvIGFyZ3VtZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcxIC0KLSAgICAgKiAgICAgICAgICAgICBQcmVkaWNhdGVPcGVyYW5kIGluc3RhbmNlIG9yIHBhcmFtZXRlcgotICAgICAqIEBwYXJhbSBhcmcyIC0KLSAgICAgKiAgICAgICAgICAgICBkYXRlCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgYmV0d2VlbihQcmVkaWNhdGVPcGVyYW5kIGFyZzEsIERhdGUgYXJnMik7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBsaWVzIGJldHdlZW4KLSAgICAgKiAoaW5jbHVzaXZlKSB0aGUgdHdvIGFyZ3VtZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcxIC0KLSAgICAgKiAgICAgICAgICAgICBkYXRlCi0gICAgICogQHBhcmFtIGFyZzIgLQotICAgICAqICAgICAgICAgICAgIFByZWRpY2F0ZU9wZXJhbmQgaW5zdGFuY2Ugb3IgcGFyYW1ldGVyCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgYmV0d2VlbihEYXRlIGFyZzEsIFByZWRpY2F0ZU9wZXJhbmQgYXJnMik7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBsaWVzIGJldHdlZW4KLSAgICAgKiAoaW5jbHVzaXZlKSB0aGUgdHdvIGFyZ3VtZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcxIC0KLSAgICAgKiAgICAgICAgICAgICBkYXRlCi0gICAgICogQHBhcmFtIGFyZzIgLQotICAgICAqICAgICAgICAgICAgIGRhdGUKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBiZXR3ZWVuKERhdGUgYXJnMSwgRGF0ZSBhcmcyKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByZWRpY2F0ZSBmb3IgdGVzdGluZyB3aGV0aGVyIHRoZSBQcmVkaWNhdGVPcGVyYW5kIGxpZXMgYmV0d2VlbgotICAgICAqIChpbmNsdXNpdmUpIHRoZSB0d28gYXJndW1lbnRzLgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZzEgLQotICAgICAqICAgICAgICAgICAgIFByZWRpY2F0ZU9wZXJhbmQgaW5zdGFuY2Ugb3IgcGFyYW1ldGVyCi0gICAgICogQHBhcmFtIGFyZzIgLQotICAgICAqICAgICAgICAgICAgIGNhbGVuZGFyCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgYmV0d2VlbihQcmVkaWNhdGVPcGVyYW5kIGFyZzEsIENhbGVuZGFyIGFyZzIpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIHdoZXRoZXIgdGhlIFByZWRpY2F0ZU9wZXJhbmQgbGllcyBiZXR3ZWVuCi0gICAgICogKGluY2x1c2l2ZSkgdGhlIHR3byBhcmd1bWVudHMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnMSAtCi0gICAgICogICAgICAgICAgICAgY2FsZW5kYXIKLSAgICAgKiBAcGFyYW0gYXJnMiAtCi0gICAgICogICAgICAgICAgICAgUHJlZGljYXRlT3BlcmFuZCBpbnN0YW5jZSBvciBwYXJhbWV0ZXIKLSAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBiZXR3ZWVuKENhbGVuZGFyIGFyZzEsIFByZWRpY2F0ZU9wZXJhbmQgYXJnMik7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBsaWVzIGJldHdlZW4KLSAgICAgKiAoaW5jbHVzaXZlKSB0aGUgdHdvIGFyZ3VtZW50cy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcxIC0KLSAgICAgKiAgICAgICAgICAgICBjYWxlbmRhcgotICAgICAqIEBwYXJhbSBhcmcyIC0KLSAgICAgKiAgICAgICAgICAgICBjYWxlbmRhcgotICAgICAqIEByZXR1cm4gY29uZGl0aW9uYWwgcHJlZGljYXRlCi0gICAgICovCiAgICAgUHJlZGljYXRlIGJldHdlZW4oQ2FsZW5kYXIgYXJnMSwgQ2FsZW5kYXIgYXJnMik7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBzYXRpc2ZpZXMgdGhlCi0gICAgICogZ2l2ZW4gcGF0dGVybi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXR0ZXJuCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgbGlrZShQcmVkaWNhdGVPcGVyYW5kIHBhdHRlcm4pOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcHJlZGljYXRlIGZvciB0ZXN0aW5nIHdoZXRoZXIgdGhlIFByZWRpY2F0ZU9wZXJhbmQgc2F0aXNmaWVzIHRoZQotICAgICAqIGdpdmVuIHBhdHRlcm4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0dGVybgotICAgICAqIEBwYXJhbSBlc2NhcGVDaGFyCi0gICAgICogQHJldHVybiBjb25kaXRpb25hbCBwcmVkaWNhdGUKLSAgICAgKi8KICAgICBQcmVkaWNhdGUgbGlrZShQcmVkaWNhdGVPcGVyYW5kIHBhdHRlcm4sIFByZWRpY2F0ZU9wZXJhbmQgZXNjYXBlQ2hhcik7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBzYXRpc2ZpZXMgdGhlCi0JICogZ2l2ZW4gcGF0dGVybi4KLQkgKgotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogQHBhcmFtIGVzY2FwZUNoYXIKLQkgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotCSAqLwogCVByZWRpY2F0ZSBsaWtlKFByZWRpY2F0ZU9wZXJhbmQgcGF0dGVybiwgY2hhciBlc2NhcGVDaGFyKTsKIAotCS8qKgotCSAqIENyZWF0ZSBhIHByZWRpY2F0ZSBmb3IgdGVzdGluZyB3aGV0aGVyIHRoZSBQcmVkaWNhdGVPcGVyYW5kIHNhdGlzZmllcyB0aGUKLQkgKiBnaXZlbiBwYXR0ZXJuLgotCSAqCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotCSAqLwogCVByZWRpY2F0ZSBsaWtlKFN0cmluZyBwYXR0ZXJuKTsKIAotCS8qKgotCSAqIENyZWF0ZSBhIHByZWRpY2F0ZSBmb3IgdGVzdGluZyB3aGV0aGVyIHRoZSBQcmVkaWNhdGVPcGVyYW5kIHNhdGlzZmllcyB0aGUKLQkgKiBnaXZlbiBwYXR0ZXJuLgotCSAqCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiBAcGFyYW0gZXNjYXBlQ2hhcgotCSAqIEByZXR1cm4gY29uZGl0aW9uYWwgcHJlZGljYXRlCi0JICovCiAJUHJlZGljYXRlIGxpa2UoU3RyaW5nIHBhdHRlcm4sIFByZWRpY2F0ZU9wZXJhbmQgZXNjYXBlQ2hhcik7CiAKLQkvKioKLQkgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIHRlc3Rpbmcgd2hldGhlciB0aGUgUHJlZGljYXRlT3BlcmFuZCBzYXRpc2ZpZXMgdGhlCi0JICogZ2l2ZW4gcGF0dGVybi4KLQkgKgotCSAqIEBwYXJhbSBwYXR0ZXJuCi0JICogQHBhcmFtIGVzY2FwZUNoYXIKLQkgKiBAcmV0dXJuIGNvbmRpdGlvbmFsIHByZWRpY2F0ZQotCSAqLwogCVByZWRpY2F0ZSBsaWtlKFN0cmluZyBwYXR0ZXJuLCBjaGFyIGVzY2FwZUNoYXIpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9RdWVyeS5qYXZhIGIvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9RdWVyeS5qYXZhCmluZGV4IGNkMzBlOTIuLjg4ZmVkYzUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvUXVlcnkuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL1F1ZXJ5LmphdmEKQEAgLTMxLDI4NCArMzEsNTcgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIGNvbnRyb2wgcXVlcnkgZXhlY3V0aW9uLgotICoKICAqIEB2ZXJzaW9uICRSZXYkICREYXRlJAogICovCiBwdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5IHsKIAotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgYSBTRUxFQ1QgcXVlcnkgYW5kIHJldHVybiB0aGUgcXVlcnkgcmVzdWx0cwotICAgICAqIGFzIGEgTGlzdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSByZXN1bHRzCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gICAgICAgIGlmIGNhbGxlZCBmb3IgYSBKYXZhCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcnNpc3RlbmNlIHF1ZXJ5IGxhbmd1YWdlIFVQREFURSBvciBERUxFVEUgc3RhdGVtZW50Ci0gICAgICogQHRocm93cyBRdWVyeVRpbWVvdXRFeGNlcHRpb24gICAgICAgIGlmIHRoZSBxdWVyeSBleGVjdXRpb24gZXhjZWVkcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVlcnkgdGltZW91dCB2YWx1ZSBzZXQKLSAgICAgKiBAdGhyb3dzIFRyYW5zYWN0aW9uUmVxdWlyZWRFeGNlcHRpb24gaWYgYSBsb2NrIG1vZGUgaGFzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZW4gc2V0IGFuZCB0aGVyZSBpcyBubyB0cmFuc2FjdGlvbgotICAgICAqIEB0aHJvd3MgUGVzc2ltaXN0aWNMb2NrRXhjZXB0aW9uICAgICBpZiBwZXNzaW1pc3RpYyBsb2NraW5nCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxzIGFuZCB0aGUgdHJhbnNhY3Rpb24gaXMgcm9sbGVkIGJhY2sKLSAgICAgKiBAdGhyb3dzIExvY2tUaW1lb3V0RXhjZXB0aW9uICAgICAgICAgaWYgcGVzc2ltaXN0aWMgbG9ja2luZwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlscyBhbmQgb25seSB0aGUgc3RhdGVtZW50IGlzIHJvbGxlZCBiYWNrCi0gICAgICovCiAgICAgcHVibGljIExpc3QgZ2V0UmVzdWx0TGlzdCgpOwogCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSBhIFNFTEVDVCBxdWVyeSB0aGF0IHJldHVybnMgYSBzaW5nbGUgcmVzdWx0LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0Ci0gICAgICogQHRocm93cyBOb1Jlc3VsdEV4Y2VwdGlvbiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIHJlc3VsdAotICAgICAqIEB0aHJvd3MgTm9uVW5pcXVlUmVzdWx0RXhjZXB0aW9uICAgICBpZiBtb3JlIHRoYW4gb25lIHJlc3VsdAotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uICAgICAgICBpZiBjYWxsZWQgZm9yIGEgSmF2YQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJzaXN0ZW5jZSBxdWVyeSBsYW5ndWFnZSBVUERBVEUgb3IgREVMRVRFIHN0YXRlbWVudAotICAgICAqIEB0aHJvd3MgUXVlcnlUaW1lb3V0RXhjZXB0aW9uICAgICAgICBpZiB0aGUgcXVlcnkgZXhlY3V0aW9uIGV4Y2VlZHMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1ZXJ5IHRpbWVvdXQgdmFsdWUgc2V0Ci0gICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uIGlmIGEgbG9jayBtb2RlIGhhcwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWVuIHNldCBhbmQgdGhlcmUgaXMgbm8gdHJhbnNhY3Rpb24KLSAgICAgKiBAdGhyb3dzIFBlc3NpbWlzdGljTG9ja0V4Y2VwdGlvbiAgICAgaWYgcGVzc2ltaXN0aWMgbG9ja2luZwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlscyBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZCBiYWNrCi0gICAgICogQHRocm93cyBMb2NrVGltZW91dEV4Y2VwdGlvbiAgICAgICAgIGlmIHBlc3NpbWlzdGljIGxvY2tpbmcKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHMgYW5kIG9ubHkgdGhlIHN0YXRlbWVudCBpcyByb2xsZWQgYmFjawotICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0U2luZ2xlUmVzdWx0KCk7CiAKLSAgICAvKioKLSAgICAgKiBFeGVjdXRlIGFuIHVwZGF0ZSBvciBkZWxldGUgc3RhdGVtZW50LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVudGl0aWVzIHVwZGF0ZWQgb3IgZGVsZXRlZAotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uICAgICAgICBpZiBjYWxsZWQgZm9yIGEgSmF2YQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJzaXN0ZW5jZSBxdWVyeSBsYW5ndWFnZSBTRUxFQ1Qgc3RhdGVtZW50IG9yIGZvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGNyaXRlcmlhIHF1ZXJ5Ci0gICAgICogQHRocm93cyBUcmFuc2FjdGlvblJlcXVpcmVkRXhjZXB0aW9uIGlmIHRoZXJlIGlzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIHRyYW5zYWN0aW9uCi0gICAgICogQHRocm93cyBRdWVyeVRpbWVvdXRFeGNlcHRpb24gICAgICAgIGlmIHRoZSBzdGF0ZW1lbnQgZXhlY3V0aW9uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VlZHMgdGhlIHF1ZXJ5IHRpbWVvdXQgdmFsdWUgc2V0Ci0gICAgICovCiAgICAgcHVibGljIGludCBleGVjdXRlVXBkYXRlKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0cmlldmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWF4UmVzdWx0Ci0gICAgICogQHJldHVybiB0aGUgc2FtZSBxdWVyeSBpbnN0YW5jZQotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFyZ3VtZW50IGlzIG5lZ2F0aXZlCi0gICAgICovCiAgICAgcHVibGljIFF1ZXJ5IHNldE1heFJlc3VsdHMoaW50IG1heFJlc3VsdCk7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0aGUgcXVlcnkgb2JqZWN0IHdhcyBzZXQgdG8KLSAgICAgKiByZXRyaWV2ZS4gUmV0dXJucyBJbnRlZ2VyLk1BWF9WQUxVRSBpZiBzZXRNYXhSZXN1bHRzIHdhcyBub3QKLSAgICAgKiBhcHBsaWVkIHRvIHRoZSBxdWVyeSBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG1heGltdW0gbnVtYmVyIG9mIHJlc3VsdHMKLSAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldE1heFJlc3VsdHMoKTsKIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IHJlc3VsdCB0byByZXRyaWV2ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgcmVzdWx0LCBudW1iZXJlZCBmcm9tIDAKLSAgICAgKiBAcmV0dXJuIHRoZSBzYW1lIHF1ZXJ5IGluc3RhbmNlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYXJndW1lbnQgaXMgbmVnYXRpdmUKLSAgICAgKi8KICAgICBwdWJsaWMgUXVlcnkgc2V0Rmlyc3RSZXN1bHQoaW50IHN0YXJ0UG9zaXRpb24pOwogCi0gICAgLyoqCi0gICAgICogVGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCByZXN1bHQgdGhlIHF1ZXJ5IG9iamVjdCB3YXMgc2V0IHRvCi0gICAgICogcmV0cmlldmUuIFJldHVybnMgMCBpZiBzZXRGaXJzdFJlc3VsdCB3YXMgbm90IGFwcGxpZWQgdG8gdGhlCi0gICAgICogcXVlcnkgb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBwb3NpdGlvbiBvZiBmaXJzdCByZXN1bHQKLSAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEZpcnN0UmVzdWx0KCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXQgYSBxdWVyeSBoaW50LgotICAgICAqIElmIGEgdmVuZG9yLXNwZWNpZmljIGhpbnQgaXMgbm90IHJlY29nbml6ZWQsIGl0IGlzIHNpbGVudGx5Ci0gICAgICogaWdub3JlZC4KLSAgICAgKiBQb3J0YWJsZSBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCByZWx5IG9uIHRoZSBzdGFuZGFyZCB0aW1lb3V0Ci0gICAgICogaGludC4gRGVwZW5kaW5nIG9uIHRoZSBkYXRhYmFzZSBpbiB1c2UgYW5kIHRoZSBsb2NraW5nCi0gICAgICogbWVjaGFuaXNtcyB1c2VkIGJ5IHRoZSBwcm92aWRlciwgdGhlIGhpbnQgbWF5IG9yIG1heSBub3QKLSAgICAgKiBiZSBvYnNlcnZlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoaW50TmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIHNhbWUgcXVlcnkgaW5zdGFuY2UKLSAgICAgKiAgICAgICAgIDxwLz4KLSAgICAgKiAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBub3QKLSAgICAgKiAgICAgICAgIHZhbGlkIGZvciB0aGUgaW1wbGVtZW50YXRpb24KLSAgICAgKi8KICAgICBwdWJsaWMgUXVlcnkgc2V0SGludChTdHJpbmcgaGludE5hbWUsIE9iamVjdCB2YWx1ZSk7CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGhpbnRzIGFuZCBhc3NvY2lhdGVkIHZhbHVlcyB0aGF0IGFyZSBpbiBlZmZlY3QgZm9yCi0gICAgICogdGhlIHF1ZXJ5IGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHJldHVybiBxdWVyeSBoaW50cwotICAgICAqLwogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEhpbnRzKCk7CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBoaW50cyB0aGF0IGFyZSBzdXBwb3J0ZWQgZm9yIHF1ZXJ5Ci0gICAgICogb2JqZWN0cy4gVGhlc2UgaGludHMgY29ycmVzcG9uZCB0byBoaW50cyB0aGF0IG1heSBiZSBwYXNzZWQKLSAgICAgKiB0byB0aGUgbWV0aG9kcyBvZiB0aGUgUXVlcnkgaW50ZXJmYWNlIHRoYXQgdGFrZSBoaW50cyBhcwotICAgICAqIGFyZ3VtZW50cyBvciB1c2VkIHdpdGggdGhlIE5hbWVkUXVlcnkgYW5kIE5hbWVkTmF0aXZlUXVlcnkKLSAgICAgKiBhbm5vdGF0aW9ucy4gVGhlc2UgaW5jbHVkZSBhbGwgc3RhbmRhcmQgcXVlcnkgaGludHMgYXMgd2VsbCBhcwotICAgICAqIHZlbmRvci1zcGVjaWZpYyBoaW50cyBzdXBwb3J0ZWQgYnkgdGhlIHByb3ZpZGVyLiBUaGVzZSBoaW50cwotICAgICAqIG1heSBvciBtYXkgbm90IGN1cnJlbnRseSBiZSBpbiBlZmZlY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGhpbnRzCi0gICAgICovCiAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFN1cHBvcnRlZEhpbnRzKCk7CiAKLSAgICAvKioKLSAgICAgKiBCaW5kIGFuIGFyZ3VtZW50IHRvIGEgbmFtZWQgcGFyYW1ldGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgIHRoZSBwYXJhbWV0ZXIgbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIHNhbWUgcXVlcnkgaW5zdGFuY2UKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBwYXJhbWV0ZXIgbmFtZSBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmQgdG8gcGFyYW1ldGVyIGluIHF1ZXJ5IHN0cmluZwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGFyZ3VtZW50IGlzIG9mIGluY29ycmVjdCB0eXBlCi0gICAgICovCiAgICAgcHVibGljIFF1ZXJ5IHNldFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKTsKIAotICAgIC8qKgotICAgICAqIEJpbmQgYW4gaW5zdGFuY2Ugb2YgamF2YS51dGlsLkRhdGUgdG8gYSBuYW1lZCBwYXJhbWV0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEBwYXJhbSB0ZW1wb3JhbFR5cGUKLSAgICAgKiBAcmV0dXJuIHRoZSBzYW1lIHF1ZXJ5IGluc3RhbmNlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgcGFyYW1ldGVyIG5hbWUgZG9lcyBub3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kIHRvIHBhcmFtZXRlciBpbiBxdWVyeSBzdHJpbmcKLSAgICAgKi8KICAgICBwdWJsaWMgUXVlcnkgc2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lLCBEYXRlIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZSk7CiAKLSAgICAvKioKLSAgICAgKiBCaW5kIGFuIGluc3RhbmNlIG9mIGphdmEudXRpbC5DYWxlbmRhciB0byBhIG5hbWVkIHBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogQHBhcmFtIHRlbXBvcmFsVHlwZQotICAgICAqIEByZXR1cm4gdGhlIHNhbWUgcXVlcnkgaW5zdGFuY2UKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBwYXJhbWV0ZXIgbmFtZSBkb2VzIG5vdAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmQgdG8gcGFyYW1ldGVyIGluIHF1ZXJ5IHN0cmluZwotICAgICAqLwogICAgIHB1YmxpYyBRdWVyeSBzZXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIENhbGVuZGFyIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZSk7CiAKLSAgICAvKioKLSAgICAgKiBCaW5kIGFuIGFyZ3VtZW50IHRvIGEgcG9zaXRpb25hbCBwYXJhbWV0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcG9zaXRpb24KLSAgICAgKiBAcGFyYW0gdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSBzYW1lIHF1ZXJ5IGluc3RhbmNlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgcG9zaXRpb24gZG9lcyBub3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kIHRvIHBvc2l0aW9uYWwgcGFyYW1ldGVyIG9mIHF1ZXJ5Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYXJndW1lbnQgaXMgb2YgaW5jb3JyZWN0IHR5cGUKLSAgICAgKi8KICAgICBwdWJsaWMgUXVlcnkgc2V0UGFyYW1ldGVyKGludCBwb3NpdGlvbiwgT2JqZWN0IHZhbHVlKTsKIAotICAgIC8qKgotICAgICAqIEJpbmQgYW4gaW5zdGFuY2Ugb2YgamF2YS51dGlsLkRhdGUgdG8gYSBwb3NpdGlvbmFsIHBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwb3NpdGlvbgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEBwYXJhbSB0ZW1wb3JhbFR5cGUKLSAgICAgKiBAcmV0dXJuIHRoZSBzYW1lIHF1ZXJ5IGluc3RhbmNlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgcG9zaXRpb24gZG9lcyBub3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kIHRvIHBvc2l0aW9uYWwgcGFyYW1ldGVyIG9mIHF1ZXJ5Ci0gICAgICovCiAgICAgcHVibGljIFF1ZXJ5IHNldFBhcmFtZXRlcihpbnQgcG9zaXRpb24sIERhdGUgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wb3JhbFR5cGUgdGVtcG9yYWxUeXBlKTsKIAotICAgIC8qKgotICAgICAqIEJpbmQgYW4gaW5zdGFuY2Ugb2YgamF2YS51dGlsLkNhbGVuZGFyIHRvIGEgcG9zaXRpb25hbAotICAgICAqIHBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwb3NpdGlvbgotICAgICAqIEBwYXJhbSB2YWx1ZQotICAgICAqIEBwYXJhbSB0ZW1wb3JhbFR5cGUKLSAgICAgKiBAcmV0dXJuIHRoZSBzYW1lIHF1ZXJ5IGluc3RhbmNlCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgcG9zaXRpb24gZG9lcyBub3QKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kIHRvIHBvc2l0aW9uYWwgcGFyYW1ldGVyIG9mIHF1ZXJ5Ci0gICAgICovCiAgICAgcHVibGljIFF1ZXJ5IHNldFBhcmFtZXRlcihpbnQgcG9zaXRpb24sIENhbGVuZGFyIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZSk7CiAKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHBhcmFtZXRlcnMgbmFtZXMgYW5kIGFzc29jaWF0ZWQgdmFsdWVzIG9mIHRoZQotICAgICAqIHBhcmFtZXRlcnMgdGhhdCBhcmUgYm91bmQgZm9yIHRoZSBxdWVyeSBpbnN0YW5jZS4KLSAgICAgKiBSZXR1cm5zIGVtcHR5IG1hcCBpZiBubyBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBib3VuZAotICAgICAqIG9yIGlmIHRoZSBxdWVyeSBkb2VzIG5vdCB1c2UgbmFtZWQgcGFyYW1ldGVycy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbmFtZWQgcGFyYW1ldGVycwotICAgICAqLwogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldE5hbWVkUGFyYW1ldGVycygpOwogCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZXMgb2YgdGhlIHBvc2l0aW9uYWwgcGFyYW1ldGVycwotICAgICAqIHRoYXQgYXJlIGJvdW5kIGZvciB0aGUgcXVlcnkgaW5zdGFuY2UuCi0gICAgICogUG9zaXRpb25hbCBwb3NpdGlvbnMgYXJlIGxpc3RlZCBpbiBvcmRlciBvZiBwb3NpdGlvbi4KLSAgICAgKiBSZXR1cm5zIGVtcHR5IGxpc3QgaWYgbm8gcGFyYW1ldGVycyBoYXZlIGJlZW4gYm91bmQKLSAgICAgKiBvciBpZiB0aGUgcXVlcnkgZG9lcyBub3QgdXNlIHBvc2l0aW9uYWwgcGFyYW1ldGVycy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gcG9zaXRpb25hbCBwYXJhbWV0ZXJzCi0gICAgICovCiAgICAgcHVibGljIExpc3QgZ2V0UG9zaXRpb25hbFBhcmFtZXRlcnMoKTsKIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgZmx1c2ggbW9kZSB0eXBlIHRvIGJlIHVzZWQgZm9yIHRoZSBxdWVyeSBleGVjdXRpb24uCi0gICAgICogVGhlIGZsdXNoIG1vZGUgdHlwZSBhcHBsaWVzIHRvIHRoZSBxdWVyeSByZWdhcmRsZXNzIG9mIHRoZQotICAgICAqIGZsdXNoIG1vZGUgdHlwZSBpbiB1c2UgZm9yIHRoZSBlbnRpdHkgbWFuYWdlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmbHVzaE1vZGUKLSAgICAgKi8KICAgICBwdWJsaWMgUXVlcnkgc2V0Rmx1c2hNb2RlKEZsdXNoTW9kZVR5cGUgZmx1c2hNb2RlKTsKIAotICAgIC8qKgotICAgICAqIFRoZSBmbHVzaCBtb2RlIGluIGVmZmVjdCBmb3IgdGhlIHF1ZXJ5IGV4ZWN1dGlvbi4gSWYgYSBmbHVzaAotICAgICAqIG1vZGUgaGFzIG5vdCBiZWVuIHNldCBmb3IgdGhlIHF1ZXJ5IG9iamVjdCwgcmV0dXJucyB0aGUgZmx1c2gKLSAgICAgKiBtb2RlIGluIGVmZmVjdCBmb3IgdGhlIGVudGl0eSBtYW5hZ2VyLgotICAgICAqCi0gICAgICogQHJldHVybiBmbHVzaCBtb2RlCi0gICAgICovCiAgICAgcHVibGljIEZsdXNoTW9kZVR5cGUgZ2V0Rmx1c2hNb2RlKCk7CiAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGxvY2sgbW9kZSB0eXBlIHRvIGJlIHVzZWQgZm9yIHRoZSBxdWVyeSBleGVjdXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbG9ja01vZGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBub3QgYSBKYXZhIFBlcnNpc3RlbmNlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgbGFuZ3VhZ2UgU0VMRUNUIHF1ZXJ5IG9yIENyaXRlcmlhIEFQSSBxdWVyeQotICAgICAqLwogICAgIHB1YmxpYyBRdWVyeSBzZXRMb2NrTW9kZShMb2NrTW9kZVR5cGUgbG9ja01vZGUpOwogCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IGxvY2sgbW9kZSBmb3IgdGhlIHF1ZXJ5LgotICAgICAqCi0gICAgICogQHJldHVybiBsb2NrIG1vZGUKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBub3QgYSBKYXZhIFBlcnNpc3RlbmNlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgbGFuZ3VhZ2UgU0VMRUNUIHF1ZXJ5IG9yIENyaXRlcmlhIEFQSSBxdWVyeQotICAgICAqLwogICAgIHB1YmxpYyBMb2NrTW9kZVR5cGUgZ2V0TG9ja01vZGUoKTsKIAotICAgIC8qKgotICAgICAqIFJldHVybiBhbiBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRvIGFsbG93IGFjY2VzcyB0byB0aGUKLSAgICAgKiBwcm92aWRlci1zcGVjaWZpYyBBUEkuIElmIHRoZSBwcm92aWRlcidzIFF1ZXJ5IGltcGxlbWVudGF0aW9uCi0gICAgICogZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIGNsYXNzLCB0aGUgUGVyc2lzdGVuY2VFeGNlcHRpb24KLSAgICAgKiBpcyB0aHJvd24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xzIHRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0IHRvIGJlIHJldHVybmVkLiBUaGlzIGlzCi0gICAgICogICAgICAgICAgICBub3JtYWxseSBlaXRoZXIgdGhlIHVuZGVybHlpbmcgUXVlcnkgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAgICAgKiAgICAgICAgICAgIG9yIGFuIGludGVyZmFjZSB0aGF0IGl0IGltcGxlbWVudHMuCi0gICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzCi0gICAgICogQHRocm93cyBQZXJzaXN0ZW5jZUV4Y2VwdGlvbiBpZiB0aGUgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNhbGwuCi0gICAgICovCiAgICAgcHVibGljIDxUPiBUIHVud3JhcChDbGFzczxUPiBjbHMpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9RdWVyeUJ1aWxkZXIuamF2YSBiL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvUXVlcnlCdWlsZGVyLmphdmEKaW5kZXggNThkOTM2NS4uMTI5MTFhYSAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9RdWVyeUJ1aWxkZXIuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL1F1ZXJ5QnVpbGRlci5qYXZhCkBAIC0yNCwzOSArMjQsMTEgQEAKIC8vCiBwYWNrYWdlIGphdmF4LnBlcnNpc3RlbmNlOwogCi0vKioKLSAqIEZhY3RvcnkgaW50ZXJmYWNlIGZvciBxdWVyeSBkZWZpbml0aW9uIG9iamVjdHMKLSAqLwogcHVibGljIGludGVyZmFjZSBRdWVyeUJ1aWxkZXIgewotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiB1bmluaXRpYWxpemVkIHF1ZXJ5IGRlZmluaXRpb24gb2JqZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBxdWVyeSBkZWZpbml0aW9uIGluc3RhbmNlCi0gICAgICovCisKICAgICBRdWVyeURlZmluaXRpb24gY3JlYXRlUXVlcnlEZWZpbml0aW9uKCk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBxdWVyeSBkZWZpbml0aW9uIG9iamVjdCB3aXRoIHRoZSBnaXZlbiByb290LiBUaGUgcm9vdCBtdXN0IGJlIGFuCi0gICAgICogZW50aXR5IGNsYXNzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNscyAtCi0gICAgICogICAgICAgICAgICBhbiBlbnRpdHkgY2xhc3MKLSAgICAgKiBAcmV0dXJuIHJvb3QgZG9tYWluIG9iamVjdAotICAgICAqLwogICAgIERvbWFpbk9iamVjdCBjcmVhdGVRdWVyeURlZmluaXRpb24oQ2xhc3Mgcm9vdCk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBxdWVyeSBkZWZpbml0aW9uIG9iamVjdCB3aG9zZSByb290IGlzIGRlcml2ZWQgZnJvbSBhIGRvbWFpbgotICAgICAqIG9iamVjdCBvZiB0aGUgY29udGFpbmluZyBxdWVyeS4gUHJvdmlkZXMgc3VwcG9ydCBmb3IgY29ycmVsYXRlZAotICAgICAqIHN1YnF1ZXJpZXMuIEpvaW5zIGFnYWluc3QgdGhlIHJlc3VsdGluZyBkb21haW4gb2JqZWN0IGRvIG5vdCBhZmZlY3QgdGhlCi0gICAgICogcXVlcnkgZG9tYWluIG9mIHRoZSBjb250YWluaW5nIHF1ZXJ5LiBUaGUgcGF0aCBleHByZXNzaW9uIG11c3QgY29ycmVzcG9uZAotICAgICAqIHRvIGFuIGVudGl0eSBjbGFzcy4gVGhlIHBhdGggZXhwcmVzc2lvbiBtdXN0IG5vdCBiZSBhIGRvbWFpbiBvYmplY3Qgb2YKLSAgICAgKiB0aGUgY29udGFpbmluZyBxdWVyeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoIC0KLSAgICAgKiAgICAgICAgICAgICBwYXRoIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgZG9tYWluIG9iamVjdCB1c2VkIHRvCi0gICAgICogICAgICAgICAgICAgZGVyaXZlIHRoZSBzdWJxdWVyeSByb290LgotICAgICAqIEByZXR1cm4gdGhlIHN1YnF1ZXJ5IERvbWFpbk9iamVjdAotICAgICAgICAgKi8KIAlEb21haW5PYmplY3QgY3JlYXRlU3VicXVlcnlEZWZpbml0aW9uKFBhdGhFeHByZXNzaW9uIHBhdGgpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9RdWVyeURlZmluaXRpb24uamF2YSBiL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvUXVlcnlEZWZpbml0aW9uLmphdmEKaW5kZXggOGZiOWQ1MC4uZDRlOGJjMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9RdWVyeURlZmluaXRpb24uamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL1F1ZXJ5RGVmaW5pdGlvbi5qYXZhCkBAIC0yOCw1MzQgKzI4LDEwNSBAQAogaW1wb3J0IGphdmEudXRpbC5EYXRlOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi0vKioKLSAqIEludGVyZmFjZSBmb3IgY29uc3RydWN0aW9uIG9mIHF1ZXJ5IGRlZmluaXRpb25zCi0gKi8KIHB1YmxpYyBpbnRlcmZhY2UgUXVlcnlEZWZpbml0aW9uIGV4dGVuZHMgU3VicXVlcnkgewotICAgIC8qKgotICAgICAqIEFkZCBhIHF1ZXJ5IHJvb3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gZW50aXR5LCBmb3JtaW5nIGEgY2FydGVzaWFuCi0gICAgICogcHJvZHVjdCB3aXRoIGFueSBleGlzdGluZyByb290cy4gVGhlIGRvbWFpbiBvYmplY3QgdGhhdCBpcyByZXR1cm5lZCBpcwotICAgICAqIGJvdW5kIGFzIGEgY29tcG9uZW50IG9mIHRoZSBnaXZlbiBxdWVyeS4gVGhlIGFyZ3VtZW50IG11c3QgYmUgYW4gZW50aXR5Ci0gICAgICogY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xzIC0KLSAgICAgKiAgICAgICAgICAgIGFuIGVudGl0eSBjbGFzcwotICAgICAqIEByZXR1cm4gRG9tYWluT2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBlbnRpdHkgY2xhc3MuCi0gICAgICovCisKICAgICBEb21haW5PYmplY3QgYWRkUm9vdChDbGFzcyBjbHMpOwogCi0gICAgLyoqCi0gICAgICogQWRkIGEgcm9vdCBkZXJpdmVkIGZyb20gYSBkb21haW4gb2JqZWN0IG9mIHRoZSBjb250YWluaW5nIHF1ZXJ5Ci0gICAgICogZGVmaW5pdGlvbiB0byBhIHF1ZXJ5IGRlZmluaXRpb24gdXNlZCBhcyBhIHN1YnF1ZXJ5LiBQcm92aWRlcyBzdXBwb3J0IGZvcgotICAgICAqIGNvcnJlbGF0ZWQgc3VicXVlcmllcy4gSm9pbnMgYWdhaW5zdCB0aGUgcmVzdWx0aW5nIGRvbWFpbiBvYmplY3QgZG8gbm90Ci0gICAgICogYWZmZWN0IHRoZSBxdWVyeSBkb21haW4gb2YgdGhlIGNvbnRhaW5pbmcgcXVlcnkuIFRoZSBwYXRoIGV4cHJlc3Npb24gbXVzdAotICAgICAqIGNvcnJlc3BvbmQgdG8gYW4gZW50aXR5IGNsYXNzLiBUaGUgcGF0aCBleHByZXNzaW9uIG11c3Qgbm90IGJlIGEgZG9tYWluCi0gICAgICogb2JqZWN0IG9mIHRoZSBjb250YWluaW5nIHF1ZXJ5LgotICAgICAqCi0gICAgICogQHBhcmFtIHBhdGggLQotICAgICAqICAgICAgICAgICAgIHBhdGggZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBkb21haW4gb2JqZWN0IHVzZWQgdG8KLSAgICAgKiAgICAgICAgICAgICBkZXJpdmUgdGhlIHN1YnF1ZXJ5IHJvb3QuCi0gICAgICogQHJldHVybiB0aGUgc3VicXVlcnkgRG9tYWluT2JqZWN0Ci0gICAgICovCiAgICAgRG9tYWluT2JqZWN0IGFkZFN1YnF1ZXJ5Um9vdChQYXRoRXhwcmVzc2lvbiBwYXRoKTsKIAotICAgIC8qKgotICAgICAqIFNwZWNpZnkgdGhlIG9iamVjdHMgLyB2YWx1ZXMgdG8gYmUgcmV0dXJuZWQuIFJlcGxhY2VzIHRoZSBwcmV2aW91cyBzZWxlY3QKLSAgICAgKiBsaXN0LCBpZiBhbnkuIElmIG5vIHNlbGVjdCBpdGVtcyBhcmUgc3BlY2lmaWVkIGFuZCB0aGVyZSBpcyBvbmx5IG9uZQotICAgICAqIHF1ZXJ5IHJvb3QsIHRoZSByb290IGVudGl0eSBpcyBhc3N1bWVkIHRvIGJlIHRoZSByZXN1bHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0SXRlbXMgLQotICAgICAqICAgICAgICAgICAgICAgICAgICBvbmUgb3IgbW9yZSBTZWxlY3RJdGVtIGluc3RhbmNlcwotICAgICAqIEByZXR1cm4gdGhlIG1vZGlmaWVkIHF1ZXJ5IGRlZmluaXRpb24gaW5zdGFuY2UKLSAgICAgKi8KICAgICBRdWVyeURlZmluaXRpb24gc2VsZWN0KFNlbGVjdEl0ZW0uLi4gc2VsZWN0SXRlbXMpOwogCi0gICAgLyoqCi0gICAgICogU3BlY2lmeSB0aGUgb2JqZWN0cyAvIHZhbHVlcyB0byBiZSByZXR1cm5lZC4gUmVwbGFjZXMgdGhlIHByZXZpb3VzIHNlbGVjdAotICAgICAqIGxpc3QsIGlmIGFueS4gSWYgbm8gc2VsZWN0IGl0ZW1zIGFyZSBzcGVjaWZpZWQgYW5kIHRoZXJlIGlzIG9ubHkgb25lCi0gICAgICogcXVlcnkgcm9vdCwgdGhlIHJvb3QgZW50aXR5IGlzIGFzc3VtZWQgdG8gYmUgdGhlIHJlc3VsdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RJdGVtTGlzdCAtCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIGEgbGlzdCBjb250YWluaW5nIG9uZSBvciBtb3JlIFNlbGVjdEl0ZW0gaW5zdGFuY2VzCi0gICAgICogQHJldHVybiB0aGUgbW9kaWZpZWQgcXVlcnkgZGVmaW5pdGlvbiBpbnN0YW5jZQotICAgICAqLwogICAgIFF1ZXJ5RGVmaW5pdGlvbiBzZWxlY3QoTGlzdDxTZWxlY3RJdGVtPiBzZWxlY3RJdGVtTGlzdCk7CiAKLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IHRoZSBvYmplY3RzIC8gdmFsdWVzIHRvIGJlIHJldHVybmVkLiBEdXBsaWNhdGUgcmVzdWx0cyB3aWxsIGJlCi0gICAgICogZWxpbWluYXRlZC4gUmVwbGFjZXMgdGhlIHByZXZpb3VzIHNlbGVjdCBsaXN0LCBpZiBhbnkuIElmIG5vIHNlbGVjdCBpdGVtcwotICAgICAqIGFyZSBzcGVjaWZpZWQgYW5kIHRoZXJlIGlzIG9ubHkgb25lIHF1ZXJ5IHJvb3QsIHRoZSByb290IGVudGl0eSBpcwotICAgICAqIGFzc3VtZWQgdG8gYmUgdGhlIHJlc3VsdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RJdGVtcyAtCi0gICAgICogICAgICAgICAgICAgICAgICAgIG9uZSBvciBtb3JlIFNlbGVjdEl0ZW0gaW5zdGFuY2VzCi0gICAgICogQHJldHVybiB0aGUgbW9kaWZpZWQgcXVlcnkgZGVmaW5pdGlvbiBpbnN0YW5jZQotICAgICAqLwogICAgIFF1ZXJ5RGVmaW5pdGlvbiBzZWxlY3REaXN0aW5jdChTZWxlY3RJdGVtLi4uIHNlbGVjdEl0ZW1zKTsKIAotICAgIC8qKgotICAgICAqIFNwZWNpZnkgdGhlIG9iamVjdHMgLyB2YWx1ZXMgdG8gYmUgcmV0dXJuZWQuIER1cGxpY2F0ZSByZXN1bHRzIHdpbGwgYmUKLSAgICAgKiBlbGltaW5hdGVkLiBSZXBsYWNlcyB0aGUgcHJldmlvdXMgc2VsZWN0IGxpc3QsIGlmIGFueS4gSWYgbm8gc2VsZWN0IGl0ZW1zCi0gICAgICogYXJlIHNwZWNpZmllZCwgYW5kIHRoZXJlIGlzIG9ubHkgb25lIHF1ZXJ5IHJvb3QsIHRoZSByb290IGVudGl0eSBpcwotICAgICAqIGFzc3VtZWQgdG8gYmUgdGhlIHJlc3VsdC4gaXMgYXNzdW1lZCB0byBiZSB0aGUgcmVzdWx0LgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdEl0ZW1MaXN0IC0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgYSBsaXN0IGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgU2VsZWN0SXRlbSBpbnN0YW5jZXMKLSAgICAgKiBAcmV0dXJuIHRoZSBtb2RpZmllZCBxdWVyeSBkZWZpbml0aW9uIGluc3RhbmNlCi0gICAgICovCiAgICAgUXVlcnlEZWZpbml0aW9uIHNlbGVjdERpc3RpbmN0KExpc3Q8U2VsZWN0SXRlbT4gc2VsZWN0SXRlbUxpc3QpOwogCi0gICAgLyoqCi0gICAgICogTW9kaWZpZXMgdGhlIHF1ZXJ5IGRlZmluaXRpb24gdG8gcmVzdHJpY3QgdGhlIHJlc3VsdCBvZiB0aGUgcXVlcnkKLSAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwcmVkaWNhdGUuIFJlcGxhY2VzIHRoZSBwcmV2aW91c2x5IGFkZGVkCi0gICAgICogcmVzdHJpY3Rpb24ocyksIGlmIGFueS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgLQotICAgICAqICAgICAgICAgICAgICAgICAgYSBzaW1wbGUgb3IgY29tcG91bmQgY29uZGl0aW9uYWwgcHJlZGljYXRlCi0gICAgICogQHJldHVybiB0aGUgbW9kaWZpZWQgUXVlcnlEZWZpbml0aW9uIGluc3RhbmNlCi0gICAgICovCiAgICAgUXVlcnlEZWZpbml0aW9uIHdoZXJlKFByZWRpY2F0ZSBwcmVkaWNhdGUpOwogCi0gICAgLyoqCi0gICAgICogU3BlY2lmeSB0aGUgaXRlbXMgb2YgdGhlIHNlbGVjdCBsaXN0IHRoYXQgYXJlIHVzZWQgaW4gb3JkZXJpbmcgdGhlIHF1ZXJ5Ci0gICAgICogcmVzdWx0cy4gUmVwbGFjZXMgdGhlIHByZXZpb3VzIG9yZGVyLWJ5IGxpc3QsIGlmIGFueS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcmRlckJ5SXRlbXMgLQotICAgICAqICAgICAgICAgICAgICAgICAgICAgb25lIG9yIG1vcmUgT3JkZXJCeUl0ZW0gaW5zdGFuY2VzCi0gICAgICogQHJldHVybiB0aGUgbW9kaWZpZWQgUXVlcnlEZWZpbml0aW9uIGluc3RhbmNlCi0gICAgICovCiAgICAgUXVlcnlEZWZpbml0aW9uIG9yZGVyQnkoT3JkZXJCeUl0ZW0uLi4gb3JkZXJCeUl0ZW1zKTsKIAotICAgIC8qKgotICAgICAqIFNwZWNpZnkgdGhlIGl0ZW1zIG9mIHRoZSBzZWxlY3QgbGlzdCB0aGF0IGFyZSB1c2VkIGluIG9yZGVyaW5nIHRoZSBxdWVyeQotICAgICAqIHJlc3VsdHMuIFJlcGxhY2VzIHRoZSBwcmV2aW91cyBvcmRlci1ieSBsaXN0LCBpZiBhbnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3JkZXJCeUl0ZW1MaXN0IC0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGEgbGlzdCBjb250YWluaW5nIG9uZSBvciBtb3JlIE9yZGVyQnlJdGVtIGluc3RhbmNlcwotICAgICAqIEByZXR1cm4gdGhlIG1vZGlmaWVkIFF1ZXJ5RGVmaW5pdGlvbiBpbnN0YW5jZQotICAgICAqLwogICAgIFF1ZXJ5RGVmaW5pdGlvbiBvcmRlckJ5KExpc3Q8T3JkZXJCeUl0ZW0+IG9yZGVyQnlJdGVtTGlzdCk7CiAKLSAgICAvKioKLSAgICAgKiBTcGVjaWZ5IHRoZSBpdGVtcyB0aGF0IGFyZSB1c2VkIHRvIGZvcm0gZ3JvdXBzIG92ZXIgdGhlIHF1ZXJ5IHJlc3VsdHMuCi0gICAgICogUmVwbGFjZXMgdGhlIHByZXZpb3VzIGdyb3VwLWJ5IGxpc3QsIGlmIGFueS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoRXhwcnMKLSAgICAgKiBAcmV0dXJuIHRoZSBtb2RpZmllZCBRdWVyeURlZmluaXRpb24gaW5zdGFuY2UKLSAgICAgKi8KICAgICBRdWVyeURlZmluaXRpb24gZ3JvdXBCeShQYXRoRXhwcmVzc2lvbi4uLiBwYXRoRXhwcnMpOwogCi0gICAgLyoqCi0gICAgICogU3BlY2lmeSB0aGUgaXRlbXMgdGhhdCBhcmUgdXNlZCB0byBmb3JtIGdyb3VwcyBvdmVyIHRoZSBxdWVyeSByZXN1bHRzLgotICAgICAqIFJlcGxhY2VzIHRoZSBwcmV2aW91cyBncm91cC1ieSBsaXN0LCBpZiBhbnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGF0aEV4cHJMaXN0Ci0gICAgICogQHJldHVybiB0aGUgbW9kaWZpZWQgUXVlcnlEZWZpbml0aW9uIGluc3RhbmNlCi0gICAgICovCiAgICAgUXVlcnlEZWZpbml0aW9uIGdyb3VwQnkoTGlzdDxQYXRoRXhwcmVzc2lvbj4gcGF0aEV4cHJMaXN0KTsKIAotICAgIC8qKgotICAgICAqIFNwZWNpZnkgdGhlIHJlc3RyaWN0aW9ucyBvdmVyIHRoZSBncm91cHMgb2YgYSBxdWVyeS4gUmVwbGFjZXMgdGhlCi0gICAgICogcHJldmlvdXMgaGF2aW5nIHJlc3RyaWN0aW9uKHMpLCBpZiBhbnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJlZGljYXRlCi0gICAgICogQHJldHVybiB0aGUgbW9kaWZpZWQgUXVlcnlEZWZpbml0aW9uIEluc3RhbmNlCi0gICAgICovCiAgICAgUXVlcnlEZWZpbml0aW9uIGhhdmluZyhQcmVkaWNhdGUgcHJlZGljYXRlKTsKIAotICAgIC8qKgotICAgICAqIFNwZWNpZnkgdGhhdCBhIGNvbnN0cnVjdG9yIGZvciB0aGUgZ2l2ZW4gY2xhc3MgaXMgdG8gYmUgYXBwbGllZCB0byB0aGUKLSAgICAgKiBjb3JyZXNwb25kaW5nIHF1ZXJ5IHJlc3VsdHMgYWZ0ZXIgdGhlIHF1ZXJ5IGlzIGV4ZWN1dGVkLiBUaGUgY2xhc3MgbXVzdAotICAgICAqIGhhdmUgYSBjb25zdHJ1Y3RvciB0aGF0IGFjY2VwdHMgdGhlIEphdmEgYXJndW1lbnQgdHlwZXMgY29ycmVzcG9uZGluZyB0bwotICAgICAqIHRoZSBnaXZlbiBzZWxlY3QgaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2xzICAtCi0gICAgICogICAgICAgICAgICAgYSBjbGFzcyB3aXRoIHRoZSBjb3JyZXBvbmRpbmcgY29uc3RydWN0b3IKLSAgICAgKiBAcGFyYW0gYXJncyAtCi0gICAgICogICAgICAgICAgICAgc2VsZWN0IGl0ZW1zIHRoYXQgY29ycmVzcG9uZCB0byByZXN1bHQgdHlwZXMgdGhhdCBhcmUgdmFsaWQgYXMKLSAgICAgKiAgICAgICAgICAgICBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yCi0gICAgICogQHJlc3VsdCBTZWxlY3RJdGVtIGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgY29uc3RydWN0b3IKLSAgICAgKi8KICAgICBTZWxlY3RJdGVtIG5ld0luc3RhbmNlKENsYXNzIGNscywgU2VsZWN0SXRlbS4uLiBhcmdzKTsKIAotICAgIC8qKgotICAgICAqIFVzZSB0aGUgcXVlcnkgZGVmaW5pdGlvbiBpbnN0YW5jZSBhcyBhIHN1YnF1ZXJ5IGluIGFuIGV4aXN0cyBwcmVkaWNhdGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgcHJlZGljYXRlCi0gICAgICovCiAgICAgUHJlZGljYXRlIGV4aXN0cygpOwogCi0gICAgLyoqCi0gICAgICogVXNlIHRoZSBxdWVyeSBkZWZpbml0aW9uIG9iamVjdCBpbiBhIHN1YnF1ZXJ5IGluIGFuIGFsbCBleHByZXNzaW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0aW5nIFN1YnF1ZXJ5Ci0gICAgICovCiAgICAgU3VicXVlcnkgYWxsKCk7CiAKLSAgICAvKioKLSAgICAgKiBVc2UgdGhlIHF1ZXJ5IGRlZmluaXRpb24gb2JqZWN0IGluIGEgc3VicXVlcnkgaW4gYW4gYW55IGV4cHJlc3Npb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgU3VicXVlcnkKLSAgICAgKi8KICAgICBTdWJxdWVyeSBhbnkoKTsKIAotICAgIC8qKgotICAgICAqIFVzZSB0aGUgcXVlcnkgZGVmaW5pdGlvbiBvYmplY3QgaW4gYSBzdWJxdWVyeSBpbiBhIHNvbWUgZXhwcmVzc2lvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBTdWJxdWVyeQotICAgICAqLwogICAgIFN1YnF1ZXJ5IHNvbWUoKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBlbXB0eSBnZW5lcmFsIGNhc2UgZXhwcmVzc2lvbi4gQSBnZW5lcmFsIGNhc2UgZXhwcmVzc2lvbiBpcyBvZgotICAgICAqIHRoZSBmb3JtOgotICAgICAqIDxwLz4KLSAgICAgKiBnZW5lcmFsQ2FzZSgpIC53aGVuKGNvbmRpdGlvbmFsLXByZWRpY2F0ZSkudGhlbihzY2FsYXItZXhwcmVzc2lvbikKLSAgICAgKiAud2hlbihjb25kaXRpb25hbC1wcmVkaWNhdGUpLnRoZW4oc2NhbGFyLWV4cHJlc3Npb24pIC4uLgotICAgICAqIC5lbHNlQ2FzZShzY2FsYXItZXhwcmVzc2lvbikKLSAgICAgKgotICAgICAqIEByZXR1cm4gZW1wdHkgZ2VuZXJhbCBjYXNlIGV4cHJlc3Npb24KLSAgICAgKi8KICAgICBDYXNlRXhwcmVzc2lvbiBnZW5lcmFsQ2FzZSgpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgc2ltcGxlIGNhc2UgZXhwcmVzc2lvbiB3aXRoIHRoZSBnaXZlbiBjYXNlIG9wZXJhbmQuIEEgc2ltcGxlCi0gICAgICogY2FzZSBleHByZXNzaW9uIGlzIG9mIHRoZSBmb3JtOgotICAgICAqIDxwLz4KLSAgICAgKiBzaW1wbGVDYXNlKGNhc2Utb3BlcmFuZCkgLndoZW4oc2NhbGFyLWV4cHJlc3Npb24pLnRoZW4oc2NhbGFyLWV4cHJlc3Npb24pCi0gICAgICogLndoZW4oc2NhbGFyLWV4cHJlc3Npb24pLnRoZW4oc2NhbGFyLWV4cHJlc3Npb24pIC4uLgotICAgICAqIC5lbHNlQ2FzZShzY2FsYXItZXhwcmVzc2lvbikKLSAgICAgKgotICAgICAqIEBwYXJhbSBjYXNlT3BlcmFuZCAtCi0gICAgICogICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24gdXNlZCBmb3IgdGVzdGluZyBhZ2FpbnN0IHRoZSB3aGVuIHNjYWxhcgotICAgICAqICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucwotICAgICAqIEByZXR1cm4gY2FzZSBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIGNhc2Ugb3BlcmFuZAotICAgICAqLwogICAgIENhc2VFeHByZXNzaW9uIHNpbXBsZUNhc2UoRXhwcmVzc2lvbiBjYXNlT3BlcmFuZCk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBzaW1wbGUgY2FzZSBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIGNhc2Ugb3BlcmFuZC4gQSBzaW1wbGUKLSAgICAgKiBjYXNlIGV4cHJlc3Npb24gaXMgb2YgdGhlIGZvcm06Ci0gICAgICogPHAvPgotICAgICAqIHNpbXBsZUNhc2UoY2FzZS1vcGVyYW5kKSAud2hlbihzY2FsYXItZXhwcmVzc2lvbikudGhlbihzY2FsYXItZXhwcmVzc2lvbikKLSAgICAgKiAud2hlbihzY2FsYXItZXhwcmVzc2lvbikudGhlbihzY2FsYXItZXhwcmVzc2lvbikgLi4uCi0gICAgICogLmVsc2VDYXNlKHNjYWxhci1leHByZXNzaW9uKQotICAgICAqCi0gICAgICogQHBhcmFtIGNhc2VPcGVyYW5kIC0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgbnVtZXJpYyB2YWx1ZSB1c2VkIGZvciB0ZXN0aW5nIGFnYWluc3QgdGhlIHdoZW4gc2NhbGFyCi0gICAgICogICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zCi0gICAgICogQHJldHVybiBjYXNlIGV4cHJlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gY2FzZSBvcGVyYW5kCi0gICAgICovCiAgICAgQ2FzZUV4cHJlc3Npb24gc2ltcGxlQ2FzZShOdW1iZXIgY2FzZU9wZXJhbmQpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgc2ltcGxlIGNhc2UgZXhwcmVzc2lvbiB3aXRoIHRoZSBnaXZlbiBjYXNlIG9wZXJhbmQuIEEgc2ltcGxlCi0gICAgICogY2FzZSBleHByZXNzaW9uIGlzIG9mIHRoZSBmb3JtOgotICAgICAqIDxwLz4KLSAgICAgKiBzaW1wbGVDYXNlKGNhc2Utb3BlcmFuZCkgLndoZW4oc2NhbGFyLWV4cHJlc3Npb24pLnRoZW4oc2NhbGFyLWV4cHJlc3Npb24pCi0gICAgICogLndoZW4oc2NhbGFyLWV4cHJlc3Npb24pLnRoZW4oc2NhbGFyLWV4cHJlc3Npb24pIC4uLgotICAgICAqIC5lbHNlQ2FzZShzY2FsYXItZXhwcmVzc2lvbikKLSAgICAgKgotICAgICAqIEBwYXJhbSBjYXNlT3BlcmFuZCAtCi0gICAgICogICAgICAgICAgICAgICAgICAgIHZhbHVlIHVzZWQgZm9yIHRlc3RpbmcgYWdhaW5zdCB0aGUgd2hlbiBzY2FsYXIgZXhwcmVzc2lvbnMKLSAgICAgKiBAcmV0dXJuIGNhc2UgZXhwcmVzc2lvbiB3aXRoIHRoZSBnaXZlbiBjYXNlIG9wZXJhbmQKLSAgICAgKi8KICAgICBDYXNlRXhwcmVzc2lvbiBzaW1wbGVDYXNlKFN0cmluZyBjYXNlT3BlcmFuZCk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBzaW1wbGUgY2FzZSBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIGNhc2Ugb3BlcmFuZC4gQSBzaW1wbGUKLSAgICAgKiBjYXNlIGV4cHJlc3Npb24gaXMgb2YgdGhlIGZvcm06Ci0gICAgICogPHAvPgotICAgICAqIHNpbXBsZUNhc2UoY2FzZS1vcGVyYW5kKSAud2hlbihzY2FsYXItZXhwcmVzc2lvbikudGhlbihzY2FsYXItZXhwcmVzc2lvbikKLSAgICAgKiAud2hlbihzY2FsYXItZXhwcmVzc2lvbikudGhlbihzY2FsYXItZXhwcmVzc2lvbikgLi4uCi0gICAgICogLmVsc2VDYXNlKHNjYWxhci1leHByZXNzaW9uKQotICAgICAqCi0gICAgICogQHBhcmFtIGNhc2VPcGVyYW5kIC0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgdmFsdWUgdXNlZCBmb3IgdGVzdGluZyBhZ2FpbnN0IHRoZSB3aGVuIHNjYWxhciBleHByZXNzaW9ucwotICAgICAqIEByZXR1cm4gY2FzZSBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIGNhc2Ugb3BlcmFuZAotICAgICAqLwogICAgIENhc2VFeHByZXNzaW9uIHNpbXBsZUNhc2UoRGF0ZSBjYXNlT3BlcmFuZCk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBzaW1wbGUgY2FzZSBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIGNhc2Ugb3BlcmFuZC4gQSBzaW1wbGUKLSAgICAgKiBjYXNlIGV4cHJlc3Npb24gaXMgb2YgdGhlIGZvcm06Ci0gICAgICogPHAvPgotICAgICAqIHNpbXBsZUNhc2UoY2FzZS1vcGVyYW5kKSAud2hlbihzY2FsYXItZXhwcmVzc2lvbikudGhlbihzY2FsYXItZXhwcmVzc2lvbikKLSAgICAgKiAud2hlbihzY2FsYXItZXhwcmVzc2lvbikudGhlbihzY2FsYXItZXhwcmVzc2lvbikgLi4uCi0gICAgICogLmVsc2VDYXNlKHNjYWxhci1leHByZXNzaW9uKQotICAgICAqCi0gICAgICogQHBhcmFtIGNhc2VPcGVyYW5kIC0KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgdmFsdWUgdXNlZCBmb3IgdGVzdGluZyBhZ2FpbnN0IHRoZSB3aGVuIHNjYWxhciBleHByZXNzaW9ucwotICAgICAqIEByZXR1cm4gY2FzZSBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIGNhc2Ugb3BlcmFuZAotICAgICAqLwogICAgIENhc2VFeHByZXNzaW9uIHNpbXBsZUNhc2UoQ2FsZW5kYXIgY2FzZU9wZXJhbmQpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgc2ltcGxlIGNhc2UgZXhwcmVzc2lvbiB3aXRoIHRoZSBnaXZlbiBjYXNlIG9wZXJhbmQuIEEgc2ltcGxlCi0gICAgICogY2FzZSBleHByZXNzaW9uIGlzIG9mIHRoZSBmb3JtOgotICAgICAqIDxwLz4KLSAgICAgKiBzaW1wbGVDYXNlKGNhc2Utb3BlcmFuZCkgLndoZW4oc2NhbGFyLWV4cHJlc3Npb24pLnRoZW4oc2NhbGFyLWV4cHJlc3Npb24pCi0gICAgICogLndoZW4oc2NhbGFyLWV4cHJlc3Npb24pLnRoZW4oc2NhbGFyLWV4cHJlc3Npb24pIC4uLgotICAgICAqIC5lbHNlQ2FzZShzY2FsYXItZXhwcmVzc2lvbikKLSAgICAgKgotICAgICAqIEBwYXJhbSBjYXNlT3BlcmFuZCAtCi0gICAgICogICAgICAgICAgICAgICAgICAgIHZhbHVlIHVzZWQgZm9yIHRlc3RpbmcgYWdhaW5zdCB0aGUgd2hlbiBzY2FsYXIgZXhwcmVzc2lvbnMKLSAgICAgKiBAcmV0dXJuIGNhc2UgZXhwcmVzc2lvbiB3aXRoIHRoZSBnaXZlbiBjYXNlIG9wZXJhbmQKLSAgICAgKi8KICAgICBDYXNlRXhwcmVzc2lvbiBzaW1wbGVDYXNlKENsYXNzIGNhc2VPcGVyYW5kKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHNpbXBsZSBjYXNlIGV4cHJlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gY2FzZSBvcGVyYW5kLiBBIHNpbXBsZQotICAgICAqIGNhc2UgZXhwcmVzc2lvbiBpcyBvZiB0aGUgZm9ybToKLSAgICAgKiA8cC8+Ci0gICAgICogc2ltcGxlQ2FzZShjYXNlLW9wZXJhbmQpIC53aGVuKHNjYWxhci1leHByZXNzaW9uKS50aGVuKHNjYWxhci1leHByZXNzaW9uKQotICAgICAqIC53aGVuKHNjYWxhci1leHByZXNzaW9uKS50aGVuKHNjYWxhci1leHByZXNzaW9uKSAuLi4KLSAgICAgKiAuZWxzZUNhc2Uoc2NhbGFyLWV4cHJlc3Npb24pCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FzZU9wZXJhbmQgLQotICAgICAqICAgICAgICAgICAgICAgICAgICB2YWx1ZSB1c2VkIGZvciB0ZXN0aW5nIGFnYWluc3QgdGhlIHdoZW4gc2NhbGFyIGV4cHJlc3Npb25zCi0gICAgICogQHJldHVybiBjYXNlIGV4cHJlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gY2FzZSBvcGVyYW5kCi0gICAgICovCiAgICAgQ2FzZUV4cHJlc3Npb24gc2ltcGxlQ2FzZShFbnVtPD8+IGNhc2VPcGVyYW5kKTsKIAotICAgIC8qKgotICAgICAqIGNvYWxlc2NlIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhIGNhc2UgZXhwcmVzc2lvbiB0aGF0IHJldHVybnMgbnVsbCBpZiBhbGwKLSAgICAgKiBpdHMgYXJndW1lbnRzIGV2YWx1YXRlIHRvIG51bGwsIGFuZCB0aGUgdmFsdWUgb2YgaXRzIGZpcnN0IG5vbi1udWxsCi0gICAgICogYXJndW1lbnQgb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4cCAtCi0gICAgICogICAgICAgICAgICBleHByZXNzaW9ucyB0byBiZSB1c2VkIGZvciB0ZXN0aW5nIGFnYWluc3QgbnVsbAotICAgICAqIEByZXR1cm4gRXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBjb2FsZXNjZSBleHByZXNzaW9uCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBjb2FsZXNjZShFeHByZXNzaW9uLi4uIGV4cCk7CiAKLSAgICAvKioKLSAgICAgKiBjb2FsZXNjZSBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBjYXNlIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIG51bGwgaWYgYWxsCi0gICAgICogaXRzIGFyZ3VtZW50cyBldmFsdWF0ZSB0byBudWxsLCBhbmQgdGhlIHZhbHVlIG9mIGl0cyBmaXJzdCBub24tbnVsbAotICAgICAqIGFyZ3VtZW50IG90aGVyd2lzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHAgLQotICAgICAqICAgICAgICAgICAgZXhwcmVzc2lvbnMgdG8gYmUgdXNlZCBmb3IgdGVzdGluZyBhZ2FpbnN0IG51bGwKLSAgICAgKiBAcmV0dXJuIEV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gY29hbGVzY2UgZXhwcmVzc2lvbgotICAgICAqLwogICAgIEV4cHJlc3Npb24gY29hbGVzY2UoU3RyaW5nLi4uIGV4cCk7CiAKLSAgICAvKioKLSAgICAgKiBjb2FsZXNjZSBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBjYXNlIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIG51bGwgaWYgYWxsCi0gICAgICogaXRzIGFyZ3VtZW50cyBldmFsdWF0ZSB0byBudWxsLCBhbmQgdGhlIHZhbHVlIG9mIGl0cyBmaXJzdCBub24tbnVsbAotICAgICAqIGFyZ3VtZW50IG90aGVyd2lzZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHAgLQotICAgICAqICAgICAgICAgICAgZXhwcmVzc2lvbnMgdG8gYmUgdXNlZCBmb3IgdGVzdGluZyBhZ2FpbnN0IG51bGwKLSAgICAgKiBAcmV0dXJuIEV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gY29hbGVzY2UgZXhwcmVzc2lvbgotICAgICAqLwogICAgIEV4cHJlc3Npb24gY29hbGVzY2UoRGF0ZS4uLiBleHApOwogCi0gICAgLyoqCi0gICAgICogY29hbGVzY2UgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgY2FzZSBleHByZXNzaW9uIHRoYXQgcmV0dXJucyBudWxsIGlmIGFsbAotICAgICAqIGl0cyBhcmd1bWVudHMgZXZhbHVhdGUgdG8gbnVsbCwgYW5kIHRoZSB2YWx1ZSBvZiBpdHMgZmlyc3Qgbm9uLW51bGwKLSAgICAgKiBhcmd1bWVudCBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZXhwIC0KLSAgICAgKiAgICAgICAgICAgIGV4cHJlc3Npb25zIHRvIGJlIHVzZWQgZm9yIHRlc3RpbmcgYWdhaW5zdCBudWxsCi0gICAgICogQHJldHVybiBFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGNvYWxlc2NlIGV4cHJlc3Npb24KLSAgICAgKi8KICAgICBFeHByZXNzaW9uIGNvYWxlc2NlKENhbGVuZGFyLi4uIGV4cCk7CiAKLSAgICAvKioKLSAgICAgKiBudWxsaWYgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgY2FzZSBleHByZXNzaW9uIHRoYXQgdGVzdHMgd2hldGhlciBpdHMKLSAgICAgKiBhcmd1bWVudHMgYXJlIGVxdWFsLCByZXR1cm5pbmcgbnVsbCBpZiB0aGV5IGFyZSBhbmQgdGhlIHZhbHVlIG9mIHRoZQotICAgICAqIGZpcnN0IGV4cHJlc3Npb24gaWYgdGhleSBhcmUgbm90LgotICAgICAqCi0gICAgICogQHBhcmFtIGV4cDEKLSAgICAgKiBAcGFyYW0gZXhwMgotICAgICAqIEByZXR1cm4gRXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBudWxsaWYgZXhwcmVzc2lvbgotICAgICAqLwogICAgIEV4cHJlc3Npb24gbnVsbGlmKEV4cHJlc3Npb24gZXhwMSwgRXhwcmVzc2lvbiBleHAyKTsKIAotICAgIC8qKgotICAgICAqIG51bGxpZiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBjYXNlIGV4cHJlc3Npb24gdGhhdCB0ZXN0cyB3aGV0aGVyIGl0cwotICAgICAqIGFyZ3VtZW50cyBhcmUgZXF1YWwsIHJldHVybmluZyBudWxsIGlmIHRoZXkgYXJlIGFuZCB0aGUgdmFsdWUgb2YgdGhlCi0gICAgICogZmlyc3QgZXhwcmVzc2lvbiBpZiB0aGV5IGFyZSBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnMQotICAgICAqIEBwYXJhbSBhcmcyCi0gICAgICogQHJldHVybiBFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG51bGxpZiBleHByZXNzaW9uCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBudWxsaWYoTnVtYmVyIGFyZzEsIE51bWJlciBhcmcyKTsKIAotICAgIC8qKgotICAgICAqIG51bGxpZiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBjYXNlIGV4cHJlc3Npb24gdGhhdCB0ZXN0cyB3aGV0aGVyIGl0cwotICAgICAqIGFyZ3VtZW50cyBhcmUgZXF1YWwsIHJldHVybmluZyBudWxsIGlmIHRoZXkgYXJlIGFuZCB0aGUgdmFsdWUgb2YgdGhlCi0gICAgICogZmlyc3QgZXhwcmVzc2lvbiBpZiB0aGV5IGFyZSBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnMQotICAgICAqIEBwYXJhbSBhcmcyIENyaXRlcmlhIEFQSSBKYXZhIFBlcnNpc3RlbmNlIDIuMCwgUHVibGljIFJldmlldyBEcmFmdAotICAgICAqICAgICAgICAgICAgIENyaXRlcmlhIEFQSSBJbnRlcmZhY2VzIDEwLzMxLzA4IDE1OCBKU1ItMzE3IFB1YmxpYyBSZXZpZXcKLSAgICAgKiAgICAgICAgICAgICBEcmFmdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gICAgICogQHJldHVybiBFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG51bGxpZiBleHByZXNzaW9uCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBudWxsaWYoU3RyaW5nIGFyZzEsIFN0cmluZyBhcmcyKTsKIAotICAgIC8qKgotICAgICAqIG51bGxpZiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBjYXNlIGV4cHJlc3Npb24gdGhhdCB0ZXN0cyB3aGV0aGVyIGl0cwotICAgICAqIGFyZ3VtZW50cyBhcmUgZXF1YWwsIHJldHVybmluZyBudWxsIGlmIHRoZXkgYXJlIGFuZCB0aGUgdmFsdWUgb2YgdGhlCi0gICAgICogZmlyc3QgZXhwcmVzc2lvbiBpZiB0aGV5IGFyZSBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnMQotICAgICAqIEBwYXJhbSBhcmcyCi0gICAgICogQHJldHVybiBFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG51bGxpZiBleHByZXNzaW9uCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBudWxsaWYoRGF0ZSBhcmcxLCBEYXRlIGFyZzIpOwogCi0gICAgLyoqCi0gICAgICogbnVsbGlmIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhIGNhc2UgZXhwcmVzc2lvbiB0aGF0IHRlc3RzIHdoZXRoZXIgaXRzCi0gICAgICogYXJndW1lbnRzIGFyZSBlcXVhbCwgcmV0dXJuaW5nIG51bGwgaWYgdGhleSBhcmUgYW5kIHRoZSB2YWx1ZSBvZiB0aGUKLSAgICAgKiBmaXJzdCBleHByZXNzaW9uIGlmIHRoZXkgYXJlIG5vdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcxCi0gICAgICogQHBhcmFtIGFyZzIKLSAgICAgKiBAcmV0dXJuIEV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbnVsbGlmIGV4cHJlc3Npb24KLSAgICAgKi8KICAgICBFeHByZXNzaW9uIG51bGxpZihDYWxlbmRhciBhcmcxLCBDYWxlbmRhciBhcmcyKTsKIAotICAgIC8qKgotICAgICAqIG51bGxpZiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBjYXNlIGV4cHJlc3Npb24gdGhhdCB0ZXN0cyB3aGV0aGVyIGl0cwotICAgICAqIGFyZ3VtZW50cyBhcmUgZXF1YWwsIHJldHVybmluZyBudWxsIGlmIHRoZXkgYXJlIGFuZCB0aGUgdmFsdWUgb2YgdGhlCi0gICAgICogZmlyc3QgZXhwcmVzc2lvbiBpZiB0aGV5IGFyZSBub3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJnMQotICAgICAqIEBwYXJhbSBhcmcyCi0gICAgICogQHJldHVybiBFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG51bGxpZiBleHByZXNzaW9uCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBudWxsaWYoQ2xhc3MgYXJnMSwgQ2xhc3MgYXJnMik7CiAKLSAgICAvKioKLSAgICAgKiBudWxsaWYgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgY2FzZSBleHByZXNzaW9uIHRoYXQgdGVzdHMgd2hldGhlciBpdHMKLSAgICAgKiBhcmd1bWVudHMgYXJlIGVxdWFsLCByZXR1cm5pbmcgbnVsbCBpZiB0aGV5IGFyZSBhbmQgdGhlIHZhbHVlIG9mIHRoZQotICAgICAqIGZpcnN0IGV4cHJlc3Npb24gaWYgdGhleSBhcmUgbm90LgotICAgICAqCi0gICAgICogQHBhcmFtIGFyZzEKLSAgICAgKiBAcGFyYW0gYXJnMgotICAgICAqIEByZXR1cm4gRXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBudWxsaWYgZXhwcmVzc2lvbgotICAgICAqLwogICAgIEV4cHJlc3Npb24gbnVsbGlmKEVudW08Pz4gYXJnMSwgRW51bTw/PiBhcmcyKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIHByZWRpY2F0ZSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBib29sZWFuLgotICAgICAqCi0gICAgICogQHBhcmFtIGIgYm9vbGVhbiB2YWx1ZQotICAgICAqIEByZXR1cm4gYSB0cnVlIG9yIGZhbHNlIHByZWRpY2F0ZQotICAgICAqLwogICAgIFByZWRpY2F0ZSBwcmVkaWNhdGUoYm9vbGVhbiBiKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgdGltZSBvbiB0aGUgZGF0YWJhc2UKLSAgICAgKiBzZXJ2ZXIgYXQgdGhlIHRpbWUgb2YgcXVlcnkgZXhlY3V0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBFeHByZXNzaW9uCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBjdXJyZW50VGltZSgpOwogCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIEV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCBkYXRlIG9uIHRoZSBkYXRhYmFzZQotICAgICAqIHNlcnZlciBhdCB0aGUgdGltZSBvZiBxdWVyeSBleGVjdXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEV4cHJlc3Npb24KLSAgICAgKi8KICAgICBFeHByZXNzaW9uIGN1cnJlbnREYXRlKCk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gRXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvbiB0aGUKLSAgICAgKiBkYXRhYmFzZSBzZXJ2ZXIgYXQgdGhlIHRpbWUgb2YgcXVlcnkgZXhlY3V0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBFeHByZXNzaW9uCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBjdXJyZW50VGltZXN0YW1wKCk7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gRXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIGEgU3RyaW5nIHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIHMgLQotICAgICAqICAgICAgICAgIHN0cmluZyB2YWx1ZQotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgRXhwcmVzc2lvbiBsaXRlcmFsCi0gICAgICovCiAgICAgRXhwcmVzc2lvbiBsaXRlcmFsKFN0cmluZyBzKTsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZSBhbiBFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gYSBudW1lcmljIHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIG4gLQotICAgICAqICAgICAgICAgIG51bWVyaWMgdmFsdWUKLSAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEV4cHJlc3Npb24gbGl0ZXJhbAotICAgICAqLwogICAgIEV4cHJlc3Npb24gbGl0ZXJhbChOdW1iZXIgbik7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gRXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIGEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiIC0KLSAgICAgKiAgICAgICAgICBib29sZWFuIHZhbHVlCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgRXhwcmVzc2lvbiBsaXRlcmFsCi0gICAgICAgICAqLwogCUV4cHJlc3Npb24gbGl0ZXJhbChib29sZWFuIGIpOwogCi0JLyoqCi0gICAgICAgICAqIENyZWF0ZSBhbiBFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gYSBDYWxlbmRhciB2YWx1ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGMgLQotICAgICAgICAgKiAgICAgICAgICBDYWxlbmRhciB2YWx1ZQotICAgICAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEV4cHJlc3Npb24gbGl0ZXJhbAotICAgICAgICAgKi8KIAlFeHByZXNzaW9uIGxpdGVyYWwoQ2FsZW5kYXIgYyk7CiAKLQkvKioKLSAgICAgICAgICogQ3JlYXRlIGFuIEV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byBhIERhdGUgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkIC0KLSAgICAgICAgICogICAgICAgICAgRGF0ZSB2YWx1ZQotICAgICAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEV4cHJlc3Npb24gbGl0ZXJhbAotICAgICAgICAgKi8KIAlFeHByZXNzaW9uIGxpdGVyYWwoRGF0ZSBkKTsKIAotCS8qKgotICAgICAgICAgKiBDcmVhdGUgYW4gRXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIGEgY2hhcmFjdGVyIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2hhcmFjdGVyIHZhbHVlCi0gICAgICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgRXhwcmVzc2lvbiBsaXRlcmFsCi0gICAgICAgICAqLwogCUV4cHJlc3Npb24gbGl0ZXJhbChjaGFyIGMpOwogCi0JLyoqCi0JICogQ3JlYXRlIGFuIEV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byBhbiBlbnRpdHkgY2xhc3MuCi0JICoKLQkgKiBAcGFyYW0gY2xzIC0KLQkgKiAgICAgICAgICAgIGVudGl0eSBjbGFzcwotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgRXhwcmVzc2lvbiBsaXRlcmFsCi0JICovCiAJRXhwcmVzc2lvbiBsaXRlcmFsKENsYXNzIGNscyk7CiAKLQkvKioKLSAgICAgICAgICogQ3JlYXRlIGFuIEV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byBhbiBlbnVtLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZSAtCi0gICAgICAgICAqICAgICAgICAgIGVudW0KLSAgICAgICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBFeHByZXNzaW9uIGxpdGVyYWwKLSAgICAgICAgICovCiAJRXhwcmVzc2lvbiBsaXRlcmFsKEVudW08Pz4gZSk7CiAKLQkvKioKLQkgKiBDcmVhdGUgYW4gRXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIGEgbnVsbCB2YWx1ZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgRXhwcmVzc2lvbiBsaXRlcmFsCi0JICovCiAJRXhwcmVzc2lvbiBudWxsTGl0ZXJhbCgpOwogCi0JLyoqCi0gICAgICAgICAqIFNwZWNpZnkgdXNlIG9mIGEgcGFyYW1ldGVyIG9mIHRoZSBnaXZlbiBuYW1lLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcGFyYW1ldGVyIG5hbWUKLSAgICAgICAgICogQHJldHVybiBhbiBFeHByZXNzaW9uIGNvcnJlc3BvbmRpbmcgdG8gYSBuYW1lZCBwYXJhbWV0ZXIKLSAgICAgICAgICovCiAJRXhwcmVzc2lvbiBwYXJhbShTdHJpbmcgbmFtZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9TZWxlY3RJdGVtLmphdmEgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL1NlbGVjdEl0ZW0uamF2YQppbmRleCA4YjU5OWUyLi4yZGZiZjlmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL1NlbGVjdEl0ZW0uamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL1NlbGVjdEl0ZW0uamF2YQpAQCAtMjQsMjcgKzI0LDkgQEAKIC8vCiBwYWNrYWdlIGphdmF4LnBlcnNpc3RlbmNlOwogCi0vKioKLSAqIFNlbGVjdEl0ZW0gaW5zdGFuY2VzIGFyZSB1c2VkIGluIHNwZWNpZnlpbmcgdGhlIHF1ZXJ5J3Mgc2VsZWN0IGxpc3QuCi0gKiA8cC8+Ci0gKiBUaGUgbWV0aG9kcyBvZiB0aGlzIGludGVyZmFjZSBhcmUgdXNlZCB0byBkZWZpbmUgYXJndW1lbnRzIHRoYXQgY2FuIGJlIHBhc3NlZAotICogdG8gdGhlIG9yZGVyQnkgbWV0aG9kIGZvciB1c2UgaW4gb3JkZXJpbmcgc2VsZWN0ZWQgaXRlbXMgb2YgdGhlIHF1ZXJ5IHJlc3VsdC4KLSAqLwogcHVibGljIGludGVyZmFjZSBTZWxlY3RJdGVtIGV4dGVuZHMgT3JkZXJCeUl0ZW0gewotICAgIC8qKgotICAgICAqIFJldHVybiBhbiBPcmRlckJ5SXRlbSByZWZlcmVuY2luZyB0aGUgU2VsZWN0SXRlbSBhbmQgc3BlY2lmeWluZyBhc2NlbmRpbmcKLSAgICAgKiBvcmRlcmluZy4gVGhlIFNlbGVjdEl0ZW0gbXVzdCBjb3JyZXNwb25kIHRvIGFuIG9yZGVyYWJsZSB2YWx1ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gb3JkZXItYnkgaXRlbQotICAgICAqLworCiAgICAgT3JkZXJCeUl0ZW0gYXNjKCk7CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYW4gT3JkZXJCeUl0ZW0gcmVmZXJlbmNpbmcgdGhlIFNlbGVjdEl0ZW0gYW5kIHNwZWNpZnlpbmcKLSAgICAgKiBkZXNjZW5kaW5nIG9yZGVyaW5nLiBUaGUgU2VsZWN0SXRlbSBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gb3JkZXJhYmxlCi0gICAgICogdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG9yZGVyLWJ5IGl0ZW0KLSAgICAgKi8KICAgICBPcmRlckJ5SXRlbSBkZXNjKCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL1N1YnF1ZXJ5LmphdmEgYi9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL1N1YnF1ZXJ5LmphdmEKaW5kZXggOTk3NTBhZS4uNzhlZTg3NSAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9TdWJxdWVyeS5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvU3VicXVlcnkuamF2YQpAQCAtMjQsOCArMjQsNSBAQAogLy8KIHBhY2thZ2UgamF2YXgucGVyc2lzdGVuY2U7CiAKLS8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIGFzIHN1YnF1ZXJpZXMuCi0gKi8KIHB1YmxpYyBpbnRlcmZhY2UgU3VicXVlcnkgZXh0ZW5kcyBQcmVkaWNhdGVPcGVyYW5kIHsKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvVHJpbVNwZWMuamF2YSBiL3NyYy9tYWluL2phdmEvamF2YXgvcGVyc2lzdGVuY2UvVHJpbVNwZWMuamF2YQppbmRleCBmMjM3ZGJmLi5iOTNkOWJmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL2phdmF4L3BlcnNpc3RlbmNlL1RyaW1TcGVjLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9qYXZheC9wZXJzaXN0ZW5jZS9UcmltU3BlYy5qYXZhCkBAIC0yNCw5ICsyNCw2IEBACiAvLwogcGFja2FnZSBqYXZheC5wZXJzaXN0ZW5jZTsKIAotLyoqCi0gKiBVc2VkIHRvIHNwZWNpZnkgdGhlIHRyaW1taW5nIG9mIHN0cmluZ3MKLSAqLwogcHVibGljIGVudW0gVHJpbVNwZWMgewogICAgIExFQURJTkcsIFRSQUlMSU5HLCBCT1RICiB9Cg==